1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
<?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();
$storeUsage = false;
$systemUsage = false;
if ($wantedSource === '<local>') {
$storePoint = '/';
$currentSource = $wantedSource;
} else {
$storePoint = CONFIG_VMSTORE_DIR;
$currentSource = false;
}
// Collect free space information
foreach ($task['data']['list'] as $entry) {
// StorePoint is either the actual 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 ($entry['mountPoint'] === CONFIG_VMSTORE_DIR) {
$currentSource = $entry['fileSystem'];
// If internal/local storage is used but there is a mount on CONFIG_VMSTORE_DIR,
// we assume it's on purpose like a second hdd and use that
if ($wantedSource === '<local>') {
$wantedSource = $currentSource;
$storeUsage = $entry;
}
}
}
return true;
}
/**
* Get timestamp of the available updates. This is an estimate, the downloaded apt data usually
* preserves the Last-Modified timestamp from the HTTP download or the according data. Note
* that this list gets updated whener any available package changes, so it does not necessarily
* mean that any currently installed package can be updated when the list changes.
*/
public static function getAptLastDbUpdateTime(): int
{
$osRelease = parse_ini_file('/etc/os-release');
$updateDbTime = 0;
foreach (glob('/var/lib/apt/lists/*_dists_' . ($osRelease['VERSION_CODENAME'] ?? '') . '*_InRelease', GLOB_NOSORT) as $f) {
$b = basename($f);
if (preg_match('/dists_[a-z]+(?:[\-_]updates)?_InRelease$/', $b)) {
$updateDbTime = max($updateDbTime, filemtime($f));
}
}
return $updateDbTime;
}
/**
* Get timestamp when the apt database was last attempted to be updated. This does not
* imply that the operation was successful.
*/
public static function getAptLastUpdateAttemptTime(): int
{
return (int)filemtime('/var/lib/apt/lists/partial');
}
/**
* Get when the dpkg database was last changed, i.e. when a package was last installed, updated or removed.
* This is an estimate as it just looks at the modification time of relevant files. It is possible these
* files get modified for other reasons.
*/
public static function getDpkgLastPackageChanges(): int
{
return (int)filemtime(file_exists('/var/log/dpkg.log') ? '/var/log/dpkg.log' : '/var/lib/dpkg/status');
}
}
|