
    W'Fg?                        S SK r S SKJs  Jr  S SKrSSKJr  SSKJ	r	  SSK
JrJrJr   " S S\5      r " S S	\5      r " S
 S\5      r " S S\5      rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS rS  rS! r " S" S#\5      rg)$    N   )	DomainCpu)log)
XMLBuilderXMLChildPropertyXMLPropertyc                   (    \ rS rSrSr\" S5      rSrg)_Value   value. N)__name__
__module____qualname____firstlineno__XML_NAMEr   r   __static_attributes__r       3/usr/share/virt-manager/virtinst/domcapabilities.pyr
   r
      s    HEr   r
   c                   0    \ rS rSr\" \5      rS rS rSr	g)
_HasValues   c                 X    U R                    Vs/ s H  oR                  PM     sn$ s  snf N)valuesr   )selfvs     r   
get_values_HasValues.get_values   s     !%-A---   'c                 &    XR                  5       ;   $ r   )r   )r   vals     r   	has_value_HasValues.has_value"   s    oo'''r   r   N)
r   r   r   r   r   r
   r   r   r$   r   r   r   r   r   r      s    f%F.(r   r   c                   (    \ rS rSrSr\" S5      rSrg)_Enum&   enum./@namer   N)r   r   r   r   r   r   namer   r   r   r   r'   r'   &   s    Hy!Dr   r'   c                   d    \ rS rSr\" SSS9r\" S5      r\" \5      r	\
S 5       rS rS rS rS	rg
)
_CapsBlock+   ./@supportedTis_yesnoc                     U R                   S L$ r   )_supported_presentr   s    r   present_CapsBlock.present0   s    &&d22r   c                 X    U R                    Vs/ s H  oR                  PM     sn$ s  snf r   )enumsr+   )r   es     r   
enum_names_CapsBlock.enum_names4   s      $

+
1
+++r!   c                 &    XR                  5       ;   $ r   )r:   )r   r+   s     r   has_enum_CapsBlock.has_enum7   s    (((r   c                 z    U R                    H  nUR                  U:X  d  M  Us  $    [        U R                  5      $ r   )r8   r+   r'   conn)r   r+   r)   s      r   get_enum_CapsBlock.get_enum:   s2    JJDyyD  
 TYYr   r   N)r   r   r   r   r   	supportedr3   r   r'   r8   propertyr5   r:   r=   rA   r   r   r   r   r-   r-   +   sD    NT:I$^4U#E3 3,) r   r-   c                 >     " S S[         5      n[        USU 5        U$ )ah  
Build a class object representing a list of <enum> in the XML. For
example, domcapabilities may have a block like:

<graphics supported='yes'>
  <enum name='type'>
    <value>sdl</value>
    <value>vnc</value>
    <value>spice</value>
  </enum>
</graphics>

To build a class that tracks that whole <graphics> block, call this
like _make_capsblock("graphics")
c                       \ rS rSrSrg)!_make_capsblock.<locals>.TmpClassS   r   N)r   r   r   r   r   r   r   r   TmpClassrG   S   s    r   rI   r   )r-   setattr)xml_root_namerI   s     r   _make_capsblockrL   C   s     : Hj-0Or   c                   6    \ rS rSrSr\" SSS9r\" S5      rSrg)	_SEV]   sevr/   Tr0   z./maxESGuestsr   N)	r   r   r   r   r   r   rC   maxESGuestsr   r   r   r   rN   rN   ]   s    HNT:Io.Kr   rN   c                   2    \ rS rSrSr\" \" S5      SS9rSrg)_OSg   osloaderT	is_singler   N)	r   r   r   r   r   r   rL   rV   r   r   r   r   rS   rS   g   s    Hoh74HFr   rS   c                       \ rS rSrSr\" \" S5      SS9r\" \" S5      SS9r\" \" S5      SS9r	\" \" S5      SS9r
\" \" S	5      SS9r\" \" S
5      SS9r\" \" S5      SS9r\" \" S5      SS9rSrg)_Devicesl   deviceshostdevTrW   diskvideographicstpm
filesystemredirdevchannelr   N)r   r   r   r   r   r   rL   r]   r^   r_   r`   ra   rb   rc   rd   r   r   r   r   rZ   rZ   l   s    Hy9TJGOF3tDD_W5FE
 ;tLH
?51T
BC!/,"?4PJ
 ;tLHy9TJGr   rZ   c                   Z    \ rS rSrSr\" \" S5      SS9r\" \SS9r	\" \" S5      SS9r
Srg)		_Featuresx   featuresgicTrW   hypervr   N)r   r   r   r   r   r   rL   ri   rN   rP   rj   r   r   r   r   rf   rf   x   s5    H
?51T
BC
44
0Coh74HFr   rf   c                       \ rS rSrSrSrg)_MemoryBacking   memoryBackingr   N)r   r   r   r   r   r   r   r   r   rl   rl      s    Hr   rl   c                   H    \ rS rSrSr\" S5      r\" S5      r\" S5      rSr	g)	_CPUModel   modelr   z	./@usablez./@fallbackr   N)
r   r   r   r   r   r   rr   usablefallbackr   r   r   r   rp   rp      s%    HE%F=)Hr   rp   c                   >    \ rS rSrSr\" S5      r\" \5      r	S r
Srg)_CPUMode   moder*   c                 R    U R                    H  nUR                  U:X  d  M  Us  $    g r   )modelsrr   )r   r+   rr   s      r   	get_model_CPUMode.get_model   s!    [[E{{d" !r   r   N)r   r   r   r   r   r   r+   r   rp   rz   r{   r   r   r   r   rv   rv      s     Hy!Di(Fr   rv   c                   .    \ rS rSrSr\" \5      rS rSr	g)_CPU   cpuc                 R    U R                    H  nUR                  U:X  d  M  Us  $    g r   )modesr+   )r   r+   rx   s      r   get_mode_CPU.get_mode   s!    JJDyyD  r   r   N)
r   r   r   r   r   r   rv   r   r   r   r   r   r   r~   r~      s    HX&Er   r~   c                     [         R                  " U 5      nSUl        0 Ul        [         R                  " US5      nXl        [         R                  " USS9$ )Nr   archunicode)encoding)ET
fromstringtagattrib
SubElementtexttostring)xmlr   rootaelements       r   _convert_mode_to_cpur      sD    ==DDHDK}}T6*HM;;ti00r   c                    [        UR                  5       U R                  5      n[        R                  " SU5         U R
                  R                  U R                  U R                  U R                  U R                  U/[        R                  5      n[        U R
                  U5      $ ! [        R                  [        4 a.    U R
                  R                  U/[        R                  5      n N]f = f)Nz0Generated CPU XML for security flag baseline:
%s)r   get_xmlr   r   debugr@   baselineHypervisorCPUpathmachinedomainlibvirt(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURESlibvirtErrorAttributeErrorbaselineCPUr   )domcapsrx   cpuXMLexpandedXMLs       r   _get_expanded_cpur      s    !$,,.',,?FIIA6JBll88gll&@@B W\\;//	   .1 Bll..x@@BBs   AB* *AC21C2c                    / n/ SQnU R                   R                   Hr  nUR                  S:w  d  UR                  (       d  M&   [	        X5      nUR                   H0  nUR                  U;   d  M  UR                  UR                  5        M2     Mt     [        R                  " SU5        U$ ! [
        R                   a,  n[        R                  " [        S5      U5         S nA  MT  S nAff = f)N)z	spec-ctrlssbdibpbz	virt-ssbdzmd-clear
host-modelz"Failed to get expanded CPU XML: %sz&Found host-model security features: %s)r   r   r+   rC   r   r   r   r   warning_rh   appendr   )r   retsec_featuresmr   r9   features          r   _lookup_cpu_security_featuresr      s    
CL [[66\!	#G/C
 ||G|||+

7<<( $  II6<J ## 	KK>?C	s   B,,C,  C''C,c                   h   \ rS rSrSr\" \SS9r\" \SS9r	\" \
SS9r\" \SS9r\" \SS9r\" S5      r\" S5      r\" S5      r\" S5      r\S	 5       r\S
 5       rSS// SQ/ SQ/ SQSS/SS/S.rS rS rS rS rS rS rS rS r Sr!S r"S+S jr#S  r$S! r%S" r&S# r'S$ r(S% r)S& r*S' r+S( r,S) r-S*r.g),DomainCapabilities   domainCapabilitiesTrW   z./archz./domainz	./machinez./pathc                    S nU R                   R                  5       (       a,   U R                  XX45      n[        R                  " SXX4U5        U(       d  [        U 5      $ [        XS9$ ! [
         a    [        R                  " SSS9   N<f = f)Nz1Fetched domain capabilities for (%s,%s,%s,%s): %sz"Error fetching domcapabilities XMLT)exc_info)parsexml)supportconn_domain_capabilitiesgetDomainCapabilitiesr   r   	Exceptionr   )r@   emulatorr   r   hvtyper   s         r   build_from_params$DomainCapabilities.build_from_params   s    <<0022#00%		M"'3@ %d++!$55  #		>!##s   +A) )B
Bc                     [         R                  U R                  U R                  U R                  R
                  U R                  R                  U R                  5      $ r   )r   r   r@   r   rU   r   r   type)guests    r   build_from_guest#DomainCapabilities.build_from_guest  s@    !33EJJNNEHHMM588+;+;UZZI 	Ir   z.*edk2-i386-.*\.fdz.*ovmf-ia32.*)z.*edk2-x86_64-.*\.fdz.*OVMF_CODE\.fdz.*ovmf-x64/OVMF.*\.fdz.*ovmf-x86_64-.*z.*ovmf.*z.*OVMF.*)z.*AAVMF_CODE\.fdz.*aarch64/QEMU_EFI.*z.*aarch64.*z.*edk2-aarch64-code\.fd)z.*AAVMF32_CODE\.fdz.*arm/QEMU_EFI.*z.*edk2-arm-code\.fdz.*RISCV_VIRT_CODE\..*z.*riscv64.*z.*loongarch64/QEMU_CODE\..*z.*loongarch64.*)i686x86_64aarch64armv7lriscv64loongarch64c                    U R                  5       (       d  gU R                  R                  R                   Vs/ s H  oR                  PM     nnU R
                  R                  5       (       a*  U H  nSU;   d  M  Us  $    U=(       a    US   =(       d    S$ U R                  R                  U R                  5      nU H-  nU H$  n[        R                  " XV5      (       d  M   Us  s  $    M/     gs  snf )z>
Search the loader paths for one that matches the passed arch
NzBHYVE_UEFI.fdr   )arch_can_uefirU   rV   r   r   r@   is_bhyve_uefi_arch_patternsgetr   rematch)r   ffirmware_filesfirmware_filepatternspatternr   s          r   find_uefi_path_for_arch*DomainCapabilities.find_uefi_path_for_arch1  s     !!##+/77>>+@+@A+@a''+@A99!/"m3(( "0 # &"1%.)-/ ++//		:G&88G**K '   Bs   C2c                 2   U(       d&  U R                   S;   a  [        S5      $ [        S5      $ U R                  R                  5        H=  u  p#U H2  n[        R
                  " XA5      (       d  M   [        S5      X!S.-  s  s  $    M?     [        SSU0-  5      $ )zL
Return a pretty label for passed path, based on if we know
about it or not
r   r   BIOSDefaultzUEFI %(arch)s: %(path)s)r   r   zCustom: %(path)sr   )r   r   r   itemsr   r   )r   r   r   r   r   s        r   label_for_firmware_path*DomainCapabilities.label_for_firmware_pathF  s    
 yy..y Y<"66<<>ND#88G**78!%45 6 $ ? #vtn455r   c                 4    U R                   U R                  ;   $ )z>
Return True if we know how to setup UEFI for the passed arch
)r   r   r4   s    r   r    DomainCapabilities.arch_can_uefiX  s     yyD4444r   c                 j    U R                   R                  R                  S5      R                  S5      $ )z;
Return True if libvirt advertises support for UEFI loader
readonlyyes)rU   rV   rA   r$   r4   s    r   supports_uefi_loader'DomainCapabilities.supports_uefi_loader^  s(     ww~~&&z2<<UCCr   c                 V    U R                   R                  S5      R                  S5      $ )Nfirmwareefi)rU   rA   r$   r4   s    r   supports_firmware_efi(DomainCapabilities.supports_firmware_efid  s"    ww
+55e<<r   c                     U R                   R                  S5      nU=(       a/    UR                  =(       a    UR                  S   R                  S:H  $ )z
Return True if domcaps reports support for cpu mode=host-model.
host-model in fact predates this support, however it wasn't
general purpose safe prior to domcaps advertisement.
r   r   forbid)r   r   rC   rz   rt   r   r   s     r   supports_safe_host_model+DomainCapabilities.supports_safe_host_modell  sF     HHl+ 1akk 1$$0	2r   c                     U R                   R                  S5      nU=(       a5    UR                  =(       a"    SUR                  S5      R	                  5       ;   $ )z
Return True if host-passthrough is safe enough to use by default.
We limit this to domcaps new enough to report whether host-passthrough
is migratable or not, which also means libvirt is about new enough
to not taint the VM for using host-passthrough
zhost-passthroughonhostPassthroughMigratable)r   r   rC   rA   r   r   s     r   supports_safe_host_passthrough1DomainCapabilities.supports_safe_host_passthroughv  sO     HH01 Makk M

#>?JJLL	Nr   c                    / nU R                   R                   Hh  nUR                  S:X  d  M  UR                  (       d  M(  UR                   H0  nUR
                  S:w  d  M  UR                  UR                  5        M2     Mj     U$ )Ncustomno)r   r   r+   rC   rz   rs   r   rr   )r   rz   r   rr   s       r   get_cpu_models!DomainCapabilities.get_cpu_models  s^    Avv!akkkXXE||t+ekk2 &   r   Nc                 f    U R                   c  [        U 5      =(       d    / U l         U R                   $ r   )	_featuresr   r4   s    r   get_cpu_security_features,DomainCapabilities.get_cpu_security_features  s'    >>!:4@FBDN~~r   c                    U(       aP  [        U R                  R                  R                  =(       a     U R                  R                  R                  5      $ [        U R                  R                  R                  5      $ )z
Returns False if either libvirt doesn't advertise support for SEV at
all (< libvirt-4.5.0) or if it explicitly advertises it as unsupported
on the platform
)boolrh   rP   rC   rQ   )r   check_ess     r   supports_sev_launch_security/DomainCapabilities.supports_sev_launch_security  sY     ))33 6))557 7DMM%%//00r   c                 j    U R                   R                  R                  S5      R                  S5      $ )zR
Returns False if either libvirt or qemu do not have support to bochs
video type.
	modelTypebochsr\   r_   rA   r$   r4   s    r   supports_video_bochs'DomainCapabilities.supports_video_bochs  s*    
 ||!!**;7AA'JJr   c                     U R                   R                  R                  S5      (       d  U R                  5       $ U R                   R                  R	                  S5      R                  S5      $ )Nr  qxl)r\   r_   r=   supports_graphics_spicerA   r$   r4   s    r   supports_video_qxl%DomainCapabilities.supports_video_qxl  sT    ||!!**;77 //11||!!**;7AA%HHr   c                 j    U R                   R                  R                  S5      R                  S5      $ )Nr  virtior  r4   s    r   supports_video_virtio(DomainCapabilities.supports_video_virtio  s(    ||!!**;7AA(KKr   c                 D   U R                   R                  R                  S5      R                  5       nU R                   R                  R                  S5      R                  5       nU R                  S:X  a  US/:X  a  g[        U5      S:  =(       a    [        SU;   5      $ )zR
Returns False if either libvirt or qemu do not have support for
emulating a TPM.
rr   backendModelr   ztpm-tisFr   r   )r\   ra   rA   r   r   lenr   )r   rz   backendss      r   supports_tpm_emulator(DomainCapabilities.supports_tpm_emulator  s    
 !!**73>>@<<##,,^<GGI99 V	{%:
 6{Q?4
h(>#??r   c                    U R                   R                  R                  (       dv  U R                  R	                  5       (       d   U R                  R                  5       (       d  gU R                  R                  R                  R                  R                  S;   $ U R                   R                  R                  S5      R                  S5      $ )NFr   r   spice)r\   r`   rC   r@   is_qemuis_testcapshostr   r   rA   r$   r4   s    r   r  *DomainCapabilities.supports_graphics_spice  s    ||$$.. 99$$&&tyy/@/@/B/B99>>&&**//3EEE||$$--f5??HHr   c                     U R                   R                  R                  c  gU R                   R                  R                  S5      R	                  S5      $ )zL
Return False if libvirt explicitly advertises no support for
spice channel
Tr   spicevmc)r\   rd   rC   rA   r$   r4   s    r   supports_channel_spicevmc,DomainCapabilities.supports_channel_spicevmc  sE    
 <<))1 ||##,,V4>>zJJr   c                     U R                   R                  R                  c  gU R                   R                  R                  S5      R	                  S5      $ )zK
Return False if libvirt explicitly advertises no support for
USB redirect
Tbususb)r\   rc   rC   rA   r$   r4   s    r   supports_redirdev_usb(DomainCapabilities.supports_redirdev_usb  sE    
 <<  **2 ||$$--e4>>uEEr   c                 j    U R                   R                  R                  S5      R                  S5      $ )z8
Return True if libvirt advertises support for virtiofs

driverTypevirtiofs)r\   rb   rA   r$   r4   s    r   supports_filesystem_virtiofs/DomainCapabilities.supports_filesystem_virtiofs  s.     ||&&//'i
3	4r   c                 V    U R                   R                  S5      R                  S5      $ )zD
Return True if libvirt advertises support for memfd memory backend

sourceTypememfd)memorybackingrA   r$   r4   s    r   supports_memorybacking_memfd/DomainCapabilities.supports_memorybacking_memfd  s&     !!**<8BB7KKr   c                     U R                   R                  R                  (       d  / $ U R                   R                  R                  S5      R	                  5       $ )z,
Return list of supported Hyper-V features.
rh   )rh   rj   rC   rA   r   r4   s    r   supported_hyperv_features,DomainCapabilities.supported_hyperv_features  s@     }}##--I}}##,,Z8CCEEr   )r   )F)/r   r   r   r   r   r   rS   rU   r~   r   rZ   r\   rf   rh   rl   r0  r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r!  r&  r+  r1  r4  r   r   r   r   r   r      sJ   #H	#	.B
44
0Cx48G	T:H$^tDMx D$F+&Gx D 6 6" I I "



 %

 +
7B *6$5D=2	N	 I	1KIL@"I
K
F4LFr   r   )r   xml.etree.ElementTreeetreeElementTreer   r   r   r   loggerr   
xmlbuilderr   r   r   r
   r   r'   r-   rL   rN   rS   rZ   rf   rl   rp   rv   r~   r   r   r   r   r   r   r   <module>r<     s    
 " "    A AZ 
( ("J "
   04/: /I* I
	Kz 	KI
 IZ *
 *z : 10 >[F [Fr   