diff --git a/vm_control.sh b/vm_control.sh index dfb3d6d..f4df55e 100644 --- a/vm_control.sh +++ b/vm_control.sh @@ -19,67 +19,71 @@ elif [ $(whoami) != "root" ]; then exit 1 fi -save_web_state() { -# aktuelle Einstellungen aus Statusfile auslesen und für den späteren Vergleich in diesem Skript speichern: - vm_web_list=$(grep "=>" "$vm_state_path" | grep -v "letzter Zugriff") - IFS=$'\012' - for line in $vm_web_list; do - IFS=$saved_IFS - synosetkeyvalue "$0" "web_$(awk -F\' '{print $2}' <<<"$line")" "$(awk -F\' '{print $4}' <<<"$line")" - done -} - -save_host_state() { -# VMs initialisieren - aktuelle Status der VMs auslesen und in diesem Skript speichern: - vm_list=$(synowebapi --exec api=SYNO.Virtualization.API.Guest method=list version=1 | jq -r .data.guests[].guest_name 2>/dev/null) - echo "vm_list: $vm_list" - IFS=$'\012' - for line in $vm_list; do - IFS=$saved_IFS - vm_status=$(synowebapi --exec api=SYNO.Virtualization.API.Guest version=1 method=get runner=admin guest_name="$line" | jq -r .data.status 2>/dev/null) - echo "status: $vm_status" - synosetkeyvalue "$0" "host_${line}" "${vm_status}" - done -} - inotify_start() { PROZESSID=$(ps aux | grep -v "grep" | grep -E "inotifywait.*vm_state.php" | awk -F' ' '{print $2}') - + echo "..." if [[ -z $PROZESSID ]];then echo "Überwachung von ${vm_state_path} wird gestartet" - save_host_state - save_web_state - inotifywait "${vm_state_path}" --event create,modify --monitor --timeout -1 | + # initial Web-Status auslesen: + web_state=$(cat "$vm_state_path" | grep "=>" "$vm_state_path" | grep -v "letzter Zugriff") + declare -A vm_states + while read line ; do + vm=$(awk -F\' '{print $2}' <<<"$line") + vms+=( "$vm" ) + vm_states[$vm]=$(echo "$line" | grep "$vm" | awk -F\' '{print $4}') + done <<<"$web_state" + + inotifywait "${vm_state_path}" --monitor --event modify --timeout -1 --format %e | while read line ; do - vm_web_list=$(grep "=>" "$vm_state_path" | grep -v "letzter Zugriff") - IFS=$'\012' - for line in $vm_web_list; do - IFS=$saved_IFS + + unset vm_states_saved + declare -A vm_states_saved + + # associative array umschreiben / umbenennen: + for key in "${!vm_states[@]}"; do # make sure you include the quotes there + vm_states_saved+=( ["$key"]="${vm_states["$key"]}" ) + # or: + # vm_states_saved["$key"]="${vm_states["$key"]}" + done + + unset vm_states + unset vms + + # neu einlesen: + web_state=$(cat "$vm_state_path" | grep "=>" "$vm_state_path" | grep -v "letzter Zugriff") + declare -A vm_states + while read line ; do vm=$(awk -F\' '{print $2}' <<<"$line") - web_state=$(awk -F\' '{print $4}' <<<"$line") - if [ "$(get_key_value "$0" "web_$vm")" = "$web_state" ]; then - echo "keine Änderung für $vm (web_state online $web_state / web_state saved $(get_key_value "$0" "web_$vm"))" + vms+=( "$vm" ) + vm_states[$vm]=$(echo "$line" | grep "$vm" | awk -F\' '{print $4}') + echo "Name: $vm Status: $(echo "$line" | grep "$vm" | awk -F\' '{print $4}')" + done <<<"$web_state" + + for vm in "${vms[@]}"; do + if [ "${vm_states[$vm]}" = "${vm_states_saved[$vm]}" ]; then + echo "keine Änderung für $vm (web_state online: ${vm_states[$vm]} / web_state saved: ${vm_states_saved[$vm]})" continue + else + echo "Änderung für $vm (web_state online: ${vm_states[$vm]} / web_state saved: ${vm_states_saved[$vm]})" fi # wenn Änderung gefunden wurde: - case "$web_state" in + case "${vm_states[$vm]}" in on) - echo "starte $vm" + echo "starte $vm ..." synowebapi --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=poweron runner=admin guest_name="$vm" >/dev/null 2>&1 continue ;; off) - echo "beende $vm" + echo "beende $vm ..." synowebapi --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=shutdown runner=admin guest_name="$vm" >/dev/null 2>&1 continue ;; esac - synosetkeyvalue "$0" "web_$vm" "$web_state" done - save_host_state - done >/dev/null 2>&1 & + # done >/dev/null 2>&1 & + done & else echo "läuft bereits …" fi @@ -111,7 +115,6 @@ inotify_stop() case "$1" in start) inotify_start -# inotify_start & echo "läuft … " exit 0 ;; @@ -122,10 +125,3 @@ inotify_stop() esac exit 0 - -################################################################################ -# Nicht-Exekutiv-Bereich -# ------------------------------------------------------------------------------ -# -# dynamisch angepassten Werte: -# ------------------------------------------------