#!/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