o
    `-.                     @   sp   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	m
Z
 dd Zd	d
 Zdd ZG dd deZdS )    N)log   )
vmmGObject)vmmConnectionManager)vmmInspectionApplicationvmmInspectionDatac                 C   s   t  }| |_|S N)r   errorstr)_errstrdata r   5/usr/share/virt-manager/virtManager/lib/inspection.py_inspection_error   s   r   c                 C   s  | j jjs	tdS t }d|_d|_d|_d|_d|_	d|_
d|_d	d
lm} |j }|d|jjd	}t| d |_g |_dD ]?}d	dl}t }d|v rb|d |_|d t|  |_n|d |_|d t|  d |_d|_d|_ d|_!|j"| qD|S )zD
    Return fake vmmInspectionData for use with the test driver
    zFake test error no diskstest_os_typetest_distro{   i  test_hostnametest_product_nametest_product_variantr   )Gtkvm_newrb)
test_app1_
test_app2_Napp1display_namezsummary-namezdescription-
   23)#xmlobjdevicesdiskr   r   os_typedistromajor_versionminor_versionhostnameproduct_nameproduct_variantgi.repositoryr   	IconThemeget_defaultlookup_iconIconSizeLARGE_TOOLBARopenget_filenamereadiconapplicationstimer   r   strsummaryr   descriptionepochversionreleaseappend)vmr   r   	iconthemer4   prefixr6   appr   r   r   _make_fake_data   s8   



rB   c              
   C   sv  ddl }|jddd}|  d |  }z|j| dd |  W n% tyI } zt	d	|t
| ttd
t
| W  Y d}~S d}~ww t	d| | }t|dkrft	d| ttdS |d }||}||}	||}
||}||}||}||}||}d}||}t| dd d}|D ]\}}z
||| d}W q ty   td||| Y qw d}d}|rZ|j|ddd}|du st|dkr|j|ddd}|du st|dkrd}zW||}g }|D ]K}t }|d r|d |_|d r|d |_ |d |_!|d r$|d |_"|d r.|d |_#|d r8|d |_$|d rB|d |_%|&| qW n tyY   td| Y nw ~t	d|||	|
||| t	d| |rxt	dt| |rt	dt| t' }t
||_(t
|	|_)t*|
|_+t*||_,t
||_-t
||_.t
||_/||_0t1|pg |_2t
||_3|S )ze
    Perform the actual guestfs interaction and return results in
    a vmmInspectionData object
    r   NFT)close_on_exitpython_return_dict:r   )readonlyz,%s: Error launching libguestfs appliance: %sz(Error launching libguestfs appliance: %sz"%s: inspection appliance connectedz%s: no operating systems foundz&Inspection found no operating systems.c                 S   s   t | d S )Nr   )len)kr   r   r   <lambda>p   s    z%_perform_inspection.<locals>.<lambda>)keyz)%s: exception mounting %s on %s (ignored))faviconhighquality	app2_nameapp2_display_name
app2_epochapp2_versionapp2_releaseapp2_summaryapp2_descriptionz*%s: exception while listing apps (ignored)z4%s: detected operating system: %s %s %d.%d (%s) (%s)zhostname: %szicon: %d bytesz
# apps: %d)4guestfsGuestFSget_uriget_nameadd_libvirt_domget_backendlaunch	Exceptionr   debugr7   r   _
inspect_osrG   inspect_get_typeinspect_get_distroinspect_get_major_versioninspect_get_minor_versioninspect_get_hostnameinspect_get_product_nameinspect_get_product_variantinspect_get_package_formatinspect_get_mountpointssorteditemsmount_ro	exceptioninspect_get_iconinspect_list_applications2r   r   r   r:   r;   r<   r8   r9   r=   r   r$   r%   intr&   r'   r(   r)   r*   r4   listr5   package_format)connr>   rT   gprettyvmerootsrootr$   r%   r&   r'   r(   r)   r*   rp   filesystems_mountedmpsmpdevr4   appsgappsgapprA   r   r   r   r   _perform_inspection=   s   































r~   c                   @   s   e Zd ZdZedd Ze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 )vmmInspectionNc                 C   s    | j s|  s	d S t | _ | j S r   )	_instancelibguestfs_installedr   )clsr   r   r   get_instance   s
   zvmmInspection.get_instancec                 C   s   | j d u r=zdd l}td d| _ W | j S  ty(   td d| _ Y | j S  ty<   tjddd d| _ Y | j S w | j S )Nr   zpython guestfs is installedTzpython guestfs is not installedFzerror importing guestfs)exc_info)_libguestfs_installedrT   r   r\   ImportErrorr[   )r   ignorer   r   r   r      s$   


z"vmmInspection.libguestfs_installedc                 C   s   t |  |   d | _t | _i | _g | _| j	
 }tdt| |s(d S t }|d| j |d| j |j D ]}| || q?|   d S )Nzlibguestfs gsetting enabled=%sz
conn-addedzconn-removed)r   __init___cleanup_on_app_close_threadqueueQueue_q_cached_data_urisconfigget_libguestfs_inspect_vmsr   r\   r7   r   r   connect_conn_added_cb_conn_removed_cbconnsvalues_start)selfvalconnmanagerrq   r   r   r   r      s    


zvmmInspection.__init__c                 C   s   |    t | _i | _d S r   )_stopr   r   r   r   r   r   r   r   _cleanup   s   

zvmmInspection._cleanupc                 C   sR   |  }|| jv rd S | j| |d| j | D ]
}| ||  qd S )Nzvm-added)rV   r   r=   r   _vm_added_cblist_vmsrW   )r   r   rq   urir>   r   r   r   r      s   
zvmmInspection._conn_added_cbc                 C   s   | j | d S r   )r   remove)r   r   r   r   r   r   r      s   zvmmInspection._conn_removed_cbc                 C   s>   |  }|drtd| d S | j| |  f d S )Nzguestfs-z&ignore libvirt/guestfs temporary VM %s)rW   
startswithr   r\   r   putrV   )r   rq   r>   r   r   r   r   r      s
   
zvmmInspection._vm_added_cbc                 C   s(   t jd| jd| _d| j_| j  d S )Nzinspection thread)r   targetT)	threadingThread_runr   daemonstartr   r   r   r   r     s
   zvmmInspection._startc                 C   s$   | j d u rd S | jd  d | _ d S r   )r   r   r   r   r   r   r   r     s   

zvmmInspection._stopc                 C   sB   	 | j  }|d u rtd d S |\}}| || | j   q)NTz(libguestfs queue vm=None, exiting thread)r   getr   r\   _process_vm	task_done)r   r   r   vmnamer   r   r   r     s   


zvmmInspection._runc           
   
      s   t  }|j|}|sd S ||sd S  fdd}| d   } }| jv rH j|}j	|krFt
d| || d S z |}W n" tyr }	 zttdt|	 }t
d| W Y d }	~	nd }	~	ww || d S )Nc                    s    |  |  j < d S r   )set_inspection_datar   get_uuid)_datar   r>   r   r   _set_vm_inspection_data-  s   
z:vmmInspection._process_vm.<locals>._set_vm_inspection_datarE   zFound cached data for %szError inspection VM: %sz%s: exception while processing)r   r   r   r   get_vm_by_namerV   rW   r   r   
inspectionr   r\   _inspect_vmr[   r   r]   r7   rk   )
r   r   r   r   rq   r   rs   vmuuidr   rt   r   r   r   r   !  s0   


zvmmInspection._process_vmc                 C   s<   | j d u rd S | rttdS | rt|S t||S )Nz&Cannot inspect VM on remote connection)r   	is_remoter   r]   is_testrB   r~   )r   rq   r>   r   r   r   r   B  s   

zvmmInspection._inspect_vmc                 C   s@   t d|  | j| d  | j|j	 | f d S )NzRefresh requested for vm=%s)
r   r\   rW   r   popr   r   r   rq   rV   r   r   r   r   
vm_refreshS  s   zvmmInspection.vm_refresh)__name__
__module____qualname__r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s"    


	!r   )r   r   virtinstr   	baseclassr   r   r   object.domainr   r   r   rB   r~   r   r   r   r   r   <module>   s   '~