3 Commits

Author SHA1 Message Date
fbt
be3d90ea79 A simpler approach
Signed-off-by: fbt <fbt@fleshless.org>
2020-03-28 19:39:54 +03:00
fbt
c5bbf92022 experimental netns support and some fixes
Signed-off-by: fbt <fbt@fleshless.org>
2020-03-28 19:12:15 +03:00
fbt
bba7eef3d9 There is no passthru anymore
Signed-off-by: fbt <fbt@fleshless.org>
2020-03-07 18:50:02 +03:00
2 changed files with 48 additions and 13 deletions

View File

@@ -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

19
ssm
View File

@@ -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
@@ -728,6 +729,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;;
@@ -824,6 +828,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"