Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- export LIBVIRT_DEFAULT_URI="qemu:///system"
- VM_NAME="RDPWindows"
- DPT_NAME="default"
- NET_NAME="isolated"
- SOCK_DIR="/home/USER/windows/.socket"
- VIEWER_OPTIONS="--full-screen -a --auto-resize never "
- function check_status () {
- # check the status of the VM
- VM_STATUS=$(virsh dominfo $VM_NAME | grep "State:" | cut -d : -f 2 | tr -d " ")
- echo $VM_STATUS
- }
- function start_vm () {
- echo "- start VM"
- virsh start $VM_NAME 1>/dev/null
- }
- function suspend_vm () {
- echo "- suspend VM"
- virsh suspend "$VM_NAME" 1>/dev/null
- }
- function resume_vm () {
- echo "- resume VM"
- virsh resume "$VM_NAME" 1>/dev/null
- }
- function start_vnet () {
- NET_STATUS=$(virsh net-list | grep isolated | grep -v inactive | grep -q active; echo $?)
- if [[ ! "$NET_STATUS" == "0" ]]; then
- echo "starting network [$NET_NAME]"
- virsh net-start $NET_NAME 1>/dev/null
- fi
- }
- function save_vm () {
- echo "- saving VM image..."
- virsh managedsave "$VM_NAME" --verbose 1>/dev/null
- }
- function open_viewer () {
- # open the VM viewer if not open already
- if [[ ! $(pgrep virt-viewer 1>/dev/null ; echo $?) == "0" ]]; then
- # nohup virt-viewer $VM_NAME --attach 1>/dev/null 2>&1 &
- virt-viewer $VM_NAME $VIEWER_OPTIONS 1>/dev/null 2>&1
- fi
- }
- function close_viewer () {
- killall -SIGINT virt-viewer 2>/dev/null
- }
- function start_session () {
- echo "Opening interactive session..."
- # open the viewer
- sock_watch
- open_viewer
- # wait for the VM to shut off gracefully
- echo "VMSTATUS: $(check_status) (pre)"
- echo "Viewer closed, waiting for graceful shutdown..."
- sleep 2
- # check what's the current status of the VM after the viewer was closed
- # sleep 10
- VM_STATUS="$(check_status)"
- echo "STATUS IS $VM_STATUS"
- if [[ "$VM_STATUS" == "running" ]]; then
- echo "VM is still running, suspending..."
- suspend_vm
- else
- echo "VM is not running, nothign to do"
- fi
- }
- function sock_watch() {
- # Monitor directory for create and delete events
- (
- # kill any pre-existing listeners
- pkill -f "inotifywait .* /home/USER/windows/.socket"
- inotifywait -m -e create --format '%e %f' "$SOCK_DIR" | while read event FILE; do
- case $FILE in
- "shutdown" )
- echo "shutdown file created: $FILE"
- echo "closing the viewer..."
- killall -SIGINT virt-viewer 2>/dev/null
- ;;
- "volup" )
- echo "shutdown file created: $FILE"
- ;;
- "voldown" )
- echo "volume down: $FILE"
- ;;
- "volmute" )
- echo "volume mute: $FILE"
- ;;
- "brightup" )
- echo "screen brightess up: $FILE"
- sudo /home/USER/bin/brightness.py up
- ;;
- "brightdown" )
- echo "screen brightess down: $FILE"
- sudo /home/USER/bin/brightness.py down
- ;;
- "battery" )
- echo "battery status: $FILE"
- /home/USER/bin/battery.py
- ;;
- *)
- echo "Unknown command: $FILE"
- esac
- mv $SOCK_DIR/$FILE $SOCK_DIR/${FILE}_BAK
- done
- ) &
- }
- #######################
- MODE=$1
- VM_STATUS=$(check_status)
- case $VM_STATUS in
- "shutoff")
- echo "VM is not running, starting..."
- # start the network
- start_vnet
- # start the VM
- start_vm
- # start interactive session
- start_session
- exit 0
- ;;
- "running")
- echo "VM is running, suspending..."
- suspend_vm
- # kill the VM viewer
- close_viewer
- exit 0
- ;;
- "paused")
- echo "VM is suspended, resuming..."
- # resume the suspended VM
- resume_vm
- # start an interactive session
- start_session
- exit 0
- ;;
- *)
- echo "The machine is in an undefined state: [$VM_STATUS]"
- exit 1
- esac
Advertisement
Add Comment
Please, Sign In to add comment