o
    pb1V                     @   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 Z	G dd	 d	Z
G d
d deZe ZG dd dZG dd deZG dd deZG dd deZdS )    N)	Libosinfo   )xmlutil)logc                 C   s*   t tjdstj| d S tj| d dS )Ncreate_from_location_with_flagsr   )hasattrr   Mediacreate_from_locationr   )location r   */usr/share/virt-manager/virtinst/osdict.py_media_create_from_location   s
   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_OsinfoIterzX
    Helper to turn osinfo style get_length/get_nth lists into python
    iterables
    c                 C   s0   d| _ || _d| _| jr| j d | _d S d S )Nr   r   )currentlistobjhigh
get_length)selfr   r   r   r   __init__#   s   z_OsinfoIter.__init__c                 C   s   | S Nr   r   r   r   r   __iter__*   s   z_OsinfoIter.__iter__c                 C   s0   | j | jkrt| j| j }|  j d7  _ |S )Nr   )r   r   StopIterationr   get_nth)r   retr   r   r   __next__,   s
   z_OsinfoIter.__next__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s
    r   c                   @   sj   e Zd ZdZdd Zedd Zedd Zedd	 ZdddZ	dddZ
dd Zdd ZdddZdS )_OSDBz(
    Entry point for the public API
    c                 C   s   d | _ d | _d S r   )_OSDB__os_loader_OSDB__os_genericr   r   r   r   r   8   s   
z_OSDB.__init__c                 C   s:   | j st }|dd |dtd t|| _ | j S )Nzshort-idgenericnamez0Generic or unknown OS. Usage is not recommended.)r#   r   Os	set_param_
_OsVariantr   or   r   r   _os_generic@   s   
z_OSDB._os_genericc                 C   s"   | j st }|  || _ | j S r   )r"   r   Loaderprocess_default_path)r   loaderr   r   r   
_os_loaderK   s
   z_OSDB._os_loaderc                 C   
   | j  S r   )r0   get_dbr   r   r   r   _os_dbT   s   
z_OSDB._os_dbFc                 C   s4   | j |}|d u r|rttd| d S t|S )NzUnknown libosinfo ID '%s')r3   get_os
ValueErrorr(   r)   )r   full_idraise_errorosobjr   r   r   lookup_os_by_full_id\   s   z_OSDB.lookup_os_by_full_idc                 C   sl   || j jkr	| j S t }|tj| | j |	 }t
|dkr0|r.ttd| d S t|d S )Nr   z;Unknown OS name '%s'. See `--osinfo list` for valid values.)r,   r%   r   Filteradd_constraintPRODUCT_PROP_SHORT_IDr3   get_os_listnew_filteredget_elementslenr5   r(   r)   )r   keyr7   fltoslistr   r   r   	lookup_osd   s   z_OSDB.lookup_osc              
   C   sh   zt |}W n ty! } ztdt| W Y d }~d S d }~ww | j|s*d S |  t	|fS )Nz)Error creating libosinfo media object: %s)
r   	Exceptionr   debugstrr3   identify_mediar4   get_short_id_OsMedia)r   r
   mediaer   r   r   guess_os_by_isos   s   z_OSDB.guess_os_by_isoc              
   C   s   | dr	d| }t r| dsd S z	tj|d }W n ty9 } ztd|t	| W Y d }~d S d }~ww t
| jdrR| j|sHd S |  t|fS | j|\}}|s^d S | t|fS )N/zfile://zfile:z9Error creating libosinfo tree object for location=%s : %sidentify_tree)
startswithr   in_testsuiter   Treer	   rE   r   rF   rG   r   r3   rO   r4   rI   _OsTreeguess_os_from_tree)r   r
   treerL   r8   treeobjr   r   r   guess_os_by_tree~   s*   
z_OSDB.guess_os_by_treer%   c                    sJ   dd | j   D }|| j dd  fdd}tt||dS )zU
        List all OSes in the DB, sorting by the passes _OsVariant attribute
        c                 S   s   g | ]}t |qS r   )r)   ).0osentr   r   r   
<listcomp>       z!_OSDB.list_os.<locals>.<listcomp>c                 S   s   |   r
t| d S |  S )Nr   )isdigitintlower)textr   r   r   to_int   s   z_OSDB.list_os.<locals>.to_intc                    s$   t |  }fddtd|D S )Nc                    s   g | ]} |qS r   r   )rX   c)r`   r   r   rZ      r[   z7_OSDB.list_os.<locals>.alphanum_key.<locals>.<listcomp>z([0-9]+))getattrresplit)objvalsortkeyr`   r   r   alphanum_key   s   
z#_OSDB.list_os.<locals>.alphanum_key)rA   )r3   r=   r?   appendr,   listsorted)r   rh   rC   ri   r   rg   r   list_os   s   z_OSDB.list_osN)Fr%   )r   r   r   r    r   propertyr,   r0   r3   r9   rD   rM   rW   rm   r   r   r   r   r!   4   s    





r!   c                   @   sT   e Z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 )_OsResourcesc                 C   s   |  || _|  || _d S r   )_convert_to_dict_minimum_recommendedr   minimumrecommendedr   r   r   r      s   z_OsResources.__init__c                 C   sJ   i }t |D ]}i }| |d< | |d< | |d< ||| < q|S )z~
        Convert an OsResources object to a dictionary for easier
        lookups. Layout is: {arch: {strkey: value}}
        ramn-cpusstorage)r   get_ram
get_n_cpusget_storageget_architecture)r   	resourcesr   rvalsr   r   r   rq      s   z_OsResources._convert_to_dictc                 C   s6   |dfD ]}| |i  |d}|dkr|  S qd S )Nallr   )get)r   r~   rA   arch	checkarchrf   r   r   r   _get_key   s   z_OsResources._get_keyc                 C   s(   |  | j||}|r|dkr|S d S d S )Nr   )r   rr   r   rA   r   rf   r   r   r   _get_minimum_key   s   z_OsResources._get_minimum_keyc                 C   sJ   |  | j||}|r|dkr|S | ||}|r#td|| |d S d S )Nr   z=No recommended value found for key='%s', using minimum=%s * 2   )r   rs   r   r   rF   r   r   r   r   _get_recommended_key   s   z!_OsResources._get_recommended_keyc                 C      |  d|S Nrw   )r   r   r   r   r   r   get_minimum_ram      z_OsResources.get_minimum_ramc                 C   r   r   r   r   r   r   r   get_recommended_ram   r   z _OsResources.get_recommended_ramc                 C   r   )Nrx   r   r   r   r   r   get_recommended_ncpus   r   z"_OsResources.get_recommended_ncpusc                 C   r   )Nry   r   r   r   r   r   get_recommended_storage   r   z$_OsResources.get_recommended_storageN)r   r   r   r   rq   r   r   r   r   r   r   r   r   r   r   r   rp      s    rp   c                   @   s\  e Zd Zdd Zdd Z		dOddZd	d
 ZdPddZdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdQddZdQddZdQdd ZdQd!d"ZdQd#d$ZdQd%d&ZdQd'd(ZdQd)d*ZdQd+d,ZdQd-d.ZdQd/d0Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z dQd?d@Z!dAdB Z"dCdD Z#dEdF Z$dGdH Z%dIdJ Z&dKdL Z'dMdN Z(dS )Rr)   c                 C   s   || _ | j  g| _t| j dr| j  | _| jd | _ttt| j| _	| j 
 | _| j  | _| j  | _| j  p>d| _| j  pFd| _| j  | _|  | _d S )Nget_short_id_listr    )_osrI   
_short_idsr   r   r%   rk   rl   set	all_names
get_family_familyget_idr6   get_namelabelget_codenamecodename
get_distrodistroget_versionversion_get_eoleolr*   r   r   r   r      s   z_OsVariant.__init__c                 C   s   d| j j| jf S )Nz<%s name=%s>)	__class__r   r%   r   r   r   r   __repr__     z_OsVariant.__repr__NTc                    s   |p| j }| |v rdS g   fdd}|r"||tjj  |r/||tjj  |r<||tjj   D ]}| |v sP| j	|||||drS dS q>dS )NTc                    s    | D ]}| vr  | qd S r   )rj   )newlre   
check_listr   r   _extend  s
   
z*_OsVariant._is_related_to.<locals>._extend)r8   check_upgradescheck_derivescheck_clonesF)
r   rI   get_relatedr   ProductRelationshipDERIVES_FROMr?   CLONESUPGRADES_is_related_to)r   related_os_listr8   r   r   r   r   checkobjr   r   r   r   	  sD   
z_OsVariant._is_related_toc                 C      t t| j S r   )rk   r   r   get_all_devicesr   r   r   r   _get_all_devices)  r   z_OsVariant._get_all_devicesc                 C   s   g }|pg }|   D ]}|r| |vrq
|r t|| s q
||  q
|p+g }|D ]}| |vr7q.||  q.|S r   )r   r   rc   match	get_classrj   r   )r   devidscls
extra_devsr   devr   r   r   _device_filter,  s   z_OsVariant._device_filterc                 C   s   | j  }| j  }| j tjpd }dd }tj }|d ur&|||kS |dkr,dS |d ur>||tjdd }||kS dS )Nc                 S   s"   d|   |  f }tj|dS )Nz%s-%sz%Y-%j)get_yearget_day_of_yeardatetimestrptime)glibdatedater   r   r   _glib_to_datetimeL  s   z._OsVariant._get_eol.<locals>._glib_to_datetimerollingFiB  )days)	r   get_eol_dateget_release_dateget_param_valuer   OS_PROP_RELEASE_STATUSr   today	timedelta)r   r   relrelease_statusr   nowrel5r   r   r   r   C  s"   


z_OsVariant._get_eolc                 C      | j S r   )r   r   r   r   r   
get_handlec     z_OsVariant.get_handlec                 C   s
   | j dkS )Nr$   rn   r   r   r   r   
is_genericf     
z_OsVariant.is_genericc                 C   s   t d| jS )Nzlinux\d\d\d\d)rc   r   r%   r   r   r   r   is_linux_generici  s   z_OsVariant.is_linux_genericc                 C   s
   | j dv S )N)win9xwinntwin16)r   r   r   r   r   
is_windowsl  r   z_OsVariant.is_windowsc                 C   s   |   s	| jdv rdS dS )N)solaris	localtimeutc)r   r   r   r   r   r   	get_clocko  s   z_OsVariant.get_clockc                 C   s   | j ddS )Nnet)r   )r   r   r   r   r   supported_netmodelst  r   z_OsVariant.supported_netmodelsc                 C      ddg}t | j||dS )Nzhttp://pcisig.com/pci/1af4/1001zhttp://pcisig.com/pci/1af4/1042r   r   boolr   r   r   r   r   r   r   supports_virtiodiskw     z_OsVariant.supports_virtiodiskc                 C   r   )Nzhttp://pcisig.com/pci/1af4/1004zhttp://pcisig.com/pci/1af4/1048r   r   r   r   r   r   supports_virtioscsi}  r   z_OsVariant.supports_virtioscsic                 C   r   )Nzhttp://pcisig.com/pci/1af4/1000http://pcisig.com/pci/1af4/1041r   r   r   r   r   r   supports_virtionet  r   z_OsVariant.supports_virtionetc                 C   r   )Nzhttp://pcisig.com/pci/1af4/1005zhttp://pcisig.com/pci/1af4/1044r   r   r   r   r   r   supports_virtiorng  r   z_OsVariant.supports_virtiorngc                 C      dg}t | j||dS )Nzhttp://pcisig.com/pci/1af4/1050r   r   r   r   r   r   supports_virtiogpu     z_OsVariant.supports_virtiogpuc                 C   r   )Nzhttp://pcisig.com/pci/1af4/1002zhttp://pcisig.com/pci/1af4/1045r   r   r   r   r   r   supports_virtioballoon  r   z!_OsVariant.supports_virtioballoonc                 C   s$   ddg}| j ||drdS | dS )Nzhttp://pcisig.com/pci/1af4/1003zhttp://pcisig.com/pci/1af4/1043r   Tzrhel6.0)r   r   r   r   r   r   supports_virtioserial  s   
z _OsVariant.supports_virtioserialc                 C   r   )Nzhttp://pcisig.com/pci/1af4/1052r   r   r   r   r   r   supports_virtioinput  r   z_OsVariant.supports_virtioinputc                 C   r   )Nzhttp://pcisig.com/pci/1b36/0004r   r   r   r   r   r   supports_usb3  r   z_OsVariant.supports_usb3c                 C   r   )Nr   r   r   r   r   r   r   supports_virtio1  r   z_OsVariant.supports_virtio1c                 C   s4   | j |dr| j|dsdS dg}t| j||dS )N)r   Fzhttp://qemu.org/chipset/x86/q35r   )r   r   r   r   r   r   r   r   supports_chipset_q35  s   
z_OsVariant.supports_chipset_q35c                 C   s   t | jdr| j  S g S )Nget_complete_firmware_list)r   r   r   r?   r   r   r   r   _get_firmware_list  s   z_OsVariant._get_firmware_listc                 C   s<   |   }|D ]}| |krq| |kr|   S q|S r   )r   r}   get_firmware_typeis_supported)r   r%   r   default	firmwaresfirmwarer   r   r   _supports_firmware_type  s   z"_OsVariant._supports_firmware_typec                 C   sb   d}z|  d|d}|  d|d}|o| }W n ty'   tjddd Y nw | jdkr/d}|S )NFefibiosTz&Error checking osinfo firmware support)exc_infowin11)r   rE   r   rF   r%   )r   r   r   supports_efisupports_biosr   r   r   requires_firmware_efi  s   
z _OsVariant.requires_firmware_efic                 C   s   | j  }| j  }t||S r   )r   get_minimum_resourcesget_recommended_resourcesrp   rt   r   r   r   r	    s   


z$_OsVariant.get_recommended_resourcesc                 C   sT   t | jdr&| j }t|D ]}| }||jjks|dkr%|   S qd S d S )Nget_network_install_resourcesr   )r   r   r
  r   r}   osr   rz   )r   guestr~   r   r   r   r   r    get_network_install_required_ram  s   
z+_OsVariant.get_network_install_required_ramc                 C   sB   t | jdr| j }|dur|S | jdv rdS | jdvrdS dS )z
        Kernel argument name the distro's installer uses to reference
        a network source, possibly bypassing some installer prompts
        get_kernel_url_argumentN)caaspslesledslesopensuseinstall)centosrhelfedoraz	inst.repo)r   r   r  r   )r   osargr   r   r   get_kernel_url_arg  s   


z_OsVariant.get_kernel_url_argc                 C   s   t tjds|D ]}| |kr|   S qd S d }|dkr"d}n|dkr)d}n|s-d}|D ]$}| |kr8q/| }|}t|D ]}|| v rR|     S qBq/|rZ| S d S )Nget_os_variantsjeosServerdesktopWorkstation
Everything)r   r   rR   r}   get_urlr  r   r   )r   treelistr   profilerU   fallback_treevariant_listvariantr   r   r   _get_generic_location  s4   z _OsVariant._get_generic_locationc                 C   sV   t t| j }|sttd| j | |||}|r|S ttd| j|d )Nz$OS '%s' does not have a URL locationzPOS '%(osname)s' does not have a URL location for the architecture '%(archname)s')osnamearchname)rk   r   r   get_tree_listRuntimeErrorr(   r%   r&  )r   r   r"  r!  r
   r   r   r   get_location  s   
z_OsVariant.get_locationc                 C   r   r   )rk   r   r   get_install_script_listr   r   r   r   r,  0  r   z"_OsVariant.get_install_script_listc                 C   sD   g }t t| j }|D ]}|dkr| |krq|| q|S )Nr   )rk   r   r   get_device_driversr}   rj   )r   r   installable_driversdevice_driversdevice_driverr   r   r   _get_installable_drivers3  s   z#_OsVariant._get_installable_driversc                 C   s.   |  |}g }|D ]}| r|| q	|S r   )r1  get_pre_installablerj   )r   r   r.  pre_inst_driversdriverr   r   r   _get_pre_installable_drivers=  s   

z'_OsVariant._get_pre_installable_driversc                 C   s@   g }|D ]}|  }|D ]}tj| |}|| qq|S r   )	get_filesr  pathjoinr+  rj   )r   drivers	locationsr4  	filenamesfilenamer
   r   r   r   _get_drivers_locationE  s   z _OsVariant._get_drivers_locationc                 C   s   |  |}| |S r   )r5  r=  )r   r   r3  r   r   r   $get_pre_installable_drivers_locationN  s   

z/_OsVariant.get_pre_installable_drivers_locationc                 C   s0   |  |}g }|D ]}|tt| 7 }q	|S r   )r5  rk   r   get_devices)r   r   r9  devicesr4  r   r   r   get_pre_installable_devicesS  s
   
z&_OsVariant.get_pre_installable_devicesc                 C   s   |  |rdS dS )NTF)r5  r   r   r   r   supports_unattended_driversZ  s   
z&_OsVariant.supports_unattended_drivers)NTTT)NNNr   ))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,  r1  r5  r=  r>  rA  rB  r   r   r   r   r)      sR    
 
 







	




	r)   c                   @   sD   e Z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 )rJ   c                 C   
   || _ d S r   _media)r   osinfo_mediar   r   r   r   a  r   z_OsMedia.__init__c                 C   r1   r   )rE  get_kernel_pathr   r   r   r   rG  d  r   z_OsMedia.get_kernel_pathc                 C   r1   r   )rE  get_initrd_pathr   r   r   r   rH  f  r   z_OsMedia.get_initrd_pathc                 C   r1   r   )rE  supports_installer_scriptr   r   r   r   rI  h  r   z"_OsMedia.supports_installer_scriptc                 C   s2   t t| j }|D ]}d| v r dS qdS )NnetinstTF)rk   r   rE  r  r   )r   variantsr%  r   r   r   
is_netinstk  s   z_OsMedia.is_netinstc                 C   r   r   )rk   r   rE  r,  r   r   r   r   r,  r  r   z _OsMedia.get_install_script_listc                 C   r   r   rD  r   r   r   r   get_osinfo_mediau  r   z_OsMedia.get_osinfo_mediaN)
r   r   r   r   rG  rH  rI  rL  r,  rM  r   r   r   r   rJ   `  s    rJ   c                   @   s   e Zd Zdd Zdd ZdS )rS   c                 C   rC  r   _tree)r   osinfo_treer   r   r   r   z  r   z_OsTree.__init__c                 C   r   r   rN  r   r   r   r   get_osinfo_tree}  r   z_OsTree.get_osinfo_treeN)r   r   r   r   rQ  r   r   r   r   rS   y  s    rS   )r   r  rc   gi.repositoryr   r   r   loggerr   r   r   objectr!   OSDBrp   r)   rJ   rS   r   r   r   r   <module>   s    v=  t