o
    b,%                     @   s   d dl Z d dlZddlmZ ddlmZ ddlmZmZm	Z	 dd Z
d	d
 Zdd Zdadd Zd add ZG dd deZG dd deZdS )    N   )Device   )log)
XMLBuilderXMLChildPropertyXMLPropertyc                 C   sT   |   r	g d}ng d}|tddtddtddg }ddd |D S )a9  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      :c                 S   s   g | ]}d | qS )z%02x ).0xr   r   5/usr/share/virt-manager/virtinst/devices/interface.py
<listcomp>'   s    z_random_mac.<locals>.<listcomp>)is_qemurandomrandintjoin)connouimacr   r   r   _random_mac   s   



r   c               	   C   s   d} t j| std|  d S t| D ]5}| }t|dkr,tdt||   d S zt|d d}|dkr?|d W   S W q t	yI   Y qw d S )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router   r   r   _default_route*   s*   	r+   c                  C   sz   t  } | sd S tjd|  r| S zt| d }W n ty$   d}Y nw |dkr;tjd| r;tjd| r;dS d S )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defnr   r   r   _host_default_bridgeA   s"   r0   r,   c                 C   s\   |   rd S tdkr$zt }W n ty!   tjddd d }Y nw |at}|  r,d}|S )Nr,   z!Error getting host default bridgeT)exc_infotestsuitebr0)	is_remote_HOST_DEFAULT_BRIDGEr0   r-   r   r!   in_testsuite)r   retr   r   r   _default_bridge^   s   
r7   c                  C   s>   d} | d d t t| d t  }td7 adtjvrda|S )Nz00:11:22:33:44:55r,   r   %VIRTINST_TEST_SUITE_INCREMENT_MACADDRr   )strr%   _MAC_COUNTERr   environ)baser6   r   r   r   _testsuite_mact   s    
r=   c                   @   sT   e Zd ZdZedZedddZedddZedddZedZ	ed	Z
ed
ZdS )_VirtualPortvirtualport./@typez./parameters/@manageridTis_intz./parameters/@typeidz./parameters/@typeidversionz./parameters/@instanceidz./parameters/@profileidz./parameters/@interfaceidN)__name__
__module____qualname__XML_NAMEr   type	manageridtypeidtypeidversion
instanceid	profileidinterfaceidr   r   r   r   r>      s    r>   c                   @   s>  e Zd ZdZdZdZdZdZdZdZ	e
dd	 Ze
d
d Ze
dd Zdd Zdd ZeeeZg dZedZedZedZeeddZedZedddZedZedZedZedZedZ ed Z!ed!Z"ed"Z#ed#Z$ed$Z%ed%dd&Z&ed'dd(Z'ed)Z(ed*dd&Z)d+d, Z*e
d-d. Z+d/d0 Z,d1S )2DeviceInterface	interfacebridgenetworkuser	vhostuserethernetdirectc              	   C   sZ   |   rt S tdD ]}t| }zt| | |W   S  ty%   Y qw td dS )ze
        Generate a random MAC that doesn't conflict with any VMs on
        the connection.
           z&Failed to generate non-conflicting MACN)	fake_conn_predictabler=   ranger   rN   check_mac_in_useRuntimeErrorr   r!   )r   ignorer   r   r   r   generate_mac   s   
zDeviceInterface.generate_macc                 C   sV   |sdS |   }|D ]}|jjD ]}|jpd}| | kr'ttd| qq
dS )zR
        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devicesrO   macaddrlowerrZ   _)r   	searchmacvmsvmnicnicmacr   r   r   rY      s   
z DeviceInterface.check_mac_in_usec                 C   s   t | S )zr
        Return the bridge virt-install would use as a default value,
        if one is setup on the host
        )r7   )r   r   r   r   default_bridge   s   zDeviceInterface.default_bridgec                 C   s:   | j | jkr	| jS | j | jkr| jS | j | jkr| jS dS )zo
        Convenience function, try to return the relevant <source> value
        per the network type.
        N)rG   TYPE_VIRTUALrQ   TYPE_BRIDGErP   TYPE_DIRECT
source_dev)selfr   r   r   _get_source   s   zDeviceInterface._get_sourcec                 C   sX   d| _ d| _d| _| j| jkr|| _dS | j| jkr|| _ dS | j| jkr*|| _dS dS )zk
        Convenience function, try to set the relevant <source> value
        per the network type
        N)rP   rQ   rl   rG   ri   rj   rk   )rm   	newsourcer   r   r   _set_source   s   


zDeviceInterface._set_source)rP   rQ   rl   source_typesource_pathsource_mode	portgroupr`   
target_devmodelr?   	filterrefrom_barrom_filemtu_sizez./source/@bridgez./source/@networkz./source/@devT)	is_singler@   z./@trustGuestRxFilters)is_yesnoz./mac/@addressz./source/@typez./source/@pathz./source/@modez./source/@portgroupz./model/@typez./target/@devz./filterref/@filterz./link/@statez./driver/@namez./driver/@queuesrA   z
./rom/@bar)is_onoffz./rom/@filez./mtu/@sizec                 C   sP   | j  s
| j  r| j| _d S tj}t| j }|s tj}d}|| _|| _	d S )Ndefault)
r   is_qemu_unprivilegedis_test	TYPE_USERrG   rN   rj   rh   ri   source)rm   nettyper   r   r   r   set_default_source  s   
z"DeviceInterface.set_default_sourcec                 C   sf   | j  sd S |  rdS | j  rdS | j  sd S g d}| j }|D ]
}||v r0|  S q&dS )Nvirtioe1000e)e1000rtl8139ne2k_pcipcnetr   )r   is_hvmsupports_virtionetis_q35is_x86osinfosupported_netmodels)guestprefssupported_modelsprefr   r   r   default_model'  s   



zDeviceInterface.default_modelc                 C   sZ   | j s| j| _ | js| | j| _| j | jkr | js t| j| _| js+| || _d S d S )N)	rG   rj   r`   r\   r   rP   r7   rv   r   )rm   r   r   r   r   set_defaults9  s   zDeviceInterface.set_defaultsN)-rC   rD   rE   rF   rj   ri   r   TYPE_VHOSTUSERTYPE_ETHERNETrk   staticmethodr\   rY   rh   rn   rp   propertyr   _XML_PROP_ORDERr   rP   rQ   rl   r   r>   r?   rG   trustGuestRxFiltersr`   rq   rr   rs   rt   rv   ru   rw   
link_statedriver_namedriver_queuesrx   ry   rz   r   r   r   r   r   r   r   rN      sT    




rN   )r   r   devicer   loggerr   
xmlbuilderr   r   r   r   r+   r0   r4   r7   r:   r=   r>   rN   r   r   r   r   <module>   s   