Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
7c584eb8ee | |||
608e7d4d9d | |||
be3d90ea79 | |||
c5bbf92022 | |||
bba7eef3d9 |
@@ -1,11 +1,37 @@
|
|||||||
# This is actually a bash script
|
# This is actually a bash script
|
||||||
# Everything in ssm is a bash script.
|
|
||||||
|
|
||||||
# Enable cgroup-related functions.
|
# Where to search for services, works as a PATH-like array.
|
||||||
# This requires quite specific setup that is undocumented as of yet, sorry.
|
#service_path = "$XDG_CONFIG_HOME/ssm/services" /etc/ssm/services "$rundir/services" /usr/share/ssm/services
|
||||||
#cgroups = 0
|
|
||||||
|
|
||||||
# You can also set service-level options here, as local defaults.
|
# Service defaults
|
||||||
# I really do not advise doing that, but you *can*.
|
# Respawn the service if it exits
|
||||||
# For example:
|
#service_respawn = 0
|
||||||
#service_workdir = /
|
|
||||||
|
# Working directory
|
||||||
|
#service_workdir = '/'
|
||||||
|
|
||||||
|
# How long do we wait for the service to stop
|
||||||
|
#service_stop_timeout = 30
|
||||||
|
|
||||||
|
# How long do we wait for the service to get ready
|
||||||
|
#service_ready_timeout = 15
|
||||||
|
|
||||||
|
# The signal to send to reload the service
|
||||||
|
#service_reload_signal = 1
|
||||||
|
|
||||||
|
# The signal to send to stop the service
|
||||||
|
#service_stop_signal = 15
|
||||||
|
|
||||||
|
# Enable cgroup-related functions
|
||||||
|
# Only works with cgroups v2 and a helper.
|
||||||
|
# Basically, don't.
|
||||||
|
#
|
||||||
|
#cgroups = 1
|
||||||
|
|
||||||
|
# Refuse to start the service if its cgroup is not empty
|
||||||
|
#service_cgroup_exclusive = 0
|
||||||
|
|
||||||
|
# Wait on all the members of the cgroup to exit when stopping the service.
|
||||||
|
#service_cgroup_wait = 0
|
||||||
|
|
||||||
|
#service_cgroup_strict = 0
|
||||||
|
36
ssm
36
ssm
@@ -143,10 +143,12 @@ run_service_action() {
|
|||||||
|
|
||||||
spawn() {
|
spawn() {
|
||||||
if [[ $service_logfile_out == "$service_logfile_err" ]]; then
|
if [[ $service_logfile_out == "$service_logfile_err" ]]; then
|
||||||
exec "$@" >"$service_logfile_out" 2>&1
|
exec 3>"$service_logfile_out"
|
||||||
else
|
else
|
||||||
exec "$@" >"$service_logfile_out" 2>"$service_logfile_err"
|
exec 3>"$service_logfile_err"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
exec "$@" >"$service_logfile_out" 2>&3
|
||||||
}; readonly spawn;
|
}; readonly spawn;
|
||||||
|
|
||||||
cgroup_get_procs() {
|
cgroup_get_procs() {
|
||||||
@@ -243,7 +245,7 @@ svc() {
|
|||||||
# One service failure, two service failures...
|
# One service failure, two service failures...
|
||||||
if service_success_exit u "$job_exit"; then
|
if service_success_exit u "$job_exit"; then
|
||||||
job_success = 1
|
job_success = 1
|
||||||
(( fail_counter )) && fail_counter--
|
(( fail_counter )) && fail_counter=0
|
||||||
else
|
else
|
||||||
job_success = 0
|
job_success = 0
|
||||||
fail_counter++
|
fail_counter++
|
||||||
@@ -592,7 +594,6 @@ var service_pid \
|
|||||||
service_cgroup_name \
|
service_cgroup_name \
|
||||||
service_cgroup_procs \
|
service_cgroup_procs \
|
||||||
service_cgroup_path \
|
service_cgroup_path \
|
||||||
service_signals_passthru \
|
|
||||||
service_config_current \
|
service_config_current \
|
||||||
cgroup_home \
|
cgroup_home \
|
||||||
failed_deps \
|
failed_deps \
|
||||||
@@ -614,6 +615,7 @@ var flag_reset_exit = 0
|
|||||||
var flag_reread_service = 0
|
var flag_reread_service = 0
|
||||||
var flag_forget_service = 0
|
var flag_forget_service = 0
|
||||||
var flag_load_service = 0
|
var flag_load_service = 0
|
||||||
|
var flag_no_netns = 0
|
||||||
|
|
||||||
## check for some environment stuff
|
## check for some environment stuff
|
||||||
var EDITOR := 'vim'
|
var EDITOR := 'vim'
|
||||||
@@ -628,7 +630,6 @@ var service_workdir = '/'
|
|||||||
var service_stop_timeout = 30
|
var service_stop_timeout = 30
|
||||||
var service_stop_command = kill -n "\$service_stop_signal" "\$job_pid"
|
var service_stop_command = kill -n "\$service_stop_signal" "\$job_pid"
|
||||||
var service_ready_timeout = 15
|
var service_ready_timeout = 15
|
||||||
var service_signals = 1 10 12
|
|
||||||
var service_reload_signal = 1
|
var service_reload_signal = 1
|
||||||
var service_stop_signal = 15
|
var service_stop_signal = 15
|
||||||
var service_cgroup_exclusive = 0 # Refuse to start the service if its cgroup is not empty
|
var service_cgroup_exclusive = 0 # Refuse to start the service if its cgroup is not empty
|
||||||
@@ -676,14 +677,6 @@ case "$0" in
|
|||||||
(*) _self = "$PWD/$0";;
|
(*) _self = "$PWD/$0";;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Warn the user of deprecated stuff.
|
|
||||||
for p in "/etc/ssm/init.d" "$XDG_CONFIG_HOME/ssm/init.d"; do
|
|
||||||
if [[ -d "$p" ]]; then
|
|
||||||
printf 'WARNING: `%s` was renamed to `%s`! Please move your scripts accordingly!\n' "$p" "${p%init.d}services" >&2
|
|
||||||
service_path += "$p"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Source the config
|
# Source the config
|
||||||
if cfg_file is file; then
|
if cfg_file is file; then
|
||||||
source "$cfg_file" || die 37 "Failed to load config: $cfg_file"
|
source "$cfg_file" || die 37 "Failed to load config: $cfg_file"
|
||||||
@@ -728,6 +721,9 @@ while (( $# )); do
|
|||||||
(-i|--info)
|
(-i|--info)
|
||||||
action = 'info';;
|
action = 'info';;
|
||||||
|
|
||||||
|
(--no-netns)
|
||||||
|
flag_no_netns = 1;;
|
||||||
|
|
||||||
(--) shift; break;;
|
(--) shift; break;;
|
||||||
(-*) printf 'Unknown key: %s\n' "$1" >&2; exit 1;;
|
(-*) printf 'Unknown key: %s\n' "$1" >&2; exit 1;;
|
||||||
(*) break;;
|
(*) break;;
|
||||||
@@ -742,7 +738,11 @@ for d in "$rundir" "$rundir/current" "$logdir"; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Common service path
|
# Common service path
|
||||||
service_path += "$XDG_CONFIG_HOME/ssm/services" '/etc/ssm/services' "$rundir/services" "$usrdir/services"
|
if (( UID )); then
|
||||||
|
service_path += "$rundir/current" "$XDG_CONFIG_HOME/ssm/services" '/etc/ssm/services' "$usrdir/services"
|
||||||
|
else
|
||||||
|
service_path += "$rundir/current" '/etc/ssm/services' "$usrdir/services"
|
||||||
|
fi
|
||||||
|
|
||||||
# Special actions
|
# Special actions
|
||||||
if flag_list_services; then
|
if flag_list_services; then
|
||||||
@@ -777,12 +777,13 @@ if [[ $service_name == /* ]]; then
|
|||||||
service_config = "$service_name"
|
service_config = "$service_name"
|
||||||
service_name = "${service_name##*/}"
|
service_name = "${service_name##*/}"
|
||||||
else
|
else
|
||||||
for i in "$service_config_current" "${service_path[@]/%//$service_name}"; do
|
for i in "${service_path[@]/%//$service_name}"; do
|
||||||
[[ -f "$i" ]] && {
|
[[ -f "$i" ]] && {
|
||||||
service_config = "$i"
|
service_config = "$i"
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
done
|
done
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# We really don't want this overriden
|
# We really don't want this overriden
|
||||||
@@ -824,6 +825,11 @@ flag_reset_exit && { reset-exit; die $?; }
|
|||||||
# Get the service config
|
# Get the service config
|
||||||
source -- "$service_config" "${@:3}" || die 7 "Failed to read the service config: $service_config"
|
source -- "$service_config" "${@:3}" || die 7 "Failed to read the service config: $service_config"
|
||||||
|
|
||||||
|
# Rexec ourselves in the requested netns
|
||||||
|
flag_no_netns || {
|
||||||
|
[[ $service_netns ]] && exec ip netns exec "$service_netns" "$0" --no-netns "$service_name" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
# “Load” the service into memory
|
# “Load” the service into memory
|
||||||
if ! service_config == "$service_config_current" && service_remember; then
|
if ! service_config == "$service_config_current" && service_remember; then
|
||||||
cat "$service_config" > "$rundir/current/$service_name"
|
cat "$service_config" > "$rundir/current/$service_name"
|
||||||
|
Reference in New Issue
Block a user