#!/bin/sh
### BEGIN INIT INFO
# Provides:          ec2-init
# Required-Start:    $network $local_fs
# Required-Stop:
# Should-Start:      $named
# Should-Stop:
# Default-Start:     S
# Default-Stop:      1
# Short-Description: Initialises system for use on Amazon EC2
# Description:       Fetches login credentials and handles various quirks
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=ec2-init

. /lib/lsb/init-functions

run_once() {
    per_id=$1
    action_id=$2

    semaphore="/var/lib/ec2/$action_id.$per_id"

    if ! [ -e "$semaphore" ]
    then
        touch "$semaphore"
        return 0
    fi
    return 1
}

run_once_per_ami() {
    action_id=$1
    ami=`ec2-get-info --ami-id | cut -f2 -d\ `
    run_once $ami $action_id
}

run_once_ever() {
    action_id=$1
    run_once ever $action_id
}

regenerate_ssh_host_keys() {
    rm -f /etc/ssh/ssh_host_*_key*

    ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
    ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''

    # This allows user to get host keys securely through console log
    echo
    echo
    echo "#############################################################"
    echo "-----BEGIN SSH HOST KEY FINGERPRINTS-----"
    ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
    ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
    echo "-----END SSH HOST KEY FINGERPRINTS-----"
    echo "#############################################################"
}

# fix LP bug 458850
# the ephemeral mounts provided in eucalyptus instances differ from
# those found in ec2 in 2 ways:
#   1. independent of arch type, the filesystem is on /dev/sda2
#   2. the filesystem is ext2, not ext3
fix_euca_fstab() {
    
    local edev="/dev/sda2" eedev='\/dev\/sda2' 

    [ -e "${edev}" ] || return 0

    local sops=""; # sed operations
    local mntinfo="" file_out="" sops="" umdev=${edev}

    # if /dev/sdb is set to mount to /mnt, then we
    # want to rewrite that to be /dev/sda2
    mntinfo=$(awk '$2 == "/mnt" { printf("dev=%s fs=%s\n",$1,$3); }' /etc/fstab)
    case "${mntinfo}" in
        dev=/dev/sdb\ *)
            umdev=/dev/sdb;
            sops="${sops:+${sops};}s,^/dev/sdb,${edev},";;
    esac

    # if fstab says ext3, but fs on edev is ext2, switch fstab
    case "${mntinfo}" in
        *\ fs=ext3)
            file_out=$(file --special-files "${edev}")
            case "${file_out}" in
                *ext2*) sops="${sops:+${sops};}/^${eedev}/s/ext3/ext2/;";;
            esac
            ;;
    esac

    # if there were no sed operations to preform, then nothing to do
    [ -n "${sops}" ] || return 0

    log_daemon_msg "Fixing fstab for eucalyptus"
    sed -i "${sops}" /etc/fstab
    # subsequent boots, /etc/fstab will be updated, and the mount
    # here isn't needed, but if modifications were made, it is
    umount "${edev}" >/dev/null 2>&1
    [ "${edev}" = "${umdev}" ] || umount "${umdev}" >/dev/null 2>&1
    mount "${edev}"
    log_end_msg $?
}

case "$1" in
    start)
        if ! ec2-is-compat-env --quiet; then
           log_daemon_msg "ec2-init disabled"
           log_end_msg 0
           exit 0
        fi
        if [ ! -d /var/run/ec2 ]; then
            mkdir /var/run/ec2
        fi

        log_daemon_msg "Waiting for EC2 meta-data service"
        if ec2-wait-for-meta-data-service
        then
            log_end_msg 0
        else
            log_end_msg 1
            exit 1
        fi

        # fix euca_fstab for ephemeral mounts one time ever
        # on rebundle, it should collect the fixed /etc/fstab
        if run_once_ever euca-fix-fstab-for-ephemeral; then
            fix_euca_fstab
        fi

        if run_once_per_ami ssh_host_key_regeneration
        then
            # we can't be certain that rsyslog is up (or configured to send
            # messages to console), but we want to make sure this goes to
            # console. So write to /dev/console directly through tee.
            # Change priority of message, so if user.notice (logger's default)
            # also goes to /dev/console , we could avoid dup messages
            regenerate_ssh_host_keys 2>&1 | 
                logger -p user.info -s -t "ec2" 2>&1 |
                tee /dev/console
        fi

        if run_once_ever ec2-defaults
        then
            log_daemon_msg "Setting EC2 defaults"
            if ec2-set-defaults 2> /dev/null
            then
                log_end_msg 0
            else
                log_end_msg 1
            fi
        fi

        if run_once_per_ami ssh_authorized_keys
        then
            log_daemon_msg "Fetching EC2 SSH keys"
            if ec2-fetch-credentials 2> /dev/null
            then
                log_end_msg 0
            else
                log_end_msg 1
            fi
        fi

        log_daemon_msg "Setting hostname to EC2 localhostname"
        if ec2-set-hostname 2> /dev/null
        then
            log_end_msg 0
            invoke-rc.d rsyslog reload
        else
            log_end_msg 1
        fi

        ;;
    stop)
        exit 0
        ;;
    restart|force-reload)
        exec $0 start
        ;;
    *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac

exit 0
