#! /bin/sh
-# Copyright (c) 1995-1998 SuSE GmbH Nuernberg, Germany.
+# Copyright (c) 1995-2000 SuSE GmbH Nuernberg, Germany.
#
-# Author: Chris Saia <csaia@wtower.com>
+# Author: Jiri Smid <feedback@suse.de>
#
-# /sbin/init.d/sshd
+# /etc/init.d/sshd
#
# and symbolic its link
#
-# /sbin/rcsshd
+# /usr/sbin/rcsshd
#
+### BEGIN INIT INFO
+# Provides: sshd
+# Required-Start: $network $remote_fs
+# Required-Stop: $network $remote_fs
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Description: Start the sshd daemon
+### END INIT INFO
-. /etc/rc.config
+SSHD_BIN=/usr/sbin/sshd
+test -x $SSHD_BIN || exit 5
-# Determine the base and follow a runlevel link name.
-base=${0##*/}
-link=${base#*[SK][0-9][0-9]}
+SSHD_SYSCONFIG=/etc/sysconfig/ssh
+test -r $SSHD_SYSCONFIG || exit 6
+. $SSHD_SYSCONFIG
-# Force execution if not called by a runlevel directory.
-test $link = $base && START_SSHD=yes
-test "$START_SSHD" = yes || exit 0
+SSHD_PIDFILE=/var/run/sshd.init.pid
+
+. /etc/rc.status
+
+# Shell functions sourced from /etc/rc.status:
+# rc_check check and set local and overall rc status
+# rc_status check and set local and overall rc status
+# rc_status -v ditto but be verbose in local rc status
+# rc_status -v -r ditto and clear the local rc status
+# rc_failed set local and overall rc status to failed
+# rc_reset clear local rc status (overall remains)
+# rc_exit exit appropriate to overall rc status
+
+# First reset status of this service
+rc_reset
-# The echo return value for success (defined in /etc/rc.config).
-return=$rc_done
case "$1" in
start)
- echo -n "Starting service sshd"
+ if ! test -f /etc/ssh/ssh_host_key ; then
+ echo Generating /etc/ssh/ssh_host_key.
+ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ''
+ fi
+ if ! test -f /etc/ssh/ssh_host_dsa_key ; then
+ echo Generating /etc/ssh/ssh_host_dsa_key.
+
+ ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
+ fi
+ if ! test -f /etc/ssh/ssh_host_rsa_key ; then
+ echo Generating /etc/ssh/ssh_host_rsa_key.
+
+ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
+ fi
+ echo -n "Starting SSH daemon"
## Start daemon with startproc(8). If this fails
## the echo return value is set appropriate.
- startproc /usr/sbin/sshd || return=$rc_failed
+ startproc -f -p $SSHD_PIDFILE /usr/sbin/sshd $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"
- echo -e "$return"
+ # Remember status and be verbose
+ rc_status -v
;;
stop)
- echo -n "Stopping service sshd"
+ echo -n "Shutting down SSH daemon"
## Stop daemon with killproc(8) and if this fails
## set echo the echo return value.
- killproc -TERM /usr/sbin/sshd || return=$rc_failed
+ killproc -p $SSHD_PIDFILE -TERM /usr/sbin/sshd
- echo -e "$return"
+ # Remember status and be verbose
+ rc_status -v
;;
+ try-restart)
+ ## Stop the service and if this succeeds (i.e. the
+ ## service was running before), start it again.
+ $0 status >/dev/null && $0 restart
+
+ # Remember status and be quiet
+ rc_status
+ ;;
restart)
- ## If first returns OK call the second, if first or
- ## second command fails, set echo return value.
- $0 stop && $0 start || return=$rc_failed
- ;;
- reload)
- ## Choose ONE of the following two cases:
+ ## Stop the service and regardless of whether it was
+ ## running or not, start it again.
+ $0 stop
+ $0 start
- ## First possibility: A few services accepts a signal
- ## to reread the (changed) configuration.
+ # Remember status and be quiet
+ rc_status
+ ;;
+ force-reload|reload)
+ ## Signal the daemon to reload its config. Most daemons
+ ## do this on signal 1 (SIGHUP).
echo -n "Reload service sshd"
- killproc -HUP /usr/sbin/sshd || return=$rc_failed
- echo -e "$return"
- ;;
+
+ killproc -p $SSHD_PIDFILE -HUP /usr/sbin/sshd
+
+ rc_status -v
+
+ ;;
status)
- echo -n "Checking for service sshd"
- ## Check status with checkproc(8), if process is running
- ## checkproc will return with exit status 0.
+ echo -n "Checking for service sshd "
+ ## Check status with checkproc(8), if process is running
+ ## checkproc will return with exit status 0.
- checkproc /usr/sbin/sshd && echo OK || echo No process
+ # Status has a slightly different for the status command:
+ # 0 - service running
+ # 1 - service dead, but /var/run/ pid file exists
+ # 2 - service dead, but /var/lock/ lock file exists
+ # 3 - service not running
+
+ checkproc -p $SSHD_PIDFILE /usr/sbin/sshd
+
+ rc_status -v
;;
probe)
## Optional: Probe for the necessity of a reload,
## give out the argument which is required for a reload.
- test /etc/ssh/sshd_config -nt /var/run/sshd.pid && echo reload
+ test /etc/ssh/sshd_config -nt $SSHD_PIDFILE && echo reload
;;
*)
- echo "Usage: $0 {start|stop|status|restart|reload[|probe]}"
+ echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
exit 1
;;
esac
-
-# Inform the caller not only verbosely and set an exit status.
-test "$return" = "$rc_done" || exit 1
-exit 0
+rc_exit