kvm-master.sh 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/bin/bash
  2. function get-jobresult {
  3. method=$1
  4. vm=$2
  5. jobid=$3
  6. if [[ $method == "status" ]]
  7. then
  8. jobstatus=$(sudo virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec-status","arguments":{"pid":'$jobid'}}')
  9. if [[ $jobstatus == *'exited":false'* ]]
  10. then
  11. echo "inprogress"
  12. elif [[ $jobstatus == *'exited":true'* ]]
  13. then
  14. echo "complete"
  15. fi
  16. elif [[ $method == "output" ]]
  17. then
  18. while [[ $stat != "done" ]]
  19. do
  20. jobstatus=$(sudo virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec-status","arguments":{"pid":'$jobid'}}')
  21. if [[ $jobstatus == *'exited":false'* ]]
  22. then
  23. sleep 1
  24. elif [[ $jobstatus == *'exited":true'* ]]
  25. then
  26. b64result=$(echo $jobstatus | jq -r '.return' | grep out-data | awk '{print $2}' | sed 's/"//g' | sed 's/,//g')
  27. echo $(echo $b64result | base64 --decode)
  28. stat="done"
  29. else
  30. echo 'invalid option (get-jobresult $method $qemudomain $pid)'
  31. stat="done"
  32. fi
  33. done
  34. else
  35. echo 'invalid method (get-jobresult $method $domain $pid)'
  36. fi
  37. }
  38. clientscript='
  39. #!/bin/bash
  40. hostname=$(hostname)
  41. rsync -rv / --exclude {"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} simon@172.16.0.103:/mnt/backup/$hostname/
  42. '
  43. vmlist=$(virsh list | grep running | awk '{print $2}')
  44. for vm in $vmlist
  45. do
  46. response=$(virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-exec","arguments": {"path": "cat","arg": ["/root/scripts/backup.sh"],"capture-output": true}}')
  47. pid=$(echo $response | sed 's/:/ /g' | awk '{print $3}' | sed 's/}//g')
  48. scriptcontent=$(get-jobresult output $vm $pid)
  49. if [[ $scriptcontent != $clientscript ]]
  50. then
  51. handle=$(virsh qemu-agent-command --domain $vm --cmd '{"execute": "guest-file-open","arguments": {"path": "/root/scripts/backup.sh","mode": "w+"}}')
  52. handle=$(echo $handle | jq -r ".return")
  53. cmd='{"execute": "guest-file-write","arguments": {"handle": '$handle',"buf-b64": "CiMhL2Jpbi9iYXNoCmhvc3RuYW1lPSQoaG9zdG5hbWUpCnJzeW5jIC1ydiAvIC0tZXhjbHVkZSB7Ii9kZXYvKiIsIi9wcm9jLyoiLCIvc3lzLyoiLCIvdG1wLyoiLCIvcnVuLyoiLCIvbW50LyoiLCIvbWVkaWEvKiIsIi9sb3N0K2ZvdW5kIn0gc2ltb25AMTcyLjE2LjAuMTAzOi9tbnQvYmFja3VwLyRob3N0bmFtZS8K"}}'
  54. virsh qemu-agent-command --domain $vm --cmd "$cmd"
  55. cmd='{"execute": "guest-file-close","arguments": {"handle": '$handle'}}'
  56. virsh qemu-agent-command --domain $vm --cmd $cmd
  57. fi
  58. fullcmd='{"execute": "guest-exec","arguments": {"path": "/root/scripts/backup.sh","arg": [""],"capture-output": true}}'
  59. virsh qemu-agent-command --domain $vm --cmd $fullcmd
  60. done