
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
`f              E   @   s\  d Z ddlmZmZmZmZ ddlZ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 ye W n ek
r   eZY nX yddlZdZW n ek
r   dZY nX yddlZddlZdZW n ek
r   dZY nX yddlZdZW n ek
r   dZY nX ddlZejd	dd
Zeeds4eje_ejZddlZddl	m Z  yddl!m"Z"m#Z# dZ$W n^ ek
r   yddl%m"Z"m#Z# dZ$W n. ek
r   ddl&m'Z'm(Z(m)Z) dZ$Y nX Y nX yddl*Z*W n ek
r   dZ*Y nX ej+j,d yddl-m.Z/ dZ0W n ek
r(   dZ0Y nX da1er8dnda2dd Z3t2rNdne3 Z4e4rxej5  e j6 Z7e7j8de4  dd Z9dd Z:dd Z;dd Z<dd Z=dd  Z>d!d" Z?d#d$ Z@d%d& ZAd'd( ZBd)d* ZCd+d, ZDd-d. ZEd/d0 ZFd1d2 ZGd3d4 ZHd5d6 ZId7d8 ZJd9d: Z.eKd;krXx<e. D ]2ZLx&eLjM D ]ZNeOd<eNeLeN f  q0W eO q"W dS )=z1Used to read hardware info from kudzu, /proc, etc    )gethostnamegetaddrinfoAF_INETAF_INET6N)config)	rhnserver)ustrTFzrhn-client-tools)Zfallbackugettext)
up2dateLog)get_devicesget_computer_info   )check_hal_dbus_statusget_hal_computerread_halz/usr/share/rhsm)Hardwarec               C   s   t tdsd S tj S )Nget_warnings)hasattr	dmidecoder    r   r   /usr/lib/python3.6/hardware.pydmi_warnings]   s    
r   z.Warnings collected during dmidecode import: %sc           	   C   s   t dkrtrdS tj } | jtj y6| jd}t }|rXtj  t	j
 }|jd|  W n    dat }|rxtj  dS |j a t S )z= Initialize _dmi_data unless it already exist and returns it Nallzdmidecode warnings: %sr   )	_dmi_data_dmi_not_availabler   ZdmidecodeXMLZSetResultTypeZ
DMIXML_DOCZQuerySectionr   clear_warningsr
   initLog	log_debugZxpathNewContext)Zdmixmldatadmi_warnlogr   r   r   _initialize_dmi_datai   s(    
r!   c             C   s6   t  }|dkrdS |j| }|g kr.|d jS dS dS )z Fetch DMI data from given section using given path.
        If data could not be retrieved, returns empty string.
        General method and should not be used outside of this module.
    N r   )r!   Z	xpathEvalZcontent)pathZdmi_datar   r   r   r   get_dmi_data   s    

r$   c               C   s   t dS )zt Return Vendor from dmidecode bios information.
        If this value could not be fetch, returns empty string.
    z/dmidecode/BIOSinfo/Vendor)r$   r   r   r   r   
dmi_vendor   s    r%   c              C   s   t d} | sd} | S )zt Return UUID from dmidecode system information.
        If this value could not be fetch, returns empty string.
    z7/dmidecode/SystemInfo/SystemUUID[not(@unavailable='1')]r"   )r$   )Zuuidr   r   r   dmi_system_uuid   s    r&   c              C   s   t jdt jsi S tddj } i }d|d< x`| D ]X}t|s@q2|jd}t|dkrXq2|d j }||d< dj|dd  j ||d < q2W |S )	Nz/etc/sysconfig/installinforZINSTALLINFOclass=r   r   r"   )	osaccessR_OKopen	readlineslensplitstripjoin)ZinstallinfoZinstalldictinfovalsstrippedstringr   r   r   read_installinfo   s    

"r6   c                 sH   yt jd} W n tk
r&   g } Y nX tjd t fdd| D S )z returns number of CPU in system

    Beware that it can be different from number of active CPU (e.g. on s390x architecture
    z/sys/devices/system/cpu/z^cpu[0-9]+$c                s   g | ]} j |r|qS r   )match).0i)re_cpur   r   
<listcomp>   s    zcpu_count.<locals>.<listcomp>)r*   listdirOSErrorrecompiler/   )Zcpu_dirr   )r:   r   	cpu_count   s    

r@   c              C   s  yt rt j d S W n   Y nX d} tjdtjry^tjdj }d}x6|D ].}|jdr`qPt	|j
dd }||krP|}qPW |dkrd| S W n   Y nX tjd	tjr$ydtd	d
j }t }x4|D ],}d|krt	|j
dd j }|j| qW t|dkrt|S W n   Y nX tjdtjryFtjdj }d}x |D ]}d|krN|d7 }qNW |dkrx|S W n   Y nX d S )Nzcpu.cpu_socket(s)r   z/usr/bin/lscpuz/usr/bin/lscpu -pr   #,   z/proc/cpuinfor'   zphysical id:z/usr/sbin/dmidecodez /usr/sbin/dmidecode -t processorzProcessor InformationrE   )subscription_manager_availableSubManHardwareZ
getCpuInfor*   r+   X_OKpopenr.   
startswithintr0   r,   r-   setr1   addr/   )number_socketslinesZmax_socket_indexlineZsocket_indexZ
socket_idscountr   r   r   __get_number_sockets   sX    





rR   c              C   sx  dd } dd }t jdt js"i S tr4tjtjd tddj }t j d j	 }t
 }d	d
d}|d dkr~|dFd  dks|dkrz||}|dkrd|d< nd|d< ||d< | |d|d< | |d|d< | |d|d< | |d|d< | |d|d< | |d|d< | |d|d< | |d |d!< | |d"}|d#kr:d$}yttt|d% |d&< W n tk
rt   dG|d&< Y nX n||dHkrp||}d'|d< | |d)|d< | |d*|d< | |d+|d< | |d,|d< d-| |d.| |d/f |d0< | |d1|d< d#|d< | |d|d< | |d2|d!< | |d3}|j }y ttt|d d4 |d&< W n tk
rj   dI|d&< Y nX n|dJkr.||}||d< ||d< | |d6|d< | |d7|d< | |d8|d< | |d9|d< | |d|d< |d" }yttt|d% |d&< W n tk
r   dK|d&< Y nX | |d:|d!< n|dLkr||}||d< ||d< | |d*|d< | |d9|d< | |d|d< | |d<|d< | |d=d dM }yttt|d% |d&< W n tk
r   dN|d&< Y nX n|dOkri }xH|jdAD ]:}	|	jdB}
t|
dkrq|
d% j ||
d j < qW ||d< | |d|d< ||d< ||d< | |dC|d< d#|d< d#|d< d#|d< d#|d< | |d:|d!< d|d&< nX||d< ||d< ||d< ||d< d#|d< d#|d< d#|d< d#|d< d#|d< d#|d!< d|d&< |d s
d%|d< n@yt|d |d< W n   d%|d< Y nX |d dkrJd%|d< tj }|jjdDrtt }|rt||dE< |S )PNc             S   s   |j  }|| krdS | | S )Nr"   )lower)aentryer   r   r   	get_entry   s    zread_cpuinfo.<locals>.get_entryc             S   s   d}i }x| j dD ]|}t|s"q|d }|dkr4P xZ|j dD ]L}t|sNq@|j d}t|dkrfq@|d j |d j  }}|||j < q@W qW |S )Nr   z

r   
rD   rC   )r0   r/   r1   rS   )cpulistrQ   tmpdictcpuZcpu_attrr4   namevaluer   r   r   get_cpulist_as_dict  s"    
z)read_cpuinfo.<locals>.get_cpulist_as_dictz/proc/cpuinfoCr'      ZCPUZ	Processor)r(   Zdescr   r9   rC   86x86_64platformZi386rQ   Z	vendor_idtypez
model nameZmodelz
cpu familyZmodel_numberZ	model_verZsteppingZ	model_revz
cache sizecacheZbogomipsflagsotherzcpu mhzr"   z-1r   Zspeedalphaalphaev6zcpus detectedr[   z	cpu modelzcpu variationz%s/%szsystem typezsystem variationZmodel_versionzcpu revisionzplatform stringzcycle frequency [Hz]i@B ia64vendorfamilyZarchrevZrevisionZfeaturesppc64machineZclock   s390s390xrX   z: zbogomips per cpuZcpu_socketsZsocket_countrE   )rh   ri   rE   )rj   rE   )rm   rE   )rp   rq   )r*   r+   r,   locale	setlocale
LC_NUMERICr-   readunamerS   r@   rK   roundfloat
ValueErrorr0   r/   r1   r   Z	RhnServerZcapabilitiesZhasCapabilityrR   )rW   r^   rY   rx   rQ   ZhwdictrZ   Z	mhz_speedZhz_speedr[   r4   srN   r   r   r   read_cpuinfo   s    	&





 






r}   c              C   s@   t j } | d }|d d dkr&t S |d d dkr<t S d S )NrC   ro   z2.6z2.4)r*   rx   read_memory_2_6read_memory_2_4)ZunZkernelr   r   r   read_memory  s    r   c              C   s   t jdt jsi S tddj } | jd}|d }|j }i }d|d< tt|d d }|dk rt|d	|d	   }n|d
|d
   }t||d< |d }|j }tt|d d }t||d< |S )Nz/proc/meminfor'   rX   r   MEMORYr(   i       r`      ramrC   swapi   i   )	r*   r+   r,   r-   rw   r0   rK   longstr)meminforO   ZcurlineZmemlistmemdictmegsr   r   r   r     s$    
r   c              C   s   t jdt jsi S tddj } | jd}i }xB|D ]:}|jdd}|d }t|dkrZq4|d j }|||< q4W i }d|d< |d	 }|jd
}	t|	d }
t|
d }|d }|jd
}	t|	d }t|d }t	||d< t	||d< |S )Nz/proc/meminfor'   rX   rD   r   r   r   r(   ZMemTotal i   Z	SwapTotalr   r   )
r*   r+   r,   r-   rw   r0   r/   r1   r   r   )r   rO   Zmeminfo_dictrP   Zblobskeyr]   r   Z	total_strZblipsZtotal_kr   Zswap_strZswap_kZ	swap_megsr   r   r   r~     s2    



r~   c              C   sP  t j } t j }ddd}d}d}d}x|D ]}|jdd }|jdd }|| }	xttfD ]}
ytj|
}W n tjk
r   wbY nX | d	 rt j }|jd\}}	t	|	}	yR|j
d
 |j||	f |j d }|
tkr|}n|}tj|}||kr|}W n" tjk
r(   |j  wbY nX |j  qbW q.W tjjdrtjdtjrtddj }x|D ]}t|s~ql|j }qlW ntjjdr.tjdtjr.tddj }xr|D ]j}t|sҐq|jd}t|dkrq|d j }||d< |d dkrdj|dd j }P qW |dksB|dkrFd}|||fS )z returns [hostname, intf, intf6]

        Where hostname is you FQDN of this machine.
        And intf is numeric IPv4 address. And intf6 is IPv6 address.
    i  P   )ZhttpsZhttpN/rC   rD   r   ZenableProxy   z/etc/hostnamer'   z/etc/sysconfig/networkr)   r   ZHOSTNAMEr"   zlocalhost.localdomainunknown)r   initUp2dateConfigZgetServerlURLr0   r   r   socketerrorZgetProxySettingrK   Z
settimeoutZconnectZgetsocknamegetfqdncloser*   r#   isfiler+   r,   r-   r.   r/   r1   r2   )cfgZslsthostnameZintfZintf6Z	serverUrlZserverZ
servertypeZportrl   r|   Zserver_portZintf_tmpZhostname_tmpZhostnameinfor3   Znetworkinfor4   r5   r   r   r   findHostByRoute  sn    








r   c          	   C   s   d}yt d|  d}W n
   |S d}xV|j D ]J}|rT|jddkrT|j d }P |jddkr0|j d	 }||kr0d
}q0W |j  |S )Nr"   z/proc/net/bonding/%sr'   FzPermanent HW addr: r   ro   zSlave Interface: rC   TrE   rE   )r-   r.   findr0   r   )masterZslavehwaddrZbondingZslave_foundrP   Zifnamer   r   r   get_slave_hwaddrH  s     r   c              C   s.  i } d| d< t  \| d< | d< | d< | d dkrRt | d< d| d krRtj | d< | d d kry4t| d d }tdd	 |}|d
 d d
 | d< W n   d| d< Y nX | d d kry4t| d d }tdd	 |}|d
 d d
 | d< W n   d| d< Y nX | d d krd| d< | d d kr*d| d< | S )NZNETINFOr(   r   ipaddrZip6addrr   .c             S   s   | d t jkS )Nr   )r   r   )xr   r   r   <lambda>k  s    zread_network.<locals>.<lambda>r   r`   z	127.0.0.1c             S   s   | d t jkS )Nr   )r   r   )r   r   r   r   r   t  s    z::1r"   )r   r   r   r   r   filter)ZnetdictZlist_of_addrsZ
ipv4_addrsZ
ipv6_addrsr   r   r   read_network]  s4    
r   c           4   C   s  i } d| d< t  r(t r(tjjd | S t rFtttj tj	  }nt
j }x6|D ],}y,t rntj|}nt
j|t
j d d }W n   d}Y nX ytjd| }W n   d }Y nX |rtjj|}t||}y@t rtj|}n,td| d	}|j jd
d j }|j  W n    |dkr0d}nd}Y nX y.t rNtj|}nt
j|t
j d d }W n   d}Y nX y.t rtj|}	nt
j|t
j d d }	W n   d}	Y nX y.t rtj|}
nt
j|t
j d d }
W n   d}
Y nX g }t r`tj|}xL|D ]D}x<|j D ]0}|j }|dkr:d}|j!||j"|j#d q"W qW nyxt
j|t
j$ D ]}|d jdd }t%j&|}|j'rd}n(|j(rd}n|j)rd}n|j*rd}|d }d}xd|jdD ]V}|sP nF|j+ dkr|d7 }n.|dt,t-|jdd ddd  j.d 7 }qW |j!|||d qtW W n t/k
rl   Y nX |||	|
||d| |< qVW | S )NZNETINTERFACESr(   zWWarning: information about network interfaces could not be retrieved on this platform.
r   addrr"   z/sys/class/net/%s/masterz/sys/class/net/%s/device/ueventr'   r)   r   loZloopbackZUnknownnetmask	broadcastglobalZuniverse)scoper   r   %linkhostZsiterD   Zffffr   r   rC   1)r   r   r   r   moduleZipv6)0ethtool_presentnetifaces_presentsysstderrwritelistrL   ethtoolr   Zget_active_devices	netifaces
interfacesZ
get_hwaddrZifaddressesZAF_LINKr*   readlinkr#   basenamer   Z
get_moduler-   readliner0   r1   r   Z
get_ipaddrr   Zget_netmaskZget_broadcastZget_interfaces_infoZget_ipv6_addressesr   appendZaddressr   r   	ipaddressZIPv6AddressZ	is_globalZis_link_localZis_loopbackZis_site_localrS   binrK   rindexKeyError)ZintDictr   Z	interfacer   r   Zmaster_interfacer   Zdriver_filer   r   r   Zip6_listZdev_infor3   Zip6r   Zip6_addrZ
scope_infoZip6_netmaskZnetmask_bitsZ
two_octetsr   r   r   read_network_interfaces  s    












4r   c           	   C   sB  i } d| d< t j d j }|d dko6|dd  dk rH|dk rH| S t }|rZ|| d	< td
}|rn|| d< td}|r|d | }|| d< td| d< td}|r|| d< td}|r|| d< td}|r|| d< td}td}td}	td}
dd|d|d|	d|
f | d< x*t| j D ]}| | d kr | |= q W | S )NZDMIr(   r`   r   r9   rC   ra   rb   rk   z!/dmidecode/SystemInfo/ProductNameproductz/dmidecode/SystemInfo/Versionr   systemz%/dmidecode/BaseBoardInfo/ManufacturerZboardz/dmidecode/BIOSinfo/VendorZbios_vendorz/dmidecode/BIOSinfo/VersionZbios_versionz/dmidecode/BIOSinfo/ReleaseDateZbios_releasez#/dmidecode/ChassisInfo/SerialNumberz/dmidecode/ChassisInfo/AssetTagz%/dmidecode/BaseBoardInfo/SerialNumberz"/dmidecode/SystemInfo/SerialNumberz#(%s: %s) (%s: %s) (%s: %s) (%s: %s)ZchassisZassetrr   )r*   rx   rS   r%   r$   r   keys)Zdmidictrx   rk   r   versionr   releaseZchassis_serialZchassis_tagZboard_serialZsystem_serialkr   r   r   read_dmi  sJ    (r   c              C   s   yt rt } nt }|j } W n6 tk
rT   tj }dtj d  }|j	| i S X i }x*| D ]"}|j
dr`t| | |t|< q`W |jt  |S )Nz0Error reading system and smbios information: %s
r   r   )using_gudevr   r   ZGetAllProperties	Exceptionr
   r   r   exc_infor   rJ   r   update
get_smbios)ZpropsZcomputerr    msgZsystem_and_smbiosr   r   r   r   get_hal_system_and_smbios=  s     


r   c            	   C   sD   t   tri S t t tdtdtdtdtdtddS dS )	a   Returns dictionary with values we are interested for.
        For historical reason it is in format, which use HAL.
        Currently in dictionary are keys:
        smbios.system.uuid, smbios.bios.vendor, smbios.system.serial,
        smbios.system.manufacturer.
    z"/dmidecode/SystemInfo/SerialNumberz"/dmidecode/SystemInfo/Manufacturerz!/dmidecode/SystemInfo/ProductNamez/dmidecode/SystemInfo/SKUnumberz/dmidecode/SystemInfo/Familyz/dmidecode/SystemInfo/Version)zsmbios.system.uuidzsmbios.bios.vendorzsmbios.system.serialzsmbios.system.manufacturerzsmbios.system.productzsmbios.system.skunumberzsmbios.system.familyzsmbios.system.versionN)r!   r   r&   r%   r$   r   r   r   r   r   R  s    r   c           .   C   s"  t rt } nzt \}}d}|s"|r<tj }d}|j| d}g } |ryt }|rT|} W n.   tj }dtj d  }|j| Y nX yt	 }|r| j
| W n"   ttdtj d  Y nX yt }|r| j
| W n"   ttdtj d  Y nX tj }|d sNyt }|r(| j
| W n"   ttdtj d  Y nX yt }|rf| j
| W n.   tj }d	tj d  }|j| Y nX yt }|r| j
| W n"   ttd
tj d  Y nX |d syt }|r| j
| W n"   ttdtj d  Y nX | S )Nr   zaWarning: haldaemon or messagebus service not running. Cannot probe hardware and DMI information.
r   z'Error reading hardware information: %s
zError reading cpu information:z(Error reading system memory information:ZskipNetworkz%Error reading networking information:z"Error reading DMI information: %s
z)Error reading install method information:z,Error reading network interface information:)r   r   r   r
   r   Zlog_mer   r   r   r}   r   print_r   r   r   r   r   r6   r   )ZallhwZ
hal_statusZdbus_statusZhwdaemonr    r   retr   r   r   r   r   i  sz    

  

r   __main__z'%s' : '%s')P__doc__r   r   r   r   r   r>   r*   r   Zup2date_clientr   r   Zrhn.i18nr   r   	NameErrorrK   r   r   ImportErrorr   r   r   r   Zdmidecode_presentgettextZtranslationtr   r	   r   Zdbusr
   Zup2date_client.hardware_udevr   r   r   Zup2date_client.hardware_gudevZup2date_client.hardware_halr   r   r   rt   r#   r   Zsubscription_manager.hwprober   rG   rF   r   r   r   r   r   r   r    r   r!   r$   r%   r&   r6   r@   rR   r}   r   r   r~   r   r   r   r   r   r   r   __name__Zhwr   r   r   r   r   r   r   <module>   s   





7 B!K# :]
