o
    ïì¿`D?  ã                   @   s˜   d dl Z d dlmZ d dlmZ d dl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„ ZG dd„ deƒZdS )é    N)ÚGtk)ÚPango)Úgeneratename)Úlog)ÚNetworké   )Úuiutil)ÚvmmAsyncJob)ÚvmmGObjectUI)ÚvmmXMLEditorc                 C   s*   z
t jt| ƒddW S  ty   Y d S w )NF)Ústrict)Ú	ipaddressÚ
ip_networkÚstrÚ	Exception)Úaddrstr© r   ú0/usr/share/virt-manager/virtManager/createnet.pyÚ_make_ipaddr   s
   ÿr   c                   @   sN  e Zd Zdd„ Zdd„ ZdRdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dS )SÚvmmCreateNetworkc                 C   s–   t  | dd¡ || _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createnet.uizvmm-create-netznet-details-alignznet-detailszxml-requested)Úon_create_cancel_clickedÚon_vmm_create_delete_eventÚon_create_finish_clickedÚon_net_forward_mode_changedÚon_net_forward_device_changedÚon_net_dns_use_toggledzon_net-ipv4-enable_toggledzon_net-ipv4-network_changedzon_net-dhcpv4-enable_toggledzon_net-ipv6-enable_toggledzon_net-ipv6-network_changedzon_net-dhcpv6-enable_toggled)r
   Ú__init__Úconnr   ÚbuilderÚtopwinÚwidgetÚ
_xmleditorÚconnectÚ_xmleditor_xml_requested_cbÚconnect_signalsÚcloseÚfinishÚ_net_forward_mode_changed_cbÚ_net_forward_device_changed_cbÚ_net_dns_use_toggled_cbÚ_ipv4_toggled_cbÚ_change_ipv4_network_cbÚ_dhcpv4_toggled_cbÚ_ipv6_toggled_cbÚ_change_ipv6_network_cbÚ_dhcpv6_toggled_cbÚbind_escape_key_closeÚset_initial_state)Úselfr   r   r   r   r       s2   
þÿñzvmmCreateNetwork.__init__c                 C   s,   t  d¡ |  ¡  | j |¡ | j ¡  d S )NzShowing new network wizard)r   ÚdebugÚreset_stater   Úset_transient_forÚpresent)r2   Úparentr   r   r   ÚshowD   s   
zvmmCreateNetwork.showNc                 C   s   t  d¡ | j ¡  dS )NzClosing new network wizardr   )r   r3   r   Úhide)r2   Úignore1Úignore2r   r   r   r%   J   s   

zvmmCreateNetwork.closec                 C   s   d | _ | j ¡  d | _d S ©N)r   r!   Úcleanup©r2   r   r   r   Ú_cleanupO   s   

zvmmCreateNetwork._cleanupc                 C   s  |   d¡}t tt¡}| |¡ t |d¡}| dtj	j
¡ |   d¡}t tt¡}| |¡ t |d¡ | dtdƒg¡ | dtdƒg¡ |   d	¡}t tt¡}| |¡ t |d¡ | d
tdƒg¡ | dtdƒg¡ | dtdƒg¡ | dtdƒg¡ | dtdƒg¡ d S )Núnet-hostdevsr   Ú	ellipsizeúnet-forward-deviceFzAny physical deviceTzPhysical device...únet-forward-modeÚnatÚNATÚrouteÚRoutedÚopenÚOpenÚisolatedÚIsolatedÚhostdevzSR-IOV pool)r    r   Ú	ListStorer   Ú	set_modelr   Úinit_combo_text_columnÚset_propertyr   ÚEllipsizeModeÚMIDDLEÚboolÚappendÚ_)r2   Úpf_listÚpf_modelÚtextÚfw_listÚfw_modelÚ	mode_listÚ
mode_modelr   r   r   r1   Y   s(   





z"vmmCreateNetwork.set_initial_statec                    s^  ˆ j  ¡  d}‡ fdd„}t ||¡}ˆ  d¡ |¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d	¡ d¡ ˆ  d	¡ d¡ ˆ  d
¡ d¡ ˆ  d
¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ ˆ  d¡ d¡ g }g }ˆ j	 
d¡D ]2}|j ¡ sÍqÅ| ¡ }ˆ j	 
d¡D ]}|jj|jjkrâq×|jj}	d|	|f }
| |
¡ | |	¡  qÅˆ  d ¡ ¡ }| ¡  t||ƒD ]\}
}	| |	|
g¡ qt|ƒdkr%| d td!ƒg¡ ˆ  d ¡ d¡ d S )"NÚnetworkc                    s   t  ˆ j ¡ j| ¡S r<   )r   Úcheck_libvirt_collisionr   Úget_backendÚnetworkLookupByName)Únr>   r   r   Úcby   s   ÿz(vmmCreateNetwork.reset_state.<locals>.cbúnet-nameúnet-dns-use-netnameTúnet-ipv4-expanderFúnet-ipv6-expanderúnet-dns-expanderúnet-ipv4-enableúnet-ipv4-networkz192.168.100.0/24únet-dhcpv4-enableúnet-dhcpv4-startz192.168.100.128únet-dhcpv4-endz192.168.100.254únet-ipv6-enableúnet-ipv6-networkÚ únet-dhcpv6-enableúnet-dhcpv6-startúnet-dhcpv6-endrB   r   rC   únet-forward-manualÚpciÚnetz%s (%s)r@   zNo available device)r!   r4   r   Úgenerate_namer    Úset_textÚ
set_activeÚset_visibleÚset_expandedr   Úfilter_nodedevsÚxmlobjÚis_pci_sriovÚpretty_nameÚnamer7   Ú	interfacerT   Ú	get_modelÚclearÚzipÚlenrU   )r2   Úbasenamerb   Údefault_nameÚdevprettynamesÚifnamesÚpcidevÚdevdescÚnetdevÚifnameÚdevprettynamerW   r   r>   r   r4   u   s^   



€zvmmCreateNetwork.reset_statec                 C   ó   |   d¡ ¡ o|   d¡ ¡ S )Nre   rh   ©r    Ú
is_visibleÚ
get_activer>   r   r   r   Úget_config_ipv4_enable¸   ó   ÿz'vmmCreateNetwork.get_config_ipv4_enablec                 C   rŽ   )Nrf   rm   r   r>   r   r   r   Úget_config_ipv6_enable»   r“   z'vmmCreateNetwork.get_config_ipv6_enablec                 C   ó   |   d¡ ¡ S )Nrj   ©r    r‘   r>   r   r   r   Úget_config_dhcpv4_enable¾   ó   z)vmmCreateNetwork.get_config_dhcpv4_enablec                 C   r•   )Nrp   r–   r>   r   r   r   Úget_config_dhcpv6_enableÀ   r˜   z)vmmCreateNetwork.get_config_dhcpv6_enablec                 C   s:   |   d¡}| ¡ sd S |   d¡ ¡ r|   d¡ ¡ S | ¡ S )Núnet-domain-namerd   rc   )r    r   r‘   Úget_text)r2   r    r   r   r   Úget_config_domain_nameÃ   s   
z'vmmCreateNetwork.get_config_domain_namec                 C   s*   |   |¡}| ¡ r| ¡ sd S t| ¡ ƒS r<   )r    r   Úis_sensitiver   r›   )r2   Ú
widgetnamer    r   r   r   Ú_get_network_helperÌ   s   
z$vmmCreateNetwork._get_network_helperc                 C   ó
   |   d¡S )Nri   ©rŸ   r>   r   r   r   Úget_config_ip4Ò   ó   
zvmmCreateNetwork.get_config_ip4c                 C   r    )Nrk   r¡   r>   r   r   r   Úget_config_dhcpv4_startÔ   r£   z(vmmCreateNetwork.get_config_dhcpv4_startc                 C   r    )Nrl   r¡   r>   r   r   r   Úget_config_dhcpv4_endÖ   r£   z&vmmCreateNetwork.get_config_dhcpv4_endc                 C   r    )Nrn   r¡   r>   r   r   r   Úget_config_ip6Ø   r£   zvmmCreateNetwork.get_config_ip6c                 C   r    )Nrq   r¡   r>   r   r   r   Úget_config_dhcpv6_startÚ   r£   z(vmmCreateNetwork.get_config_dhcpv6_startc                 C   r    )Nrr   r¡   r>   r   r   r   Úget_config_dhcpv6_endÜ   r£   z&vmmCreateNetwork.get_config_dhcpv6_endc                 C   s<   |   d¡ ¡ s	d S tt |   d¡¡ƒ}|sd S |   d¡ ¡ S )NrB   rs   )r    r   rS   r   Úget_list_selectionr›   )r2   Úmanualr   r   r   Ú_get_config_net_forward_devß   s   ÿz,vmmCreateNetwork._get_config_net_forward_devc                 C   sŽ   t  |  d¡¡}|dv}|dv }t  |  d¡|¡ |  |  d¡¡ t  |  d¡|¡ |  d¡ | ¡ |  d¡ | ¡ |  d¡ | ¡ d S )	NrC   )rH   rJ   rL   )rL   rB   r@   re   rf   rg   )r   r©   r    Úset_grid_row_visibler(   ry   )r2   ÚsrcÚmodeÚ
fw_visibleÚ
is_hostdevr   r   r   r'   î   s   
ÿz-vmmCreateNetwork._net_forward_mode_changed_cbc                 C   s2   t  |  d¡¡}| ¡ sd}t  |  d¡|¡ d S )NrB   Frs   )r   r©   r    r   r¬   )r2   r­   rª   r   r   r   r(   ý   s   ÿ
ÿz/vmmCreateNetwork._net_forward_device_changed_cbc                 C   s"   |   d¡ ¡ }|   d¡ |¡ d S )Nznet-dns-use-customrš   )r    r‘   Úset_sensitive)r2   r­   Úcustomr   r   r   r)     ó   z(vmmCreateNetwork._net_dns_use_toggled_cbc                 C   ó   |   ¡  d S r<   )Úchange_ipv4_enable©r2   r­   r   r   r   r*   	  ó   z!vmmCreateNetwork._ipv4_toggled_cbc                 C   r´   r<   )Úchange_dhcpv4_enabler¶   r   r   r   r,     r·   z#vmmCreateNetwork._dhcpv4_toggled_cbc                 C   r´   r<   )Úchange_ipv6_enabler¶   r   r   r   r-     r·   z!vmmCreateNetwork._ipv6_toggled_cbc                 C   r´   r<   )Úchange_dhcpv6_enabler¶   r   r   r   r/     r·   z#vmmCreateNetwork._dhcpv6_toggled_cbc                 C   ó"   |   d¡ ¡ }|   d¡ |¡ d S )Nrh   znet-ipv4-box©r    r‘   ry   ©r2   Úenabledr   r   r   rµ     r³   z#vmmCreateNetwork.change_ipv4_enablec                 C   r»   )Nrm   znet-ipv6-boxr¼   r½   r   r   r   r¹     r³   z#vmmCreateNetwork.change_ipv6_enablec                 C   ó8   |   ¡ }|  d¡}|  d¡}t ||¡ t ||¡ d S )Nrk   rl   )r—   r    r   r¬   ©r2   r¾   ÚstartÚendr   r   r   r¸     ó
   

z%vmmCreateNetwork.change_dhcpv4_enablec                 C   r¿   )Nrq   rr   )r™   r    r   r¬   rÀ   r   r   r   rº     rÃ   z%vmmCreateNetwork.change_dhcpv6_enablec                 C   sr   |   ¡ }|d u s|jdkrd S t|jd ƒ}t|jd ƒ}|  d¡ t|j| ƒ¡ |  d¡ t|j| ƒ¡ d S )Né   é   rk   rl   )r¢   ÚversionÚintÚnum_addressesr    rw   r   Únetwork_address©r2   r­   ÚiprÁ   rÂ   r   r   r   r+   '  s   
ÿz(vmmCreateNetwork._change_ipv4_network_cbc                 C   s^   |   ¡ }|d u s|jdkrd S d}d}|  d¡ t|j| ƒ¡ |  d¡ t|j| ƒ¡ d S )Né   é   iÿ  rq   rr   )r¦   rÆ   r    rw   r   rÉ   rÊ   r   r   r   r.   6  s   
ÿz(vmmCreateNetwork._change_ipv6_network_cbc                 C   sN   |  tdƒ|j¡ z	|j |j¡ W n tjy   Y d S w ttd|j ƒƒ‚)Nr   z,Name '%s' already in use by another network.)Úvalidate_generic_namerU   r   r   r`   ÚlibvirtÚlibvirtErrorÚ
ValueError)r2   ru   r   r   r   Ú	_validateI  s   ÿÿzvmmCreateNetwork._validatec                 C   s(   | j  ¡ }t d|¡ t| j ¡ |dS )NzUsing XML from xmleditor:
%s)Úparsexml)r!   Úget_xmlr   r3   r   r   r_   )r2   Úxmlr   r   r   Ú_build_xmlobj_from_xmleditorS  s   
z-vmmCreateNetwork._build_xmlobj_from_xmleditorc           
      C   s”  t | j ¡ ƒ}|  d¡ ¡ |_|  ¡ |_t 	|  d¡¡}|  
¡ }|dkr&d }||j_||j_|jjdkrId|j_|jj ¡ }t 	|  d¡¡|_|S |  ¡ r‡|  ¡ }|j ¡ }|rft|jd ƒ|_t|jƒ|_|  ¡ r‡|j ¡ }|  ¡ }|  ¡ }	|rt|jƒ|_|	r‡t|	jƒ|_|  ¡ rÈ|  ¡ }|j ¡ }d|_ |r§t|jd ƒ|_t|j!ƒ|_"|  #¡ rÈ|j ¡ }|  $¡ }|  %¡ }	|rÀt|jƒ|_|	rÈt|	jƒ|_|S )	Nrc   rC   rJ   rL   Úyesr@   r   Úipv6)&r   r   r_   r    r›   r   rœ   Údomain_namer   r©   r«   Úforwardr®   ÚdevÚmanagedÚpfÚadd_newr’   r¢   Úipsr   rÉ   ÚaddressÚnetmaskr—   Úrangesr¤   r¥   rÁ   rÂ   r”   r¦   ÚfamilyÚ	prefixlenÚprefixr™   r§   r¨   )
r2   ru   r®   rÛ   ÚpfobjrË   ÚipobjÚdhcpobjrÁ   rÂ   r   r   r   Ú_build_xmlobj_from_uiX  s\   
ÿ



z&vmmCreateNetwork._build_xmlobj_from_uic              
   C   sd   z|   ¡ }|r| j ¡ r|  ¡ }|W S  ty1 } z| j tdƒt|ƒ ¡ W Y d }~d S d }~ww )NzError building XML: %s)	ré   r!   Úis_xml_selectedrÖ   r   ÚerrÚshow_errrU   r   )r2   Úcheck_xmleditorr|   Úer   r   r   Ú_build_xmlobj‘  s   &€ÿzvmmCreateNetwork._build_xmlobjc                 C   sJ   |   ¡  |rtdƒt|ƒ }| jj||d d S | jjdd |  ¡  d S )Nz"Error creating virtual network: %s)ÚdetailsT)Úpollnet)Úreset_finish_cursorrU   r   rë   rì   r   Úschedule_priority_tickr%   )r2   Úerrorrð   r   r   r   Ú
_finish_cbš  s   zvmmCreateNetwork._finish_cbc                 C   s^   |}|  ¡ }t d|j|¡ | j ¡  |¡}z| ¡  | d¡ W d S  t	y.   | 
¡  ‚ w )Nz*Creating virtual network '%s' with xml:
%sT)rÔ   r   r3   r   r   r_   ÚnetworkDefineXMLÚcreateÚsetAutostartr   Úundefine)r2   Úasyncjobru   ÚignorerÕ   Únetobjr   r   r   Ú_async_net_create¤  s   ÿþz"vmmCreateNetwork._async_net_createc              
   C   s”   | j dd}|s
d S z|  |¡ W n ty- } z| j tdƒ| ¡W  Y d }~S d }~ww |  ¡  t| j|g| j	g tdƒtdƒ| j
ƒ}| ¡  d S )NT©rí   zError validating network: %szCreating virtual network...z0Creating the virtual network may take a while...)rï   rÒ   r   rë   rì   rU   Úset_finish_cursorr	   rý   rõ   r   Úrun)r2   rû   ru   rî   ÚprogWinr   r   r   r&   ²  s&   
ÿ€ÿ
ûzvmmCreateNetwork.finishc                 C   s(   | j dd}| j |r| ¡ pd¡ d S )NFrþ   ro   )rï   r!   Úset_xmlrÔ   )r2   r­   r|   r   r   r   r#   Ì  s   z,vmmCreateNetwork._xmleditor_xml_requested_cb)NN)+Ú__name__Ú
__module__Ú__qualname__r   r8   r%   r?   r1   r4   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   r   r   r      sR    $

C	
9	
r   )r   Úgi.repositoryr   r   rÏ   Úvirtinstr   r   r   Úlibr   rú   r	   Ú	baseclassr
   Ú	xmleditorr   r   r   r   r   r   r   Ú<module>   s   