Creality-Helper-Script/files/fixes/supervisorctl
2024-03-10 21:45:05 +01:00

131 lines
3.6 KiB
Bash
Executable file

#!/bin/sh
# supervisorctl shim - by destinal
# this is a fake supervisorctl that provides just enough information for moonraker to think it's the real thing.
# good enough to list the names of services in moonraker.conf, to say whether they're running or not (with false pids and times)
# and to start and stop them by name, finding and calling the matching init scripts.
# installing: put this in in /usr/bin/supervisorctl and then in moonraker.conf in [machine] section, set "provider: supervisord_cli"
if [ -t 1 ]; then # colorize only if we're on a terminal
GREEN='\033[32m'
RED='\033[31m'
ENDCOLOR='\033[0m'
fi
get_services() {
moonraker_pid="$(cat /var/run/moonraker.pid)"
# if moonraker is running, get its config directory from its command line
if [ -f /var/run/moonraker.pid ] && [ -d /proc/"$moonraker_pid" ] ; then
cmdline="$(tr '\0' '\n' < /proc/"$moonraker_pid"/cmdline)"
moonraker_dir="$(echo $cmdline | awk -F'-d ' '{print $2}' | awk '{print $1}')"
moonraker_conf="$moonraker_dir/config/moonraker.conf"
# services="klipper moonraker $(awk '/managed_services:/ {print $2}' $moonraker_conf | sed 's/://')"
# services=`(printf 'klipper\nmoonraker\n'; awk '/managed_services:/ {print $2}' $moonraker_conf | sed 's/://') | sort|uniq`
services=$(ls -1 /etc/init.d/S*|sed 's/.*\/S..//;s/_service$//')
echo $services
else
echo "Error: Invalid or missing PID file /var/run/moonraker.pid" >&2
exit 1
fi
}
get_pid_file() {
service="$1"
[ $service == "klipper" ] && service="klippy"
pid_file="/var/run/$service.pid"
echo $pid_file
}
is_running() {
service="$1"
pid_file="$(get_pid_file "$service")"
# Check for PID file
if [ -f "$pid_file" ] && [ -d "/proc/$(cat $pid_file)" ]; then
return 0 # Running
fi
# Fallback to using pidof in case the service doesn't use pid files
if pidof "$service" &>/dev/null; then
return 0 # Running
fi
return 1 # Not running
}
print_process_status() {
if is_running "$service"; then
printf "%-33s$GREEN""RUNNING$ENDCOLOR\n" "$service"
else
printf "%-33s$RED""STOPPED$ENDCOLOR\n" "$service"
fi
}
print_usage() {
echo "supervisorctl shim - provide minimal support for moonraker so CrealityOS moonraker can start/stop without systemd"
echo "Usage: $0 [command] <service>"
echo "commands include status stop start restart"
}
get_script_path() {
service="$1"
script_path="$(ls -1 /etc/init.d/S[0-9][0-9]${service}_service /etc/init.d/S[0-9][0-9]${service}* 2>/dev/null|head -1)"
echo "$script_path"
}
stop() {
service="$1"
script_path="$(get_script_path $service)"
# Check if the script exists and stop the service
if [[ -f "$script_path" ]]; then
"$script_path" stop
fi
}
start() {
service="$1"
script_path="$(get_script_path $service)"
# Check if the script exists and start the service
if [[ -f "$script_path" ]]; then
"$script_path" start
fi
}
restart() {
service="$1"
script_path="$(get_script_path $service)"
# Check if the script exists and restart the service
if [[ -f "$script_path" ]]; then
"$script_path" restart
fi
}
main() {
# echo "$0 $@" >> /tmp/supervisorctl.log
action="$1"; shift
case "$action" in
status)
if [ "$#" -lt 1 ]; then # just status, no arguments
for service in $(get_services); do
print_process_status $service
done
else
for service in "$@"; do # loop through the arguments provided
print_process_status $service
done
fi
;;
start)
start "$1"
;;
stop)
stop "$1"
;;
restart)
restart "$1"
;;
*)
print_usage
exit 1
esac
}
main "$@"