Files
oceanbase/tools/systemd/profile/oceanbase-service.sh.template
2024-12-31 09:14:39 +00:00

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