Pārlūkot izejas kodu

Added QEMU Backup

Simon Royer 2 gadi atpakaļ
vecāks
revīzija
292d9f64a1
1 mainītis faili ar 64 papildinājumiem un 0 dzēšanām
  1. 64 0
      kvm-master.sh

+ 64 - 0
kvm-master.sh

@@ -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