diff options
author | Sriram Melkote <[email protected]> | 2013-01-31 17:01:34 -0800 |
---|---|---|
committer | Sriram Melkote <[email protected]> | 2013-01-31 17:01:34 -0800 |
commit | bdb135a4d9c6aa32204d5c87f6e59c3b1b4c86be (patch) | |
tree | 542f1097e6e3357ab7084f60d1f283c0c2ea76e1 /lib/os_mon | |
parent | 1cbd897c43f0dab1275392a3736e4629c1f80243 (diff) | |
download | otp-bdb135a4d9c6aa32204d5c87f6e59c3b1b4c86be.tar.gz otp-bdb135a4d9c6aa32204d5c87f6e59c3b1b4c86be.tar.bz2 otp-bdb135a4d9c6aa32204d5c87f6e59c3b1b4c86be.zip |
This patch fixes disksup:get_disk_data for SUSv3, specifically OS X ML
On OS X Mountain Lion, the default output of df command includes iNode
used and iNodes free, which apparent what SUSv3 specifies. This breaks
the current parse logic and reports incorrect results. This patch adds
support for the new format and ensures older versions of OS X produce
this format by adding the -i switch (which is now the default). Adding
support for this new format rather than changing df output as we'll
presumably see this on other platforms eventually.
Diffstat (limited to 'lib/os_mon')
-rw-r--r-- | lib/os_mon/src/disksup.erl | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl index f5f76f1488..f906f33d32 100644 --- a/lib/os_mon/src/disksup.erl +++ b/lib/os_mon/src/disksup.erl @@ -275,8 +275,8 @@ check_disk_space({unix, sunos4}, Port, Threshold) -> Result = my_cmd("df", Port), check_disks_solaris(skip_to_eol(Result), Threshold); check_disk_space({unix, darwin}, Port, Threshold) -> - Result = my_cmd("/bin/df -k -t ufs,hfs", Port), - check_disks_solaris(skip_to_eol(Result), Threshold). + Result = my_cmd("/bin/df -i -k -t ufs,hfs", Port), + check_disks_susv3(skip_to_eol(Result), Threshold). % This code works for Linux and FreeBSD as well check_disks_solaris("", _Threshold) -> @@ -298,6 +298,26 @@ check_disks_solaris(Str, Threshold) -> check_disks_solaris(skip_to_eol(Str),Threshold) end. +% Parse per SUSv3 specification, notably recent OS X +check_disks_susv3("", _Threshold) -> + []; +check_disks_susv3("\n", _Threshold) -> + []; +check_disks_susv3(Str, Threshold) -> + case io_lib:fread("~s~d~d~d~d%~d~d~d%~s", Str) of + {ok, [_FS, KB, _Used, _Avail, Cap, _IUsed, _IFree, _ICap, MntOn], RestStr} -> + if + Cap >= Threshold -> + set_alarm({disk_almost_full, MntOn}, []); + true -> + clear_alarm({disk_almost_full, MntOn}) + end, + [{MntOn, KB, Cap} | + check_disks_susv3(RestStr, Threshold)]; + _Other -> + check_disks_susv3(skip_to_eol(Str),Threshold) + end. + %% Irix: like Linux with an extra FS type column and no '%'. check_disks_irix("", _Threshold) -> []; check_disks_irix("\n", _Threshold) -> []; |