o
    ïì¿`,$  ã                   @   s†   d dl Z d dl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 edƒ\ZZZZZZZd	d
„ ZG dd„ deƒZdS )é    N)ÚGtk)Úlogé   )Úuiutil)ÚvmmGObjectUI)ÚvmmConnectionManageré   c                   C   s†   t j d¡rt j d¡st j d¡rdS t j d¡s1t j d¡s1t j d¡s1t j d¡s1t d	¡r3d
S t j d¡s?t j d¡rAdS d S )Nz/var/lib/xenz/dev/xen/evtchnz	/proc/xenzxen:///z/usr/bin/qemuz/usr/bin/qemu-kvmz/usr/bin/kvmz/usr/libexec/qemu-kvmz/usr/bin/qemu-system-*zqemu:///systemz/usr/lib/libvirt/libvirt_lxcz/usr/lib64/libvirt/libvirt_lxczlxc:///)ÚosÚpathÚexistsÚglob© r   r   ú1/usr/share/virt-manager/virtManager/createconn.pyÚ_default_uri   s(   
ÿ
ÿ
þ
ýü
ÿr   c                   @   s¸   e Zd Zedd„ ƒZdd„ Zedd„ ƒZd*dd	„Zd*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S )+ÚvmmCreateConnc              
   C   sV   z| j stƒ | _ | j W S  ty* } z|j tdƒt|ƒ ¡ W Y d }~d S d }~ww )Nz"Error launching connect dialog: %s)Ú	_instancer   Ú	ExceptionÚerrÚshow_errÚ_Ústr)ÚclsÚ	parentobjÚer   r   r   Úget_instance0   s   ÿ€ÿzvmmCreateConn.get_instancec              
   C   sT   t  | dd¡ |  ¡  | j | j| j| j| j| j	| j
| j	dœ¡ |  ¡  |  ¡  d S )Nzcreateconn.uizvmm-open-connection)Úon_hypervisor_changedÚon_connect_remote_toggledÚon_username_entry_changedÚon_hostname_changedÚon_cancel_clickedÚon_connect_clickedÚ#on_vmm_open_connection_delete_event)r   Ú__init__Ú_cleanup_on_app_closeÚbuilderÚconnect_signalsÚhypervisor_changedÚconnect_remote_toggledÚusername_changedÚhostname_changedÚcancelÚ	open_connÚset_initial_stateÚreset_state©Úselfr   r   r   r"   :   s   øzvmmCreateConn.__init__c                   C   s   t ƒ S ©N)r   r   r   r   r   Údefault_uriL   s   zvmmCreateConn.default_uriNc                 C   s   t  d¡ |  ¡  dS )NzCancelling open connectionr   )r   ÚdebugÚclose©r/   Úignore1Úignore2r   r   r   r*   P   s   
zvmmCreateConn.cancelc                 C   s   t  d¡ | j ¡  d S )NzClosing open connection)r   r2   ÚtopwinÚhider4   r   r   r   r3   U   s   
zvmmCreateConn.closec                 C   sB   t  d¡ |  ¡ r| j ¡  d S |  ¡  | j |¡ | j ¡  d S )NzShowing open connection)r   r2   Ú
is_visibler7   Úpresentr-   Úset_transient_for)r/   Úparentr   r   r   ÚshowZ   s   

zvmmCreateConn.showc                 C   s   d S r0   r   r.   r   r   r   Ú_cleanupd   s   zvmmCreateConn._cleanupc                    sÊ   ˆ  d¡ ¡  ˆ  d¡}t tt¡‰ ‡ ‡fdd„}|tddƒ |tddtdƒ ƒ |t	d	d
ƒ |t
ddƒ |tddƒ |tddƒ |dd dƒ |td tdƒƒ | ˆ ¡ t |d¡ dd„ }| |¡ d S )NÚconnectÚ
hypervisorc                    s.   ˆj jr|r|ˆj jv rˆ  | |g¡ d S d S r0   )ÚconfigÚdefault_hvsÚappend)ÚrowidÚconfig_nameÚlabel©Úmodelr/   r   r   Ú_add_hv_rown   s   ÿÿz4vmmCreateConn.set_initial_state.<locals>._add_hv_rowÚqemuzQEMU/KVMz	QEMU/KVM zuser sessionÚxenÚXenÚlxczLibvirt-LXCÚbhyveÚBhyveÚvzÚ	VirtuozzoéÿÿÿÿÚ zCustom URI...r   c                 S   s   | | d dkS )Nr   rR   r   )rH   Úitr   r   r   Úsepfunc~   s   z0vmmCreateConn.set_initial_state.<locals>.sepfunc)ÚwidgetÚgrab_defaultr   Ú	ListStoreÚintr   ÚHV_QEMUÚHV_QEMU_SESSIONr   ÚHV_XENÚHV_LXCÚHV_BHYVEÚHV_VZÚ	HV_CUSTOMÚ	set_modelr   Úinit_combo_text_columnÚset_row_separator_func)r/   ÚcomborI   rU   r   rG   r   r,   g   s    

zvmmCreateConn.set_initial_statec                 C   s„   |   ¡  |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  |  d¡¡ |  ¡  d S )	NÚautoconnectTÚhostnamerS   úconnect-remoteFúusername-entryú	uri-entry)Úset_default_hypervisorrV   Úset_sensitiveÚ
set_activeÚset_textr'   Úpopulate_urir.   r   r   r   r-   ‚   s   zvmmCreateConn.reset_statec                 C   s   |   d¡ ¡ S )Nrg   )rV   Ú
get_activer.   r   r   r   Ú	is_remote   s   zvmmCreateConn.is_remotec                 C   sP   |   ¡ }|r| d¡rt |  d¡t¡ d S | d¡r&t |  d¡t¡ d S d S )NrJ   r@   rK   )r1   Ú
startswithr   Úset_list_selectionrV   rZ   r\   )r/   Údefaultr   r   r   rj   ‘   s   
ÿz$vmmCreateConn.set_default_hypervisorc                 C   ó   |   ¡  d S r0   ©rn   ©r/   Ú
src_ignorer   r   r   r)   ˜   ó   zvmmCreateConn.hostname_changedc                 C   sî   |}t  |  d¡¡}|tk}|tk}| o| }t  |  d¡|¡ t  |  d¡|¡ t  |  d¡|¡ t  |  d¡|¡ |sF|  d¡ d¡ t  |  d¡| ¡ t  |  d¡|¡ |rq|  d¡ ¡ }|  d¡ |¡ |  d¡ 	¡  |  
¡  d S )	Nr@   zsession-warning-boxrg   rh   rf   Fú	uri-labelri   )r   Úget_list_selectionrV   r[   r`   Úset_grid_row_visiblerl   Úget_textrm   Ú
grab_focusrn   )r/   ÚsrcÚignoreÚhvÚ
is_sessionÚ	is_customÚshow_remoterF   r   r   r   r&   ›   s4   
ÿ
ÿ
ÿ
ÿz vmmCreateConn.hypervisor_changedc                 C   rt   r0   ru   rv   r   r   r   r(   ´   rx   zvmmCreateConn.username_changedc                 C   sh   |   ¡ }|  d¡ |¡ |  d¡ | ¡ |  d¡ |¡ |r.|  d¡ ¡ s.|  d¡ d¡ |  ¡  d S )Nrf   re   rh   Úroot)rp   rV   rk   rl   r|   rm   rn   )r/   rw   rp   r   r   r   r'   ·   s   z$vmmCreateConn.connect_remote_toggledc                 C   s   |   ¡ }|  d¡ |¡ d S )Nry   )Úgenerate_urirV   rm   )r/   Úurir   r   r   rn   Á   s   zvmmCreateConn.populate_uric           	      C   s  t  |  d¡¡}|  d¡ ¡  ¡ }|  d¡ ¡ }|  ¡ }d}|tkr%d}n|tks-|tkr0d}n|t	kr7d}n	|t
kr>d}nd	}d}|rN|tj |¡d
 7 }| d¡dkrYd| }||7 }|rfd| d }nd}|| }|tt	t
fv ry|d7 }|S |tkr|d7 }|S )Nr@   rf   rh   rS   rK   rJ   rN   rP   rM   ú@ú:r   z[%s]z+ssh://ú/z:///ÚsystemÚsession)r   rz   rV   r|   Ústriprp   r\   rZ   r[   r^   r_   ÚurllibÚparseÚquoteÚcount)	r/   r€   ÚhostÚuserrp   ÚhvstrÚaddrstrÚhoststrr†   r   r   r   r…   Å   s<   ýzvmmCreateConn.generate_uric                 C   s6   |   ¡ }|  d¡ ¡ }|r|stdƒ}| j |¡S dS )Nrf   z.A hostname is required for remote connections.T)rp   rV   r|   r   r   Úval_err)r/   rp   r‘   Úmsgr   r   r   Úvalidateì   s   zvmmCreateConn.validatec                 C   s„   |s|   ¡  |  ¡  d S |\}}}|d7 }|tdƒ7 }| jj|||tjjtjj	dd}|  ¡  |r7|   ¡  d S t
 ¡  | ¡ ¡ d S )Nz

z1Would you still like to remember this connection?T)ÚbuttonsÚdialog_typeÚmodal)r3   Úreset_finish_cursorr   r   r   r   ÚButtonsTypeÚYES_NOÚMessageTypeÚQUESTIONr   r   Úremove_connÚget_uri)r/   ÚconnÚConnectErrorr—   ÚdetailsÚtitleÚrememberr   r   r   Ú_conn_open_completedö   s   
þz"vmmCreateConn._conn_open_completedc                 C   s¶   |   ¡ sd S d}|  d¡ ¡ rt|  d¡ ¡ ƒ}|  d¡ ¡ r$|  ¡ }n|  d¡ ¡ }t 	d||¡ t
 ¡  |¡}| |¡ | ¡ rJ|  |d ¡ d S | d| j¡ |  ¡  | ¡  d S )NFre   ry   ri   zGenerate URI=%s, auto=%szopen-completed)r˜   rV   Úget_sensitiveÚboolro   r9   r…   r|   r   r2   r   r   Úadd_connÚset_autoconnectÚ	is_activer¨   Úconnect_onceÚset_finish_cursorÚopen)r/   r   Úautor†   r£   r   r   r   r+   	  s"   

zvmmCreateConn.open_conn)NN)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r"   Ústaticmethodr1   r*   r3   r=   r>   r,   r-   rp   rj   r)   r&   r(   r'   rn   r…   r˜   r¨   r+   r   r   r   r   r   /   s.    
	




'
r   )r   r	   Úurllib.parser   Úgi.repositoryr   Úvirtinstr   Úlibr   Ú	baseclassr   Úconnmanagerr   ÚrangerZ   r\   r]   r[   r^   r_   r`   r   r   r   r   r   r   Ú<module>   s$   ú