The cirros image was rebuilt against the 3.13.0-83 kernel, drivers e1000e, igbvf...
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / src / bin / cirros-per
diff --git a/cirros-testvm/src-cirros/src/bin/cirros-per b/cirros-testvm/src-cirros/src/bin/cirros-per
new file mode 100755 (executable)
index 0000000..7536472
--- /dev/null
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+. ${CIRROS_LIB:=/lib/cirros/shlib_cirros} ||
+       { echo "failed to read ${CIRROS_LIB}" 1>&2; exit 1; }
+
+Usage() {
+       cat <<EOF
+Usage: ${0##*/} [ options ] frequency name cmd [args]
+
+   run cmd with given arguments for the given frequency.
+   frequency is:
+     always:    run every time
+     always-ds: run every time, but only if there is a datasource
+     boot:      run only once per boot
+     instance:  run once per instance (first boot)
+     once:      run once ever (first boot with or without datasource)
+   name is the name of this thing.  subsequent runs of will be
+     run with the given frequency based on state kept in 'name'
+   
+   options:
+        --dry-run  : only report, do not update results
+   -v | --verbose  : be more verbose
+EOF
+}
+
+cirros_per() {
+       local short_opts="hv"
+       local long_opts="help,dry-run,verbose"
+       local getopt_out=""
+       getopt_out=$(getopt --name "${0##*/}" \
+               --options "${short_opts}" --long "${long_opts}" -- "$@") &&
+               eval set -- "${getopt_out}" ||
+               { bad_Usage; return; }
+
+       local dryrun=false cur="" next="" VERBOSITY="$VERBOSITY"
+       local freq="" name="" state_d="" marker=""
+
+       while [ $# -ne 0 ]; do
+               cur=${1}; next=${2};
+               case "$cur" in
+                       -h|--help) Usage ; exit 0;;
+                       -v|--verbose) VERBOSITY=$((${VERBOSITY}+1));;
+                          --dry-run) dryrun=true;;
+                       --) shift; break;;
+               esac
+               shift;
+       done
+       [ $# -ge 3 ] || { bad_Usage "must provide frequency, name, cmd"; return; }
+
+       freq="$1"
+       name="$2"
+       shift 2;
+
+       [ ! -r "$CONFIG" ] || . "$CONFIG" ||
+               fail "failed to read $CONFIG"
+
+       case "$freq" in
+               always)
+                       state_d="${STATE_D}";
+                       marker="always.always.${name}"
+                       ;;
+               always-ds)
+                       state_d="${STATE_D}";
+                       marker="always-ds.always.${name}"
+                       assert_datasource ||
+                               { error "no datasource found"; return 1; }
+                       ;;
+               instance)
+                       state_d="${STATE_D}";
+                       ds_get_item "instance-id" ||
+                               { error "failed to get instance-id of datasource"; return 1; }
+                       iid="${_RET}"
+                       marker="instance.${iid}.${name}"
+                       ;;
+               once)
+                       state_d="${STATE_D}";
+                       marker="once.once.${name}"
+                       ;;
+               boot)
+                       state_d="${BOOT_STATE_D}"
+                       marker="boot.boot.${name}"
+                       ;;
+               *) fail "bad frequency $freq";;
+       esac
+
+       debug 2 "using state_dir=${state_d}, marker=${marker}"
+
+       [ -d "$state_d" ] || mkdir -p "$state_d" ||
+               { error "failed to create state_dir ${state_d}"; return 1; }
+
+       if [ "${freq#always}" = "$freq" -a -f "${state_d}/${marker}" ]; then
+               { error "${name} already run per ${freq}"; return 0; }
+       fi
+
+       if $dryrun; then
+               error "run" "$@"
+               return 0
+       fi
+
+       local ret=0 uptime="" idle=""
+       debug 2 "[$freq]" "$@"
+       "$@"
+       ret=$?
+
+       read_uptime
+       echo "[${_RET}]" "$@" > "${state_d}/${marker}"
+
+       return "$ret"
+}
+
+cirros_per "$@"
+
+# vi: ts=4 noexpandtab