„vm_control.sh“ ändern

This commit is contained in:
Stephan 2022-02-06 18:10:52 +00:00
parent d066a56152
commit ac853942ad

View file

@ -19,67 +19,71 @@ elif [ $(whoami) != "root" ]; then
exit 1 exit 1
fi 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() { inotify_start() {
PROZESSID=$(ps aux | grep -v "grep" | grep -E "inotifywait.*vm_state.php" | awk -F' ' '{print $2}') PROZESSID=$(ps aux | grep -v "grep" | grep -E "inotifywait.*vm_state.php" | awk -F' ' '{print $2}')
echo "..."
if [[ -z $PROZESSID ]];then if [[ -z $PROZESSID ]];then
echo "Überwachung von ${vm_state_path} wird gestartet" 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 while read line ; do
vm_web_list=$(grep "=>" "$vm_state_path" | grep -v "letzter Zugriff")
IFS=$'\012' unset vm_states_saved
for line in $vm_web_list; do declare -A vm_states_saved
IFS=$saved_IFS
# 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") vm=$(awk -F\' '{print $2}' <<<"$line")
web_state=$(awk -F\' '{print $4}' <<<"$line") vms+=( "$vm" )
if [ "$(get_key_value "$0" "web_$vm")" = "$web_state" ]; then vm_states[$vm]=$(echo "$line" | grep "$vm" | awk -F\' '{print $4}')
echo "keine Änderung für $vm (web_state online $web_state / web_state saved $(get_key_value "$0" "web_$vm"))" 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 continue
else
echo "Änderung für $vm (web_state online: ${vm_states[$vm]} / web_state saved: ${vm_states_saved[$vm]})"
fi fi
# wenn Änderung gefunden wurde: # wenn Änderung gefunden wurde:
case "$web_state" in case "${vm_states[$vm]}" in
on) 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 synowebapi --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=poweron runner=admin guest_name="$vm" >/dev/null 2>&1
continue continue
;; ;;
off) 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 synowebapi --exec api=SYNO.Virtualization.API.Guest.Action version=1 method=shutdown runner=admin guest_name="$vm" >/dev/null 2>&1
continue continue
;; ;;
esac esac
synosetkeyvalue "$0" "web_$vm" "$web_state"
done done
save_host_state # done >/dev/null 2>&1 &
done >/dev/null 2>&1 & done &
else else
echo "läuft bereits …" echo "läuft bereits …"
fi fi
@ -111,7 +115,6 @@ inotify_stop()
case "$1" in case "$1" in
start) start)
inotify_start inotify_start
# inotify_start &
echo "läuft … " echo "läuft … "
exit 0 exit 0
;; ;;
@ -122,10 +125,3 @@ inotify_stop()
esac esac
exit 0 exit 0
################################################################################
# Nicht-Exekutiv-Bereich
# ------------------------------------------------------------------------------
#
# dynamisch angepassten Werte:
# ------------------------------------------------