#!/bin/sh -e

# control state
state="$(cat "$__object/parameter/state")"

# Set capabilities to aquire privileaged ports as netbox user. Two modes are
# available to efficiently set capabilites. Assumes libcap-bin is installed as
# default on debian systems.
#
# Arguments:
#  1: mode to detect if capabilites are required to set ('set' or 'correct')
set_bind_cap() {
    cap_mode=""  # reset variable from the execution before

    # check if capabilites are required after given mode
    case "$1" in
        # assumes capabilites are not set (cause of new binaries)
        set)
            if [ "$SYSTEMD_SOCKET" != "yes" ]; then
                cap_mode="+ep"
            fi
            ;;

        # check if capabilities have changed
        correct)
            if [ -s "$__object/explorer/bind-capability" ]; then
                # capabilites are set
                if [ "$SYSTEMD_SOCKET" = "yes" ]; then
                    cap_mode="-ep"  # unset
                fi
            else
                # capabilities are unset
                if [ "$SYSTEMD_SOCKET" != "yes" ]; then
                    cap_mode="+ep"  # set
                fi
            fi
            ;;

        # faulty mode
        *)
            echo "called set_bind_cap incorrect (\$1 missing)" >&2
            ;;
    esac

    # set capabilities if any
    if [ "$cap_mode" ]; then
        printf "setcap -q CAP_NET_BIND_SERVICE%s /opt/netbox/venv/bin/uwsgi\n" "$cap_mode"
    fi
}
SYSTEMD_SOCKET="$(cat "$__object/files/systemd_socket")"


case "$state" in
    # install uwsgi
    enabled|disabled)
        # not installed
        if ! [ -s "$__object/explorer/installed" ]; then
            echo "/opt/netbox/venv/bin/pip3 install -q uwsgi"
            set_bind_cap set
            do_restart=yes
            printf "installed\n" >> "$__messages_out"

        # updates available
        elif [ -s "$__object/explorer/upgradeable" ]; then
            echo "/opt/netbox/venv/bin/pip3 install -q --upgrade uwsgi"
            set_bind_cap set
            do_restart=yes
            printf "upgraded\n" >> "$__messages_out"
        fi

        # changed configuration
        if grep -q "^__file/opt/netbox/uwsgi.ini:" "$__messages_in"; then
            do_restart=yes
            printf "configured\n" >> "$__messages_out"
        fi

        # if no capabilities were set yet, check if any are required
        if [ -z "$cap_mode" ]; then
            set_bind_cap correct
        fi


        # restart uwsgi
        if [ "$do_restart" ] && [ "$state" != "disabled" ]; then
            cat << EOF
# Restart service
systemctl restart uwsgi-netbox
EOF
        fi
        ;;

    # uninstall
    absent)
        # check if installed
        if [ -s "$__object/explorer/installed" ]; then
            # service already disabled
            echo "/opt/netbox/venv/bin/pip3 uninstall -qy uwsgi"
            printf "uninstalled\n" >> "$__messages_out"
        fi
        ;;
esac
