Make use of XenStore to export SUCCESS msg
[snf-image] / snf-image-helper / common.sh
index 1523cd2..fb87268 100644 (file)
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301, USA.
 
-RESULT=/dev/ttyS1
-MONITOR=/dev/ttyS2
-
-FLOPPY_DEV=/dev/fd0
 PROGNAME=$(basename $0)
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
@@ -40,6 +36,43 @@ CLEANUP=( )
 ERRORS=( )
 WARNINGS=( )
 
+MSG_TYPE_TASK_START="TASK_START"
+MSG_TYPE_TASK_END="TASK_END"
+
+STDERR_LINE_SIZE=10
+
+
+# hypervisor param is passed in /proc/cmdline
+case "$hypervisor" in
+  kvm)
+    FLOPPY_DEV=/dev/fd0
+    ROOT_FSTAB_ENTRY=/dev/sda1
+    IMG_DEV=/dev/vda
+    RESULT=/dev/ttyS1
+    MONITOR=/dev/ttyS2
+    ;;
+  xen-hvm|xen-pvm)
+    FLOPPY_DEV=/dev/xvdc1
+    ROOT_FSTAB_ENTRY=/dev/xvda1
+    IMG_DEV=/dev/xvdb
+    RESULT=/dev/hvc0
+    MONITOR=/dev/hvc0
+    ;;
+esac
+
+to_monitor() {
+
+    echo "HELPER_MONITOR_$@" > "$MONITOR"
+
+}
+
+to_result() {
+
+    echo "HELPER_RESULT_$@" > "$RESULT"
+
+}
+
+
 add_cleanup() {
     local cmd=""
     for arg; do cmd+=$(printf "%q " "$arg"); done
@@ -48,77 +81,38 @@ add_cleanup() {
 
 log_error() {
     ERRORS+=("$@")
-    echo "ERROR: $@" | tee $RESULT >&2
+    echo "ERROR: $@" >&2
+    to_result "ERROR: $@"
     exit 1
 }
 
 warn() {
-    WARNINGS+=("$@")
     echo "Warning: $@" >&2
+    to_monitor "WARNING:$@"
 }
 
-report_start_task() {
-
-    local type="start-task"
-    local timestamp=$(date +%s.%N)
-    local name="${PROGNAME}"
-
-    report="{\"id\":\"$id\","
-    report+="\"type\":\"$type\"," \
-    report+="\"timestamp\":$(date +%s.%N)," \
-    report+="\"name\":\"$name\"}"
-
-    echo "$report" > "$MONITOR"
+report_task_start() {
+    to_monitor "$MSG_TYPE_TASK_START:${PROGNAME:2}"
 }
 
-json_list() {
-    declare -a items=("${!1}")
-    report="["
-    for item in "${items[@]}"; do
-        report+="\"$(sed 's/"/\\"/g' <<< "$item")\","
-    done
-    if [ ${#report} -gt 1 ]; then
-        # remove last comma(,)
-        report="${report%?}"
-    fi
-    report+="]"
-
-    echo "$report"
-}
-
-report_end_task() {
-
-    local type="end-task"
-    local timestam=$(date +%s.%N)
-    local name=${PROGNAME}
-    local warnings=$(json_list WARNINGS[@])
-
-    report="{\"id\":\"$id\","
-    report+="\"type\":\"$type\"," \
-    report+="\"timestamp\":$(date +%s)," \
-    report+="\"name\":\"$name\"," \
-    report+="\"warnings\":\"$warnings\"}"
-
-    echo "$report" > "$MONITOR"
+report_task_end() {
+    to_monitor "$MSG_TYPE_TASK_END:${PROGNAME:2}"
 }
 
 report_error() {
-    local type="ganeti-error"
-    local timestamp=$(date +%s.%N)
-    local location="${PROGNAME}"
-    local errors=$(json_list ERRORS[@])
-    local warnings=$(json_list WARNINGS[@])
-    local stderr="$(cat "$STDERR_FILE" | sed 's/"/\\"/g')"
-
-    report="{\"id\":\"$id\","
-    report+="\"type\":\"$type\"," \
-    report+="\"timestamp\":$(date +%s)," \
-    report+="\"location\":\"$location\"," \
-    report+="\"errors\":$errors," \
-    report+="\"warnings\":$warnings," \
-    report+="\"stderr\":\"$stderr\"}"
-
-    echo "$report" > "$MONITOR"
+    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
+    else
+        for line in "${ERRORS[@]}"; do
+            to_monitor "ERROR: $line"
+        done
+    fi
 }
 
 get_base_distro() {
@@ -134,6 +128,8 @@ get_base_distro() {
         echo "suse"
     elif [ -e "$root_dir/etc/gentoo-release" ]; then
         echo "gentoo"
+    elif [ -e "$root_dir/etc/arch-release" ]; then
+        echo "arch"
     else
         warn "Unknown base distro."
     fi
@@ -163,6 +159,8 @@ get_distro() {
         echo "suse"
     elif [ -e "$root_dir/etc/gentoo-release" ]; then
         echo "gentoo"
+    elif [ -e "$root_dir/etc/arch-release" ]; then
+        echo "arch"
     else
         warn "Unknown distro."
     fi
@@ -403,7 +401,7 @@ task_cleanup() {
     rc=$?
 
     if [ $rc -eq 0 ]; then
-       report_end_task
+       report_task_end
     else
        report_error
     fi
@@ -412,16 +410,31 @@ task_cleanup() {
 }
 
 check_if_excluded() {
-
-    local exclude=SNF_IMAGE_PROPERTY_EXCLUDE_TASK_${PROGNAME:2}
+    local name="$(tr [a-z] [A-Z] <<< ${PROGNAME:2})"
+    local exclude="SNF_IMAGE_PROPERTY_EXCLUDE_TASK_${name}"
     if [ -n "${!exclude}" ]; then
-        warn "Task $PROGNAME was excluded and will not run."
+        warn "Task ${PROGNAME:2} was excluded and will not run."
         exit 0
     fi
 
     return 0
 }
 
+
+return_success() {
+
+    case $hypervisor in
+      kvm)
+        echo "SUCCESS" > "$RESULT"
+        ;;
+      xen-pvm|xen-kvm)
+        domid=$(xenstore-read domid)
+        xenstore-write /local/domain/0/helper/$domid SUCCESS
+        ;;
+    esac
+
+}
+
 trap cleanup EXIT
 set -o pipefail