Guest User

Virtmanager QEMU VM toggle

a guest
Aug 17th, 2025
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.15 KB | Source Code | 0 0
  1. #!/bin/bash
  2.  
  3. export LIBVIRT_DEFAULT_URI="qemu:///system"
  4.  
  5. VM_NAME="RDPWindows"
  6. DPT_NAME="default"
  7. NET_NAME="isolated"
  8.  
  9. SOCK_DIR="/home/USER/windows/.socket"
  10.  
  11.  
  12.  
  13. VIEWER_OPTIONS="--full-screen -a --auto-resize never "
  14.  
  15. function check_status () {
  16.     # check the status of the VM  
  17.     VM_STATUS=$(virsh dominfo  $VM_NAME | grep "State:" | cut -d : -f 2 | tr -d " ")
  18.     echo $VM_STATUS
  19. }
  20.  
  21. function start_vm () {
  22.     echo "- start VM"
  23.     virsh start $VM_NAME 1>/dev/null
  24. }
  25.  
  26. function suspend_vm () {
  27.     echo "- suspend VM"
  28.     virsh suspend "$VM_NAME" 1>/dev/null
  29.     }
  30.  
  31. function resume_vm () {
  32.     echo "- resume VM"
  33.     virsh resume "$VM_NAME" 1>/dev/null
  34.     }
  35.  
  36. function start_vnet () {
  37.     NET_STATUS=$(virsh  net-list | grep isolated | grep -v inactive | grep -q active; echo $?)
  38.     if [[ ! "$NET_STATUS" == "0" ]]; then
  39.         echo "starting network [$NET_NAME]"
  40.         virsh net-start $NET_NAME 1>/dev/null
  41.     fi
  42. }
  43.  
  44. function save_vm () {
  45.     echo "- saving VM image..."
  46.     virsh managedsave "$VM_NAME" --verbose  1>/dev/null
  47.     }
  48.  
  49. function open_viewer () {
  50.     # open the VM viewer if not open already
  51.     if [[ ! $(pgrep virt-viewer 1>/dev/null ; echo $?) == "0"  ]]; then
  52.         # nohup virt-viewer $VM_NAME --attach  1>/dev/null 2>&1  &
  53.         virt-viewer $VM_NAME $VIEWER_OPTIONS  1>/dev/null 2>&1
  54.     fi
  55. }
  56.  
  57. function close_viewer () {
  58.     killall -SIGINT virt-viewer 2>/dev/null
  59.     }
  60.  
  61.  
  62. function start_session () {
  63.     echo "Opening interactive session..."
  64.     # open the viewer
  65.     sock_watch
  66.     open_viewer
  67.     # wait for the VM to shut off gracefully
  68.     echo "VMSTATUS: $(check_status) (pre)"
  69.     echo "Viewer closed, waiting for graceful shutdown..."
  70.     sleep 2
  71.     # check what's the current status of the VM after the viewer was closed
  72.     # sleep 10
  73.     VM_STATUS="$(check_status)"
  74.     echo "STATUS IS $VM_STATUS"
  75.     if [[  "$VM_STATUS" == "running" ]]; then
  76.         echo "VM is still running, suspending..."
  77.         suspend_vm
  78.     else
  79.         echo "VM is not running, nothign to do"
  80.     fi
  81. }
  82.  
  83. function sock_watch() {
  84.     # Monitor directory for create and delete events
  85.     (
  86.     # kill any pre-existing listeners
  87.     pkill -f "inotifywait .* /home/USER/windows/.socket"
  88.     inotifywait -m -e create  --format '%e %f' "$SOCK_DIR" | while read event FILE; do
  89.         case $FILE in
  90.             "shutdown" )
  91.                 echo "shutdown file created: $FILE"
  92.                 echo "closing the viewer..."
  93.                 killall -SIGINT virt-viewer 2>/dev/null
  94.             ;;
  95.             "volup" )
  96.                 echo "shutdown file created: $FILE"
  97.             ;;
  98.             "voldown" )
  99.                 echo "volume down: $FILE"
  100.             ;;
  101.             "volmute" )
  102.                 echo "volume mute: $FILE"
  103.             ;;
  104.             "brightup" )
  105.                 echo "screen brightess up: $FILE"
  106.                 sudo /home/USER/bin/brightness.py up
  107.             ;;
  108.             "brightdown" )
  109.                 echo "screen brightess down: $FILE"
  110.                 sudo /home/USER/bin/brightness.py down
  111.             ;;
  112.             "battery" )
  113.                 echo "battery status: $FILE"
  114.                 /home/USER/bin/battery.py
  115.             ;;
  116.         *)
  117.             echo "Unknown command: $FILE"
  118.         esac
  119.     mv $SOCK_DIR/$FILE $SOCK_DIR/${FILE}_BAK
  120.     done
  121.     ) &
  122. }
  123. #######################
  124. MODE=$1
  125.  
  126. VM_STATUS=$(check_status)
  127. case $VM_STATUS in
  128.     "shutoff")
  129.         echo "VM is not running, starting..."
  130.         # start the network
  131.         start_vnet
  132.         # start the VM
  133.         start_vm
  134.         # start interactive session
  135.         start_session
  136.         exit 0
  137.         ;;
  138.     "running")
  139.         echo "VM is running, suspending..."
  140.         suspend_vm
  141.         # kill the VM viewer
  142.         close_viewer
  143.         exit 0
  144.         ;;                
  145.     "paused")
  146.         echo "VM is suspended, resuming..."
  147.         # resume the suspended VM
  148.         resume_vm
  149.         # start an interactive session
  150.         start_session
  151.         exit 0
  152.         ;;  
  153.     *)
  154.         echo "The machine is in an undefined state: [$VM_STATUS]"
  155.         exit 1
  156.  
  157. esac
  158.  
  159.  
  160.  
Advertisement
Add Comment
Please, Sign In to add comment