mirror of
				https://github.com/oSoWoSo/DistroHopper.git
				synced 2024-08-14 22:46:53 +00:00 
			
		
		
		
	Add support to send command to QEMU-Monitor
- Add commandline parameter --monitor-cmd - Support implemented on commandline as well as for configuration file
This commit is contained in:
		
							parent
							
								
									21788f525d
								
							
						
					
					
						commit
						bd00b34067
					
				
					 1 changed files with 63 additions and 7 deletions
				
			
		
							
								
								
									
										70
									
								
								quickemu
									
										
									
									
									
								
							
							
						
						
									
										70
									
								
								quickemu
									
										
									
									
									
								
							|  | @ -1028,7 +1028,7 @@ function vm_boot() { | ||||||
|     echo " - Monitor:  On host: telnet ${MONITOR_TELNET_HOST} ${MONITOR_TELNET_PORT}" |     echo " - Monitor:  On host: telnet ${MONITOR_TELNET_HOST} ${MONITOR_TELNET_PORT}" | ||||||
|     echo "monitor-telnet,${MONITOR_TELNET_PORT},${MONITOR_TELNET_HOST}" >> "${VMDIR}/${VMNAME}.ports" |     echo "monitor-telnet,${MONITOR_TELNET_PORT},${MONITOR_TELNET_HOST}" >> "${VMDIR}/${VMNAME}.ports" | ||||||
|   elif [ "${MONITOR}" == "socket" ]; then |   elif [ "${MONITOR}" == "socket" ]; then | ||||||
|     args+=(-monitor unix:${VMDIR}/${VMNAME}-monitor.socket,server,nowait) |     args+=(-monitor unix:${VM_MONITOR_SOCKETPATH},server,nowait) | ||||||
|     echo " - Monitor:  On host: nc -U \"${VMDIR}/${VMNAME}-monitor.socket\"" |     echo " - Monitor:  On host: nc -U \"${VMDIR}/${VMNAME}-monitor.socket\"" | ||||||
|   else |   else | ||||||
|     :: |     :: | ||||||
|  | @ -1141,6 +1141,7 @@ function usage() { | ||||||
|   echo "  --monitor <type>                  : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'" |   echo "  --monitor <type>                  : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'" | ||||||
|   echo "  --monitor-telnet-host <ip/host>   : Set telnet host for monitor. (default: 'localhost')" |   echo "  --monitor-telnet-host <ip/host>   : Set telnet host for monitor. (default: 'localhost')" | ||||||
|   echo "  --monitor-telnet-port <port>      : Set telnet port for monitor. (default: '4444')" |   echo "  --monitor-telnet-port <port>      : Set telnet port for monitor. (default: '4444')" | ||||||
|  |   echo "  --monitor-cmd <CMD>               : Send command to monitor if available. (Example: system_powerdown)" | ||||||
|   echo "  --version                         : Print version" |   echo "  --version                         : Print version" | ||||||
|   exit 1 |   exit 1 | ||||||
| } | } | ||||||
|  | @ -1173,14 +1174,20 @@ function parse_ports_from_file { | ||||||
|     local FILE="${VMDIR}/${VMNAME}.ports" |     local FILE="${VMDIR}/${VMNAME}.ports" | ||||||
| 
 | 
 | ||||||
|     # parse ports |     # parse ports | ||||||
|     port_name=( $(cat "$FILE" | cut -d, -f1) ) |     local port_name=( $(cat "$FILE" | cut -d, -f1) ) | ||||||
|     port_number=( $(cat "$FILE" | cut -d, -f2) ) |     local port_number=( $(cat "$FILE" | cut -d, -f2) ) | ||||||
|  |     local host_name=( $(cat "$FILE" | gawk 'FS="," {print $3,"."}') ) | ||||||
|  | 
 | ||||||
|     for ((i=0; i<${#port_name[@]}; i++)); do |     for ((i=0; i<${#port_name[@]}; i++)); do | ||||||
|       if [ ${port_name[$i]} == 'ssh' ]; then |       if [ "${port_name[$i]}" == "ssh" ]; then | ||||||
|         SSH_PORT=${port_number[$i]} |         SSH_PORT="${port_number[$i]}" | ||||||
|       fi |       fi | ||||||
|       if [ ${port_name[$i]} == 'spice' ]; then |       if [ "${port_name[$i]}" == "spice" ]; then | ||||||
|         SPICE_PORT=${port_number[$i]} |         SPICE_PORT="${port_number[$i]}" | ||||||
|  |       fi | ||||||
|  |       if [ "${port_name[$i]}" == "monitor-telnet" ]; then | ||||||
|  |         MONITOR_TELNET_PORT="${port_number[$i]}" | ||||||
|  |         MONITOR_TELNET_HOST="${host_name[$i]}" | ||||||
|       fi |       fi | ||||||
|     done |     done | ||||||
| } | } | ||||||
|  | @ -1189,6 +1196,45 @@ function is_numeric { | ||||||
|     [[ "$1" =~ ^[0-9]+$ ]] |     [[ "$1" =~ ^[0-9]+$ ]] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function monitor_send_cmd { | ||||||
|  |     local MSG="${1}" | ||||||
|  | 
 | ||||||
|  |     if [ -z "${MSG}" ]; then | ||||||
|  |         echo "WARNING! Send to QEMU-Monitor: Message empty!" | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     # Determine monitor channel | ||||||
|  |     local monitor_channel="" | ||||||
|  | 
 | ||||||
|  |     if [ -S "${VMDIR}/${VMNAME}-monitor.socket" ]; then | ||||||
|  |         monitor_channel="socket" | ||||||
|  |     elif [ -n "${MONITOR_TELNET_PORT}" ] && [ -n "${MONITOR_TELNET_HOST}" ]; then | ||||||
|  |         monitor_channel="telnet" | ||||||
|  |     else | ||||||
|  |         echo "WARNING! No qemu-monitor channel available - Couldn't send message to monitor!" | ||||||
|  |         return | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     case "${monitor_channel}" in | ||||||
|  |         socket) | ||||||
|  |             echo -e " - MON-SEND: ${MSG}" | ||||||
|  |             echo -e "${MSG}" | nc -N -U "${VM_MONITOR_SOCKETPATH}" 2>&1 > /dev/null | ||||||
|  |             ;; | ||||||
|  |         telnet) | ||||||
|  |             echo -e " - MON-SEND: ${MSG}" | ||||||
|  |             echo -e "${MSG}" | nc -N "${MONITOR_TELNET_HOST}" "${MONITOR_TELNET_PORT}" 2>&1 > /dev/null | ||||||
|  |             ;; | ||||||
|  |         *) | ||||||
|  |             echo "ERROR! This should never happen!" | ||||||
|  |             exit 1 | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  | 
 | ||||||
|  |     return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| ### MAIN | ### MAIN | ||||||
| 
 | 
 | ||||||
| # Lowercase variables are used in the VM config file only | # Lowercase variables are used in the VM config file only | ||||||
|  | @ -1217,6 +1263,7 @@ public_dir="" | ||||||
| monitor="socket" | monitor="socket" | ||||||
| monitor_telnet_port="4444" | monitor_telnet_port="4444" | ||||||
| monitor_telnet_host="localhost" | monitor_telnet_host="localhost" | ||||||
|  | monitor_cmd="" | ||||||
| 
 | 
 | ||||||
| BRAILLE="" | BRAILLE="" | ||||||
| DELETE_DISK=0 | DELETE_DISK=0 | ||||||
|  | @ -1241,6 +1288,8 @@ VIEWER="" | ||||||
| SSH_PORT="" | SSH_PORT="" | ||||||
| SPICE_PORT="" | SPICE_PORT="" | ||||||
| MONITOR="" | MONITOR="" | ||||||
|  | MONITOR_CMD="" | ||||||
|  | VM_MONITOR_SOCKETPATH="" | ||||||
| 
 | 
 | ||||||
| # shellcheck disable=SC2155 | # shellcheck disable=SC2155 | ||||||
| readonly LAUNCHER=$(basename "${0}") | readonly LAUNCHER=$(basename "${0}") | ||||||
|  | @ -1338,6 +1387,10 @@ else | ||||||
|             MONITOR="${2}" |             MONITOR="${2}" | ||||||
|             shift; |             shift; | ||||||
|             shift;; |             shift;; | ||||||
|  |           -monitor-cmd|--monitor-cmd) | ||||||
|  |             MONITOR_CMD="${2}" | ||||||
|  |             shift; | ||||||
|  |             shift;; | ||||||
|           -monitor-telnet-host|--monitor-telnet-host) |           -monitor-telnet-host|--monitor-telnet-host) | ||||||
|             MONITOR_TELNET_HOST="${2}" |             MONITOR_TELNET_HOST="${2}" | ||||||
|             shift; |             shift; | ||||||
|  | @ -1369,6 +1422,7 @@ if [ -n "${VM}" ] && [ -e "${VM}" ]; then | ||||||
|   VMDIR=$(dirname "${disk_img}") |   VMDIR=$(dirname "${disk_img}") | ||||||
|   VMNAME=$(basename "${VM}" .conf) |   VMNAME=$(basename "${VM}" .conf) | ||||||
|   VMPATH=$(realpath "$(dirname "${VM}")") |   VMPATH=$(realpath "$(dirname "${VM}")") | ||||||
|  |   VM_MONITOR_SOCKETPATH="${VMDIR}/${VMNAME}-monitor.socket" | ||||||
| 
 | 
 | ||||||
|   # Backwards compatibility for ${driver_iso} |   # Backwards compatibility for ${driver_iso} | ||||||
|   if [ -n "${driver_iso}" ] && [ -z "${fixed_iso}" ]; then |   if [ -n "${driver_iso}" ] && [ -z "${fixed_iso}" ]; then | ||||||
|  | @ -1503,9 +1557,11 @@ fi | ||||||
| if [ $VM_UP -eq 0 ]; then | if [ $VM_UP -eq 0 ]; then | ||||||
|     vm_boot |     vm_boot | ||||||
|     start_viewer |     start_viewer | ||||||
|  |     monitor_send_cmd "${MONITOR_CMD}" | ||||||
| else | else | ||||||
|     parse_ports_from_file |     parse_ports_from_file | ||||||
|     start_viewer |     start_viewer | ||||||
|  |     monitor_send_cmd "${MONITOR_CMD}" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| # vim:tabstop=2:shiftwidth=2:expandtab | # vim:tabstop=2:shiftwidth=2:expandtab | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue