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