summaryrefslogtreecommitdiffstats
path: root/debian/extra/init-functions.d/40-systemd
blob: e944acbb9b7c16a6075fc35b738c8df7d24ad822 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# -*-Shell-script-*-
# /lib/lsb/init-functions

_use_systemctl=0
if [ -d /run/systemd/system ]; then

    if [ -n "${__init_d_script_name:-}" ]; then # scripts run with new init-d-script
        executable="$__init_d_script_name"
        argument="$1"
    elif [ "${0##*/}" = "init-d-script" ] ||
         [ "${0##*/}" = "${1:-}" ]; then # scripts run with old init-d-script
        executable="$1"
        argument="$2"
    else # plain old scripts
        executable="$0"
        argument="${1:-}"
    fi

    prog=${executable##*/}
    service="${prog%.sh}.service"

    # Don't try to run masked services. systemctl <= 230 always succeeds here,
    # but later systemctls fail on nonexisting units; be compatible with both
    state=$(systemctl -p LoadState --value show $service 2>/dev/null) || state="not-found"
    [ "$state" = "masked" ] && exit 0

    # Redirect SysV init scripts when executed by the user
    if [ $PPID -ne 1 ] && [ -z "${SYSTEMCTL_SKIP_REDIRECT:-}" ]; then
        case $(readlink -f "$executable") in
            /etc/init.d/*)
                # If the state is not-found, this might be a newly installed SysV init
                # script where systemd-sysv-generator has not been run yet.
                [ "$state" != "not-found" ] || [ "$(id -u)" != 0 ] || systemctl --no-ask-password daemon-reload

                _use_systemctl=1
                # Some services can't reload through the .service file,
                # but can through the init script.
                if [ "$(systemctl -p CanReload --value show $service 2>/dev/null)" = "no" ] && [ "${argument:-}" = "reload" ]; then
                    _use_systemctl=0
                fi
                ;;
        esac
    fi
fi

systemctl_redirect () {
    local s
    local rc
    local prog=${1##*/}
    local command=$2

    case "$command" in
        start)
            s="Starting $prog (via systemctl)"
            ;;
        stop)
            s="Stopping $prog (via systemctl)"
            ;;
        reload|force-reload)
            s="Reloading $prog configuration (via systemctl)"
            ;;
        try-restart)
            s="Restarting $prog if running (via systemctl)"
            ;;
        restart)
            s="Restarting $prog (via systemctl)"
            ;;
    esac

    service="${prog%.sh}.service"

    # avoid deadlocks during bootup and shutdown from units/hooks
    # which call "invoke-rc.d service reload" and similar, since
    # the synchronous wait plus systemd's normal behaviour of
    # transactionally processing all dependencies first easily
    # causes dependency loops
    if ! OUT=$(systemctl is-system-running 2>/dev/null) && [ "$OUT" != "degraded" ]; then
        sctl_args="--job-mode=ignore-dependencies"
    fi

    [ "$command" = status ] || log_daemon_msg "$s" "$service"
    /bin/systemctl --no-pager $sctl_args $command "$service"
    rc=$?
    [ "$command" = status ] || log_end_msg $rc

    return $rc
}

if [ "$_use_systemctl" = "1" ]; then
    # Some init scripts use "set -e" and "set -u", we don't want that
    # here
    set +e
    set +u

    case "$argument" in
        start|stop|restart|reload|force-reload|try-restart|status)
            systemctl_redirect $executable $argument
            exit $?
            ;;
    esac
fi