#! /bin/sh
# postinst script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postinst> `configure' <most-recently-configured-version>
#        * <old-postinst> `abort-upgrade' <new version>
#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
#          <new-version>
#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
#          <failed-install-package> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
#
# quoting from the policy:
#     Any necessary prompting should almost always be confined to the
#     post-installation script, and should be protected with a conditional
#     so that unnecessary prompting doesn't happen if a package's
#     installation fails and the `postinst' is called with `abort-upgrade',
#     `abort-remove' or `abort-deconfigure'.

case "$1" in
    configure)
        if [ ! -e /etc/dropbear/dropbear_rsa_host_key ]; then
            if [ -f /etc/ssh/ssh_host_rsa_key ]; then
                echo "Converting existing OpenSSH RSA host key to Dropbear format."
                /usr/bin/dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
            else
                echo "Generating Dropbear RSA key. Please wait."
                /usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
            fi
        fi
        if [ ! -e /etc/dropbear/dropbear_dss_host_key ]; then
            if [ -f /etc/ssh/ssh_host_dsa_key ]; then
                echo "Converting existing OpenSSH RSA host key to Dropbear format."
                /usr/bin/dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/dropbear/dropbear_dss_host_key
            else
                echo "Generating Dropbear DSS key. Please wait."
                /usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
            fi
        fi
        if [ ! -s /etc/default/dropbear ]; then 
            # check whether OpenSSH seems to be installed.
            if dpkg -l ssh >/dev/null 2>&1; then 
                echo "OpenSSH appears to be installed. Setting /etc/default/dropbear"
                echo "so that Dropbear will not start by default. Edit this file to change"
                echo "this behaviour."
                echo "# disabled because OpenSSH is installed, change to NO_START=0 to enable Dropbear" > /etc/default/dropbear
                echo "NO_START=1" >> /etc/default/dropbear
            fi
            echo "# the TCP port that Dropbear listens on" >> /etc/default/dropbear
            echo "DROPBEAR_PORT=22" >> /etc/default/dropbear
            echo "# any additional arguments for Dropbear" >> /etc/default/dropbear
            echo "DROPBEAR_EXTRA_ARGS=" >> /etc/default/dropbear
			echo "# specify an optional banner file containing a message to be" >> /etc/default/dropbear
			echo "# sent to clients before they connect, such as \"/etc/issue.net\"" >> /etc/default/dropbear
			echo "DROPBEAR_BANNER=\"\"" >> /etc/default/dropbear
			echo "# RSA hostkey file (default: /etc/dropbear/dropbear_rsa_host_key" >> /etc/default/dropbear
			echo "#DROPBEAR_RSAKEY=\"/etc/dropbear/dropbear_rsa_host_key\"" >> /etc/default/dropbear
			echo "# DSS hostkey file (default: /etc/dropbear/dropbear_dss_host_key" >> /etc/default/dropbear
			echo "#DROPBEAR_DSSKEY=\"/etc/dropbear/dropbear_dss_host_key\"" >> /etc/default/dropbear
        fi
        if [ -e /etc/init.d/dropbear ]; then
            update-rc.d dropbear defaults >/dev/null
            /etc/init.d/dropbear restart
        fi
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)

    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.



exit 0


