summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2020-10-20 09:46:25 +0200
committerSimon Rettberg2020-10-20 09:46:25 +0200
commitc3eaacb8ab3dea485d842f89aa055e241b73ce8b (patch)
tree651c074563246c1ec193de9b33b80cb8556fb6a3
parent[locationinfo] real fix of bootstrap switches (diff)
downloadslx-admin-c3eaacb8ab3dea485d842f89aa055e241b73ce8b.tar.gz
slx-admin-c3eaacb8ab3dea485d842f89aa055e241b73ce8b.tar.xz
slx-admin-c3eaacb8ab3dea485d842f89aa055e241b73ce8b.zip
[systemstatus] Add main-warning hook for low disk space
-rw-r--r--modules-available/systemstatus/hooks/main-warning.inc.php9
-rw-r--r--modules-available/systemstatus/inc/systemstatus.inc.php53
-rw-r--r--modules-available/systemstatus/lang/de/messages.json2
-rw-r--r--modules-available/systemstatus/lang/en/messages.json2
-rw-r--r--modules-available/systemstatus/page.inc.php74
5 files changed, 87 insertions, 53 deletions
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 @@
+<?php
+
+class SystemStatus
+{
+
+ /**
+ * Collect status about the disk and vmstore.
+ * The *Usage vars are filled with arrays with keys mountPoint, fileSystem,
+ * usedPercent, sizeKb, freeKb.
+ * @param array|false $systemUsage
+ * @param array|false $storeUsage
+ * @param string|false $currentSource What's currently mounted as vmstore
+ * @param string|false $wantedSource What should be mounted as vmstore (false if nothing configured)
+ * @return bool false if querying fs data from taskmanager failed
+ */
+ public static function diskStat(&$systemUsage, &$storeUsage, &$currentSource = false, &$wantedSource = false)
+ {
+ $task = Taskmanager::submit('DiskStat');
+ if ($task === false)
+ return false;
+ $task = Taskmanager::waitComplete($task, 3000);
+
+ if (!isset($task['data']['list']) || empty($task['data']['list']))
+ return false;
+ $wantedSource = Property::getVmStoreUrl();
+ $currentSource = false;
+ $storeUsage = false;
+ $systemUsage = false;
+ if ($wantedSource === '<local>') {
+ $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 === '<local>' && $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 === '<local>')
- $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 !== '<local>') {
- $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 '<pre>', htmlspecialchars($data, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), '</pre>';
}
+ 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) {