Skip to content

Commit 915fff0

Browse files
committed
fix(fs): correct disk usage calculation for ext* filesystems
Signed-off-by: ernolf <[email protected]>
1 parent 223340b commit 915fff0

File tree

3 files changed

+44
-21
lines changed

3 files changed

+44
-21
lines changed

lib/OperatingSystems/FreeBSD.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,10 @@ public function getDiskInfo(): array {
199199
$disk = new Disk();
200200
$disk->setDevice($filesystem);
201201
$disk->setFs($matches['Type'][$i]);
202-
$disk->setUsed((int)((int)$matches['Used'][$i] / 1024));
203-
$disk->setAvailable((int)((int)$matches['Available'][$i] / 1024));
204-
$disk->setPercent($matches['Capacity'][$i]);
202+
$used = (int)((int)$matches['Blocks'][$i] - (int)$matches['Available'][$i]);
203+
$disk->setUsed((int)ceil($used / 1024));
204+
$disk->setAvailable((int)floor((int)$matches['Available'][$i] / 1024));
205+
$disk->setPercent(round(($used * 100 / (int)$matches['Blocks'][$i]), 2) . '%');
205206
$disk->setMount($matches['Mounted'][$i]);
206207

207208
$data[] = $disk;

lib/OperatingSystems/Linux.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,10 @@ public function getDiskInfo(): array {
217217
$disk = new Disk();
218218
$disk->setDevice($filesystem);
219219
$disk->setFs($matches['Type'][$i]);
220-
$disk->setUsed((int)((int)$matches['Used'][$i] / 1024));
221-
$disk->setAvailable((int)((int)$matches['Available'][$i] / 1024));
222-
$disk->setPercent($matches['Capacity'][$i]);
220+
$used = (int)((int)$matches['Blocks'][$i] - (int)$matches['Available'][$i]);
221+
$disk->setUsed((int)ceil($used / 1024));
222+
$disk->setAvailable((int)floor((int)$matches['Available'][$i] / 1024));
223+
$disk->setPercent(round(($used * 100 / (int)$matches['Blocks'][$i]), 2) . '%');
223224
$disk->setMount($matches['Mounted'][$i]);
224225

225226
$data[] = $disk;

tests/lib/LinuxTest.php

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,57 +143,78 @@ public function testGetDiskInfo(): void {
143143
$disk1 = new Disk();
144144
$disk1->setDevice('/dev/mapper/homestead--vg-root');
145145
$disk1->setFs('ext4');
146-
$disk1->setUsed(6060);
147-
$disk1->setAvailable(46212);
148-
$disk1->setPercent('12%');
146+
// $size1 = 56422560;
147+
// $available1 = 47321220;
148+
$used1 = 9101340; // $size1 - $available1
149+
$disk1->setUsed(8889); // ceil(9101340 / 1024); (= 8888.0273)
150+
$disk1->setAvailable(46212); // floor(47321220 / 1024); (= 46212.1289)
151+
$disk1->setPercent('16.13%'); // round(($used1 * 100 / $size1), 2) . '%'; (= 16.1307%)
149152
$disk1->setMount('/');
150153

151154
$disk2 = new Disk();
152155
$disk2->setDevice('/dev/mapper/homestead--vg-mysql--master');
153156
$disk2->setFs('ext4');
154-
$disk2->setUsed(251);
157+
// $size2 = 65531436;
158+
// $available2 = 61902400;
159+
$used2 = 3629036;
160+
$disk2->setUsed(3544);
155161
$disk2->setAvailable(60451);
156-
$disk2->setPercent('1%');
162+
$disk2->setPercent('5.54%');
157163
$disk2->setMount('/homestead-vg/master');
158164

159165
$disk3 = new Disk();
160166
$disk3->setDevice('vagrant');
161167
$disk3->setFs('vboxsf');
162-
$disk3->setUsed(600421);
168+
// $size3 = 958123168;
169+
// $available3 = 343292036;
170+
$used3 = 614831132;
171+
$disk3->setUsed(600422);
163172
$disk3->setAvailable(335246);
164-
$disk3->setPercent('65%');
173+
$disk3->setPercent('64.17%');
165174
$disk3->setMount('/vagrant');
166175

167176
$disk4 = new Disk();
168177
$disk4->setDevice('home_vagrant_code');
169178
$disk4->setFs('vboxsf');
170-
$disk4->setUsed(600421);
179+
// $size4 = 958123168;
180+
// $available4 = 343292036;
181+
$used4 = 614831132;
182+
$disk4->setUsed(600422);
171183
$disk4->setAvailable(335246);
172-
$disk4->setPercent('65%');
184+
$disk4->setPercent('64.17%');
173185
$disk4->setMount('/home/vagrant/code');
174186

175187
$disk5 = new Disk();
176188
$disk5->setDevice('nfs.example.com:/export');
177189
$disk5->setFs('nfs4');
178-
$disk5->setUsed(0);
190+
// $size5 = 14820;
191+
// $available5 = 1230
192+
$used5 = 13590;
193+
$disk5->setUsed(14);
179194
$disk5->setAvailable(1);
180-
$disk5->setPercent('0%');
195+
$disk5->setPercent('91.7%');
181196
$disk5->setMount('/nfs');
182197

183198
$disk6 = new Disk();
184199
$disk6->setDevice('198.51.100.42:/storage');
185200
$disk6->setFs('fuse.sshfs');
186-
$disk6->setUsed(51);
201+
// $size6 = 47929956;
202+
// $available6 = 45419052;
203+
$used6 = 2510904;
204+
$disk6->setUsed(2453);
187205
$disk6->setAvailable(44354);
188-
$disk6->setPercent('1%');
206+
$disk6->setPercent('5.24%');
189207
$disk6->setMount('/mnt/sshfs');
190208

191209
$disk7 = new Disk();
192210
$disk7->setDevice('/dev/vda5');
193211
$disk7->setFs('ext4');
194-
$disk7->setUsed(107508);
212+
// $size7 = 205314024;
213+
// $available7 = 84722884;
214+
$used7 = 120591140;
215+
$disk7->setUsed(117765);
195216
$disk7->setAvailable(82737);
196-
$disk7->setPercent('57%');
217+
$disk7->setPercent('58.73%');
197218
$disk7->setMount('/nextcloud/my.cloud.domain.xx');
198219

199220
$this->assertEquals([$disk1, $disk2, $disk3, $disk4, $disk5, $disk6, $disk7], $this->os->getDiskInfo());

0 commit comments

Comments
 (0)