o
    p§bªÜ  ã                   @   s.  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ d dlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ e,dƒ\Z-Z.Z/Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9Z:Z;Z<Z=G dd„ deƒZ>dS )é    N)ÚGtk)ÚDeviceChannelÚDeviceConsoleÚDeviceControllerÚ
DeviceDiskÚDeviceHostdevÚDeviceInputÚDeviceInterfaceÚDevicePanicÚDeviceParallelÚDeviceRedirdevÚ	DeviceRngÚDeviceSerialÚDeviceSmartcardÚDeviceSoundÚDeviceVideoÚDeviceVsockÚDeviceWatchdog)Úlogé   )Úuiutil)ÚvmmAsyncJob)ÚvmmGObjectUI)ÚvmmAddStorage)ÚvmmFSDetails)ÚvmmGraphicsDetails)ÚvmmNetworkList)ÚvmmTPMDetails)ÚvmmVsockDetails)ÚvmmStorageBrowser)ÚvmmXMLEditoré   c                   @   s†  e Zd Zdd„ Zdd„ Zd¿dd„Zdd	„ Zd
d„ Zdd„ Ze		d¿dd„ƒZ
e	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	d d!„ ƒZe	d"d#„ ƒZe	d$d%„ ƒZe	d&d'„ ƒZe	d(d)„ ƒZe	d*d+„ ƒZe	d,d-„ ƒZe	d.d/„ ƒZe	d0d1„ ƒZe	d2d3„ ƒZe	d4d5„ ƒZe	d6d7„ ƒZd8d9„ Ze	d:d;„ ƒZ e	d<d=„ ƒZ!e	d>d?„ ƒZ"e	d@dA„ ƒZ#dBdC„ Z$e	dDdE„ ƒZ%dFdG„ Z&dHdI„ Z'dJdK„ Z(e	dLdM„ ƒZ)dNdO„ Z*dPdQ„ Z+dRdS„ Z,e	dTdU„ ƒZ-e	dVdW„ ƒZ.e	dXdY„ ƒZ/dZd[„ Z0d\d]„ Z1d^d_„ Z2e	d`da„ ƒZ3dbdc„ Z4ddde„ Z5dfdg„ Z6dÀdhdi„Z7djdk„ Z8dldm„ Z9dndo„ Z:dpdq„ Z;drds„ Z<dtdu„ Z=dvdw„ Z>dÀdxdy„Z?dzd{„ Z@d|d}„ ZAd~d„ ZBd€d„ ZCd‚dƒ„ ZDd„d…„ ZEd†d‡„ ZFdˆd‰„ ZGdÀdŠd‹„ZHdŒd„ ZIdŽd„ ZJdd‘„ ZKd’d“„ ZLd”d•„ ZMd–d—„ ZNd˜d™„ ZOdšd›„ ZPdœd„ ZQdždŸ„ ZRd d¡„ ZSd¢d£„ ZTd¤d¥„ ZUd¦d§„ ZVd¨d©„ ZWdªd«„ ZXd¬d­„ ZYd®d¯„ ZZd°d±„ Z[d²d³„ Z\d´dµ„ Z]d¶d·„ Z^d¸d¹„ Z_dºd»„ Z`dÁd½d¾„ZadS )ÂÚvmmAddHardwarec                 C   sØ  t  | dd¡ || _|j| _d | _d | _d | _t| j| j| j	ƒ| _
|  d¡ | j
j¡ t| j| j| j	ƒ| _|  d¡ | jj¡ t| j| j| j	ƒ| _|  d¡ | jj¡ |  d¡ | jj¡ t| j| j| j	ƒ| _|  d¡ | jj¡ |  d¡ | jj¡ | j d	| j¡ t| j| j| j	ƒ| _|  d
¡ | jj¡ t| j| j| j	ƒ| _|  d¡ | jj¡ t| j| j	|  d¡|  d¡ƒ| _| j d| j¡ | j | j | j | j!| j"| j#| j$| j%| j&| j'| j(| j)| j*dœ¡ |  +¡  |  ,¡  d S )Nzaddhardware.uizvmm-add-hardwarezgraphics-alignzfs-boxznetwork-source-label-alignznetwork-source-ui-alignzstorage-alignzstorage-advanced-alignzbrowse-clickedzvsock-alignz	tpm-alignzcreate-pages-alignúcreate-pageszxml-requested)Úon_create_cancel_clickedÚon_vmm_create_delete_eventÚon_create_finish_clickedÚon_hw_list_changedÚon_storage_devtype_changedÚon_storage_bustype_changedÚon_mac_address_clickedÚon_char_device_type_changedÚon_char_target_name_changedÚon_char_auto_socket_toggledÚon_usbredir_type_changedÚon_controller_type_changed)-r   Ú__init__ÚvmÚconnÚ_storagebrowserÚ_remove_usb_controllerÚ_selected_modelr   ÚbuilderÚtopwinÚ_gfxdetailsÚwidgetÚaddÚtop_boxr   Ú
_fsdetailsr   Ú_netlistÚ	top_labelr   Ú
addstorageÚadvanced_top_boxÚconnectÚ_browse_storage_cbr   Ú_vsockdetailsr   Ú_tpmdetailsr    Ú
_xmleditorÚ_xmleditor_xml_requested_cbÚconnect_signalsÚcloseÚ_finishÚ_hw_selected_cbÚ_change_storage_devtypeÚ_storage_bus_changed_cbÚ_change_macaddr_useÚ_change_char_device_typeÚ_change_char_target_nameÚ_change_char_auto_socketÚ_change_usbredir_typeÚ_change_controller_typeÚbind_escape_key_closeÚ_set_initial_state)Úselfr1   © rV   ú2/usr/share/virt-manager/virtManager/addhardware.pyr0   3   s`   ÿ
ÿ
þÿïzvmmAddHardware.__init__c                 C   s>   t  d¡ |  ¡  | j |¡ | j ¡  | jjdddd d S )NzShowing addhwT)ÚpollnetÚpollpoolÚpollnodedev)r   ÚdebugÚ_reset_stater7   Úset_transient_forÚpresentr2   Úschedule_priority_tick)rU   ÚparentrV   rV   rW   Úshowr   s   


þzvmmAddHardware.showNc                 C   s0   |   ¡ rt d¡ | j ¡  | jr| j ¡  dS )NzClosing addhwr   )Ú
is_visibler   r[   r7   Úhider3   rH   )rU   Úignore1Úignore2rV   rV   rW   rH   {   s   


zvmmAddHardware.closec                 C   s–   d | _ d | _| jr| j ¡  d | _| j ¡  d | _| j ¡  d | _| j ¡  d | _| j ¡  d | _| j ¡  d | _| j	 ¡  d | _	| j
 ¡  d | _
d S ©N)r1   r2   r3   Úcleanupr8   r<   r=   r?   rC   rD   rE   ©rU   rV   rV   rW   Ú_cleanup„   s&   








zvmmAddHardware._cleanupc           
   	      s†  |   d¡ d¡ |   d¡ d¡ t tdƒ¡}| d¡ | d¡ t ¡ }| dtj	j
¡ t ¡ }| dd¡ | |d¡ | |d	¡ | |d
d¡ | |dd¡ | |dd¡ |   d¡ |¡ |  | j|   d¡¡ |  ¡  |  | j|   d¡¡ |  ¡  |  | j|   d¡¡ |  ¡  |  | j|   d¡¡ t |   d¡g ¡ |  ¡  |  ¡  |  | j|   d¡¡ |  | j|   d¡¡ |  | j|   d¡¡ |  ¡  |  ¡  t |   d¡g ¡ |   ¡  | j! "¡  }|på| j!j# $¡ }d }|sîtdƒ}t %t&t&t't(t&t&¡‰ |   d¡ )ˆ ¡ dJ‡ fdd„	}|tdƒdt*||r|pd ƒ |tdƒd t+d	d ƒ |td!ƒd"t,d	d ƒ |td#ƒd$t-| j .¡ td%ƒƒ |td&ƒd't/d	d ƒ |td(ƒd)t0| j .¡ td%ƒƒ |td*ƒd+t1| j .¡ td%ƒd,ƒ |td-ƒd+t1| j .¡ td%ƒd.ƒ |td/ƒd+t1d	d d0ƒ |td1ƒd+t1| j .¡ td%ƒd2ƒ |td3ƒd4t2| j!j# 3¡ td5ƒd6ƒ | j!j# 3¡ }td5ƒ}	| j 4¡ rµd}td7ƒ}	|td8ƒd t2||	d9ƒ |td:ƒd t2| j!j# 3¡ td5ƒd;ƒ |td<ƒd't5d	td=ƒƒ |td>ƒd t6| j .¡ td%ƒƒ |td?ƒd@t7d	d ƒ |tdAƒd+t8d	d ƒ |tdBƒd4t9d	d ƒ |tdCƒdDt:d	d ƒ |tdEƒdFt;d	d ƒ |tdGƒdFt<t(t= >| j ?¡ ¡ƒtdHƒƒ |tdIƒd"t@| j .¡ tdHƒƒ d S )KNr#   Fú	top-pagesÚHardwareé   é¥   ú
stock-sizeÚxpadTú	icon-namer   Útextr   Ú	sensitiveé   úhw-listústorage-bustypeú	net-modelúsound-modelúvideo-modelúchar-device-typeúwatchdog-modelúwatchdog-actionúsmartcard-modeúcontroller-modelz/Connection does not support storage management.c                    s   ˆ   | |||||g¡ d S rf   )Úappend)ÚnameÚiconÚpagerr   ÚerrortxtÚdevtype©ÚmodelrV   rW   Úadd_hw_optionÕ   s   z8vmmAddHardware._set_initial_state.<locals>.add_hw_optionÚStorageúdrive-harddiskÚ
ControllerÚ
device_pciÚNetworkznetwork-idleÚInputzinput-mousez"Not supported for this guest type.ÚGraphicszvideo-displayÚSoundz
audio-cardÚSerialÚdevice_serialÚserialÚParallelÚparallelÚConsoleÚconsoleÚChannelÚchannelzUSB Host DeviceÚ
device_usbz3Connection does not support host device enumerationÚusbzNot supported for containerszPCI Host DeviceÚpcizMDEV Host DeviceÚmdevÚVideoz/Libvirt version does not support video devices.ÚWatchdogÚ
FilesystemÚfolderÚ	SmartcardúUSB RedirectionÚTPMÚ
device_cpuÚRNGz
system-runúPanic Notifierz;Not supported for this hypervisor/libvirt/arch combination.zVirtIO VSOCKrf   )Ar9   Úset_show_tabsr   ÚTreeViewColumnÚ_Úset_spacingÚset_min_widthÚCellRendererPixbufÚset_propertyÚIconSizeÚBUTTONÚCellRendererTextÚ
pack_startÚadd_attributeÚappend_columnÚbuild_disk_bus_combor1   Ú_build_disk_device_comboÚbuild_network_model_comboÚ_build_input_comboÚbuild_sound_comboÚ_build_hostdev_treeviewÚbuild_video_combor   Úbuild_simple_comboÚ_build_char_target_type_comboÚ_build_char_target_name_comboÚbuild_watchdogmodel_comboÚbuild_watchdogaction_comboÚbuild_smartcard_mode_comboÚ_build_redir_type_comboÚ_build_panic_model_comboÚ_build_controller_type_combor2   Ú	is_remoteÚsupportÚconn_storageÚ	ListStoreÚstrÚintÚboolÚ	set_modelÚ	PAGE_DISKÚPAGE_CONTROLLERÚPAGE_NETWORKÚ
PAGE_INPUTÚis_hvmÚPAGE_GRAPHICSÚ
PAGE_SOUNDÚ	PAGE_CHARÚPAGE_HOSTDEVÚconn_nodedevÚis_containerÚ
PAGE_VIDEOÚPAGE_WATCHDOGÚPAGE_FILESYSTEMÚPAGE_SMARTCARDÚPAGE_USBREDIRÚPAGE_TPMÚPAGE_RNGÚ
PAGE_PANICr
   Ú
get_modelsÚ
get_xmlobjÚ
PAGE_VSOCK)
rU   Úhw_colr€   rq   Úis_localÚhave_storageÚstorage_tooltipr†   Únodedev_enabledÚnodedev_errstrrV   r„   rW   rT       sê   

ÿÿÿþýýÿý
ýÿ
ýÿþÿÿÿþþz!vmmAddHardware._set_initial_statec                 C   sB  t |  d¡ ¡ ƒD ]}|  d¡ |¡}| ¡  q	|  d¡ |  d¡ d¡ |  d¡ d¡ | j 	¡  t
 | j ¡ ¡}|  d¡ t|ƒ¡ |  d¡ |¡ |  ¡  | j 	¡  |  d¡}|  | j|¡ |  d¡ d	¡ |  d
¡ d	¡ |  d¡ d¡ d}| jj ¡ rƒd}|  d¡ |¡ | j 	¡  | j 	¡  | j 	¡  | j 	¡  d S )Nr#   r   ústorage-devtypeÚchangedúmac-addressúcreate-mac-addressrv   ú	char-pathÚ úchar-channelúchar-auto-socketTz/dev/randomz/dev/urandomú
rng-device)Úranger9   Úget_n_pagesÚget_nth_pagerc   Ú_set_hw_selectionÚ
set_activeÚemitr?   Úreset_stater	   Úgenerate_macr2   Úget_backendrÉ   Úset_textrM   r=   Úpopulate_network_model_combor1   rÄ   Úconn_rng_urandomr<   r8   rC   rD   )rU   r   r9   ÚnewmacÚnetmodelÚdefault_rngrV   rV   rW   r\     s2   







zvmmAddHardware._reset_statec              
   C   sv  |pi }z|r| d|ddœ|¤Ž n| di |¤Ž W n t y8 } z| tdƒt|ƒ ¡ W Y d}~dS d}~ww | ¡ s?dS d}d}z|rS| d|ddœ|¤Ž d}n|r_d}|jdi |¤Ž W n' t y‡ } zd}t dt|ƒ¡ t|ƒd t	 
¡ ¡f}W Y d}~nd}~ww |rŽ|sŽdS tdƒ}	|r˜tjjp›tjj}
d}|r®||d	 d
 |d  d 7 }|j|	|tjj|
d dS )z¢
        UI helper that handles the logic and reports errors for the
        requested VM define and hotplug changes

        Used here and in details.py
        F)ÚdevobjÚ
do_hotplugz#Error changing VM configuration: %sNTzHotplug failed: %srì   z=These changes will take effect after the next guest shutdown.r   ú

r   Ú
)ÚdetailsÚbuttonsÚdialog_typerV   )Ú	ExceptionÚshow_errr¨   rÇ   Ú	is_activeÚhotplugr   r[   ÚjoinÚ	tracebackÚ
format_excr   ÚMessageTypeÚWARNINGÚINFOÚButtonsTypeÚOK)Údefine_funcÚdefine_argsr1   Úerrrÿ   Úhotplug_argsÚeÚhotplug_errÚdid_hotplugÚmsgÚdtypeÚhotplug_msgrV   rV   rW   Úchange_config_helperF  sh   	€
ÿ€ý€"€ýÿÿÿÿýz#vmmAddHardware.change_config_helperc                 C   s@   | j dkr	tjgS tjtjtjg}| j dkrtjtjg| }|S )Nr•   r—   )ÚXML_NAMEr   ÚTYPE_PTYÚ	TYPE_FILEÚ	TYPE_UNIXÚTYPE_SPICEVMCÚTYPE_SPICEPORT)Ú
char_classÚretrV   rV   rW   Úchar_recommended_typesˆ  s   
þ
ÿÿz%vmmAddHardware.char_recommended_typesc                 C   s(   t jdt jdt jdt jdi}| | d ¡S )NÚspicezqemu-gaÚ
libguestfszspice-webdav)r   ÚCHANNEL_NAME_SPICEÚCHANNEL_NAME_QEMUGAÚCHANNEL_NAME_LIBGUESTFSÚCHANNEL_NAME_SPICE_WEBDAVÚget©ÚvalÚlabelsrV   rV   rW   Úchar_pretty_channel_name•  s   üz'vmmAddHardware.char_pretty_channel_namec                 C   sV   t jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt jtdƒi}| 	| | ¡S )zM
        Return a human readable description of the passed char type
        z
Pseudo TTYzOutput to a filezTCP net consolezUDP net consolezUNIX socketzSpice agentz
Spice port)
r   r  r¨   r  ÚTYPE_TCPÚTYPE_UDPr   r!  r"  r,  r-  rV   rV   rW   Úchar_pretty_typeŸ  s   






ù	zvmmAddHardware.char_pretty_typec                   C   s   t jt jt jt jgS rf   )r   Ú	TYPE_SCSIÚTYPE_USBÚTYPE_VIRTIOSERIALÚ	TYPE_CCIDrV   rV   rV   rW   Úcontroller_recommended_types¯  s
   ýz+vmmAddHardware.controller_recommended_typesc                 C   sj   t jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt j	tdƒt j
td	ƒi	}| | | ¡S )
NÚIDEÚFloppyÚSCSIÚSATAzVirtIO SerialÚUSBÚPCIÚCCIDÚxenbus)r   ÚTYPE_IDEr¨   ÚTYPE_FDCr4  Ú	TYPE_SATAr6  r5  ÚTYPE_PCIr7  ÚTYPE_XENBUSr,  r-  rV   rV   rW   Úcontroller_pretty_type¶  s   








÷z%vmmAddHardware.controller_pretty_typec                 C   sH   | j tjkr| jdkrtdƒS | j tjkr| jdkrtdƒS t | j ¡S )Núvirtio-scsiúVirtIO SCSIz	pcie-rootÚPCIe)Útyper   r4  r…   r¨   rD  r"   rF  )ÚdevrV   rV   rW   Úcontroller_pretty_descÅ  s   

z%vmmAddHardware.controller_pretty_descc                 C   s”   g }| j  ¡ s| j ¡ r9| j  ¡ s| d¡ | d¡ | d¡ | d¡ | d¡ | jdv r9| d¡ | d¡ | j ¡ sC| j ¡ rH| d	¡ |S )
NÚideÚsataÚfdcÚscsir™   )ÚqemuÚkvmÚtestÚsdÚvirtioÚxen)ÚosrÏ   r2   Úis_testÚis_q35r~   rJ  Úis_xen©Úguestr$  rV   rV   rW   Údisk_old_recommended_busesÏ  s   









z)vmmAddHardware.disk_old_recommended_busesc                    s\   d|j j ¡ v r|j j d¡ ¡ }nt | ¡}g d¢dgg d¢dgdœ‰ ‡ ‡fdd„|D ƒS )	NÚbus©rM  rN  rP  rT  r™   rU  rV  rO  )rM  rN  rP  r™   rP  )ÚdiskÚfloppyÚcdromÚlunc                    s    g | ]}|ˆ   ˆg ¡v r|‘qS rV   )r,  )Ú.0r^  ©Úbus_maprƒ   rV   rW   Ú
<listcomp>ñ  s     z9vmmAddHardware.disk_recommended_buses.<locals>.<listcomp>)Údevicesr`  Ú
enum_namesÚget_enumÚ
get_valuesr"   r]  )r\  Údomcapsrƒ   ÚbusesrV   re  rW   Údisk_recommended_busesã  s   
üz%vmmAddHardware.disk_recommended_busesc                 C   s<   t dƒt dƒt dƒt dƒt dƒt dƒt dƒdœ}| | | ¡S )	Nr9  r<  r;  ÚSDr=  ÚVirtIOÚXenr_  )r¨   r,  )r^  Úbus_mappingsrV   rV   rW   Údisk_pretty_busó  s   ù	zvmmAddHardware.disk_pretty_busc              	   C   s8   t jtdƒt jtdƒt jtdƒt jtdƒi}| | | ¡S )NÚISAÚpSerieszHyper-VÚs390)r
   Ú	MODEL_ISAr¨   ÚMODEL_PSERIESÚMODEL_HYPERVÚ
MODEL_S390r,  r-  rV   rV   rW   Úpanic_pretty_model   s   



üz!vmmAddHardware.panic_pretty_modelc                 C   s.   t jtdƒt jtdƒt jtdƒi}| | | ¡S )NÚRandomzEntropy Gathering DaemonzBuiltin RNG)r   ÚTYPE_RANDOMr¨   ÚTYPE_EGDÚTYPE_BUILTINr,  r-  rV   rV   rW   Úrng_pretty_type
  s
   


ýzvmmAddHardware.rng_pretty_typec                 C   s   g d¢S )N)Úich6Úich9Úac97rV   )Ú_guestrV   rV   rW   Úsound_recommended_models  s   z'vmmAddHardware.sound_recommended_modelsc                 C   s    |   ¡ }| dv rd|   ¡  }|S )N)r  r‚  zHDA (%s))Úupper)r…   r$  rV   rV   rW   Úsound_pretty_model  s   z!vmmAddHardware.sound_pretty_modelc                 C   sL   t jtdƒt jtdƒt jtdƒt jtdƒt jtdƒt jtdƒi}| | | ¡S )NzForcefully reset the guestzGracefully shutdown the guestzForcefully power off the guestzPause the guestz	No actionzDump guest memory core)	r   ÚACTION_RESETr¨   ÚACTION_SHUTDOWNÚACTION_POWEROFFÚACTION_PAUSEÚACTION_NONEÚACTION_DUMPr,  r-  rV   rV   rW   Úwatchdog_pretty_action  s   





úz%vmmAddHardware.watchdog_pretty_actionc              	   C   s˜   | t jkr|t jkrtdƒS t jtdƒt jtdƒt jtdƒi}t jtdƒt jtdƒt jtdƒt jtdƒi}| 	||¡}| 	| | ¡}td	ƒ||d
œ }|S )NzEvTouch USB Graphics TabletÚKeyboardÚMouseÚTabletzPS/2r=  rp  rq  z%(input_bus)s %(input_type)s)Ú	input_busÚ
input_type)
r   ÚTYPE_TABLETÚBUS_USBr¨   ÚTYPE_KEYBOARDÚ
TYPE_MOUSEÚBUS_PS2Ú
BUS_VIRTIOÚBUS_XENr,  )Útypr^  Ú
typ_labelsÚ
bus_labelsÚ	bus_labelÚ	typ_labelr$  rV   rV   rW   Úinput_pretty_name*  s"   


ý



üÿz vmmAddHardware.input_pretty_namec                 C   sz   | j  ¡ sg S g }| jdv r| d¡ | j  ¡ r-| j  ¡ r#| d¡ n
| d¡ | d¡ | jdv r7| d¡ | ¡  |S )N)rR  rQ  ÚvzrS  rU  Úe1000eÚrtl8139Úe1000)rV  rS  Únetfront)rW  rÏ   rJ  r~   Úis_x86rY  Úsortr[  rV   rV   rW   Úinterface_recommended_modelsC  s   








z+vmmAddHardware.interface_recommended_modelsc                 C   s$   | dkrdS | dkrdS | o|   ¡ S )NÚtcpÚTCPÚspicevmcÚSpiceVMC)Ú
capitalize)r›  rV   rV   rW   Úredirdev_pretty_typeW  s
   z#vmmAddHardware.redirdev_pretty_typec                 C   s2   | j  ¡ r	ddgS | j  ¡ s| j  ¡ rg d¢S g S )NrV  Úvga)r¯  ÚbochsÚqxlrU  ÚramfbÚnone)r2   rZ  Úis_qemurX  )r\  rV   rV   rW   Úvideo_recommended_models_  s
   
z'vmmAddHardware.video_recommended_modelsc                 C   s   | dv r|   ¡ S |  ¡ S )N)r±  Úvmvgar¯  )r†  r­  r„   rV   rV   rW   Úvideo_pretty_modelg  s   z!vmmAddHardware.video_pretty_modelc                 C   sØ   dd„ }d	dd„}| j  ¡ }| jr$| jr$|d|| jƒ|| jƒf 7 }|S | jr:| jr:|d|| jƒ|| jƒf 7 }|S | jr^| jr^| jr^| jr^|d|| jƒ|| jƒ|| jƒ|| jƒf 7 }|S | j	rj|dt
| j	ƒ 7 }|S )
Nc                 S   s   |   d¡r| dd … } | S )NÚ0xé   )Ú
startswith)r.  rV   rV   rW   Údehexo  s   
z1vmmAddHardware.hostdev_pretty_name.<locals>.dehexú%.3dc                 S   s4   zt | ƒ W n ty   t| ƒ Y S w |t | ƒ S rf   )rÈ   r  rÇ   )r.  ÚfmtrV   rV   rW   Úsafeintt  s   ÿz3vmmAddHardware.hostdev_pretty_name.<locals>.safeintz %s:%sz %s:%s:%s.%sz %s)r¼  )rJ  r†  ÚvendorÚproductr^  ÚdeviceÚslotÚfunctionÚdomainÚuuidrÇ   )Úhostdevr»  r¾  ÚlabelrV   rV   rW   Úhostdev_pretty_namem  s.   

ô÷ÿÿÿÿýz"vmmAddHardware.hostdev_pretty_namec                 C   sü   |   d¡}t ttt¡}| |¡ t ¡ }| dtjj¡ | 	|d¡ | 
|dd¡ t ¡ }| dd¡ | 	|d¡ | 
|d	d
¡ | tjdtdƒg¡ | tjdtdƒg¡ | tjdtdƒg¡ | j ¡ sl| j ¡ rw| tjdtdƒg¡ | d¡ d S )Nrç   rn   Frp   r   ro   rl   Trq   r¹  rˆ   zDisk devicezmedia-opticalzCDROM devicezmedia-floppyzFloppy devicezLUN Passthroughr   )r9   r   rÆ   rÇ   rÊ   r«   r¬   r­   r®   r°   r±   r¯   r~   r   ÚDEVICE_DISKr¨   ÚDEVICE_CDROMÚDEVICE_FLOPPYr2   r´  rX  Ú
DEVICE_LUNrô   )rU   Útarget_listÚtarget_modelr€   rq   rV   rV   rW   r´   “  s2   

ÿÿÿÿz'vmmAddHardware._build_disk_device_comboc                 C   s   t  |g ¡ d S rf   )r   rº   )Ú_vmÚcomborV   rV   rW   r³   «  s   z#vmmAddHardware.build_disk_bus_comboc                 C   sB   |   ¡ }t | j||¡}| ¡  |D ]}| |t |¡g¡ qd S rf   )Úget_domain_capabilitiesr"   rn  ÚxmlobjÚclearr~   rs  )r1   rƒ   r…   rl  rm  r^  rV   rV   rW   Úpopulate_disk_bus_combo¯  s   ÿz&vmmAddHardware.populate_disk_bus_comboc                 C   sZ   |  ¡ }| ¡  | d tdƒg¡ t | j¡D ]	}| ||g¡ qt |t	 
| j¡¡ d S )NúHypervisor default)Ú	get_modelrÓ  r~   r¨   r"   r¨  rÒ  r   Úset_list_selectionr	   Údefault_model)r1   rÐ  r…   rý   rV   rV   rW   rú   ¹  s   ÿz+vmmAddHardware.populate_network_model_comboc                 C   s   t  |g ¡ t | |¡ d S rf   )r   rº   r"   rú   )r1   rÐ  rV   rV   rW   rµ   Æ  s   z(vmmAddHardware.build_network_model_comboc                 C   sZ   t jt jft jt jft jt jft jt jft jt jfg}dd„ |D ƒ}t |  d¡|¡ d S )Nc                 S   s$   g | ]\}}||ft  ||¡f‘qS rV   )r"   r   )rd  ÚtÚbrV   rV   rW   rg  Õ  s    ÿz5vmmAddHardware._build_input_combo.<locals>.<listcomp>ú
input-type)	r   r”  r•  r—  r–  r™  r   rº   r9   )rU   rh  ÚcvalsrV   rV   rW   r¶   Ì  s   




ûÿz!vmmAddHardware._build_input_comboc                 C   sJ   g }t  | j¡D ]}| |t  |¡g¡ qt | j¡}tj|||d d S ©N©Údefault_value)	r"   r…  rÒ  r~   r‡  r   rØ  r   rº   ©r1   rÐ  ÚvaluesÚmÚdefaultrV   rV   rW   r·   Ú  s
   z vmmAddHardware.build_sound_comboc                 C   s„   |   d¡}t tttt¡}| |¡ t ¡ }t ¡ }| 	|d¡ | 
|dd¡ | 
|dd¡ | d¡ | dtjj¡ | |¡ d S )Núhost-deviceTrq   r   rr   r¹  rs   )r9   r   rÆ   ÚobjectrÇ   rÉ   rÊ   r§   r¯   r°   r±   Úset_tooltip_columnÚset_sort_column_idÚSortTypeÚ	ASCENDINGr²   )rU   Úhost_devÚhost_dev_modelÚhost_colrq   rV   rV   rW   r¸   ä  s   


z&vmmAddHardware._build_hostdev_treeviewc                 C   s4   |  ¡ \}}|r|| d pd}|  d¡ |¡ d S )Nr¹  Fúcreate-finish)Úget_selectedr9   Úset_sensitive)rU   Ú	selectionr…   Útreeiterrr   rV   rV   rW   Ú_hostdev_row_selected_cbó  s   z'vmmAddHardware._hostdev_row_selected_cbc                 C   sT  |   d¡}| ¡ }| ¡  | j |¡}| j d¡}|D ]e}|j ¡ r#q|j ¡ r)q| ¡ }|dkrF|D ]}|jj	|jj
krE|d| ¡  7 }q3|dkrht|ƒdkrh| j ¡ D ]}	|jj
|	jj	krgd|	 ¡ |f }qUd }
| ¡ }|svtdƒ| }
| |j|||
g¡ qt|ƒd	kr’| d td
ƒdd g¡ t |d	¡ | ¡  d| j¡ | ¡  d¡ d S )Nrä  Únetrš   ú (%s)r›   é)   z%s %szl%s is not active in the host system.
Please start the mdev in the host system before adding it to the guest.r   zNo Devices AvailableFrè   )r9   rÖ  rÓ  r2   Úfilter_nodedevsrÒ  Úis_usb_linux_root_hubÚis_pci_bridgeÚpretty_namer   r`   ÚlenÚlist_nodedevsr  r¨   r~   r   Úset_list_selection_by_numberÚget_selectionrA   rò  rõ   )rU   rƒ   Údevlistr…   ÚdevsÚnetdevsrK  Ú
prettynameÚsubdevÚ	parentdevÚtooltiprr   rV   rV   rW   Ú_populate_hostdev_modelù  sJ   


€ÿ€þÿz&vmmAddHardware._populate_hostdev_modelc                 C   s`   g }t  | j¡D ]}| |t  |¡g¡ q|s | d tdƒg¡ t | j¡}tj	|||d d S )NrÕ  rÞ  )
r"   rµ  rÒ  r~   r·  r¨   r   rØ  r   rº   rà  rV   rV   rW   r¹   &  s   z vmmAddHardware.build_video_comboc                 C   sF   g }| j  ¡ r| ddg¡ n	| d tdƒg¡ t |  d¡|¡ d S )NrU  rp  rÕ  úchar-target-type)r2   r´  r~   r¨   r   rº   r9   ©rU   rá  rV   rV   rW   r»   1  s
   
z,vmmAddHardware._build_char_target_type_comboc                 C   s4   g }t jD ]	}| ||g¡ qt |  d¡|¡ d S )Núchar-target-name)r   ÚCHANNEL_NAMESr~   r   rº   r9   )rU   rá  ÚnrV   rV   rW   r¼   9  s   
z,vmmAddHardware._build_char_target_name_comboc                 C   s`   |   ¡ }|  d¡ ¡ }| ¡  t |¡D ]}| |t |¡d|  g¡ qt 	|  d¡d¡ d S )Nry   rô  Úpty)
Ú_get_char_classr9   rÖ  rÓ  r"   r%  r~   r3  r   r×  )rU   r#  r…   rÙ  rV   rV   rW   Ú _populate_char_device_type_combo?  s   z/vmmAddHardware._populate_char_device_type_comboc                 C   s8   g }t jD ]}| || ¡ g¡ qtj||t jd d S rÝ  )r   ÚMODELSr~   r†  r   rº   ÚMODEL_I6300©rÏ  rÐ  rá  râ  rV   rV   rW   r½   I  s   
z(vmmAddHardware.build_watchdogmodel_comboc                 C   s:   g }t jD ]}| |t |¡g¡ qtj||t jd d S rÝ  )r   ÚACTIONSr~   r"   rŽ  r   rº   rˆ  r  rV   rV   rW   r¾   P  s   
z)vmmAddHardware.build_watchdogaction_comboc                 C   s(   dt dƒgdt dƒgg}t ||¡ d S )NÚpassthroughÚPassthroughÚhostÚHost)r¨   r   rº   )rÏ  rÐ  rá  rV   rV   rW   r¿   X  s   

þz)vmmAddHardware.build_smartcard_mode_comboc                 C   s$   dt dƒgg}t |  d¡|¡ d S )Nr«  zSpice channelúusbredir-list)r¨   r   rº   r9   r  rV   rV   rW   rÀ   a  s   z&vmmAddHardware._build_redir_type_comboc                 C   sX   g }t  | j ¡ ¡D ]}| |t |¡g¡ q
t  | j ¡ ¡}tj	|  
d¡||d d S )Núpanic-modelrÞ  )r
   rÞ   r1   rß   r~   r"   r{  Úget_default_modelr   rº   r9   )rU   rá  râ  rã  rV   rV   rW   rÁ   f  s
   z'vmmAddHardware._build_panic_model_comboc                 C   sB   g }t  ¡ D ]}| |t  |¡g¡ qtj|  d¡|tjd d S )Núcontroller-typerÞ  )	r"   r8  r~   rF  r   rº   r9   r   r4  )rU   rá  rÙ  rV   rV   rW   rÂ   o  s   
ÿz+vmmAddHardware._build_controller_type_comboc                 C   sž   |   ¡ }| ¡  g }|tjkr"| dtdƒg¡ | dtdƒg¡ n|tjkr0| dtdƒg¡ | d tdƒg¡ |D ]}| |¡ q;t | |d d ¡ d S )	NÚusb3zUSB 3z
ich9-ehci1zUSB 2rG  rH  rÕ  r   )	rÖ  rÓ  r   r5  r~   r¨   r4  r   r×  )rÐ  Úcontroller_typer…   ÚrowsÚrowrV   rV   rW   Úpopulate_controller_model_combow  s   

z.vmmAddHardware.populate_controller_model_comboc                 C   s@   |   ¡ }d}|r|d }|dkrtS |dkrtS |dkrtS tS )Nr‘   é   r“   r—   r•   )Ú_get_hw_selectionr   r   r   r   )rU   r  rÇ  rV   rV   rW   r  Ž  s   zvmmAddHardware._get_char_classc                 C   s   t  |  d¡|¡ d S ©Nrt   )r   rü  r9   )rU   r   rV   rV   rW   ró     s   z vmmAddHardware._set_hw_selectionc                 C   s   t  |  d¡¡S r!  )r   Úget_list_selected_rowr9   rh   rV   rV   rW   r      s   z vmmAddHardware._get_hw_selectionc                 C   s8   |   d¡ d¡ |   d¡ |pd¡ |   d¡ d¡ d S )Nrj   r   zerror-labelzHardware selection error.rí  F)r9   Úset_current_pagerù   rï  )rU   r  rV   rV   rW   Ú_set_error_page£  s   zvmmAddHardware._set_error_pagec                 C   s   |   d¡ d¡ | j ¡  |  ¡ }|r|d s$|  |r|d p d ¡ d S |d }|tkr@|  ¡  |   d¡ d¡ |   d¡ d¡ |t	krc|  ¡ }d	}|rT|d
 dkrTd}|r^|d
 dkr^d}|  
|¡ |tkro|   d¡ d¡ |  |¡ |   d¡ |¡ ¡  |   d¡ |¡ |   d¡ d¡ d S )Nrí  Trs   é   r¹  ry   rè   r  Ú
usb_devicer  rš   r›   r  r#   rj   r   )r9   rï  rE   rö   r   r$  rÒ   r  rõ   rÓ   r  rÌ   Ú_set_page_titlerò   ra   r#  )rU   Úsrcr  r   rƒ   rV   rV   rW   rJ   ­  s2   


zvmmAddHardware._hw_selected_cbc                 C   sp  |t krtdƒS |tkrtdƒS |tkrtdƒS |tkr tdƒS |tkr(tdƒS |tkr0tdƒS |tkr8tdƒS |tkr@tdƒS |t	krHtd	ƒS |t
krPtd
ƒS |tkrXtdƒS |tkr`tdƒS |tkrhtdƒS |tkrptdƒS |tkrxtdƒS |tkrŽ|  ¡ | j ¡ ƒ}tdƒ|j ¡  S |tkr²|  ¡ }|r¢|d dkr¢tdƒS |r®|d dkr®tdƒS tdƒS td| ƒ‚)Nr‡   r‰   r‹   rŒ   r   rŽ   zVideo DevicezWatchdog DevicezFilesystem Passthroughr    r¡   r¢   zRandom Number Generatorr¥   z
VM Socketsz	%s Devicer  rš   z
PCI Devicer›   zMDEV Devicez
USB DevicezUnknown page %s)rË   r¨   rÌ   rÍ   rÎ   rÐ   rÑ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rà   rÒ   r  r2   rø   ÚDEVICE_TYPEr­  rÓ   r   ÚRuntimeError)rU   r   Údevclassr  rV   rV   rW   Ú_dev_to_titleÓ  sR   zvmmAddHardware._dev_to_titlec                 C   s   |   |¡}|  d¡ |¡ d S )Nzpage-title-label)r,  r9   Ú
set_markup)rU   r   ÚtitlerV   rV   rW   r'     s   
zvmmAddHardware._set_page_titlec                 C   s(   | j dd}| j |r| ¡ pd¡ d S )NF©Úcheck_xmleditorrì   )Ú_build_devicerE   Úset_xmlÚget_xml)rU   r(  rK  rV   rV   rW   rF     s   z*vmmAddHardware._xmleditor_xml_requested_cbc                 C   s~   |   d¡}| ¡ }|  | j||¡ d }| jjjjD ]}|j|kr%|j} nq|r0t	 
||¡ d S t|ƒdkr=| d¡ d S d S )Nru   r   )r9   rÖ  rÔ  r1   rÒ  rh  r`  rÁ  r^  r   r×  rú  rô   )rU   rƒ   r9   r…   Údefault_busÚirV   rV   rW   Ú_refresh_disk_bus  s   

þÿz vmmAddHardware._refresh_disk_busc                 C   sR   t  |  d¡¡}|  |¡ |dv}| j d¡ |¡ |s'| j d¡ d¡ d S d S )Nrç   )rb  ra  zstorage-create-boxzstorage-selectT)r   Úget_list_selectionr9   r6  r?   rï  rô   )rU   Úignorerƒ   Úallow_createrV   rV   rW   rK     s   ÿ
ÿÿz&vmmAddHardware._change_storage_devtypec                 C   s    t  |  d¡¡}| j |¡ d S )Nru   )r   r7  r9   r?   Úset_disk_bus)rU   r(  r^  rV   rV   rW   rL   )  s   ÿz&vmmAddHardware._storage_bus_changed_cbc                 C   s6   |   d¡ ¡ r|   d¡ d¡ d S |   d¡ d¡ d S )Nré   rê   TF)r9   Ú
get_activerï  )rU   r8  rV   rV   rW   rM   .  s   z"vmmAddHardware._change_macaddr_usec                 C   s,   |  ¡ sd S | ¡  }t |  d¡|¡ d S )Núchar-path-label)Úget_visibler;  r   Úset_grid_row_visibler9   )rU   r(  ÚdoshowrV   rV   rW   rP   4  s   
z'vmmAddHardware._change_char_auto_socketc                 C   s‚   |  ¡ sd S | ¡  ¡ }d }|tjkrd}n|tjkr&d}|  d¡ |¡ n|tjks0|tj	kr2d}|r?t
 |  d¡|¡ d S d S )Nr«  Ú	spiceportrí   Úunixry   )r=  Ú	get_childÚget_textr   r(  r+  r9   rù   r)  r*  r   r×  )rU   r(  rq   ÚsettyperV   rV   rW   rO   ;  s"   




ÿÿz'vmmAddHardware._change_char_target_namec           
      C   sä   t  |¡}|d u rd S |  ¡ }|| j ¡ ƒ}||_|jdk}|jdk}|dko(|}|j|j|j	|j
g}|jg}	t  |  d¡||v ¡ t  |  d¡||	v ¡ t  |  d¡|¡ t  |  d¡|¡ t  |  d¡|¡ |  d	¡ d
¡ d S )Nr—   r•   rA  r<  zchar-channel-labelzchar-target-name-labelzchar-target-type-labelzchar-auto-socket-labelrî   Útoggled)r   r7  r  r2   rø   rJ  r)  r  r   ÚTYPE_DEVÚ	TYPE_PIPEr"  r>  r9   rõ   )
rU   r(  rƒ   r#  rK  ÚischanÚisconÚ	show_autoÚsupports_pathÚsupports_channelrV   rV   rW   rN   M  s:   


ÿÿÿ
ÿ
ÿ
ÿz'vmmAddHardware._change_char_device_typec                 C   s   d S rf   rV   )rU   r(  rV   rV   rW   rQ   k  s   z$vmmAddHardware._change_usbredir_typec           	         s  |}ˆ   d¡}‡ fdd„}t ˆ   d¡¡}| d¡ ˆ   d¡}||dƒ ˆ jjjj}|tj	krndd	„ |D ƒ}t
|ƒd
krEˆ   d¡ d¡ n1t
|ƒdkr`|d
 jdkr`|d
 ˆ _ˆ   d¡ d¡ n||dƒ ˆ   d¡ d¡ nˆ   d¡ d¡ ˆ  ||¡ t |t
| ¡ ƒdk¡ d S )Nr}   c                    s.   ˆ j  ¡ }tdƒ| }|  |¡ |  |¡ d S )Nz %s already has a USB controller attached.
Adding more than one USB controller is not supported.
You can change the USB controller type in the VM details screen.)r1   Úget_namer¨   Úset_visibleÚset_tooltip_text)Úmodel_tooltipra   Úvmnamer  rh   rV   rW   Úshow_tooltipr  s   
ý
z<vmmAddHardware._change_controller_type.<locals>.show_tooltipr  Tzcontroller-tooltipFc                 S   s   g | ]
}|j tjkr|‘qS rV   )rJ  r   r5  ©rd  ÚxrV   rV   rW   rg  ƒ  s    ÿz:vmmAddHardware._change_controller_type.<locals>.<listcomp>r   rí  r   r³  )r9   r   r7  rï  r1   rÒ  rh  Ú
controllerr   r5  rú  r…   r4   r  r>  rÖ  )	rU   r(  r8  rÐ  rR  r  rP  ÚcontrollersÚusb_controllersrV   rh   rW   rR   n  s.   
	ÿ





z&vmmAddHardware._change_controller_typec                 C   s    |j dkrd S d }| ¡ r| ¡ r| ¡  ¡ }t d|¡ |j| ¡ d t d¡ |rNz| j 	|¡}|  
|j¡ W d S  tyM   tjd|dd Y d S w d S )Nr`  z%Running build_storage() for device=%s)Úmeterzbuild_storage() completez<Error looking up pool=%s for refresh after storage creation.T)Úexc_info)r)  Úwants_storage_creationÚget_parent_poolr   r   r[   Úbuild_storageÚ	get_meterr2   Úget_pool_by_nameÚidle_addÚrefreshr  )rU   ÚasyncjobrK  ÚpoolnameÚpoolrV   rV   rW   Ú_setup_device™  s(   
ÿ
ÿÿüzvmmAddHardware._setup_devicec              
   C   sV  |  ¡ }t d|¡ | jr+i }| j|d< | j| jj|| j| j| jd d | _d | _d S t	|dd ƒ}|d ur=t d|  ¡ ¡ d}z|d urJ| j 
|¡ | j 
|¡ W n% tyv } zt dt|ƒ¡ t|ƒd t ¡ ¡f}W Y d }~nd }~ww |r™| jjtd	ƒ|d
 d |d  tdƒtjjtjjdd}|s™dS |d ur£| j |¡ | j |¡ dS )NzAdding device:
%sr…   )rÿ   Úvmm_controllerzAdding controller:
%sFz"Device could not be hotplugged: %srì   z)Are you sure you want to add this device?r   r  r   z„This device could not be attached to the running machine. Would you like to make the device available after the next guest shutdown?T)r  Útext2r  r  Úmodal)r3  r   r[   r4   r5   r  r1   Údefine_controllerr  ÚgetattrÚattach_devicer  rÇ   r
  r  r  r  r¨   r   r  r  r  ÚYES_NOÚ
add_device)rU   rK  ÚxmlÚkwargsrU  Ú
attach_errr  ÚresrV   rV   rW   Ú_add_device¯  sT   


þÿ"€þ÷zvmmAddHardware._add_devicec              
   C   s’   d}|s/z|   |¡}W n# ty. } zd}tdƒt|ƒ }d t ¡ ¡}W Y d }~nd }~ww |d ur;| jj||d |  	¡  |sG|  
¡  d S d S )NTzUnable to add device: %srì   )r  )rq  r  r¨   rÇ   r
  r  r  r  r  Úreset_finish_cursorrH   )rU   Úerrorr  rK  Úfailurer  rV   rV   rW   Ú
_finish_cbä  s    €ýÿzvmmAddHardware._finish_cbc              
   C   s¦   | j dd}|s
d S z|  |¡du rW d S W n ty5 } z| j tdƒt|ƒ ¡ W Y d }~d S d }~ww |  ¡  t| j	|g| j
|gtdƒtdƒ| jƒ}| ¡  d S )NTr/  Fz&Error validating device parameters: %szCreating devicezADepending on the device, this may take a few minutes to complete.)r1  Ú_validate_devicer  r  r  r¨   rÇ   Úset_finish_cursorr   rd  ru  r7   Úrun)rU   r8  rK  r  ÚprogWinrV   rV   rW   rI   ö  s,   ÿÿ€ý
ûzvmmAddHardware._finishc                 C   s~   g }t |dd ƒ}|sd S | j ¡ D ]}|jjjD ]}| |¡r&| | ¡ ¡ qq|r;| j	 
tdƒ| tdƒ¡}|s=dS d S d S )NÚvmm_nodedevz/The device is already in use by other guests %sz%Do you really want to use the device?F)ri  r2   Úlist_vmsrÒ  rh  rÆ  Úcompare_to_hostdevr~   rM  r  Úyes_nor¨   )rU   rK  ÚnamesÚnodedevr1   rÆ  rp  rV   rV   rW   Ú_validate_hostdev_collision  s*   
€þÿýúz*vmmAddHardware._validate_hostdev_collisionc                 C   s\   |j dkr| j |¡du rdS |j dkr| j |¡ |j dkr(|  |¡du r(dS | ¡  d S )Nr`  FÚ	interfacerÆ  )r)  r?   Úvalidate_devicer=   r€  Úvalidate)rU   rK  rV   rV   rW   rv  #  s   


zvmmAddHardware._validate_devicec                 C   sr   | j  ¡ }t d|¡ |j}||j|d}|jdkr7| ¡ | ¡ kr/| ¡ r/| 	| ¡ ¡ |S | ¡ r7| 
¡  |S )NzUsing XML from xmleditor:
%s)Úparsexmlr`  )rE   r3  r   r[   Ú	__class__r2   r)  Úget_source_pathÚget_vol_installÚset_vol_installÚset_backend_for_existing_path)rU   Úsrcdevrm  r+  rK  rV   rV   rW   Ú_build_xmleditor_device1  s   

ÿüz&vmmAddHardware._build_xmleditor_devicec              
   C   sv   |   d¡ ¡ }z|  |¡}|r| j ¡ r|  |¡}|W S  ty: } z| j t	dƒt
|ƒ ¡ W Y d }~d S d }~ww )Nr#   zError building device XML: %s)r9   Úget_current_pageÚ_build_device_pagerE   Úis_xml_selectedr‹  r  r  r  r¨   rÇ   )rU   r0  Úpage_numrK  r  rV   rV   rW   r1  A  s   

ÿ€ýzvmmAddHardware._build_devicec                 C   sD  |t kr	|  ¡ }n|tkr|  ¡ }n†|tkr|  ¡ }n}|tkr$|  ¡ }nt|tkr-|  	¡ }nk|t
kr6|  ¡ }nb|tkr?|  ¡ }nY|tkrH|  ¡ }nP|tkrQ|  ¡ }nG|tkrZ|  ¡ }n>|tkrc|  ¡ }n5|tkrl|  ¡ }n,|tkru|  ¡ }n#|tkr~|  ¡ }n|tkr‡|  ¡ }n|tkr|  ¡ }n|t kr˜|  !¡ }| "| j# $¡ ¡ |S rf   )%rË   Ú_build_storagerÌ   Ú_build_controllerrÍ   Ú_build_networkrÎ   Ú_build_inputrÐ   Ú_build_graphicsrÑ   Ú_build_soundrÓ   Ú_build_hostdevrÒ   Ú_build_charrÖ   Ú_build_videor×   Ú_build_watchdogrØ   Ú_build_filesystemrÙ   Ú_build_smartcardrÚ   Ú_build_usbredirrÛ   Ú
_build_tpmrÜ   Ú
_build_rngrÝ   Ú_build_panicrà   Ú_build_vsockÚset_defaultsr1   rß   )rU   r  rK  rV   rV   rW   r  O  sH   















z!vmmAddHardware._build_device_pagec                 C   s@   d |_ | jj ¡ sd S t| j ¡ ƒ}d|_d|_d|_	||_ d S )NrP  rG  r   )
re  r1   rÒ  Úcan_default_virtioscsir   r2   rø   rJ  r…   Úindex)rU   r`  rU  rV   rV   rW   Ú_set_disk_controllerw  s   
z#vmmAddHardware._set_disk_controllerc                 C   sœ   t  |  d¡¡}t  |  d¡¡}| jj| j ¡ | jj|d}g }||_| jjj	j
| jjddj	j
 }|D ]}|j|vrA| |j¡ q4|  |¡ | |¡ |S )Nru   rç   )ÚcollideguestrÁ  T)Úinactive)r   r7  r9   r?   Úbuild_devicer1   rM  rÒ  r^  rh  r`  rß   Útargetr~   r¤  Úgenerate_target)rU   r^  rÁ  r`  ÚusedÚdisksÚdrV   rV   rW   r  ƒ  s*   ÿÿÿ
ÿ
€

zvmmAddHardware._build_storagec                 C   sB   t  |  d¡¡}d }|  d¡ ¡ r|  d¡ ¡ }| j ||¡}|S )Nrv   ré   rê   )r   r7  r9   r;  rC  r=   r§  )rU   r…   ÚmacrK  rV   rV   rW   r’  š  s   zvmmAddHardware._build_networkc                 C   s2   t  |  d¡¡\}}t| j ¡ ƒ}||_||_|S )NrÛ  )r   r7  r9   r   r2   rø   rJ  r^  )rU   r›  r^  rK  rV   rV   rW   r“  £  s
   zvmmAddHardware._build_inputc                 C   ó
   | j  ¡ S rf   )r8   r§  rh   rV   rV   rW   r”  ª  ó   
zvmmAddHardware._build_graphicsc                 C   ó(   t  |  d¡¡}t| j ¡ ƒ}||_|S )Nrw   )r   r7  r9   r   r2   rø   r…   )rU   ÚsmodelrK  rV   rV   rW   r•  ­  ó   zvmmAddHardware._build_soundc                 C   s8   t  |  d¡¡}t| j ¡ ƒ}| |¡ t|d|ƒ |S )Nrä  rz  )r   r7  r9   r   r2   rø   Úset_from_nodedevÚsetattr)rU   r  rK  rV   rV   rW   r–  ³  s
   
zvmmAddHardware._build_hostdevc           	      C   sÐ   |   ¡ }t |  d¡¡}|  d¡}|  d¡ ¡ }|  d¡ ¡ }|  d¡ ¡  ¡ }t |¡}|  d¡ ¡ s6d }|  d¡ ¡ s?d }|  d¡ ¡ sHd }| ¡ sNd }|| j ¡ ƒ}||_	||j
_||j
_||_||_|S )Nry   r  rë   rí   r  )r  r   r7  r9   rC  rB  r=  r2   rø   rJ  ÚsourceÚpathr—   Útarget_nameÚtarget_type)	rU   r#  rƒ   ÚtypeboxÚsource_pathÚsource_channelr·  r¸  rK  rV   rV   rW   r—  º  s,   

zvmmAddHardware._build_charc                 C   r°  )Nrx   )r   r7  r9   r   r2   rø   r…   ©rU   r…   rK  rV   rV   rW   r˜  Õ  r²  zvmmAddHardware._build_videoc                 C   s>   t  |  d¡¡}t  |  d¡¡}t| j ¡ ƒ}||_||_|S )Nrz   r{   )r   r7  r9   r   r2   rø   r…   Úaction)rU   r…   r½  rK  rV   rV   rW   r™  Û  s   zvmmAddHardware._build_watchdogc                 C   r®  rf   )r<   r§  rh   rV   rV   rW   rš  ã  r¯  z vmmAddHardware._build_filesystemc                 C   r°  )Nr|   )r   r7  r9   r   r2   rø   Úmode)rU   r¾  rK  rV   rV   rW   r›  æ  r²  zvmmAddHardware._build_smartcardc                 C   r°  )Nr  )r   r7  r9   r   r2   rø   rJ  )rU   ÚstyperK  rV   rV   rW   rœ  ì  r²  zvmmAddHardware._build_usbredirc                 C   r®  rf   )rD   r§  rh   rV   rV   rW   r  ò  r¯  zvmmAddHardware._build_tpmc                 C   r°  )Nr  )r   r7  r9   r
   r2   rø   r…   r¼  rV   rV   rW   rŸ  õ  r²  zvmmAddHardware._build_panicc                 C   s,   | j  ¡ \}}t| j ¡ ƒ}||_||_|S rf   )rC   rk  r   r2   rø   Úauto_cidÚcid)rU   rÀ  rÁ  rK  rV   rV   rW   r   û  s
   zvmmAddHardware._build_vsockc                    sº   t  |  d¡¡‰ t  |  d¡¡}|| _|dkr%t | j ¡ | jj	¡}d }nt| j ¡ ƒ}| jj	j
j}‡ fdd„|D ƒ}t|ƒdkrOtdd„ |D ƒƒd }||_ˆ |_|r[|d	kr[||_|S )
Nr  r}   r  c                    s   g | ]	}|j ˆ kr|‘qS rV   )rJ  rS  ©r  rV   rW   rg    s    
ÿz4vmmAddHardware._build_controller.<locals>.<listcomp>r   c                 S   s   g | ]}|j ‘qS rV   )r£  rS  rV   rV   rW   rg    s    r   r³  )r   r7  r9   r5   r   Úget_usb3_controllerr2   rø   r1   rÒ  rh  rU  rú  Úmaxr£  rJ  r…   )rU   r…   rK  rV  Úcontroller_numÚ	index_newrV   rÂ  rW   r‘    s(   ÿÿz vmmAddHardware._build_controllerc                 C   s.   |   d¡ ¡ }t| j ¡ ƒ}tj|_||_|S )Nrï   )r9   rC  r   r2   rø   r}  Úbackend_modelrÁ  )rU   rÁ  rK  rV   rV   rW   rž    s
   zvmmAddHardware._build_rngc                 C   s   |   |¡ d S rf   )Ú_browse_file)rU   r8  r9   rV   rV   rW   rB   (  s   z!vmmAddHardware._browse_storage_cbFc                    s`   ‡ fdd„}|r| j jp| j j}| jd u rt| jƒ| _| j |¡ | j |¡ | j | j	¡ d S )Nc                    s   |r	ˆ   |¡ d S d S rf   )rù   )r(  r¶  ©ÚtextentrV   rW   Úset_storage_cb,  s   ÿz3vmmAddHardware._browse_file.<locals>.set_storage_cb)
ÚconfigÚCONFIG_DIR_FSÚCONFIG_DIR_IMAGEr3   r   r2   Úset_finish_cbÚset_browse_reasonra   r7   )rU   rÊ  ÚisdirrË  ÚreasonrV   rÉ  rW   rÈ  +  s   ÿþ
zvmmAddHardware._browse_file)NNrf   )F)bÚ__name__Ú
__module__Ú__qualname__r0   ra   rH   ri   rT   r\   Ústaticmethodr  r%  r0  r3  r8  rF  rL  r]  rn  rs  r{  r€  r…  r‡  rŽ  r   r¨  r®  rµ  r·  rÈ  r´   r³   rÔ  rú   rµ   r¶   r·   r¸   rò  r  r¹   r»   r¼   r  r½   r¾   r¿   rÀ   rÁ   rÂ   r  r  ró   r   r$  rJ   r,  r'  rF   r6  rK   rL   rM   rP   rO   rN   rQ   rR   rd  rq  ru  rI   r€  rv  r‹  r1  r  r¤  r  r’  r“  r”  r•  r–  r—  r˜  r™  rš  r›  rœ  r  rŸ  r   r‘  rž  rB   rÈ  rV   rV   rV   rW   r"   2   sþ    ?
		x.ÿA

	



	



	









%

	


	-





	


&-	
+5
(	r"   )?r  Úgi.repositoryr   Úvirtinstr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Úlibr   ra  r   Ú	baseclassr   Údevice.addstorager   Údevice.fsdetailsr   Údevice.gfxdetailsr   Údevice.netlistr   Údevice.tpmdetailsr   Údevice.vsockdetailsr   Ústoragebrowser   Ú	xmleditorr    rð   rË   rÌ   rÍ   rÎ   rÐ   rÑ   rÓ   rÒ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rà   r"   rV   rV   rV   rW   Ú<module>   sD   Lð