Files
webgui/emhttp/plugins/dynamix/nchan/update_1
T
Squidly271 408331edf5 Refactor: Support not sending duplicate messages
Keep track of the md5 within a separate function.  Avoids duplication of code on the nchan scripts, and allows for the script to still exit if no listeners without adding in more code within each script to handle this.
2025-08-10 18:13:10 -04:00

131 lines
4.8 KiB
PHP
Executable File

#!/usr/bin/php -q
<?PHP
/* Copyright 2005-2023, Lime Technology
* Copyright 2012-2023, Bergware International.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*/
?>
<?
$docroot = '/usr/local/emhttp';
$varroot = '/var/local/emhttp';
$md5_old = -1;
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/webGui/include/publish.php";
extract(parse_plugin_cfg('dynamix',true));
// add translations
$_SERVER['REQUEST_URI'] = 'dashboard';
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
// remember current language
$locale_init = $locale;
/* Parse the ini files */
$shares = parse_ini_file('state/shares.ini', true);
$disks = parse_ini_file('state/disks.ini', true);
function update_translation($locale) {
global $docroot,$language;
$language = [];
if ($locale) {
$text = "$docroot/languages/$locale/translations.txt";
if (file_exists($text)) {
$store = "$docroot/languages/$locale/translations.dot";
if (!file_exists($store)) file_put_contents($store,serialize(parse_lang_file($text)));
$language = unserialize(file_get_contents($store));
}
$text = "$docroot/languages/$locale/dashboard.txt";
if (file_exists($text)) {
$store = "$docroot/languages/$locale/dashboard.dot";
if (!file_exists($store)) file_put_contents($store,serialize(parse_lang_file($text)));
$language = array_merge($language,unserialize(file_get_contents($store)));
}
}
}
while (true) {
extract(parse_plugin_cfg('dynamix',true));
if (_var($display,'locale') != $locale_init) {
$locale_init = _var($display,'locale');
update_translation($locale_init);
}
unset($memory,$df,$fans,$lsof);
exec("awk '/^Mem(Total|Available)/{print $2*1024}' /proc/meminfo",$memory);
exec("df --output=pcent,used /boot /var/log /var/lib/docker 2>/dev/null|awk '(NR>1){print $1,$2*1024}'",$df);
exec("sensors -uA 2>/dev/null|grep -Po 'fan\d_input: \K\d+'",$fans);
[$total,$free] = $memory;
$used = $total-$free;
$names = [_('System'),_('Free')];
$bytes = $echo = [];
$hooks = array_filter(glob("/usr/local/emhttp/plugins/*/system/*",GLOB_NOSORT),function($file){return is_executable($file);});
foreach ($hooks as $hook) {
$data = @intval(exec(escapeshellarg($hook)));
if (!$data || $data>$used) continue;
$names[] = _(str_replace('_',' ',basename($hook))); // name of element
$bytes[] = $data; // value in bytes
}
// parse RAM graph
$a = 'ram';
$services = $used-array_sum($bytes);
$echo[$a][] = round(100*$used/$total)."%";
$echo[$a][] = my_scale($used,$unit,null,-1,1024)." $unit";
$echo[$a][] = round(100*$free/$total);
$echo[$a][] = my_scale($free,$unit,null,-1,1024)." $unit";
$echo[$a][] = round(100*$services/$total);
$echo[$a][] = my_scale($services,$unit,null,-1,1024)." $unit";
foreach ($bytes as $byte) {
// parse hook script information for RAM usage graph
$echo[$a][] = round(100*$byte/$total);
$echo[$a][] = my_scale($byte,$unit,null,-1,1024)." $unit";
}
// add element names
$echo['name'] = $names;
// parse the graphs for flash, log & docker
foreach ($df as $data) {
[$pcent,$used] = explode(' ',$data);
$echo['sys'][] = [$pcent,my_scale($used,$unit,null,-1,1024)." $unit"];
}
// add fans information
if (count($fans)) $echo['fan'] = array_map(function($fan){return "$fan RPM";},$fans);
// add streams information
/* Extract keys from both ini files */
$paths = array_keys($disks);
/* Validate and filter accessible mount points */
$valid_paths = array_filter($paths, function($key) {
$mnt_path = '/mnt/' . $key;
/* Check if the directory exists and is a valid mount point */
return is_dir($mnt_path) && trim((shell_exec("mountpoint -q " . escapeshellarg($mnt_path) . " && echo 1")) ?? '') === '1';
});
/* Construct the list of paths */
$mnt_paths = array_map(function($key) {
return '/mnt/'.escapeshellarg($key);
}, $valid_paths);
/* Combine paths into the command */
$mnt_list = implode(' ', $mnt_paths);
/* Build and execute the modified command */
$command = 'LANG="en_US.UTF8" timeout 3 lsof -Fn '.$mnt_list.' 2>/dev/null | awk -F/ \'$1=="n" && $2=="mnt" && $5!="" {print $4"/"$5"/"$6"/"$7}\' | sort -u | awk -F/ \'{print $1}\'';
exec($command, $lsof);
$share = array_keys($shares);
$count = array_count_values($lsof ?? array());
foreach ($share as $name) $echo['stream'][] = $count[$name]??0;
$echo = json_encode($echo);
publish_md5('update1',$echo,true);
sleep(5);
}
?>