# 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
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
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() {
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
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
rc=$?
if [ $rc -eq 0 ]; then
- report_end_task
+ report_task_end
else
report_error
fi
}
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