#!/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