Files
hwmonDaemon/__pycache__/hwmonDaemon.cpython-311.pyc

952 lines
157 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><>wik<00><00><><00>ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z
ddl Z ddl Z ddl Z ddlZddlmZmZmZeje<14><00>Ze<15>ej<00><00>ej<00><00>Ze<19>ej<00><00>ejd<03><00>Ze<19>e<1B><00>e<15>e<19><00>Gd<04>d<05><00>Zd<06>Zedkr e<1F><00>dSdS)<08>N)<03>Dict<63>Any<6E>Listz)%(asctime)s - %(levelname)s - %(message)sc<00>8
<00>eZdZdZdddddd<07>Zided <00>d
ed <00>d ed <00>d ed <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded <00>ded<00>ded<00>ded<00>ided<00>ded<00>ded<00>ded<00>d ed<00>d!ed"<00>d#ed"<00>d$ed"<00>d%ed"<00>d&ed'<00>d(ed'<00>d)ed'<00>d*ed'<00>d+ed <00>d,ed<00>d-ed <00>d.ed <00><01>eded ed d/<2F><03>Zid0d1<64>d2d3<64>d4d5dd5dd6d7d8<64><06>d9d:d;d<d<d=<3D><04>d>gd?<3F><01>d@gdA<64><01>dBdC<64>dDdE<64>dFdG<64>dHdI<64>dJdK<64>dLd3<64>dMdN<64>d.dO<64>dPdQ<64>dRdG<64>dSdT<64>dUd3i<01>ZedV<64><00><00>ZdWdXdY<64>dZd[id\d]d^d_d`da<64>dbdcidddeidfdgidhdidj<64>dk<64>Z dldmdn<64>Z
dodpdqdrdsdtdudv<EFBFBD>Z dwdxgdygdzgd{<7B>d|gd}gd~<7E>dgd<>gd<><64>d<><64>Z gd<><64>dGd<47>d<EFBFBD><64>dGd<47>d<EFBFBD><64>d<><64>d<><64>d<>d<EFBFBD>gd<>dGd<47>d<EFBFBD><64>id<><64>gd<><64>d<>d<EFBFBD>gd<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD><64>d<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>dGdKd<4B><64>dGd<47>d<EFBFBD><64>dGd<47>d<EFBFBD><64>dGd<47>d<EFBFBD><64>dGd<47>d<EFBFBD><64>dKd<4B>d<EFBFBD>d<d<>d<EFBFBD>d<EFBFBD><64>dKd<4B>d<EFBFBD>d<d<>d<EFBFBD>d<EFBFBD><64>d<><64>d<><64>d<>d<EFBFBD>gdGd<47>d<EFBFBD><64>dGd<47>d<EFBFBD><64>d<>d<EFBFBD>d<EFBFBD>d<EFBFBD><64>d<><64>d<><64>d<>d<EFBFBD>gd<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD><64>d<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>dKd<4B><64>dKd<4B>d<EFBFBD>d<EFBFBD><64>dKd<4B>d<EFBFBD>d<EFBFBD><64>d<><64>d<><64>d<>d<EFBFBD>gd<>d<EFBFBD>dEd<45>d<EFBFBD><64>d<>d<EFBFBD>d<EFBFBD>dEd<45>d<EFBFBD>dKd<4B><64>id<><64>gd<><64>d<>d<EFBFBD>dEd<45>d<EFBFBD><64>id<><64>d<>d<EFBFBD>gd<>d3d3d3d<33><64>id<><64>d<><64>Z d<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD><64>Zd<>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>d<EFBFBD>dϜ Z<0F>dd<>ed<>efZ<12>dd<>ed<>efdքZZd<>eeeffZd<>ed<>ed<>eefd܄Z<1B>dd<>ed<>ed<>ed<>eefd<><64>Zd<>ed<>ed<>eefd<><64>Zd<>ed<>ed<>eefd<><64>Zd<>eeeffd<><64>Zd<>ed<>eeeffd<><64>Z <20>dd<>ed<>ed<>ed<>efd<><64>Z!d<>ed<>efd<><64>Z"d<>ed<>efd<><64>Z#d<>ed<>eeefd<>efd<><64>Z$d<>eeefd<>efd<><64>Z%d<>ed<>eeefd<>efd<><64>Z&d<>ed<>e'fd<><64>Z(d<>eeeffd<><64>Z)d<>eeefd<>eefd<><64>Z*d<>eefd<><64>Z+d<>ed<>efd<><64>Z,d<>ed<>e-fd<><64>Z.d<><64>Z/d<>ed<>eeeffd<><64>Z0d<30>ed<>efd<><64>Z1<5A>d d<>ed<>ed<>ef<06>d<00>Z2<5A>d!d<>e<10>de<10>ded<>eeeff<08>d<03>Z3<5A>de<10>ded<>ef<06>d<06>Z4<5A>de<10>ded<>ef<06>d<07>Z5<5A>ded<>ef<04>d <09>Z6d<36>ed<>eeeff<04>d
<EFBFBD>Z7d<37>ed<>eeeff<04>d <0B>Z8d<38>eeeff<02>d <0C>Z9e:<3A>d"<22>de<13>ded<>ef<06>d<10><05><00>Z;d<>ed<>e-f<04>d<11>Z<d<>eeeff<02>d<12>Z=<3D>ded<>ef<04>d<14>Z>d<>eeeff<02>d<15>Z?d<>eeeff<02>d<16>Z@d<>eeeff<02>d<17>ZAd<41>eeefd<>ef<04>d<18>ZBd<42>ed<>ef<04>d<19>ZCd<43>eeefd<>ef<04>d<1A>ZDd<44>eeeff<02>d<1B>ZEd3S(#<00>SystemHealthMonitor<6F>P<00>1<>2<>3<>4<>5)<05>CRITICAL<41>HIGH<47>MEDIUM<55>NORMAL<41>LOW<4F>CLUSTER_FAILUREr<00>MULTIPLE_DRIVE_FAILURE<52> RAID_DEGRADED<45> SMART_FAILUREr<00>SMART_CRITICAL<41> DISK_CRITICAL<41>UNCORRECTABLE_ECC<43>NETWORK_FAILURE<52>TEMPERATURE_CRITICAL<41>SSD_WEAR_CRITICAL<41>NVME_SPARE_CRITICAL<41>FIRMWARE_CRITICAL<41>REALLOCATED_SECTOR<4F>PENDING_SECTOR<4F> SMART_WARNINGr<00> DISK_WARNING<4E>CORRECTABLE_ECC<43>TEMPERATURE_WARNING<4E>SSD_WEAR_WARNING<4E>NVME_SPARE_WARNING<4E>LXC_STORAGE_CRITICAL<41> TREND_ALERT<52>CPU_HIGHr<00>LXC_STORAGE_WARNING<4E>SYSTEM_LOG_WARNING<4E>DRIVE_AGE_WARNING<4E>TEMPERATURE_INFOr<00>DRIVE_AGE_INFO<46> SSD_WEAR_INFO<46>SYSTEM_LOG_INFO<46>CEPH_HEALTH_ERR<52>CEPH_HEALTH_WARN<52> CEPH_OSD_DOWN<57>CEPH_USAGE_CRITICAL)<03>CEPH_USAGE_WARNING<4E>CEPH_PG_DEGRADED<45> CEPH_MON_DOWN<57>TICKET_API_URL<52>(http://10.10.10.45/create_ticket_api.php<68>TICKET_API_KEYN<59>
THRESHOLDS<EFBFBD>Z<00>_<00>A)rr"<00> LXC_CRITICAL<41> LXC_WARNING<4E> CPU_WARNINGr$<00>NETWORKSz
10.10.10.1z
10.10.90.1<EFBFBD>)<04>
MANAGEMENT<EFBFBD>CEPH<50> PING_TIMEOUT<55>
PING_COUNT<EFBFBD>EXCLUDED_MOUNTS)z/mediaz/mnt/pve/mediafsz/opt/metube_downloads<64>EXCLUDED_PATTERNS)z/media.*z/mnt/pve/mediafs.*z .*/media$z .*mediafs.*z.*/downloads.*<2A> HISTORY_DIRz/var/log/hwmonDaemon<6F>HISTORY_RETENTION_DAYS<59><00>INCLUDE_INFO_TICKETSF<53>PRIORITY_ESCALATION_THRESHOLD<4C><00> CEPH_ENABLEDT<44>CEPH_TICKET_NODEr5<00>F<00>U<00> CLUSTER_NAME<4D>proxmox-cluster<65>PROMETHEUS_ENABLED<45>PROMETHEUS_PORTi<54>#<00>PROMETHEUS_TEXTFILE_PATHc<00> <00>d}tj<00>|<01><00>s t<00>d|<01>d<03><03><00>dS t |d<05><00>5}|D<00>]^}|<03><00><00>}|r|<03>d<06><00>r<01>/d|v<00>r*|<03>dd<08><00>\}}|<04><00><00>}|<05><00><00>}|d kr%||j d <t<00>
d
<EFBFBD><00><00><>|d kr(||j d <t<00>
d |<05><00><02><00><00><>|d krH|<05> <00><00>dv|j d <t<00>
d|j d <00><00><02><00><00><01>|dkr-|r|nd|j d<t<00>
d|<05><00><02><00><00><01>O|dkrt|<05><00>|j d<<00><01>n|dkrt|<05><00>|j d<<00><01><>|dkrH|<05> <00><00>dv|j d<t<00>
d|j d<00><00><02><00><00><01><>|dkrt|<05><00>|j d<<00><01><>|dkr-|r|nd|j d<t<00>
d|<05><00><02><00><00><02>-|dkr+|r|nd|j d<t<00>
d|<05><00><02><00><00><02>` ddd<04><00>dS#1swxYwYdS#t$r(}t<00>d|<06><00><02><00>Yd}~dSd}~wwxYw)z6Load configuration from .env file in /etc/hwmonDaemon/z/etc/hwmonDaemon/.envz.env file not found at z' - API key required for ticket creationN<6E>r<>#<23>=rCr:u#✓ Loaded TICKET_API_KEY from .envr8u✓ Loaded TICKET_API_URL: rP)<03>truer <00>yesu✓ Loaded CEPH_ENABLED: rQu✓ Loaded CEPH_TICKET_NODE: r5r4rVu✓ Loaded PROMETHEUS_ENABLED: rWrXu%✓ Loaded PROMETHEUS_TEXTFILE_PATH: rTrUu✓ Loaded CLUSTER_NAME: zFailed to load .env file: )<0F>os<6F>path<74>exists<74>logger<65>warning<6E>open<65>strip<69>
startswith<EFBFBD>split<69>CONFIG<49>info<66>lower<65>int<6E> Exception<6F>error)<07>cls<6C>env_file<6C>f<>line<6E>key<65>value<75>es <20>%/root/code/hwmonDaemon/hwmonDaemon.py<70>load_env_configz#SystemHealthMonitor.load_env_config<69>s<><00><00>+<2B><08><11>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>'<27> <13> <12>N<EFBFBD>N<EFBFBD>f<>X<EFBFBD>f<>f<>f<> g<> g<> g<> <12>F<EFBFBD>/ ;<3B><15>h<EFBFBD><03>$<24>$<24>+ M<01><01><1D>*M<01>*M<01>D<EFBFBD><1F>:<3A>:<3A><<3C><<3C>D<EFBFBD><1F>!<21>4<EFBFBD>?<3F>?<3F>3<EFBFBD>#7<>#7<>!<21> <20><1B>d<EFBFBD>{<7B>{<7B>%)<29>Z<EFBFBD>Z<EFBFBD><03>Q<EFBFBD>%7<>%7<>
<EFBFBD><03>U<EFBFBD>!<21>i<EFBFBD>i<EFBFBD>k<EFBFBD>k<EFBFBD><03> %<25> <0B> <0B> <0A> <0A><05><1F>"2<>2<>2<>;@<40>C<EFBFBD>J<EFBFBD>'7<>8<>"<22>K<EFBFBD>K<EFBFBD>(M<>N<>N<>N<>N<> <20>$4<>4<>4<>;@<40>C<EFBFBD>J<EFBFBD>'7<>8<>"<22>K<EFBFBD>K<EFBFBD>(M<>e<EFBFBD>(M<>(M<>N<>N<>N<>N<> <20>N<EFBFBD>2<>2<>9><3E><1B><1B><1D><1D>J^<5E>9^<5E>C<EFBFBD>J<EFBFBD>~<7E>6<>"<22>K<EFBFBD>K<EFBFBD>(`<60>C<EFBFBD>J<EFBFBD>~<7E>D^<5E>(`<60>(`<60>a<>a<>a<>a<> <20>$6<>6<>6<>FK<46>=U<>U<EFBFBD>U<EFBFBD>QU<51>C<EFBFBD>J<EFBFBD>'9<>:<3A>"<22>K<EFBFBD>K<EFBFBD>(O<><05>(O<>(O<>P<>P<>P<>P<> <20>$8<>8<>8<>?B<>5<EFBFBD>z<EFBFBD>z<EFBFBD>C<EFBFBD>J<EFBFBD>';<3B><<3C><<3C> <20>$9<>9<>9<>@C<>E<EFBFBD>
<EFBFBD>
<EFBFBD>C<EFBFBD>J<EFBFBD>'<<3C>=<3D>=<3D> <20>$8<>8<>8<>?D<>{<7B>{<7B>}<7D>}<7D>Pd<50>?d<>C<EFBFBD>J<EFBFBD>';<3B><<3C>"<22>K<EFBFBD>K<EFBFBD>(l<>#<23>*<2A>Ui<55>Jj<4A>(l<>(l<>m<>m<>m<>m<> <20>$5<>5<>5<><?<3F><05>J<EFBFBD>J<EFBFBD>C<EFBFBD>J<EFBFBD>'8<>9<>9<> <20>$><3E>><3E>><3E>NS<4E>E]<5D>U<EFBFBD>U<EFBFBD>Y]<5D>C<EFBFBD>J<EFBFBD>'A<>B<>"<22>K<EFBFBD>K<EFBFBD>(W<>PU<50>(W<>(W<>X<>X<>X<>X<> <20>N<EFBFBD>2<>2<>BG<42>9^<5E><15><15>M^<5E>C<EFBFBD>J<EFBFBD>~<7E>6<>"<22>K<EFBFBD>K<EFBFBD>(K<>E<EFBFBD>(K<>(K<>L<>L<>L<><4C>U*M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01><><EFBFBD><EFBFBD>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01>+ M<01><>Z<19> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD>s=<00>K<00>I#K<03>7 K<00>K<07>K<00> K<07> K<00>
L<03>K><03>>Lz[auto]z[manual])<02>AUTO<54>MANUAL<41>
PRODUCTIONz [production]z[issue]z [problem]z[task]z [maintenance]z [upgrade])<05>ISSUE<55>PROBLEM<45>TASK<53> MAINTENANCE<43>UPGRADE<44>HARDWAREz
[hardware]<5D>SOFTWAREz
[software]<5D>NETWORKz [network]z [single-node]<5D>[cluster-wide])<02> SINGLE_NODE<44> CLUSTER_WIDE)<07> ACTION_TYPE<50> ENVIRONMENT<4E> TICKET_TYPE<50> HARDWARE_TYPE<50> SOFTWARE_TYPE<50> NETWORK_TYPE<50>SCOPE<50>Hardware<72>Software)rr<><00>Issue<75>Problem<65>Task<73> Maintenance<63>Upgrade<64>Install<6C>Request)rzr{r|r}r~<00>INSTALL<4C>REQUEST<53>RVT01B6Q<36>RVT02B6Q<36>SVT01B6Q<36>HXT7404Q)<03>EVO860<36>EVO870<37>PM883<38>CC64<36>SN02)<02>ST8000NM<4E> ST12000NMz01.01A01z02.01A02)<02> WD121KRYZ<59> WD141KRYZ)<03>Samsung<6E>Seagate<74>WDC)r<><00>Western Digital<61>HGST<53> Ultrastarz8WD drives use this as operation counter, not error count)<02>monitor<6F> description)<02>Raw_Read_Error_Rate<74>Seek_Error_Rate)<02>aliases<65>
attributesr<EFBFBD><00>STr<54>z,Seagate drives use this as operation counter)<05>Ridata<74>Ritek<65>RIDATA<54>RITEKz SSD 512GB<47>HT3618B7<42>HT36<33>countupriʚ;i<00>5w<35>rc<00>criticalz/Total wear leveling operations (countup from 0))<07>behavior<6F>baseline<6E>warning_threshold<6C>critical_thresholdr<64><00>ignore_on_new_driver<65>z0Operation counter, not actual failures - IGNOREDzBOperation counter for Ridata drives, not actual failures - IGNORED<45>z'Actual program failures (real failures))r<>r<>r<>r<>r<>r<>z%Actual erase failures (real failures))<07>Wear_Leveling_Count<6E>Erase_Fail_Count_Chip<69>Program_Fail_Count_Chip<69>Erase_Fail_Count<6E>Program_Fail_Count<6E>Program_Fail_Cnt_Total<61>Erase_Fail_Count_Total)r<><00>firmware_patterns<6E>wear_leveling_behavior<6F>wear_leveling_baseline<6E>wear_leveling_thresholdsr<73><00> OOS12000G<30>OOSz&OOS drives report high values normallylh<>]lP<>!<21>z,OOS drives report very high timeout counters)r<>r<>r<>)r<>r<><00>Command_Timeoutr<74><00>SAMSUNGi<47>i<> z(Total wear leveling operations performed)r<>r<>r<>r<>r<>r<><00>
<00>)r<>r<>r<>)r<>r<>r<>)r<>r<>r<>r<>r<><00>Intel<65>INTEL<45>
percentage<EFBFBD>d<00>Media_Wearout_Indicator<6F> countdownz"Percentage of rated life remaining)<04>Micron<6F>MICRON<4F>Crucial<61>CRUCIAL<41>Unknown<77>Generic<69>unknown)r<>r<>r<>r<>r<>r<>r<>r<>u🔴u🟡u🟢u⚪)r<00>WARNING<4E>HEALTHY<48>UNKNOWNa<4E>
Number of errors that could not be recovered using hardware ECC.
Impact:
- Indicates permanent data loss in affected sectors
- High correlation with drive hardware failure
- Critical reliability indicator
Recommended Actions:
1. Backup critical data immediately
2. Check drive logs for related errors
3. Plan for drive replacement
4. Monitor for error count increases
a<>
Number of sectors that have been reallocated due to errors.
Impact:
- High counts indicate degrading media
- Each reallocation uses one of the drive's limited spare sectors
- Rapid increases suggest accelerating drive wear
Recommended Actions:
1. Monitor rate of increase
2. Check drive temperature
3. Plan replacement if count grows rapidly
a<>
Sectors waiting to be reallocated due to read/write errors.
Impact:
- Indicates potentially unstable sectors
- May result in data loss if unrecoverable
- Should be monitored for increases
Recommended Actions:
1. Backup affected files
2. Run extended SMART tests
3. Monitor for conversion to reallocated sectors
a<>
Count of uncorrectable errors detected during offline data collection.
Impact:
- Direct indicator of media reliability issues
- May affect data integrity
- High values suggest drive replacement needed
Recommended Actions:
1. Run extended SMART tests
2. Check drive logs
3. Plan replacement if count is increasing
a<>
Number of spin start retry attempts.
Impact:
- Indicates potential motor or bearing issues
- May predict imminent mechanical failure
- Increasing values suggest degrading drive health
Recommended Actions:
1. Monitor for rapid increases
2. Check drive temperature
3. Plan replacement if count grows rapidly
a_
Total number of hours the device has been powered on.
Impact:
- Normal aging metric
- Used to gauge overall drive lifetime
- Compare against manufacturer's MTBF rating
Recommended Actions:
1. Compare to warranty period
2. Plan replacement if approaching rated lifetime
al
Percentage of drive's rated life remaining (SSDs).
Impact:
- 100 indicates new drive
- 0 indicates exceeded rated writes
- Critical for SSD lifecycle management
Recommended Actions:
1. Plan replacement below 20%
2. Monitor write workload
3. Consider workload redistribution
uL
Current drive temperature.
Impact:
- High temperatures accelerate wear
- Optimal range: 20-45°C
- Sustained high temps reduce lifespan
Recommended Actions:
1. Check system cooling
2. Verify airflow
3. Monitor for sustained high temperatures
ar
Percentage of spare blocks remaining (SSDs).
Impact:
- Critical for SSD endurance
- Low values indicate approaching end-of-life
- Rapid decreases suggest excessive writes
Recommended Actions:
1. Plan replacement if below 20%
2. Monitor write patterns
3. Consider workload changes
ay
Number of flash program operation failures.
Impact:
- Indicates NAND cell reliability
- Important for SSD health assessment
- Increasing values suggest flash degradation
Recommended Actions:
1. Monitor rate of increase
2. Check firmware updates
3. Plan replacement if rapidly increasing
ad
Number of flash erase operation failures.
Impact:
- Related to NAND block health
- Critical for SSD reliability
- High counts suggest failing flash blocks
Recommended Actions:
1. Monitor count increases
2. Check firmware version
3. Plan replacement if count is high
a<>
Number of power cycles and head load/unload events.
Impact:
- Normal operation metric
- High counts may indicate power management issues
- Compare against rated cycles (typically 600k-1M)
Recommended Actions:
1. Review power management settings
2. Monitor rate of increase
3. Plan replacement near rated limit
aO
SSD block erase distribution metric.
Impact:
- Indicates wear pattern uniformity
- Interpretation varies by manufacturer
- Critical for SSD longevity
Recommended Actions:
1. Monitor trend over time
2. Compare with manufacturer baseline
3. Check workload distribution
Note: Different manufacturers use different counting methods:
- Some count up from 0 (Samsung, etc.)
- Others count down from baseline (Ridata, etc.)
- Always check manufacturer specifications
) <0A>Reported_Uncorrect<63>Reallocated_Sector_Ct<43>Current_Pending_Sector<6F>Offline_Uncorrectable<6C>Spin_Retry_Count<6E>Power_On_Hoursr<73><00>Temperature_Celsius<75>Available_Sparer<65>r<><00>Load_Cycle_Countr<74><00>ticket_api_url<72>dry_runc<00><><00>|<00><00><00>||_||_tj|jdd<02><03><00>dS)z<>
Initialize the system health monitor.
:param ticket_api_url: URL for the ticket creation API.
:param dry_run: If True, simulate API calls without sending requests.
rJT)<01>exist_okN)rvr<>r<>r_<00>makedirsrh)<03>selfr<66>r<>s ru<00>__init__zSystemHealthMonitor.__init__bsI<00><00> <0A><1C><1C><1E><1E><1E>,<2C><04><1B><1E><04> <0C> <0B> <0B>D<EFBFBD>K<EFBFBD> <0A>.<2E><14>><3E>><3E>><3E>><3E>><3E>><3E><00><00><00> history_dir<69> max_bytesc<00>N<00>tj<00>|<01><00>sdS d}g}tj|<01><00>D]<5D>}tj<00>||<05><00>}|<05>d<03><00>r<>|<05>d<04><00>r<> tj|<06><00>}||jz }|<04> ||j
|jf<03><00><00><>#ttf$r*}t<00>d|<06>d|<08><00><04><00>Yd}~<08><>d}~wwxYw<01><>||kr<>|<04>d<07><00><08><00>t<00>d |<03>d
|<02>d <0B><05><00>|D]<5D>\}} }
||krdS tj|<06><00>||
z}t<00>d tj<00>|<06><00><00>d |
<EFBFBD>d<0E><05><00><00>h#ttf$r*}t<00>d|<06>d|<08><00><04><00>Yd}~<08><>d}~wwxYwdSdS#t($r(}t<00>d|<08><00><02><00>Yd}~dSd}~wwxYw)z<>
Delete oldest history files if directory exceeds size limit (default 10MB).
:param history_dir: Directory containing history files
:param max_bytes: Maximum directory size in bytes (default 10MB)
Nr<00>smart_history_<79>.jsonzCould not stat file <20>: c<00><00>|dS)NrC<00><00><01>xs ru<00><lambda>z<SystemHealthMonitor._enforce_storage_limit.<locals>.<lambda><3E>s
<00><00>A<EFBFBD>a<EFBFBD>D<EFBFBD>r<><00>rrzHistory directory size (z bytes) exceeds limit (z bytes), cleaning up...zRemoved old history file z (saved z bytes)zCould not remove history file zError enforcing storage limit: )r_r`ra<00>listdir<69>joinrf<00>endswith<74>stat<61>st_size<7A>append<6E>st_mtime<6D>IOError<6F>OSErrorrb<00>debug<75>sortri<00>remove<76>basenamercrlrm) r<>r<>r<><00>
total_size<EFBFBD>files_with_mtimerp<00>filepathrrt<00>mtime<6D> file_sizes ru<00>_enforce_storage_limitz*SystemHealthMonitor._enforce_storage_limitrs<><00><00><12>w<EFBFBD>~<7E>~<7E>k<EFBFBD>*<2A>*<2A> <13> <12>F<EFBFBD>! @<01><1A>J<EFBFBD>!<21> <1C><18>Z<EFBFBD> <0B>,<2C>,<2C> M<01> M<01><01><1D>7<EFBFBD><<3C><<3C> <0B>Q<EFBFBD>7<>7<><08><14><<3C><<3C> 0<>1<>1<>M<01>a<EFBFBD>j<EFBFBD>j<EFBFBD><17>6I<36>6I<36>M<01>M<01>!<21>w<EFBFBD>x<EFBFBD>0<>0<><04>"<22>d<EFBFBD>l<EFBFBD>2<>
<EFBFBD>(<28>/<2F>/<2F><18>4<EFBFBD>=<3D>$<24>,<2C>0W<30>X<>X<>X<>X<><58>#<23>W<EFBFBD>-<2D>M<01>M<01>M<01><1E> <0C> <0C>%K<>H<EFBFBD>%K<>%K<><01>%K<>%K<>L<>L<>L<>L<>L<>L<>L<>L<><4C><EFBFBD><EFBFBD><EFBFBD>M<01><><EFBFBD><EFBFBD><EFBFBD><1A>I<EFBFBD>%<25>%<25> <20>%<25>%<25>.<2E>.<2E>%<25>9<>9<>9<><16> <0B> <0B>|<7C>z<EFBFBD>|<7C>|<7C>Zc<5A>|<7C>|<7C>|<7C>}<7D>}<7D>}<7D>2B<32>Y<01>Y<01>.<2E>H<EFBFBD>e<EFBFBD>Y<EFBFBD>!<21>Y<EFBFBD>.<2E>.<2E><1D><05><05>Y<01><1A> <09>(<28>+<2B>+<2B>+<2B>"<22>i<EFBFBD>/<2F>
<EFBFBD><1E> <0B> <0B>$v<><02><07>@P<>@P<>QY<51>@Z<>@Z<>$v<>$v<>dm<64>$v<>$v<>$v<>w<>w<>w<>w<><77>#<23>W<EFBFBD>-<2D>Y<01>Y<01>Y<01><1E><0E><0E>'W<><08>'W<>'W<>TU<54>'W<>'W<>X<>X<>X<>X<>X<>X<>X<>X<><58><EFBFBD><EFBFBD><EFBFBD>Y<01><><EFBFBD><EFBFBD>&<26>%<25> Y<01>Y<01><><19> @<01> @<01> @<01> <12>L<EFBFBD>L<EFBFBD>><3E>1<EFBFBD>><3E>><3E> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F><><EFBFBD><EFBFBD><EFBFBD> @<01><><EFBFBD>so<00>A$G2<00>AC <02>G2<00> D<05> C?<05>:G2<00>?D<05>AG2<00>AF0<02>/G2<00>0G+<05> G&<05>!G2<00>&G+<05>+G2<00>2
H$<03><H<03>H$c<00><><00> |<00><00><00>}|<00>|<01><00>|j<00>dd<02><00>r|<00>|<01><00>dSdS#t
$rX}ddl}t<00>d|<02><00><02><00>t<00>|<03> <00><00><00><00>Yd}~dSd}~wwxYw)z.Perform a one-shot health check of the system.rVFrNz&Unexpected error during health check: )
<EFBFBD>perform_health_checks<6B>_create_tickets_for_issuesrh<00>get<65>write_prometheus_metricsrl<00> tracebackrbrm<00>
format_exc)r<><00> health_reportrtrs ru<00>runzSystemHealthMonitor.run<75>s<><00><00> 1<> <20>6<>6<>8<>8<>M<EFBFBD> <11> +<2B> +<2B>M<EFBFBD> :<3A> :<3A> :<3A><14>{<7B><EFBFBD><EFBFBD>3<>U<EFBFBD>;<3B>;<3B> =<3D><14>-<2D>-<2D>m<EFBFBD><<3C><<3C><<3C><<3C><<3C> =<3D> =<3D><><18> 1<> 1<> 1<> <1C> <1C> <1C> <1C> <12>L<EFBFBD>L<EFBFBD>E<>!<21>E<>E<> F<> F<> F<> <12>L<EFBFBD>L<EFBFBD><19>-<2D>-<2D>/<2F>/<2F> 0<> 0<> 0<> 0<> 0<> 0<> 0<> 0<> 0<><30><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD>s<00>AA<00>
C<03>)A B<<03><C<03>returnc <00><> <00>tj<00><00>tj<00><00><00><00><00><00>|<00><00><00>|<00><00><00>|<00><00><00>|<00><00><00>|<00> <00><00>|<00>
<00><00>|<00> <00><00>d<01> }|j <00>r<>t<00>d<02><00>t<00>d|dd<00><00><02><00>t<00>d<06><00>|ddD]<5D>}|<02>dg<00><00>}|<02>d <09><00>rd
|<02>d <09><00><00>d <0B>nd }|rd nd}d }|<02>d<0F><00>r5|dD],}|d|d<00>d|d<00>d|d<00>d|d<00>d<18> z }<06>-t<00>|<05>|d<00>|<04>d|d<00>|<06><00><06><00>|r0t<00>dd
<EFBFBD>|<03><00><00><00><02><00><00><>t<00>d|dd<00>d <20><03><00>|d<00>d!<21><00>rlt<00>d"<22><00>|d<00>d#<23><00>r7t<00>d$t#|dd#<00><00><00>d%<25><03><00>t<00>d&|d'd(<00>d)<29><03><00>t<00>d*<2A><00>t<00>d+|d,d-d.<00><00><02><00>t<00>d/|d,d0d.<00><00><02><00>|<01>d1i<00><00>}|<08>d2<64><00><00>r<>t<00>d3<64><00>t<00>d4|<08>d5d6<64><00><00><00><02><00>|<08>d7<64><00>r;|d7} t<00>d8| <09>dd9<64><00>d:<3A>d)<29><03><00>t<00>d;t#|<08>d<g<00><00><00><00><00>d=<3D><03><00>d><3E>|<08>d<g<00><00>D<00><00>}
|
r*t<00>d?t#|
<EFBFBD><00><00><00><02><00>|<08>d@<40><00>r0t<00>dAt#|d@<00><00><00><00><02><00>|<08>dB<64><00>r0t<00>dCt#|dB<00><00><00><00><02><00>|dDdBr7t<00>dEt#|dDdB<00><00><00>d%<25><03><00>t<00>dF<64><00>|S)Gz?Perform comprehensive system health checks and return a report.) <09>hostname<6D> timestamp<6D> drives_health<74> memory_health<74>
cpu_health<EFBFBD>network_health<74> ceph_health<74>
lxc_health<EFBFBD> system_healthz
=== System Health Summary ===zOverall Drive Health: r<00>overall_statusz
Drive Status:<3A>drives<65> smart_issues<65> temperature<72>, <20>°C<C2B0>u⚠️ u<20>
partitionsu
└─ <20>
mountpointr<EFBFBD><00>
used_space<EFBFBD>/<2F> total_spacez (<28> usage_percentz% used)<29>devicez
- SMART: <20> smart_statusz
Issues: z
Memory: r <00>memory_percentz% used<65>has_ecczECC Memory: Present<6E>
ecc_errorsz ECC Errors: <20> foundz
CPU Usage: r!<00>cpu_usage_percent<6E>%z
Network Status:z Management: r"<00>management_network<72>statuszCeph Network: <20> ceph_networkr#<00> is_ceph_nodez
Ceph Cluster Status:z Cluster Health: <20>cluster_healthr<68><00> cluster_usagez Cluster Usage: r<00>.1fz OSDs: <20>
osd_statusz totalc<00>D<00>g|]}|<01>d<00><00>dk<00>|<01><02>S<00>r<<00>down<77>r<00><02>.0<EFBFBD>os ru<00>
<listcomp>z=SystemHealthMonitor.perform_health_checks.<locals>.<listcomp><3E><00>-<00><00>`<60>`<60>`<60>1<EFBFBD>a<EFBFBD>e<EFBFBD>e<EFBFBD>H<EFBFBD>o<EFBFBD>o<EFBFBD>Y_<59>F_<46>F_<46>Q<EFBFBD>F_<46>F_<46>F_r<5F>u ⚠️ Down OSDs: <20>cluster_wide_issuesu ⚠️ Cluster-wide issues: <20>issuesu ⚠️ Node-specific issues: r%z
System Issues: z
=== End Summary ===)<12>socket<65> gethostname<6D>datetime<6D>now<6F> isoformat<61>_check_drives_health<74>_check_memory_usage<67>_check_cpu_usage<67>_check_network_status<75>_check_ceph_health<74>_check_lxc_storage<67>_check_system_drive_indicatorsr<73>rbrirr<00>len) r<>r<00>driverM<00>tempr<<00>
usage_info<EFBFBD> partition<6F>ceph<70>usage<67> down_osdss rurz)SystemHealthMonitor.perform_health_checks<6B>s<><00><00><1F>*<2A>,<2C>,<2C>!<21>*<2A>.<2E>.<2E>0<>0<>:<3A>:<3A><<3C><<3C>!<21>6<>6<>8<>8<>!<21>5<>5<>7<>7<><1E>/<2F>/<2F>1<>1<>"<22>8<>8<>:<3A>:<3A><1F>2<>2<>4<>4<><1E>1<>1<>3<>3<>!<21>@<40>@<40>B<>B<>

<EFBFBD>

<EFBFBD> <0A> <10><<3C>5 1<> <12>K<EFBFBD>K<EFBFBD>9<> :<3A> :<3A> :<3A> <12>K<EFBFBD>K<EFBFBD>c<><1D><EFBFBD>1O<31>P`<60>1a<31>c<>c<> d<> d<> d<> <13>K<EFBFBD>K<EFBFBD>)<29> *<2A> *<2A> *<2A>&<26><EFBFBD>7<><08>A<> B<01> B<01><05><1E><19><19>><3E>2<EFBFBD>6<>6<><06>=B<>Y<EFBFBD>Y<EFBFBD>}<7D>=U<>=U<>]<5D>9<>E<EFBFBD>I<EFBFBD>I<EFBFBD>m<EFBFBD>4<>4<>9<>9<>9<>9<>[]<5D><04>&,<2C>8<><19><19>&<26><06> <20>
<EFBFBD><18>9<EFBFBD>9<EFBFBD>\<5C>*<2A>*<2A>i<02>%*<2A><<3C>%8<>i<02>i<02> <09>"<22>'i<02>I<EFBFBD>l<EFBFBD>4K<34>'i<02>'i<02>y<EFBFBD>Ye<59>Of<4F>'i<02>'i<02>ir<69>tA<02>jB<02>'i<02>'i<02>FO<02>P_<02>F`<02>'i<02>'i<02>'i<02>i<02>
<EFBFBD>
<EFBFBD><16> <0B> <0B>v<EFBFBD>k<>u<EFBFBD>X<EFBFBD><EFBFBD>k<><04>k<>k<><05>n<EFBFBD>H]<5D>k<>_i<5F>k<>k<>l<>l<>l<><19>B<01><1A>K<EFBFBD>K<EFBFBD> @<40>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>v<EFBFBD>-><3E>-><3E> @<40> @<40>A<>A<>A<><41> <12>K<EFBFBD>K<EFBFBD>]<5D>]<5D>?<3F>%C<>DT<44>%U<>]<5D>]<5D>]<5D> ^<5E> ^<5E> ^<5E><1C>_<EFBFBD>-<2D>1<>1<>)<29><<3C><<3C> j<01><16> <0B> <0B>1<>2<>2<>2<> <20><1F>1<>5<>5<>l<EFBFBD>C<>C<>j<01><1A>K<EFBFBD>K<EFBFBD> h<>s<EFBFBD>=<3D><1F>3Q<33>R^<5E>3_<33>/`<60>/`<60> h<> h<> h<>i<>i<>i<> <12>K<EFBFBD>K<EFBFBD>[<5B> <0A>l<EFBFBD>(C<>DW<44>(X<>[<5B>[<5B>[<5B> \<5C> \<5C> \<5C> <12>K<EFBFBD>K<EFBFBD>+<2B> ,<2C> ,<2C> ,<2C> <12>K<EFBFBD>K<EFBFBD>h<>}<7D>5E<35>'F<>G[<5B>'\<5C>]e<>'f<>h<>h<> i<> i<> i<> <12>K<EFBFBD>K<EFBFBD>d<><1D>7G<37>)H<><1E>)X<>Ya<59>)b<>d<>d<> e<> e<> e<>!<21>$<24>$<24>]<5D>B<EFBFBD>7<>7<>D<EFBFBD><13>x<EFBFBD>x<EFBFBD><0E>'<27>'<27> Z<01><16> <0B> <0B>4<>5<>5<>5<><16> <0B> <0B>X<><14><18><18>:J<>I<EFBFBD>1V<31>1V<31>X<>X<>Y<>Y<>Y<><17>8<EFBFBD>8<EFBFBD>O<EFBFBD>,<2C>,<2C>Z<01> <20><1F>1<>E<EFBFBD><1A>K<EFBFBD>K<EFBFBD> X<>E<EFBFBD>I<EFBFBD>I<EFBFBD>o<EFBFBD>q<EFBFBD>4Q<34>4Q<34> X<> X<> X<> X<>Y<>Y<>Y<><16> <0B> <0B>N<>s<EFBFBD>4<EFBFBD>8<EFBFBD>8<EFBFBD>L<EFBFBD>"<22>+E<>+E<>'F<>'F<>N<>N<>N<>O<>O<>O<>`<60>`<60><04><08><08><1C>r<EFBFBD>(B<>(B<>`<60>`<60>`<60> <09><1C>J<01><1A>K<EFBFBD>K<EFBFBD> H<><03>I<EFBFBD><0E><0E> H<> H<>I<>I<>I<><17>8<EFBFBD>8<EFBFBD>1<>2<>2<>f<01><1A>K<EFBFBD>K<EFBFBD> d<>#<23>d<EFBFBD>K`<60>Fa<46>Bb<42>Bb<42> d<> d<>e<>e<>e<><17>8<EFBFBD>8<EFBFBD>H<EFBFBD>%<25>%<25>Z<01><1A>K<EFBFBD>K<EFBFBD> X<>3<EFBFBD>t<EFBFBD>H<EFBFBD>~<7E>CV<43>CV<43> X<> X<>Y<>Y<>Y<><1C>_<EFBFBD>-<2D>h<EFBFBD>7<> g<01><16> <0B> <0B>e<><03>M<EFBFBD>/<2F>4R<34>S[<5B>4\<5C>0]<5D>0]<5D>e<>e<>e<>f<>f<>f<> <12>K<EFBFBD>K<EFBFBD>/<2F> 0<> 0<> 0<><1C>r<>r3<00>current_attributesc <00><><00><10><11>g}|<01>dd<02><00><00>dd<02><00>}tj<00>|jdd|<04>d<06><03><00>} |<00>|jd<00><00>g}tj<00>|<05><00>rdnd}t||<07><00>5}tj |<08>
<00><00>tj <00><00> tj<00> |<05><00>d kri|<08> d <09><00> tj|<08><00>}n>#tj$r,} t"<00>d
|<05>d | <09><00><04><00>g}Yd } ~ nd } ~ wwxYwt&j<00><00><00><00><00><00>|d <0A>}
|<06>|
<EFBFBD><00>t&j<00><00><00>t'j|jd<00><0F><00>z
<00><11>fd<10>|D<00><00>}t1|<06><00>dk<00>rgd<12>} | D<00>]<11><10>|v<00>r t1|<06><00>dkr
|dd <0C>n|} <0C>fd<15>| D<00><00>} t1| <0A><00>dkr<>| d| d z
}|d kr<>|t1| <0A><00>z }<0F>dvr3|dkr,|<03>d<19><10>d|<0E>dt1| <0A><00><00>d<1C><07><00><00><><EFBFBD>dvr3|dkr,|<03>d<1F><10>d|<0E>dt1| <0A><00><00>d<1C><07><00><00><>|d kr,|<03>d<19><10>d|<0E>dt1| <0A><00><00>d<1C><07><00><00><01>|<08> d <09><00>|<08><00><00>tj||d!<21>"<22><00>|<08><00><00>tj |<08>
<00><00>tj<00><00>n6#tj |<08>
<00><00>tj<00><00>wxYw d d d <0C><00>n #1swxYwYnp#t:t<f$r*} t"<00>d#|<01>d$| <09><00><04><00>Yd } ~ n:d } ~ wt@$r*} t"<00>!d%|<01>d$| <09><00><04><00>Yd } ~ nd } ~ wwxYw|S)&z3Analyze SMART attribute trends to predict failures.r0<00>_<>-rJr<>r<>zr+zw+rzCorrupted history file z, starting fresh: N)rr<>rK)<01>daysc<00>f<00><01>g|]-}tj<00>|d<00><00><00>k<00>+|<01><02>.S)r)rP<00> fromisoformat)rH<00>h<> cutoff_dates <20>rurJz=SystemHealthMonitor._analyze_smart_trends.<locals>.<listcomp>#s<<00><><00>s<>s<>s<>Q<EFBFBD>X<EFBFBD>5F<35>5T<35>5T<35>UV<55>Wb<57>Uc<55>5d<35>5d<35>gr<67>5r<35>5r<35>q<EFBFBD>5r<35>5r<35>5rr<72>rO)r<>r<>r<>r<>r<>r<><00>i<><69><EFBFBD><EFBFBD>c<00>H<00><01>g|]}|d<00><00>d<01><00><00><02>S)r<>rrF)rHri<00>attrs <20>rurJz=SystemHealthMonitor._analyze_smart_trends.<locals>.<listcomp>.s-<00><><00>)_<>)_<>)_<>1<EFBFBD>!<21>L<EFBFBD>/<2F>*=<3D>*=<3D>d<EFBFBD>A<EFBFBD>*F<>*F<>)_<>)_<>)_r<5F><00><><EFBFBD><EFBFBD><EFBFBD>)r<>r<>g<00>?zTREND ALERT: Rapid increase in z: +z in z checks)r<>r<>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?zTREND ALERT: Increasing rC<00><00><01>indentzI/O error analyzing trends for r<>z&Unexpected error analyzing trends for )"<22>replacer_r`rrhrrard<00>fcntl<74>flock<63>fileno<6E>LOCK_EX<45>getsize<7A>seek<65>json<6F>load<61>JSONDecodeErrorrbrcrPrQrRr<00> timedeltarZ<00>truncate<74>dump<6D>flush<73>LOCK_UNrrrrlrm)r<>r3rbrM<00> device_safe<66>historical_file<6C>history<72> file_moderprt<00>current_reading<6E>critical_attrs<72>recent_history<72>values<65>recent_increase<73>ratermrjs @@ru<00>_analyze_smart_trendsz)SystemHealthMonitor._analyze_smart_trends<64>s<><00><><EFBFBD><00><13><06><1D>n<EFBFBD>n<EFBFBD>S<EFBFBD>#<23>.<2E>.<2E>6<>6<>s<EFBFBD>C<EFBFBD>@<40>@<40> <0B><1C>'<27>,<2C>,<2C>t<EFBFBD>{<7B>=<3D>'A<>Cf<43>T_<54>Cf<43>Cf<43>Cf<43>g<>g<><0F>I Q<01> <10> '<27> '<27><04> <0B>M<EFBFBD>(B<> C<> C<> C<><19>G<EFBFBD> "<22><07><0E><0E><EFBFBD> ?<3F> ?<3F>I<><04><04>T<EFBFBD>I<EFBFBD><15>o<EFBFBD>y<EFBFBD>1<>1<>< ;<3B>Q<EFBFBD><15> <0B>A<EFBFBD>H<EFBFBD>H<EFBFBD>J<EFBFBD>J<EFBFBD><05> <0A>6<>6<>6<>9;<3B><19>w<EFBFBD><EFBFBD><EFBFBD><EFBFBD>7<>7<>!<21>;<3B>;<3B><19><06><06>q<EFBFBD> <09> <09> <09>)<29>&*<2A>i<EFBFBD><01>l<EFBFBD>l<EFBFBD>G<EFBFBD>G<EFBFBD><47>#<23>3<>)<29>)<29>)<29>"<22>N<EFBFBD>N<EFBFBD>+k<>_<EFBFBD>+k<>+k<>hi<68>+k<>+k<>l<>l<>l<>&(<28>G<EFBFBD>G<EFBFBD>G<EFBFBD>G<EFBFBD>G<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD> &.<2E>%6<>%:<3A>%:<3A>%<<3C>%<<3C>%F<>%F<>%H<>%H<>&8<>'<16>'<16>O<EFBFBD><1C>N<EFBFBD>N<EFBFBD>?<3F>3<>3<>3<>#+<2B>"3<>"7<>"7<>"9<>"9<>H<EFBFBD><N<>TX<54>T_<54>`x<>Ty<54><z<><z<><z<>"z<>K<EFBFBD>s<>s<>s<>s<>'<27>s<>s<>s<>G<EFBFBD><1B>7<EFBFBD>|<7C>|<7C>q<EFBFBD>(<28>(<28>*k<01>*k<01>*k<01><0E>%3<>T<02>T<02>D<EFBFBD>#<23>'9<>9<>9<>AD<41>W<EFBFBD><1C><1C>QR<51>AR<41>AR<41><17><12><13><13><1C><1C>X_<58><0E>)_<>)_<>)_<>)_<>P^<5E>)_<>)_<>)_<><06>#&<26>v<EFBFBD>;<3B>;<3B>!<21>#3<>#3<>6<<3C>R<EFBFBD>j<EFBFBD>6<EFBFBD>!<21>9<EFBFBD>6L<36>O<EFBFBD>'6<><11>':<3A>':<3A>/><3E><13>V<EFBFBD><1B><1B>/L<><04>,0<>3f<33>+f<>+f<>/3<>c<EFBFBD>z<EFBFBD>z<EFBFBD>06<30> <0A> <0A>?S<02>`d<>?S<02>?S<02>ix<69>?S<02>?S<02>B<02>CI<02>J<02>J<02>?S<02>?S<02>?S<02>1T<02>1T<02>1T<02><>-1<>5d<35>-d<>-d<>/3<>c<EFBFBD>z<EFBFBD>z<EFBFBD>06<30> <0A> <0A>?L<02>Y]<5D>?L<02>?L<02>bq<62>?L<02>?L<02>wz<77>|B<02>xC<02>xC<02>?L<02>?L<02>?L<02>1M<02>1M<02>1M<02><>/3<>a<EFBFBD>x<EFBFBD>x<EFBFBD>06<30> <0A> <0A>?S<02>`d<>?S<02>?S<02>ix<69>?S<02>?S<02>B<02>CI<02>J<02>J<02>?S<02>?S<02>?S<02>1T<02>1T<02>1T<02><><16>F<EFBFBD>F<EFBFBD>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><15>J<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>L<EFBFBD><18>I<EFBFBD>g<EFBFBD>q<EFBFBD><11>3<>3<>3<>3<><15>G<EFBFBD>G<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><1A>K<EFBFBD><01><08><08>
<EFBFBD>
<EFBFBD>E<EFBFBD>M<EFBFBD>:<3A>:<3A>:<3A>:<3A><>E<EFBFBD>K<EFBFBD><01><08><08>
<EFBFBD>
<EFBFBD>E<EFBFBD>M<EFBFBD>:<3A>:<3A>:<3A>:<3A><><EFBFBD><EFBFBD>:<3A>y< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B>< ;<3B><><EFBFBD><EFBFBD>< ;<3B>< ;<3B>< ;<3B>< ;<3B><><EFBFBD>|<18><17>!<21> J<01> J<01> J<01> <12>L<EFBFBD>L<EFBFBD>H<>6<EFBFBD>H<>H<>Q<EFBFBD>H<>H<> I<> I<> I<> I<> I<> I<> I<> I<><49><EFBFBD><EFBFBD><EFBFBD><18> Q<01> Q<01> Q<01> <12>L<EFBFBD>L<EFBFBD>O<>&<26>O<>O<>A<EFBFBD>O<>O<> P<> P<> P<> P<> P<> P<> P<> P<><50><EFBFBD><EFBFBD><EFBFBD> Q<01><><EFBFBD><EFBFBD><16> s<><00>AP
<00>42O><03>'8N;<02> D5<02>4N;<02>5E0<05>"E+<05>&N;<02>+E0<05>0HN;<02> 2O><03>;3O.<05>.O><03>2 P
<00>>P<07>P
<00>P<07>P
<00>
Q7<03> Q<03> Q7<03> Q2<03>2Q7<03>HDDr)<00>
drive_typec<00>&<00>g}|<02>|S|dkrdddd<06>}ndddd<06>}||d kr|<04>d
|<02>d |<03><00><04><00>nO||d kr|<04>d |<02>d|<03><00><04><00>n'||dkr|<04>d|<02>d|<03><00><04><00>|S)zEEnhanced thermal health checking with drive-type specific thresholds.N<>SSDrRrSr>)rcr<><00> optimal_max<61>K<00><r<>zCRITICAL: Drive temperature u%°C exceeds safe operating limit for rczWARNING: Drive temperature u"°C approaching thermal limit for r<>zINFO: Drive temperature u°C above optimal range for )r)r<>r3r)r<>rM<00>temp_thresholdss ru<00>_check_thermal_healthz)SystemHealthMonitor._check_thermal_healthRs<><00><00><13><06> <16> <1E><19>M<EFBFBD> <16><15> <1E> <1E>*,<2C>"<22>R<EFBFBD>P<>P<>O<EFBFBD>O<EFBFBD>*,<2C>"<22>R<EFBFBD>P<>P<>O<EFBFBD> <16>/<2F>*<2A>5<> 5<> 5<> <12>M<EFBFBD>M<EFBFBD>w<><1B>w<>w<>ku<6B>w<>w<> x<> x<> x<> x<> <18>O<EFBFBD>I<EFBFBD>6<> 6<> 6<> <12>M<EFBFBD>M<EFBFBD>s<> <0B>s<>s<>gq<67>s<>s<> t<> t<> t<> t<> <18>?<3F>=<3D>9<> 9<> 9<> <12>M<EFBFBD>M<EFBFBD>j<>[<5B>j<>j<>^h<>j<>j<> k<> k<> k<><15> r<><00> smart_outputc<00><><00>g}gd<01>gd<02>gd<03>d<04>}|<04><00><00>D]<5D>\}}d}|D]4}tj||tj<00><00>} |t | <09><00>z }<07>5|dkrh|dkr|<03>d|<05>d|<07>d <09><05><00><00>g|d
kr|<03>d |<05>d|<07>d <09><05><00><00><>|d kr|<03>d |<05>d|<07>d <09><05><00><00><>|S)z.Analyze SMART error logs for failure patterns.)<05>UNC_ERR<52>ABRT_ERRz
read errorz write errorz medium error)<04>ICRC_ERRzinterface CRC errorzSATA link downzcommunication failure)zcommand timeoutz NCQ errorz device faultzreset required)<03> media_errors<72>interface_errors<72>timeout_errorsrr<>zCRITICAL: Multiple z detected (<28> occurrences)rO<00> WARNING: rC<00>INFO: )<06>items<6D>re<72>findall<6C>
IGNORECASErZr)
r<EFBFBD>r3r<>rM<00>error_patterns<6E>
error_type<EFBFBD>patterns<6E> error_count<6E>pattern<72>matchess
ru<00>_analyze_error_patternsz+SystemHealthMonitor._analyze_error_patternshsG<00><00><13><06><0E><0E><0E>!<0E>!<0E>!<0E> <0E><0E><0E>
<EFBFBD>
<EFBFBD><0E>,%3<>$8<>$8<>$:<3A>$:<3A> ^<01> ^<01> <20>J<EFBFBD><08><1B>K<EFBFBD>#<23> ,<2C> ,<2C><07><1C>*<2A>W<EFBFBD>l<EFBFBD>B<EFBFBD>M<EFBFBD>J<>J<><07><1B>s<EFBFBD>7<EFBFBD>|<7C>|<7C>+<2B> <0B> <0B><1A>Q<EFBFBD><EFBFBD><EFBFBD><1E>"<22>$<24>$<24><1A>M<EFBFBD>M<EFBFBD>"i<>
<EFBFBD>"i<>"i<>{<7B>"i<>"i<>"i<>j<>j<>j<>j<> <20>A<EFBFBD>%<25>%<25><1A>M<EFBFBD>M<EFBFBD>"_<>j<EFBFBD>"_<>"_<>[<5B>"_<>"_<>"_<>`<60>`<60>`<60>`<60> <20>A<EFBFBD>%<25>%<25><1A>M<EFBFBD>M<EFBFBD>"\<5C>:<3A>"\<5C>"\<5C>+<2B>"\<5C>"\<5C>"\<5C>]<5D>]<5D>]<5D><><15> r<><00>smart_attributesc<00><><00>g}gd<01>}|D]z}||vrt||}|dvrh|dkr|<03>d|<05>d|<06>d<06><05><00><00>5|dkr|<03>d|<05>d|<06>d <09><05><00><00>X|d
kr|<03>d |<05>d|<06>d <0C><05><00><00>{gd <0A>}|D]Q}||vrK||}|dkr|<03>d|<05>d|<06><00><04><00><00>0|dkr|<03>d|<05>d|<06><00><04><00><00>Rgd<13>}|<02>dd<15><00>} |<02>dd<15><00>}
| dkrJ|
dkrD|
| z } | dkr|<03>d| d<19><04><02><00>n| dkr|<03>d| d<19><04><02><00>|S)z2SSD-specific health checks for wear and endurance.)r<><00> SSD_Life_Left<66>Percent_Lifetime_Remainr<6E><00>Available_Spare_Threshold)r<>r<>r<>r<>r<><00>
CRITICAL: z at z% - SSD near end of life<66>r<>z % - SSD showing significant wearrLr<>z#% - SSD wear monitoring recommended)<04>Runtime_Bad_Block<63>Factory_Bad_Block_Ct<43>Grown_Failing_Block_Ct<43>End-to-End_Errorr<72>zWARNING: High r<>r<>zINFO: Elevated )<04>Total_LBAs_Written<65>Total_LBAs_Read<61>Host_Program_NAND_Pages_Count<6E>FTL_Program_NAND_Pages_Countr<74>rr<>g@z*WARNING: High write amplification factor: z.2fg@z+INFO: Elevated write amplification factor: )rr) r<>r3r<>rM<00>wear_indicators<72> indicatorrs<00>bad_block_indicators<72>endurance_indicators<72> host_writes<65>
ftl_writes<EFBFBD>write_amplifications ru<00>_check_ssd_healthz%SystemHealthMonitor._check_ssd_health<74>s2<00><00><13><06>
<EFBFBD>
<EFBFBD>
<EFBFBD><0F>)<29> j<01> j<01>I<EFBFBD><18>,<2C>,<2C>,<2C>(<28><19>3<><05><1D> z<>z<>z<><1C><01>z<EFBFBD>z<EFBFBD><1E> <0A> <0A>&a<>9<EFBFBD>&a<>&a<>%<25>&a<>&a<>&a<>b<>b<>b<>b<><1E>"<22><1B><1B><1E> <0A> <0A>&h<>)<29>&h<>&h<><15>&h<>&h<>&h<>i<>i<>i<>i<><1E>"<22><1B><1B><1E> <0A> <0A>&h<>y<EFBFBD>&h<>&h<>e<EFBFBD>&h<>&h<>&h<>i<>i<>i<><69>
<EFBFBD>
<EFBFBD>
<EFBFBD><1C>.<2E> J<01> J<01>I<EFBFBD><18>,<2C>,<2C>,<2C>(<28><19>3<><05><18>3<EFBFBD>;<3B>;<3B><1A>M<EFBFBD>M<EFBFBD>"G<>9<EFBFBD>"G<>"G<><05>"G<>"G<>H<>H<>H<>H<><1A>R<EFBFBD>Z<EFBFBD>Z<EFBFBD><1A>M<EFBFBD>M<EFBFBD>"H<>I<EFBFBD>"H<>"H<><15>"H<>"H<>I<>I<>I<><49>
<EFBFBD>
<EFBFBD>
<EFBFBD><1C>'<27>*<2A>*<2A>+J<>A<EFBFBD>N<>N<> <0B>%<25>)<29>)<29>*H<>!<21>L<>L<>
<EFBFBD> <16><11>?<3F>?<3F>z<EFBFBD>A<EFBFBD>~<7E>~<7E>",<2C>{<7B>":<3A> <1F>"<22>S<EFBFBD>(<28>(<28><16> <0A> <0A>d<>K^<5E>d<>d<>d<>e<>e<>e<>e<>$<24>s<EFBFBD>*<2A>*<2A><16> <0A> <0A>e<>L_<4C>e<>e<>e<>f<>f<>f<><15> r<>c<00>4<00>dgd<02>} tjgd<03>tjtjdd<05><06><00>}|jdkr<>gd<08>}|D]<5D>\}}t j||jtj<00><00>}|r<>t|<06><00>}|d kr(d
|d <|d <00> d |<05>d|<07>d<0F><05><00><00>i|dkr4|d d
krd|d <|d <00> d|<05>d|<07>d<0F><05><00><00><>|d <00> d|<05>d|<07>d<0F><05><00><00><>n<EFBFBD>#tj
$r|d <00> d<14><00>Yn^t$rR}t<00> d|<08><00><02><00>|d <00> dt|<08><00><00><00><02><00>Yd}~nd}~wwxYw|S)z7Check system logs and kernel messages for drive issues.<2E>OK)r<rM)<03>dmesgz-Tz--level=err,warnTr<54><00><04>stdout<75>stderr<72>text<78>timeoutr))zata\d+.*failed commandzATA command failures)zsd \w+.*Medium ErrorzSCSI medium errors)zBuffer I/O errorzBuffer I/O errors)zcritical medium errorzCritical medium errors)zunrecovered read errorzUnrecovered read errors)z!Current_Pending_Sector.*increasedzPending sector increases)zata\d+.*SError:z SATA errors)znvme\d+.*I/O errorzNVMe I/O errorsr<73>rr<rMr<>z in system logs (r<>ror<>r<>r<>z#WARNING: System log check timed outz(Error checking system drive indicators: z$ERROR: Failed to check system logs: N)<0F>
subprocessr<00>PIPE<50>
returncoder<EFBFBD>r<>r<>r<>rZr<00>TimeoutExpiredrlrbr<00>str) r<>r%<00>resultr<74>r<>r<>r<><00>countrts rurYz2SystemHealthMonitor._check_system_drive_indicators<72>s2<00><00><1B><18>
<EFBFBD>
<EFBFBD> <0A>
# \<01><1F>^<5E>$G<>$G<>$G<>)3<><1F><1A><1F>W[<5B>eg<65>i<01>i<01>i<01>F<EFBFBD><16> <20>A<EFBFBD>%<25>%<25> "<12> "<12> "<12><0E>-;<3B> x<01> x<01>(<28>G<EFBFBD>[<5B> <20>j<EFBFBD><17>&<26>-<2D><12><1D>O<>O<>G<EFBFBD><1E>
x<01> #<23>G<EFBFBD> <0C> <0C><05> <20>A<EFBFBD>:<3A>:<3A>6@<40>M<EFBFBD>(<28>3<>)<29>(<28>3<>:<3A>:<3A>;z<> <0B>;z<>;z<>fk<66>;z<>;z<>;z<>{<7B>{<7B>{<7B>{<7B>"<22>a<EFBFBD>Z<EFBFBD>Z<EFBFBD>,<2C>X<EFBFBD>6<>*<2A>D<>D<>:C<> <0A>h<EFBFBD> 7<>)<29>(<28>3<>:<3A>:<3A>;y<>{<7B>;y<>;y<>ej<65>;y<>;y<>;y<>z<>z<>z<>z<>)<29>(<28>3<>:<3A>:<3A>;v<>K<EFBFBD>;v<>;v<>bg<62>;v<>;v<>;v<>w<>w<>w<><77><EFBFBD><EFBFBD><19>(<28> R<01> R<01> R<01> <19>(<28> #<23> *<2A> *<2A>+P<> Q<> Q<> Q<> Q<> Q<><18> \<01> \<01> \<01> <12>L<EFBFBD>L<EFBFBD>G<>A<EFBFBD>G<>G<> H<> H<> H<> <19>(<28> #<23> *<2A> *<2A>+Z<>RU<52>VW<56>RX<52>RX<52>+Z<>+Z<> [<5B> [<5B> [<5B> [<5B> [<5B> [<5B> [<5B> [<5B><><EFBFBD><EFBFBD><EFBFBD> \<01><><EFBFBD><EFBFBD><1D>s<00>DD<00>*F<03>: F<03>AF<03>Fc<00><><00>ddddddd<03>} tjdd|gtjtjd<06><07><00>}|jdvr't<00>d |<01>d
|j<00><00><04><00>|S|j}d |vsd |vrd|d <n(d|vsd|vr t<00>d|<01>d<11><03><00>|S|<04>d<12><00>D]<5D>}d|vsd|vr1|<05>d<15><00>d<00><00><00>|d<<00>;d|vr1|<05>d<15><00>d<00><00><00>|d<<00>pd|vr0tj
d|<05><00>}|r|<06> d<16><00>|d<<00><>d|vr1|<05>d<15><00>d<00><00><00>|d<<00><>d|vrd |vrd!|d"<<00><>d#|d"<<00><>n7#t$r*}t<00>d$|<01>d%|<07><00><04><00>Yd}~nd}~wwxYw|S)&z.Get detailed drive information using smartctl.NF)<06>model<65>serial<61>capacity<74>firmware<72>type<70> smart_capable<6C>smartctl<74>-iT<69>r<>r<>r<>)r<00>zsmartctl failed for z: return code zSMART support is: EnabledzSMART support is: Availabler<65>zSMART support is: Unavailablezdoes not support SMART<52>Device z does not support SMART<52>
z Device Modelz Model Number<65>:rCr<>z Serial Numberr<72>z User Capacityz \[(.*?)\]r<>zFirmware Versionr<6E>z Rotation RatezSolid State Devicer<65>r<>r<>z Error getting drive details for r<>) r<>rr<>r<>rbrr<>rgrer<><00>search<63>grouprl)r<>r3<00> drive_details<6C>capability_result<6C>outputrq<00>capacity_matchrts ru<00>_get_drive_detailsz&SystemHealthMonitor._get_drive_detailss<><00><00><1A><1A><1C><1C><18>"<22> 
<EFBFBD>
<EFBFBD> <0A>* K<01> *<2A><0E><1B>T<EFBFBD>6<EFBFBD>*<2A>!<21><EFBFBD>!<21><EFBFBD><19> !<0E>!<0E>!<0E> <1D>!<21>+<2B>6<EFBFBD>9<>9<><16> <0C> <0C>h<>F<EFBFBD>h<>h<>J[<5B>Jf<4A>h<>h<>i<>i<>i<>$<24>$<24>&<26>-<2D>F<EFBFBD>+<2B>f<EFBFBD>4<>4<>8U<38>Y_<59>8_<38>8_<38>15<31> <0A>o<EFBFBD>.<2E>.<2E>0<>F<EFBFBD>:<3A>:<3A>>V<>Z`<60>>`<60>>`<60><16> <0C> <0C>F<>v<EFBFBD>F<>F<>F<>G<>G<>G<>$<24>$<24><1E> <0C> <0C>T<EFBFBD>*<2A>*<2A> 6<> 6<><04>!<21>T<EFBFBD>)<29>)<29>^<5E>t<EFBFBD>-C<>-C<>-1<>Z<EFBFBD>Z<EFBFBD><03>_<EFBFBD>_<EFBFBD>Q<EFBFBD>-?<3F>-E<>-E<>-G<>-G<>M<EFBFBD>'<27>*<2A>*<2A>$<24><04>,<2C>,<2C>.2<EFBFBD>j<EFBFBD>j<EFBFBD><13>o<EFBFBD>o<EFBFBD>a<EFBFBD>.@<40>.F<>.F<>.H<>.H<>M<EFBFBD>(<28>+<2B>+<2B>$<24><04>,<2C>,<2C>%'<27>Y<EFBFBD>|<7C>T<EFBFBD>%B<>%B<>N<EFBFBD>%<25>L<01>4B<34>4H<34>4H<34><11>4K<34>4K<34> <0A>j<EFBFBD>1<><31>'<27>4<EFBFBD>/<2F>/<2F>04<30>
<EFBFBD>
<EFBFBD>3<EFBFBD><0F><0F><01>0B<30>0H<30>0H<30>0J<30>0J<30>M<EFBFBD>*<2A>-<2D>-<2D>$<24><04>,<2C>,<2C>+<2B>t<EFBFBD>3<>3<>05<30> <0A>f<EFBFBD>-<2D>-<2D>05<30> <0A>f<EFBFBD>-<2D><>! 6<><36>$<19> K<01> K<01> K<01> <12>L<EFBFBD>L<EFBFBD>I<>F<EFBFBD>I<>I<>a<EFBFBD>I<>I<> J<> J<> J<> J<> J<> J<> J<> J<><4A><EFBFBD><EFBFBD><EFBFBD> K<01><><EFBFBD><EFBFBD><1D>s%<00>AF*<00>*<F*<00>'DF*<00>*
G<03>4 G<03>G<03>title<6C>content<6E> content_widthc <00>R<00>d|<01>dd|t|<01><00>z
dz
z<00>d|<02>dd|z<00>d<07> S)z.Create a formatted box with title and content.u
┏━ <20> <20>━rO<00>
u
<EFBFBD><>rZ)r<>r<>r<>r<>s ru<00>make_boxzSystemHealthMonitor.make_box<sa<00><00>!<21> <0A>!<21>!<21><15><1D><13>U<EFBFBD><1A><1A>3<>a<EFBFBD>7<>8<>!<21>!<21><08>!<21>!<21>
<EFBFBD>M<EFBFBD><19>!<21>!<21>!<21> !r<><00>issuec<00>B<00>d|vrdSd|vrdSd|vrdSd|vrdSd |vrd
Sd S) z,Determine issue type from issue description.<2E>SMARTzSMART Health Issue<75>Drivez Storage Issue<75>ECCz Memory Issue<75>CPUzPerformance Issue<75>Networkz Network IssuezHardware Issuer<65><00>r<>r<>s ru<00>_get_issue_typez#SystemHealthMonitor._get_issue_typeCsV<00><00> <12>e<EFBFBD> <1B> <1B>'<27>'<27> <14><05> <1D> <1D>"<22>?<3F> <12>e<EFBFBD>^<5E>^<5E>!<21>><3E> <12>e<EFBFBD>^<5E>^<5E>&<26>&<26> <16>%<25> <1F> <1F>"<22>?<3F><1F>r<>c<00>&<00>d|vsd|vrdSd|vrdSdS)z.Determine impact level from issue description.r<00> UNHEALTHYu)🔴 Critical - Immediate Action Requiredr<64>u!🟡 Warning - Action Needed Soonu🟢 Low - Monitor Onlyr<79>r<>s ru<00>_get_impact_levelz%SystemHealthMonitor._get_impact_levelQs4<00><00> <15><15> <1E> <1E>+<2B><15>"6<>"6<>><3E>><3E> <16>%<25> <1F> <1F>6<>6<>(<28>(r<>rc<00><><00>3<EFBFBD>tj<00><00>}tj<00><00><00><00>d<01><00>}d|vrdnd}d}d}dd|z<00>d d
<EFBFBD>|<06><00><00>d d|z<00>d |d |dz
<00><00><02>d|d |dz
<00><00><02>d|d |dz
<00><00><02>dd|z<00>d<12>}|<00>|<01><00>} |<00>|<01><00>}
dd|dz
z<00>d| d |<07><00><02>d|
d |<07><00><02>dd|z<00>d<12> } || z} |jD]} | |vr| d| <0A>d|j| <00>d<17>z } <0C>d|vr| dz } d|v<00>r<>d|v<00>r<> d|vr(tj
d|<01><00><00> d<1E><00>nd<1F>3t<00>3fd <20>|d!d"D<00><00>d<1F><00>}|<0E>r|<00> <00>3<EFBFBD><00>}|<0E>d#i<00><00>|<0E>d$i<00><00>|<0E>d%d&<26><00>d'<27>}|d(<00>d)d&<26><00>}|<10>d%d&<26><00>}|d&kr6t|t t"f<02><00>rt!|d*z d+z <00><00>nd&<26>d,<2C>nd&}<13>3pd&}|<0F>d-<2D><00>pd&}|<0F>d.<2E><00>pd&}|<0F>d/<2F><00>pd&}|<0F>d0<64><00>pd&}|<0F>d1<64><00>pd&}| d2d|d3z
z<00>d4|d |<07><00><02>d5|d |<07><00><02>d6|d |<07><00><02>d7|d |<07><00><02>d8|d |<07><00><02>d9|d |<07><00><02>dd|z<00>d:<3A>z } |r<>|<0E>d$i<00><00><00>d;d&<26><00>|<0E>d$i<00><00><00>d<d&<26><00>|<0E>d$i<00><00><00>d=d&<26><00>|<0E>d$i<00><00><00>d>d&<26><00>d?<3F>}|d&kr|<11>d@<40>nd&}|pd&}|pd&}| dAd|dBz
z<00>dC|d |dDz
<00><00><02>dE|d |dDz
<00><00><02>dF|d |dDz
<00><00><02>dd|z<00>d:<3A> z } |<0E>dG<64><00>pd&}|<0E>dH<64><00>}|<1F>|<1F>dI<64>nd&} | dJd|dz
z<00>dK|d |<07><00><02>dL| d |<07><00><02>dd|z<00>d:<3A> z } |<0E>d#<23><00>r<>| dMd|dNz
z<00>dO<64>z } |d#<00><00><00>D]S\} }!| r#t'| <0A><00><00>dPdQ<64><00>ndR}"|!<21>t'|!<21><00>nd&}#| dS|"dT<64>dU|#d |dVz
<00><00><02>dW<64>z } <0C>T| dXd|z<00>d:<3A>z } |<0E>dY<64><00><00>r%|dYD<00>]}$|$<24>dZd<1E><00>}%t!|%d[z <00><00>}&d\|&zd]d^|&z
zz}'|$<24>d_<64><00>pd&}(|$<24>d`<60><00>pd&})|$<24>da<64><00>pd&}*|$<24>db<64><00>pd&}+|$<24>dc<64><00>pd&},|%<25>dd<64>}-t+|(<28><00>d^kr
|(dd^<5E>n|(}.| de|.<2E>dQd|dVz
t+|.<2E><00>z
z<00>df|)d |<07><00><02>dg|'<27>dQ|-dh<64>di|*d |<07><00><02>dj|+d |<07><00><02>dk|,d |<07><00><02>dd|z<00>d:<3A>z } <0C><01>|<00><00>3<EFBFBD><00>}/|/dlrI| dmd|dnz
z<00>dO<64>z } |/doD]%}0|0rt'|0<><00>ndp}1| dq|1d |drz
<00><00><02>dW<64>z } <0C>&| dXd|z<00>d:<3A>z } n-#t.$r }2| dst'|2<><00><00>d<17>z } Yd}2~2nd}2~2wwxYwdt|vr| duz } dv|vr| dwz } dx|vr| dyz } dz|vr| d{z } d||vr<>|<02>d!i<00><00><00>d"g<00><00>D]x}$|$<24>d_<64><00>|vr_| d}z } | d~|$d<00>d<17>z } | d<>|$d_<00>d<17>z } | d<>|$da<00>d<17>z } | d<>|$db<00>d<17>z } | d<>|$dc<00>d<17>z } | d<>|$dZ<00>d<><64>z } <0C>y| S)<29>zGGenerate detailed ticket description with properly formatted ASCII art.z%Y-%m-%d %H:%M:%Sru⚠ HIGHu
● MEDIUM<55>N<00>>u
┏r<EFBFBD>u
┃z" HARDWARE MONITORING ALERT TICKET u
┣u
┃ Host : <20><r<>u
┃ Generated : u
┃ Priority : u
┗r<EFBFBD>u
┏━ EXECUTIVE SUMMARY r<>u
┃ Issue Type │ u
┃ Impact Level │ r<>z:
r<EFBFBD>z<>
SMART (Self-Monitoring, Analysis, and Reporting Technology) Attribute Details:
- Possible drive failure!
r<><00>/dev/<2F>/dev/[a-zA-Z0-9]+rNc3<00>4<00>K<00>|]}|d<00>k<00>|V<00><00>dS)r3Nr<4E>)rH<00>dr3s <20>ru<00> <genexpr>zESystemHealthMonitor._generate_detailed_description.<locals>.<genexpr><3E>s5<00><><00><00><00>"p<>"p<><11>Z[<5B>\d<>Ze<5A>io<69>Zo<5A>Zo<5A>1<EFBFBD>Zo<5A>Zo<5A>Zo<5A>Zo<5A>"p<>"pr<70>rr'r<><00>performance_metrics<63>last_test_datezN/A)r<>rrr<>r<><00>imz yearsr<73>r<>r<>r<>r<>u
┏━ DRIVE SPECIFICATIONS <20>u
┃ Device Path │ u
┃ Model │ u
┃ Serial │ u
┃ Capacity │ u
┃ Type │ u
┃ Firmware │ u
<EFBFBD>
read_speed<EFBFBD> write_speed<65> access_time<6D>iops)r r
r r z hoursu
┏━ DRIVE TIMELINE <20>u
┃ Power-On Hours │ r<>u
┃ Last SMART Test │ u
┃ Drive Age │ r4r)r+u
┏━ SMART STATUS u
┃ Status │ u
┃ Temperature │ u
┏━ SMART ATTRIBUTES <20>r<>rdr<>r<>u┃ z<27u<20>u
u┗r-r2rou█u<>2r.<00>fstyper1r/<00>
free_spacer:u
┏━ PARTITION: u
┃ Filesystem │ u
┃ Usage Meter │ z>5u
┃ Total Space │ u
┃ Used Space │ u
┃ Free Space │ <20>is_problematicu
┏━ FIRMWARE ALERTS <20><00> known_issuesz Unknown issueu ┃ ⚠ r<>z!
Error generating drive details: <20> Temperatureu<65>
High drive temperatures can:
- Reduce drive lifespan
- Cause performance degradation
- Lead to data corruption in extreme cases
Optimal temperature range: 20-45°C
r<>a$
ECC (Error Correction Code) Memory Issues:
- Correctable: Memory errors that were successfully fixed
- Uncorrectable: Serious memory errors that could not be corrected
Frequent ECC corrections may indicate degrading memory modules
r<>z<>
High CPU usage sustained over time can indicate:
- Resource constraints
- Runaway processes
- Need for performance optimization
- Potential cooling issues
r<>z<>
Network connectivity issues can impact:
- Cluster communication
- Data replication
- Service availability
- Management access
<20>Diskz
=== Disk Metrics ===
z Disk Device: r3z Mount Point: z Total Space: z Used Space: z Free Space: zUsage Percent: z%
)rNrOrPrQ<00>strftime<6D>centerr<72>r<><00>SMART_DESCRIPTIONSr<53>r<>r<><00>nextr<74>r<00>
isinstancerk<00>floatr<74>r<>rrrZ<00>_check_disk_firmwarerl)4r<34>r<>rrr<00>priority<74> box_width<74> field_width<74>banner<65>
issue_type<EFBFBD> impact_level<65>executive_summaryr<79>rm<00>
drive_infor<EFBFBD><00>
smart_data<EFBFBD>power_on_hoursr<00>ager<65><00>
model_safe<EFBFBD> serial_safe<66> capacity_safe<66> type_safe<66> firmware_safe<66> perf_metrics<63> power_on_safe<66>last_test_safe<66>age_safe<66>smart_status_safe<66>
temp_value<EFBFBD> temp_safers<00> attr_safe<66>
value_safer^r2<00>blocks<6B> usage_meter<65>mountpoint_safe<66> fstype_safe<66>total_space_safe<66>used_space_safe<66>free_space_safe<66> usage_pct_str<74>mountpoint_display<61> firmware_info<66>
issue_item<EFBFBD>
issue_safertr3s4 @ru<00>_generate_detailed_descriptionz2SystemHealthMonitor._generate_detailed_descriptionYs<> <00><><00><19>%<25>'<27>'<27><08><1C>%<25>)<29>)<29>+<2B>+<2B>4<>4<>5H<35>I<>I<> <09>!+<2B>u<EFBFBD>!4<>!4<>:<3A>:<3A>,<2C><08><17> <09><18> <0B><1D> <09>I<EFBFBD><15><1D><1D>(<28>/<2F>/<2F> <09>:<3A>:<3A><1D><1D>
<EFBFBD>I<EFBFBD><15><1D><1D><1B> <1D>'<27><12>^<5E> <1D><1D><1D><1D>
<1C> <1D>
(<28>"<22>n<EFBFBD> <1D><1D><1D><1D> <1B> <1D> '<27><12>^<5E> <1D><1D><1D><1D>
<EFBFBD>I<EFBFBD><15><1D><1D><1D><06><1A>)<29>)<29>%<25>0<>0<>
<EFBFBD><1B>-<2D>-<2D>e<EFBFBD>4<>4<> <0C><1D><1F>9<EFBFBD>r<EFBFBD>><3E>2<><1D><1D>"<22><1D>%0<><1D><1D><1D><1D>%<25><1D>(3<><1D><1D><1D><1D>
<EFBFBD>I<EFBFBD><15> <1D><1D><1D><19> <1D>0<>0<> <0B><19>+<2B> O<01> O<01>D<EFBFBD><13>u<EFBFBD>}<7D>}<7D><1B>N<>D<EFBFBD>N<>N<>T<EFBFBD>-D<>T<EFBFBD>-J<>N<>N<>N<>N<> <0B><> <12>e<EFBFBD> <1B> <1B> <17><10> <10>K<EFBFBD>
<13>e<EFBFBD> <1B> <1B><07>5<EFBFBD> 0<> 0<>o O<01>LS<4C>W\<5C>L\<5C>L\<5C><12><19>#7<><15>?<3F>?<3F>E<>E<>a<EFBFBD>H<>H<>H<>bf<62><06>!<21>"p<>"p<>"p<>"p<>m<EFBFBD>O<EFBFBD>.L<>X<EFBFBD>.V<>"p<>"p<>"p<>rv<72>w<>w<>
<EFBFBD><1D>iF<01>$(<28>$;<3B>$;<3B>F<EFBFBD>$C<>$C<>M<EFBFBD>'1<>n<EFBFBD>n<EFBFBD>5G<35><12>&L<>&L<>/9<>~<7E>~<7E>>S<>UW<55>/X<>/X<>*4<>.<2E>.<2E>9I<39>5<EFBFBD>*Q<>*Q<>"<16>"<16>J<EFBFBD> &0<> <0C>%=<3D>%A<>%A<>BR<42>TY<54>%Z<>%Z<>N<EFBFBD>%/<2F>^<5E>^<5E>4D<34>e<EFBFBD>%L<>%L<>N<EFBFBD>{I<02>MR<02>{R<02>{R<02>:<3A>n<EFBFBD>WZ<57>\a<>Vb<56>;c<>;c<>n<>S<EFBFBD><1E><02>!2<>3<EFBFBD>!6<>7<>7<>7<>in<69>v<>v<>v<>v<>X]<02>C<EFBFBD>#)<29>/<2F>E<EFBFBD>K<EFBFBD>!.<2E>!2<>!2<>7<EFBFBD>!;<3B>!;<3B>!D<>u<EFBFBD>J<EFBFBD>"/<2F>"3<>"3<>H<EFBFBD>"=<3D>"=<3D>"F<><15>K<EFBFBD>$1<>$5<>$5<>j<EFBFBD>$A<>$A<>$J<>U<EFBFBD>M<EFBFBD> -<2D> 1<> 1<>&<26> 9<> 9<> B<>U<EFBFBD>I<EFBFBD>$1<>$5<>$5<>j<EFBFBD>$A<>$A<>$J<>U<EFBFBD>M<EFBFBD><1F> $<04>"<22>i<EFBFBD>"<22>n<EFBFBD>5<> $<04> $<04>"<22> $<04>%0<> $<04> $<04> $<04> $<04>"<22> $<04>%0<> $<04> $<04> $<04> $<04>#<23> $<04>&1<> $<04> $<04> $<04> $<04>
%<25> $<04>
(3<> $<04> $<04> $<04> $<04> !<21> $<04> $/<2F> $<04> $<04> $<04> $<04>%<25> $<04>(3<> $<04> $<04> $<04> $<04>
<EFBFBD>I<EFBFBD><15> $<04> $<04> $<04> <04>K<EFBFBD>"<22><1A>*4<>.<2E>.<2E>9N<39>PR<50>*S<>*S<>*W<>*W<>Xd<58>fk<66>*l<>*l<>+5<>><3E>><3E>:O<>QS<51>+T<>+T<>+X<>+X<>Yf<59>hm<68>+n<>+n<>+5<>><3E>><3E>:O<>QS<51>+T<>+T<>+X<>+X<>Yf<59>hm<68>+n<>+n<>$.<2E>N<EFBFBD>N<EFBFBD>3H<33>"<22>$M<>$M<>$Q<>$Q<>RX<52>Z_<5A>$`<60>$`<60> (<1A>(<1A> <0C>BP<01>SX<53>AX<41>AX<41>~<7E>$=<3D>$=<3D>$=<3D>$=<3D>^c<>M<EFBFBD>%3<>%<<3C>u<EFBFBD>N<EFBFBD>"<22>|<7C>e<EFBFBD>H<EFBFBD><1F>$<04><1C> <09>B<EFBFBD><0E>/<2F>$<04>$<04>)<29>$<04>,7<>!<21>O<EFBFBD>$<04>$<04>$<04>$<04>+<2B>$<04>.9<EFBFBD>1<EFBFBD>_<EFBFBD>$<04>$<04>$<04>$<04>%<25> $<04>(3<>Q<EFBFBD><EFBFBD> $<04>$<04>$<04>$<04>

<EFBFBD>I<EFBFBD><15> $<04>$<04>$<04><04>K<EFBFBD>)3<><0E><0E>~<7E>(F<>(F<>(O<>%<25>%<25>!+<2B><1E><1E> <0A>!><3E>!><3E>J<EFBFBD>6@<40>6L<36>:<3A> 2<> 2<> 2<> 2<>RW<52>I<EFBFBD><1F>$<04><1A>i<EFBFBD>"<22>n<EFBFBD>-<2D>$<04>$<04>'<27>$<04>*5<>$<04>$<04>$<04>$<04> <20>$<04>#.<2E>$<04>$<04>$<04>$<04>
<EFBFBD>I<EFBFBD><15> $<04>$<04>$<04><04>K<EFBFBD>"<22>~<7E>~<7E>&8<>9<>9<>F<01>#<23>'c<>E<EFBFBD>Y<EFBFBD>Y[<5B>^<5E>D\<5C>'c<>'c<>'c<>c<> <0B>+5<>6H<36>+I<>+O<>+O<>+Q<>+Q<>m<01>m<01>K<EFBFBD>D<EFBFBD>%<25>GK<47>(Z<><03>D<EFBFBD> <09> <09>(9<>(9<>#<23>s<EFBFBD>(C<>(C<>(C<>QZ<51>I<EFBFBD>7<<3C>7H<37><13>U<EFBFBD><1A><1A><1A>e<EFBFBD>J<EFBFBD>'<27>+l<>9<EFBFBD>+l<>+l<>+l<>z<EFBFBD>+l<>T_<54>bd<62>Td<54>+l<>+l<>+l<>+l<>+l<>l<>K<EFBFBD>K<EFBFBD>#<23>'E<>U<EFBFBD>Y<EFBFBD>-><3E>'E<>'E<>'E<>E<> <0B>!<21>~<7E>~<7E>l<EFBFBD>3<>3<><04>)3<>L<EFBFBD>)A<><04><04>I<EFBFBD>,5<>M<EFBFBD>M<EFBFBD>/<2F>1<EFBFBD>,M<>,M<>M<EFBFBD>%(<28><1D><11>):<3A>%;<3B>%;<3B>F<EFBFBD>*/<2F>&<26>.<2E>5<EFBFBD>B<EFBFBD><16>K<EFBFBD>;P<>*P<>K<EFBFBD>.7<EFBFBD>m<EFBFBD>m<EFBFBD>L<EFBFBD>.I<>.I<>.R<>U<EFBFBD>O<EFBFBD>*3<>-<2D>-<2D><08>*A<>*A<>*J<>U<EFBFBD>K<EFBFBD>/8<>}<7D>}<7D>]<5D>/K<>/K<>/T<>u<EFBFBD>,<2C>.7<EFBFBD>m<EFBFBD>m<EFBFBD>L<EFBFBD>.I<>.I<>.R<>U<EFBFBD>O<EFBFBD>.7<EFBFBD>m<EFBFBD>m<EFBFBD>L<EFBFBD>.I<>.I<>.R<>U<EFBFBD>O<EFBFBD>/<<3C>,?<3F>,?<3F>,?<3F>M<EFBFBD>JM<01>_<EFBFBD>I]<5D>I]<5D>`b<>Ib<49>Ib<49><1F><13>"<22><13>1E<31>1E<31>hw<68>.<2E>'<27>,<04>%<25>,<04>,<04>(-<2D><19>R<EFBFBD><1E>#<23>FX<46>BY<42>BY<42>1Y<31>(Z<>,<04>,<04>"<22>,<04>%0<>,<04>,<04>,<04>,<04>#<23>,<04>,<04>&3<>,<04>,<04>,<04>(<28> ,<04>+6<> ,<04>,<04>,<04>,<04>
'<27> ,<04>
*5<> ,<04>,<04>,<04>,<04> '<27> ,<04> *5<> ,<04>,<04>,<04>,<04>
<EFBFBD>I<EFBFBD><15>,<04>,<04>,<04><04>K<EFBFBD>K<EFBFBD>%)<29>$=<3D>$=<3D>f<EFBFBD>$E<>$E<>M<EFBFBD>$<24>%5<>6<>F<01>#<23>'b<>5<EFBFBD>I<EFBFBD>XZ<58>N<EFBFBD>C[<5B>'b<>'b<>'b<>b<> <0B>*7<><0E>*G<>Z<01>Z<01>J<EFBFBD><F<>)[<5B><13>Z<EFBFBD><1F><1F><1F>O<EFBFBD>J<EFBFBD>'<27>+Y<>z<EFBFBD>+Y<>I<EFBFBD>PQ<50>M<EFBFBD>+Y<>+Y<>+Y<>+Y<>+Y<>Y<>K<EFBFBD>K<EFBFBD>#<23>'E<>U<EFBFBD>Y<EFBFBD>-><3E>'E<>'E<>'E<>E<> <0B><><EFBFBD><1C> O<01> O<01> O<01><1B>N<>C<EFBFBD><01>F<EFBFBD>F<EFBFBD>N<>N<>N<>N<> <0B> <0B> <0B> <0B> <0B> <0B><><EFBFBD><EFBFBD><EFBFBD> O<01><><EFBFBD><EFBFBD> <19>E<EFBFBD> !<21> !<21> <17><10> <10>K<EFBFBD> <11>E<EFBFBD>><3E>><3E> <17><10> <10>K<EFBFBD> <11>E<EFBFBD>><3E>><3E> <17><10> <10>K<EFBFBD> <15><05> <1D> <1D> <17><10> <10>K<EFBFBD> <12>U<EFBFBD>?<3F>?<3F>*<2A>.<2E>.<2E><EFBFBD><02>C<>C<>G<>G<><08>RT<52>U<>U<> U<01> U<01> <09><1C>=<3D>=<3D><1C>.<2E>.<2E>%<25>7<>7<><1F>#><3E>><3E>K<EFBFBD><1F>#J<>9<EFBFBD>X<EFBFBD>3F<33>#J<>#J<>#J<>J<>K<EFBFBD><1F>#N<>9<EFBFBD>\<5C>3J<33>#N<>#N<>#N<>N<>K<EFBFBD><1F>#O<>9<EFBFBD>]<5D>3K<33>#O<>#O<>#O<>O<>K<EFBFBD><1F>#M<>)<29>L<EFBFBD>2I<32>#M<>#M<>#M<>M<>K<EFBFBD><1F>#M<>)<29>L<EFBFBD>2I<32>#M<>#M<>#M<>M<>K<EFBFBD><1F>#T<>Y<EFBFBD><EFBFBD>5O<35>#T<>#T<>#T<>T<>K<EFBFBD><4B><1A>s<00>#UZ<00>
Z,<03> Z'<03>'Z,c<00><00><06>d}gd<02>}|<01>di<00><00><00>dg<00><00>D]o}|<04>d<05><00>dkr|dz }|<04>dg<00><00>D]8<>d <09><06><00><00>vr t<00>fd
<EFBFBD>|D<00><00><00><00>s|dz }<02>9<EFBFBD>p|<01>d i<00><00><00>d <0C><00>d kr|dz }|<01>di<00><00>}|<05>di<00><00><00>d <0C><00>d kr|dz }|<05>di<00><00><00>d <0C><00>d kr|dz }|<01>di<00><00><00>d <0C><00>d kr|dz }|S)zGCount total critical issues across all health checks for P1 escalation.r<00>r<>r<>r<>rr'r4r<>rCr(r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dS<00>Nr<4E>)rH<00>counterr<72>s <20>rurz=SystemHealthMonitor._count_critical_issues.<locals>.<genexpr>5s(<00><><00><00><00>U<>U<>G<EFBFBD>w<EFBFBD>%<25>/<2F>U<>U<>U<>U<>U<>Ur<55>r r<rr"r;r=r$)rrj<00>any)r<>rr<><00>manufacturer_countersr[<00>netr<74>s @ru<00>_count_critical_issuesz*SystemHealthMonitor._count_critical_issues$s<><00><><00><11><05>!
<EFBFBD>!
<EFBFBD>!
<EFBFBD><1D>
#<23>&<26>&<26><EFBFBD><02>;<3B>;<3B>?<3F>?<3F><08>"<22>M<>M<> #<23> #<23>E<EFBFBD><14>y<EFBFBD>y<EFBFBD><1E>(<28>(<28>K<EFBFBD>7<>7<><15><11>
<EFBFBD><05><1E><19><19>><3E>2<EFBFBD>6<>6<> #<23> #<23><05><1D><15><1B><1B><1D><1D>.<2E>.<2E><1E>U<>U<>U<>U<>?T<>U<>U<>U<>U<>U<>#<23><1D><11>
<EFBFBD><05><>  #<23> <19> <1C> <1C>_<EFBFBD>b<EFBFBD> 1<> 1<> 5<> 5<>h<EFBFBD> ?<3F> ?<3F>:<3A> M<> M<> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD><1C><1F><1F> 0<>"<22>5<>5<><03> <0E>7<EFBFBD>7<EFBFBD>'<27><12> ,<2C> ,<2C> 0<> 0<><18> :<3A> :<3A>j<EFBFBD> H<> H<> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD> <0E>7<EFBFBD>7<EFBFBD>><3E>2<EFBFBD> &<26> &<26> *<2A> *<2A>8<EFBFBD> 4<> 4<>
<EFBFBD> B<> B<> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD> <19> <1C> <1C>\<5C>2<EFBFBD> .<2E> .<2E> 2<> 2<>8<EFBFBD> <<3C> <<3C>
<EFBFBD> J<> J<> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD><14> r<>c<00><00><05>|<01><00><00><00>|<00>|<02><00>}|j<00>dd<02><00>}||kr+t<00>d|<03>d<04><03><00>|jdSt<00>fd<06>dD<00><00><00><00>r |jdSt<00>fd<08>d D<00><00><00><00>r |jd
Sd <0B>vrd <0C>vr |jd
Sd <0A>vr(t<00>fd<0E>dD<00><00><00><00>r |jd
St<00>fd<10>dD<00><00><00><00>r |jdSt<00>fd<13>dD<00><00><00><00>r |jdSt<00>fd<16>dD<00><00><00><00>r |jdS|jdS)aY
Determine ticket priority based on issue type, severity, and context.
P1 = Cluster outages, multiple simultaneous failures
P2 = Hardware failures requiring same-day response
P3 = Warnings requiring response within 1-3 days
P4 = Normal monitoring alerts
P5 = Informational/minimal impact
rNrOzP1 escalation triggered: z critical issues detectedrc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<><00>rH<00>keyword<72> issue_lowers <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr>_s8<00><><00><00><00> <0B> <0B>'<27>w<EFBFBD>+<2B>%<25> <0B> <0B> <0B> <0B> <0B> r<>)z raid degradedzmultiple drivezboth networks unreachable<6C>
health_errc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr>gs8<00><><00><00><00>  <0B>  <0B>'<27>w<EFBFBD>+<2B>%<25>  <0B>  <0B>  <0B>  <0B>  <0B>  r<>)z smart failurez!smart overall health check failedz drive failurez disk failurezuncorrectable ecczhardware failurezcritical temperaturezfirmware issue<75>reallocated_sector<6F>pending_sector<6F>offline_uncorrectablezcritical available_sparez critical wearzcritical reallocatedzcritical current_pendingznetwork is unreachablez osd is downzosd downzcluster usage criticalr<00>[ceph]rEz smart issuesc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>)rHr<>rRs <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr>zs8<00><><00><00><00>1 <0B>1 <0B>z<EFBFBD><1A>{<7B>1J<31>1 <0B>1 <0B>1 <0B>1 <0B>1 <0B>1 r<>)r<><00>failed<65> reallocated<65>pending<6E> uncorrectable<6C>offlinec3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr><3E><00>8<00><><00><00><00> <0B> <0B>'<27>w<EFBFBD>+<2B>%<25> <0B> <0B> <0B> <0B> <0B> r<>) rczhigh temperaturezcorrectable eccz trend alertzcritical storage usagezlow available_sparez high wear<61> health_warnzcluster usage warningrc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr><3E><00>8<00><><00><00><00> <0B> <0B>'<27>w<EFBFBD>+<2B>%<25> <0B> <0B> <0B> <0B> <0B> r<>)<04> cpu usagezhigh storage usagez
system logz drive agerc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurzASystemHealthMonitor._determine_ticket_priority.<locals>.<genexpr><3E><00>8<00><><00><00><00> <0B> <0B>'<27>w<EFBFBD>+<2B>%<25> <0B> <0B> <0B> <0B> <0B> r<><00>zinfo:zinfo z above optimalz monitor onlyr)rjrMrhrrbri<00>
PRIORITIESrJ)r<>r<>r<00>critical_count<6E>escalation_thresholdrRs @ru<00>_determine_ticket_priorityz.SystemHealthMonitor._determine_ticket_priorityIsv<00><><00><1C>k<EFBFBD>k<EFBFBD>m<EFBFBD>m<EFBFBD> <0B><1E>4<>4<>]<5D>C<>C<><0E>#<23>{<7B><EFBFBD><EFBFBD>/N<>PQ<50>R<>R<><1C> <1A>1<> 1<> 1<> <12>K<EFBFBD>K<EFBFBD>]<5D>N<EFBFBD>]<5D>]<5D>]<5D> ^<5E> ^<5E> ^<5E><17>?<3F>:<3A>.<2E> .<2E> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> /<2F>
<18>?<3F>:<3A>.<2E> .<2E> <0F>  <0B>  <0B>  <0B>  <0B> 6
<EFBFBD>  <0B>  <0B>  <0B> <0B> <0B> +<2B><18>?<3F>6<EFBFBD>*<2A> *<2A> <14>{<7B> "<22> "<22>v<EFBFBD><1B>'<<3C>'<<3C><17>?<3F>6<EFBFBD>*<2A> *<2A> <1A>[<5B> (<28> (<28>S<EFBFBD>1 <0B>1 <0B>1 <0B>1 <0B>^
<EFBFBD>1 <0B>1 <0B>1 <0B>. <0B>. <0B> (<28><18>?<3F>6<EFBFBD>*<2A> *<2A> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> -<2D> <18>?<3F>8<EFBFBD>,<2C> ,<2C> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> -<2D><18>?<3F>8<EFBFBD>,<2C> ,<2C> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> *<2A><18>?<3F>5<EFBFBD>)<29> )<29><14><EFBFBD>x<EFBFBD>(<28>(r<>c<00><><00><02>|<01><00><00><00>t<00>fd<01>dD<00><00><00><00>r<>t<00>fd<03>dD<00><00><00><00>r>|jd|jd|jdd|jddfS|jd|jd |jdd|jdd fSt<00>fd
<EFBFBD>d D<00><00><00><00>r<>d <0C>vr>|jd |jd|jdd |jddfS|jd |jd |jdd |jdd fSt<00>fd<0F>dD<00><00><00><00>r<>t<00>fd<11>dD<00><00><00><00>r>|jd|jd|jdd|jddfS|jd|jd |jdd|jdd fSt<00>fd<15>dD<00><00><00><00>rut<00>fd<17>dD<00><00><00><00>r-|jd|jdd|jddfS|jd|jd d|jdd fS|jd|jd |jdd|jdd fS)a<>
Determine the correct category, type, and tags for an issue.
Returns:
tuple: (category, ticket_type, issue_tag, ticket_type_tag)
- category: 'Hardware', 'Software', 'Network', etc.
- ticket_type: 'Issue', 'Problem', 'Task', 'Maintenance', etc.
- issue_tag: '[hardware]', '[software]', '[network]'
- ticket_type_tag: '[issue]', '[problem]', etc.
c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>r`r<>)<10>smartr[<00>diskr<00>sectorr)r<>r(r[r\<00>ecc<63>memory<72>high_fly_writes<65>
spin_retry<EFBFBD>current_pending<6E>nvmec3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<><00>rHrmrRs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>s(<00><><00><00><00>`<60>`<60>E<EFBFBD>5<EFBFBD>K<EFBFBD>'<27>`<60>`<60>`<60>`<60>`<60>`r<>)r<>rZ<00>failurermrrzr<>r<>r{c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>rcr<>)<08>lxc<78> containerz storage usagerd<00>process<73> application<6F>service<63>daemonr<6E>r<>r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>rcr<>)<07>network<72> connectivity<74> unreachable<6C>latencyz packet loss<73> interfacez link downc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rxs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>s(<00><><00><00><00>d<>d<>E<EFBFBD>5<EFBFBD>K<EFBFBD>'<27>d<>d<>d<>d<>d<>dr<64>)ryrEr<>r<>r<>r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rPs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>rfr<>)r_<00>osdrSraz cluster usagec3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>rxs <20>rurz8SystemHealthMonitor._categorize_issue.<locals>.<genexpr><3E>s8<00><><00><00><00><0F><0F>E<EFBFBD>5<EFBFBD>K<EFBFBD>'<27><0F><0F><0F><0F><0F>r<>)rSrEr<>rmrX)rjrJ<00>TICKET_CATEGORIES<45> TICKET_TYPES<45>TICKET_TEMPLATES)r<>r<>rRs @ru<00>_categorize_issuez%SystemHealthMonitor._categorize_issue<75>s<><00><><00><1C>k<EFBFBD>k<EFBFBD>m<EFBFBD>m<EFBFBD> <0B> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> <12><13>`<60>`<60>`<60>`<60>5_<35>`<60>`<60>`<60>`<60>`<60> <12><18>*<2A>:<3A>6<><18>%<25>g<EFBFBD>.<2E><18>)<29>/<2F>:<3A>:<3A>F<><18>)<29>-<2D>8<><17>A<> <12><12><19>*<2A>:<3A>6<><18>%<25>i<EFBFBD>0<><18>)<29>/<2F>:<3A>:<3A>F<><18>)<29>-<2D>8<><19>C<> <12><12> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> <12>
<1A>[<5B>(<28>(<28><18>*<2A>:<3A>6<><18>%<25>g<EFBFBD>.<2E><18>)<29>/<2F>:<3A>:<3A>F<><18>)<29>-<2D>8<><17>A<> <12><12><19>*<2A>:<3A>6<><18>%<25>i<EFBFBD>0<><18>)<29>/<2F>:<3A>:<3A>F<><18>)<29>-<2D>8<><19>C<> <12><12> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> <12>
<13>d<>d<>d<>d<>5c<35>d<>d<>d<>d<>d<> <12><18>*<2A>:<3A>6<><18>%<25>g<EFBFBD>.<2E><18>)<29>.<2E>9<>)<29>D<><18>)<29>-<2D>8<><17>A<> <12><12><19>*<2A>:<3A>6<><18>%<25>i<EFBFBD>0<><18>)<29>.<2E>9<>)<29>D<><18>)<29>-<2D>8<><19>C<> <12><12> <0F> <0B> <0B> <0B> <0B>6
<EFBFBD> <0B> <0B> <0B> <0B> <0B> <12><13><0F><0F><0F><0F>6<0E><0F><0F><0F><0F><0F> <12><19>*<2A>:<3A>6<><18>%<25>g<EFBFBD>.<2E><1C><18>)<29>-<2D>8<><17>A<> <12><12><19>*<2A>:<3A>6<><18>%<25>i<EFBFBD>0<><1C><18>)<29>-<2D>8<><19>C<> <12><12> <11> "<22>:<3A> .<2E> <10> <1D>i<EFBFBD> (<28> <10> !<21>/<2F> 2<>:<3A> ><3E> <10> !<21>-<2D> 0<><19> ;<3B> 
<EFBFBD>
r<EFBFBD>c <00><><00>|<00>|<01><00>}|st<00>d<01><00>dStj<00><00>}|jd}|jd}|D<00>]<5D>}|<00>||<01><00>}|<00>|<06><00>\}} }
} d|v} | r|jddn|jdd} |}| r*|<0E>d d
<EFBFBD><00><00>dd
<EFBFBD><00>}|<0E>d d
<EFBFBD><00><00>d d
<EFBFBD><00>}d
}d |vrwd|vrstj
d|<06><00>}|r?|<10> d<10><00>}|<00> |<11><00>}|dr d|d<00>d<13>}nt<00> d|<06><00><02><00>|r|nd}|j<00>dd<17><00>}| rd|<14>d<18>nd|<03>d<18>}|<15>|d<00>|
<EFBFBD>|<13>|<0E>| <0A>|d<00>| <0B><00>}|<00>||<01><00>}|||d|| d<1C>}|jrJt<00>d<1D><00>t<00>t%j|d<1E><1F><00><00><00><00><01><> t)j|j|d d!|jd"<00><00>d#<23>d$<24>%<25><00>} |<19><00><00>}n:#t$j$r(}t<00>d&|<1B><00><02><00>Yd}~<1B><02>hd}~wwxYw|<1A>d'<27><00>rNt<00>d(|<16><00><02><00>t<00>d)|<1A>d*<2A><00><00><00><02><00>n{|<1A>d+<2B><00>d,kr2t<00>d-|<1A>d.<2E><00><00><00><02><00><00><03>t<00>d/|<1A>d+<2B><00><00><00><02><00><00><03>P#t2$r(}t<00>d0|<1B><00><02><00>Yd}~<1B><03>}d}~wwxYwdS)1z#Create tickets for detected issues.zNo issues detected.Nr<4E>r<>r<>r<>r<>r<>z[cluster-wide] r,<00>[ceph] rXr<>rrrr<><00>[z] z%Could not extract device from issue: r<>rTrU<00>]rwry<00>Open)r<>r<>rr<<00>categoryr<79>z1Dry-run mode enabled. Simulating ticket creation:r<>rpzapplication/jsonzBearer r:)z Content-Type<70> Authorizationr<6E>)ry<00>headersr<73>z'Invalid JSON response from ticket API: <20>successzTicket created successfully: z Ticket ID: <20> ticket_idrmzDuplicate ticketz0Duplicate ticket detected - existing ticket ID: <20>existing_ticket_idzFailed to create ticket: zError creating ticket: )<1A>_detect_issuesrbrirNrOr<>rkr<>rrr<>r<>r<>r<>rcrhrrDr<>ry<00>dumps<70>requests<74>postr<74>r{rmrl)r<>rrMr<00> action_type<70> environmentr<74>rr<><00> ticket_type<70> issue_tag<61>ticket_type_tag<61>is_cluster_wide<64>scope<70> clean_issue<75>
drive_size<EFBFBD> device_matchr3r<><00>issue_separator<6F> cluster_name<6D> ticket_source<63> ticket_titler<65><00>ticket_payload<61>response<73> response_datarts rurz.SystemHealthMonitor._create_tickets_for_issues s<><00><00><15>$<24>$<24>]<5D>3<>3<><06><15> <13> <12>K<EFBFBD>K<EFBFBD>-<2D> .<2E> .<2E> .<2E> <12>F<EFBFBD><19>%<25>'<27>'<27><08><1A>+<2B>M<EFBFBD>:<3A> <0B><1A>+<2B>M<EFBFBD>:<3A> <0B><1B>[ @<01>[ @<01>E<EFBFBD><1B>6<>6<>u<EFBFBD>m<EFBFBD>L<>L<>H<EFBFBD>AE<01>@V<>@V<>W\<5C>@]<5D>@]<5D> =<3D>H<EFBFBD>k<EFBFBD>9<EFBFBD>o<EFBFBD>/<2F>%<25>7<>O<EFBFBD>FU<46>I<02>D<EFBFBD>)<29>'<27>2<>><3E>B<>B<>[_<>[p<>qx<71>[y<>{H<02>\I<02>E<EFBFBD> <20>K<EFBFBD><1E> g<01>)<29>1<>1<>2C<32>R<EFBFBD>H<>H<>P<>P<>Qa<51>ce<63>f<>f<> <0B>%<25>-<2D>-<2D>i<EFBFBD><12><<3C><<3C>D<>D<>X<EFBFBD>r<EFBFBD>R<>R<>K<EFBFBD><1C>J<EFBFBD><16>%<25><1F><1F>G<EFBFBD>u<EFBFBD>$4<>$4<>!<21>y<EFBFBD>)=<3D>u<EFBFBD>E<>E<> <0C><1F>T<01>)<29>/<2F>/<2F><01>2<>2<>F<EFBFBD>$(<28>$;<3B>$;<3B>F<EFBFBD>$C<>$C<>M<EFBFBD>$<24>Z<EFBFBD>0<>G<01>%F<><1D>z<EFBFBD>)B<>%F<>%F<>%F<>
<EFBFBD><EFBFBD><1A>N<EFBFBD>N<EFBFBD>#R<>5<EFBFBD>#R<>#R<>S<>S<>S<>-7<>?<3F>j<EFBFBD>j<EFBFBD>C<EFBFBD>O<EFBFBD> <20>;<3B>?<3F>?<3F>><3E>;L<>M<>M<>L<EFBFBD>3B<33>W<>/<2F> <0C>/<2F>/<2F>/<2F>/<2F><0F>H<EFBFBD><0F><0F><0F>M<EFBFBD>!<21>%<25><1E>v<EFBFBD>&<26>%<25><1C>%<25>#<23>%<25><1F> %<25>
<19> %<25> <1F>|<7C>,<2C> %<25>#<23>%<25>%<25> <19><1F>=<3D>=<3D>e<EFBFBD>]<5D>S<>S<>K<EFBFBD>&<26>*<2A>$<24> <20>$<24>#<23> <0E><0E>N<EFBFBD><14>|<7C> @<01><16> <0B> <0B>O<>P<>P<>P<><16> <0B> <0B>D<EFBFBD>J<EFBFBD>~<7E>a<EFBFBD>@<40>@<40>@<40>A<>A<>A<>A<>@<01>'<27>}<7D><1C>+<2B>+<2B>,><3E>-V<>t<EFBFBD>{<7B>CS<43>7T<37>-V<>-V<>#<1A>#<1A>!#<23> <16> <16> <16>H<EFBFBD>!<21>(0<> <0A> <0A><0F><0F> <0A> <0A><><1F>/<2F>!<21>!<21>!<21><1E> <0C> <0C>%R<>q<EFBFBD>%R<>%R<>S<>S<>S<> <20><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD>!<21><><EFBFBD><EFBFBD>%<25>(<28>(<28><19>3<>3<>_<01><1E> <0B> <0B>$R<>L<EFBFBD>$R<>$R<>S<>S<>S<><1E> <0B> <0B>$R<>-<2D>2C<32>2C<32>K<EFBFBD>2P<32>2P<32>$R<>$R<>S<>S<>S<>S<>&<26>*<2A>*<2A>7<EFBFBD>3<>3<>7I<37>I<>I<><1E> <0B> <0B>%A<02>Wd<57>Wh<57>Wh<57>i}<7D>W~<7E>W~<7E>%A<02>%A<02>B<02>B<02>B<02> <20><1E> <0C> <0C>%]<5D><1D>AR<41>AR<41>SZ<53>A[<5B>A[<5B>%]<5D>%]<5D>^<5E>^<5E>^<5E><><EFBFBD> <20>@<01>@<01>@<01><1A>L<EFBFBD>L<EFBFBD>!><3E>1<EFBFBD>!><3E>!><3E>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F><><EFBFBD><EFBFBD><EFBFBD>@<01><><EFBFBD><EFBFBD>u[ @<01>[ @sI<00>.N3<02>J<02>N3<02>K<05>(K <05>N3<02> K<05>B/N3<02>0N3<02>3
O%<05>=O <05> O%c <00>" <00><0F>g}|<01>di<00><00><00>dg<00><00>D<00>]<5D>}|<03>d<03><00>dvr:t<00>d|d<00>d|<03>d<03><00><00><00><04><00><00>T|<03>d<08><00>r<>|<03>d<03><00>d vr<>g}|dD]l<>t<00>fd
<EFBFBD>d D<00><00><00><00>r<01>t<00>fd <0C>d D<00><00><00><00>rt<00>d<0E><0F><00><02><00><00>W|<04><00><0F><00><00>m|r4|<02>d|d<00>dd<11>|<04><00><00><00><04><00>|<03>d<12><00>rE|d|jddkr(|<02>d|d<00>d|d<00>d<16><05><00><00><01><>|<01>di<00><00>}|<05>d<18><00>r0|<05>d<19><00>r|<02>|d<00><00>|<01>di<00><00>}|r@|<06>dd<1C><00>|jddkr|<02>d<1E><00>|<01>di<00><00>}d D]L}|<07>|i<00><00><00>d!<21><00>r!|<02>||d!<00><00><00>M|<01>d"i<00><00>} | <09>d#<23><00>d$vr)|<02>| <09>d!g<00><00><00><00>|<01>d%i<00><00>}
|
<EFBFBD>d!<21><00>r|<02>|
d!<00><00>|<01>d&i<00><00>} | <0B>d'<27><00>r<>tj <00><00>} |j<00>d(<28><00>} | <0B>d)<29><00>rJ| r| | kr$| d)D]<1A>|<02>d*<2A><0F><00><02><00><00>nt<00>d+| <0A>d,<2C><03><00>| <0B>d!<21><00>r#| d!D]<1A>|<02>d-<2D><0F><00><02><00><00>t<00>
d.<2E><00>t<00>
d/t|dd<00><00><00>d0<64><03><00>t<00>
d1|dd#<00><00><02><00>t<00>
d2|dd#<00><00><02><00>t<00>
d3|d<00><00><02><00>t<00>
d4|d%d#<00><00><02><00>t<00>
d5|<02><00><02><00>|j<00>d6d7<64><00>stg}|D]P<>t<00>fd8<64>d9D<00><00><00><00>rt<00>d:<3A><0F><00><02><00><00>;|<0E><00><0F><00><00>Q|}t<00>
d;|<02><00><02><00>t<00>
d<<3C><00>|S)=z<>
Detect issues in the health report including non-critical issues.
:param health_report: The comprehensive health report from the checks.
:return: List of issue descriptions detected during checks.
rr'r4<00><02>ERROR<4F> NOT_SUPPORTEDz#Skipping issue detection for drive r3z with status r()r<>r<>r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>)rH<00> skip_phraser<65>s <20>rurz5SystemHealthMonitor._detect_issues.<locals>.<genexpr><3E>s8<00><><00><00><00><17><17>K<EFBFBD>;<3B>%<25>/<2F><17><17><17><17><17>r<>)zError checking SMART:<3A>!Unable to read device informationzSMART not supportedz timed outc3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>)rH<00> counter_namer<65>s <20>rurz5SystemHealthMonitor._detect_issues.<locals>.<genexpr><3E>s8<00><><00><00><00><17><17>\<5C><<3C>5<EFBFBD>0<><17><17><17><17><17>r<>rFz6Filtering manufacturer operation counter from issues: <20>Drive z has SMART issues: r*r)r;r$z temperature is high: r+r r6r7r!r9rrAz#CPU usage is above threshold of 95%r"<00>r;r=rMr$r<)r<>rr%r#r>rQrLz[cluster-wide] [ceph] z4Skipping cluster-wide Ceph issues (designated node: <20>)r<>z=== Issue Detection Started ===zChecking drives: r8zMemory status: z CPU status: zNetwork status: zSystem status: zDetected issues (pre-filter): rMFc3<00>D<00>K<00>|]}|<01><02><00><00>vV<00><00>dSrH)rj)rH<00> info_markerr<72>s <20>rurz5SystemHealthMonitor._detect_issues.<locals>.<genexpr><3E>s@<00><><00><00><00><13><13> <0B>{<7B>e<EFBFBD>k<EFBFBD>k<EFBFBD>m<EFBFBD>m<EFBFBD>3<><13><13><13><13><13>r<>rgzFiltering INFO-level issue: zFiltered to actionable issues: z"=== Issue Detection Completed ===
) rrbrrJrrrh<00>extendrNrOrirZ)r<>rrMr[<00>filtered_issuesr r!r"r<>r$r%r#r<00>designated_node<64>actionable_issuesr<73>s @rur<>z"SystemHealthMonitor._detect_issuesss<><00><><00><14><06>#<23>&<26>&<26><EFBFBD><02>;<3B>;<3B>?<3F>?<3F><08>"<22>M<>M<>% i<01>% i<01>E<EFBFBD><14>y<EFBFBD>y<EFBFBD><1E>(<28>(<28>,F<>F<>F<><16> <0C> <0C>|<7C>5<EFBFBD><18>?<3F>|<7C>|<7C>af<61>aj<61>aj<61>ky<6B>az<61>az<61>|<7C>|<7C>}<7D>}<7D>}<7D><18><15>y<EFBFBD>y<EFBFBD><1E>(<28>(<28> m<01>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>~<7E>-F<>-F<>Jm<4A>-m<>-m<>"$<24><0F>"<22>><3E>2<>2<>2<>E<EFBFBD><1A><17><17><17><17>D<16><17><17><17><17><17>!<21> !<21><1B><17><17><17><17>F<16><17><17><17><17><17>!<21>
<1F> <0C> <0C>%e<>^c<>%e<>%e<>f<>f<>f<> <20>#<23>*<2A>*<2A>5<EFBFBD>1<>1<>1<>1<>"<22>m<01><1A>M<EFBFBD>M<EFBFBD>"k<>5<EFBFBD><18>?<3F>"k<>"k<>t<EFBFBD>y<EFBFBD>y<EFBFBD>Yh<59>Oi<4F>Oi<4F>"k<>"k<>l<>l<>l<><15>y<EFBFBD>y<EFBFBD><1D>'<27>'<27> i<01>E<EFBFBD>-<2D>,@<40>4<EFBFBD>;<3B>|<7C>C\<5C>]r<>Cs<43>,s<>,s<><16> <0A> <0A>g<>u<EFBFBD>X<EFBFBD><EFBFBD>g<>g<>e<EFBFBD>Ta<54>Nb<4E>g<>g<>g<>h<>h<>h<><68>&<26>)<29>)<29>/<2F>2<EFBFBD>><3E>><3E> <0A> <18> <1C> <1C>Y<EFBFBD> '<27> '<27> 7<>M<EFBFBD>,=<3D>,=<3D>l<EFBFBD>,K<>,K<> 7<> <12>M<EFBFBD>M<EFBFBD>-<2D> <0C>5<> 6<> 6<> 6<>#<23>&<26>&<26>|<7C>R<EFBFBD>8<>8<>
<EFBFBD> <15> A<01>*<2A>.<2E>.<2E>)<<3C>a<EFBFBD>@<40>@<40>4<EFBFBD>;<3B>|<7C>C\<5C>]j<>Ck<43>k<>k<> <12>M<EFBFBD>M<EFBFBD>?<3F> @<40> @<40> @<40>'<27>*<2A>*<2A>+;<3B>R<EFBFBD>@<40>@<40><0E>=<3D> A<01> A<01>G<EFBFBD><1D>!<21>!<21>'<27>2<EFBFBD>.<2E>.<2E>2<>2<>8<EFBFBD><<3C><<3C> A<01><16> <0A> <0A>n<EFBFBD>W<EFBFBD>5<>h<EFBFBD>?<3F>@<40>@<40>@<40><>"<22>&<26>&<26>|<7C>R<EFBFBD>8<>8<>
<EFBFBD> <15>><3E>><3E>(<28> #<23> #<23>'><3E> ><3E> ><3E> <12>M<EFBFBD>M<EFBFBD>*<2A>.<2E>.<2E><18>2<EFBFBD>6<>6<> 7<> 7<> 7<>&<26>)<29>)<29>/<2F>2<EFBFBD>><3E>><3E> <0A> <18> <1C> <1C>X<EFBFBD> &<26> &<26> 3<> <12>M<EFBFBD>M<EFBFBD>-<2D><08>1<> 2<> 2<> 2<>$<24>'<27>'<27> <0A>r<EFBFBD>:<3A>:<3A> <0B> <16>?<3F>?<3F>><3E> *<2A> *<2A> 5<><1D>)<29>+<2B>+<2B>H<EFBFBD>"<22>k<EFBFBD>o<EFBFBD>o<EFBFBD>.@<40>A<>A<>O<EFBFBD><1B><EFBFBD><EFBFBD>4<>5<>5<> l<01>'<27>l<01>(<28>o<EFBFBD>*E<>*E<>!,<2C>-B<>!C<>H<01>H<01><05><1E> <0A> <0A>&F<>u<EFBFBD>&F<>&F<>G<>G<>G<>G<>H<01><1B>L<EFBFBD>L<EFBFBD>!j<>Xg<58>!j<>!j<>!j<>k<>k<>k<><1B><EFBFBD><EFBFBD>x<EFBFBD>(<28>(<28> 5<>(<28><18>2<>5<>5<>E<EFBFBD><1A>M<EFBFBD>M<EFBFBD>"3<>E<EFBFBD>"3<>"3<>4<>4<>4<>4<><0E> <0B> <0B>5<>6<>6<>6<><0E> <0B> <0B>]<5D><03>M<EFBFBD>/<2F>,J<>8<EFBFBD>,T<>(U<>(U<>]<5D>]<5D>]<5D>^<5E>^<5E>^<5E><0E> <0B> <0B>P<>m<EFBFBD>O<EFBFBD>&D<>X<EFBFBD>&N<>P<>P<>Q<>Q<>Q<><0E> <0B> <0B>J<>=<3D><1C>#><3E>x<EFBFBD>#H<>J<>J<>K<>K<>K<><0E> <0B> <0B>H<>}<7D>5E<35>'F<>H<>H<>I<>I<>I<><0E> <0B> <0B>P<>m<EFBFBD>O<EFBFBD>&D<>X<EFBFBD>&N<>P<>P<>Q<>Q<>Q<><0E> <0B> <0B>=<3D>V<EFBFBD>=<3D>=<3D>><3E>><3E>><3E><14>{<7B><EFBFBD><EFBFBD>5<>u<EFBFBD>=<3D>=<3D> D<01> "<22> <1D><1F> 0<> 0<><05><16><13><13><13><13>H<12><13><13><13><13><13><1D><1B>L<EFBFBD>L<EFBFBD>!G<><05>!G<>!G<>H<>H<>H<><1C>!<21>(<28>(<28><15>/<2F>/<2F>/<2F>/<2F>&<26>F<EFBFBD> <12>K<EFBFBD>K<EFBFBD>B<>&<26>B<>B<> C<> C<> C<><0E> <0B> <0B>9<>:<3A>:<3A>:<3A><15> r<>c<00><><00>t<00><00>} tjgd<01>tjd<02><03><00>}|j<00><00><00><00>d<04><00>D]n}|rj|<03><00><00>}t|<04><00>dkrC|d|d}}|dkr-|<05>d <09><00>s|<01> d
|<05><00><02><00><00>ot<00> d |<01><00><02><00>n4#t$r'}t<00> d |<07><00><02><00>Yd }~nd }~wwxYwdD]<5D>} dd l } | j |<08><00>}
d|vr d<10>|
D<00><00>}
|<01>|
<EFBFBD><00>t<00> d|<08>d|
<EFBFBD><00><04><00><00>]#t$r*}t<00> d|<08>d|<07><00><04><00>Yd }~<07><>d }~wwxYwt|<01><00>S)z8Get all physical disks using multiple detection methods.)<05>lsblkz-dz-nz-oz NAME,TYPET)r<>r<>r<>rorrCro<00>rbdrz Physical disks found via lsblk: zlsblk detection failed: N)z /dev/sd[a-z]z/dev/nvme[0-9]n[0-9]<5D>sdc<00>F<00>g|]}|d<00><00><00><00>|<01><02>S)rn<00><01>isdigit)rHrs rurJz6SystemHealthMonitor._get_all_disks.<locals>.<listcomp>s)<00><00>I<>I<>I<>Q<EFBFBD><11>2<EFBFBD><15><1D><1D><1F><1F>I<>q<EFBFBD>I<>I<>Ir<49>zDisks found via glob r<>zGlob detection failed for )<10>setr<74>rr<>r<>rergrZrf<00>addrbrrl<00>glob<6F>update<74>list) r<><00>disksr<73>rq<00>parts<74>name<6D> device_typertr<>r<>r<>s ru<00>_get_all_disksz"SystemHealthMonitor._get_all_disks<6B>s <00><00><13><05><05><05> 9<><1F>^<5E>8<>8<>8<>!<21><EFBFBD><19><0E><0E><0E>F<EFBFBD>
<1F> <0A>+<2B>+<2B>-<2D>-<2D>3<>3<>D<EFBFBD>9<>9<> 6<> 6<><04><17>6<> <20>J<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>E<EFBFBD><1A>5<EFBFBD>z<EFBFBD>z<EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD>,1<>!<21>H<EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD>k<EFBFBD><04>&<26>&<26>0<>0<><14><1F><1F><15>9O<39>9O<39>0<>!<21>I<EFBFBD>I<EFBFBD>n<EFBFBD>d<EFBFBD>n<EFBFBD>n<EFBFBD>5<>5<>5<><35> <12>L<EFBFBD>L<EFBFBD>C<>E<EFBFBD>C<>C<> D<> D<> D<> D<><44><18> 9<> 9<> 9<> <12>L<EFBFBD>L<EFBFBD>7<>A<EFBFBD>7<>7<> 8<> 8<> 8<> 8<> 8<> 8<> 8<> 8<><38><EFBFBD><EFBFBD><EFBFBD> 9<><39><EFBFBD><EFBFBD>@<01>
J<01>
J<01>G<EFBFBD> J<01><1B> <0B> <0B> <0B>#<23>$<24>)<29>G<EFBFBD>,<2C>,<2C><07><17>7<EFBFBD>?<3F>?<3F>I<>I<>'<27>I<>I<>I<>G<EFBFBD><15> <0C> <0C>W<EFBFBD>%<25>%<25>%<25><16> <0C> <0C>I<>W<EFBFBD>I<>I<><07>I<>I<>J<>J<>J<>J<><4A><1C> J<01> J<01> J<01><16> <0C> <0C>H<>'<27>H<>H<>Q<EFBFBD>H<>H<>I<>I<>I<>I<>I<>I<>I<>I<><49><EFBFBD><EFBFBD><EFBFBD> J<01><><EFBFBD><EFBFBD><14>E<EFBFBD>{<7B>{<7B>s1<00>CC,<00>,
D<03>6D<03>D<03>%AE?<02>?
F3<05> F.<05>.F3r.c<00>x<00>||jdvrdS|jdD]}tj||<01><00>rdS<00>dS)z9Check if a mountpoint should be excluded from monitoring.rHTrIF)rhr<><00>match)r<>r.r<>s ru<00>_is_excluded_mountz&SystemHealthMonitor._is_excluded_mountsZ<00><00> <16><14><1B>%6<>7<> 7<> 7<><17>4<EFBFBD><1C>{<7B>#6<>7<> <1C> <1C>G<EFBFBD><11>x<EFBFBD><07><1A>,<2C>,<2C> <1C><1B>t<EFBFBD>t<EFBFBD> <1C><14>ur<75><00>size_strc<00>j<00><01> t<00>t<00><00>st<00>d<01><01><00><02><00>dSt <00>fd<03>dD<00><00><00><00>st<00>d<05><01><00><02><00>dSdddd d
d<04>}t jd <0B><01><00>}|st<00>d <0C><01><00><02><00>dSt|<03>d<06><00><00><00>}t j d <0A><01>
<00><00><00><00>}|st<00>d<0E><01><00><02><00>dS|<05>d<06><00>}||<02> |d<0F><00>z}|S#tttf$rR}t<00>d<10><01><00><02><00>t<00>dt|<08><00><00><00><02><00>Yd}~dSd}~wwxYw)z<>
Parse size string with units to bytes.
:param size_str: String containing size with unit (e.g. '15.7G', '21.8T')
:return: Size in bytes as float
zNot a string: gc3<00>D<00>K<00>|]}|<01><02><00><00>vV<00><00>dSrH)<01>upper)rH<00>unitr<74>s <20>rurz2SystemHealthMonitor._parse_size.<locals>.<genexpr>0s2<00><><00><00><00>V<>V<>D<EFBFBD>t<EFBFBD>x<EFBFBD>~<7E>~<7E>/<2F>/<2F>/<2F>V<>V<>V<>V<>V<>Vr<56><00><05>B<>K<>M<>G<>TzNo valid size unit found in: rC<00><00><00>@<40>z (\d+\.?\d*)z&Could not extract numeric value from: z ([BKMGT])zCould not extract unit from: rzFailed to parse size string: zP**** error details: N)rr<>rbrrJr<>r<>rr<>r<>r<>r<00>
ValueError<EFBFBD>AttributeError<6F> TypeError) r<>r<><00> multipliersr<73>rs<00>
unit_matchr<EFBFBD><00> bytes_valuerts ` ru<00> _parse_sizezSystemHealthMonitor._parse_size#s<><00><><00>* <17><1D>h<EFBFBD><03>,<2C>,<2C> <1B><16> <0C> <0C>8<>h<EFBFBD>8<>8<>9<>9<>9<><1A>s<EFBFBD><16>V<>V<>V<>V<><U<>V<>V<>V<>V<>V<> <1B><16> <0C> <0C>G<>X<EFBFBD>G<>G<>H<>H<>H<><1A>s<EFBFBD><17><19><1C><1C><1C> <0E><0E>K<EFBFBD><17>H<EFBFBD>^<5E>X<EFBFBD>6<>6<>E<EFBFBD><18> <1B><16> <0C> <0C>P<>h<EFBFBD>P<>P<>Q<>Q<>Q<><1A>s<EFBFBD><19>%<25>+<2B>+<2B>a<EFBFBD>.<2E>.<2E>)<29>)<29>E<EFBFBD><1B><19><<3C><18><1E><1E>1A<31>1A<31>B<>B<>J<EFBFBD><1D> <1B><16> <0C> <0C>G<>X<EFBFBD>G<>G<>H<>H<>H<><1A>s<EFBFBD><1D>#<23>#<23>A<EFBFBD>&<26>&<26>D<EFBFBD> <20>+<2B>/<2F>/<2F>$<24><01>":<3A>":<3A>:<3A>K<EFBFBD><1E> <1E><><1A>N<EFBFBD>I<EFBFBD>6<> <17> <17> <17> <12>L<EFBFBD>L<EFBFBD>C<><18>C<>C<> D<> D<> D<> <12>L<EFBFBD>L<EFBFBD>9<><13>Q<EFBFBD><16><16>9<>9<> :<3A> :<3A> :<3A><16>3<EFBFBD>3<EFBFBD>3<EFBFBD>3<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD> <17><><EFBFBD>s0<00>2E <00>8E <00>1<E <00>/A(E <00>/E <00> F2<03> AF-<03>-F2c<00>><00><01>t<00>d<01><01><00><02><00>gd<02>}t<00>fd<03>|D<00><00><00><00>r t<00>d<04><01>d<05><03><00>dSgd<07>}t<00>fd<08>|D<00><00><00><00>}t<00>d<04><01>d |<04><00><04><00>|S)
z<EFBFBD>
Check if the device is a physical disk, excluding logical volumes and special devices.
:param device_path: Path to the device
:return: Boolean indicating if it's a relevant physical disk
zChecking device: )<07> /dev/mapper/<2F>/dev/dm-z /dev/loop<6F>/dev/rbdz/bootz /boot/efiz[0-9]+$c3<00>B<00>K<00>|]}tj|<01><02><00>V<00><00>dSrH)r<>r<><00>rHr<><00> device_paths <20>rurz8SystemHealthMonitor._is_physical_disk.<locals>.<genexpr>js/<00><><00><00><00>P<>P<>7<EFBFBD>r<EFBFBD>y<EFBFBD><17>+<2B>.<2E>.<2E>P<>P<>P<>P<>P<>Pr<50>r<>z excluded due to pattern matchF)z/dev/sd[a-z]+$z/dev/nvme\d+n\d+$z/dev/mmcblk\d+$z/dev/hd[a-z]+$c3<00>B<00>K<00>|]}tj|<01><02><00>V<00><00>dSrH)r<>r<>r<>s <20>rurz8SystemHealthMonitor._is_physical_disk.<locals>.<genexpr>vs/<00><><00><00><00>Z<>Z<>W<EFBFBD>"<22>(<28>7<EFBFBD>K<EFBFBD>8<>8<>Z<>Z<>Z<>Z<>Z<>Zr<5A>z physical disk check result: )rbrrJ)r<>r<><00>excluded_patterns<6E>physical_patterns<6E> is_physicals ` ru<00>_is_physical_diskz%SystemHealthMonitor._is_physical_diskVs<><00><><00> <0F> <0C> <0C>6<><1B>6<>6<>7<>7<>7<>
<EFBFBD>
<EFBFBD>
<EFBFBD><19> <0F>P<>P<>P<>P<>>O<>P<>P<>P<> P<> P<> <19> <12>L<EFBFBD>L<EFBFBD>N<>;<3B>N<>N<>N<> O<> O<> O<><18>5<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><19><1A>Z<>Z<>Z<>Z<>HY<48>Z<>Z<>Z<>Z<>Z<> <0B><0E> <0C> <0C>V<>{<7B>V<>V<><1B>V<>V<>W<>W<>W<><1A>r<>c<00><><00> <0B>ddddgd<03>}gd<04>ddgddgd d
gd d gd dgd<0F>} tjdd|gtjtjd<12><13><00>}d<01> |j<00>d<14><00>D]<5D>}d|vr1|<05>d<16><00>d<00><00><00>|d<<00>7d|vr3|<05> |<05>d<16><00>d<00><00><00>|d<<00>nd|vr:|ds2|<05> |<05>d<16><00>d<00><00><00>|d<<00><><EFBFBD> r<|<03><00><00>D]'\}}t<00> fd<1C>|D<00><00><00><00>r||d<n<01>(|dr<>|dr<>|d|jvrq|j|d<00><00><00>D]K\}} ||dvr<|d| vr2d|d<|d<00> d |d<00>d!|d<00><00><04><00><00>Lt<00> d"|<01>d#<23><03><00>t<00> d$|d<00><00><02><00>t<00> d%|d<00><00><02><00>t<00> d&|d<00><00><02><00>t<00> d'|d<00><00><02><00>t<00> d(<28><00>nB#t$r5}
|d<00> d)t|
<EFBFBD><00><00><00><02><00>Yd}
~
nd}
~
wwxYw|S)*z?Check disk firmware version against known problematic versions.NF)<05>versionr<6E><00> manufacturerrr)r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<><00>Toshiba<62>TOSHIBA)r<>r<>r<>r<>r<>r<>r<>r<>Tr<54>r<>zFirmware Version:r<>rCr<>z Model Family:r<>z Device Model:c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>)rHr<><00>
model_lines <20>rurz;SystemHealthMonitor._check_disk_firmware.<locals>.<genexpr><3E>s(<00><><00><00><00>I<>I<>W<EFBFBD>7<EFBFBD>j<EFBFBD>0<>I<>I<>I<>I<>I<>Ir<49>r<>rrz#Known problematic firmware version z for z=== Firmware Check for <20> ===zFirmware version: zModel: zManufacturer: zKnown issues: z=== End Firmware Check ===
zError checking firmware: )r<>rr<>r<>rgrer<>rJ<00>PROBLEMATIC_FIRMWARErrbrrlr<>) r<>r3rA<00>MANUFACTURER_PATTERNSr<53>rqr<>r<>r<><00>versionsrtr<>s @rurz(SystemHealthMonitor._check_disk_firmware{s<><00><><00><1C><19> <20>#<23><1E> 
<EFBFBD>
<EFBFBD> <0A> G<01>F<>F<>!<21>9<EFBFBD>-<2D>!<21>4<EFBFBD>(<28><1D>w<EFBFBD>'<27><1F><19>+<2B>!<21>9<EFBFBD>-<2D> !
<EFBFBD>!
<EFBFBD><1D>. W<01><1F>^<5E><1B>T<EFBFBD>6<EFBFBD>*<2A>!<21><EFBFBD>!<21><EFBFBD><19> <0E><0E><0E>F<EFBFBD><1E>J<EFBFBD><1E> <0A>+<2B>+<2B>D<EFBFBD>1<>1<> H<01> H<01><04>&<26>$<24>.<2E>.<2E>/3<>z<EFBFBD>z<EFBFBD>#<23><EFBFBD><EFBFBD>q<EFBFBD>/A<>/G<>/G<>/I<>/I<>M<EFBFBD>)<29>,<2C>,<2C>$<24><04>,<2C>,<2C>!%<25>J<EFBFBD>-1<>Z<EFBFBD>Z<EFBFBD><03>_<EFBFBD>_<EFBFBD>Q<EFBFBD>-?<3F>-E<>-E<>-G<>-G<>M<EFBFBD>'<27>*<2A>*<2A>$<24><04>,<2C>,<2C>]<5D>7<EFBFBD>5K<35>,<2C>!%<25>J<EFBFBD>-1<>Z<EFBFBD>Z<EFBFBD><03>_<EFBFBD>_<EFBFBD>Q<EFBFBD>-?<3F>-E<>-E<>-G<>-G<>M<EFBFBD>'<27>*<2A><><1A> <1E>.C<>.I<>.I<>.K<>.K<><1E><1E>*<2A>L<EFBFBD>(<28><1A>I<>I<>I<>I<><08>I<>I<>I<>I<>I<><1E>8D<38> <0A>n<EFBFBD>5<><1D><05><1E>
<1D>^<5E>,<2C> <1E><1D>w<EFBFBD>1G<31> <1E> <20><1E>0<>D<EFBFBD>4M<34>M<>M<>+/<2F>+D<>]<5D>Sa<53>Eb<45>+c<>+i<>+i<>+k<>+k<><1E><1E><0F><05>x<EFBFBD> <20>M<EFBFBD>'<27>$:<3A>:<3A>:<3A>}<7D>Y<EFBFBD>?W<>[c<>?c<>?c<>>B<>M<EFBFBD>*:<3A>;<3B>)<29>.<2E>9<>@<40>@<40>!@<01>m<EFBFBD>T]<5D>F^<5E>!@<01>!@<01>'4<>W<EFBFBD>'=<3D>!@<01>!@<01><1E><1E><1E><>
<13>L<EFBFBD>L<EFBFBD>?<3F>6<EFBFBD>?<3F>?<3F>?<3F> @<40> @<40> @<40> <12>L<EFBFBD>L<EFBFBD>H<>m<EFBFBD>I<EFBFBD>.F<>H<>H<> I<> I<> I<> <12>L<EFBFBD>L<EFBFBD>;<3B>=<3D><17>#9<>;<3B>;<3B> <<3C> <<3C> <<3C> <12>L<EFBFBD>L<EFBFBD>I<>-<2D><0E>*G<>I<>I<> J<> J<> J<> <12>L<EFBFBD>L<EFBFBD>I<>-<2D><0E>*G<>I<>I<> J<> J<> J<> <12>L<EFBFBD>L<EFBFBD>7<> 8<> 8<> 8<> 8<><38><18> W<01> W<01> W<01> <19>.<2E> )<29> 0<> 0<>1U<31>S<EFBFBD>QR<51>V<EFBFBD>V<EFBFBD>1U<31>1U<31> V<> V<> V<> V<> V<> V<> V<> V<><56><EFBFBD><EFBFBD><EFBFBD> W<01><><EFBFBD><EFBFBD><1D>s<00>J
J+<00>+
K*<03>5+K%<03>%K*<03> raw_valuec<00><><00> t|t<00><00>r@d|vr<|<01>d<01><00>d<00><00><00>}t |<02><00>Sd|vr(t |<01>d<03><00>d<00><00>Sd|vrt |d<05><00>St |<01><00>S#t
$r!t <00>d|<01><00><02><00>YdSwxYw)zRParse SMART values handling different formats including NVMe temperature readings.r+rzh+<2B>0x<30>zCould not parse SMART value: )rr<>rgrerkr<>rbr)r<>rr4s ru<00>_parse_smart_valuez&SystemHealthMonitor._parse_smart_value<75>s<><00><00> <15><19>)<29>S<EFBFBD>)<29>)<29> '<27>e<EFBFBD>y<EFBFBD>.@<40>.@<40>&<26>_<EFBFBD>_<EFBFBD>U<EFBFBD>3<>3<>A<EFBFBD>6<><<3C><<3C>><3E>><3E>
<EFBFBD><1A>:<3A><EFBFBD><EFBFBD>&<26><13>y<EFBFBD> <20> <20><1A>9<EFBFBD>?<3F>?<3F>4<EFBFBD>0<>0<><11>3<>4<>4<>4<><13>y<EFBFBD> <20> <20><1A>9<EFBFBD>b<EFBFBD>)<29>)<29>)<29><16>y<EFBFBD>><3E>><3E> !<21><><19> <15> <15> <15> <12>L<EFBFBD>L<EFBFBD>D<><19>D<>D<> E<> E<> E<><14>1<EFBFBD>1<EFBFBD> <15><><EFBFBD>s$<00>AB&<00>+B&<00>B&<00>B&<00>&'C<03>Cr<>r<>c<00>~<00><03>|sdS|<01><00><00><00>t<00>fd<02>dD<00><00><00><00>rdSt<00>fd<05>dD<00><00><00><00>rdSd<08>vrd St<00>fd
<EFBFBD>d D<00><00><00><00>rd St<00>fd <0A>dD<00><00><00><00>rdSd<10>vrdSt<00>fd<12>dD<00><00><00><00>rdSd<15>vrdSdS)zCEnhanced manufacturer detection based on model and serial patterns.r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<><00>rHr<><00> model_uppers <20>rurz;SystemHealthMonitor._detect_manufacturer.<locals>.<genexpr><3E>s(<00><><00><00><00>_<>_<>'<27>w<EFBFBD>+<2B>%<25>_<>_<>_<>_<>_<>_r<5F>)r<>zWD-r<>zWESTERN DIGITALr<4C>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>r s <20>rurz;SystemHealthMonitor._detect_manufacturer.<locals>.<genexpr><3E>s(<00><><00><00><00>I<>I<>G<EFBFBD><17>K<EFBFBD>'<27>I<>I<>I<>I<>I<>Ir<49>)r<><00>SEAGATEr<45>r<>r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>r s <20>rurz;SystemHealthMonitor._detect_manufacturer.<locals>.<genexpr><3E>s(<00><><00><00><00>J<>J<>G<EFBFBD><17>K<EFBFBD>'<27>J<>J<>J<>J<>J<>Jr<4A>)r<><00>SSDSCr<43>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>r s <20>rurz;SystemHealthMonitor._detect_manufacturer.<locals>.<genexpr><3E>s(<00><><00><00><00>S<>S<>G<EFBFBD><17>K<EFBFBD>'<27>S<>S<>S<>S<>S<>Sr<53>)r<>r<><00>CTr<54>r<>r<>c3<00> <00>K<00>|]}|<01>vV<00><00> dSrHr<>r s <20>rurz;SystemHealthMonitor._detect_manufacturer.<locals>.<genexpr><3E>s(<00><><00><00><00>K<>K<>G<EFBFBD><17>K<EFBFBD>'<27>K<>K<>K<>K<>K<>Kr<4B>)r<>r<>r<>r<>)r<>rJ)r<>r<>r<>r
s @ru<00>_detect_manufacturerz(SystemHealthMonitor._detect_manufacturer<65>s:<00><><00><14> <1D><1C>9<EFBFBD><1B>k<EFBFBD>k<EFBFBD>m<EFBFBD>m<EFBFBD> <0B> <0F>_<>_<>_<>_<>5^<5E>_<>_<>_<> _<> _<> <19>$<24>$<24><11>I<>I<>I<>I<>7H<37>I<>I<>I<> I<> I<> <19><1C>9<EFBFBD><17>+<2B> %<25> %<25><1C>9<EFBFBD><11>J<>J<>J<>J<>7I<37>J<>J<>J<> J<> J<> <19><1A>7<EFBFBD><11>S<>S<>S<>S<>7R<37>S<>S<>S<> S<> S<> <19><1B>8<EFBFBD><17>+<2B> %<25> %<25><1C>9<EFBFBD><11>K<>K<>K<>K<>7J<37>K<>K<>K<> K<> K<> <19><1B>8<EFBFBD><13>k<EFBFBD> !<21> !<21><18>5<EFBFBD><18>yr<79>r<>r<>c <00>n<00>t<00>d|<01>d|<02>d|<03>d<04><07><00>|s2|<00>|<01><00>}t<00>d|<02><00><02><00>|j<00><00><00>D<00>]\}}|rRd|vrN|dD]E}|<03>|<06><00>s||vr*t<00>d|<04>d|<06>d |<03>d<04><07><00>|ccS<00>F|r/||d
vr%t<00>d|<04>d |<02>d<04><05><00>|cS|d
D]~}|<07><00><00>|<01><00><00>vs*|rR|<07><00><00>|<02><00><00>vr*t<00>d|<04>d |<07>d |<01>d<04><07><00>|ccS<00><EFBFBD><01>t<00>d |<01>d|<02>d|<03>d<0E><07><00>|jdS)zSGet manufacturer-specific SMART profile based on drive model/manufacturer/firmware.zLooking for profile - Model: 'z', Manufacturer: 'z', Firmware: '<27>'zAuto-detected manufacturer: r<>zMatched manufacturer profile: z for firmware pattern 'z' in 'r<>z for detected manufacturer 'z for model alias 'z&No specific profile found for Model: 'z', using Generic profiler<65>)rbrr<00>MANUFACTURER_SMART_PROFILESr<53>rfrj)r<>r<>r<>r<><00>mfg<66>profiler<65><00>aliass ru<00>_get_manufacturer_profilez-SystemHealthMonitor._get_manufacturer_profiles[<00><00><0E> <0C> <0C>v<>e<EFBFBD>v<>v<>|<7C>v<>v<>ks<6B>v<>v<>v<>w<>w<>w<><1C> H<01><1F>4<>4<>U<EFBFBD>;<3B>;<3B>L<EFBFBD> <12>L<EFBFBD>L<EFBFBD>F<> <0C>F<>F<> G<> G<> G<>!<21><<3C>B<>B<>D<>D<> #<23> #<23>L<EFBFBD>C<EFBFBD><17><17> '<27>/<2F>7<EFBFBD>:<3A>:<3A>&<26>':<3A>;<3B>'<27>'<27>G<EFBFBD><1F>*<2A>*<2A>7<EFBFBD>3<>3<>'<27>w<EFBFBD>(<28>7J<37>7J<37><1E> <0C> <0C>%|<7C>c<EFBFBD>%|<7C>%|<7C>bi<62>%|<7C>%|<7C>qy<71>%|<7C>%|<7C>%|<7C>}<7D>}<7D>}<7D>&<26><0E><0E><0E><0E><0E>8K<01>
<1C> <1F> <0C><07> <09>0B<30> B<> B<><16> <0C> <0C>n<>c<EFBFBD>n<>n<>_k<5F>n<>n<>n<>o<>o<>o<><1E><0E><0E><0E>!<21><19>+<2B> #<23> #<23><05><18>;<3B>;<3B>=<3D>=<3D>E<EFBFBD>K<EFBFBD>K<EFBFBD>M<EFBFBD>M<EFBFBD>1<>1<>l<EFBFBD>1<>u<EFBFBD>{<7B>{<7B>}<7D>}<7D>Xd<58>Xj<58>Xj<58>Xl<58>Xl<58>Gl<47>Gl<47><1A>L<EFBFBD>L<EFBFBD>!n<>#<23>!n<>!n<>Y^<5E>!n<>!n<>fk<66>!n<>!n<>!n<>o<>o<>o<>"<22>N<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD><4E> #<23> <0F> <0C> <0C>V<02>e<EFBFBD>V<02>V<02>Wc<57>V<02>V<02>s{<7B>V<02>V<02>V<02> W<02> W<02> W<02><13>/<2F> <09>:<3A>:r<><00> attr_name<6D>manufacturer_profilec<00><><00>|sdS|<02>di<00><00><00>|i<00><00>}|<03>d<03><00>dur t<00>d|<01>d<06><03><00>dSdS)zHCheck if an attribute should be monitored based on manufacturer profile.Tr<54>r<>FzSkipping monitoring for z - explicitly disabled)rrbr)r<>rr<00> attr_configs ru<00>_should_monitor_attributez-SystemHealthMonitor._should_monitor_attribute!sv<00><00>#<23> <18><17>4<EFBFBD>*<2A>.<2E>.<2E>|<7C>R<EFBFBD>@<40>@<40>D<>D<>Y<EFBFBD>PR<50>S<>S<> <0B> <17>?<3F>?<3F>9<EFBFBD> %<25> %<25><15> .<2E> .<2E> <12>L<EFBFBD>L<EFBFBD>U<>I<EFBFBD>U<>U<>U<> V<> V<> V<><18>5<EFBFBD><13>tr<74>c <00>$<00>|rX|<02>di<00><00><00>|i<00><00>}d|vr*d|vr&|d|d|<03>dd<05><00>d<06>Siddd d
<EFBFBD><02>d d dd
<EFBFBD><02>d d dd
<EFBFBD><02>dd d d
<EFBFBD><02>dd dd
<EFBFBD><02>dddd
<EFBFBD><02>dddd
<EFBFBD><02>dddd
<EFBFBD><02>ddd d
<EFBFBD><02>dd dd
<EFBFBD><02>dd dd
<EFBFBD><02>dd d!d
<EFBFBD><02>d"dd d
<EFBFBD><02>d#d dd
<EFBFBD><02>d$d dd
<EFBFBD><02>d%d&d'd
<EFBFBD><02>d(d&d'd
<EFBFBD><02>d)d*d
<EFBFBD>d dd
<EFBFBD>ddd
<EFBFBD>d)d*d
<EFBFBD>d+d,d
<EFBFBD>d-d.d
<EFBFBD>d d)d
<EFBFBD>d/d0d
<EFBFBD>d d/d
<EFBFBD>d dd
<EFBFBD>d1<64>
<EFBFBD>}||vr||d2||d3dd<06>Sd4S)5z<Get attribute-specific thresholds, falling back to defaults.r<>r<>r<>r<>r<>)rcr<>r<>r<>r<>r<>r<>r<>rCr<>ror<>r<><00>Power_Cycle_Counti<74>i'r<>i<><69>i<>r<>r>r<>r<>rLr<>r<>r<>r<>i<><69> i@Br<>r<>r<>r<>i<><69><EFBFBD>i<00><>r<>r<>i<>i<><69>i <20>iP<69>ipr<00><>)
r<EFBFBD><00>High_Fly_Writes<65>Airflow_Temperature_Cel<65>G_Sense_Error_Rate<74>Power-Off_Retract_Count<6E>Head_Flying_Hoursr<73>r<>r<>r<>rcr<>NrF)r<>rrr<00>BASE_SMART_THRESHOLDSs ru<00>_get_attribute_thresholdsz-SystemHealthMonitor._get_attribute_thresholds/s<><00><00> <20> <12>.<2E>2<>2<><<3C><12>D<>D<>H<>H<><19>TV<54>W<>W<>K<EFBFBD>"<22>k<EFBFBD>1<>1<>6J<36>k<EFBFBD>6Y<36>6Y<36>*<2A>+><3E>?<3F> +<2B>,@<40> A<> +<2B><0F><0F>
<EFBFBD>I<EFBFBD> F<> F<><12><12><12>!
<EFBFBD> #<23><11><02>%C<>%C<>!
<EFBFBD> $<24>!<21><11>&C<>&C<>!
<EFBFBD> $<24><11><01>%B<>%B<>!
<EFBFBD> !<21>a<EFBFBD>R<EFBFBD>"@<40>"@<40> !
<EFBFBD>
<1F>A<EFBFBD>1<EFBFBD> =<3D> =<3D> !
<EFBFBD> <20>T<EFBFBD>u<EFBFBD>!E<>!E<> !
<EFBFBD> <1D>%<25>U<EFBFBD>C<>C<>!
<EFBFBD> "<22>r<EFBFBD>r<EFBFBD>#B<>#B<>!
<EFBFBD> <1E>2<EFBFBD>2<EFBFBD>><3E>><3E>!
<EFBFBD> !<21>b<EFBFBD>b<EFBFBD>"A<>"A<>!
<EFBFBD> <1F>B<EFBFBD>B<EFBFBD> ?<3F> ?<3F>!
<EFBFBD> <1F>F<EFBFBD><07> H<> H<>!
<EFBFBD> <1C><12><12><<3C><<3C>!
<EFBFBD> %<25>!<21><11>&C<>&C<>!
<EFBFBD> %<25>!<21><11>&C<>&C<>!
<EFBFBD>" "<22>x<EFBFBD>Y<EFBFBD>#O<>#O<>#!
<EFBFBD>$ <1E>8<EFBFBD><19>K<>K<>%!
<EFBFBD>&,/<2F>D<EFBFBD>A<>A<>+,<2C>!<21><<3C><<3C>35<33>2<EFBFBD>'F<>'F<>.1<EFBFBD>t<EFBFBD>"D<>"D<>39<33>v<EFBFBD>'N<>'N<>-2<><05>!F<>!F<>-/<2F>S<EFBFBD>!A<>!A<>02<30><03>$D<>$D<>24<32>"<22>&E<>&E<>,-<2D>1<EFBFBD> =<3D> =<3D>9!
<EFBFBD>!
<EFBFBD>!
<EFBFBD><1D>> <15>-<2D> -<2D> -<2D>0<><19>;<3B>I<EFBFBD>F<>1<>)<29><<3C>Z<EFBFBD>H<>%<25><0E><0E> <0E> <14>tr<74>r(c<00><00>|dkS)zADetermine if a drive is considered "new" based on power-on hours.i<>r<>)r<>r(s ru<00> _is_new_drivez!SystemHealthMonitor._is_new_driveds <00><00><1D><03>#<23>#r<>c
<00><><00>ddgdidd<04>} d|vsd|vsd|vr"d|d <|d
<00>d <0B><00>|S|<00>|<01><00>}|<03>d d <0A><00>s"d|d <|d
<00>d<0E><00>|Sd|vr|<00>|<01><00>S|<03>d<10><00>s"d|d <|d
<00>d<12><00>|S|<00>|<03>dd<13><00><00><00>}|dkr?d|d <|d
<00>d<16><00>t
<00>d|<01><00><02><00>|St
<00>d|<01>d|<03><00><04><00>|<00>|<03>dd<13><00>|<03>dd<13><00>|<03>dd<13><00><00><00>}||d<t
<00>d|<01>d|r|<05>ddg<01><00>d nd!<21><00><04><00>|<00>|<01><00>}|d"r&d#|d$<|d
<00> |d%<00><00>tj d&d'd(d)d*d)d+|gtj tj d,d-<2D>.<2E><00>}|j }d/|vr*d0|vr&d1|d <d2|d$<|d
<00>d3<64><00>nd0|vrd4|d <nd|d <d } i}
|<08>d5<64><00>D<00>]}} d6| vrG| <0B><00><00>} t| <0C><00>d7kr |<00>| d8<00><00>} | |
d6<d9D<00>]+} | <0A>d:<3A>| vrm| <0B><00><00>} t| <0C><00>d7krE|<00>| d8<00><00>}||
| <0A>d:<3A><t
<00>d;| <0A>d<|<0E><00><04><00>n<><6E>w| | vr<>| <0A>d:<3A>|
vr<>|r@|<05>dig<01><00>d dkrt
<00>d=| <0A>d><3E><03><00><00><>| <0B><00><00>} t| <0C><00>d7kr@|<00>| d8<00><00>}||
| <t
<00>d;| <0A>d?|<0E><00><04><00><00><01>-<2D><01>|
|d@<|<00>| <09><00>}t
<00>dA|<01>dB| <09>dC|<0F><00><06><00>|<08>d5<64><00>D<00>]<5D>} dD| v<00>r<>| <0B><00><00>} t| <0C><00>d7k<00>r<>|<00>| d8<00><00>}||d@dD<|<05>d@i<00><00><00>dDi<00><00>}|r4|<10>dEd <0A><00>rt
<00>dF|<0E><00><02><00><00><>|<10>dG<64><00>}|<10>dH<64><00>}|r<>|r<>|<10>dIdJ<64><00>}|dJkrb||kr%d2|d$<|d
<00>dK|<0E><00><02><00><00><01>+||kr/|d$d2krd#|d$<|d
<00>dL|<0E><00><02><00><00><01>b|dMkr`||kr%d2|d$<|d
<00>dN|<0E><00><02><00><00><01><>||kr/|d$d2krd#|d$<|d
<00>dO|<0E><00><02><00><00><01><>gdP<64>}|<08>d5<64><00>D<00>]2} |D<00>]+} | | v<00>r#| dQv<01>r|<00>| |<05><00>st
<00>d=| <0A>dR<64><03><00><00>B| <0B><00><00>} t| <0C><00>d7k<00>r<>|<00>| d8<00><00>}||d@| <|<00>| |<05><00>}|s<01><>| dSkrt||dT<||dUkr%d2|d$<|d
<00>dV|<0E>dW<64><03><00><00><>||dXkr0|d$d2krd#|d$<|d
<00>dY|<0E>dW<64><03><00><00><01>#|<15>dIdJ<64><00>}|dJkrt||dUkr(d2|d$<|d
<00>dZ| <0A>d|<0E><00><04><00><00><01>s||dXkr2|d$d2krd#|d$<|d
<00>d[| <0A>d|<0E><00><04><00><00><01><>|dMkrr||dUkr(d2|d$<|d
<00>dZ| <0A>d|<0E><00><04><00><00><01><>||dXkr2|d$d2krd#|d$<|d
<00>d[| <0A>d|<0E><00><04><00><00><02>-<2D><02>4d\}t)j||<08><00>}g}|D]q}t-|<19>d]<5D><00><00><00>}|d@<00>d6d <20><00>}||z
d^kr(|<18>|<19>d <20><00><00><00><00>r|r d#|d$<|d
<00> |<18><00>|d@r<>|<00>||d@<00><00>}|d
<00> |<1C><00>|<03>d_d`<60><00>}|dakr7|<00>||d@<00><00>}|d
<00> |<1E><00>|dTrN|<03>d_d`<60><00>}|<00>||dT|<1D><00>}|d
<00> |<1F><00>|<00>||<08><00>} |d
<00> | <20><00>t
<00>db|<01>dc<64><03><00>t
<00>dd|r|<05>ddg<01><00>d nd!<21><00><02><00>t
<00>de<64><00>|d@<00><00><00>D]$\} }!t
<00>| <0A>d|!<21><00><03><00><00>%t
<00>df|dT<00>dW<64><03><00>t
<00>dg|<0F><00><02><00>t
<00>dh|d
<00><00><02><00>t
<00>di<64><00>d|v<00>rz tj ddj|gtj tj d,d7<64>.<2E><00>}"t
<00>dk|<01>dl<64><03><00>t
<00>|"j <00><00>|dT<00> d|d@dS<|"j <00>d5<64><00>D<00>]w} | <0B>rq| <0B><00><00><00>r\dm| <0B><00><00>v<00>rE dl| vr-| <0B>dl<64><00>d]<00><00><00>n| <0B><00><00>}#t
<00>dn|#<23><00><02><00>d<13>do<64>|#D<00><00><00><00>}$t|$<24><00>dpkrit-|$ddp<64><00><00>}%t
<00>dq|%<25><00><02><00>|%|dT<|%|d@dS<t
<00>dr|dT<00><00><02><00>nI<6E><01>2#t@tBtDf$r+}&t
<00>ds| <0B>dt|&<26><00><04><00>Yd}&~&<26><01>od}&~&wwxYw<01><01>yne#tj#$r!t
<00>du|<01>dv<64><03><00>Yn6tH$r*}&t
<00>dw|<01>d|&<26><00><04><00>Yd}&~&nd}&~&wwxYwn<>#tj#$r#d|d <|d
<00>dx<64><00>Yn<>tH$r<>}&d|d <d|d$<|d
<00>dytK|&<26><00><00><00><02><00>t
<00>dz|<01>d|&<26><00><04><00>d dl&}'t
<00>|'<27>'<00><00><00><00>Yd}&~&nd}&~&wwxYw|S){zOEnhanced SMART health check with better error handling and predictive analysis.r<>rN<>r<<00>severityrMr\r<>rr<>r<>r<>r<>r<rMz%Virtual device - SMART not applicabler<65>Fz"SMART not supported on this devicervr<>r<>r<>r,r<><00>SKIPPEDz8Ridata drive - monitoring disabled (unreliable hardware)z+Skipping SMART monitoring for Ridata drive zDrive details for r<>r<>r<>rz"Selected manufacturer profile for r<>r<>r<00>Nonerr<>r-rr<>z-Az-Hz-lrm<00>
backgroundTrLr<><00>FAILED<45>PASSEDr<44>rz!SMART overall health check failedr<64>r<>r<>r<><00> )r<>r<><00>_TotalzFound z_Total: z Skipping z- for Ridata drive - using _Total version onlyz (non-Total): r<>r<>z power-on hours: z, is_new_drive: r<>r<>z7Skipping Wear_Leveling_Count evaluation for new drive: r<>r<>r<>r<>zCritical wear leveling count: zHigh wear leveling count: r<>z"Critical wear leveling remaining: zLow wear leveling remaining: )r<>r<>r<>r<>r<>r r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r"r#r$r%r&r<>r<>r<>r<>)r<>z! - disabled for this manufacturerr<72>r\r<>zCritical temperature: r+rczHigh temperature: z Critical zWarning z9Error \d+ occurred at disk power-on lifetime: (\d+) hoursrC<00><>r<>r<>r<>z=== SMART Health Check for r<>zManufacturer profile: zRaw SMART attributes:z Temperature: zIs new drive: zDetected Issues: z=== End SMART Check ===
<EFBFBD> smart-logzNVMe smart-log raw output for r<>r)zRaw temperature string: c3<00>BK<00>|]}|<01><00><00><00>|V<00><00>dSrHr<>)rH<00>cs rurz:SystemHealthMonitor._check_smart_health.<locals>.<genexpr><3E> s/<00><00><00><00>0T<30>0T<30>q<EFBFBD><01> <09> <09> <0B> <0B>0T<30><11>0T<30>0T<30>0T<30>0T<30>0T<30>0Tr<54>rozParsed temperature value: zFinal temperature recorded: z*Error parsing NVMe temperature from line 'z': zNVMe smart-log for z
timed outz"Error getting NVMe smart data for zSMART check timed outzError checking SMART: z%Exception in _check_smart_health for )(rr<>r<00>_check_nvme_smart_healthrrbrrrr<>r<>rr<>r<>rgrZrr*rr(r<><00>finditerrkr<>r<>r<>r<>r<>r<>rerjrr<><00>
IndexErrorr<EFBFBD>r<>rlr<>rr)(r<>r3<00> smart_healthr<68>r<>rrAr<>r<>r(<00>smart_attributes_rawrqr<>rmr<00> is_new_drive<76> wear_attrr<72>r<>r<><00>ALL_SMART_ATTRIBUTES<45>attr_thresholds<64>error_log_pattern<72> error_matches<65> recent_errorsr<73><00>
error_hour<EFBFBD> current_hours<72> trend_issuesr<73><00>
ssd_issues<EFBFBD>thermal_issues<65>error_pattern_issuesrs<00> nvme_result<6C>temp_str<74>digitsr4rtrs( ru<00>_check_smart_healthz'SystemHealthMonitor._check_smart_healthhs <00><00> <20> <20><18><18><1C>$(<28> 
<EFBFBD>
<EFBFBD> <0C>z 1<><19>V<EFBFBD>#<23>#<23>z<EFBFBD>V<EFBFBD>';<3B>';<3B>~<7E>QW<51>?W<>?W<>)8<> <0C>X<EFBFBD>&<26><1C>X<EFBFBD>&<26>-<2D>-<2D>.U<>V<>V<>V<>#<23>#<23>!<21>3<>3<>F<EFBFBD>;<3B>;<3B>M<EFBFBD> <20>$<24>$<24>_<EFBFBD>e<EFBFBD><<3C><<3C> $<24>)8<> <0C>X<EFBFBD>&<26><1C>X<EFBFBD>&<26>-<2D>-<2D>.R<>S<>S<>S<>#<23>#<23><16><16><1F><1F><1B>4<>4<>V<EFBFBD><<3C><<3C><<3C>!<21>$<24>$<24>W<EFBFBD>-<2D>-<2D> $<24>)0<> <0C>X<EFBFBD>&<26><1C>X<EFBFBD>&<26>-<2D>-<2D>.Q<>R<>R<>R<>#<23>#<23> <20>4<>4<>]<5D>5F<35>5F<35>w<EFBFBD>PR<50>5S<35>5S<35>T<>T<>L<EFBFBD><1B>x<EFBFBD>'<27>'<27>)2<> <0C>X<EFBFBD>&<26><1C>X<EFBFBD>&<26>-<2D>-<2D>.h<>i<>i<>i<><16> <0C> <0C>S<>6<EFBFBD>S<>S<>T<>T<>T<>#<23>#<23> <12>L<EFBFBD>L<EFBFBD>G<>f<EFBFBD>G<>G<> <0A>G<>G<> H<> H<> H<>#'<27>#A<>#A<><1D>!<21>!<21>'<27>2<EFBFBD>.<2E>.<2E><1D>!<21>!<21>.<2E>"<22>5<>5<><1D>!<21>!<21>*<2A>b<EFBFBD>1<>1<>$<0E>$<0E> <20>
4H<01>L<EFBFBD>/<2F> 0<> <12>L<EFBFBD>L<EFBFBD>b<02>f<EFBFBD>b<02>b<02>@T<02>I`<02>H\<5C>H`<60>H`<60>aj<61>mv<6D>lw<6C>Hx<48>Hx<48>yz<79>H{<7B>H{<7B>Z`<02>b<02>b<02> c<02> c<02> c<02>!<21>5<>5<>f<EFBFBD>=<3D>=<3D>M<EFBFBD><1C>-<2D>.<2E> M<01>+4<> <0C>Z<EFBFBD>(<28><1C>X<EFBFBD>&<26>-<2D>-<2D>m<EFBFBD>N<EFBFBD>.K<>L<>L<>L<> <20>^<5E><1B>T<EFBFBD>4<EFBFBD><14>w<EFBFBD><04>l<EFBFBD>F<EFBFBD>S<>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>F<EFBFBD><1C>]<5D>F<EFBFBD><18>6<EFBFBD>!<21>!<21>h<EFBFBD>f<EFBFBD>&<<3C>&<<3C>)4<> <0C>X<EFBFBD>&<26>+5<> <0C>Z<EFBFBD>(<28><1C>X<EFBFBD>&<26>-<2D>-<2D>.Q<>R<>R<>R<>R<><19>V<EFBFBD>#<23>#<23>)2<> <0C>X<EFBFBD>&<26>&<26>)2<> <0C>X<EFBFBD>&<26><1F>N<EFBFBD>$&<26> <20><1E> <0C> <0C>T<EFBFBD>*<2A>*<2A> S<01> S<01><04>#<23>t<EFBFBD>+<2B>+<2B> <20>J<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>E<EFBFBD><1A>5<EFBFBD>z<EFBFBD>z<EFBFBD>R<EFBFBD>'<27>'<27>)-<2D>)@<40>)@<40><15>q<EFBFBD><18>)J<>)J<><0E>AO<41>,<2C>-=<3D>><3E>G<01>S<01>S<01>D<EFBFBD><1E><EFBFBD><EFBFBD><EFBFBD>$<24>.<2E>.<2E> $<24>
<EFBFBD>
<EFBFBD> <0C> <0C><05><1E>u<EFBFBD>:<3A>:<3A><12>+<2B>+<2B>(,<2C>(?<3F>(?<3F><05>a<EFBFBD><08>(I<>(I<>I<EFBFBD>DM<44>0<>D<EFBFBD><1F><1F><1F>A<>"<22>L<EFBFBD>L<EFBFBD>)K<>$<24>)K<>)K<> <09>)K<>)K<>L<>L<>L<>!<21>E<EFBFBD> ,<2C> <1E><14><1C><1C>T<EFBFBD>/<2F>/<2F>/<2F>AU<41>*U<>*U<>/<2F>%<25>4H<34>4L<34>4L<34>Y<EFBFBD>Y[<5B>X\<5C>4]<5D>4]<5D>^_<>4`<60>dl<64>4l<34>4l<34>"<22>L<EFBFBD>L<EFBFBD>)h<>T<EFBFBD>)h<>)h<>)h<>i<>i<>i<>$<24> $<24>
<EFBFBD>
<EFBFBD> <0C> <0C><05><1E>u<EFBFBD>:<3A>:<3A><12>+<2B>+<2B>(,<2C>(?<3F>(?<3F><05>a<EFBFBD><08>(I<>(I<>I<EFBFBD>9B<39>0<><14>6<>"<22>L<EFBFBD>L<EFBFBD>)Q<>$<24>)Q<>)Q<>i<EFBFBD>)Q<>)Q<>R<>R<>R<><52><EFBFBD>)=<3D>L<EFBFBD><1C> &<26> <20>-<2D>-<2D>n<EFBFBD>=<3D>=<3D>L<EFBFBD> <12>L<EFBFBD>L<EFBFBD>i<>&<26>i<>i<>><3E>i<>i<>[g<>i<>i<> j<> j<> j<><1F> <0C> <0C>T<EFBFBD>*<2A>*<2A>% o<01>% o<01><04>(<28>D<EFBFBD>0<>0<> <20>J<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>E<EFBFBD><1A>5<EFBFBD>z<EFBFBD>z<EFBFBD>R<EFBFBD>'<27>'<27>$(<28>$;<3B>$;<3B>E<EFBFBD>!<21>H<EFBFBD>$E<>$E<> <09>LU<4C> <0C>\<5C>2<>3H<33>I<>%9<>$<<3C>$<<3C>\<5C>2<EFBFBD>$N<>$N<>$R<>$R<>Sh<53>jl<6A>$m<>$m<> <09>(<28>%<25>I<EFBFBD>M<EFBFBD>M<EFBFBD>:O<>QV<51>,W<>,W<>%<25>"<22>L<EFBFBD>L<EFBFBD>)n<>cl<63>)n<>)n<>o<>o<>o<>$<24>,5<>M<EFBFBD>M<EFBFBD>:M<>,N<>,N<>)<29>-6<>]<5D>]<5D>;O<>-P<>-P<>*<2A>,<2C>o<01>1C<31>o<01>'0<>}<7D>}<7D>Z<EFBFBD><19>'K<>'K<>H<EFBFBD>'<27>9<EFBFBD>4<>4<>#,<2C>0B<30>#B<>#B<>?I<>L<EFBFBD><1A>$<<3C>$0<><18>$:<3A>$A<>$A<>Bn<42>cl<63>Bn<42>Bn<42>$o<>$o<>$o<>$o<>%.<2E>2C<32>%C<>%C<>'3<>J<EFBFBD>'?<3F>:<3A>'M<>'M<>CL<43> <0C>Z<EFBFBD>(@<40>$0<><18>$:<3A>$A<>$A<>Bj<42>_h<5F>Bj<42>Bj<42>$k<>$k<>$k<><6B>!)<29>[<5B>!8<>!8<>#,<2C>0B<30>#B<>#B<>?I<>L<EFBFBD><1A>$<<3C>$0<><18>$:<3A>$A<>$A<>Br<42>gp<67>Br<42>Br<42>$s<>$s<>$s<>$s<>%.<2E>2C<32>%C<>%C<>'3<>J<EFBFBD>'?<3F>:<3A>'M<>'M<>CL<43> <0C>Z<EFBFBD>(@<40>$0<><18>$:<3A>$A<>$A<>Bm<42>bk<62>Bm<42>Bm<42>$n<>$n<>$n<><6E>
$<0E>
$<0E>
$<0E> <20><1F> <0C> <0C>T<EFBFBD>*<2A>*<2A>. f<01>. f<01><04>0<>-f<01>-f<01>D<EFBFBD><1B>t<EFBFBD>|<7C>|<7C><04>4K<34>(K<>(K<>#<23>=<3D>=<3D>d<EFBFBD>DX<44>Y<>Y<>%<25>"<22>L<EFBFBD>L<EFBFBD>)\<5C>T<EFBFBD>)\<5C>)\<5C>)\<5C>]<5D>]<5D>]<5D>$<24> $<24>
<EFBFBD>
<EFBFBD> <0C> <0C><05><1E>u<EFBFBD>:<3A>:<3A><12>+<2B>+<2B>(,<2C>(?<3F>(?<3F><05>a<EFBFBD><08>(I<>(I<>I<EFBFBD>?H<>L<EFBFBD><1C>6<>t<EFBFBD><<3C>/3<>.L<>.L<>T<EFBFBD>Sg<53>.h<>.h<>O<EFBFBD>#2<>)<29> (<28> $<24>'<<3C><<3C><<3C>7@<40> <0C>V<EFBFBD> 4<>#,<2C><0F>
<EFBFBD>0K<EFBFBD>#K<>#K<>?I<>L<EFBFBD><1A>$<<3C>$0<><18>$:<3A>$A<>$A<>Bi<42>[d<>Bi<42>Bi<42>Bi<42>$j<>$j<>$j<>$j<>%.<2E>/<2F>)<29>2L<32>%L<>%L<>'3<>J<EFBFBD>'?<3F>:<3A>'M<>'M<>CL<43> <0C>Z<EFBFBD>(@<40>$0<><18>$:<3A>$A<>$A<>Be<42>W`<60>Be<42>Be<42>Be<42>$f<>$f<>$f<><66>,;<3B>+><3E>+><3E>z<EFBFBD>9<EFBFBD>+U<>+U<><08>#+<2B>y<EFBFBD>#8<>#8<>'0<>O<EFBFBD>J<EFBFBD>4O<34>'O<>'O<>CM<43> <0C>Z<EFBFBD>(@<40>(4<>X<EFBFBD>(><3E>(E<>(E<>Fe<46>RV<52>Fe<46>Fe<46>Zc<5A>Fe<46>Fe<46>(f<>(f<>(f<>(f<>)2<>o<EFBFBD>i<EFBFBD>6P<36>)P<>)P<>+7<>
<EFBFBD>+C<>z<EFBFBD>+Q<>+Q<>GP<47>L<EFBFBD><1A>,D<>(4<>X<EFBFBD>(><3E>(E<>(E<>Fd<46>QU<51>Fd<46>Fd<46>Yb<59>Fd<46>Fd<46>(e<>(e<>(e<><65>%-<2D><1B>%<<3C>%<<3C>'0<>O<EFBFBD>J<EFBFBD>4O<34>'O<>'O<>CM<43> <0C>Z<EFBFBD>(@<40>(4<>X<EFBFBD>(><3E>(E<>(E<>Fe<46>RV<52>Fe<46>Fe<46>Zc<5A>Fe<46>Fe<46>(f<>(f<>(f<>(f<>)2<>o<EFBFBD>i<EFBFBD>6P<36>)P<>)P<>+7<>
<EFBFBD>+C<>z<EFBFBD>+Q<>+Q<>GP<47>L<EFBFBD><1A>,D<>(4<>X<EFBFBD>(><3E>(E<>(E<>Fd<46>QU<51>Fd<46>Fd<46>Yb<59>Fd<46>Fd<46>(e<>(e<>(e<><65>[-f<01>`!]<01> <1D><1E>K<EFBFBD>(9<>6<EFBFBD>B<>B<>M<EFBFBD><1E>M<EFBFBD>&<26> 9<> 9<><05> <20><15><1B><1B>Q<EFBFBD><1E><1E>0<>0<>
<EFBFBD> ,<2C>\<5C> :<3A> ><3E> ><3E>?O<>QR<51> S<> S<> <0A> <20>:<3A>-<2D><03>3<>3<>!<21>(<28>(<28><15><1B><1B>Q<EFBFBD><1E><1E>8<>8<>8<><38><1C> =<3D>+4<> <0C>Z<EFBFBD>(<28><1C>X<EFBFBD>&<26>-<2D>-<2D>m<EFBFBD><<3C><<3C><<3C><1C>L<EFBFBD>)<29> ><3E>#<23>9<>9<>&<26>,<2C>|<7C>B\<5C>]<5D>]<5D> <0C><1C>X<EFBFBD>&<26>-<2D>-<2D>l<EFBFBD>;<3B>;<3B>;<3B>+<2B>.<2E>.<2E>v<EFBFBD>u<EFBFBD>=<3D>=<3D>
<EFBFBD><1D><15>&<26>&<26>!%<25>!7<>!7<><06> <0C>\<5C>@Z<>![<5B>![<5B>J<EFBFBD> <20><18>*<2A>1<>1<>*<2A>=<3D>=<3D>=<3D><1C>F<EFBFBD>#<23> ><3E>*<2A>.<2E>.<2E>v<EFBFBD>u<EFBFBD>=<3D>=<3D>
<EFBFBD>!%<25>!;<3B>!;<3B>F<EFBFBD>L<EFBFBD>QW<51>DX<44>Zd<5A>!e<>!e<><0E><1C>X<EFBFBD>&<26>-<2D>-<2D>n<EFBFBD>=<3D>=<3D>=<3D>$(<28>#?<3F>#?<3F><06><06>#O<>#O<> <20> <18><18> "<22> )<29> )<29>*><3E> ?<3F> ?<3F> ?<3F> <12>L<EFBFBD>L<EFBFBD>C<>v<EFBFBD>C<>C<>C<> D<> D<> D<> <12>L<EFBFBD>L<EFBFBD>L<02>i}<7D>3J<02>2F<32>2J<32>2J<32>9<EFBFBD>W`<60>Va<56>2b<32>2b<32>cd<63>2e<32>2e<32>DJ<02>L<02>L<02> M<02> M<02> M<02> <12>L<EFBFBD>L<EFBFBD>0<> 1<> 1<> 1<>+<2B>L<EFBFBD>9<>?<3F>?<3F>A<>A<> 1<> 1<> <0B><04>e<EFBFBD><16> <0C> <0C><04>/<2F>/<2F><05>/<2F>/<2F>0<>0<>0<>0<> <12>L<EFBFBD>L<EFBFBD>B<><1C>f<EFBFBD>)=<3D>B<>B<>B<> C<> C<> C<> <12>L<EFBFBD>L<EFBFBD>8<>,<2C>8<>8<> 9<> 9<> 9<> <12>L<EFBFBD>L<EFBFBD>E<>\<5C>(<28>-C<>E<>E<> F<> F<> F<> <12>L<EFBFBD>L<EFBFBD>4<> 5<> 5<> 5<><16><16><1F><1F>(U<01>",<2C>.<2E><1F><1B>f<EFBFBD>5<>)<29><EFBFBD>)<29><EFBFBD>!<21> "<22> #<16>#<16>#<16>K<EFBFBD><1B>L<EFBFBD>L<EFBFBD>!K<>&<26>!K<>!K<>!K<>L<>L<>L<><1A>L<EFBFBD>L<EFBFBD><1B>!3<>4<>4<>4<>$<24>F<EFBFBD>+<2B>3<>LP<4C> <0C>\<5C>2<>3H<33>I<> +<2B> 2<> 8<> 8<><14> ><3E> ><3E>)<29>)<29><04><1F>)<29>D<EFBFBD>J<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>)<29>]<5D>d<EFBFBD>j<EFBFBD>j<EFBFBD>l<EFBFBD>l<EFBFBD>5R<35>5R<35>)<29>IL<49>PT<50><1B><1B>4<EFBFBD>:<3A>:<3A>c<EFBFBD>?<3F>?<3F>1<EFBFBD>+=<3D>+C<>+C<>+E<>+E<>+E<>Z^<5E>Zd<5A>Zd<5A>Zf<5A>Zf<5A><08> &<26> <0C> <0C>-R<><08>-R<>-R<> S<> S<> S<>*,<2C><17><17>0T<30>0T<30>H<EFBFBD>0T<30>0T<30>0T<30>)T<>)T<><06>#&<26>v<EFBFBD>;<3B>;<3B>!<21>#3<>#3<>14<31>V<EFBFBD>B<EFBFBD>Q<EFBFBD>B<EFBFBD>Z<EFBFBD><1F><1F>J<EFBFBD>$*<2A>L<EFBFBD>L<EFBFBD>1Z<31>j<EFBFBD>1Z<31>1Z<31>$[<5B>$[<5B>$[<5B><F<01>L<EFBFBD><16>$8<>Xb<58>L<EFBFBD><1C>$><3E>?T<>$U<>$*<2A>L<EFBFBD>L<EFBFBD>1f<31>P\<5C>]c<>Pd<50>1f<31>1f<31>$g<>$g<>$g<>$)<29>E<EFBFBD>$4<><34>%/<2F>
<EFBFBD>N<EFBFBD>#K<>)<29>)<29>)<29> &<26> <0C> <0C>-f<>Z^<5E>-f<>-f<>cd<63>-f<>-f<> g<> g<> g<> (<28><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22>0<>K<01>K<01>K<01><1A>L<EFBFBD>L<EFBFBD>!I<>v<EFBFBD>!I<>!I<>!I<>J<>J<>J<>J<>J<> <20>U<01>U<01>U<01><1A>L<EFBFBD>L<EFBFBD>!S<>f<EFBFBD>!S<>!S<>PQ<50>!S<>!S<>T<>T<>T<>T<>T<>T<>T<>T<><54><EFBFBD><EFBFBD><EFBFBD>U<01><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><1A>(<28> C<01> C<01> C<01>%,<2C>L<EFBFBD><18> "<22> <18><18> "<22> )<29> )<29>*A<> B<> B<> B<> B<> B<><18> 1<> 1<> 1<>%,<2C>L<EFBFBD><18> "<22>'0<>L<EFBFBD><1A> $<24> <18><18> "<22> )<29> )<29>*K<>3<EFBFBD>q<EFBFBD>6<EFBFBD>6<EFBFBD>*K<>*K<> L<> L<> L<> <12>L<EFBFBD>L<EFBFBD>N<><16>N<>N<>1<EFBFBD>N<>N<> O<> O<> O<> <1C> <1C> <1C> <1C> <12>L<EFBFBD>L<EFBFBD><19>-<2D>-<2D>/<2F>/<2F> 0<> 0<> 0<> 0<> 0<> 0<> 0<> 0<><30><EFBFBD><EFBFBD><EFBFBD>  1<><31><EFBFBD><EFBFBD><1C>s<><00>-x1<00>A x1<00>x1<00>6x1<00>A-x1<00>i2x1<00>7C w <00>C;v<02>?w <00>w<05> w<05>:w <00>w<05>w <00>
x1<00> -x-<03>8x1<00>: x-<03> x(<03>#x1<00>(x-<03>-x1<00>1/{:<03>" {:<03>+B{5<03>5{:c<00><><00>ddgdidd<04>} tjdd|gtjtjdd<08> <09><00>}|jd
k<00>r<>d |d <|j<00>d <0A><00>D<00>]}d|<04><00><00>vrNtjd|<04><00>}|r6t|<05>
d<10><00><00><00>|d<|d|dd<<00>gd|<04><00><00>vr<>tjd|<04><00>}|r<>t|<06>
d<10><00><00><00>}||dd<|dkr%d|d<|d<00> d|<07>d<1C><03><00><00><>|dkr$d|d<|d<00> d|<07>d<1C><03><00><00><01>|drn|<00> ||d<00><00>}|d<00> |<08><00>|<00>||d<00><00>} |d<00> | <09><00>|dr8|<00>||dd<1F><00>}
|d<00> |
<EFBFBD><00>n d |d <|d<00> d!<21><00>nw#tj$r#d |d <|d<00> d"<22><00>YnFt"$r:} d |d <|d<00> d#t%| <0B><00><00><00><02><00>Yd} ~ nd} ~ wwxYw|S)$z"Dedicated NVMe SMART health check.r<>rNr,rvr6TrLr<>rr<>r<r<>r)z(\d+)rCr\r<>r<><00>available_sparez(\d+)%r<>r<>rr-rMzCritical Available_Spare: r:r<>zLow Available_Spare: r<>r<>zFailed to read NVMe SMART datazNVMe SMART check timed outzError checking NVMe SMART: )r<>rr<>r<>r<>rgrjr<>r<>rkr<>rr<>r<>r<>r<>r<>rlr<>) r<>r3r<r<>rq<00>
temp_match<EFBFBD> spare_match<63> spare_pctrGrHrIrts rur9z,SystemHealthMonitor._check_nvme_smart_health<74> s\<00><00> <20> <20><18><18><1C>$(<28> 
<EFBFBD>
<EFBFBD> <0C>: R<01><1F>^<5E><17><1B>f<EFBFBD>-<2D>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>F<EFBFBD><16> <20>A<EFBFBD>%<25>%<25>)2<> <0C>X<EFBFBD>&<26>#<23>M<EFBFBD>/<2F>/<2F><04>5<>5<>d<01>d<01>D<EFBFBD>$<24><04>
<EFBFBD>
<EFBFBD> <0C> <0C>4<>4<>%'<27>Y<EFBFBD>x<EFBFBD><14>%><3E>%><3E>
<EFBFBD>%<25>e<01>36<33>z<EFBFBD>7G<37>7G<37><01>7J<37>7J<37>3K<33>3K<33>L<EFBFBD><16>0<>P\<5C>]c<>Pd<50>L<EFBFBD><1C>6<>7L<37>M<><4D>*<2A>d<EFBFBD>j<EFBFBD>j<EFBFBD>l<EFBFBD>l<EFBFBD>:<3A>:<3A>&(<28>i<EFBFBD> <09>4<EFBFBD>&@<40>&@<40> <0B>&<26>d<01>(+<2B>K<EFBFBD>,=<3D>,=<3D>a<EFBFBD>,@<40>,@<40>(A<>(A<>I<EFBFBD>LU<4C>L<EFBFBD><1C>6<>7H<37>I<>(<28>2<EFBFBD>~<7E>~<7E>;E<> <0C>Z<EFBFBD> 8<> ,<2C>X<EFBFBD> 6<> =<3D> =<3D>>g<>[d<>>g<>>g<>>g<> h<> h<> h<> h<>!*<2A>R<EFBFBD><1E><1E>;D<> <0C>Z<EFBFBD> 8<> ,<2C>X<EFBFBD> 6<> =<3D> =<3D>>b<>V_<56>>b<>>b<>>b<> c<> c<> c<><63> <20> <0C>-<2D>><3E>#'<27>#=<3D>#=<3D>f<EFBFBD>l<EFBFBD>S_<53>F`<60>#a<>#a<>L<EFBFBD> <20><18>*<2A>1<>1<>,<2C>?<3F>?<3F>?<3F>"&<26>!7<>!7<><06> <0C>\<5C>@Z<>![<5B>![<5B>J<EFBFBD> <20><18>*<2A>1<>1<>*<2A>=<3D>=<3D>=<3D> <20><06>'<27>B<01>%)<29>%?<3F>%?<3F><06> <0C>U[<5B>H\<5C>^c<>%d<>%d<>N<EFBFBD> <20><18>*<2A>1<>1<>.<2E>A<>A<>A<><41>*1<> <0C>X<EFBFBD>&<26><1C>X<EFBFBD>&<26>-<2D>-<2D>.N<>O<>O<>O<><4F><EFBFBD><19>(<28> H<01> H<01> H<01>%,<2C>L<EFBFBD><18> "<22> <18><18> "<22> )<29> )<29>*F<> G<> G<> G<> G<> G<><18> R<01> R<01> R<01>%,<2C>L<EFBFBD><18> "<22> <18><18> "<22> )<29> )<29>*P<><03>A<EFBFBD><06><06>*P<>*P<> Q<> Q<> Q<> Q<> Q<> Q<> Q<> Q<><51><EFBFBD><EFBFBD><EFBFBD> R<01><><EFBFBD><EFBFBD><1C>s<00>I
I<00>/K
<03> K
<03>0K<03>K
c
<00><><00>dgd<02>} |<00><00><00>}t<00>d|<02><00><02><00>|s!t<00>d<04><00>d|d<|St jd<07><08><00>}i}|D]W}t jd |j<00><00>}|r9|<06> d
<EFBFBD><00>}||vrg||<||<00>
|<05><00><00>Xd}|D<00>]<5D>} | gd d d <0A>}
| |v<00>r d } d } || D]<5D>} t j | j <00><00>}| |j z } | |jz } | j| j | j|<00>|j<00><00>|<00>|j <00><00>|<00>|j<00><00>|jd<0E>}|
d<00>
|<0F><00><00><>#t&$r/}t<00>d| j<00>d|<10><00><04><00>Yd}~<10><>d}~wwxYw| d kr | | z dz|
d<|<00>| <09><00>}|
<EFBFBD>|d|d|d|dd<19><04><00>|ddkrd}nE|ddkrt<00>d| <09>d<1E><03><00>n|dr|ddvr|dkrd}|d <00>
|
<EFBFBD><00><00><01><>||d<nA#t&$r4}t<00>d!t/|<10><00><00><00><02><00>Yd}~nd}~wwxYw|S)"z)Check health of all drives in the system.r)r&r'zChecking physical disks: z,No valid physical disks found for monitoringr<67>r&T)<01>allz (/dev/[a-z]+)rCr<>r)r3r-r4r2)r3r.rr1r/rr2r-z"Error getting partition usage for r<>Nr<4E>r2r<rMr\r<>)r4r(r)r<>r<>rr<>r<>z5 returned ERROR status, skipping from issue detectionr<6E>r'zError checking drives health: )r<>rbrrc<00>psutil<69>disk_partitionsr<73>r<>r3r<>r<00>
disk_usager.<00>used<65>totalr<00>_convert_bytes<65>free<65>percentrlrNr<>rmr<>)r<>r<00>physical_disksr-<00>device_partitions<6E>part<72> base_device<63>base_devr&ro<00> drive_report<72>
total_usedr1r^r`<00> part_infortr<s rurSz(SystemHealthMonitor._check_drives_health<74> s<><00><00>+3<>r<EFBFBD>B<>B<> <0A>S D<01>!<21>0<>0<>2<>2<>N<EFBFBD> <12>L<EFBFBD>L<EFBFBD>E<>^<5E>E<>E<> F<> F<> F<>!<21> %<25><16><0E><0E>M<>N<>N<>N<>2;<3B> <0A>.<2E>/<2F>$<24>$<24> <20>/<2F>D<EFBFBD>9<>9<>9<>J<EFBFBD>!#<23> <1D>"<22> =<3D> =<3D><04> <20>h<EFBFBD>'7<><14><1B>E<>E<> <0B><1E>=<3D>*<2A>0<>0<><11>3<>3<>H<EFBFBD><1F>'8<>8<>8<>68<36>)<29>(<28>3<>%<25>h<EFBFBD>/<2F>6<>6<>t<EFBFBD><<3C><<3C><<3C><>%<25>N<EFBFBD>&<26>5 =<3D>5 =<3D><04>"<22>"$<24>$-<2D>%&<26>  <12> <12> <0C><18>,<2C>,<2C>,<2C>!"<22>J<EFBFBD>"#<23>K<EFBFBD>%6<>t<EFBFBD>%<<3C>g<01>g<01> <09>g<01>$*<2A>$5<>i<EFBFBD>6J<36>$K<>$K<>E<EFBFBD>&<26>%<25>*<2A>4<>J<EFBFBD>'<27>5<EFBFBD>;<3B>6<>K<EFBFBD>*3<>*:<3A>.7<EFBFBD>.B<>*3<>*:<3A>/3<>/B<>/B<>5<EFBFBD>;<3B>/O<>/O<>.2<EFBFBD>.A<>.A<>%<25>*<2A>.M<>.M<>.2<EFBFBD>.A<>.A<>%<25>*<2A>.M<>.M<>16<31><1D>)<1E>)<1E>I<EFBFBD>)<29><1C>6<>=<3D>=<3D>i<EFBFBD>H<>H<>H<>H<><48>(<28>g<01>g<01>g<01>"<22>L<EFBFBD>L<EFBFBD>)e<>i<EFBFBD>N^<5E>)e<>)e<>bc<62>)e<>)e<>f<>f<>f<>f<>f<>f<>f<>f<><66><EFBFBD><EFBFBD><EFBFBD>g<01><><EFBFBD><EFBFBD>#<23>Q<EFBFBD><EFBFBD><EFBFBD>9C<39>k<EFBFBD>9Q<39>UX<55>8X<38> <0C>_<EFBFBD>5<> $<24>7<>7<><04>=<3D>=<3D> <0C><1C>#<23>#<23>$0<><18>$:<3A>$0<><18>$:<3A>#/<2F><06>#7<>(4<>\<5C>(B<> %<12>%<12><13><13><13> <20><08>)<29>[<5B>8<>8<>%/<2F>N<EFBFBD>N<EFBFBD>!<21>(<28>+<2B>w<EFBFBD>6<>6<><1A>L<EFBFBD>L<EFBFBD>!e<>$<24>!e<>!e<>!e<>f<>f<>f<>f<>!<21>(<28>+<2B>3<> <0C>X<EFBFBD>0F<30>Nh<4E>0h<30>0h<30>%<25><1A>3<>3<>)2<><0E><1D>h<EFBFBD>'<27>.<2E>.<2E>|<7C><<3C><<3C><<3C><<3C>.<<3C>M<EFBFBD>*<2A> +<2B> +<2B><><18> D<01> D<01> D<01> <12>L<EFBFBD>L<EFBFBD>B<>#<23>a<EFBFBD>&<26>&<26>B<>B<> C<> C<> C<> C<> C<> C<> C<> C<><43><EFBFBD><EFBFBD><EFBFBD> D<01><><EFBFBD><EFBFBD><1D>sK<00>AJ(<00>BJ(<00>.B.F<04>J(<00>
G<07>'%G<07> J(<00>G<07>CJ(<00>(
K&<03>2*K!<03>!K&r<>r<><00>suffixc<00>b<00>dD]%}t|<00><00>dkr |d<03>|<02>|<01><00>cS|dz}<00>&|d<03>d|<01><00>S)a
Convert bytes to a human-readable format.
:param bytes_value: Number of bytes to convert.
:param suffix: Suffix to append (default is 'B' for bytes).
:return: Formatted string with the size in human-readable form.
)r,r<>r<>r<>r<><00>P<>E<>Zg<00>@rA<00>Y)<01>abs)r<>rfr<>s rur[z"SystemHealthMonitor._convert_bytesX
sh<00><00><<3C> "<22> "<22>D<EFBFBD><12>;<3B><1F><1F>&<26>(<28>(<28>%<25>9<>9<>4<EFBFBD>9<><16>9<>9<>9<>9<>9<> <17>6<EFBFBD> !<21>K<EFBFBD>K<EFBFBD><1D>,<2C>,<2C>,<2C>F<EFBFBD>,<2C>,<2C>,r<>c<00><><00>dddddd<06>}t|dd<08><00><00>}|d<00><00><00>}|||zS) z(Convert size string with units to bytes.rCr<>r<>r<>r<>r<>Nrn)rr<>)r<>r<><00>units<74>sizer<65>s ru<00>_convert_size_to_bytesz*SystemHealthMonitor._convert_size_to_bytesg
sN<00><00><17>d<EFBFBD><17>w<EFBFBD>W<EFBFBD>M<>M<><05><14>X<EFBFBD>c<EFBFBD>r<EFBFBD>c<EFBFBD>]<5D>#<23>#<23><04><17><02>|<7C>!<21>!<21>#<23>#<23><04><13>e<EFBFBD>D<EFBFBD>k<EFBFBD>!<21>!r<>c<00> <00>dgd|<00>tj<00><00>j<00><00>|<00>tj<00><00>j<00><00>tj<00><00>jd<03>} t jgd<04>t jt jd<05><06><00>}d|j vrd|d<|dsud }tj <00> |<03><00>rTtj |<03><00>r@tjd
<EFBFBD><00>D]+}tj <00> |<04>d <0B><02><00>rd|d<n<01>,|d<00>rtjd
<EFBFBD><00>D]<5D>}tj <00> |<04>d <0B><02><00>r<>|<00>|<04>d <0C><02><00>}|d krCd|d<|d<00>dtj <00>|<04><00><00>d|<05><00><04><00>|<00>|<04>d<13><02><00>}|d krO|ddkrd|d<|d<00>dtj <00>|<04><00><00>d|<06><00><04><00><00><>nG#t$$r:}d|d<|d<00>dt'|<07><00><00><00><02><00>Yd}~nd}~wwxYw|S)z5Check for ECC memory errors if ECC memory is present.Fr<46>)r6r7r<<00> total_memory<72> used_memoryr5)<03> dmidecodez--typerrTr<54>z$Error Correction Type: Multi-bit ECCr6z/sys/devices/system/edac/mcz$/sys/devices/system/edac/mc/mc[0-9]*z/csrow0z/csrow0/ue_countrrr<r7z%Uncorrectable ECC errors detected in r<>z/csrow0/ce_countr<74>z#Correctable ECC errors detected in r<>zError checking ECC status: N)r[rV<00>virtual_memoryrZrYr]r<>rr<>r<>r_r`rar<>r<><00>_read_ecc_countrr rlr<>)r<>r r<><00> edac_path<74>mc_dir<69>ue_count<6E>ce_countrts rurTz'SystemHealthMonitor._check_memory_usagen
s<><00><00><1D><1C><1A> <20>/<2F>/<2F><06>0E<30>0G<30>0G<30>0M<30>N<>N<><1F>.<2E>.<2E>v<EFBFBD>/D<>/F<>/F<>/K<>L<>L<>$<24>3<>5<>5<>=<3D> 
<EFBFBD>
<EFBFBD> <0A>) W<01><1F>^<5E>1<>1<>1<>!<21><EFBFBD>!<21><EFBFBD><19> <0E><0E><0E>F<EFBFBD> 6<><16><1D>F<>F<>+/<2F> <0A>i<EFBFBD>(<28>!<21><19>+<2B> "<22>9<> <09><15>7<EFBFBD>><3E>><3E>)<29>,<2C>,<2C>"<22><12><1A>I<EFBFBD>1F<31>1F<31>"<22>"&<26>)<29>,R<>"S<>"S<>"<22>"<22><06><1D>7<EFBFBD>><3E>><3E>V<EFBFBD>*<<3C>*<<3C>*<<3C>=<3D>=<3D>"<22>7;<3B>M<EFBFBD>)<29>4<>!<21>E<EFBFBD>"<22>
<1D>Y<EFBFBD>'<27> <1E>"<22>i<EFBFBD>(N<>O<>O<><1E><1E>F<EFBFBD><19>w<EFBFBD>~<7E>~<7E><16>&8<>&8<>&8<>9<>9<><1E>#'<27>#7<>#7<>6<EFBFBD>8S<38>8S<38>8S<38>#T<>#T<><08>#<23>a<EFBFBD><<3C><<3C>6@<40>M<EFBFBD>(<28>3<>)<29>,<2C>7<>><3E>><3E> n<><02><07>HX<48>HX<48>Y_<59>H`<60>H`<60> n<> n<>dl<64> n<> n<><1E><1E><1E>$(<28>#7<>#7<>6<EFBFBD>8S<38>8S<38>8S<38>#T<>#T<><08>#<23>a<EFBFBD><<3C><<3C>,<2C>X<EFBFBD>6<>*<2A>D<>D<>:C<> <0A>h<EFBFBD> 7<>)<29>,<2C>7<>><3E>><3E> l<>b<EFBFBD>g<EFBFBD>FV<46>FV<46>W]<5D>F^<5E>F^<5E> l<> l<>bj<62> l<> l<><1E><1E><1E><><EFBFBD><EFBFBD><19> W<01> W<01> W<01>&-<2D>M<EFBFBD>(<28> #<23> <19>,<2C> '<27> .<2E> .<2E>/U<>S<EFBFBD>QR<51>V<EFBFBD>V<EFBFBD>/U<>/U<> V<> V<> V<> V<> V<> V<> V<> V<><56><EFBFBD><EFBFBD><EFBFBD> W<01><><EFBFBD><EFBFBD><1D>s<00>3G H=<00>=
J<03>0I<<03><Jrc<00>H<00> t|d<01><00>5}t|<02><00><00><00><00><00><00><00>cddd<02><00>S#1swxYwYdS#tt
t f$r+}t<00>d|<01>d|<03><00><04><00>Yd}~dSd}~wwxYw)z<>
Read ECC error count from a file.
:param filepath: Path to the ECC count file
:return: Number of ECC errors
rZNzCould not read ECC count from r<>r) rdrk<00>readrerrr<>rbr)r<>rrprts rurvz#SystemHealthMonitor._read_ecc_count<6E>
s<><00><00> <15><15>h<EFBFBD><03>$<24>$<24> -<2D><01><1A>1<EFBFBD>6<EFBFBD>6<EFBFBD>8<EFBFBD>8<EFBFBD>><3E>><3E>+<2B>+<2B>,<2C>,<2C> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D><><EFBFBD><EFBFBD> -<2D> -<2D> -<2D> -<2D> -<2D> -<2D><><17><17>*<2A>-<2D> <15> <15> <15> <12>L<EFBFBD>L<EFBFBD>I<>(<28>I<>I<>a<EFBFBD>I<>I<> J<> J<> J<><14>1<EFBFBD>1<EFBFBD>1<EFBFBD>1<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD> <15><><EFBFBD>s:<00>A<00>3A<03> A<00>A<07>A<00>A<07>A<00>B!<03>6 B<03>B!c<00>l<00>tjd<01><02><00>}|||jddkrdndd<07>}|S)zz
Check CPU usage and return health metrics.
:return: Dictionary with CPU health metrics.
rC)<01>intervalr;rAr<>r<>)r9r<)rV<00> cpu_percentrh)r<>r9r!s rurUz$SystemHealthMonitor._check_cpu_usage<67>
sM<00><00> #<23>.<2E><01>:<3A>:<3A>:<3A><19>!2<>/<2F>$<24>+<2B>l<EFBFBD>2K<32>M<EFBFBD>2Z<32>Z<>Z<>d<EFBFBD>d<EFBFBD>`i<>
<EFBFBD>
<EFBFBD>
<EFBFBD><1A>r<>c
<00><><00>gddd<03>gddd<03>d<04>} tjddt|jdd<00><00>d t|jdd
<00><00>|jdd gtjtjd d <0A><0E><00>}|jdkr,d|dd<|dd<00>d<14><00>tjddt|jdd<00><00>d t|jdd
<00><00>|jddgtjtjd d <0A><0E><00>}|jdkr,d|dd<|dd<00>d<17><00>|S#t$r9}t<00> d|<04><00><02><00>dt|<04><00>d<1A>cYd}~Sd}~wwxYw)z<>
Check the status of network interfaces and report any issues.
:return: Dictionary containing network health metrics and any issues found.
r<>N)rMr<r<>r<><00>pingz-crBrGz-WrFrDTrLr<>rrr;r<rMz!Management network is unreachablerEr=zCeph network is unreachablezNetwork health check failed: r<>)r<rm)
r<EFBFBD>rr<>rhr<>r<>rrlrbrm)r<>r"<00> mgmt_result<6C> ceph_resultrts rurVz)SystemHealthMonitor._check_network_status<75>
s!<00><00><1D><1E><1F>#<0E>#<0E> <1D><1E><1F><0E><0E> 
<EFBFBD> 
<EFBFBD><0E>0 <0E>$<24>.<2E><1A><18>#<23>d<EFBFBD>k<EFBFBD>*<2A>5<>l<EFBFBD>C<>D<>D<><18>#<23>d<EFBFBD>k<EFBFBD>*<2A>5<>n<EFBFBD>E<>F<>F<><18>K<EFBFBD>
<EFBFBD>+<2B>L<EFBFBD>9<> <12> "<22><EFBFBD>!<21><EFBFBD><19><1A> <0E> <0E> <0E>K<EFBFBD><1B>%<25><11>*<2A>*<2A>AK<41><0E>3<>4<>X<EFBFBD>><3E><1E>3<>4<>X<EFBFBD>><3E>E<>E<>7<><12><12><12>
%<25>.<2E><1A><18>#<23>d<EFBFBD>k<EFBFBD>*<2A>5<>l<EFBFBD>C<>D<>D<><18>#<23>d<EFBFBD>k<EFBFBD>*<2A>5<>n<EFBFBD>E<>F<>F<><18>K<EFBFBD>
<EFBFBD>+<2B>F<EFBFBD>3<> <12> "<22><EFBFBD>!<21><EFBFBD><19><1A> <0E> <0E> <0E>K<EFBFBD><1B>%<25><11>*<2A>*<2A>;E<><0E>~<7E>.<2E>x<EFBFBD>8<><1E>~<7E>.<2E>x<EFBFBD>8<>?<3F>?<3F>1<><12><12><12>"<22> !<21><><18> <0E> <0E> <0E> <12>L<EFBFBD>L<EFBFBD><<3C><11><<3C><<3C> =<3D> =<3D> =<3D>!<21><1C>Q<EFBFBD><16><16><0E><0E> <0E> <0E> <0E> <0E> <0E> <0E><><EFBFBD><EFBFBD><EFBFBD> <0E><><EFBFBD>s<00>E/E?<00>?
G<03> .F=<03>7G<03>=Gc <00><><00>ddl}ddddggggd<05>}|j<00>dd<07><00>st<00>d<08><00>|S|<01>d <09><00>st<00>d
<EFBFBD><00>|Sd|d <t j<00><00>} tj gd <0C>tj
tj
dd <0A><0E><00>}|j dk<00>rp tj |j<00><00>}|<05>dd<10><00>|d<|ddkrLd|d<|d<00>d|<05>di<00><00><00>dd<18><00><00><00><02><00>n<>|ddkr<>|ddkrd|d<|<05>di<00><00>}|<06><00><00>D]c\}}|<08>dd<19><00>} |<08>di<00><00><00>d|<07><00>}
|d<00>d|
<EFBFBD><00><02><00><00>dn9#tj$r'} t<00>d| <0B><00><02><00>Yd} ~ nd} ~ wwxYwtj gd<1F>tj
tj
dd <0A><0E><00>} | j dk<00>rP tj | j<00><00>} | <0A>d i<00><00>}|<0E>d!d<01><00>}|<0E>d"d<01><00>}|dkr<>||z d#z}||t'|d$<24><00>d%<25>|d&<||j<00>d'd(<28><00>kr&d|d<|d<00>d)|d*<2A>d+<2B><03><00>nP||j<00>d,d-<2D><00>kr1|ddkrd|d<|d<00>d.|d*<2A>d+<2B><03><00>n9#tj$r'} t<00>d/| <0B><00><02><00>Yd} ~ nd} ~ wwxYwtj gd0<64>tj
tj
dd <0A><0E><00>}|j dk<00>r<> tj |j<00><00>}|<13>d1g<00><00>}d}|D]K}|<16>d2<64><00>d3kr0|<16>d4<64><00>|kr|<16>d5<64><00>}n<01>L|D]<5D>}|<16>d2<64><00>d6kr<>|<16>d5<64><00>|<16>d4<64><00>|<16>dd7<64><00>|<16>d8d9<64><00>d:<3A>}|d;<00>|<17><00>|<16>d<0F><00>d<kr7d|d<|d<00>d=|<16>d4<64><00><00>d><3E><03><00><00><>n9#tj$r'} t<00>d?| <0B><00><02><00>Yd} ~ nd} ~ wwxYwtj gd@<40>tj
tj
dd <0A><0E><00>}|j dkr<> tj |j<00><00>}|<19>dAg<00><00>|<19>dBg<00><00>dC<64>|dD<n9#tj$r'} t<00>dE| <0B><00><02><00>Yd} ~ nd} ~ wwxYwt<00>dF<64><00>t<00>dG|d <00><00><02><00>t<00>dH|d<00><00><02><00>t<00>dI|d&<00><00><02><00>t<00>dJ|d<00><00><02><00>t<00>dK|dL<00><00><02><00>t<00>dM|d<00><00><02><00>t<00>dN<64><00>n<>#tj$r#dO|d<|dL<00>dP<64><00>Ynct*$rW} dO|d<|dL<00>dQt-| <0B><00><00><00><02><00>t<00>dR| <0B><00><02><00>Yd} ~ nd} ~ wwxYw|S)Sz<53>
Check Ceph cluster health if this node is part of a Ceph cluster.
Returns health status, cluster info, and any issues detected.
Cluster-wide issues use [cluster-wide] tag for cross-node deduplication.
rNr<4E>F)r<r>r?r@rB<00>
mon_statusrMrLrPTz"Ceph monitoring disabled in configr_z$Ceph CLI not found - not a Ceph noder>)r_<00>health<74> --format=jsonrLr<>r<r<>r?<00>
HEALTH_ERRrrLzCeph cluster HEALTH_ERR: <20>summary<72>messagez Unknown error<6F> HEALTH_WARNr<4E><00>checksr-zCeph HEALTH_WARN: z"Failed to parse ceph health JSON: )r_<00>dfr<66><00>stats<74> total_bytes<65>total_used_raw_bytesr<73>ro)r<><00>
used_bytesr2r@r4rSzCeph cluster usage critical: rAr:r5rRzCeph cluster usage warning: zFailed to parse ceph df JSON: )r_r<><00>treer<65><00>nodesr<73><00>hostr<74><00>idr<64>r<><00>reweightg<00>?)r<>r<>r<r<>rBrEz Ceph OSD z is DOWNz$Failed to parse ceph osd tree JSON: )r_<00>monrr<><00>quorum<75> quorum_names)r<>r<>r<>z$Failed to parse ceph mon stat JSON: z=== Ceph Health Check ===zIs Ceph node: zCluster health: zCluster usage: <20>Status: zIssues: rMzCluster-wide issues: z=== End Ceph Health Check ===r<>zCeph health check timed outzError checking Ceph health: zCeph health check failed: )<18>shutilrhrrbr<00>whichrNrOr<>rr<>r<>ry<00>loadsr<73>rr<>r{rc<00>roundr<64>rlr<>rm)r<>r<>r#r<00> health_result<6C> health_datar<61><00>
check_name<EFBFBD>
check_datar-r<>rt<00> df_result<6C>df_datar<61>r<>rdr2<00>
osd_result<EFBFBD>osd_datar<61><00>host_id<69>node<64>osd_info<66>
mon_result<EFBFBD>mon_datas rurWz&SystemHealthMonitor._check_ceph_health s# <00><00> <16> <0A> <0A> <0A><1B>!<21>"<22>!<21><1C><1C><18>#%<25> 
<EFBFBD> 
<EFBFBD> <0B><14>{<7B><EFBFBD><EFBFBD>~<7E>t<EFBFBD>4<>4<> <1F> <12>L<EFBFBD>L<EFBFBD>=<3D> ><3E> ><3E> ><3E><1E> <1E><16>|<7C>|<7C>F<EFBFBD>#<23>#<23> <1F> <12>L<EFBFBD>L<EFBFBD>?<3F> @<40> @<40> @<40><1E> <1E>&*<2A> <0B>N<EFBFBD>#<23><19>%<25>'<27>'<27><08>\ ;<3B>&<26>N<EFBFBD>3<>3<>3<>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>M<EFBFBD><1D>'<27>1<EFBFBD>,<2C>,<2C>M<01>"&<26>*<2A>]<5D>-A<>"B<>"B<>K<EFBFBD>4?<3F>O<EFBFBD>O<EFBFBD>H<EFBFBD>i<EFBFBD>4X<34>4X<34>K<EFBFBD> 0<>1<>#<23>#3<>4<> <0C>D<>D<>0:<3A> <0B>H<EFBFBD>-<2D>#<23>$9<>:<3A>A<>A<>x<> <0B><0F><0F> <09>SU<53>8V<38>8V<38>8Z<38>8Z<38>[d<>fu<66>8v<38>8v<38>x<>x<><1A><1A><1A><1A>%<25>%5<>6<>-<2D>G<>G<>&<26>x<EFBFBD>0<>J<EFBFBD>><3E>><3E>4=<3D>K<EFBFBD><08>1<>!,<2C><1F><1F><18>2<EFBFBD>!><3E>!><3E><06>6<<3C>l<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD><1E><1E>2<>J<EFBFBD>
<EFBFBD>'1<>~<7E>~<7E>j<EFBFBD>-<2D>'P<>'P<>H<EFBFBD>&0<>n<EFBFBD>n<EFBFBD>Y<EFBFBD><02>&C<>&C<>&G<>&G<> <09>S]<5D>&^<5E>&^<5E>G<EFBFBD>'<27>(=<3D>><3E>E<>E<> ><3E>W<EFBFBD> ><3E> ><3E><1E><1E><1E><1E><><EFBFBD><1C>+<2B>M<01>M<01>M<01><1A>N<EFBFBD>N<EFBFBD>#K<><01>#K<>#K<>L<>L<>L<>L<>L<>L<>L<>L<><4C><EFBFBD><EFBFBD><EFBFBD>M<01><><EFBFBD><EFBFBD>#<23><0E>/<2F>/<2F>/<2F>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>I<EFBFBD><19>#<23>q<EFBFBD>(<28>(<28>I<01>"<22>j<EFBFBD><19>)9<>:<3A>:<3A>G<EFBFBD>#<23>K<EFBFBD>K<EFBFBD><07><12>4<>4<>E<EFBFBD>"'<27>)<29>)<29>M<EFBFBD>1<EFBFBD>"=<3D>"=<3D>K<EFBFBD>!&<26><19><19>+A<>1<EFBFBD>!E<>!E<>J<EFBFBD>"<22>Q<EFBFBD><EFBFBD><EFBFBD>)3<>k<EFBFBD>)A<>S<EFBFBD>(H<> <0A>+6<>*4<>-2<>=<3D>!<21>-D<>-D<>8<1A>8<1A> <0B>O<EFBFBD>4<>)<29>D<EFBFBD>K<EFBFBD>O<EFBFBD>O<EFBFBD><Q<>SU<53>,V<>,V<>V<>V<>4><3E>K<EFBFBD><08>1<>'<27>(=<3D>><3E>E<>E<> T<> <0A> T<> T<> T<> T<><1E><1E><1E><1E>+<2B>d<EFBFBD>k<EFBFBD>o<EFBFBD>o<EFBFBD>>R<>TV<54>.W<>.W<>W<>W<>*<2A>8<EFBFBD>4<>
<EFBFBD>B<>B<>8A<38> <0B>H<EFBFBD> 5<>'<27>(=<3D>><3E>E<>E<> S<>}<7D> S<> S<> S<> S<><1E><1E><1E><><EFBFBD><1C>+<2B>I<01>I<01>I<01><1A>N<EFBFBD>N<EFBFBD>#G<>A<EFBFBD>#G<>#G<>H<>H<>H<>H<>H<>H<>H<>H<><48><EFBFBD><EFBFBD><EFBFBD>I<01><><EFBFBD><EFBFBD>$<24><1E>8<>8<>8<>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>J<EFBFBD><1A>$<24><01>)<29>)<29>#O<01>#<23>z<EFBFBD>*<2A>*;<3B><<3C><<3C>H<EFBFBD>$<24>L<EFBFBD>L<EFBFBD><17>"<22>5<>5<>E<EFBFBD>#<23>G<EFBFBD> %<25>"<22>"<22><04><1F>8<EFBFBD>8<EFBFBD>F<EFBFBD>+<2B>+<2B>v<EFBFBD>5<>5<>$<24>(<28>(<28>6<EFBFBD>:J<>:J<>h<EFBFBD>:V<>:V<>&*<2A>h<EFBFBD>h<EFBFBD>t<EFBFBD>n<EFBFBD>n<EFBFBD>G<EFBFBD>!<21>E<EFBFBD><45>!&<26>"<22>"<22><04><1F>8<EFBFBD>8<EFBFBD>F<EFBFBD>+<2B>+<2B>u<EFBFBD>4<>4<>&*<2A>h<EFBFBD>h<EFBFBD>t<EFBFBD>n<EFBFBD>n<EFBFBD>(,<2C><08><08><16>(8<>(8<>*.<2E>(<28>(<28>8<EFBFBD>Y<EFBFBD>*G<>*G<>,0<>H<EFBFBD>H<EFBFBD>Z<EFBFBD><13>,E<>,E<> (<1E>(<1E>H<EFBFBD>(<28> <0C>5<><<3C><<3C>X<EFBFBD>F<>F<>F<> $<24>x<EFBFBD>x<EFBFBD><08>1<>1<>V<EFBFBD>;<3B>;<3B>8B<38> <0B>H<EFBFBD> 5<>!,<2C>,A<> B<> I<> I<>$J<><04><08><08><16>0@<40>0@<40>$J<>$J<>$J<>!"<22>!"<22>!"<22><>'"<22><>,<1C>+<2B>O<01>O<01>O<01><1A>N<EFBFBD>N<EFBFBD>#M<>!<21>#M<>#M<>N<>N<>N<>N<>N<>N<>N<>N<><4E><EFBFBD><EFBFBD><EFBFBD>O<01><><EFBFBD><EFBFBD>$<24><1E>8<>8<>8<>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>J<EFBFBD><1A>$<24><01>)<29>)<29>O<01>#<23>z<EFBFBD>*<2A>*;<3B><<3C><<3C>H<EFBFBD>"*<2A>,<2C>,<2C>x<EFBFBD><12>"<<3C>"<<3C>(0<> <0C> <0C>^<5E>R<EFBFBD>(H<>(H<>1<16>1<16>K<EFBFBD> <0C>-<2D>-<2D><><1C>+<2B>O<01>O<01>O<01><1A>N<EFBFBD>N<EFBFBD>#M<>!<21>#M<>#M<>N<>N<>N<>N<>N<>N<>N<>N<><4E><EFBFBD><EFBFBD><EFBFBD>O<01><><EFBFBD><EFBFBD> <13>L<EFBFBD>L<EFBFBD>5<> 6<> 6<> 6<> <12>L<EFBFBD>L<EFBFBD>G<>+<2B>n<EFBFBD>*E<>G<>G<> H<> H<> H<> <12>L<EFBFBD>L<EFBFBD>K<>K<EFBFBD>8H<38>,I<>K<>K<> L<> L<> L<> <12>L<EFBFBD>L<EFBFBD>I<>;<3B><EFBFBD>+G<>I<>I<> J<> J<> J<> <12>L<EFBFBD>L<EFBFBD>;<3B>K<EFBFBD><08>$9<>;<3B>;<3B> <<3C> <<3C> <<3C> <12>L<EFBFBD>L<EFBFBD>;<3B>K<EFBFBD><08>$9<>;<3B>;<3B> <<3C> <<3C> <<3C> <12>L<EFBFBD>L<EFBFBD>U<><1B>=R<>1S<31>U<>U<> V<> V<> V<> <12>L<EFBFBD>L<EFBFBD>8<> 9<> 9<> 9<> 9<><39><19>(<28> H<01> H<01> H<01>$+<2B>K<EFBFBD><08> !<21> <17><08> !<21> (<28> (<28>)F<> G<> G<> G<> G<> G<><18> ;<3B> ;<3B> ;<3B>$+<2B>K<EFBFBD><08> !<21> <17><08> !<21> (<28> (<28>)P<><03>A<EFBFBD><06><06>)P<>)P<> Q<> Q<> Q<> <12>L<EFBFBD>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD>
<1B>s<><00>;]<00> D5H<00>]<00>H9<03>H4<03>/]<00>4H9<03>9>]<00>8DN<00> ]<00>O<03>N?<03>:]<00>?O<03>>]<00>EU!<00> ]<00>!V<03>0V<03> ]<00>V<03>=]<00>A X<00>]<00>Y<03>.Y<03> ]<00>Y<03>D ]<00>/_0<03> _0<03>A _+<03>+_0c
<00><><00>|<01>dtj<00><00><00><00>}g}dtfd<03>}|<03>d<04><00>|<03>d<05><00>|<03>d||<02><07><00><00>d<08><03><00>|<03>d <09><00>|<03>d
<EFBFBD><00>|<03>d <0B><00>|<03>d <0C><00>|<03>d <0A><00>|<03>d<0E><00>|<03>d<0F><00>|<03>d<10><00>|<01>di<00><00><00>dg<00><00>D<00>]"}|<05>dd<14><00>}|||<06><15><00>}|<05>dd<17><00>}|dkrdnd} |<03>d|<07>d| <09><00><04><00>|<05>d<1D><00>r!|<03>d|<07>d|d<00><00><04><00>|<05>d<1F><00>r8|<00>|d<00><00>}
|
r|<03>d |<07>d|
<EFBFBD><00><04><00>t |<05>d!g<00><00><00><00>} |<03>d"|<07>d| <0B><00><04><00><00><01>$|<01>d#i<00><00>} |<03>d$<24><00>|<03>d%<25><00>| <0C>d&<26><00><00>+|<03>d(||<02><07><00><00>d| d&<00><00><04><00>|<01>d)i<00><00>} |<03>d*<2A><00>|<03>d+<2B><00>| <0A>d,<2C><00><00>+|<03>d-||<02><07><00><00>d| d,<00><00><04><00>|<03>d.<2E><00>|<03>d/<2F><00>| <0A>d0<64><00>rdnd}|<03>d1||<02><07><00><00>d|<0E><00><04><00>| <0A>d0<64><00>rr|<03>d2<64><00>|<03>d3<64><00>t | <0A>d4g<00><00><00><00>}|<03>d5||<02><07><00><00>d|<0F><00><04><00>|<01>d6i<00><00>}|<03>d7<64><00>|<03>d8<64><00>d9D]q}|<10>|i<00><00>}|<12>d:<3A><00>d;krdnd}|<11>d<d=<3D><00>}|<03>d>|||<14>?<3F><00><00>d|<13><00><04><00><00>r|<01>d@i<00><00>}|<15>dA<64><00><00>r<>|<03>dB<64><00>|<03>dC<64><00>|<15>dD<64><00>dEkrdnd}|<03>dF||<02><07><00><00>d|<16><00><04><00>|<15>dG<64><00><00>r1|dG}|<03>dH<64><00>|<03>dI<64><00>|<03>dJ||<02><07><00><00>d|<17>dKd<1A><00><00><00><04><00>|<03>dL<64><00>|<03>dM<64><00>|<03>dN||<02><07><00><00>d|<17>dOd<1A><00><00><00><04><00>|<03>dP<64><00>|<03>dQ<64><00>|<03>dR||<02><07><00><00>d|<17>dSd<1A><00><00><00><04><00>|<03>dT<64><00>|<03>dU<64><00>t |<15>dVg<00><00><00><00>}|<03>dW||<02><07><00><00>d|<18><00><04><00>|<03>dX<64><00>|<03>dY<64><00>t dZ<64>|<15>dVg<00><00>D<00><00><00><00>}|<03>d[||<02><07><00><00>d|<19><00><04><00>|<01>d\i<00><00>}|<1A>d]<5D><00>r<>|<03>d^<5E><00>|<03>d_<64><00>|d]D]<5D>}|<1B>d`d<14><00>}|<1B>dag<00><00>D]U}|<1D>dbdc<64><00>}|<1D>dKd<1A><00>}|<03>dd||||<1E>e<EFBFBD><00><00>d|<17><00><04><00><00>V<EFBFBD><56>|<03>df<64><00>|<03>dg<64><00>t |<01>dhi<00><00><00>dig<00><00><00><00>}t |<15>dig<00><00><00><00>t |<15>djg<00><00><00><00>z} t |<1A>dig<00><00><00><00>}!|| z|!z}"|<03>dk||<02><07><00><00>d|"<22><00><04><00>dl<64>|<03><00>dlzS)ma2
Export health report as Prometheus metrics in text format.
Metrics follow Prometheus naming conventions:
- hwmon_* prefix for all metrics
- Labels for dimensions (device, hostname, container, etc.)
Returns:
str: Prometheus text format metrics
rrc<00>|<00>d<01>|<00><00><00>D<00><00>}|rdd<03>|<01><00>zdzndS)Nc<00>(<00>g|]\}}|<02>|<01>d|<02>d<02><04><02>S)Nz="<22>"r<>)rH<00>k<>vs rurJzQSystemHealthMonitor.export_prometheus_metrics.<locals>.labels.<locals>.<listcomp><3E> s)<00><00>N<>N<>N<>d<EFBFBD>a<EFBFBD><11><01> <0A><01>\<5C>\<5C>Q<EFBFBD>\<5C>\<5C>\<5C> <0A> <0A> r<><00>{<7B>,<2C>}r,)r<>r)<02>kwargs<67>pairss ru<00>labelsz=SystemHealthMonitor.export_prometheus_metrics.<locals>.labels<6C> sA<00><00>N<>N<>f<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD>N<>N<>N<>E<EFBFBD>27<32>?<3F>3<EFBFBD><13><18><18>%<25><1F><1F>(<28>3<EFBFBD>.<2E>.<2E>R<EFBFBD> ?r<>z$# HELP hwmon_info System informationz# TYPE hwmon_info gauge<67>
hwmon_info)rz 1zM# HELP hwmon_drive_smart_healthy SMART health status (1=healthy, 0=unhealthy)z&# TYPE hwmon_drive_smart_healthy gaugezC# HELP hwmon_drive_temperature_celsius Drive temperature in Celsiusz,# TYPE hwmon_drive_temperature_celsius gaugez7# HELP hwmon_drive_size_bytes Drive total size in bytesz## TYPE hwmon_drive_size_bytes gaugezE# HELP hwmon_drive_smart_issues_total Number of SMART issues detectedz+# TYPE hwmon_drive_smart_issues_total gaugerr'r3r<>)rr3r4r<>r<>rCr<00>hwmon_drive_smart_healthyr<79>r)<00>hwmon_drive_temperature_celsiusr<73><00>hwmon_drive_size_bytesr(<00>hwmon_drive_smart_issues_totalr!z3# HELP hwmon_cpu_usage_percent CPU usage percentagez$# TYPE hwmon_cpu_usage_percent gauger9N<>hwmon_cpu_usage_percentr z9# HELP hwmon_memory_usage_percent Memory usage percentagez'# TYPE hwmon_memory_usage_percent gauger5<00>hwmon_memory_usage_percentzG# HELP hwmon_memory_has_ecc Whether ECC memory is present (1=yes, 0=no)z!# TYPE hwmon_memory_has_ecc gauger6<00>hwmon_memory_has_eccz># HELP hwmon_memory_ecc_errors_total Total ECC errors detectedz*# TYPE hwmon_memory_ecc_errors_total gauger7<00>hwmon_memory_ecc_errors_totalr"z:# HELP hwmon_network_status Network status (1=OK, 0=issue)z!# TYPE hwmon_network_status gauger<65>r<r<><00>_networkr,<00>hwmon_network_status)rr<>r#r>zR# HELP hwmon_ceph_cluster_healthy Ceph cluster health (1=healthy, 0=warning/error)z'# TYPE hwmon_ceph_cluster_healthy gauger?<00> HEALTH_OK<4F>hwmon_ceph_cluster_healthyr@zE# HELP hwmon_ceph_cluster_usage_percent Ceph cluster usage percentagez-# TYPE hwmon_ceph_cluster_usage_percent gauge<67> hwmon_ceph_cluster_usage_percentr2z># HELP hwmon_ceph_cluster_bytes_total Ceph cluster total bytesz+# TYPE hwmon_ceph_cluster_bytes_total gauge<67>hwmon_ceph_cluster_bytes_totalr<6C>z<# HELP hwmon_ceph_cluster_bytes_used Ceph cluster used bytesz*# TYPE hwmon_ceph_cluster_bytes_used gauge<67>hwmon_ceph_cluster_bytes_usedr<64>z0# HELP hwmon_ceph_osd_total Total number of OSDsz!# TYPE hwmon_ceph_osd_total gaugerB<00>hwmon_ceph_osd_totalz.# HELP hwmon_ceph_osd_down Number of down OSDsz # TYPE hwmon_ceph_osd_down gaugec<00>D<00>g|]}|<01>d<00><00>dk<00>|<01><02>SrDrFrGs rurJzASystemHealthMonitor.export_prometheus_metrics.<locals>.<listcomp>G rKr<><00>hwmon_ceph_osd_downr$<00>
containerszM# HELP hwmon_lxc_storage_usage_percent LXC container storage usage percentagez,# TYPE hwmon_lxc_storage_usage_percent gauge<67>vmid<69> filesystemsr.r0<00>hwmon_lxc_storage_usage_percent)rr<>r.z9# HELP hwmon_issues_total Total number of issues detectedz# TYPE hwmon_issues_total gauger%rMrL<00>hwmon_issues_totalr<6C>) rrNrOr<>r<00>_parse_size_to_bytesrZrrr)#r<>rr<00>metricsr<73>r[r3<00> drive_labelsr4<00>healthy<68>capacity_bytes<65> issues_count<6E>cpu<70>memr6r7rL<00>net_type<70>net_infor<<00>net_namer_<00> ceph_healthyr`<00> osd_countrar{r|r<><00>fsr.<00> system_issues<65> ceph_issues<65>
lxc_issues<EFBFBD> total_issuess# ru<00>export_prometheus_metricsz-SystemHealthMonitor.export_prometheus_metrics<63> s<>
<00><00>!<21>$<24>$<24>Z<EFBFBD><16>1C<31>1E<31>1E<31>F<>F<><08><14><07> @<01><03> @<01> @<01> @<01> @<01>
<10><0E><0E>><3E>?<3F>?<3F>?<3F><0F><0E><0E>1<>2<>2<>2<><0F><0E><0E>A<>F<EFBFBD>F<EFBFBD>H<EFBFBD>$=<3D>$=<3D>$=<3D>A<>A<>A<>B<>B<>B<> <10><0E><0E>g<>h<>h<>h<><0F><0E><0E>@<40>A<>A<>A<><0F><0E><0E>]<5D>^<5E>^<5E>^<5E><0F><0E><0E>F<>G<>G<>G<><0F><0E><0E>Q<>R<>R<>R<><0F><0E><0E>=<3D>><3E>><3E>><3E><0F><0E><0E>_<>`<60>`<60>`<60><0F><0E><0E>E<>F<>F<>F<>"<22>&<26>&<26><EFBFBD><02>;<3B>;<3B>?<3F>?<3F><08>"<22>M<>M<> [<01> [<01>E<EFBFBD><1A>Y<EFBFBD>Y<EFBFBD>x<EFBFBD><19>3<>3<>F<EFBFBD>!<21>6<EFBFBD>8<EFBFBD>F<EFBFBD>C<>C<>C<>L<EFBFBD>!<21>9<EFBFBD>9<EFBFBD>^<5E>Y<EFBFBD>?<3F>?<3F>L<EFBFBD>'<27>9<EFBFBD>4<>4<>a<EFBFBD>a<EFBFBD>!<21>G<EFBFBD> <13>N<EFBFBD>N<EFBFBD>O<>|<7C>O<>O<>g<EFBFBD>O<>O<> P<> P<> P<><15>y<EFBFBD>y<EFBFBD><1D>'<27>'<27> h<01><17><0E><0E>f<><1C>f<>f<>PU<50>Vc<56>Pd<50>f<>f<>g<>g<>g<><15>y<EFBFBD>y<EFBFBD><1A>$<24>$<24> ]<01>!%<25>!:<3A>!:<3A>5<EFBFBD><1A>;L<>!M<>!M<><0E>!<21>]<01><1B>N<EFBFBD>N<EFBFBD>#[<5B>L<EFBFBD>#[<5B>#[<5B>><3E>#[<5B>#[<5B>\<5C>\<5C>\<5C><1F>u<EFBFBD>y<EFBFBD>y<EFBFBD><1E><12><<3C><<3C>=<3D>=<3D>L<EFBFBD> <13>N<EFBFBD>N<EFBFBD>Y<>L<EFBFBD>Y<>Y<><<3C>Y<>Y<> Z<> Z<> Z<> Z<><1C><1F><1F> <0C>b<EFBFBD>1<>1<><03><0F><0E><0E>M<>N<>N<>N<><0F><0E><0E>><3E>?<3F>?<3F>?<3F> <0E>7<EFBFBD>7<EFBFBD>&<26> '<27> '<27> 3<> <13>N<EFBFBD>N<EFBFBD>k<>V<EFBFBD>V<EFBFBD>X<EFBFBD>5N<35>5N<35>5N<35>k<>k<>QT<51>Uh<55>Qi<51>k<>k<> l<> l<> l<><1C><1F><1F><0F><12>4<>4<><03><0F><0E><0E>S<>T<>T<>T<><0F><0E><0E>A<>B<>B<>B<> <0E>7<EFBFBD>7<EFBFBD>#<23> $<24> $<24> 0<> <13>N<EFBFBD>N<EFBFBD>k<><06><06><08>8Q<38>8Q<38>8Q<38>k<>k<>TW<54>Xh<58>Ti<54>k<>k<> l<> l<> l<><0F><0E><0E>a<>b<>b<>b<><0F><0E><0E>;<3B><<3C><<3C><<3C><1A>w<EFBFBD>w<EFBFBD>y<EFBFBD>)<29>)<29>0<>!<21>!<21>q<EFBFBD><07><0F><0E><0E>S<>f<EFBFBD>f<EFBFBD>h<EFBFBD>.G<>.G<>.G<>S<>S<>'<27>S<>S<>T<>T<>T<> <0E>7<EFBFBD>7<EFBFBD>9<EFBFBD> <1D> <1D> e<01> <13>N<EFBFBD>N<EFBFBD>\<5C> ]<5D> ]<5D> ]<5D> <13>N<EFBFBD>N<EFBFBD>H<> I<> I<> I<><1C>S<EFBFBD>W<EFBFBD>W<EFBFBD>\<5C>2<EFBFBD>6<>6<>7<>7<>J<EFBFBD> <13>N<EFBFBD>N<EFBFBD>c<>6<EFBFBD>6<EFBFBD>8<EFBFBD>;T<>;T<>;T<>c<>c<>Wa<57>c<>c<> d<> d<> d<><1C><1F><1F> 0<>"<22>5<>5<><03><0F><0E><0E>T<>U<>U<>U<><0F><0E><0E>;<3B><<3C><<3C><<3C>><3E> j<01> j<01>H<EFBFBD><1A>w<EFBFBD>w<EFBFBD>x<EFBFBD><12>,<2C>,<2C>H<EFBFBD>"<22>,<2C>,<2C>x<EFBFBD>0<>0<>D<EFBFBD>8<>8<>Q<EFBFBD>Q<EFBFBD>a<EFBFBD>F<EFBFBD><1F>'<27>'<27>
<EFBFBD>B<EFBFBD>7<>7<>H<EFBFBD> <13>N<EFBFBD>N<EFBFBD>h<>&<26>&<26>(<28>T\<5C>2]<5D>2]<5D>2]<5D>h<>h<>`f<>h<>h<> i<> i<> i<> i<><1D> <20> <20><1D><02>3<>3<><04> <0F>8<EFBFBD>8<EFBFBD>N<EFBFBD> #<23> #<23> Z<01> <13>N<EFBFBD>N<EFBFBD>p<> q<> q<> q<> <13>N<EFBFBD>N<EFBFBD>E<> F<> F<> F<> $<24><08><08>)9<> :<3A> :<3A>k<EFBFBD> I<> I<>1<EFBFBD>1<EFBFBD>q<EFBFBD>L<EFBFBD> <13>N<EFBFBD>N<EFBFBD>b<><06><06><08>8Q<38>8Q<38>8Q<38>b<>b<>T`<60>b<>b<> c<> c<> c<><13>x<EFBFBD>x<EFBFBD><0F>(<28>(<28> y<01><1C>_<EFBFBD>-<2D><05><17><0E><0E>g<>h<>h<>h<><17><0E><0E>O<>P<>P<>P<><17><0E><0E>}<7D>&<26>&<26>RZ<52>B[<5B>B[<5B>B[<5B>}<7D>}<7D>^c<>^g<>^g<>hw<68>yz<79>^{<7B>^{<7B>}<7D>}<7D>~<7E>~<7E>~<7E><17><0E><0E>`<60>a<>a<>a<><17><0E><0E>M<>N<>N<>N<><17><0E><0E>y<><06><06>PX<50>@Y<>@Y<>@Y<>y<>y<>\a<>\e<>\e<>fs<66>uv<75>\w<>\w<>y<>y<>z<>z<>z<><17><0E><0E>^<5E>_<>_<>_<><17><0E><0E>L<>M<>M<>M<><17><0E><0E>w<>v<EFBFBD>v<EFBFBD>x<EFBFBD>?X<>?X<>?X<>w<>w<>[`<60>[d<>[d<>eq<65>st<73>[u<>[u<>w<>w<>x<>x<>x<> <13>N<EFBFBD>N<EFBFBD>N<> O<> O<> O<> <13>N<EFBFBD>N<EFBFBD>?<3F> @<40> @<40> @<40><1B>D<EFBFBD>H<EFBFBD>H<EFBFBD>\<5C>2<EFBFBD>6<>6<>7<>7<>I<EFBFBD> <13>N<EFBFBD>N<EFBFBD>Y<>&<26>&<26>(<28>2K<32>2K<32>2K<32>Y<>Y<>i<EFBFBD>Y<>Y<> Z<> Z<> Z<> <13>N<EFBFBD>N<EFBFBD>L<> M<> M<> M<> <13>N<EFBFBD>N<EFBFBD>><3E> ?<3F> ?<3F> ?<3F><1B>`<60>`<60><04><08><08><1C>r<EFBFBD>(B<>(B<>`<60>`<60>`<60>a<>a<>I<EFBFBD> <13>N<EFBFBD>N<EFBFBD>X<><16><16><18>1J<31>1J<31>1J<31>X<>X<>Y<EFBFBD>X<>X<> Y<> Y<> Y<><1C><1F><1F> <0C>b<EFBFBD>1<>1<><03> <0E>7<EFBFBD>7<EFBFBD><<3C> <20> <20> L<02> <13>N<EFBFBD>N<EFBFBD>k<> l<> l<> l<> <13>N<EFBFBD>N<EFBFBD>J<> K<> K<> K<> <20><1C>.<2E> L<02> L<02> <09> <20>}<7D>}<7D>V<EFBFBD>Y<EFBFBD>7<>7<><04>#<23>-<2D>-<2D> <0A>r<EFBFBD>:<3A>:<3A>L<02>L<02>B<EFBFBD>!#<23><16><16> <0C>c<EFBFBD>!:<3A>!:<3A>J<EFBFBD><1E>F<EFBFBD>F<EFBFBD>?<3F>A<EFBFBD>6<>6<>E<EFBFBD><1B>N<EFBFBD>N<EFBFBD>$K<02>V<EFBFBD>V<EFBFBD>U]<5D>dh<64>u<75>FA<02>FA<02>FA<02>$K<02>$K<02>DI<02>$K<02>$K<02>L<02>L<02>L<02>L<02>L<02> <10><0E><0E>S<>T<>T<>T<><0F><0E><0E>9<>:<3A>:<3A>:<3A><1B>M<EFBFBD>-<2D>-<2D>o<EFBFBD>r<EFBFBD>B<>B<>F<>F<>x<EFBFBD>QS<51>T<>T<>U<>U<> <0A><19>$<24>(<28>(<28>8<EFBFBD>R<EFBFBD>0<>0<>1<>1<>C<EFBFBD><04><08><08>AV<41>XZ<58>8[<5B>8[<5B>4\<5C>4\<5C>\<5C> <0B><18><13><17><17><18>2<EFBFBD>.<2E>.<2E>/<2F>/<2F>
<EFBFBD>$<24>{<7B>2<>Z<EFBFBD>?<3F> <0C><0F><0E><0E>V<>F<EFBFBD>F<EFBFBD>H<EFBFBD>,E<>,E<>,E<>V<>V<> <0C>V<>V<>W<>W<>W<><13>y<EFBFBD>y<EFBFBD><17>!<21>!<21>D<EFBFBD>(<28>(r<>c <00><><00>|sdS|<01><00><00><00><00><00>}dddddddddddd<08> } t|<02><00><00>d <09><00>
<EFBFBD><00>D]e\}}|<01>|<03><00>rKt |d t |<03><00> <00><00><00><00><00><00>}t||z<00><00>cS<00>ftt |<01><00><00><00>S#ttf$rYdSwxYw) z*Parse human-readable size string to bytes.rrCr<>r<>r<>r<>l ) r<><00>KB<4B>MB<4D>GB<47>TB<54>PBr<42>r<>r<>r<>rhc<00>.<00>t|d<00><00> S)Nrr<>r<>s rur<>z:SystemHealthMonitor._parse_size_to_bytes.<locals>.<lambda>x s<00><00>3<EFBFBD>q<EFBFBD>QR<51>t<EFBFBD>9<EFBFBD>9<EFBFBD>*<2A>r<>r<>N)
rer<><00>sortedr<64>rrrZrkr<>r<>)r<>r<>r<>rf<00>mult<6C>nums rur<>z(SystemHealthMonitor._parse_size_to_bytesc s$<00><00><17> <15><14>1<EFBFBD><1B>><3E>><3E>#<23>#<23>)<29>)<29>+<2B>+<2B><08><12><16><19><19><19><19><15><18><18><18><18> 
<EFBFBD> 
<EFBFBD> <0B> <15> &<26>{<7B>'8<>'8<>':<3A>':<3A>@T<>@T<> U<> U<> U<> +<2B> +<2B> <0C><06><04><1B>$<24>$<24>V<EFBFBD>,<2C>,<2C>+<2B><1F><08><1D>3<EFBFBD>v<EFBFBD>;<3B>;<3B>,<2C><1D> 7<> =<3D> =<3D> ?<3F> ?<3F>@<40>@<40>C<EFBFBD><1E>s<EFBFBD>T<EFBFBD>z<EFBFBD>?<3F>?<3F>*<2A>*<2A>*<2A>+<2B><17>u<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>'<27>'<27> '<27><><1A>I<EFBFBD>&<26> <15> <15> <15><14>1<EFBFBD>1<EFBFBD> <15><><EFBFBD>s<00>BC <00>C <00> C5<03>4C5c<00><><00>|j<00>dd<02><00>sdS |<00>|<01><00>}|j<00>d<03><00>}|r<>ddl}|<04>t
j<00>|<03><00>d<06><07><00>\}} t j|d<08><00>5}|<07> |<02><00>ddd<05><00>n #1swxYwYt j
||<03><00>t<00> d |<03><00><02><00>n@#t$rt j|<06><00><00>wxYwt<00>d
|z<00><00>d S#t$r(}t<00>d |<08><00><02><00>Yd}~dSd}~wwxYw) a)
Write Prometheus metrics to configured destination.
If PROMETHEUS_TEXTFILE_PATH is set, writes to that file for node_exporter.
Otherwise, logs the metrics (for debugging or other use).
Returns:
bool: True if metrics were written successfully
rVFrXrNz.hwmon_metrics_)<02>dir<69>prefix<69>wzPrometheus metrics written to zPrometheus metrics generated:
Tz$Failed to write Prometheus metrics: )rhrr<><00>tempfile<6C>mkstempr_r`<00>dirname<6D>fdopen<65>write<74>renamerbrirl<00>unlinkrrm) r<>rr<><00> textfile_pathr<68><00>temp_fd<66> temp_pathrprts rurz,SystemHealthMonitor.write_prometheus_metrics<63> s<><00><00><14>{<7B><EFBFBD><EFBFBD>3<>U<EFBFBD>;<3B>;<3B> <19><18>5<EFBFBD> <19><1A>4<>4<>]<5D>C<>C<>G<EFBFBD> <20>K<EFBFBD>O<EFBFBD>O<EFBFBD>,F<>G<>G<>M<EFBFBD><1C> J<01> <20><0F><0F><0F>%-<2D>%5<>%5<><1A><07><0F><0F> <0A>6<>6<>,<2C>&6<>&<12>&<12>"<22><07><19><1A><1B><19>7<EFBFBD>C<EFBFBD>0<>0<>)<29>A<EFBFBD><19><07><07><07>(<28>(<28>(<28>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29><><EFBFBD><EFBFBD>)<29>)<29>)<29>)<29><16>I<EFBFBD>i<EFBFBD><1D>7<>7<>7<><1A>K<EFBFBD>K<EFBFBD> P<><1D> P<> P<>Q<>Q<>Q<>Q<><51> <20><1A><1A><1A><16>I<EFBFBD>i<EFBFBD>(<28>(<28>(<28><19><1A><><EFBFBD><EFBFBD>
<17> <0C> <0C>><3E><17>H<>I<>I<>I<><17>4<EFBFBD><34><18> <19> <19> <19> <12>L<EFBFBD>L<EFBFBD>C<><01>C<>C<> D<> D<> D<><18>5<EFBFBD>5<EFBFBD>5<EFBFBD>5<EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD> <19><><EFBFBD>sT<00>A,E<00> D<00>!C<03>7 D<00>C<07>D<00>
C<07> 5D<00>E<00> D!<03>! E<00>
E5<03> E0<03>0E5c <00> <00>t<00>d<01><00>dggd<03>} tjddgtjtjdd<07><08><00>}t<00>d |j<00><00><02><00>|j<00>d
<EFBFBD><00>d d <0C>D<00>]<5D>}|<03><00><00>s<01>|<03><00><00>}t|<04><00>d krt<00>d|<03><00><02><00><00>]|d|d }}|<06> <00><00>dk<00>r@t<00>d|<05>d<12><03><00>tjdd|gtjtjdd<07><08><00>}|gd<14>}|j<00>d
<EFBFBD><00>d d <0C>D<00>]<5D>} | <09><00><00>rd| vr<01>| <09><00><00>}
t|
<EFBFBD><00>dk<00>rE |
d<00>
d<17><00>s
d|
d vr<01>k|
d} |<00> | <0B><00>rt<00>d| <0B><00><02><00><00><>|<00> |
d <00><00>} |<00> |
d<00><00>} |<00> |
d<00><00>} t|
d<00>d<1E><00><00><00>}n'#tt f$r| dkr| | z dznd}YnwxYw| | | ||d <20>}|d!<00>|<10><00>||jd"d#kr-d$|d%<d&|<05>d'|d(<28>d)| <0B><00>}|d*<00>|<11><00>nO||jd"d+kr8|d%d$krd,|d%<d&|<05>d-|d(<28>d)| <0B><00>}|d*<00>|<11><00>t<00>d.|<10><00><02><00><00><02>#t&$r_}t<00>d/t)|<12><00><00><00><02><00>t<00>d0t+|<12><00><00><00><02><00>Yd }~<12><02><>d }~wwxYw<01><02><>|d!r8|d1<00>|<08><00>t<00>d2|<05><00><02><00><00><03><>t<00>d3<64><00>t<00>d4|d%<00><00><02><00>t<00>d5t|d1<00><00><00><00><02><00>t<00>d6t|d*<00><00><00><00><02><00>t<00>d7<64><00>ns#t&$rf}t<00>d8t)|<12><00><00><00><02><00>d9|d%<d:t)|<12><00><00><00>}|d*<00>|<13><00>Yd }~nd }~wwxYw|S);zJ
Check storage utilization for all running LXC containers
zStarting LXC storage checkr<6B>)r<r<>rM<00>pctr<74>TrLr<>zpct list output:
r<EFBFBD>rCNrozSkipping invalid line: r<00>runningzChecking container z disk usager<65>)r<>r<><00>MP<4D>zappPool:z/mnt/pve/mediafrnzSkipping excluded mount: rOr<>r<>r:r<>)r.r1r/<00> availabler2r<>r;r?rr<zLXC z critical storage usage: rAz% on rMr@r<>z high storage usage: zFilesystem details: zError processing line: zFull exception: r<>zAdded container info for VMID z!=== LXC Storage Check Summary ===r<>zTotal containers checked: zIssues found: z=== End LXC Storage Check ===z)Critical error during LXC storage check: r<>zError checking LXC storage: )rbrr<>rr<>r<>rgrerZrjrfr<>r<>r<00>rstripr<70>r;rrhrlr<><00>repr)r<>r$r<>rqr<>r<>r<<00> disk_info<66>container_info<66>fs_line<6E>columnsr.r1r/<00>available_spacer2<00>
filesystemr<EFBFBD>rt<00> error_msgs rurXz&SystemHealthMonitor._check_lxc_storage<67> s<00><00> <0F> <0C> <0C>1<>2<>2<>2<><1A><1C><18>
<EFBFBD>
<EFBFBD>
<EFBFBD> n 3<><1F>^<5E><16><06><0F>!<21><EFBFBD>!<21><EFBFBD><19><1A> <0E><0E><0E>F<EFBFBD> <13>L<EFBFBD>L<EFBFBD>=<3D>f<EFBFBD>m<EFBFBD>=<3D>=<3D> ><3E> ><3E> ><3E><1E> <0A>+<2B>+<2B>D<EFBFBD>1<>1<>!<21>"<22>"<22>5<>X N<01>X N<01><04><1B>z<EFBFBD>z<EFBFBD>|<7C>|<7C><1D><1C><1C>
<EFBFBD>
<EFBFBD> <0C> <0C><05><16>u<EFBFBD>:<3A>:<3A><01>><3E>><3E><1A>L<EFBFBD>L<EFBFBD>!A<>4<EFBFBD>!A<>!A<>B<>B<>B<><1C>$<24>Q<EFBFBD>x<EFBFBD><15>q<EFBFBD><18>f<EFBFBD><04><19><<3C><<3C>><3E>><3E>Y<EFBFBD>.<2E>.<2E><1A>L<EFBFBD>L<EFBFBD>!H<>t<EFBFBD>!H<>!H<>!H<>I<>I<>I<> *<2A><0E><1E><04>d<EFBFBD>+<2B>)<29><EFBFBD>)<29><EFBFBD>!<21> "<22> !<16>!<16>!<16>I<EFBFBD>!%<25>')<29>&<16>&<16>N<EFBFBD>
$-<2D>#3<>#9<>#9<>$<24>#?<3F>#?<3F><01><02><02>#C<>9)<29>9)<29><07>&<26>}<7D>}<7D><EFBFBD><EFBFBD>%<25>$<24>'<27>/<2F>/<2F>$<24>#*<2A>-<2D>-<2D>/<2F>/<2F><07><1E>w<EFBFBD><<3C><<3C>1<EFBFBD>,<2C>,<2C>1)<29>#*<2A>1<EFBFBD>:<3A>#8<>#8<><1A>#D<>#D<>!-<2D>HY<48>]d<>ef<65>]g<>Hg<48>Hg<48>$,<2C>.5<EFBFBD>R<EFBFBD>[<5B>
<EFBFBD>$(<28>#:<3A>#:<3A>:<3A>#F<>#F<>!-<2D>$*<2A>L<EFBFBD>L<EFBFBD>1Y<31>Z<EFBFBD>1Y<31>1Y<31>$Z<>$Z<>$Z<>$,<2C>/3<>.><3E>.><3E>w<EFBFBD>q<EFBFBD>z<EFBFBD>.J<>.J<> <0B>-1<>-=<3D>-=<3D>g<EFBFBD>a<EFBFBD>j<EFBFBD>-I<>-I<>
<EFBFBD>26<EFBFBD>2B<EFBFBD>2B<EFBFBD>7<EFBFBD>1<EFBFBD>:<3A>2N<32>2N<32><0F>!o<01>49<34>'<27>!<21>*<2A>:K<>:K<>C<EFBFBD>:P<>:P<>4Q<34>4Q<34>M<EFBFBD>M<EFBFBD><4D>(2<>J<EFBFBD>'?<3F>!o<01>!o<01>!o<01>Xc<58>fg<66>Xg<58>Xg<58>Z<EFBFBD>+<2B>5M<35>PS<50>5S<35>5S<35>mn<6D>M<EFBFBD>M<EFBFBD>M<EFBFBD>!o<01><><EFBFBD><EFBFBD>
3=<3D>3><3E>2<<3C>1@<40>5B<35> ."<22>."<22>
<EFBFBD>!/<2F>}<7D> =<3D> D<> D<>Z<EFBFBD> P<> P<> P<>$1<>D<EFBFBD>K<EFBFBD> <0C>4M<34>n<EFBFBD>4]<5D>#]<5D>#]<5D>;E<>J<EFBFBD>x<EFBFBD>$8<>,v<>4<EFBFBD>,v<>,v<>R_<52>,v<>,v<>,v<>jt<6A>,v<>,v<>E<EFBFBD>$.<2E>x<EFBFBD>$8<>$?<3F>$?<3F><05>$F<>$F<>$F<>$F<>%2<>d<EFBFBD>k<EFBFBD>,<2C>6O<36>P]<5D>6^<5E>%^<5E>%^<5E>'1<>(<28>';<3B>z<EFBFBD>'I<>'I<>?H<>
<EFBFBD>8<EFBFBD>(<<3C>,r<>4<EFBFBD>,r<>,r<>m<EFBFBD>,r<>,r<>,r<>fp<66>,r<>,r<>E<EFBFBD>$.<2E>x<EFBFBD>$8<>$?<3F>$?<3F><05>$F<>$F<>$F<> &<26> <0C> <0C>-P<>J<EFBFBD>-P<>-P<> Q<> Q<> Q<> Q<><51>#,<2C>)<29>)<29>)<29> &<26> <0C> <0C>-O<>s<EFBFBD>1<EFBFBD>v<EFBFBD>v<EFBFBD>-O<>-O<> P<> P<> P<> &<26> <0C> <0C>-I<><04>Q<EFBFBD><07><07>-I<>-I<> J<> J<> J<> (<28><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>_-<2D>j&<26>m<EFBFBD>4<>N<01>"<22><<3C>0<>7<>7<><0E>G<>G<>G<><1E> <0C> <0C>%L<>d<EFBFBD>%L<>%L<>M<>M<>M<><4D> <12>L<EFBFBD>L<EFBFBD><<3C> =<3D> =<3D> =<3D> <12>L<EFBFBD>L<EFBFBD>:<3A>J<EFBFBD>x<EFBFBD>$8<>:<3A>:<3A> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>L<EFBFBD>U<>c<EFBFBD>*<2A>\<5C>:R<>6S<36>6S<36>U<>U<> V<> V<> V<> <12>L<EFBFBD>L<EFBFBD>E<>#<23>j<EFBFBD><18>.B<>*C<>*C<>E<>E<> F<> F<> F<> <12>L<EFBFBD>L<EFBFBD>8<> 9<> 9<> 9<> 9<><39><18> 3<> 3<> 3<> <12>L<EFBFBD>L<EFBFBD>M<>S<EFBFBD><11>V<EFBFBD>V<EFBFBD>M<>M<> N<> N<> N<>#*<2A>J<EFBFBD>x<EFBFBD> <20>?<3F>s<EFBFBD>1<EFBFBD>v<EFBFBD>v<EFBFBD>?<3F>?<3F>I<EFBFBD> <16>x<EFBFBD> <20> '<27> '<27> <09> 2<> 2<> 2<> 2<> 2<> 2<> 2<> 2<><32><EFBFBD><EFBFBD><EFBFBD>  3<><33><EFBFBD><EFBFBD> <1A>s<><00>F2T<00>%N-<04>:T<00>;:N-<04>5T<00>6AN-<04>(J1<04>0N-<04>1!K<07>N-<04>K<07>CN-<04>+T<00>-
P<07>7AP<07> T<00>P<07>C>T<00>
V<03>AV<03>V)r9F)r<>)r<>)rRrH)NN)r<>)F<>__name__<5F>
__module__<EFBFBD> __qualname__<5F>STANDARD_WIDTHrh<00>ISSUE_PRIORITIESrh<00> classmethodrvr<>r<>r<>r<>r<00>SEVERITY_INDICATORSrr<><00>boolr<6C>rkrrrrr<00>dictrr<>r<>r<>r<>rYr<>r<>r<>r<>rDrMrk<00>tupler<65>rr<>r<>r<>rr<>r<>rrrrrr(r*rNr9rS<00> staticmethodr[rprTrvrUrVrWr<>r<>rrXr<>r<>rurrs<><00><00><00><00><00><00><18>N<EFBFBD><18><13><15><15><12> <06><06>J<EFBFBD>1<06><19>:<3A>j<EFBFBD>1<>1<06> !<21>*<2A>Z<EFBFBD>"8<>1<06> <18><1A>J<EFBFBD>/<2F> 1<06> <18><1A>F<EFBFBD>+<2B>1<06> <19>*<2A>V<EFBFBD>,<2C>1<06> <18><1A>F<EFBFBD>+<2B>1<06> <1C>Z<EFBFBD><06>/<2F>1<06> <1A>:<3A>f<EFBFBD>-<2D>1<06> <1F>
<EFBFBD>6<EFBFBD> 2<>1<06> <1C>Z<EFBFBD><06>/<2F>1<06> <1E>z<EFBFBD>&<26>1<>1<06> <1C>Z<EFBFBD><06>/<2F>1<06> <1D>j<EFBFBD><16>0<>!1<06>" <19>*<2A>V<EFBFBD>,<2C>#1<06>( <18><1A>H<EFBFBD>-<2D>)1<06>* <17>
<EFBFBD>8<EFBFBD>,<2C>+1<06>, <1A>:<3A>h<EFBFBD>/<2F>-1<06>1<06>. <1E>z<EFBFBD>(<28>3<>/1<06>0 <1B>J<EFBFBD>x<EFBFBD>0<>11<06>2 <1D>j<EFBFBD><18>2<>31<06>4 <1F>
<EFBFBD>8<EFBFBD> 4<>51<06>6 <16>z<EFBFBD>(<28>+<2B>71<06>< <13>J<EFBFBD>x<EFBFBD>(<28>=1<06>> <1E>z<EFBFBD>(<28>3<>?1<06>@ <1D>j<EFBFBD><18>2<>A1<06>B <1C>Z<EFBFBD><08>1<>C1<06>H <1B>J<EFBFBD>u<EFBFBD>-<2D>I1<06>J <19>*<2A>U<EFBFBD>+<2B>K1<06>L <18><1A>E<EFBFBD>*<2A>M1<06>N <1A>:<3A>e<EFBFBD>,<2C>O1<06>T <1A>:<3A>j<EFBFBD>1<>U1<06>V <1B>J<EFBFBD>x<EFBFBD>0<>W1<06>X <18><1A>F<EFBFBD>+<2B>Y1<06>Z <1E>z<EFBFBD>&<26>1<>[1<06>1<06>\)<29><18>2<>&<26>v<EFBFBD>.<2E>#<23>F<EFBFBD>+<2B>a1<06>1<06>1<06><14>f,<06><18>D<>,<06><18>$<24>,<06> <15><1F><1E><1E><1D><1D>#%<25> 
<EFBFBD>
<EFBFBD>,<06> <13>&<26> <20><1D><1B> 
<EFBFBD>
<EFBFBD>,<06>" <1A>
<EFBFBD>
<EFBFBD>
<EFBFBD>#,<06>, <1C>
<EFBFBD>
<EFBFBD>
<EFBFBD>-,<06>: <16>-<2D>;,<06>< !<21>"<22>=,<06>> <1F><05>?,<06>@ (<28><11>A,<06>D <17><04>E,<06>F <1B>D<EFBFBD>G,<06>H <1D>b<EFBFBD>I,<06>J <1E>r<EFBFBD>K,<06>N <17>)<29>O,<06>R <1D>e<EFBFBD>S,<06>T <1A>4<EFBFBD>U,<06>V #<23>D<EFBFBD>W,<06>,<06>F<EFBFBD>\<11>8;<3B>8;<3B><11>[<5B>8;<3B>x<1D> <20>
<EFBFBD>
<EFBFBD>
<19>.<2E>
<EFBFBD><1F>"<22><1C>*<2A>"<22> 
<EFBFBD>
<EFBFBD> <17> <0C>
<EFBFBD> <17> <0C>
<EFBFBD> <16>{<7B>
<EFBFBD>+<2B>,<2C>
<EFBFBD>
<EFBFBD>1<06><06><14>@<1F><1E><06><06><15> <19><1C><16>$<24><1C><1C><1C><06><06>L<EFBFBD>"<22>:<3A>.<2E>!<21>l<EFBFBD> <20>\<5C>
<EFBFBD>
<EFBFBD>  <20><08> <20><18>
<EFBFBD>
<EFBFBD>
%<25><1C>$<24><1C>
<EFBFBD>
<EFBFBD><06><06><18>$G<01>F<>F<> %<25>#]<5D>(<12>(<12>
%<25>#]<5D>$<12>$<12> <0E> <0E> 
<EFBFBD> 
<EFBFBD>"<22>4<EFBFBD>(<28>%<25>$<24>#Q<>(<12>(<12><0E>
<EFBFBD>
<EFBFBD>K<01>J<>J<>",<2C>f<EFBFBD>!5<>&/<2F>&'<27>%<25>&<26>)<0E>)<0E> !*<2A> !<21>)3<>*4<>#T<>+0<>#<23>(<12>(<12> %<25>#U<>*<12>*<12>
%<25>#U<>,<12>,<12> %<25>#g<>%<12>%<12>
%<25>#g<>'<12>'<12> $<24> )<29> !<21>)*<2A>*+<2B>#L<> +<12>+<12> $<24> )<29> !<21>)*<2A>*+<2B>#J<> +<12>+<12>K-<0E>-<0E>7
<EFBFBD>7
<EFBFBD>r$<24>U<EFBFBD>+<2B> %<25>#K<>(<12>(<12>
%<25>#K<>$<12>$<12>
*6<>*6<>#Q<>$<12>$<12><0E><0E>
<EFBFBD>
<EFBFBD>("<22>9<EFBFBD>-<2D>&/<2F>&'<27><1F> <20>)<0E>)<0E> !*<2A> !<21>)-<2D>*.<2E>#M<>#<23> (<12>(<12> $<24>)+<2B>*,<2C>'<12>'<12> $<24>)+<2B>*,<2C>%<12>%<12><0E><0E>
<EFBFBD>
<EFBFBD>> <20><17>)<29>&2<>&)<29><1D><1E>)<0E>)<0E>
*<2A> +<2B> #<23>)+<2B>*,<2C>#G<>#<23> ,<12>,<12> <0E>
<EFBFBD>
<EFBFBD>(B<01>A<>A<>&2<>&)<29><1D><1E>)<0E>)<0E><0E> 
<EFBFBD> 
<EFBFBD>"<22>9<EFBFBD>-<2D>&/<2F>&*<2A><1F> <20>)<0E>)<0E><0E> 
<EFBFBD> 
<EFBFBD>k#<06>k#<06><1F>\<1B><19><19><18> <06><06><17>  <0C> " <0C> # <0C> " <0C>  <0C>
 <0C> $ <0C> <0C>  <0C>  <0C>  <0C>  <0C> <0C>{n<06>n<06><16>f?<3F>?<3F>s<EFBFBD>?<3F>bf<62>?<3F>?<3F>?<3F>?<3F> +@<01>+@<01>#<23>+@<01>#<23>+@<01>+@<01>+@<01>+@<01>`1<>1<>1<>"E<1D>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>E<1D>E<1D>E<1D>E<1D>TS<16>C<EFBFBD>S<16>T<EFBFBD>S<16>d<EFBFBD>SV<53>i<EFBFBD>S<16>S<16>S<16>S<16>j<16><16>C<EFBFBD><16>c<EFBFBD><16>s<EFBFBD><16>_c<5F>dg<64>_h<5F><16><16><16><16>,)<16>c<EFBFBD>)<16><13>)<16><14>c<EFBFBD><19>)<16>)<16>)<16>)<16>V=<16><03>=<16>t<EFBFBD>=<16><04>S<EFBFBD> <09>=<16>=<16>=<16>=<16>~,<1D><04>S<EFBFBD>#<23>X<EFBFBD><0E>,<1D>,<1D>,<1D>,<1D>b7<1D><13>7<1D><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>7<1D>7<1D>7<1D>7<1D>r!<21>!<21>c<EFBFBD>!<21>C<EFBFBD>!<21><03>!<21>S<EFBFBD>!<21>!<21>!<21>!<21>  <20>S<EFBFBD>  <20>S<EFBFBD>  <20>  <20>  <20>  <20>)<29>s<EFBFBD>)<29>s<EFBFBD>)<29>)<29>)<29>)<29>I<1B>C<EFBFBD>I<1B><04>S<EFBFBD>RU<52>X<EFBFBD><0E>I<1B>[^<5E>I<1B>I<1B>I<1B>I<1B>V#<15>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>#<15>s<EFBFBD>#<15>#<15>#<15>#<15>JM)<29><03>M)<29>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>M)<29>WZ<57>M)<29>M)<29>M)<29>M)<29>^n
<EFBFBD>s<EFBFBD>n
<EFBFBD>u<EFBFBD>n
<EFBFBD>n
<EFBFBD>n
<EFBFBD>n
<EFBFBD>ff@<01><04>S<EFBFBD>#<23>X<EFBFBD><0E>f@<01>f@<01>f@<01>f@<01>Py<16>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>y<16>t<EFBFBD>C<EFBFBD>y<EFBFBD>y<16>y<16>y<16>y<16>|$<1B><04>S<EFBFBD> <09>$<1B>$<1B>$<1B>$<1B>L
<15>S<EFBFBD>
<15>T<EFBFBD>
<15>
<15>
<15>
<15>1<17>C<EFBFBD>1<17>E<EFBFBD>1<17>1<17>1<17>1<17>f#<1B>#<1B>#<1B>JC<1D>3<EFBFBD>C<1D>4<EFBFBD><03>S<EFBFBD><08>><3E>C<1D>C<1D>C<1D>C<1D>P<15>C<EFBFBD><15>C<EFBFBD><15><15><15><15>('<19>'<19>#<23>'<19>s<EFBFBD>'<19>c<EFBFBD>'<19>'<19>'<19>'<19>R;<3B>;<3B>s<EFBFBD>;<3B>#<23>;<3B>X[<5B>;<3B>gk<67>lo<6C>qt<71>lt<6C>gu<67>;<3B>;<3B>;<3B>;<3B>B <14>3<EFBFBD> <14>d<EFBFBD> <14>W[<5B> <14> <14> <14> <14>3<14>3<EFBFBD>3<14>d<EFBFBD>3<14>W[<5B>3<14>3<14>3<14>3<14>j$<24>C<EFBFBD>$<24>D<EFBFBD>$<24>$<24>$<24>$<24>G<1C>#<23>G<1C>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E>G<1C>G<1C>G<1C>G<1C>R
G<1C>s<EFBFBD>G<1C>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>G<1C>G<1C>G<1C>G<1C>RY<1D>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>Y<1D>Y<1D>Y<1D>Y<1D>|<12> -<2D> -<2D>C<EFBFBD> -<2D><13> -<2D>s<EFBFBD> -<2D> -<2D> -<2D><12>\<5C> -<2D>"<22>s<EFBFBD>"<22>u<EFBFBD>"<22>"<22>"<22>"<22>6<1D>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>6<1D>6<1D>6<1D>6<1D>p <15><03> <15><03> <15> <15> <15> <15> <1A>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E> <1A> <1A> <1A> <1A>C<0E>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>C<0E>C<0E>C<0E>C<0E>J<1B>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><1B><1B><1B><1B>HW)<29>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>W)<29>#<23>W)<29>W)<29>W)<29>W)<29>r<15>S<EFBFBD><15>S<EFBFBD><15><15><15><15>:(<19>d<EFBFBD>3<EFBFBD><03>8<EFBFBD>n<EFBFBD>(<19><14>(<19>(<19>(<19>(<19>T{<1A>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>{<1A>{<1A>{<1A>{<1A>{<1A>{r<>rc<00><><00>tjd<01><02><00>}|<00>ddd<05><06><00>|<00>ddd<08><06><00>|<00>d td
d <0B> <0C><00>|<00><00><00>}t t
jd |j<00><0E><00>}|jr8|<02> <00><00>}t|<02> |<03><00><00><00>dS|j r<>ddl }|<02> <00><00>}t|j d<10><00>5}|j||dt<00><12><00>ddd<00><00>n #1swxYwYt <00>d|j <00><00><02><00>dS|<02><00><00>dS)NzSystem Health Monitor)r<>z --dry-run<75>
store_truezHEnable dry-run mode (simulate ticket creation without actual API calls).)<02>action<6F>helpz --metricsz-Output Prometheus metrics to stdout and exit.z --export-json<6F>FILEz"Export health report to JSON file.)r<><00>metavarrr8)r<>r<>rr<>ro)rq<00>defaultzHealth report exported to )<13>argparse<73>ArgumentParser<65> add_argumentr<74><00>
parse_argsrrhr<>r<>r<00>printr<74><00> export_jsonryrdr~rbrir)<06>parser<65>argsr<73>rryrps ru<00>mainr$' s<><00><00> <15> $<24>1H<31> I<> I<> I<>F<EFBFBD>
<EFBFBD><17><17><13><1B> W<><18><06><06><06>
 <0B><17><17><13><1B> <<3C><18><06><06><06>
 <0B><17><17><17> <10><16> 1<> <18><06><06><06> <12> <1C> <1C> <1E> <1E>D<EFBFBD>!<21>*<2A>1<>2B<32>C<><14> <0C><06><06><06>G<EFBFBD>
 <0C>|<7C> <16><1F>5<>5<>7<>7<> <0A> <0A>g<EFBFBD>/<2F>/<2F> <0A>><3E>><3E>?<3F>?<3F>?<3F>?<3F>?<3F> <0A> <19><16><13> <0B> <0B> <0B><1F>5<>5<>7<>7<> <0A> <11>$<24>"<22>C<EFBFBD> (<28> (<28> ?<3F>A<EFBFBD> <15>D<EFBFBD>I<EFBFBD>m<EFBFBD>Q<EFBFBD>q<EFBFBD>#<23> ><3E> ><3E> ><3E> ><3E> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F> ?<3F><><EFBFBD><EFBFBD> ?<3F> ?<3F> ?<3F> ?<3F><0E> <0B> <0B>C<><14>1A<31>C<>C<>D<>D<>D<>D<>D<><0F> <0B> <0B> <0A> <0A> <0A> <0A> s<00>D7<03>7D;<07>>D;<07>__main__) r_<00>sysryr<>rVrNr<><00>loggingr<00>urllib.request<73>urllibr<62>r<>rPrs<00>typingrrr<00> getLoggerr
rb<00>setLevel<65>DEBUG<55> StreamHandler<65>console_handler<65> Formatter<65> formatter<65> setFormatter<65>
addHandlerrr$r<>r<>ru<00><module>r4s<><00><01>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>x<>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22>
<1B><17> <1A>8<EFBFBD> $<24> $<24><06><06><0F><0F><07> <0A><1E><1E><1E>'<27>'<27>'<27>)<29>)<29><0F><0F><18><18><17><1D>'<27>'<27>'<27> <1D>G<EFBFBD> <1D>I<> J<> J<> <09><0F><1C><1C>Y<EFBFBD>'<27>'<27>'<27><06><11><11>/<2F>"<22>"<22>"<22>R4<1A>R4<1A>R4<1A>R4<1A>R4<1A>R4<1A>R4<1A>R4<1A>hh%<16>%<16>%<16>N <0C>z<EFBFBD><19><19><08>D<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD>F<EFBFBD><1A>r<>