
    Vhđ                        d dl mZ d dlZd dlZd dlZd dl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 d dlmZ d dlmZmZ d dlmZmZmZ d d	lmZ d d
lmZ d Z G d de      Z G d de      Zy)    )annotationsN)_futures)get_best_parsable_locale)to_text)bytes_to_human)HardwareHardwareCollector)get_file_contentget_file_linesget_mount_size)	iteritems)timeoutc                    	 t        j                  d      }|D ]0  }t         j                  j	                  d|z         }|d| z   k(  s.|c S  y # t        $ r Y y w xY w)N/dev/disk/by-uuidz/dev/disk/by-uuid/z/dev/)oslistdirOSErrorpathrealpath)partnameuuidsuuiddevs       Y/home/dcms/DCMS/lib/python3.12/site-packages/ansible/module_utils/facts/hardware/linux.pyget_partition_uuidr   '   sl    

./  gg3d:;7X%&K
   s   A 	AAc                  P   e Zd ZdZdZ ed      Zej                  d      Z e	j                  d      Z e	j                  d      Z e	j                  d      Zd!d	Zd
 Zd!dZd Zd Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d  Z&y)"LinuxHardwarea"  
    Linux-specific subclass of Hardware.  Defines memory and CPU facts:
    - memfree_mb
    - memtotal_mb
    - swapfree_mb
    - swaptotal_mb
    - processor (a list)
    - processor_cores
    - processor_count

    In addition, it also defines number of DMI facts and device facts.
    Linux)MemTotal	SwapTotalMemFreeSwapFree)BuffersCached
SwapCachedz.*\]z	.*bind.*"z
\\[0-9]{3}Nc                   i }t        | j                        }|||d| j                  _        | j                  |      }| j	                         }| j                         }| j                         }| j                         }| j                         }	| j                         }
i }	 | j                         }|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |	       |j                  |
       |j                  |       |S # t        j                  $ r | j                  j                  d       Y w xY w)N)LANGLC_ALL
LC_NUMERIC)collected_factsz,No mount facts were gathered due to timeout.)r   modulerun_command_environ_updateget_cpu_factsget_memory_factsget_dmi_factsget_sysinfo_factsget_device_factsget_uptime_factsget_lvm_factsget_mount_factsr   TimeoutErrorwarnupdate)selfr*   hardware_factslocale	cpu_factsmemory_facts	dmi_factssysinfo_factsdevice_factsuptime_facts	lvm_factsmount_factss               r   populatezLinuxHardware.populateS   sM   )$++6:@Fbh1i.&&&G	,,.&&(	..0,,.,,.&&(		M..0K 	i(l+i(m,l+l+i(k* ## 	MKKKL	Ms   "D< <.E-,E-c                   i }t        j                  dt         j                        s|S i }t        d      D ]  }|j	                  dd      }|d   }|| j
                  v rG|d   j                         j	                  d      d   }t        |      dz  |d|j                         z  <   || j                  v s~|d   j                         j	                  d      d   }t        |      dz  ||j                         <    d |j                  d      |j                  d	      fvr|d   |d	   z
  |d
<   d |j                  d      |j                  d	      |j                  d      fvr|d   |d	   z   |d   z   |d<   d |j                  d      |j                  d      fvr|d   |d   z
  |d<   d |j                  d      |j                  d      fvr|d   |d   z
  |d<   |j                  d      |j                  d
      |j                  d	      d|j                  d      |j                  d      d|j                  d      |j                  d      |j                  d      |j                  d      dd|d<   |S )Nz/proc/meminfo:   r    i   z%s_mbmemtotalmemfreez	real:usedcachedbuffersznocache:freeznocache:used	swaptotalswapfreez	swap:used)totalusedfree)rP   rO   
swapcached)rN   rP   rO   rJ   )realnocacheswap	memory_mb)r   accessR_OKr   splitORIGINAL_MEMORY_FACTSstripintlowerMEMORY_FACTSget)r8   r<   memstatslinedatakeyvals          r   r.   zLinuxHardware.get_memory_factsq   sq   yy"''2"?3 		9D::c1%Dq'Cd0001gmmo++C0369#h$6FWsyy{23d'''1gmmo++C03(+CD(8%		9 Z0(,,y2IJJ$,Z$88I;N$NH[!X.Y0GV_I`aa'/'9HY<O'ORZ[dRe'eH^$Z0(,,~2NOO'/
';h~>V'VH^$[18<<
3KLL$,[$9HZ<P$PH[! "j1 [1 Y/ !^4 ^4
 "k2 Z0 [1",,|4	%
[!$     c                :   i }|xs i }d}d}d}d}d}d}i }	i }
d}d}d}d}	 t         j                  j                  d      rd}n&t        d      D ]  }|j	                         dk(  rd} n t        j                  dt         j                        s|S g |d<   t        d      D ]+  }|j                  d	d
      }|d   j	                         }	 |d
   j	                         }|r|dk(  rd|vrd}|dk(  r|j                         |d<   |dv rAd|vrg |d<   |d   j                  |       |dk(  r|d
z  }|dk(  r|d
z  }|dk(  r|d
z  }|d
z  }|dk(  r|}||	vsd
|	|<   |dk(  r|}||	vsd
|
|<   |dk(  rt        |      |	|<   |dk(  rt        |      |
|<   |dk(  rt        |      }|dk(  rt        |      d
z   }|dk(  s!t        |      }. |dkD  r||k(  r|}|j                  dd      j                  d      r|}|j                  d      dk(  r&d
|d<   t        ||z        |d<   ||d<   ||d<   ||d<   n|r||d<   ||d<   d
|d<   ||d<   ||d<   n|	rt        |	      |d<   n||d<   t!        |	j#                               }|r|d   r	|d   |d<   nd
|d<   t!        |
j#                               }|rt        |d   |d   z        |d<   nt        d
|d   z        |d<   |d   |d   z  |d   z  |d<   ||d<   	 t        t        j$                  d            |d<   |S # t
        $ r Y w xY w# t        $ r d}Y ]w xY w# t&        $ rS | j(                  j+                  d       }|2| j(                  j-                  |      \  }}}|dk(  rt        |      |d<   Y |S w xY w)!Nr   Fz	/proc/xenTz/sys/hypervisor/typexenz/proc/cpuinfo	processorrE   rF    flagsvme)
model name	Processor	vendor_idcpuVendorrg   rm   rk   zphysical idzcore idz	cpu coressiblingsz# processorszmax thread idzncpus activeansible_architecture)armvaarchppcs390xprocessor_countprocessor_coresprocessor_threads_per_coreprocessor_vcpusprocessor_nprocnproc)r   r   existsr   rZ   IOErrorrV   rW   rX   
IndexErrorappendr[   r^   
startswithroundlenlistvaluessched_getaffinityAttributeErrorr+   get_bin_pathrun_command)r8   r*   r;   ivendor_id_occurrencemodel_name_occurrenceprocessor_occurrencephysidcoreidsocketscoreszpzmtrf   xen_paravirtr`   ra   rb   rc   socket_valuescore_values	nproc_cmdrcout_errs                            r   r-   zLinuxHardware.get_cpu_facts   s   	)/R  ! 
	ww~~k**+AB Dzz|u,"	 yy"''2!#	+"?3 5	D::c1%Dq'--/C1gmmo '>
 C''+g~%(YY[	'" \\i/-/Ik*+&--c2+%(A-(,&)Q.)+%(A-(Q%(&'GFO	!($%E&M#"%c(
" #Cf&X'#hl&Hk5	p  !##'<<( 5r:EEF^_$A56'A+,I'(+0c?I'(69I23+-I'(+-I'(/0	+,/0	+,:;	67/0	+,/0	+,36w<I/034I/0 $W^^%5 6 ]1%53@3CI/034I/0"5<<>2>CKPQNU^_pUqDq>rI:;>CA	RcHdDd>eI:;09:V0W09:K0L1MOXYjOk1l	+, 0D	+,

	<+.$$Q',I'( }  		  R  	<009I$ $ 7 7	 BC736s8I/0	<s7   AL 
L,9!L> 	L)(L),L;:L;>ANNc           	        i }t         j                  j                  d      rg d}i 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%i}|j                         D ]5  \  }}t	        |      }||dk(  r	 |t        |         |d<   +|||<   1d'||<   7 |S i dd(dd)dd*d	d+dd,dd-dd.dd/dd0dd1dd2dd3dd4dd5dd6d d7d"d8d$d9i}| j                  j                  d:      }|&t        j                  |j                         d'      }|S |j                         D ]  \  }}	| j                  j                  |d;|	      \  }
}}|
d<k(  r[d=j                  |j                         D cg c]  }|j                  d>      r| c}      }	 t!        j"                  |       |||<   d'||<    |S # t        $ r d&|z  |d<   Y mw xY wc c}w # t$        $ r d'}Y 9w xY w)?z learn dmi facts from system

        Try /sys first for dmi related facts.
        If that is not available, fall back to dmidecode executable z(/sys/devices/virtual/dmi/id/product_name)%UnknownOtherr   DesktopzLow Profile Desktopz	Pizza Boxz
Mini TowerTowerPortableLaptopNotebookz	Hand HeldzDocking Stationz
All In OnezSub NotebookzSpace-savingz	Lunch BoxzMain Server ChassiszExpansion ChassiszSub ChassiszBus Expansion ChassiszPeripheral ChassiszRAID ChassiszRack Mount ChassiszSealed-case PCzMulti-system
CompactPCIAdvancedTCABladezBlade EnclosureTabletConvertible
DetachablezIoT GatewayzEmbedded PCzMini PCzStick PC	bios_datez%/sys/devices/virtual/dmi/id/bios_datebios_vendorz'/sys/devices/virtual/dmi/id/bios_vendorbios_versionz(/sys/devices/virtual/dmi/id/bios_versionboard_asset_tagz+/sys/devices/virtual/dmi/id/board_asset_tag
board_namez&/sys/devices/virtual/dmi/id/board_nameboard_serialz(/sys/devices/virtual/dmi/id/board_serialboard_vendorz(/sys/devices/virtual/dmi/id/board_vendorboard_versionz)/sys/devices/virtual/dmi/id/board_versionchassis_asset_tagz-/sys/devices/virtual/dmi/id/chassis_asset_tagchassis_serialz*/sys/devices/virtual/dmi/id/chassis_serialchassis_vendorz*/sys/devices/virtual/dmi/id/chassis_vendorchassis_versionz+/sys/devices/virtual/dmi/id/chassis_versionform_factorz(/sys/devices/virtual/dmi/id/chassis_typeproduct_nameproduct_serialz*/sys/devices/virtual/dmi/id/product_serialproduct_uuidz(/sys/devices/virtual/dmi/id/product_uuidproduct_versionz+/sys/devices/virtual/dmi/id/product_versionsystem_vendorz&/sys/devices/virtual/dmi/id/sys_vendorzunknown (%s)NAzbios-release-datezbios-vendorzbios-versionzbaseboard-asset-tagzbaseboard-product-namezbaseboard-serial-numberzbaseboard-manufacturerzbaseboard-versionzchassis-asset-tagzchassis-serial-numberzchassis-manufacturerzchassis-versionzchassis-typezsystem-product-namezsystem-serial-numberzsystem-uuidzsystem-versionzsystem-manufacturer	dmidecodez -s r   rh   #)r   r   r|   itemsr
   r[   r~   r+   r   dictfromkeyskeysr   join
splitlinesr   jsondumpsUnicodeDecodeError)r8   r=   FORM_FACTORDMI_DICTrb   r   ra   dmi_binkvr   r   errr`   	thisvalues                  r   r/   zLinuxHardware.get_dmi_facts9  s|    	77>>DE	AKDH  J "#P	
 F  J  J  !L $%T !"N !"N "#P I  J !"N   J!" "#P#$  !I%H*  (~~/ *d'-#m+M7B3t97MIm4 *.	#%)IcN*r U0}  "#8	
 6  9  8  !4 $%8 !"9 !"8 "#4 ~  5 !"8  !" "#3#$  !6%H( kk..{;G MMMMO	 ! "..* (A!%!8!8wPQ9R!SS#7 "#..:J(g$RVRaRabeRf(g hI)

9- $-IaL#'IaL( g  * M7E7LIm4MR )h . )$(	)s0   GG 
G 
$G%GG%G32G3c           	        t         j                  j                  d      si S t        j	                  dd      }t        j                  dt
        j                  t
        j                  z        }t        d      }|j                  |      D ]F  }|j                  |j                         j                         D ci c]  \  }}|	|| c}}       H |S c c}}w )z2Fetch /proc/sysinfo facts from s390 Linux on IBM Zz/proc/sysinfo)r   r   r   r   r   r   z
                ^
                    (?:Manufacturer:\s+(?P<system_vendor>.+))|
                    (?:Type:\s+(?P<product_name>.+))|
                    (?:Sequence\ Code:\s+0+(?P<product_serial>.+))
                $
            )r   r   r|   r   r   recompileVERBOSE	MULTILINEr
   finditerr7   	groupdictr   )r8   r>   
sysinfo_rera   matchr   r   s          r   r0   zLinuxHardware.get_sysinfo_facts  s    ww~~o.Ib
 ZZ JJ%	

  0((. 	`E  5??3D3J3J3L!^41aPQP]!Q$!^_	` "_s   8
CCc                ^    g d}|g|z   }| j                   j                  |      \  }}}|||fS )N)--list--noheadingsz--pathsz--outputz	NAME,UUIDz	--exclude2r+   r   )r8   
lsblk_pathargscmdr   r   r   s          r   
_run_lsblkzLinuxHardware._run_lsblk  s<    
 `lT!{{..s3C3|rd   c                r   i }| j                   j                  d      }|s|S | j                  |      \  }}}|dk7  r|S |j                         D ]f  }|s|j	                         }|j                  d d      }t        |      dk  r7|d   j	                         |d   j	                         }
}	|	|v rb|
||	<   h |S )Nlsblkr   rF      )r+   r   r   r   rZ   rsplitr   )r8   r   r   r   r   r   
lsblk_liner`   fieldsdevice_namer   s              r   _lsblk_uuidzLinuxHardware._lsblk_uuid  s    [[--g6
Lz2C7L
 ..* 	&J##%D[[q)F6{Q &q	 16!9??3DKe#!%E+	& rd   c                    d}| j                   j                  d      }|s|S |dddd|g}| j                   j                  |      \  }}}|dk7  r|S t        j                  d|      }|r|j                  d	      }|S )
NN/Audevadminfoz--querypropertyz--namer   zID_FS_UUID=(.*)
rF   )r+   r   r   r   searchgroup)	r8   devicer   udevadm_pathr   r   r   r   ms	            r   _udevadm_uuidzLinuxHardware._udevadm_uuid  s    {{//	:KVY
HfM{{..s3C7K II)3/771:Drd   c                b    g d}|g|z   }| j                   j                  |d      \  }}}|||fS )N)r   r   z--notruncatesurrogate_then_replaceerrorsr   )r8   findmnt_pathr   r   r   r   r   s          r   _run_findmntzLinuxHardware._run_findmnt  s?    9nt#{{..s;S.TC3|rd   c                ^   t               }| j                  j                  d      }|s|S | j                  |      \  }}}|dk7  r|S |j	                         D ]T  }|j                         }t        |      dk  r"| j                  j                  |d         sA|j                  |d          V |S )Nfindmntr   r   rF   )
setr+   r   r   r   rX   r   BIND_MOUNT_REr   add)r8   bind_mountsr   r   r   r   r`   r   s           r   _find_bind_mountszLinuxHardware._find_bind_mounts  s    e{{//	:((6C7 NN$ 	+DZZ\F6{Q !!''q	2q	*	+ rd   c                    d}t         j                  j                  |      sd}t        |d      }g }|j	                         D ]2  }|j                         }t        |      dk  r"|j                  |       4 |S )Nz	/etc/mtabz/proc/mountsrh      )r   r   r|   r
   r   rX   r   r   )r8   	mtab_filemtabmtab_entriesr`   r   s         r   _mtab_entrieszLinuxHardware._mtab_entries  sr    	ww~~i(&I	2.OO% 	(DZZ\F6{Q'		(
 rd   c                N    t        t        | j                         dd  d            S )NrF      )chrr[   r   )r   s    r   _replace_octal_escapes_helperz+LinuxHardware._replace_octal_escapes_helper$  s#     3u{{}QR(!,--rd   c                N    | j                   j                  | j                  |      S N)OCTAL_ESCAPE_REsubr  )r8   values     r   _replace_octal_escapesz$LinuxHardware._replace_octal_escapes)  s!    ##''(J(JERRrd   c                b    t        |      }|j                  || j                  |            }||fS r
  )r   r^   r   )r8   mountr   r   
mount_sizer   s         r   get_mount_infozLinuxHardware.get_mount_info,  s4    #E*

 yy!3!3F!;<4rd   c                   g }| j                         }| j                         }| j                         }i }t        j                         }t
        j                  xs t
        j                  }|D ]  }|D 	cg c]  }	| j                  |	       }}	|d   |d   |d   |d   f\  }
}}}t        |d         t        |d         }}|
j                  d      sd|
vs|d	k(  ro||
||||d
}||v r(| j                  j                  |      s|dxx   dz  cc<   |t        j                         |z   d||<   |j                  | j                   ||
|      ||   d<    |j#                          |rt%        |      D ]  }d}||   d   }	 |j'                         rkd}|j)                         <|j+                         \  }}|r||   d   j-                  |       |xs d||   d   d<   ned|j)                          ||   d   d<   nHt        j                         ||   d   kD  r+d}| j.                  j1                  d|z         d||   d   d<   |s|j?                  ||   d          ||=  t        j@                  d       |rd|iS c c}	w # t2        $ rx}dd l}d}d||   d<   | j.                  j1                  d|dt7        |      dt9        |      d       | j.                  j;                  |j=                                Y d }~d }~ww xY w)Nr   rF   r      r      )/\z:/none)r  r   fstypeoptionsdumppassnor  z,bind)r   	timelimitextraFTr   r   r   z!Could not get extra information: noter  z/Timeout exceeded when getting mount info for %sz.Could not get extra information due to timeoutz-Error prevented getting extra info for mount z: [z] .g?mounts)!r   r   r  r   DaemonThreadPoolExecutorr   GATHER_TIMEOUTDEFAULT_GATHER_TIMEOUTr  r[   r   MTAB_BIND_MOUNT_REr   time	monotonicsubmitr  shutdownr   done	exceptionresultr7   r+   r6   	Exception	tracebacktyper   debug
format_excr   sleep)r8   r!  r   r   r  resultsexecutormaxtimer   fieldr   r  r  r  r  r  
mount_infor*  resr  r   er.  s                          r   r4   zLinuxHardware.get_mount_facts7  s:    ,,.  "))+ 446((JG,J,J" 	aFFLMUd11%8MFM-3AYq	6!9fUVi-W*FE67vay>3vay>&D$$[1d&6HFV\L\#($*$*%,"&$*,J #..44W=y)W4)&0t~~?ORY?YZGEN&.ood6I6I5RXZ_&`GEN7#/	a4 	g 'enW->xxz#==?2/2zz|,J) 'v 6 = =j I=A]UGEN626: @aadananap`q=rGEN626:)GEN;,GG#(()Z]b)bc9iv.v6 MM'%."89;'@ JJsOC F &!!{ N\ ! >$D-2GEN6*KK$$dikopqkrt{|}t~%  AKK%%i&:&:&<==>s    4I? CJ	LA.L  Lc           	        t         j                  j                  |      si S 	 t        j                  t
              }t        j                  |      D ]g  }	 t         j                  j                  t        j                  t         j                  j                  ||                  }||   j                  |       i t        d t        |      D              S # t        $ r Y w xY w# t        $ r i cY S w xY w)Nc              3  N   K   | ]  \  }}|t        t        |            f  y wr
  r   sorted.0r   r   s      r   	<genexpr>z1LinuxHardware.get_device_links.<locals>.<genexpr>  !     M!QDO,M   #%)r   r   r|   collectionsdefaultdictr   r   basenamereadlinkr   r   r   r   r   )r8   link_dirretvalentrytargets        r   get_device_linkszLinuxHardware.get_device_links  s    ww~~h'I
	 ,,S1FH- WW--bkk"'',,xQV:W.XYF6N&&u- M9V;LMMM    	I	s6   1C% A$C9C% 	C"C% !C""C% %C32C3c                    	 t        j                  t              }t        j                  d      D ]1  }|j	                  d      }|d   }|d   }||   j                  |       3 t        d t        |      D              S # t        $ r i cY S w xY w)Nz/sys/block/*/slaves/*r  r  r  c              3  N   K   | ]  \  }}|t        t        |            f  y wr
  r<  r>  s      r   r@  z6LinuxHardware.get_all_device_owners.<locals>.<genexpr>  rA  rB  )	rC  rD  r   globrX   r   r   r   r   )r8   rH  r   elementsr   rJ  s         r   get_all_device_ownersz#LinuxHardware.get_all_device_owners  s    		 ,,S1F		"9: +::c?!!!!v""6*	+
 M9V;LMMM 	I	s   A<A? ?BBc                    | j                  d      | j                  d      | j                  d      | j                         dS )N/dev/disk/by-idr   z/dev/disk/by-label)idsr   labelsmasters)rK  rP  )r8   s    r   get_all_device_linksz"LinuxHardware.get_all_device_links  sE    (():;**+>?++,@A113	
 	
rd   c                0   g |d<   t         j                  j                  |dz         rot        j                  |dz         D ]S  }|j	                  d      st        |dz   |z   dz         }|r|d   j                  |       @|d   j                  |       U y y )Nholdersz/holderszdm-z	/holders/z/dm/name)r   r   isdirr   r   r
   r   )r8   block_dev_dictsysdirfoldernames        r   get_holderszLinuxHardware.get_holders  s    $&y!77==*,-**Vj%89 =((/'(<v(E
(RS"9-44T:"9-44V<= .rd   c                    d|z  }| j                   j                  ||g      \  }}}|dk(  r*t        j                  d|      }|r|j	                  d      S y y )Nz/dev/%sr   z&(?:Unit serial|Serial) number:\s+(\w+)rF   )r+   r   r   r   r   )r8   sg_inqblockr   r   	drivedatar   serials           r   _get_sg_inq_serialz LinuxHardware._get_sg_inq_serial  s_    e$![[44ff5EFIs7YYH)TF||A&  rd   c           	        i }i |d<   | j                   j                  d      }|r$| j                   j                  |dgd      \  }}}nd }	 t        j                  d      }i }	 t        j                  d      }|D ]m  }	|	j                  d      s	 t        j                  t        j                  j                  d|	            }
|	d	d  |t        j                  j                  |
      <   o 	 | j                         }||d
<   |D ]>  }d}d}	 t        j                  t        j                  j                  d|            }t        j                  j                  d|      }|dk(  r"t        j                  |      D ]
  }d|v sd} n i }||d<   i |d<   t!        |      D ]  \  }}|j#                  |g       |d   |<    t        j                  j                  |      }dD ]  }t%        |dz   |z         ||<    | j                   j                  d      }d|z  }|r| j'                  ||      }|r||d<   nt%        |      }|r||d<   t%        |dz         |d<   t%        |dz         dk(  rdnt%        |dz         |d<   ||v r||   |d<   i |d<   t        j                  |      D ]%  }t)        j*                  d|z   dz   |      }|s#i }|j-                  d      }|d z   |z   }i |d<   t!        |      D ]  \  }}|j#                  |g       |d   |<    t%        |d!z   d      |d"<   t%        |d#z         |d$<   |d$   st%        |d%z   d&      |d$<   t/        t%        |d'z   d            d&z  t/        |d$         z  |d(<   t1        t3        |d(         t3        |d$         z        |d)<   t5        |      |d*<   | j7                  ||       ||d   |<   ( t%        |d+z         |d,<   d-|d.<   t%        |d/z         }|,t)        j8                  d0|      }|r|j-                  d1      |d.<   t%        |d#z         |d$<   |d$   st%        |d%z   d&      |d$<   t/        t%        |d'z               d&z  t/        |d$         z  |d(<   |d(   sd|d(<   t1        t3        |d(         t3        |d$         z        |d)<   d-|d2<   t)        j8                  d3|      }|ri|rg|j-                  d      } t)        j:                  |       }!t)        j*                  d4|!z   d5z   |t(        j<                        }|r|j-                  d      |d2<   | j7                  ||       ||d   |<   A |S # t
        $ r |cY S w xY w# t
        $ r Y w xY w# t
        $ r Y w xY w# t
        $ r@ t        j                         d   }|j                  t        j                  k(  r|}d}nY Y w xY w)6Ndeviceslspciz-Dr   r   z
/sys/blockrR  zwwn-r   device_linksrF   r   z/sys/block/r   virtuallinks)vendormodelsas_addresssas_device_handlez/device/r`  z/sys/block/%s/device/serialrc  z
/removable	removablez/queue/discard_max_hw_bytes0z/queue/discard_granularitysupport_discardwwn
partitions(z[p]?\d+)r  z/startstartz/queue/logical_block_size
sectorsizez/queue/hw_sector_sizei   z/sizesectorssizer   z/queue/rotational
rotationalrh   scheduler_modez/queue/schedulerz.*?(\[(.*)\])r   hostz2.+/([a-f0-9]{4}:[a-f0-9]{2}:[0|1][a-f0-9]\.[0-7])/^z\s(.*)$)r+   r   r   r   r   r   r   rF  r   r   rE  rV  sysexc_infoerrnoEINVALr   r^   r
   rd  r   r   r   r[   r   floatr   r^  r   escaper   )"r8   r?   rg  r   pcidatar   
block_devsdevs_wwn
devs_by_id	link_namewwn_linkrj  ra  ri  sysfs_no_linksr   r9  r[  r\  d	link_typelink_valuesdisknamerb   r`  serial_pathrc  r   partr   part_sysdir	schedulerpciiddids"                                     r   r1   zLinuxHardware.get_device_facts  s@   "$Y((1#{{66t}Me6fBG	 L1J 	I$56J ( I	''/!#%;;rww||<My/Y#Z <EQR=HRWW--h78I ))+',^$ u	2EGN{{277<<u#EF WW\\,5F" jj0 F6)"# A"AiLAgJ,5e,< C(K(3r(B'
9%Cww''/HN E)&:*=*CD#E [[--h7F 85AK00?"(AhK)+6"(AhK-f|.CDAkN $F-J$JKsR %f/K&KL   8##H-% AlO**V, 5IIcHn{:FCD wwqzH"(3,"9K$&DM4=e4D Q0K3>??8R3PWi0Q %5[85KQ$ODM)9+Hc:c)dD&--=kLc>ceh-i\*&)*:;;PRS*T&UX[&[_bcghtcu_v&vDO#1%Y2H5QUVbQcKd2d#eDL#5h#?DL$$T;704AlOH-+5. /v8K/KLAlO"$A(2D)DEI$HH-y9*+''!*A&'.v8S/STAlO\?"26<S3SUX"Y,/0@ABSHCPQR^P_L``AiLY< )&uQy\':U1\?=S'STAfIAfI NPVWAW
ii&IIcCi*4gr||L !
AfIQ'01L#H-ku	2n W  	 	  # ! !  		&  LLN1%77ell* D%&N #	sI   U $U( 3U3U8UU	U%$U%(	U54U58AW Wc                z    i }t        d      }|r+|j                  d      d   }t        t        |            |d<   |S )Nz/proc/uptimerG   r   uptime_seconds)r
   rX   r[   r  )r8   r@   uptime_file_contentuptime_seconds_strings       r   r2   zLinuxHardware.get_uptime_factsU  sG    .~>$7$=$=c$B1$E!-07L1M-NL)*rd   c                    d}|}|j                  |      rZ| j                  j                  dd      }d}| j                  j                  |d|      \  }}}|dk(  r||j	                         z   }|S )Nz/dev/dm-dmsetupTz/dev/mapper/z info -C --noheadings -o name r   )r   r+   r   r   rstrip)	r8   	dm_device	dm_prefixmapper_devicedmsetup_cmdmapper_prefixr   dm_namer   s	            r   _find_mapper_device_namez&LinuxHardware._find_mapper_device_name^  su    	!	*++229dCK*M#{{66_jlu7vwBQw -0@ @rd   c                   ddi}| j                   j                  d      }||S t        j                         dk(  rd}i }| j                   j	                  |d|      \  }}}|j                         D ]:  }|j                         j                  d      }	|	d   |	d	   |	d
   |	d   d||	d   <   < | j                   j                  d      }
i }|
ri| j                   j	                  |
d|      \  }}}|j                         D ]2  }|j                         j                  d      }	|	d   |	d   d||	d   <   4 | j                   j                  d      }i }|r|| j                   j	                  |d|      \  }}}|j                         D ]E  }|j                         j                  d      }	|	d   |	d   |	d   d|| j                  |	d         <   G |||d|d<   |S )z> Get LVM Facts if running as root and lvm utils are available lvmr   vgsr   z/--noheadings --nosuffix --units g --separator ,rG   ,r   rF   )size_gfree_gnum_lvsnum_pvslvsr  )r  vgpvsr   r  )r  r  r  )r  r  r  )	r+   r   r   getuidr   r   rZ   rX   r  )r8   rA   vgs_cmdlvm_util_optionsr  r   vg_linesr   vg_liner   lvs_pathr  lv_lineslv_linepvs_pathr  pv_linespv_lines                     r   r3   zLinuxHardware.get_lvm_factsi  s    EN	++**51?99;!P C $ 7 77L\8] ^B##..0 --c2#Bi#Bi$Qx$Qx	!E!H {{//6H C$(KK$;$;xQa<b$c!Hc'224 IG#MMO11#6E/4QxuQx$HCaMI {{//6HC$(KK$;$;xQa<b$c!Hc'224 (G#MMO11#6E"'("'(#AhD(C55eAh?@( (+3sCIerd   r
  )'__name__
__module____qualname____doc__platform	frozensetrY   unionr]   r   r   r   r%  r  rC   r.   r-   r/   r0   r   r   r   r   r   r  staticmethodr  r  r  r4   rK  rP  rV  r^  rd  r1   r2   r  r3    rd   r   r   r   5   s     H &&VW(../RSL BJJw'M $L1 !bjj/O<,\XteN0<2. . .S	 L"\


='Wr	/rd   r   c                  &    e Zd ZdZeZ edg      Zy)LinuxHardwareCollectorr   r  N)r  r  r  	_platformr   _fact_classr   required_factsr  rd   r   r  r    s    IK*&Nrd   r  ) 
__future__r   rC  r  rN  r   r   r   r}  r&  *ansible.module_utils._internal._concurrentr   "ansible.module_utils.common.localer   +ansible.module_utils.common.text.convertersr   +ansible.module_utils.common.text.formattersr   (ansible.module_utils.facts.hardware.baser   r	    ansible.module_utils.facts.utilsr
   r   r   ansible.module_utils.sixr   ansible.module_utils.factsr   r   r   r  r  rd   r   <module>r     s`     #     	 	 
  ? G ? F P ] ] . /cH cL'. 'rd   