#!/bin/bash
if [ "$(id -u)" -eq 0 ]; then
echo "Error: DataKit cannot be executed as root user"
echo "Please run with a regular user: su <username> "
exit 1
fi
umask 027
APP_NAME="datakit"
JAR_PATTERN="openGauss-datakit-*.jar"
PID_FILE="datakit.pid"
LOG_DIR="logs"
LOG_FILE="${LOG_DIR}/visualtool-main.out"
mkdir -p "${LOG_DIR}"
get_jar_path() {
local jar_file=$(ls -t ${JAR_PATTERN} 2>/dev/null | head -n 1)
if [ -z "${jar_file}" ]; then
echo "error : No matching JAR file found."
exit 1
fi
if [ -f "${jar_file}" ]; then
echo $(realpath "${jar_file}")
else
echo "error : JAR file not exist : ${jar_file}"
exit 1
fi
}
refresh_pid() {
JAR_FILE=$(get_jar_path)
PID=$(ps aux | grep java | grep -F -- "${JAR_FILE}" | grep -v grep | awk '{print $2}' | head -n 1)
if [ -n "${PID}" ]; then
echo "${PID}" > "${PID_FILE}"
else
rm -f "${PID_FILE}"
fi
}
check_and_fix_log_permissions() {
LOG_DIR="logs"
EXPECTED_FILE_PERM="640"
EXPECTED_DIR_PERM="750"
echo "check log files and dir permissions..."
if [ -d "$LOG_DIR" ]; then
local dir_perm=$(stat -c "%a" "$LOG_DIR")
if [ "$dir_perm" != "$EXPECTED_DIR_PERM" ]; then
echo " fixed log dir permissions: $dir_perm -> $EXPECTED_DIR_PERM"
chmod "$EXPECTED_DIR_PERM" "$LOG_DIR"
fi
fi
find "$LOG_DIR" -name "*.log" -type f 2>/dev/null | while read -r log_file; do
local file_perm=$(stat -c "%a" "$log_file")
if [ "$file_perm" != "$EXPECTED_FILE_PERM" ]; then
echo " fixed log files permissions: $log_file ($file_perm -> $EXPECTED_FILE_PERM)"
if lsof "$log_file" >/dev/null 2>&1; then
echo " warn: file is used ,not fixed permissions: $log_file"
else
chmod "$EXPECTED_FILE_PERM" "$log_file"
fi
fi
done
umask 027
}
start_up() {
JAR_FILE=$(get_jar_path)
if [ -z "${DATA_KIT_AES_KEY}" ]; then
echo "error : DATA_KIT_AES_KEY environment variable is not set."
echo " Please set it with --aes-key option"
exit 1
fi
check_and_fix_log_permissions
DEFAULT_JAVA_OPTS="-Xms2048m -Xmx4096m"
JAVA_OPTS=${JAVA_OPTS:-$DEFAULT_JAVA_OPTS}
echo "Starting ${APP_NAME} with DATA_KIT_AES_KEY..."
export DATA_KIT_AES_KEY=${DATA_KIT_AES_KEY}
nohup java ${JAVA_OPTS} -Dlog4j.configurationFile=./config/log4j2.xml -jar "${JAR_FILE}" --spring.profiles.active=temp > "${LOG_FILE}" 2>&1 &
echo $! > "${PID_FILE}"
echo "${APP_NAME} started. PID: $(cat ${PID_FILE})"
}
start() {
refresh_pid
if [ -s "${PID_FILE}" ]; then
PID=$(cat "${PID_FILE}")
if ps -p "${PID}" > /dev/null; then
echo "Datakit is already running with PID : ${PID}"
exit 1
else
echo "Stale PID file. Cleaning up."
rm -f "${PID_FILE}"
fi
fi
start_up
}
stop() {
refresh_pid
if [ -s "${PID_FILE}" ]; then
PID=$(cat "${PID_FILE}")
kill -9 "${PID}" >/dev/null 2>&1
rm -f "${PID_FILE}"
echo "${APP_NAME} stopped."
else
echo "${APP_NAME} is not running."
fi
}
restart() {
stop
sleep 2
start_up
}
status() {
refresh_pid
if [ -s "${PID_FILE}" ]; then
PID=$(cat "${PID_FILE}")
if ps -p "${PID}" > /dev/null; then
echo "status : ${APP_NAME} is running with PID: ${PID}"
echo "JAR PATH : $(get_jar_path)"
else
echo "warn : Stale PID file, ${APP_NAME} may not be running."
rm -f "${PID_FILE}"
fi
else
echo "status : ${APP_NAME} is not running."
fi
}
show_help() {
echo "Usage: $0 {start|stop|restart|status} [--aes-key <key>]"
echo "Commands:"
echo " start Start datakit service"
echo " stop Stop datakit service"
echo " restart Restart datakit service"
echo " status Show service status"
echo ""
echo "Options:"
echo " --aes-key <key> Set DATA_KIT_AES_KEY for this session"
echo ""
echo "Environment:"
echo " If DATA_KIT_AES_KEY is already set in environment,"
echo " --aes-key option will be ignored"
}
COMMAND="$1"
shift
while [[ $# -gt 0 ]]; do
case "$1" in
--aes-key)
if [[ -z "$2" || "$2" == --* ]]; then
echo "Error: --aes-key requires a value"
show_help
exit 1
fi
if [ -z "${DATA_KIT_AES_KEY}" ]; then
export DATA_KIT_AES_KEY="$2"
echo "Using command-line AES key"
else
echo "Warning: DATA_KIT_AES_KEY already set in environment. Ignoring --aes-key option"
fi
shift 2
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
case "${COMMAND}" in
start)
if [ -z "${DATA_KIT_AES_KEY}" ]; then
echo "Error: AES key is required for 'start' command"
echo "Set it via:"
echo " export DATA_KIT_AES_KEY='your_key'"
echo "Or use: $0 start --aes-key your_key"
exit 1
fi
if [ ${#DATA_KIT_AES_KEY} -lt 6 ]; then
echo "Error: AES key must be at least 6 characters"
exit 1
fi
echo "Starting service with AES key (length: ${#DATA_KIT_AES_KEY})"
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
help|--help|-h)
show_help
;;
*)
echo "Unknown command: ${COMMAND}"
show_help
exit 1
;;
esac
exit 0