# Copyright (c) 2006 Morgan Goeller # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, # copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following # conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. #!/bin/ksh export SCRIPT_TIMESTAMP=$(date +%s) export TMP_MANIFEST_NAME export TMP_IMAGE_NAME export TMP_KEYPAIR_NAME export TMP_KEYPAIR_DIR while getopts m:i:k:d: OPTION do case ${OPTION} in m) TMP_MANIFEST_NAME=${OPTARG} ;; k) TMP_KEYPAIR_NAME=${OPTARG};; d) TMP_KEYPAIR_DIR=${OPTARG};; \?) print -u2 "Usage: ${0}} [ -m manifest_name -i image_name -k keypair_name -d keypair_dir ]" exit 1;; esac done export EC2_HOME=${TMP_EC2_HOME:-$EC2_HOME} export EC2_PRIVATE_KEY=${TMP_EC2_PRIVATE_KEY:-$EC2_PRIVATE_KEY} export EC2_CERT=${TMP_EC2_CERT:-$EC2_CERT} if [[ -z ${EC2_HOME} || -z ${PATH} || -z ${EC2_PRIVATE_KEY} || -z ${EC2_CERT} ]]; then print "The environment is not set up correctly." return 1 fi export IMAGE_FN="/tmp/$(basename ${0}).${SCRIPT_TIMESTAMP}" ec2-describe-images > ${IMAGE_FN} export IMAGE_COUNT=$(cat ${IMAGE_FN} | wc -l) if [ ${IMAGE_COUNT} -eq 0 ]; then print "A connection could not be made to AWS." return 2 fi print "There are ${IMAGE_COUNT} images available:" echo "-------------------------------------------------------" cat ${IMAGE_FN} echo "-------------------------------------------------------" export MANIFEST_NAME=${TMP_MANIFEST_NAME:-ec2-public-images/fedora-core4-base.manifest} export IMAGE_NAME=$(cat ${IMAGE_FN} | grep ${MANIFEST_NAME} | cut --fields=2) export KEYPAIR_NAME=${TMP_KEYPAIR_NAME:-key-$SCRIPT_TIMESTAMP} export KEY_DIR=${TMP_KEY_DIR:-$HOME/.ssh} print "Using image ${IMAGE_NAME} (matching ${MANIFEST_NAME})" print "Using keypair ${KEYPAIR_NAME}" print "Using key dir ${KEY_DIR}" echo "-------------------------------------------------------" export KEY_FN=${KEY_NAME:-$KEY_DIR/id-rsa-$KEYPAIR_NAME} print "Adding key pair ${KEYPAIR_NAME}" print "Storing key file in ${KEY_FN}" ec2-add-keypair ${KEYPAIR_NAME} > ${KEY_FN} if [ $? -gt 0 ]; then print "The keypair ${KEYPAIR_NAME} count not be added." return 3 fi print "Securing key file" chmod 600 ${KEY_FN} if [ $? -gt 0 ]; then print "The key file could not be secured." return 4 fi echo "-------------------------------------------------------" print "STARTING INSTANCE" print "MANIFEST: ${MANIFEST_NAME}" print "KEYPAIR: ${KEYPAIR_NAME}" export TMP_INSTANCE_FN="/tmp/describe-instances.${SCRIPT_TIMESTAMP}" ec2-run-instances ${IMAGE_NAME} -k ${KEYPAIR_NAME} > ${TMP_INSTANCE_FN} export INSTANCE_NAME=$(grep INSTANCE ${TMP_INSTANCE_FN} | cut --fields 2) print "INSTANCE_NAME: ${INSTANCE_NAME}" if [ $? -gt 0 ]; then print "The instance could not be started." return 5 fi echo "-------------------------------------------------------" export TMP_INSTANCE_FN="/tmp/describe-instances.${SCRIPT_TIMESTAMP}" ec2-describe-instances > ${TMP_INSTANCE_FN} #echo "-------------------------------------------------------" #cat ${TMP_INSTANCE_FN} export LOOP_START=1 while [[ ${LOOP_START} -eq 1 || $(grep ${INSTANCE_NAME} ${TMP_INSTANCE_FN} | grep --count pending) > 0 ]] do (( LOOP_START= $LOOP_START + 1 )) sleep 30 print "INSTANCE PENDING: ${INSTANCE_NAME} $(date +'%Y-%m-%d %H:%M:%S')" ec2-describe-instances > ${TMP_INSTANCE_FN} echo "-------------------------------------------------------" done if [ $(grep ${INSTANCE_NAME} ${TMP_INSTANCE_FN} | grep --count running) > 0 ]; then print "INSTANCE STARTED: ${INSTANCE_NAME}" cat ${TMP_INSTANCE_FN} ec2-authorize default -p 22 echo "-------------------------------------------------------" else print "INSTANCE ERROR" return 6 echo "-------------------------------------------------------" fi