#!/bin/bash
#
# Init file for OpenSSH server daemon
#
# chkconfig: 2345 55 25
# description: OpenSSH server daemon
#
# processname: sshd
# config: /etc/ssh/ssh_host_key
# config: /etc/ssh/ssh_host_key.pub
# config: /etc/ssh/ssh_random_seed
# config: /etc/ssh/sshd_config
# pidfile: /var/run/sshd.pid

# source function library
. /etc/rc.d/init.d/functions

# pull in sysconfig settings
[ -f /etc/sysconfig/sshd ] && . /etc/sysconfig/sshd

RETVAL=0
prog="sshd"

# Some functions to make the below more readable
KEYGEN=/usr/bin/ssh-keygen
SSHD=/usr/sbin/sshd
RSA1_KEY=/etc/ssh/ssh_host_key
RSA_KEY=/etc/ssh/ssh_host_rsa_key
DSA_KEY=/etc/ssh/ssh_host_dsa_key
PID_FILE=/var/run/sshd.pid

my_success() {
  local msg
  if [ $# -gt 1 ]; then
    msg="$2"
  else
    msg="done"
  fi
  case "`type -type success`" in
    function)
      success "$1"
    ;;
    *)
      echo -n "${msg}"
    ;;
  esac
}
my_failure() {
  local msg
  if [ $# -gt 1 ]; then
    msg="$2"
  else
    msg="FAILED"
  fi
  case "`type -type failure`" in
    function)
      failure "$1"
    ;;
    *)
      echo -n "${msg}"
    ;;
  esac
}
do_rsa1_keygen() {
	if [ ! -s $RSA1_KEY ]; then
		echo -n "Generating SSH1 RSA host key: "
		if $KEYGEN -q -t rsa1 -f $RSA1_KEY -C '' -N '' >&/dev/null; then
			chmod 600 $RSA1_KEY
			chmod 644 $RSA1_KEY.pub
			my_success "RSA1 key generation"
			echo
		else
			my_failure "RSA1 key generation"
			echo
			exit 1
		fi
	fi
}
do_rsa_keygen() {
	if [ ! -s $RSA_KEY ]; then
		echo -n "Generating SSH2 RSA host key: "
		if $KEYGEN -q -t rsa -f $RSA_KEY -C '' -N '' >&/dev/null; then
			chmod 600 $RSA_KEY
			chmod 644 $RSA_KEY.pub
			my_success "RSA key generation"
			echo
		else
			my_failure "RSA key generation"
			echo
			exit 1
		fi
	fi
}
do_dsa_keygen() {
	if [ ! -s $DSA_KEY ]; then
		echo -n "Generating SSH2 DSA host key: "
		if $KEYGEN -q -t dsa -f $DSA_KEY -C '' -N '' >&/dev/null; then
			chmod 600 $DSA_KEY
			chmod 644 $DSA_KEY.pub
			my_success "DSA key generation"
			echo
		else
			my_failure "DSA key generation"
			echo
			exit 1
		fi
	fi
}
do_restart_sanity_check() {
	$SSHD -t
	RETVAL=$?
	if [ ! "$RETVAL" = 0 ]; then
		my_failure "Configuration file or keys"
		echo
	fi
}


case "$1" in
	start)
		# Create keys if necessary
		do_rsa1_keygen;
		do_rsa_keygen;
		do_dsa_keygen;
		
		echo -n "Starting sshd: "
		if [ ! -f $PID_FILE ] ; then
			sshd $OPTIONS
			RETVAL=$?
			if [ "$RETVAL" = "0" ] ; then
				my_success "sshd startup" "sshd"
				touch /var/lock/subsys/sshd
			else
				my_failure "sshd startup" ""
			fi
		fi
		echo
		;;
	stop)
		echo -n "Shutting down sshd: "
		if [ -f $PID_FILE ] ; then
			killproc sshd
			RETVAL=$?
			[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sshd
		fi
		echo
		;;
	restart)
		do_restart_sanity_check
		$0 stop
		$0 start
		RETVAL=$?
		;;
	condrestart)
		if [ -f /var/lock/subsys/sshd ] ; then
			do_restart_sanity_check
			$0 stop
			$0 start
			RETVAL=$?
		fi
		;;
	status)
		status sshd
		RETVAL=$?
		;;
	*)
		echo "Usage: sshd {start|stop|restart|status|condrestart}"
		exit 1
		;;
esac

exit $RETVAL
