From c3eaacb8ab3dea485d842f89aa055e241b73ce8b Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 20 Oct 2020 09:46:25 +0200 Subject: [systemstatus] Add main-warning hook for low disk space --- .../systemstatus/hooks/main-warning.inc.php | 9 +++ .../systemstatus/inc/systemstatus.inc.php | 53 ++++++++++++++++ .../systemstatus/lang/de/messages.json | 2 + .../systemstatus/lang/en/messages.json | 2 + modules-available/systemstatus/page.inc.php | 74 ++++++---------------- 5 files changed, 87 insertions(+), 53 deletions(-) create mode 100644 modules-available/systemstatus/inc/systemstatus.inc.php diff --git a/modules-available/systemstatus/hooks/main-warning.inc.php b/modules-available/systemstatus/hooks/main-warning.inc.php index 406ae73c..5707c7d2 100644 --- a/modules-available/systemstatus/hooks/main-warning.inc.php +++ b/modules-available/systemstatus/hooks/main-warning.inc.php @@ -4,4 +4,13 @@ if (file_exists('/run/reboot-required.pkgs')) { $lines = file('/run/reboot-required.pkgs', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $lines = array_unique($lines); Message::addInfo('systemstatus.update-reboot-required', true, implode(', ', $lines)); +} + +if (SystemStatus::diskStat($systemUsage, $storeUsage, $current, $wanted)) { + if ($current === $wanted && isset($storeUsage['freeKb']) && $storeUsage['freeKb'] < 60000000) { // 60GB + Message::addWarning('systemstatus.storage-low-vmstore', true, Util::readableFileSize($storeUsage['freeKb'], -1 , 1)); + } + if (isset($systemUsage['freeKb']) && $systemUsage['freeKb'] < 600000) { // 600MB + Message::addWarning('systemstatus.storage-low-system', true, Util::readableFileSize($systemUsage['freeKb'], -1 , 1)); + } } \ No newline at end of file diff --git a/modules-available/systemstatus/inc/systemstatus.inc.php b/modules-available/systemstatus/inc/systemstatus.inc.php new file mode 100644 index 00000000..4413af5f --- /dev/null +++ b/modules-available/systemstatus/inc/systemstatus.inc.php @@ -0,0 +1,53 @@ +') { + $storePoint = '/'; + } else { + $storePoint = CONFIG_VMSTORE_DIR; + } + // Collect free space information + foreach ($task['data']['list'] as $entry) { + // StorePoint is either the atual directory of the vmstore, or / if we use internal storage + if ($entry['mountPoint'] === $storePoint) { + $storeUsage = $entry; + } + // Always report free space on system disk + if ($entry['mountPoint'] === '/') { + $systemUsage = $entry; + } + // Record what's mounted at destination, regardless of config, to indicate something is wrong + if (($currentSource === false && $wantedSource === '' && $entry['mountPoint'] === '/') + || $entry['mountPoint'] === CONFIG_VMSTORE_DIR) { + $currentSource = $entry['fileSystem']; + } + } + return true; + } + +} \ No newline at end of file diff --git a/modules-available/systemstatus/lang/de/messages.json b/modules-available/systemstatus/lang/de/messages.json index 44e4fad1..0aaefd23 100644 --- a/modules-available/systemstatus/lang/de/messages.json +++ b/modules-available/systemstatus/lang/de/messages.json @@ -1,3 +1,5 @@ { + "storage-low-system": "Dem Betriebssystem geht der freie Speicher aus. Nur noch {{0}} frei. Versuchen Sie, alte \"Netboot Grundsystem\"-Versionen zu l\u00f6schen.", + "storage-low-vmstore": "Auf dem VMstore sind nur noch {{0}} frei", "update-reboot-required": "Das Update der folgenden Pakete erfordert einen Reboot des Servers: {{0}}" } \ No newline at end of file diff --git a/modules-available/systemstatus/lang/en/messages.json b/modules-available/systemstatus/lang/en/messages.json index c38c8e66..dc9d3dd0 100644 --- a/modules-available/systemstatus/lang/en/messages.json +++ b/modules-available/systemstatus/lang/en/messages.json @@ -1,3 +1,5 @@ { + "storage-low-system": "System storage running out. Only {{0}} free. You could try deleting old Net-boot OS versions.", + "storage-low-vmstore": "VMstore space is running out. Only {{0}} left.", "update-reboot-required": "Updating the following system packages requires reboot: {{0}}" } \ No newline at end of file diff --git a/modules-available/systemstatus/page.inc.php b/modules-available/systemstatus/page.inc.php index f94aa4d4..05a98e94 100644 --- a/modules-available/systemstatus/page.inc.php +++ b/modules-available/systemstatus/page.inc.php @@ -88,61 +88,17 @@ class Page_SystemStatus extends Page protected function ajaxDiskStat() { User::assertPermission("show.overview.diskstat"); - $task = Taskmanager::submit('DiskStat'); - if ($task === false) - return; - $task = Taskmanager::waitComplete($task, 3000); - - if (!isset($task['data']['list']) || empty($task['data']['list'])) { - Taskmanager::addErrorMessage($task); + if (!SystemStatus::diskStat($systemUsage, $storeUsage, $currentSource, $wantedSource)) return; - } - $store = Property::getVmStoreUrl(); - $storeUsage = false; - $systemUsage = false; - if ($store !== false) { - if ($store === '') - $storePoint = '/'; - else - $storePoint = CONFIG_VMSTORE_DIR; - // Determine free space - foreach ($task['data']['list'] as $entry) { - if ($entry['mountPoint'] === $storePoint) { - $storeUsage = array( - 'percent' => $entry['usedPercent'], - 'size' => Util::readableFileSize($entry['sizeKb'] * 1024), - 'free' => Util::readableFileSize($entry['freeKb'] * 1024), - 'color' => $this->usageColor($entry['usedPercent']) - ); - } - if ($entry['mountPoint'] === '/') { - $systemUsage = array( - 'percent' => $entry['usedPercent'], - 'size' => Util::readableFileSize($entry['sizeKb'] * 1024), - 'free' => Util::readableFileSize($entry['freeKb'] * 1024), - 'color' => $this->usageColor($entry['usedPercent']) - ); - } - } - $data = array( - 'store' => $storeUsage, - 'system' => $systemUsage - ); - // Determine if proper vm store is being used - if ($store !== '') { - $data['storeMissing'] = $store; - } - foreach ($task['data']['list'] as $entry) { - if ($entry['mountPoint'] !== CONFIG_VMSTORE_DIR) - continue; - if ($store !== $entry['fileSystem']) { - $data['wrongStore'] = $entry['fileSystem']; - break; - } - $data['storeMissing'] = false; - } - } else { + $data = ['system' => $this->convertDiskStat($systemUsage)]; + if ($wantedSource === false) { // Not configured yet, nothing to display $data['notConfigured'] = true; + } elseif ($wantedSource === $currentSource) { // Fine and dandy + $data['store'] = $this->convertDiskStat($storeUsage); + } elseif ($currentSource === false) { // No current source, nothing mounted + $data['storeMissing'] = true; + } else { // Something else mounted + $data['wrongStore'] = $currentSource; } echo Render::parse('diskstat', $data); } @@ -437,6 +393,18 @@ class Page_SystemStatus extends Page echo '
', htmlspecialchars($data, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), '
'; } + private function convertDiskStat($stat) + { + if (!is_array($stat)) + return false; + return [ + 'percent' => $stat['usedPercent'], + 'size' => Util::readableFileSize($stat['sizeKb'] * 1024), + 'free' => Util::readableFileSize($stat['freeKb'] * 1024), + 'color' => $this->usageColor($stat['usedPercent']), + ]; + } + private function usageColor($percent) { if ($percent <= 50) { -- cgit v1.2.3-55-g7522