82af0f1f8d089a75ed4b88e2669f1061ecd0e6e5
[grml-etc.git] / etc / init.d / ssh
1 #!/bin/sh
2
3 ### BEGIN INIT INFO
4 # Provides:             sshd
5 # Required-Start:       $remote_fs $syslog
6 # Required-Stop:        $remote_fs $syslog
7 # Default-Start:        2 3 4 5
8 # Default-Stop:         1
9 # Short-Description:    OpenBSD Secure Shell server
10 ### END INIT INFO
11
12 # Notice: this file has been adjusted by the Grml team so
13 # the script supports key-generation for ssh
14
15 set -e
16
17 # /etc/init.d/ssh: start and stop the OpenBSD "secure shell(tm)" daemon
18
19 test -x /usr/sbin/sshd || exit 0
20 ( /usr/sbin/sshd -\? 2>&1 | grep -q OpenSSH ) 2>/dev/null || exit 0
21
22 export SSHD_OOM_ADJUST=-17
23 if test -f /etc/default/ssh; then
24     . /etc/default/ssh
25 fi
26
27 # Are we in a virtual environment that doesn't support modifying
28 # /proc/self/oom_adj?
29 if grep -q 'envID:.*[1-9]' /proc/self/status; then
30     unset SSHD_OOM_ADJUST
31 fi
32
33 . /lib/lsb/init-functions
34
35 if [ -n "$2" ]; then
36     SSHD_OPTS="$SSHD_OPTS $2"
37 fi
38
39 # Configurable options:
40 KEYGEN=/usr/bin/ssh-keygen
41 RSA1_KEY=/etc/ssh/ssh_host_key
42 RSA_KEY=/etc/ssh/ssh_host_rsa_key
43 DSA_KEY=/etc/ssh/ssh_host_dsa_key
44 ECDSA_KEY=/etc/ssh/ssh_host_ecdsa_key
45
46 # Are we running from init?
47 run_by_init() {
48     ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]
49 }
50
51 check_for_no_start() {
52     # forget it if we're trying to start, and /etc/ssh/sshd_not_to_be_run exists
53     if [ -e /etc/ssh/sshd_not_to_be_run ]; then 
54         if [ "$1" = log_end_msg ]; then
55             log_end_msg 0
56         fi
57         if ! run_by_init; then
58             log_action_msg "OpenBSD Secure Shell server not in use (/etc/ssh/sshd_not_to_be_run)"
59         fi
60         exit 0
61     fi
62 }
63
64 check_dev_null() {
65     if [ ! -c /dev/null ]; then
66         if [ "$1" = log_end_msg ]; then
67             log_end_msg 1 || true
68         fi
69         if ! run_by_init; then
70             log_action_msg "/dev/null is not a character device!"
71         fi
72         exit 1
73     fi
74 }
75
76 check_privsep_dir() {
77     # Create the PrivSep empty dir if necessary
78     if [ ! -d /var/run/sshd ]; then
79         mkdir /var/run/sshd
80         chmod 0755 /var/run/sshd
81     fi
82 }
83
84 check_config() {
85     if [ ! -e /etc/ssh/sshd_not_to_be_run ]; then
86         /usr/sbin/sshd $SSHD_OPTS -t || exit 1
87     fi
88 }
89
90 export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
91
92 case "$1" in
93   start)
94         check_privsep_dir
95         check_for_no_start
96         check_dev_null
97
98         if ! test -f $RSA1_KEY ; then
99            log_action_msg "Generating SSH1 RSA host key..."
100            $KEYGEN -t rsa1 -f $RSA1_KEY -C '' -N '' || exit 1
101         fi
102
103         if ! test -f $RSA_KEY ; then
104            log_action_msg "Generating SSH RSA host key..."
105            $KEYGEN -t rsa -f $RSA_KEY -C '' -N '' || exit 1
106         fi
107
108         if ! test -f $DSA_KEY ; then
109            log_action_msg "Generating SSH2 DSA host key..."
110            $KEYGEN -t dsa -f $DSA_KEY -C '' -N '' || exit 1
111         fi
112         if ! test -f "$ECDSA_KEY" && grep -q "$ECDSA_KEY" /etc/ssh/sshd_config ; then
113            log_action_msg "Generating SSH2 ECDSA host key..."
114            $KEYGEN -t ecdsa -f "$ECDSA_KEY" -C '' -N '' || exit 1
115         fi
116
117         log_daemon_msg "Starting OpenBSD Secure Shell server" "sshd"
118         if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
119             log_end_msg 0
120         else
121             log_end_msg 1
122         fi
123         ;;
124   stop)
125         log_daemon_msg "Stopping OpenBSD Secure Shell server" "sshd"
126         if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/sshd.pid; then
127             log_end_msg 0
128         else
129             log_end_msg 1
130         fi
131         ;;
132
133   reload|force-reload)
134         check_for_no_start
135         check_config
136         log_daemon_msg "Reloading OpenBSD Secure Shell server's configuration" "sshd"
137         if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd; then
138             log_end_msg 0
139         else
140             log_end_msg 1
141         fi
142         ;;
143
144   restart)
145         check_privsep_dir
146         check_config
147         log_daemon_msg "Restarting OpenBSD Secure Shell server" "sshd"
148         start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/sshd.pid
149         check_for_no_start log_end_msg
150         check_dev_null log_end_msg
151         if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
152             log_end_msg 0
153         else
154             log_end_msg 1
155         fi
156         ;;
157
158   try-restart)
159         check_privsep_dir
160         check_config
161         log_daemon_msg "Restarting OpenBSD Secure Shell server" "sshd"
162         set +e
163         start-stop-daemon --stop --quiet --retry 30 --pidfile /var/run/sshd.pid
164         RET="$?"
165         set -e
166         case $RET in
167             0)
168                 # old daemon stopped
169                 check_for_no_start log_end_msg
170                 check_dev_null log_end_msg
171                 if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
172                     log_end_msg 0
173                 else
174                     log_end_msg 1
175                 fi
176                 ;;
177             1)
178                 # daemon not running
179                 log_progress_msg "(not running)"
180                 log_end_msg 0
181                 ;;
182             *)
183                 # failed to stop
184                 log_progress_msg "(failed to stop)"
185                 log_end_msg 1
186                 ;;
187         esac
188         ;;
189
190   status)
191         status_of_proc -p /var/run/sshd.pid /usr/sbin/sshd sshd && exit 0 || exit $?
192         ;;
193
194   *)
195         log_action_msg "Usage: /etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart|status}"
196         exit 1
197 esac
198
199 exit 0
200
201 ## END OF FILE #################################################################