
    W'Fg,                         S SK r S SKrSSKJrJr  SSKJr  SSKJr  SSK	J
r
JrJr  S rS	 rS
 rSqS rS q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g)    N   )DeviceDeviceAddress   )
NodeDevice)log)
XMLBuilderXMLChildPropertyXMLPropertyc                     U R                  5       (       a  / SQnO/ SQnU[        R                  " SS5      [        R                  " SS5      [        R                  " SS5      /-   nSR                  U Vs/ s H  nSU-  PM
     sn5      $ s  snf )a  Generate a random MAC address.

00-16-3E allocated to xensource
52-54-00 used by qemu/kvm

The OUI list is available at https://standards.ieee.org/regauth/oui/oui.txt.

The remaining 3 fields are random, with the first bit of the first
random field set 0.

@return: MAC address string
)R   T   r   )r      >   r      :z%02x)is_qemurandomrandintjoin)connouimacxs       5/usr/share/virt-manager/virtinst/devices/interface.py_random_macr      s{     ||~~  !
NN4&NN4&NN4&( (C 88-AVaZ-..-s   5Bc                     Sn [         R                  R                  U 5      (       d  [        R                  " SU 5        g [        U 5       Hb  nUR                  5       n[        U5      S:w  a#  [        R                  " S[        U5      U 5          g  [        US   S5      nUS:X  a  US   s  $ Md     g ! [         a     Mt  f = f)Nz/proc/net/routezroute_file=%s does not exist   z)Unexpected field count=%s when parsing %sr      r   )
ospathexistsr   debugopensplitlenint
ValueError)
route_filelineinforoutes       r   _default_router-   +   s    "J77>>*%%		0*=Z zz|t9?IIAd)Z1 	Q$EzAw  !   		s   B11
B?>B?c                  f   [        5       n U (       d  g [        R                  R                  SU -  5      (       a  U $  [	        U S   5      nUS:  aO  [        R                  R                  SU-  5      (       a(  [        R                  R                  SU-  5      (       a  gg ! [
         a    Sn Ndf = f)Nz/sys/class/net/%s/bridger   z/sys/class/net/peth%d/brportz/sys/class/net/xenbr%d/bridgezxenbr%d)r-   r    r!   r"   r'   	Exception)devdefns     r   _host_default_bridger3   B   s    

C 
ww~~03677
3r7| 		
5<==
6=>>  s   B! !B0/B0r/   c                     U R                  5       (       a  g [        S:X  a   [        5       nUq[        nU R                  5       (       a  SnU$ ! [         a    [        R
                  " SSS9  S n NDf = f)Nr/   z!Error getting host default bridgeT)exc_infotestsuitebr0)	is_remote_HOST_DEFAULT_BRIDGEr3   r0   r   r#   in_testsuite)r   rets     r   _default_bridger;   _   st    ~~ r!	&(C  #
CJ  	II9DIC	s   
A !A10A1c                      Sn U S S [        [        U S   5      [        -   5      -   n[        S-  qS[        R                  ;  a  SqU$ )Nz00:11:22:33:44:55r/   r   %VIRTINST_TEST_SUITE_INCREMENT_MACADDRr   )strr'   _MAC_COUNTERr    environ)baser:   s     r   _testsuite_macrB   u   sK     D
s)c#d2h-,67
7CAL.bjj@J    c                   6    \ rS rSrSr\" S5      r\" SSS9rSrg)	_Backend   backend./@typez
./@logFileT)
do_abspath N)	__name__
__module____qualname____firstlineno__XML_NAMEr   typelogFile__static_attributes__rJ   rC   r   rE   rE      s    Hy!D,48GrC   rE   c                       \ rS rSrSr\" S5      r\" SSS9r\" SSS9r\" SSS9r	\" S	5      r
\" S
5      r\" S5      rSrg)_VirtualPort   virtualportrH   z./parameters/@manageridTis_intz./parameters/@typeidz./parameters/@typeidversionz./parameters/@instanceidz./parameters/@profileidz./parameters/@interfaceidrJ   N)rK   rL   rM   rN   rO   r   rP   	manageridtypeidtypeidversion
instanceid	profileidinterfaceidrR   rJ   rC   r   rT   rT      sY    Hy!D5dCI/=F =dKM78J56I9:KrC   rT   c                   P    \ rS rSrSr\" SSS9r\" SSS9r\" SSS9r\" SSS	9r	S
r
g)_PortForwardRange   rangez./@startTrW   z./@endz./@toz
./@excludeis_yesnorJ   N)rK   rL   rM   rN   rO   r   startendtoexcluderR   rJ   rC   r   r`   r`      s7    H
40E
ht
,C	WT	*B,6GrC   r`   c                   X    \ rS rSrSr\" S5      r\" S5      r\" S5      r\	" \
5      rSrg)_PortForward   portForwardz./@protoz
./@addressz./@devrJ   N)rK   rL   rM   rN   rO   r   protoaddressr1   r
   r`   rb   rR   rJ   rC   r   rj   rj      s0    H
#E,'G
h
C./ErC   rj   c                       \ rS rSrSrg)_DeviceInterfaceSourceAddress   rJ   N)rK   rL   rM   rN   rR   rJ   rC   r   rp   rp      s    rC   rp   c                       \ rS rSrSrSrSrSrSrSr	Sr
\S	 5       r\S
 5       r\S 5       rS rS r\" \\5      r/ SQr\" \SS9r\" S5      r\" S5      r\" S5      r\" \SS9r\" S5      r\" SSS9r\" S5      r\" S5      r \" S5      r!\" S5      r"\" \#SSS9r$\" S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%9r,\" S&SS'9r-\" S(5      r.\" S)SS%9r/\" \05      r1S* r2S+ r3\S, 5       r4S- r5S. r6S/r7g0)1DeviceInterface   	interfacebridgenetworkuser	vhostuserethernetdirectc                     U R                  5       (       a
  [        5       $ [        S5       H&  n[        U 5      n [        R                  X5        Us  $    [        R                  " S5        g! [         a     MN  f = f)zM
Generate a random MAC that doesn't conflict with any VMs on
the connection.
   z&Failed to generate non-conflicting MACN)	fake_conn_predictablerB   rb   r   rs   check_mac_in_useRuntimeErrorr   r#   )r   ignorer   s      r   generate_macDeviceInterface.generate_mac   st     %%''!##CjFd#C00;
	 ! 			8	:   s   A,,
A:9A:c                    U(       d  gU R                  5       nU Hn  nUR                  R                   HQ  nUR                  =(       d    SnUR	                  5       UR	                  5       :X  d  M<  [        [        S5      U-  5      e   Mp     g)zB
Raise RuntimeError if the passed mac conflicts with a defined VM
N z:The MAC address '%s' is in use by another virtual machine.)fetch_all_domainsdevicesru   macaddrlowerr   _)r   	searchmacvmsvmnicnicmacs         r   r    DeviceInterface.check_mac_in_use   s~    
 $$&Bzz++*<<>Y__%66& < =?HIJ J , rC   c                     [        U 5      $ )zZ
Return the bridge virt-install would use as a default value,
if one is setup on the host
)r;   )r   s    r   default_bridgeDeviceInterface.default_bridge   s     t$$rC   c                     U R                   U R                  :X  a  U R                  $ U R                   U R                  :X  a  U R                  $ U R                   U R
                  :X  a  U R                  $ g)zW
Convenience function, try to return the relevant <source> value
per the network type.
N)rP   TYPE_VIRTUALrw   TYPE_BRIDGErv   TYPE_DIRECT
source_devselfs    r   _get_sourceDeviceInterface._get_source   s[    
 99)))<<99(((;;99(((??"rC   c                     SU l         SU l        SU l        U R                  U R                  :X  a  Xl        gU R                  U R
                  :X  a  Xl         gU R                  U R                  :X  a  Xl        gg)zS
Convenience function, try to set the relevant <source> value
per the network type
N)rv   rw   r   rP   r   r   r   )r   	newsources     r   _set_sourceDeviceInterface._set_source   sc    
 99)))$LYY$***#KYY$***'O +rC   )rG   rv   rw   r   source_typesource_pathsource_mode	portgroupr   
target_devmodelrV   	filterrefrom_barrom_filemtu_sizerl   T)	is_singlez./source/@bridgez./source/@networkz./source/@devrH   z./@trustGuestRxFiltersrc   z./mac/@addressz./source/@typez./source/@pathz./source/@modez./source)r   relative_xpathz
./@managedz./source/@portgroupz./model/@typez./target/@devz./filterref/@filterz./link/@statez./driver/@namez./driver/@queuesrW   z
./rom/@bar)is_onoffz./rom/@filez./mtu/@sizec                 L   U R                   R                  5       (       d  U R                   R                  5       (       a  U R                  U l        g [
        R                  n[
        R                  U R                   5      nU(       d  [
        R                  nSnXl        X l	        g )Ndefault)
r   is_qemu_unprivilegedis_test	TYPE_USERrP   rs   r   r   r   source)r   nettyper   s      r   set_default_source"DeviceInterface.set_default_source>  sq    99))++tyy/@/@/B/BDI!-- //		:%22GF	rC   c                    [         R                  " SUR                  5       5        SU l        U R                  c  SU l        UR
                  [        R                  :X  a~  SU R                  l        UR                  U R                  l	        UR                  U R                  l
        UR                  U R                  l        UR                  U R                  l        g [        [        S5      UR
                  -  5      e)Nzset_from_nodedev xml=
%shostdevTpciz!Unsupported node device type '%s')r   r#   get_xmlrP   manageddevice_typer   CAPABILITY_TYPE_PCIsource_addressdomainbusslotfunctionr(   r   )r   nodedevs     r   set_from_nodedev DeviceInterface.set_from_nodedevL  s    		-w/@A	<<DL*"@"@@',D$)0D&&-kkD#'.||D$+2+;+;D( QBC''( ) )rC   c                 P   U R                   R                  5       (       d  g U R                  5       (       a  gU R                   R                  5       (       a  gU R                   R	                  5       (       d  g / SQnU R
                  R                  5       nU H  nX2;   d  M
  Us  $    g)Nvirtioe1000e)e1000rtl8139ne2k_pcipcnetr   )r    is_hvmsupports_virtionetis_q35is_x86osinfosupported_netmodels)guestprefssupported_modelsprefs       r   default_modelDeviceInterface.default_modelc  s    xx  ##%%88??xx  9 <<;;=D'  rC   c                     U R                   (       a  g U R                  (       a,  U R                  R                   S:X  a  U R                  U l         g U R                  U l         g )Npasst)rP   rG   r   r   r   s    r   _set_default_type!DeviceInterface._set_default_typeu  s?    99<<DLL--8DI$$	rC   c                 `   U R                  5         U R                  (       d   U R                  U R                  5      U l        U R                  U R
                  :X  a+  U R                  (       d  [        U R                  5      U l        U R                  (       d  U R                  U5      U l        g g )N)
r   r   r   r   rP   r   rv   r;   r   r   )r   r   s     r   set_defaultsDeviceInterface.set_defaults  sq     ||,,TYY7DL99((()$))4DKzz++E2DJ rC   )rv   r   r   r   rw   r   r   rP   N)8rK   rL   rM   rN   rO   r   r   r   TYPE_VHOSTUSERTYPE_ETHERNETr   staticmethodr   r   r   r   r   propertyr   _XML_PROP_ORDERr
   rE   rG   r   rv   rw   r   rT   rV   rP   trustGuestRxFiltersr   r   r   r   rp   r   r   r   r   r   r   
link_statedriver_namedriver_queuesr   r   r   rj   rl   r   r   r   r   r   rR   rJ   rC   r   rs   rs      s   HKLI!N MK ( J J  % %( k;/FO x48G+,F-.G_-J"<4@Ky!D%&>N*+G./K./K./K%&C045?AN ,6G12I(E_-J12I_-J./K 24@M,6G=)H=6H"<0K).  "%3rC   rs   )r    r   devicer   r   r   r   loggerr   
xmlbuilderr	   r
   r   r   r-   r3   r8   r;   r?   rB   rE   rT   r`   rj   rp   rs   rJ   rC   r   <module>r      s    
  )    B B/6.4  &  9z 9	;: 	;7
 70: 0	M 	X3f X3rC   