Files
webgui/emhttp/plugins/dynamix/nchan/parity_list
2025-08-12 21:39:32 -04:00

162 lines
5.5 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';
$log = '/boot/config/parity-checks.log';
$stamps = '/var/tmp/stamps.ini';
$resync = '/var/tmp/resync.ini';
$md5_old = $spot_old = $fs_old = $proc_old = -1;
$remove_resync_files = 0;
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'] = 'main';
$login_locale = _var($display,'locale');
require_once "$docroot/webGui/include/Translations.php";
$dot = _var($display,'number','.,')[0];
// remember current language
$locale_init = $locale;
function new_parity_log($timestamp) {
global $log;
return file_exists($log) ? explode('|',tail($log))[0]!=$timestamp : true;
}
function my_clock($time) {
if (!$time) return _('less than a minute');
$days = floor($time/1440);
$hour = floor($time/60)%24;
$mins = $time%60;
return plus($days,'day',($hour|$mins)==0).plus($hour,'hour',$mins==0).plus($mins,'minute',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/main.txt";
if (file_exists($text)) {
$store = "$docroot/languages/$locale/main.dot";
if (!file_exists($store)) file_put_contents($store,serialize(parse_lang_file($text)));
$language = array_merge($language,unserialize(file_get_contents($store)));
}
}
}
function create_sync($file) {
return file_exists($file) ? explode(',',file_get_contents($file)) : [];
}
function create_file($file,...$data) {
if (!file_exists($file)) file_put_contents($file,implode(',',$data));
}
while (true) {
$var = (array)@parse_ini_file("$varroot/var.ini");
/* Check for language changes */
extract(parse_plugin_cfg('dynamix', true));
if (_var($display, 'locale') != $locale_init) {
$locale_init = _var($display, 'locale');
update_translation($locale_init);
}
$synced = create_sync($stamps);
$sbSynced = array_shift($synced) ?: _var($var, 'sbSynced', 0);
$echo = [];
$spot = _var($var, 'mdResyncPos', 0);
if ($spot > 0) {
$size = _var($var, 'mdResyncSize', 0);
$delta = _var($var, 'mdResyncDt', 0);
$bytes = _var($var, 'mdResyncDb', 0);
create_file($resync, _var($var, 'mdResyncAction'), $size);
$echo[] = my_scale($size * 1024, $unit, -1) . " $unit";
$echo[] = _(my_clock(floor((time() - $sbSynced) / 60)), 2) . ($delta ? '' : ' (' . _('paused') . ')');
$echo[] = my_scale($spot * 1024, $unit) . " $unit (" . number_format($spot / ($size / 100 + 1), 1, $dot, '') . " %)";
$echo[] = $delta ? my_scale($bytes * 1024 / $delta, $unit, 1) . " $unit/sec" : '---';
$echo[] = $bytes ? _(my_clock(round(((($delta * (($size - $spot) / ($bytes / 100 + 1))) / 100) / 60), 0)), 2) : _('Unknown');
$echo[] = $var['sbSyncErrs'];
} elseif (_var($var, 'sbSynced') && _var($var, 'sbSynced2')) {
$timestamp = str_replace(['.0', '.'], [' ', ' '], date('Y.M.d H:i:s', $var['sbSynced2']));
if (new_parity_log($timestamp)) {
/* Get the results from the latest parity check. */
list($duration, $speed, $status, $error, $action, $size) = last_parity_check();
/* Save the result in the parity history log. */
file_put_contents($log, "$timestamp|$duration|$speed|$status|$error|$action|$size\n", FILE_APPEND);
/* Remove the resync files after the history file has been updated. */
$remove_resync_files = 1;
/* Parity check is completed. */
$echo = "";
} elseif ($remove_resync_files >= 3) {
delete_file($stamps, $resync);
$remove_resync_files = 0;
} elseif ($remove_resync_files != 0) {
$remove_resync_files++;
}
}
/* Handle fsState changes */
if (_var($var, 'fsState') == 'Copying') {
$fsState = _var($var, 'fsCopyPrcnt') . "% " . _('completed');
} elseif (_var($var, 'fsState') == 'Clearing') {
$fsState = _var($var, 'fsClearPrcnt') . "% " . _('completed');
} elseif (substr(_var($var, 'fsState'), -3) != 'ing') {
$fsState = 'stop';
} else {
$fsState = '';
}
/* Determine process state */
if (_var($var, 'fsState') != "Started") {
$process = -1;
} elseif ($spot > 0 && $bytes > 0) {
$process = 1;
} elseif (_var($var, 'shareMoverActive') == "yes") {
$process = 2;
} elseif (exec('ps -C btrfs -o cmd=|grep -cv show') > 0) {
$process = 3;
} elseif (exec("zpool status 2>/dev/null | grep -c 'scrub in progress'") > 0) {
$process = 4;
} else {
$process = 0;
}
// publish without a timeout for no listeners
publish_noDupe('parity', $echo,1,false);
publish_noDupe('paritymonitor', $spot > 0 ? 1 : 0,1,false);
publish_noDupe('fsState', $fsState,1,false);
publish_noDupe('mymonitor', $process,1,false);
//publish to the dummy listener with the timeoutto see if there are any subscribers
publish_noDupe('mainPingListener',"ping");
sleep(3);
}
?>