|
|
@@ -0,0 +1,64 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+function get-jobresult {
|
|
|
+ method=$1
|
|
|
+ vm=$2
|
|
|
+ jobid=$3
|
|
|
+ if [[ $method == "status" ]]
|
|
|
+ then
|
|
|
+ jobstatus=$(sudo virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec-status","arguments":{"pid":'$jobid'}}')
|
|
|
+ if [[ $jobstatus == *'exited":false'* ]]
|
|
|
+ then
|
|
|
+ echo "inprogress"
|
|
|
+ elif [[ $jobstatus == *'exited":true'* ]]
|
|
|
+ then
|
|
|
+ echo "complete"
|
|
|
+ fi
|
|
|
+ elif [[ $method == "output" ]]
|
|
|
+ then
|
|
|
+ while [[ $stat != "done" ]]
|
|
|
+ do
|
|
|
+ jobstatus=$(sudo virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec-status","arguments":{"pid":'$jobid'}}')
|
|
|
+ if [[ $jobstatus == *'exited":false'* ]]
|
|
|
+ then
|
|
|
+ sleep 1
|
|
|
+ elif [[ $jobstatus == *'exited":true'* ]]
|
|
|
+ then
|
|
|
+ b64result=$(echo $jobstatus | jq -r '.return' | grep out-data | awk '{print $2}' | sed 's/"//g' | sed 's/,//g')
|
|
|
+ echo $(echo $b64result | base64 --decode)
|
|
|
+ stat="done"
|
|
|
+ else
|
|
|
+ echo 'invalid option (get-jobresult $method $qemudomain $pid)'
|
|
|
+ stat="done"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ else
|
|
|
+ echo 'invalid method (get-jobresult $method $domain $pid)'
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+clientscript='
|
|
|
+#!/bin/bash
|
|
|
+hostname=$(hostname)
|
|
|
+rsync -rv / --exclude {"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} simon@172.16.0.103:/mnt/backup/$hostname/
|
|
|
+'
|
|
|
+
|
|
|
+vmlist=$(virsh list | grep running | awk '{print $2}')
|
|
|
+for vm in $vmlist
|
|
|
+do
|
|
|
+ response=$(virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec","arguments": {"path": "cat","arg": ["/root/scripts/backup.sh"],"capture-output": true}}')
|
|
|
+ pid=$(echo $response | sed 's/:/ /g' | awk '{print $3}' | sed 's/}//g')
|
|
|
+ scriptcontent=$(get-jobresult output $vm $pid)
|
|
|
+ if [[ $scriptcontent != $clientscript ]]
|
|
|
+ then
|
|
|
+ handle=$(virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-file-open","arguments": {"path": "/root/scripts/backup.sh","mode": "w+"}}')
|
|
|
+ handle=$(echo $handle | jq -r ".return")
|
|
|
+ cmd='{"execute": "guest-file-write","arguments": {"handle": '$handle',"buf-b64": "CiMhL2Jpbi9iYXNoCmhvc3RuYW1lPSQoaG9zdG5hbWUpCnJzeW5jIC1ydiAvIC0tZXhjbHVkZSB7Ii9kZXYvKiIsIi9wcm9jLyoiLCIvc3lzLyoiLCIvdG1wLyoiLCIvcnVuLyoiLCIvbW50LyoiLCIvbWVkaWEvKiIsIi9sb3N0K2ZvdW5kIn0gc2ltb25AMTcyLjE2LjAuMTAzOi9tbnQvYmFja3VwLyRob3N0bmFtZS8K"}}'
|
|
|
+ virsh qemu-agent-command --domain $vm --cmd "$cmd"
|
|
|
+ cmd='{"execute": "guest-file-close","arguments": {"handle": '$handle'}}'
|
|
|
+ virsh qemu-agent-command --domain $vm --cmd $cmd
|
|
|
+ fi
|
|
|
+
|
|
|
+ fullcmd='{"execute": "guest-exec","arguments": {"path": "/root/scripts/backup.sh","arg": [""],"capture-output": true}}'
|
|
|
+ virsh qemu-agent-command --domain $vm --cmd $fullcmd
|
|
|
+done
|