a
    3BCfI                    @   s  d Z ddd e D ZddlZddlZddlZddlZddlZdZda	G dd de
ZG d	d
 d
e
Zdd Zdid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/d0 Zd1d2 Z d3d4 Z!d5d6 Z"i fd7d8Z#G d9d: d:e
Z$G d;d< d<e
Z%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/dQdR Z0dSdT Z1dUdV Z2dWdX Z3dYdZ Z4d[d\ Z5d]d^ Z6d_d` Z7dadb Z8dcdd Z9dedf Z:e;dgkr e:  nedhdha	e  dS )j)	       r   .c                 C   s   g | ]}t |qS  )str.0nr   r   K/var/www/html/django/DPS/env/lib/python3.9/site-packages/cpuinfo/cpuinfo.py
<listcomp>       r
   r   NTc                   @   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 )Tracec                 C   sp   || _ | j sd S ddlm} ddlm} |r6| | _n | d}td|d| _| | _	| | _
d | _d S )Nr   )datetimeStringIOz%Y-%m-%d_%H-%M-%S-%fzcpuinfo_trace_{0}.tracew)
_is_activer   ior   _outputnowstrftimeopenformat_stdout_stderr_err)self	is_activeZis_stored_in_stringr   r   dater   r   r	   __init__+   s    
zTrace.__init__c                 C   sT   | j s
d S ddlm} | d }|d }|d }| jd||| | j  d S )Nr   stack      z{0} ({1} {2})
r   inspectr    r   writer   flushr   msgr    framefileliner   r   r	   header=   s    

zTrace.headerc                 C   sR   | j s
d S ddlm} | d }|d }|d }| jd|| | j  d S )Nr   r   r!   r"   zSuccess ... ({0} {1})

r#   )r   r    r)   r*   r+   r   r   r	   successG   s    

zTrace.successc                 C   s   | j s
d S ddlm} | d }|d }|d }t|trddd |dD d }| j| | jd		|| | j
  n`t|trdd
lm} | }| jd	|| | jddd |dD d  | j
  d S )Nr   r   r!   r"    c                 S   s   g | ]}d | qS )	r   )r   r+   r   r   r	   r
   [   r   zTrace.fail.<locals>.<listcomp>
zFailed ... ({0} {1})


format_excz	Failed ... ({0} {1})
c                 S   s   g | ]}d  |qS 		{0}
r   r   r   r   r	   r
   d   r   )r   r$   r    
isinstancer   joinsplitr   r%   r   r&   	Exception	tracebackr2   )r   r(   r    r)   r*   r+   r2   
err_stringr   r   r	   failR   s     



&z
Trace.failc                 C   sT   | j s
d S ddlm} | d }|d }|d }| jd||| | j  d S )Nr   r      r!   r"   z	{0} ({1} {2})
r#   r'   r   r   r	   command_headerg   s    

zTrace.command_headerc                 C   sP   | j s
d S | jd| | jddd |dD d  | j  d S )Nr4   r.   c                 S   s   g | ]}d  |qS )z			{0}
r5   r   r   r   r	   r
   u   r   z(Trace.command_output.<locals>.<listcomp>r0   )r   r   r%   r   r7   r8   r&   )r   r(   outputr   r   r	   command_outputq   s    
&zTrace.command_outputc              	      s  | j s
d S ddlm} | d }|d }|d }| jd||  fdd|D }|r|D ]"}	| jd|	 |	 |	  q`n| jd	 | jd
||  fdd|D }
|
r|
D ]}	| jd|	|	  qn| jd	 | jd | j  d S )Nr   r   r"   r!   z	Changed keys ({0} {1})
c                    s0   g | ](}| v r|v r | | kr|qS r   r   r   keyinfonew_infor   r	   r
      r   zTrace.keys.<locals>.<listcomp>z		{0}: {1} to {2}
z		None
z	New keys ({0} {1})
c                    s    g | ]}|v r| vr|qS r   r   rA   rC   r   r	   r
      r   z		{0}: {1}
r0   r#   )r   keysrD   rE   r    r)   r*   r+   Zchanged_keysrB   Znew_keysr   rC   r	   rF   x   s&    

"z
Trace.keysc                 C   s(   | j s
d S | j|d  | j  d S )Nr0   )r   r   r%   r&   )r   r(   r   r   r	   r%      s    
zTrace.writec                 C   s&   | j  | j | j || j|dS )N)r?   stdoutstderrrD   erris_fail)r   getvaluer   r   r   )r   rD   rJ   r   r   r	   to_dict   s    zTrace.to_dictN)__name__
__module____qualname__r   r,   r-   r<   r>   r@   rF   r%   rL   r   r   r   r	   r   *   s   

r   c                   @   s  e Zd Ze d Ze Ze 	 dkZ
e Ze d ZdZedd Zedd Zed	d
 Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Z ed%d& Z!ed'd( Z"ed)d* Z#ed+d, Z$ed-d. Z%ed/d0 Z&ed1d2 Z'ed3d4 Z(ed5d6 Z)ed7d8 Z*ed9d: Z+ed;d< Z,ed=d> Z-d?S )@
DataSourcer   windows   Tc                   C   s   t jdS )N/proc/cpuinfo)ospathexistsr   r   r   r	   has_proc_cpuinfo   s    zDataSource.has_proc_cpuinfoc                   C   s   t tddkS )Ndmesgr   len_program_pathsr   r   r   r	   	has_dmesg   s    zDataSource.has_dmesgc                  C   s4   t   dd  } d| v o2tjdS )N"'linux/var/run/dmesg.boot)platformsystemstriplowerrT   rU   rV   )unamer   r   r	   has_var_run_dmesg_boot   s     z!DataSource.has_var_run_dmesg_bootc                   C   s   t tddkS )Ncpufreq-infor   rY   r   r   r   r	   has_cpufreq_info   s    zDataSource.has_cpufreq_infoc                   C   s   t tddkS )Nsestatusr   rY   r   r   r   r	   has_sestatus   s    zDataSource.has_sestatusc                   C   s   t tddkS )Nsysctlr   rY   r   r   r   r	   
has_sysctl   s    zDataSource.has_sysctlc                   C   s   t tddkS )Nisainfor   rY   r   r   r   r	   has_isainfo   s    zDataSource.has_isainfoc                   C   s   t tddkS )Nkstatr   rY   r   r   r   r	   	has_kstat   s    zDataSource.has_kstatc                  C   sD   t   dd  } d| v p.d| v }|oBttddkS )Nr]   r^   ZbeosZhaikusysinfor   )ra   rb   rc   rd   rZ   r[   )re   Zis_beosr   r   r	   has_sysinfo   s     zDataSource.has_sysinfoc                   C   s   t tddkS )Nlscpur   rY   r   r   r   r	   	has_lscpu   s    zDataSource.has_lscpuc                   C   s   t tddkS )Nlspropr   rY   r   r   r   r	   has_ibm_pa_features   s    zDataSource.has_ibm_pa_featuresc                  C   s$   t g d\} }| dko"t|dkS )N)wmicrT   getVersionr   )_run_and_get_stdoutrZ   )
returncoder?   r   r   r	   has_wmic   s    zDataSource.has_wmicc                   C   s   t ddgS )NcatrS   rz   r   r   r   r	   cat_proc_cpuinfo   s    zDataSource.cat_proc_cpuinfoc                   C   s
   t dgS )Nrg   r~   r   r   r   r	   cpufreq_info   s    zDataSource.cpufreq_infoc                   C   s   t ddgS )Nri   z-br~   r   r   r   r	   
sestatus_b   s    zDataSource.sestatus_bc                   C   s   t ddgS )NrX   z-ar~   r   r   r   r	   dmesg_a   s    zDataSource.dmesg_ac                   C   s   t ddgS )Nr}   r`   r~   r   r   r   r	   cat_var_run_dmesg_boot   s    z!DataSource.cat_var_run_dmesg_bootc                   C   s   t g dS )N)rk   zmachdep.cpuhw.cpufrequencyr~   r   r   r   r	   "sysctl_machdep_cpu_hw_cpufrequency   s    z-DataSource.sysctl_machdep_cpu_hw_cpufrequencyc                   C   s   t ddgS )Nrm   z-vbr~   r   r   r   r	   
isainfo_vb   s    zDataSource.isainfo_vbc                   C   s   t g dS )N)ro   z-mZcpu_infor~   r   r   r   r	   kstat_m_cpu_info   s    zDataSource.kstat_m_cpu_infoc                   C   s   t ddgS )Nrq   z-cpur~   r   r   r   r	   sysinfo_cpu  s    zDataSource.sysinfo_cpuc                   C   s
   t dgS )Nrs   r~   r   r   r   r	   rs     s    zDataSource.lscpuc                  C   s*   dd l } |  d}|r&td|d gS d S )Nr   z(/proc/device-tree/cpus/*/ibm,pa-featuresru   )globrz   )r   Zibm_featuresr   r   r	   ibm_pa_features	  s    
zDataSource.ibm_pa_featuresc                   C   s   t g dS )N)rw   cpurx   zOName,CurrentClockSpeed,L2CacheSize,L3CacheSize,Description,Caption,Manufacturerz/format:listr~   r   r   r   r	   wmic_cpu  s    zDataSource.wmic_cpuc                  C   s   t dd} |  S )N.Hardware\Description\System\CentralProcessor\0ZProcessorNameString)_read_windows_registry_keyrc   )processor_brandr   r   r	   winreg_processor_brand  s    
z!DataSource.winreg_processor_brandc                  C   s   t dd} | S )Nr   ZVendorIdentifierr   )vendor_id_rawr   r   r	   winreg_vendor_id_raw  s    
zDataSource.winreg_vendor_id_rawc                  C   s   t dd} | S )Nz<SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentPROCESSOR_ARCHITECTUREr   )arch_string_rawr   r   r	   winreg_arch_string_raw  s    
z!DataSource.winreg_arch_string_rawc                  C   s   t dd} t| } | S )Nr   z~Mhz)r   _to_decimal_string)	hz_actualr   r   r	   winreg_hz_actual$  s    
zDataSource.winreg_hz_actualc                  C   s   t dd} | S )Nr   Z
FeatureSetr   Zfeature_bitsr   r   r	   winreg_feature_bits*  s    
zDataSource.winreg_feature_bitsN).rM   rN   rO   ra   architecturebitsmultiprocessing	cpu_countrb   rd   
is_windowsmachiner   re   uname_string_raw	can_cpuidstaticmethodrW   r\   rf   rh   rj   rl   rn   rp   rr   rt   rv   r|   r   r   r   r   r   r   r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r	   rP      s   



























rP   c                 C   s   g }t d tjddtj}tjd tjD ]T}tj|| }t|tj	r\|
| |D ]$}|| }t|tj	r`|
| q`q2|S )NPATHEXTr.   PATH)filterrT   environrx   r8   pathseprU   r7   accessX_OKappend)Zprogram_namepathsextspeZpextr   r   r	   r[   0  s    
r[   c                 C   s   ddl m}m} tdd|  d  |s>|| |||d}n,|| |||d}|||j||d}|j  | \}}|j	dd	}|j	dd	}t
d
t|j t
d| |j|fS )Nr   PopenPIPEzRunning command " z" ...rG   rH   stdin)r   rG   rH   UTF-8encodingzreturn code:zstdout:)
subprocessr   r   g_tracer>   r7   rG   closecommunicatedecoder@   r   r{   )commandZpipe_commandr   r   p1p2Zstdout_outputZstderr_outputr   r   r	   rz   =  s    
rz   c                 C   s   t d| | zdd l}W nV tyt } z>zdd l}W n$ ty^ } zW Y d }~n
d }~0 0 W Y d }~n
d }~0 0 ||j| }|||d }|	| t 
dt| |S )Nz*Reading Registry key "{0}" field "{1}" ...r   zvalue:)r   r>   r   _winregImportErrorwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExZCloseKeyr@   r   )Zkey_name
field_namer   rI   rB   valuer   r   r	   r   W  s    ,
r   c                  C   s"   t tj\} }| dvrtdd S )N)
X86_32X86_64ARM_7ARM_8PPC_64S390XMIPS_32MIPS_64RISCV_32RISCV_64zNpy-cpuinfo currently only works on X86 and some ARM/PPC/S390X/MIPS/RISCV CPUs.)_parse_archrP   r   r9   )archr   r   r   r	   _check_archi  s    r   c                 C   s6   dd l }dd l}| }||}||}|d}|S )Nr   utf8)picklebase64dumps	b64encoder   )thingr   r   abcdr   r   r	   _obj_to_b64q  s    


r   c                 C   sF   dd l }dd l}z|| }||}|W S  ty@   i  Y S 0 d S Nr   )r   r   	b64decodeloadsr9   )r   r   r   r   r   r   r   r	   _b64_to_obj{  s    

r   c                 C   s<   t | trdd | D S t | tr4dd |  D S | S d S )Nc                 S   s   g | ]}t |qS r   _utf_to_str)r   elementr   r   r	   r
     r   z_utf_to_str.<locals>.<listcomp>c                 S   s   i | ]\}}t |t |qS r   r   )r   rB   r   r   r   r	   
<dictcomp>  s   z_utf_to_str.<locals>.<dictcomp>)r6   listdictitems)inputr   r   r	   r     s    

r   c                 C   s   g d}t || | |D ]p}||d rD| |d sD|| | |< q|dkr|dr|d D ]}|| d vr^| d | q^| d   qd S )N)r   hardware_raw	brand_rawhz_advertised_friendlyhz_actual_friendlyhz_advertisedr   r   r   countr   r   l2_cache_sizel2_cache_line_sizel2_cache_associativitysteppingmodelfamilyprocessor_typeflagsl3_cache_sizel1_data_cache_sizel1_instruction_cache_sizer   )r   rF   rx   r   sort)rD   rE   rF   rB   fr   r   r	   _copy_new_fields  s    
r  c                 C   s   |  D ]|}|D ]r}| }d|v r|dd\}}|  }| }||krt|dkr| rv| s|    S q|    S qqd S )N:r!   r   )
splitlinesrd   r8   rc   rZ   isdigit)cant_be_number
raw_stringfield_namesr+   r   leftrightr   r   r	   _get_field_actual  s    r
  c                 G   sH   t | ||}|r8|r8z||}W n ty6   |}Y n0 |d u rD|}|S N)r
  r9   )r  r  Z
convert_todefault_valuer  retvalr   r   r	   
_get_field  s    
r  c                 C   s   zd | } | dd} ddd | D  } | dkr<d} d| vrNd | } | d} | drld	 | } t| } d | } | W S  ty   Y d
S 0 d S )N{0},r   r.   c                 s   s"   | ]}|  s|d kr|V  qdS r   Nr  r   r   r   r	   	<genexpr>  r   z%_to_decimal_string.<locals>.<genexpr>0z{0}.0z{0}00.0)r   replacer7   rc   rstripendswithfloatr9   )ticksr   r   r	   r     s     





r   c                 C   s   zt | } d| } | d}|d}|dd}||| d d}|| }d|d | ||d  }|d\}}t|t| }}||fW S  ty   Y dS 0 d S )Nr  r  r   r.   r!   {0}.{1}r   r   )	r  r   lstripindexr  ljustr8   intr9   )r  scalehzZ	old_indexZ	new_indexr  r	  r   r   r	   _hz_short_to_full  s    



r#  c                 C   s   z|    } d\}}| dr&d}n| dr6d}n| drDd}dd	d
 | D   }d|vrl|d7 }t||\}}||fW S  ty   Y dS 0 d S )NNNghzr   mhz   r"  r   r.   c                 s   s"   | ]}|  s|d kr|V  qdS r  r  r   r   r   r	   r    r   z'_hz_friendly_to_full.<locals>.<genexpr>r   z.0r  )rc   rd   r  r7   r#  r9   )Z	hz_stringr"  r!  r   r   r	   _hz_friendly_to_full  s     



r(  c                 C   s   zt | |\}}d||}|d}|dd}d}d}|dkrLd}d}n"|dkr^d	}d}n|d
krnd}d
}d|d | d  || d d  }dt||}|d}|W S  ty   Y dS 0 d S )Nr  r   r.   Hzr   r   GHzr'  MHzr=   ZKHzr!   z{0:.4f} {1}r  z	0.0000 Hz)r#  r   r  r  r  r  r9   )r  r!  r  r	  resultZ	dot_indexsymbolr   r   r	   _hz_short_to_friendly  s,    
(
r.  c                 C   sf   dd l }| s| S d| } ddddd}| D ]0\}}||| r0d| d d	  |  S q0| S )
Nr   r  BZKBMBGB)z	^[0-9]+B$z	^[0-9]+K$z	^[0-9]+M$z	^[0-9]+G$z{0} {1})rer   r   matchrc   )r   r3  formatspatternZfriendly_sizer   r   r	   _to_friendly_bytes/  s    
r7  c                 C   s   |   }ddiddiddiddiddid	did
diddiddiddig
}zX|D ]N}t| d }t| d }||rNt||d  |   W S qNW n$ ty } zW Y d }~n
d }~0 0 | S )NZgibi   @Zmibi   Zkib   gbmbkbgmkr   r!   r   )	rd   r   rF   valuesr  r   r8   rc   r9   )Zfriendly_bytesr   r5  entryr6  
multiplierrI   r   r   r	   _friendly_bytes_to_intC  s*    
&rB  c                 C   s   d|   vrdS |   }d}|dr,d}n|dr:d}d|v rR|dd	 }n|d d	d	 }|dd }t|}||fS )
Nr"  r  r   r   r&  r'  r%  r   @r!   )rd   r  r8   rsplitr  rc   r   )
cpu_stringr"  r!  r   r   r	   _parse_cpu_brand_stringa  s    

rG  c                    s  dd l }dd |d D }dd |d D }dd t||D } fd	d| D }d
\}}}}|D ]}	|	dD ]}
dd |
dD }
t|
dkr||
d |
d  }}|dkr|d}q||dkrt|dd}q||dkrt|dd}q||dv r|t|dd}q|qn  }d}|rld}|D ]6}	d	|	}|
|r0|d t|   }d}q0q"t|\}}|dkr|D ]P}	|	}dD ]@}||v rd|d ||t|   }t|\}} qqq|||||||fS )Nr   c                 S   s   g | ]}|  qS r   startr   r=  r   r   r	   r
   {  r   z._parse_cpu_brand_string_dx.<locals>.<listcomp>z\(c                 S   s   g | ]}|  qS r   rH  rJ  r   r   r	   r
   |  r   z\)c                 S   s   i | ]\}}||qS r   r   r   r>  vr   r   r	   r   }  r   z._parse_cpu_brand_string_dx.<locals>.<dictcomp>c                    s    g | ]\}} |d  | qS )r!   r   )r   rI  endrF  r   r	   r
   ~  r   )NNNNr  c                 S   s   g | ]}|  qS r   )rc   r   r   r   r	   r
     r   r  r!   originr]   r   0x   r   famr   TFz({0})r  )r*  r+  r)  zCPU @ )r3  finditerzipr   r8   rZ   rc   r   r  r   r  rG  find)rF  r3  ZstartsZendsZinsides	vendor_idr   r   r   Zinsidepairnamer   brandZ
is_workingfullhz_brandr!  r"  r@  r   rN  r	   _parse_cpu_brand_string_dxw  sL    


r]  c              
   C   s  z|  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 ]&}tdd	 |D }||kr|}|}q|si W S |\}}}	}
}}}d| v r| | dd   dd }|   }dd	 |D }dd	 |D }|D ]}t| d }t| d }|dkrh|d}
nR|dkrt|dd}n6|dkrt|dd}n|dv r.t|dd}q.g }dD ].}|| v r|	|  |d  dd  qg }|D ]>}| dd  dd 
 }| dD ]}|	| q(q|  t|	\}}|dkrhd}t|}|
|	||||d}|r|dkrt|||d< t|||d < |r|dkrt|||d!< t|||d"< d#d$ | D W S  ty } zt| W Y d }~n
d }~0 0 i S )%Nz CPU0:r!   z CPU1:z CPU:z
CPU0:z
CPU1:z
CPU:c                 S   s   g | ]}| d d  qS )r0   r   )r8   rc   r   lr   r   r	   r
     r   z'_parse_dmesg_output.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )r]  r^  r   r   r	   r
     r   r   c                 S   s   g | ]}|d uqS r  r   r   r   r   r	   r
     r   z	  Origin=r0   c                 S   s   g | ]}|  d qS =)rc   r8   r   r   r   r	   r
     r   c                 S   s(   g | ] }|d     |d   iqS )r   r!   )rc   rd   r   r   r   r	   r
     r   rO  r]   r   rP  rQ  r   rR  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=<>r  r  r'  )r   r   r   r   r   r   r   r   r   r   c                 S   s   i | ]\}}|r||qS r   r   rK  r   r   r	   r     r   z'_parse_dmesg_output.<locals>.<dictcomp>)r8   sumrV  rc   r   rF   r?  r   r  r   rd   r   rG  r   r.  r#  r   r9   r   r<   )r?   linesZcpu_stringsZbest_stringZhighest_countrF  r   r   r!  r   rW  r   r   r   fieldsfieldrY  r   Z
flag_linescategoryr   r+   flagr   rD   rI   r   r   r	   _parse_dmesg_output  s    





"

 rj  c                 C   sV  dd l }d\}}|  } |d| r0d}d}n|d| rHd}d}n|d	| r^d
}d}n|d| rtd}d}n|d| rd
}d}n|d| rd}d}n|d| rd}d}n|d| rd}d}n|d| rd}d}nl|d| rd}d}nV| dkrd}d}nB| dkr d}d}n.|d| r8d}d}n|d| rNd}d}||fS ) Nr   r$  z4^i\d86$|^x86$|^x86_32$|^i86pc$|^ia32$|^ia-32$|^bepc$r       z9^x64$|^x86_64$|^x86_64t$|^i686-64$|^amd64$|^ia64$|^ia-64$r   @   z^armv8-a|aarch64|arm64$r   z/^armv7$|^armv7[a-z]$|^armv7-[a-z]$|^armv6[a-z]$r   z"^armv8$|^armv8[a-z]$|^armv8-[a-z]$z ^ppc32$|^prep$|^pmac$|^powermac$ZPPC_32z^powerpc$|^ppc64$|^ppc64le$r   z^sparc32$|^sparc$ZSPARC_32z^sparc64$|^sun4u$|^sun4v$ZSPARC_64z^s390x$r   Zmipsr   Zmips64r   z^riscv$|^riscv32$|^riscv32be$r   z^riscv64$|^riscv64be$r   )r3  rd   r4  )r   r3  r   r   r   r   r	   r   
  s\    

r   c                 C   s   d|> }| |@ dk}|S )Nr!   r   r   )regbitmaskis_setr   r   r	   _is_bit_setC  s    rq  c                 C   s   t  s| d dS t  \}}|dkr8| d dS | D ]0}|  }|dr@|drj dS  dS q@d}d}| D ]B}|  }|dr|d	rd}q|d
r|d	rd}q| 	d| | 	d| | p| S )NzFailed to find sestatus.Fr   z$Failed to run sestatus. Skipping ...zcurrent mode:Z	enforcingTZallow_execheaponZallow_execmemzcan_selinux_exec_heap:zcan_selinux_exec_memory:)
rP   rj   r<   r   r  rc   rd   
startswithr  r@   )tracer{   r?   r+   Zcan_selinux_exec_heapZcan_selinux_exec_memoryr   r   r	   _is_selinux_enforcingI  s0    



ru  c                 C   sr   i }| D ]d}| | }||v r2|| |kr2|||< q|s8q|dkrBq|dkrLqt |tkrd|drdq|||< q|S )Nr  r2  r  )typer   rs  )rD   Zacceptable_valuesZfiltered_inforB   r   r   r   r	   #_filter_dict_keys_with_empty_valuesm  s"    
rw  c                   @   s4   e Zd Zddg fddZdd Zdd Zd	d
 ZdS )ASMNr   c                 C   s4   || _ || _|| _d | _d | _d | _d | _d| _d S r   )restypeargtypesmachine_code
prochandlemmfuncaddresssize)r   ry  rz  r{  r   r   r	   r     s    zASM.__init__c                 C   s  t d| j}tt|| _tjrdt|}|dk r:d}t	d}t	d}tj
jj}tj|_|d t|||| _| jstdttjtjtjtjtj}|| j||dk rtdt	d}t	d}tj
jj}	|	t| jt||t|}
|
s
td| js2tj
jj}tj|_t| | _tj
j| jt| jt|}
|
std	nzdd
lm}m}m}m}m}m} t d| j}t|| _|d| j||B ||B |B d| _| j| t tj!"| j| _tj| jg| j#R  }|| j| _$d S )Nr   i      zFailed to VirtualAllocr   zFailed to memmoverQ  zFailed VirtualProtectzFailed FlushInstructionCache)mmapMAP_PRIVATEMAP_ANONYMOUS
PROT_WRITE	PROT_READ	PROT_EXECr2  )r   Zprot)%bytesr7   r{  ctypesc_size_trZ   r  rP   r   c_ulongwindllkernel32ZVirtualAllocc_void_pry  r  r9   Z	CFUNCTYPEZ_memmove_addrZVirtualProtectbyrefr|  ZGetCurrentProcessZFlushInstructionCacher  r  r  r  r  r  r}  r%   Z	addressofc_intZfrom_bufferrz  r~  )r   r{  r  Z
MEM_COMMITZPAGE_READWRITEZpfnVirtualAllocZmemmoveZPAGE_EXECUTEZold_protectZpfnVirtualProtectresZpfnGetCurrentProcessr  r  r  r  r  r  Zfunctyper   r   r	   compile  sH    





"
"
 
 zASM.compilec                 C   s   |   }|S r  )r~  )r   r  r   r   r	   run  s    zASM.runc                 C   s^   t jr2td}tjjt| jt	d| n
| j
  d | _d | _
d | _d | _d| _d S )Ni   r   )rP   r   r  r  r  r  ZVirtualFreer  r  r  r}  r   r|  r~  r  )r   ZMEM_RELEASEr   r   r	   free  s    
"
zASM.free)rM   rN   rO   r   r  r  r  r   r   r   r	   rx    s   
8rx  c                   @   sn   e Zd ZdddZddg f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 )CPUIDNc                 C   s    |d u rt dd}t|| _d S )NF)r   ru  is_selinux_enforcing)r   rt  r   r   r	   r     s    
zCPUID.__init__r   c                 C   s   t |||}|  |S r  )rx  r  )r   ry  rz  r{  asmr   r   r	   	_asm_func  s    zCPUID._asm_funcc                 G   s*   t tjd|}|  | }|  |S )Nr   )rx  r  c_uint32r  r  r  )r   r{  r  r  r   r   r	   _run_asm  s
    zCPUID._run_asmc                 C   sf   |  dd}|  dd}|  dd}g }|||fD ]$}dD ]}|t||? d@  q:q2d|}|S )N   1         ér      rQ        r.   )r  r   chrr7   )r   ebxecxedxrW  rm  r   r   r   r	   get_vendor_id  s$    
zCPUID.get_vendor_idc           	      C   s   |  dd}|d? d@ }|d? d@ }|d? d@ }|d? d@ }|d	? d@ }|d
? d@ }d}|dv rj|| }n|}|dv r|d> | }||||dS )N      s   r      r  r     r=   rQ     r  )r  )r'  r  )r   r   r   r   r  )	r   eaxZstepping_idr   Z	family_idr   Zextended_model_idZextended_family_idr   r   r   r	   get_info  s*    
zCPUID.get_infoc                 C   s   |  d}|S )Ns      r  )r   max_extension_supportr   r   r	   get_max_extension_support=  s    zCPUID.get_max_extension_supportc              >   C   s  |  dd}|  dd}t|dt|dt|dt|dt|dt|d	t|d
t|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|d t|d!t|dt|dt|dt|dt|dt|d	t|d
t|dt|dt|dt|d"t|dt|dt|dt|dt|dt|dt|dt|d#t|dt|dt|dt|dt|dt|dt|dt|dt|dt|d t|d!d$<}d%d& | D }|dkr|  d'd(}|  d'd)}t|dt|dt|dt|d	t|dt|dt|dt|d"t|dt|dt|dt|dt|dt|dt|dt|dt|d#t|dt|dt|dt|dt|dt|dt|dt|dt|dt|d t|d!t|dt|dt|dt|dt|dt|d
t|dt|dt|d"t|dt|dt|dt|dt|d d**}d+d& | D }||7 }|d,kr|  d-}|  d.}t|dt|dt|dt|dt|dt|d	t|d
t|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|d#t|dt|dt|dt|dt|dt|dt|dt|d t|d!t|dt|dt|dt|dt|dt|d	t|d
t|dt|dt|dt|d"t|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dd/5}d0d& | D }||7 }|  |S )1Nr  r  r  r   r!   r"   r=   r  rR   r'     r  r      r        r  rQ                    r                       
   r  )<fpuvmedepsetscmsrpaemcecx8apicsepmtrrpgemcacmovpatpse36Zpnclflushdtsacpimmxfxsrssesse2ssZhttmia64pbeZpniZ	pclmulqdqZdtes64ZmonitorZds_cplZvmxZsmxZestZtm2Zssse3ZcidfmaZcx16ZxtprZpdcmZpcidZdcaZsse4_1Zsse4_2Zx2apicZmovbeZpopcntZtscdeadlineZaesZxsaveZosxsaveZavxZf16cZrdrndZ
hypervisorc                 S   s   g | ]\}}|r|qS r   r   rK  r   r   r	   r
     r   z#CPUID.get_flags.<locals>.<listcomp>s   1s
      s
      )*ZsgxZbmi1hleZavx2ZsmepZbmi2ZermsZinvpcidZrtmZpqmZmpxZpqeZavx512fZavx512dqZrdseedZadxZsmapZ
avx512ifmaZpcommitZ
clflushoptZclwbZintel_ptZavx512pfZavx512erZavx512cdshaZavx512bwZavx512vlZprefetchwt1Z
avx512vbmiZumipZpkuZospkeZavx512vbmi2ZgfniZvaesZ
vpclmulqdqZ
avx512vnniZavx512bitalgZavx512vpopcntdqZrdpidZsgx_lcc                 S   s   g | ]\}}|r|qS r   r   rK  r   r   r	   r
     r   l       s
     s
     )5r  r  r  r  r  r  r  r  r  r  Zsyscallr  r  r  r  r  r  mpnxZmmxextr  r  Zfxsr_optZpdpe1gpZrdtscpZlmZ3dnowext3dnowZlahf_lmZ
cmp_legacyZsvmZextapicZ
cr8_legacyZabmZsse4aZmisalignsseZ3dnowprefetchZosvwZibsZxopZskinitZwdtZlwpZfma4ZtceZ
nodeid_msrZtbmZtopoextZperfctr_coreZ
perfctr_nbZdbxZperftscZpci_l2ic                 S   s   g | ]\}}|r|qS r   r   rK  r   r   r	   r
   V  r   )r  rq  r   r   )r   r  r  r  r   r  Zextended_flagsr   r   r	   	get_flagsH  sz   	E
	E
	EzCPUID.get_flagsc                 C   s   d}|dkr~g d}|D ]d}|  |d}|  |d}|  |d}|  |d}||||fD ]"}	dD ]}
|t|	|
? d	@ 7 }q`qXq|d
 }|S )Nr.   l       )s     s     s     s   r  r  r  r  r   )r  r  rc   )r   r  r   ZinstructionsZinstructionr  r  r  r  rm  r   r   r   r	   get_processor_brand]  s2    zCPUID.get_processor_brandc                 C   sB   i }|dk r|S |  d}|d@ d |d? d@ |d? d@ d	}|S )
Nl       s
     r  r8  r  r  rQ  i  )size_bassociativityline_size_br  )r   r  
cache_infor  r   r   r	   	get_cache  s    


zCPUID.get_cachec                    s   d }t jdkrZd }ttjttjf}| ||g d}|j  fdd}||_|}n*t jdkrtj}d}| ||g d}|}|S )N32bit)   Us   r        1s   ]s   Ms   s      ]   c                     sB   t d} t d} t | t | | jd> d@ |jB }|S )Nr   rk  l        )r  r  r  r   )highlowr  Zold_funcr   r	   new_func  s
    

z&CPUID.get_ticks_func.<locals>.new_func64bitr   )	   Hr  r  r  r  s    r  s   	r  )rP   r   r  ZPOINTERZc_uintr  r~  Zc_uint64)r   r  ry  rz  Zget_ticks_x86_32r  Zget_ticks_x86_64r   r  r	   get_ticks_func  s&    
	
zCPUID.get_ticks_funcc                 C   s@   ddl m} |  }| }|d | }|| }|  |S )Nr   )sleepr!   )timer  r  r~  r  )r   r  Zticks_fnrI  rM  r  r   r   r	   
get_raw_hz  s    zCPUID.get_raw_hz)N)rM   rN   rO   r   r  r  r  r  r  r  r  r  r  r  r   r   r   r	   r    s   
#!  6:r  c                  C   s  ddl m}  tdd}i }|jt_|jt_z
tt	j
\}}|dvr\|d ||dW S t|}|jr|d ||dW S | }||}| }||}| }	t|	}	t|\}
}| d|t|
|t|	dt|
|t|	d|d |d	 |d
 |d |d |d |d ||d}t|}|  W nd ty } zJddlm} | }ddd | dD d |_!||dW  Y d}~S d}~0 0 ||dS )z
	Warning! This function has the potential to crash the Python runtime.
	Do not call it directly. Use the _get_cpu_info_from_cpuid function instead.
	It will safely call this function in another process.
	r   r   Tr   r   -Not running on X86_32 or X86_64. Skipping ...z"SELinux is enforcing. Skipping ...r.   r  r  r  r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   c                 S   s   g | ]}d  |qS r3   r5   r   r   r   r	   r
   8  r   z3_get_cpu_info_from_cpuid_actual.<locals>.<listcomp>r0   NF)"r   r   r   r   sysrG   r   rH   r   rP   r   r<   rL   r  r  r  r  r  r  r  r   rG  r  r.  r#  r  rw  r-   r9   r:   r2   r7   r8   r   )r   rt  rD   r   r   Zcpuidr  r  r   r   r   r!  rI   r2   r;   r   r   r	   _get_cpu_info_from_cpuid_actual  sZ    




 "r   c                 C   s0   t j}t j}t }|t _|t _| t| d S r  )r  rG   rH   r   putr   )queueorig_stdoutorig_stderrr?   r   r   r	   +_get_cpu_info_from_cpuid_subprocess_wrapper=  s    r  c               
   C   sz  t d ddlm} m} tjs.t d i S ttj	\}}|dvrRt d i S zt
r| }| t|fd}|  | r|d qx|jdkrt d i W S | rt d	 i W S t| }dd
l}|jdd}d|v r |d r t |d  d|v r4|d r4tjd|d  tj  d|v rh|d rhtjd|d  tj  d|vrt d i W S d|v r|d rt d t |d  t d i W S d|v r|d rt d i W S d|vs|d st d i W S |d W S n0tj}	tj}
t }|	t_|
t_t   |d W S W n0 tyt } zt | W Y d
}~n
d
}~0 0 i S )z
	Returns the CPU info gathered by querying the X86 cpuid register in a new process.
	Returns {} on non X86 cpus.
	Returns {} if SELinux is in enforcing mode.
	z Tying to get info from CPUID ...r   )ProcessQueuezCan't CPUID. Skipping ...r  r  )targetargsz,Failed to run CPUID in process. Skipping ...z7Failed to get anything from CPUID process. Skipping ...Nr  )indentr?   rG   z{0}
rH   rJ   z6Failed to get is_fail from CPUID process. Skipping ...rI   z
Failed ...rD   z:Failed to get return info from CPUID process. Skipping ...)r   r,   r   r  r  rP   r   r<   r   r   CAN_CALL_CPUID_IN_SUBPROCESSr  rI  is_aliver7   exitcodeemptyr   rx   pprintPrettyPrinterr%   r  rG   r   r&   rH   r   r-   r9   )r  r  r   r   r  r   r?   r  ppr  r  rI   r   r   r	   _get_cpu_info_from_cpuidH  st    













 r  c               
   C   s  t d zt s&t d i W S t \} }| dkrJt d i W S td|dddd	d
}td|dddddd}td|ddd}td|tdd}td|tdd}td|tdd}td|ddd}td|ddddd}	|	r|	 }	|		  |szxt
ddD ]h}
d|
}td|dd|}|rdd |dD }t|}d|v r|d dkrd |v r|d  } qhqW n ty~   Y n0 td|ddd!d"d#d$d%	}| d& }t|}d'\}}zt|\}}W n ty   Y n0 ||t||	||||d(}|r
|d)kr|}d*}n|r$|d)kr(|}t||d+krTt|||d,< t|||d-< t||d+krt|d*|d.< t|d*|d/< t|dddd0}t   |W S  ty } zt | i W  Y d}~S d}~0 0 dS )1z`
	Returns the CPU info gathered from /proc/cpuinfo.
	Returns {} if /proc/cpuinfo is not found.
	z(Tying to get info from /proc/cpuinfo ...z*Failed to find /proc/cpuinfo. Skipping ...r   z-Failed to run cat /proc/cpuinfo. Skipping ...FNr.   rW  z	vendor idvendorTz
model namer   	processorZuarchz
cache sizer2  r   r   z
cpu familyZHardwarer   FeaturesASEs implementedr  zcache{0}c                 S   s   g | ]}| d qS r`  )r8   )r   r@  r   r   r	   r
     r   z3_get_cpu_info_from_proc_cpuinfo.<locals>.<listcomp>r   level3r  zcpu MHzz	cpu speedclockzcpu MHz dynamiczcpu MHz staticr&  r   )r   r   r   r   r   r   r   r   r  r'  r  r   r   r   r   r   r   r   )r   r,   rP   rW   r<   r   r  r   r8   r   ranger   r   r9   rd   r  rc   r   rG  rB  r#  r.  rw  r-   )r{   r?   rW  r   
cache_sizer   r   r   Zhardwarer   irY  r   r   r   r!  rD   rI   r   r   r	   _get_cpu_info_from_proc_cpuinfo  s    




r  c               
   C   sF  t d z d\} }t s.t d i W S t \}}|dkrRt d i W S |dd dd } | d	}|d
ksJ | d|d   	 } | 
drd}n| 
drd}| dd } t| } t| |t| |t| |t| |d}t|}t   |W S  ty@ } zt | i W  Y d}~S d}~0 0 dS )z^
	Returns the CPU info gathered from cpufreq-info.
	Returns {} if cpufreq-info is not found.
	z'Tying to get info from cpufreq-info ...rC  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr!   r0   r)  r2  r"   r&  r'  r%  r   )r   r   r   r   N)r   r,   rP   rh   r<   r   r8   rV  rc   rd   r  r  r   r.  r#  rw  r-   r9   )r\  r!  r{   r?   r  rD   rI   r   r   r	   _get_cpu_info_from_cpufreq_info  s>    






r  c               
   C   sJ  t d zt s&t d i W S t \} }| dkrJt d i W S i }td|dddd}|rt|}d	}t|||d
< t|||d< t	|||d< t	|||d< td|dddd}|rt|}d	}t|||d
< t|||d< t	|||d< t	|||d< td|ddd}|r"||d< td|ddd}|rB||d< n(td|ddd}|rj|
 sj||d< td|ddd}|r|
 rt||d< td|ddd}|r|
 rt||d< td|ddd}	|	r|	
 rt|	|d< td|ddd}
|
r"|
dd  }
t|
|d< td|ddd}|rV|dd  }t||d< td|dddd }|r|dd  }t||d!< td|ddd"}|r|dd  }t||d#< td|ddd$d%d&}|r| }|  ||d$< t|dddd'}t   |W S  tyD } zt | i W  Y d}~S d}~0 0 dS )(zP
	Returns the CPU info gathered from lscpu.
	Returns {} if lscpu is not found.
	z Tying to get info from lscpu ...z"Failed to find lscpu. Skipping ...r   z!Failed to run lscpu. Skipping ...FNzCPU max MHzzCPU MHzr'  r   r   r   r   zCPU dynamic MHzzCPU static MHzz	Vendor IDr   z
Model namer   Modelz
CPU familyr   Steppingr   r   z	L1d cache(r   z	L1i cacher   zL2 cachez	L2d cacher   zL3 cacher   r   r  r  r  )r   r,   rP   rt   r<   rs   r  r   r.  r#  r  r   r8   rc   rB  r   rw  r-   r9   )r{   r?   rD   Znew_hzr!  rW  rZ  r   r   r   r   r   r   r   r   rI   r   r   r	   _get_cpu_info_from_lscpu;  s    




r#  c                  C   s   t d ttj\} }| dv r.t d i S t sDt d i S t \}}|du s`|dkrnt d i S t|}t 	  |S )zr
	Returns the CPU info gathered from dmesg.
	Returns {} if dmesg is not found or does not have the desired info.
	z$Tying to get info from the dmesg ...)r   zRunning on S390X. Skipping ...z"Failed to find dmesg. Skipping ...Nr   z&Failed to run "dmesg -a". Skipping ...)
r   r,   r   rP   r   r<   r\   r   rj  r-   )r   r   r{   r?   rD   r   r   r	   _get_cpu_info_from_dmesg  s    



r$  c                  C   s  t d zt s&t d i W S t \} }|du sB| dkrRt d i W S |dd  }dd	 |D }d
|}t	|dd d}t	|dd d}t
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dt
|dd }d!d	 | D }|  d"|i}t|}t   |W S  ty } zt | i W  Y d}~S d}~0 0 dS )#z
	Returns the CPU info gathered from lsprop /proc/device-tree/cpus/*/ibm,pa-features
	Returns {} if lsprop is not found or ibm,pa-features does not have the desired info.
	z!Tying to get info from lsprop ...z#Failed to find lsprop. Skipping ...Nr   zEFailed to glob /proc/device-tree/cpus/*/ibm,pa-features. Skipping ...zibm,pa-featuresr!   c                 S   s   g | ]}|t d v r|qS )Z0123456789abcfed)r   r   sr   r   r	   r
     r   z6_get_cpu_info_from_ibm_pa_features.<locals>.<listcomp>r.   r  rQ  r"   r=   rR   r'  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  )Zmmur  Zslbr  ZdabrneZwtrZmcrZdsisrZlpriZdabrxZsprg3Zrislbr  Zvpmzdss_2.05ZdarZpprzdss_2.02zdss_2.06Zlsd_in_dscrZugr_in_dscrzsso_2.06leZcfarZebzlsq_2.07zdss_2.07c                 S   s   g | ]\}}|r|qS r   r   rK  r   r   r	   r
   -  r   r   )r   r,   rP   rv   r<   r   r8   rd   r7   r   rq  r   r   rw  r-   r9   )r{   r?   r   r  r	  r   rD   rI   r   r   r	   "_get_cpu_info_from_ibm_pa_features  sl    



	
S
r*  c                  C   s^   t d t s t d i S t \} }|du s<| dkrJt d i S t|}t   |S )z
	Returns the CPU info gathered from /var/run/dmesg.boot.
	Returns {} if dmesg is not found or does not have the desired info.
	z6Tying to get info from the /var/run/dmesg.boot log ...z5Failed to find /var/run/dmesg.boot file. Skipping ...Nr   z5Failed to run "cat /var/run/dmesg.boot". Skipping ...)r   r,   rP   rf   r<   r   rj  r-   )r{   r?   rD   r   r   r	   )_get_cpu_info_from_cat_var_run_dmesg_boot;  s    


r+  c                  C   s  t d zvt s&t d i W S t \} }|du sB| dkrRt d i W S td|ddd}td|ddd	}td|tdd
}td|tdd}td|tdd}td|tdd}td|ddd 	 }|
td|ddd 	  |
td|ddd 	  |  t|\}	}
td|ddd}t|}||t|	|
t|dt|	|
t|dt|d ||||d}t|}t   |W S  ty } zt | i W  Y d}~S d}~0 0 dS )zR
	Returns the CPU info gathered from sysctl.
	Returns {} if sysctl is not found.
	z!Tying to get info from sysctl ...z#Failed to find sysctl. Skipping ...Nr   z@Failed to run "sysctl machdep.cpu hw.cpufrequency". Skipping ...Fzmachdep.cpu.vendorTzmachdep.cpu.brand_stringzmachdep.cpu.cache.sizezmachdep.cpu.steppingzmachdep.cpu.modelzmachdep.cpu.familyr.   zmachdep.cpu.featureszmachdep.cpu.leaf7_featureszmachdep.cpu.extfeaturesr   r8  r   r   r   r   r   r   r   r   r   r   r   )r   r,   rP   rl   r<   r   r  r   rd   r8   extendr   rG  r   r.  r#  rw  r-   r9   )r{   r?   rW  r   r  r   r   r   r   r   r!  r   rD   rI   r   r   r	   _get_cpu_info_from_sysctlS  sP    




r.  c                  C   s   t  } | t  | S )T
	Returns the CPU info gathered from sysinfo.
	Returns {} if sysinfo is not found.
	)_get_cpu_info_from_sysinfo_v1update_get_cpu_info_from_sysinfo_v2)rD   r   r   r	   _get_cpu_info_from_sysinfo  s    r3  c                  C   s  t d znt s&t d i W S t \} }|du sB| dkrRt d i W S d}|dd d	d  }d}t|d
d dd  }t|dd dd  }t|dd dd  }g }|dD ]0}	|		dr|	 
  D ]}
||
 qq|  t|\}}|}||t||t||t||t||t|||||d}t|}t   |W S  ty } zt | i W  Y d}~S d}~0 0 dS )r/  z,Tying to get info from sysinfo version 1 ...$Failed to find sysinfo. Skipping ...Nr   *Failed to run "sysinfo -cpu". Skipping ...r.   	CPU #0: "r!   "
z, stepping r  z, model z	, family r0   		r,  )r   r,   rP   rr   r<   r   r8   rc   r   rs  rd   r   r   rG  r.  r#  r7  rw  r-   r9   )r{   r?   rW  r   r  r   r   r   r   r+   ri  r   r!  r   rD   rI   r   r   r	   r0    sR    


   

r0  c                  C   s2  t d zt s&t d i W S t \} }|du sB| dkrRt d i W S d}|dd d	d  }d}|d
d dd  }t|dd dd  }t|dd dd  }t|dd dd  }dd }	|	|dd |	|dd  |	|dd  }
|
	  dd |dD }|d dd  
 }|dd }t|}|}d}|drd}n|drd}||t||t||t||t||t|||||
d}t|}t   |W S  ty, } zt | i W  Y d}~S d}~0 0 dS )r/  z,Tying to get info from sysinfo version 2 ...r4  Nr   r5  r.   r6  r!   r7  z
Signature:r0   z	stepping r  zmodel zfamily c                 S   sZ   g }|  ddd  D ]>}|ds2|ds2 qV|   dD ]}|| qDq|S )Nr0   r!   z                r8  r   )r8   rs  rc   rd   r   )r?   r  r+   r@  r   r   r	   get_subsection_flags  s    z;_get_cpu_info_from_sysinfo_v2.<locals>.get_subsection_flagsz
Features: z Extended Features (0x00000001): z Extended Features (0x80000001): c                 S   s   g | ]}|r|qS r   r   r   r   r   r	   r
   	  r   z1_get_cpu_info_from_sysinfo_v2.<locals>.<listcomp>zrunning at r&  r%  r'  r   r,  )r   r,   rP   rr   r<   r   r8   rc   r   r   rd   r  r   r  r.  r#  r7  rw  r-   r9   )r{   r?   rW  r   r  	signaturer   r   r   r9  r   re  Zraw_hzr   r   r!  rD   rI   r   r   r	   r2    sf    


   
r2  c                  C   sF  t d z tjrt s,t d i W S t \} }|du sH| dkrXt d i W S |d}dd |D }d	d
 |D }|d}t	|\}}|d}d}|rt
|}|d}|rt|d }|d}	|	rt|	d }	d\}
}}|dp|d}|d}d|v rF|dt|d k rF|d}t||d  }
d|v r|dt|d k r|d}t||d  }d|v r|dt|d k r|d}t||d  }|d|t||t||t||t||||	|||
d}t|}t   |W S  ty@ } zt | i W  Y d}~S d}~0 0 dS )zd
	Returns the CPU info gathered from WMI.
	Returns {} if not on Windows, or wmic is not installed.
	zTying to get info from wmic ...z4Failed to find WMIC, or not on Windows. Skipping ...Nr   z Failed to run wmic. Skipping ...r0   c                 S   s"   g | ]}d |v r|  d qS r`  )r  r8   r%  r   r   r	   r
   D	  r   z+_get_cpu_info_from_wmic.<locals>.<listcomp>c                 S   s   i | ]\}}|r||qS r   r   rK  r   r   r	   r   E	  r   z+_get_cpu_info_from_wmic.<locals>.<dictcomp>NameZCurrentClockSpeedr'  ZL2CacheSizer8  ZL3CacheSize)r.   r.   r.   DescriptionZCaptionr   Familyr!   r   r!  ZManufacturer)r   r   r   r   r   r   r   r   r   r   r   )r   r,   rP   r   r|   r<   r   r8   rx   rG  r   r   r  rZ   r.  r#  rw  r-   r9   )r{   r?   r   r   r   Zscale_advertisedr   Zscale_actualr   r   r   r   r   descriptionentriesr  rD   rI   r   r   r	   _get_cpu_info_from_wmic0	  sl    









"
"
"

r@  c                     s  t d ztjs$t d i W S t  } t }t }t	|\}}t
 }t|}t| \}}|dkr|d}t|}t   f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 }	|	  || t||t|dt||t|d|	d'}
t|
}
t   |
W S  ty } zt | i W  Y d(}~S d(}~0 0 d(S ))z[
	Returns the CPU info gathered from the Windows Registry.
	Returns {} if not on Windows.
	z+Tying to get info from Windows registry ...z$Not running on Windows. Skipping ...r  r'  c                    s   d| ? }| @ dk}|S )Nl        r   r   )rn  ro  r  r   r   r	   rp  	  s    z+_get_cpu_info_from_registry.<locals>.is_setr   r!   r"   r=   r  rR   r  r  r   r  r  r  r  r  r  rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  r  r  Zsepamdr  r  r  r  r  r  r  serialr  r  r  r  r  r  r  r  r  r  r  c                 S   s   g | ]\}}|r|qS r   r   rK  r   r   r	   r
   	  r   z/_get_cpu_info_from_registry.<locals>.<listcomp>)r   r   r   r   r   r   r   N)r   r,   rP   r   r<   r   rc   r   r   r   r   r   rG  r   r   r   r.  r#  rw  r-   r9   )r   rW  r   r   r   r   r   r!  rp  r   rD   rI   r   r   r	   _get_cpu_info_from_registry	  s    

	$
rB  c                  C   s  t d zt rt s.t d i W S t \} }|du sJ| dkrZt d i W S t \} }|du sv| dkrt d i W S |dd d	d 	 }|d
d d	d 	 }t
|dd d	d 	 }t
|dd d	d 	 }t
|dd d	d 	 }|	 d	d 	   }|  d}	|dd d	d 	 }
t|
}
|dd d	d 	 }t|}||t|
|	t|dt|
|	t|d||||d
}t|}t   |W S  ty
 } zt | i W  Y d}~S d}~0 0 dS )zh
	Returns the CPU info gathered from isainfo and kstat.
	Returns {} if isainfo or kstat are not found.
	z Tying to get info from kstat ...z,Failed to find isinfo or kstat. Skipping ...Nr   z)Failed to run "isainfo -vb". Skipping ...z/Failed to run "kstat -m cpu_info". Skipping ...z	vendor_id r!   r0   z	brand z
	stepping z	model z	family r2  r'  z	clock_MHz z	current_clock_Hz )
r   r   r   r   r   r   r   r   r   r   )r   r,   rP   rn   rp   r<   r   r   r8   rc   r   rd   r   r   r.  r#  rw  r-   r9   )r{   Zflag_outputro   rW  r   r   r   r   r   r!  r   r   rD   rI   r   r   r	   _get_cpu_info_from_kstat	  sT    



   
rC  c               
   C   s2  t d ztjdd } d\}}}| d}d|v rh|dt|d k rh|d}t||d  }d|v r|dt|d k r|d}t||d  }d	|v r|d	t|d k r|d	}t||d  }|||d
}t|}t 	  |W S  t
y, } zt | i W  Y d }~S d }~0 0 d S )Nz)Tying to get info from platform.uname ...r  r   )NNNr   r=  r!   r   r!  )r   r   r   )r   r,   rP   r   r8   r  rZ   r   rw  r-   r9   r<   )re   r   r   r   r?  r  rD   rI   r   r   r	   !_get_cpu_info_from_platform_uname1
  s0    






rD  c                  C   s  t d ttj\} }dddtjp,d}djtj	 }d||}|t
t| |tjtjd}t d	|d
  t d|d  t d|d  t d|d  t d|d  t d|d  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t d |S )zo
	Returns the CPU info by using the best sources of information for your OS.
	Returns {} if nothing is found.
	zP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z32 bitz64 bit)il    zunknown bitsz{0}.{1}.{2}.{3}.{4}z	{0} ({1}))python_versioncpuinfo_versioncpuinfo_version_stringr   r   r   r   zpython_version: {0}rE  zcpuinfo_version: {0}rF  z	arch: {0}r   z	bits: {0}r   z
count: {0}r   zarch_string_raw: {0}r   )r   r%   r   rP   r   rx   r  maxsizer   version_infoCPUINFO_VERSIONCPUINFO_VERSION_STRINGr   r  r@  rB  r  r  r#  r.  rC  r$  r+  r*  r3  r  rD  )r   r   Zfriendly_maxsizeZfriendly_versionPYTHON_VERSIONrD   r   r   r	   _get_cpu_info_internalS
  sD    


rM  c                  C   s   ddl } d}ttddr4t }| |}d|}nRddlm}m} tj	t
dg}|||||d}| d }|jdkrzd	S |jd
d}|S )zs
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a json string
	r   NfrozenFr  r   --jsonr   z{}r   r   )jsongetattrr  rM  r   r   r   r   r   
executable__file__r   r{   r   )rP  r?   rD   r   r   r   r   r   r   r	   get_cpu_info_json
  s    

rT  c                  C   s    ddl } t }| j|td}|S )zl
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a dict
	r   N)object_hook)rP  rT  r   r   )rP  r?   r   r   r	   get_cpu_info
  s    rV  c               
   C   s  ddl m}  dd l}| dd}|jdddd |jd	dd
d |jdddd | }t|jdaz
t  W nB t	y } z*t
jt|d  t
d W Y d }~n
d }~0 0 t }|st
jd t
d |jrt|| n(|jrtt ntd|dd td|dd td|dd td|dd td|dd td|dd td|dd td |d!d td"|d#d td$|d%d td&|d'd td(|d)d td*|d+d td,|d-d td.|d/d td0|d1d td2|d3d td4|d5d td6|d7d td8|d9d td:|d;d td<|d=d td>|d?d td@dA|dBd d S )CNr   )ArgumentParserzGets CPU info with pure Python)r>  rO  
store_truezReturn the info in JSON format)actionhelpz	--versionz Return the version of py-cpuinfoz--tracez/Traces code paths used to find CPU info to fileFr0   r!   zFailed to find cpu info
zPython Version: {0}rE  r.   zCpuinfo Version: {0}rG  zVendor ID Raw: {0}r   zHardware Raw: {0}r   zBrand Raw: {0}r   zHz Advertised Friendly: {0}r   zHz Actual Friendly: {0}r   zHz Advertised: {0}r   zHz Actual: {0}r   z	Arch: {0}r   z	Bits: {0}r   z
Count: {0}r   zArch String Raw: {0}r   zL1 Data Cache Size: {0}r   zL1 Instruction Cache Size: {0}r   zL2 Cache Size: {0}r   zL2 Cache Line Size: {0}r   zL2 Cache Associativity: {0}r   zL3 Cache Size: {0}r   zStepping: {0}r   z
Model: {0}r   zFamily: {0}r   zProcessor Type: {0}r   z
Flags: {0}z, r   )argparserW  rP  add_argument
parse_argsr   rt  r   r   r9   r  rH   r%   r   exitrM  printr   versionrK  r   rx   r7   )rW  rP  parserr	  rI   rD   r   r   r	   main
  sZ    

 
rb  __main__F)N)<rJ  r7   rK  rT   r  ra   r   r  r  r   objectr   rP   r[   rz   r   r   r   r   r   r  r
  r  r   r#  r(  r.  r7  rB  rG  r]  rj  r   rq  ru  rw  rx  r  r   r  r  r  r  r#  r$  r*  r+  r.  r3  r0  r2  r@  rB  rC  rD  rM  rT  rV  rb  rM   r   r   r   r	   <module>   s   { 

	"4_9$X    Kd`/a @
ARTiD"L 9

