327 lines
10 KiB
Bash
327 lines
10 KiB
Bash
#!/bin/bash
|
|
|
|
DATE=`date '+%Y-%m-%d %H:%M:%S'`
|
|
cnf_file='/etc/oceanbase.cnf'
|
|
ip=`hostname -I | awk '/^[0-9]/ {print $1; exit}'`
|
|
port=2886
|
|
url="http://localhost"
|
|
prefix=@CPACK_PACKAGING_INSTALL_PREFIX@
|
|
unix_socket="$prefix/run/obshell.sock"
|
|
obshell="$prefix/bin/obshell"
|
|
etc_folder="$prefix/etc"
|
|
current_user=`whoami`
|
|
json_pre_file="$prefix/profile/oceanbase-pre.json"
|
|
json_file="$prefix/profile/oceanbase.json"
|
|
report=3
|
|
|
|
function get_json_body_by_key {
|
|
local key=$1
|
|
|
|
json=$(cat "$json_file" | tr -d '[:space:]')
|
|
|
|
start_index=$(echo "$json" | awk -v a="$key" '{print index($0, a)}')
|
|
if [ $start_index -eq 0 ]; then
|
|
echo "'$key' not found in json string."
|
|
exit 1
|
|
fi
|
|
|
|
length=${#key}
|
|
substring="${json:start_index+$length+1}"
|
|
result=""
|
|
brace_count=0
|
|
brace_flag=0
|
|
|
|
for (( i=0; i<${#substring}; i++ )); do
|
|
char="${substring:i:1}"
|
|
if [[ $char == "{" ]]; then
|
|
brace_count=$((brace_count + 1))
|
|
elif [[ $char == "}" ]]; then
|
|
brace_count=$((brace_count - 1))
|
|
fi
|
|
result="$result$char"
|
|
if [[ $brace_count -eq 0 ]]; then
|
|
break
|
|
fi
|
|
done
|
|
|
|
echo "$result"
|
|
}
|
|
|
|
function prepare_config_json {
|
|
rm -rf $json_file
|
|
cp $json_pre_file $json_file
|
|
local temp_file=$(mktemp)
|
|
first_observer_configration=true
|
|
|
|
while IFS='=' read -r key value; do
|
|
# delete empty and comment line
|
|
if [[ ! $key || $key =~ ^[[:space:]]*# ]]; then
|
|
continue
|
|
fi
|
|
key=$(echo "$key" | awk '{$1=$1};1')
|
|
value=$(echo "$value" | awk '{$1=$1};1')
|
|
value=$(echo "$value" | sed 's/^"//' | sed 's/"$//')
|
|
if [[ -n "$key" && ! "$key" =~ ^\; ]]; then
|
|
if [[ $key == *"ip"* ]]; then
|
|
ip=$value
|
|
elif [[ $key == *"obshell_port"* ]]; then
|
|
port=$value
|
|
elif [[ $key == *"root_pwd"* ]]; then
|
|
key="rootPwd"
|
|
cluster_config_line=$(grep -n "cluster" $json_file | head -n 1 | cut -d: -f1)
|
|
sed "$((cluster_config_line+1))i\\ \"$key\": \"$value\"," "$json_file" > "$temp_file"
|
|
mv "$temp_file" "$json_file"
|
|
else
|
|
if $first_observer_configration; then
|
|
first_observer_configration=false
|
|
sed "s/\"observerConfig\": {}/\"observerConfig\": {\n \"$key\": \"$value\"\n }/" "$json_file" > "$temp_file"
|
|
else
|
|
observer_config_line=$(grep -n "observerConfig" $json_file | head -n 1 | cut -d: -f1)
|
|
sed "$((observer_config_line+1))i\\ \"$key\": \"$value\"," "$json_file" > "$temp_file"
|
|
fi
|
|
mv "$temp_file" "$json_file"
|
|
fi
|
|
fi
|
|
done < "$cnf_file"
|
|
sed -i "s|2886|${port}|g" $json_file
|
|
sed -i "s|HOSTIP|${ip}|g" $json_file
|
|
}
|
|
|
|
function prepare_env {
|
|
echo "change etc owner to ${current_user}"
|
|
chown $current_user:$current_user "${etc_folder}"
|
|
}
|
|
|
|
function do_reload_observer {
|
|
echo "Not support reload now"
|
|
}
|
|
|
|
function check_daemon_process {
|
|
if [ -f $prefix/run/daemon.pid ]; then
|
|
pid=$(cat $prefix/run/daemon.pid)
|
|
if kill -0 $pid >/dev/null 2>&1; then
|
|
echo "daemon process with PID $pid is running."
|
|
return 0
|
|
else
|
|
echo "daemon process with PID $pid is not running."
|
|
return 1
|
|
fi
|
|
else
|
|
echo "daemon PID file not found."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function check_obagent_process {
|
|
if [ -f $prefix/run/obshell.pid ]; then
|
|
pid=$(cat $prefix/run/obshell.pid)
|
|
if kill -0 $pid >/dev/null 2>&1; then
|
|
echo "obshell process with PID $pid is running."
|
|
else
|
|
echo "obshell process with PID $pid is not running."
|
|
$obshell admin start --ip $ip --port $port
|
|
if [ $? -ne 0 ]; then
|
|
echo "start ob_shell failed"
|
|
exit 1
|
|
fi
|
|
fi
|
|
else
|
|
echo "obshell PID file not found."
|
|
exit
|
|
fi
|
|
}
|
|
|
|
function check_response {
|
|
local response=$1
|
|
successful=$(echo "$response" | grep -o '"successful":[^,]*' | sed 's/"successful"://')
|
|
if [ "x$successful" = "xfalse" ]; then
|
|
echo "send request failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function check_trace {
|
|
local dag_trace=$1
|
|
local content=$2
|
|
local max_retries=$3
|
|
local delay=$4
|
|
local count=0
|
|
echo "the $content trace id is $dag_trace"
|
|
while true; do
|
|
response=$(curl --silent -XGET --unix-socket $unix_socket $url/api/v1/task/dag/$dag_trace)
|
|
state=$(echo "$response" | grep -o '"state":[^,]*' | head -1 | sed 's/"state"://' | tr -d '"')
|
|
echo "the response state is $state"
|
|
if [ "x$state" = "xSUCCEED" ]; then
|
|
echo "$content request successfully"
|
|
break
|
|
elif [ "x$state" = "xFAILED" ]; then
|
|
echo "$content request failed"
|
|
exit 1
|
|
else
|
|
count=$((count + 1))
|
|
if [ $count -eq $max_retries ]; then
|
|
echo "maximum retries reached and then exit"
|
|
exit 1
|
|
fi
|
|
echo "wait ${delay}s and the retry"
|
|
sleep $delay
|
|
fi
|
|
done
|
|
}
|
|
|
|
function start_obshell {
|
|
$obshell admin start --ip $ip --port $port > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
echo "start ob_shell failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function do_config_observer {
|
|
# join agent
|
|
obagent_configuration=$(get_json_body_by_key "obshell")
|
|
obagent_cmd="curl --silent -H \"Content-Type: application/json\" -X POST -d '${obagent_configuration}' --unix-socket $unix_socket $url/api/v1/agent/join"
|
|
response=$(eval "$obagent_cmd")
|
|
echo $response
|
|
successful=$(echo "$response" | grep -o '"successful":[^,]*' | sed 's/"successful"://')
|
|
if [ "x$successful" = "xfalse" ]; then
|
|
echo "send request failed"
|
|
exit 1
|
|
fi
|
|
trace=$(echo "$response" | grep -o '"id":[^,]*' | sed 's/"id"://' | tr -d '"')
|
|
check_trace $trace "join agent" 3 3
|
|
|
|
# config cluster
|
|
cluster_configuration=$(get_json_body_by_key "cluster")
|
|
cluster_cmd="curl --silent -H \"Content-Type: application/json\" -X PUT -d '${cluster_configuration}' --unix-socket $unix_socket $url/api/v1/obcluster/config"
|
|
response=$(eval "$cluster_cmd")
|
|
echo $response
|
|
successful=$(echo "$response" | grep -o '"successful":[^,]*' | sed 's/"successful"://')
|
|
if [ "x$successful" = "xfalse" ]; then
|
|
echo "send request failed"
|
|
exit 1
|
|
fi
|
|
trace=$(echo "$response" | grep -o '"id":[^,]*' | sed 's/"id"://' | tr -d '"')
|
|
check_trace $trace "config cluster" 3 3
|
|
|
|
# config observer
|
|
observer_configuration=$(get_json_body_by_key "server")
|
|
observer_cmd="curl --silent -H \"Content-Type: application/json\" -X PUT -d '${observer_configuration}' --unix-socket $unix_socket $url/api/v1/observer/config"
|
|
response=$(eval "$observer_cmd")
|
|
echo $response
|
|
successful=$(echo "$response" | grep -o '"successful":[^,]*' | sed 's/"successful"://')
|
|
if [ "x$successful" = "xfalse" ]; then
|
|
echo "send request failed"
|
|
exit 1
|
|
fi
|
|
trace=$(echo "$response" | grep -o '"id":[^,]*' | sed 's/"id"://' | tr -d '"')
|
|
check_trace $trace "config observer" 3 3
|
|
}
|
|
|
|
function do_start_observer {
|
|
# check observer status
|
|
response=$(curl --silent -H "Content-Type: application/json" -X GET --unix-socket $unix_socket $url/api/v1/status)
|
|
identity=$(echo "$response" | grep -o '"identity":[^,]*' | sed 's/"identity"://' | tr -d '"' | tr -d '}')
|
|
if [ "x$identity" = "xCLUSTER AGENT" ]; then
|
|
echo "The observer is already bootstrap, please start it immediately"
|
|
$obshell cluster start -a -y
|
|
if [ $? -eq 0 ]; then
|
|
/bin/bash $prefix/profile/telemetry.sh $report "12" >/dev/null 2>&1
|
|
else
|
|
echo "The observer start without bootstarp failed."
|
|
exit 1
|
|
fi
|
|
elif [ "x$identity" = "xSINGLE" ]; then
|
|
# do config observer first
|
|
do_config_observer
|
|
echo "The observer has not bootstrap, please init it firstly"
|
|
response=$(curl --silent -X POST --unix-socket $unix_socket $url/api/v1/ob/init)
|
|
successful=$(echo "$response" | grep -o '"successful":[^,]*' | sed 's/"successful"://')
|
|
if [ "x$successful" = "xfalse" ]; then
|
|
echo "send request failed"
|
|
exit 1
|
|
fi
|
|
trace=$(echo "$response" | grep -o '"id":[^,]*' | sed 's/"id"://' | tr -d '"')
|
|
check_trace $trace "start observer" 40 6
|
|
if [ $? -eq 0 ]; then
|
|
/bin/bash $prefix/profile/telemetry.sh $report "11" >/dev/null 2>&1
|
|
fi
|
|
else
|
|
# status is UNIDENTIFIED
|
|
echo "The observer has been installed before"
|
|
fi
|
|
|
|
if [ -f $prefix/run/observer.pid ]; then
|
|
pid=$(cat $prefix/run/observer.pid)
|
|
if [ ! -d "/proc/$pid" ]; then
|
|
echo "Observer process with PID $pid has exited."
|
|
break
|
|
fi
|
|
|
|
# check observer state
|
|
response=$(curl --silent -H "Content-Type: application/json" -X GET --unix-socket $unix_socket $url/api/v1/status)
|
|
ob_state=$(echo "$response" | grep -o '"obState":[^,]*' | sed 's/"obState"://')
|
|
if [ "x$ob_state" = "x1" ]; then
|
|
echo "The agent dose not know the observer password"
|
|
echo "1. Please set environment: export OB_ROOT_PASSWORD={root_passowrd}"
|
|
echo "2. Kill all the obshell process"
|
|
echo "3. Restart the agent process: $prefix/bin/obshell admin start --ip $ip --port $port"
|
|
fi
|
|
else
|
|
echo "observer PID file not found."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function start_observer {
|
|
/bin/bash $prefix/profile/telemetry.sh $report "10" >/dev/null 2>&1
|
|
prepare_config_json
|
|
prepare_env
|
|
if check_daemon_process; then
|
|
echo "The agent service is exist"
|
|
else
|
|
start_obshell
|
|
fi
|
|
do_start_observer
|
|
}
|
|
|
|
function stop_observer {
|
|
check_obagent_process
|
|
$obshell cluster stop -a -y -f
|
|
if [ $? -ne 0 ]; then
|
|
echo "The observer stop failed."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function reload_observer {
|
|
check_obagent_process
|
|
prepare_config_json
|
|
do_reload_observer
|
|
}
|
|
|
|
if [ "x$1" = "xstart" ]; then
|
|
echo "oceanbase service started at ${DATE}"
|
|
start_observer
|
|
elif [ "x$1" = "xstop" ]; then
|
|
echo "oceanbase service stopped at ${DATE}"
|
|
stop_observer
|
|
elif [ "x$1" = "xreload" ]; then
|
|
echo "oceanbase service reloaded at ${DATE}"
|
|
reload_observer
|
|
elif [ "x$1" = "xdestroy" ]; then
|
|
# rpm uninstall logic, run systemctl stop oceanbase firstly
|
|
echo "oceanbase service destroyed at ${DATE}"
|
|
$obshell admin stop > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
echo "stop obshell failed"
|
|
exit 1
|
|
fi
|
|
elif [ "x$1" = "xtest" ]; then
|
|
echo "test at ${DATE}"
|
|
result=$(get_json_body_by_key "obshell:")
|
|
echo $result
|
|
fi
|
|
|
|
exit 0
|