#!/usr/bin/execlineb -S2

# Copyright 2021 Cortex Labs, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# good pages to read about s6-overlay
# https://wiki.gentoo.org/wiki/S6#Process_supervision
# https://skarnet.org/software/s6/s6-svscanctl.html
# http://skarnet.org/software/s6/s6-svc.html
# http://skarnet.org/software/s6/servicedir.html

# good pages to read about execline
# http://www.troubleshooters.com/linux/execline.htm
# https://danyspin97.org/blog/getting-started-with-execline-scripting/
# https://wiki.tcl-lang.org/page/execline

define exit_code ${1}
define signal ${2}
define sigterm 15

# when process receives a non-catchable signal (i.e. KILL/9)
# s6 sets the exit code to >= 256 and expects the user to inspect the signal value instead
ifelse { s6-test ${exit_code} -gt 255 } {
    if -n { s6-test ${signal} -eq ${sigterm} }
    backtick -n new_exit_code { s6-expr 128 + ${signal} }
    importas -ui new_exit_code new_exit_code
    foreground { s6-echo "[finish-manager] service ${SERVICE_NAME} received signal value ${signal}, exiting with ${new_exit_code} exit code" }
    foreground { redirfd -w 1 /var/run/s6/env-stage3/S6_STAGE2_EXITED s6-echo -n -- ${new_exit_code} }
    s6-svscanctl -t /var/run/s6/services
}

# if we receive an exit code between 0 and 255, then exit accordingly with the given value
ifelse { s6-test ${exit_code} -ne 0 } {
    foreground { s6-echo "[finish-manager] service ${SERVICE_NAME} exiting with exit code ${exit_code}" }
    foreground { redirfd -w 1 /var/run/s6/env-stage3/S6_STAGE2_EXITED s6-echo -n -- ${exit_code} }
    s6-svscanctl -t /var/run/s6/services
}

# otherwise stop the service
if { s6-test ${exit_code} -eq 0 }
foreground { s6-echo "[finish-manager] service ${SERVICE_NAME} exiting with exit code 0" }
foreground { s6-svc -O /var/run/s6/services/${SERVICE_NAME} }
foreground { s6-rmrf /etc/services.d/${SERVICE_NAME} }

# stop the supervisor when all services have stopped successfully
pipeline { s6-ls /etc/services.d/ }
backtick -n NUM_RUNNING_SERVICES { wc -l }
importas -ui NUM_RUNNING_SERVICES NUM_RUNNING_SERVICES
if { s6-test ${NUM_RUNNING_SERVICES} -eq 0 }
foreground { s6-echo "[finish-manager] all container services have finished; stopping supervisor" }
s6-svscanctl -h /var/run/s6/services
