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