[AGS] SysInfo: Re-Structure for better perf
This commit is contained in:
		
							
								
								
									
										137
									
								
								config/astal/components/bar/sysinfo.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								config/astal/components/bar/sysinfo.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| import { exec, execAsync, interval, Variable } from "astal"; | ||||
|  | ||||
| const FETCH_INTERVAL = 2000; | ||||
| const cpuUtil = Variable("0%"); | ||||
| const ramUtil = Variable("0%"); | ||||
| const ramUsed = Variable("0MiB"); | ||||
| const gpuUtil = Variable("0%"); | ||||
| let gpuName = "card1"; | ||||
| let enabled = true; | ||||
|  | ||||
| const getStats = (): Stats => { | ||||
|     gpuName = exec(`/bin/bash -c "ls /sys/class/drm/ | grep '^card[0-9]*$'"`); | ||||
|     const cpuNameInSensors = "CPUTIN"; | ||||
|     const stats = { | ||||
|         kernel: exec("uname -sr"), | ||||
|         cpuTemp: exec( | ||||
|             `/bin/bash -c "sensors | grep -m1 ${cpuNameInSensors} | awk '{print $2}'"`, | ||||
|         ), | ||||
|         cpuClk: exec( | ||||
|             `awk '/cpu MHz/ {sum+=$4; ++n} END {print sum/n " MHz"}' /proc/cpuinfo`, | ||||
|         ), | ||||
|         gpuTemp: exec( | ||||
|             `/bin/bash -c "sensors | grep -E 'edge' | awk '{print $2}'"`, | ||||
|         ), | ||||
|         gpuClk: exec( | ||||
|             `/bin/bash -c "cat /sys/class/drm/${gpuName}/device/pp_dpm_sclk | grep '\\*' | awk '{print $2 $3}'"`, | ||||
|         ), | ||||
|         vram: | ||||
|             Math.round( | ||||
|                 parseInt( | ||||
|                     exec( | ||||
|                         `cat /sys/class/drm/${gpuName}/device/mem_info_vram_used`, | ||||
|                     ), | ||||
|                 ) / | ||||
|                 1024 / | ||||
|                 1024, | ||||
|             ) + "MiB", | ||||
|         availableVRAM: | ||||
|             Math.round( | ||||
|                 parseInt( | ||||
|                     exec( | ||||
|                         `cat /sys/class/drm/${gpuName}/device/mem_info_vram_total`, | ||||
|                     ), | ||||
|                 ) / | ||||
|                 1024 / | ||||
|                 1024, | ||||
|             ) + "MiB", | ||||
|     }; | ||||
|  | ||||
|     return stats; | ||||
| }; | ||||
|  | ||||
| const systemStats: Variable<Stats> = Variable(getStats()); | ||||
| const availableFeatures = { | ||||
|     cpu: true, | ||||
|     ram: true, | ||||
| }; | ||||
|  | ||||
| const refreshStats = () => { | ||||
|     systemStats.set(getStats()); | ||||
| } | ||||
|  | ||||
| const featureTest = () => { | ||||
|     print('[SysInfo] Feature test started...'); | ||||
|     // Check if awk & sed are available | ||||
|     try { | ||||
|         exec("awk -V"); | ||||
|         exec("sed --version"); | ||||
|     } catch (e) { | ||||
|         printerr( | ||||
|             "[ SysInfo ] AWK or SED missing! No system info will be available", | ||||
|         ); | ||||
|         enabled = false; | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // Check if mpstat is available | ||||
|     try { | ||||
|         exec("mpstat -V"); | ||||
|     } catch (e) { | ||||
|         availableFeatures.cpu = false; | ||||
|         printerr( | ||||
|             "[ SysInfo ] Feature Test for CPU info failed. mpstat from the sysstat package missing!", | ||||
|         ); | ||||
|     } | ||||
|     print('[SysInfo] Feature test complete'); | ||||
| }; | ||||
|  | ||||
| const sysInfoFetcher = () => { | ||||
|     if (enabled) { | ||||
|         if (availableFeatures.cpu) { | ||||
|             execAsync(`/bin/fish -c cpu-utilization`).then(v => { | ||||
|                 cpuUtil.set("" + Math.round(parseFloat(v))); | ||||
|             }).catch(e => { | ||||
|                 console.error(e); | ||||
|             }); | ||||
|         } | ||||
|         if (availableFeatures.ram) { | ||||
|             execAsync( | ||||
|                 `/bin/bash -c "free | awk '/Mem:/ {print $3 \\" \\" $2}'"`, | ||||
|             ).then(v => { | ||||
|                 const util = parseInt(v.split(' ')[0]); | ||||
|                 const available = parseInt(v.split(' ')[1]); | ||||
|                 ramUtil.set("" + Math.round(util / available * 100)); | ||||
|                 ramUsed.set(`${Math.round(util / 1024 / 1024 * 10) / 10} GiB of ${Math.round(available / 1024 / 1024 * 10) / 10} GiB used`); | ||||
|             }).catch(e => { | ||||
|                 console.error(e); | ||||
|             }); | ||||
|         } | ||||
|         gpuUtil.set(exec("cat /sys/class/drm/card1/device/gpu_busy_percent")); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| let sysInfoFetcherRunning = false; | ||||
| const startSysInfoFetcher = () => { | ||||
|     if (!sysInfoFetcherRunning) { | ||||
|         sysInfoFetcherRunning = true; | ||||
|  | ||||
|         featureTest(); | ||||
|  | ||||
|         if (enabled) { | ||||
|             // Start interval | ||||
|             interval(FETCH_INTERVAL, sysInfoFetcher); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default { | ||||
|     startSysInfoFetcher, | ||||
|     enabled, | ||||
|     gpuUtil, | ||||
|     cpuUtil, | ||||
|     ramUsed, | ||||
|     ramUtil, | ||||
|     refreshStats, | ||||
|     systemStats | ||||
| } | ||||
		Reference in New Issue
	
	Block a user