
    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mZm	Z	 d dl
mZmZ d dlmZmZ  G d de      Z G d d	e	      Zy)
    )annotationsN)HardwareHardwareCollector)TimeoutErrortimeout)get_file_contentget_mount_sizec                  X    e Zd ZdZdZdZddZd Zd Zd Z	 e
       d	        Zd
 Zd Zy)FreeBSDHardwarez
    FreeBSD-specific subclass of Hardware.  Defines memory and CPU facts:
    - memfree_mb
    - memtotal_mb
    - swapfree_mb
    - swaptotal_mb
    - processor (a list)
    - processor_cores
    - processor_count
    - devices
    - uptime_seconds
    FreeBSDz/var/run/dmesg.bootNc                   i }| j                         }| j                         }| j                         }| j                         }| j	                         }i }	 | j                         }|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |S # t        $ r Y sw xY wN)get_cpu_factsget_memory_factsget_uptime_factsget_dmi_factsget_device_factsget_mount_factsr   update)	selfcollected_factshardware_facts	cpu_factsmemory_factsuptime_facts	dmi_factsdevice_factsmount_factss	            [/home/dcms/DCMS/lib/python3.12/site-packages/ansible/module_utils/facts/hardware/freebsd.pypopulatezFreeBSDHardware.populate-   s    &&(	,,.,,.&&(	,,.	..0K 	i(l+l+i(l+k*  		s   C 	CCc                d   i }g |d<   | j                   j                  d      }|r7| j                   j                  d|z  d      \  }}}|j                         |d<   t	        t
        j                        }|s;	 | j                   j                  | j                   j                  d      d      \  }}}|j                         D ]Z  }d	|v r9t        j                  d
d|      }|d   j                  |j                                d|v sE|j                         d   |d<   \ |S # t        $ r d}Y |w xY w)N	processorsysctlz%s -n hw.ncpuFcheck_rcprocessor_countdmesg zCPU:zCPU:\s+zLogical CPUs per core   processor_cores)moduleget_bin_pathrun_commandstripr   r   
DMESG_BOOT	Exception
splitlinesresubappendsplit)	r   r   r#   rcouterr
dmesg_bootlinecpus	            r   r   zFreeBSDHardware.get_cpu_factsE   s.   	!#	+))(3;;22?V3KV[2\LBS+.99;I'(%o&@&@A
 &*kk&=&=dkk>V>VW^>_jo&=&p#J ))+ 	?D~ffZd3+&--ciik:&$./3zz|A	+,	?    
 s   8:D! !D/.D/c                   i }| j                   j                  d      }|r| j                   j                  d|z  d      \  }}}|j                         D ]I  }|j	                         }d|v rt        |d         }d|v rt        |d         }	d|v s<t        |d         }
K 	z  d	z  d	z  |d
<   |
z  d	z  d	z  |d<   | j                   j                  d      }|r| j                   j                  d|z        \  }}}|j                         }t        |d         dk(  r|j                          |d   j	                         }|d   dk7  r(t        |d         d	z  |d<   t        |d         d	z  |d<   |S )Nr#   z%s vm.statsFr$   zvm.stats.vm.v_page_size   zvm.stats.vm.v_page_countzvm.stats.vm.v_free_counti   memtotal_mb
memfree_mbswapinfoz%s -kr   Deviceswaptotal_mb   swapfree_mb)r+   r,   r-   r1   r5   intlenpop)r   r   r#   r6   r7   r8   r:   datapagesize	pagecount	freecountr@   liness                r   r   z FreeBSDHardware.get_memory_facts]   s   ))(3;;22=63ITY2ZLBS( -zz|,4"47|H-5 #DGI-5 #DGI- +3Y*>$*F$*NL')1I)=)E)ML&;;++J7
  ;;227X3EFLBSNN$E59~"		9??$DAw("/247|t/C^,.1$q'ld.B]+    c                V   | j                   j                  d      }|ddg}| j                   j                  |d       \  }}}d}t        j                  |      }|dk7  st        |      |k  ri S t        j                  ||d |       \  }dt        t        j                         |z
        iS )Nr#   z-bzkern.boottime)encodingz@Lr   uptime_seconds)	r+   r,   r-   structcalcsizerG   unpackrF   time)	r   
sysctl_cmdcmdr6   r7   r8   struct_formatstruct_sizekern_boottimes	            r   r   z FreeBSDHardware.get_uptime_facts   s     [[--h7
41 {{..sT.BC oom47c#h,I"MM-\k9JK c$))+"=>
 	
rN   c                x   i }g |d<   t        d      }|r|j                         D ]  }|j                  d      s|j                         dk(  r(t	        j
                  dd|      j                         }t        |d         }|d   |d   |d	   |d
   d}|j                  |       |d   j                  |        |S )Nmountsz
/etc/fstab#r(   z\s+ r=   r      rD   )mountdevicefstypeoptions)
r   r1   
startswithr.   r2   r3   r5   r	   r   r4   )r   r   fstabr:   fieldsmount_statvfs_info
mount_infos          r   r   zFreeBSDHardware.get_mount_facts   s     "H .((* 
9??3'4::<2+=T288:%3F1I%>"'-ay(.q	(.q	)/4
 !!"45H%,,Z8
9 rN   c                   i }d}i |d<   t        j                  d      }t        j                  d      }t        j                  j	                  |      rt        t        j                  |            }|D ]  }|j                  |      }|r-|j                  d      |d   vrg |d   |j                  d      <   |j                  |      }|sW|d   |j                  d         j                  |j                  d              |S )Nz/devdevicesa/  (?x)(
              (?:
                ada?   # ATA/SATA disk device
                |da    # SCSI disk device
                |a?cd  # SCSI CDROM drive
                |amrd  # AMI MegaRAID drive
                |idad  # Compaq RAID array
                |ipsd  # IBM ServeRAID RAID array
                |md    # md(4) disk device
                |mfid  # LSI MegaRAID SAS array
                |mlxd  # Mylex RAID disk
                |twed  # 3ware ATA RAID array
                |vtbd  # VirtIO Block Device
              )\d+
            )
            a9  (?x)(
              (?:
                ada?   # ATA/SATA disk device
                |a?cd  # SCSI CDROM drive
                |amrd  # AMI MegaRAID drive
                |da    # SCSI disk device
                |idad  # Compaq RAID array
                |ipsd  # IBM ServeRAID RAID array
                |md    # md(4) disk device
                |mfid  # LSI MegaRAID SAS array
                |mlxd  # Mylex RAID disk
                |twed  # 3ware ATA RAID array
                |vtbd  # VirtIO Block Device
              )\d+[ps]\d+\w*
            )
            r=   )
r2   compileospathisdirsortedlistdirmatchgroupr4   )	r   r   sysdirdrivesslicesdirlistra   dss	            r   r   z FreeBSDHardware.get_device_facts   s    "$Y
& 
& 77== RZZ/0G! KLL(<	+BB:<L+AGGAJ7LL( +AGGAJ7>>qwwqzJK rN   c           	     x   i }| j                   j                  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}|&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 c c}	w # t        $ r d&||<   Y w xY w)+zK learn dmi facts from system

        Use dmidecode executable if available	dmidecode	bios_datezbios-release-datebios_vendorzbios-vendorbios_versionzbios-versionboard_asset_tagzbaseboard-asset-tag
board_namezbaseboard-product-nameboard_serialzbaseboard-serial-numberboard_vendorzbaseboard-manufacturerboard_versionzbaseboard-versionchassis_asset_tagzchassis-asset-tagchassis_serialzchassis-serial-numberchassis_vendorzchassis-manufacturerchassis_versionzchassis-versionform_factorzchassis-typeproduct_namezsystem-product-nameproduct_serialzsystem-serial-numberproduct_uuidzsystem-uuidproduct_versionzsystem-versionsystem_vendorzsystem-manufacturerNAz -s r   r(   r]   )r+   r,   dictfromkeyskeysitemsr-   joinr1   rd   jsondumpsUnicodeDecodeError)
r   r   dmi_binDMI_DICTkvr6   r7   r8   r:   s
             r   r   zFreeBSDHardware.get_dmi_facts   s   
 	 ++**;7
,
=
 N
 4	

 2
 5
 4
 0
  !4
 5
 4
 0
 >
 1
 4
  M!
" /#
$ 2%
( ?I nn& 	$FQ![[447A5NONRcQw  "ww9I'fQUQ`Q`adQe'fg	!(JJy|,  $	!	$  (g * (#'IaL(s   D#
2D#
D((D98D9r   )__name__
__module____qualname____doc__platformr/   r    r   r   r   r   r   r   r    rN   r   r   r      sI     H&J00 D
, Y (6p1rN   r   c                      e Zd ZeZdZy)FreeBSDHardwareCollectorr   N)r   r   r   r   _fact_class	_platformr   rN   r   r   r     s    !KIrN   r   )
__future__r   rl   r   r2   rR   rU   (ansible.module_utils.facts.hardware.baser   r   "ansible.module_utils.facts.timeoutr   r    ansible.module_utils.facts.utilsr   r	   r   r   r   rN   r   <module>r      s>     # 	  	   P D Mvh vr0 rN   