X-Git-Url: https://code.grnet.gr/git/snf-image/blobdiff_plain/aa185eca94e05e1dc92cce24737979f5bf8193cf..fcae4e9182d6609a920c905c414423440fcf7b1d:/snf-image-helper/common.sh diff --git a/snf-image-helper/common.sh b/snf-image-helper/common.sh index 750800f..7dc6623 100644 --- a/snf-image-helper/common.sh +++ b/snf-image-helper/common.sh @@ -1,4 +1,4 @@ -# Copyright (C) 2011 GRNET S.A. +# Copyright (C) 2011, 2012, 2013 GRNET S.A. # Copyright (C) 2007, 2008, 2009 Google Inc. # # This program is free software; you can redistribute it and/or modify @@ -41,86 +41,88 @@ MSG_TYPE_TASK_END="TASK_END" STDERR_LINE_SIZE=10 +add_cleanup() { + local cmd="" + for arg; do cmd+=$(printf "%q " "$arg"); done + CLEANUP+=("$cmd") +} -# hypervisor param is passed in /proc/cmdline -case "$hypervisor" in - kvm) - FLOPPY_DEV=/dev/fd0 - IMG_DEV=/dev/vda - RESULT=/dev/ttyS1 - MONITOR=/dev/ttyS2 - ;; - xen-hvm|xen-pvm) - FLOPPY_DEV=/dev/xvdc1 - IMG_DEV=/dev/xvdb - ;; -esac - -to_monitor() { - - case $hypervisor in - kvm) - echo "HELPER_MONITOR_$@" > "$MONITOR" - ;; - xen-pvm|xen-hvm) - echo "HELPER_MONITOR_$@" | socat STDIO INTERFACE:eth0 - ;; - esac +close_fd() { + local fd=$1 + + exec {fd}>&- } -to_result() { +prepare_helper() { + local cmdline item key val hypervisor domid - case $hypervisor in - kvm) - echo "HELPER_RESULT_$@" > "$RESULT" + read -a cmdline < /proc/cmdline + for item in "${cmdline[@]}"; do + key=$(cut -d= -f1 <<< "$item") + if [ "$key" = "hypervisor" ]; then + val=$(cut -d= -f2 <<< "$item") + hypervisor="$val" + fi + done + + case "$hypervisor" in + kvm) + FLOPPY_DEV=/dev/fd0 + exec {RESULT_FD}> /dev/ttyS1 + add_cleanup close_fd ${RESULT_FD} + exec {MONITOR_FD}> /dev/ttyS2 + add_cleanup close_fd ${MONITOR_FD} ;; - xen-pvm|xen-hvm) + xen-hvm|xen-pvm) + mount -t xenfs xenfs /proc/xen + iptables -P OUTPUT DROP + ip6tables -P OUTPUT DROP + ip link set eth0 up + FLOPPY_DEV=/dev/xvdc domid=$(xenstore-read domid) - xenstore-write /local/domain/0/helper/$domid "HELPER_RESULT_$@" + exec {RESULT_FD}> >(xargs -l1 xenstore-write /local/domain/0/snf-image-helper/$domid) + add_cleanup close_fd ${RESULT_FD} + exec {MONITOR_FD}> >(socat STDIN INTERFACE:eth0) + add_cleanup close_fd ${MONITOR_FD} + ;; + *) + echo "ERROR: Unknown hypervisor: \`$hypervisor'" >&2 + exit 1 ;; esac -} - - -add_cleanup() { - local cmd="" - for arg; do cmd+=$(printf "%q " "$arg"); done - CLEANUP+=("$cmd") + export RESULT_FD MONITOR_FD } log_error() { ERRORS+=("$@") echo "ERROR: $@" >&2 - to_result "ERROR: $@" + echo "ERROR: $@" >&${MONITOR_FD} exit 1 } warn() { echo "Warning: $@" >&2 - to_monitor "WARNING: $@" + echo "WARNING: $@" >&${MONITOR_FD} } report_task_start() { - to_monitor "$MSG_TYPE_TASK_START:${PROGNAME:2}" + echo "$MSG_TYPE_TASK_START:${PROGNAME:2}" >&${MONITOR_FD} } report_task_end() { - to_monitor "$MSG_TYPE_TASK_END:${PROGNAME:2}" + echo "$MSG_TYPE_TASK_END:${PROGNAME:2}" >&${MONITOR_FD} } report_error() { if [ ${#ERRORS[*]} -eq 0 ]; then # No error message. Print stderr - lines="$(tail --lines=${STDERR_LINE_SIZE} "$STDERR_FILE")" - cnt=$(echo $lines | wc -l) - for line in lines; do - to_monitor "$STDERR:$cnt: $line" - let cnt-- - done + local lines=$(tail --lines=${STDERR_LINE_SIZE} "$STDERR_FILE" | wc -l) + echo -n "STDERR:${lines}:" >&${MONITOR_FD} + tail --lines=$lines "$STDERR_FILE" >&${MONITOR_FD} else for line in "${ERRORS[@]}"; do - to_monitor "ERROR: $line" + echo "ERROR:$line" >&${MONITOR_FD} done fi } @@ -432,9 +434,7 @@ check_if_excluded() { return_success() { - - to_result SUCCESS - + echo SUCCESS >&${RESULT_FD} } trap cleanup EXIT