[Xymon] Xymon client on MacOS Catalina (10.15)

Brian Scott Brian.Scott at bunyatech.com.au
Sat Sep 5 14:47:08 CEST 2020


On 5/9/20 3:30 pm, Mark Wagner wrote:
> On Sat, 5 Sep 2020 13:29:54 +1000
> Brian Scott <Brian.Scott at bunyatech.com.au> wrote:
>
>> Hi list,
>>
>> Has anyone had experience with running the xymon client on the latest
>> Macos?
>>
>> My particular problem is that the handling of disk mounts and
>> capacities has gone seriously weird. First exhibit - output from the
>> mount command:
>>
>> # mount
>> /dev/disk1s1 on / (apfs, local, read-only, journaled)
>> devfs on /dev (devfs, local, nobrowse)
>> /dev/disk1s2 on /System/Volumes/Data (apfs, local, journaled,
>> nobrowse) /dev/disk1s5 on /private/var/vm (apfs, local, journaled,
>> nobrowse) map auto_home on /System/Volumes/Data/home (autofs,
>> automounted, nobrowse)
>>
>> All volumes are either marked nobrowse or read-only so no disks are
>> selected by xymonclient-darwin.sh. This has the immediate kick on
>> effect of causing a bash set command to dump all set variables
>> because the filesystem list is empty. Ignoring this because we
>> actually want to select some filesystems, the question is which ones.
>> Looking at the output from df:
>>
>> # df -P -H
>> Filesystem      Size   Used  Avail Capacity  Mounted on
>> /dev/disk1s1    1.0T    11G    92G    11%    /
>> devfs           345k   345k     0B   100%    /dev
>> /dev/disk1s2    1.0T   893G    92G    91%    /System/Volumes/Data
>> /dev/disk1s5    1.0T   3.2G    92G     4%    /private/var/vm
>> map auto_home     0B     0B     0B   100%    /System/Volumes/Data/home
>>
>> It looks like /dev/disk1s1, s2 and s5 are all the same real partition
>> but account for different space from it, i.e. total size = 1.0T, Used
>> = 11G+893G+3.2G=907.2G, Avail=92G.
>>
>> This would suggest that a reasonable thing to monitor would be one of
>> these entries ('/' makes some sense) and derive used as size-avail
>> (1.0T-92G).
> APFS volumes are more akin to BTRFS subvolumes or ZFS filesystems
> than to traditional partitions: the available space on the physical
> storage is shared between them on an as-needed basis.
>
> There might be some Apple-specific command line tool to get the
> statistics you want, but failing that, you'll need to track which
> partitions are APFS versus something else when deciding how to
> calculate usage.
>
Many thanks,

I've cooked up a change to xymonclient-darwin.sh to try to deal with
this. In particular, non-apfs disks and partitions should be treated as
you would expect for conventional file systems.

For apfs volumes, I've just reported one for each underlying disk
showing the total used figures.

Inodes seem to be used individually for each volume so I've reported
each of them. Mind you, the maximum appears to be effectively infinite
so there is no danger of ever running out so this is of limited use. The
existing code wouldn't have been reporting inodes anyway (df command
mistake).

Cheers,

Brian Scott

-------------- next part --------------
--- client/xymonclient-darwin.sh.orig	2015-10-20 09:34:59.000000000 +1100
+++ client/xymonclient-darwin.sh	2020-09-05 22:28:06.000000000 +1000
@@ -26,28 +26,62 @@
 echo "[who]"
 who
 
-FILESYSTEMS=`mount | sed -E '/[\( ](nobrowse|afs|read-only)[ ,\)]/d;s/^.* on (.*) \(.*$/\1/'`
+FILESYSTEMS=
+APFS=`mount | grep -E '[( ]apfs[,)]' | sed -E -e 's/s[0-9]{1,} .*/s/' | sort -u`
+for apfs in $APFS; do
+	# Find the 'best' mountpoint to use for this disk (whatever that means...)
+	mp=`mount|grep -E "^$apfs.*[( ]local[,)]"| grep -v '[( ](nobrowse|afs|nfs|smbfs|nullfs|devfs|read-only)[ ,)]'|head -1`
+	if [ -z "$mp" ]; then
+		mp=`mount|grep -E "^$apfs.*[( ]local[,)]"| grep -v '[( ](nobrowse|afs|nfs|smbfs|nullfs|devfs)[ ,)]'|head -1`
+		if [ -z "$mp" ]; then
+			mp=`mount|grep -E "^$apfs.*[( ]local[,)]"| grep -v '[( ](afs|nfs|smbfs|nullfs|devfs)[ ,)]'|head -1`
+		fi
+	fi
+	if [ -n "$mp" ]; then
+		mp=`echo $mp|sed -E -e 's/^.*on //' -e 's/ \(.*//'`
+		FILESYSTEMS="$FILESYSTEMS =$apfs $mp"
+	fi
+done
+
+FILESYSTEMS="$FILESYSTEMS "`mount | sed -E -e '/[\( ](nobrowse|afs|read-only|apfs)[ ,\)]/d' -e 's/^.* on (.*) \(.*$/\1/'`
 
 echo "[df]"
-(IFS=$'\n'
- set $FILESYSTEMS
- df -P -H $1; shift
+(IFS=" "
+ set -- $FILESYSTEMS
+ df -P -H / | head -1
  while test $# -gt 0
  do
-   df -P -H $1 | tail -1 | sed 's/\([^ ]\) \([^ ]\)/\1_\2/g'
+   case "$1" in
+     =*)
+	 	shift
+		df -P -m $1 | tail -1 | sed -E -e 's/s[0-9]{1,} */ /' | awk '{printf "%-20s %10dM %10dM %10dM %10d%% %s\n", $1, $2, $2-$4, $4, 100*($2-$4)/$2, $6}'
+	    ;;
+	*)
+        df -P -H $1 | tail -1 | sed 's/\([^ ]\) \([^ ]\)/\1_\2/g'
+		;;
+   esac
    shift
  done) | column -t -s " " | sed -e 's!Mounted *on!Mounted on!'
 
 echo "[inode]"
-(IFS=$'\n'
- set $FILESYSTEMS
- df -P -i $1; shift
+(IFS=" "
+ set -- $FILESYSTEMS
+ df -i / | head -1
  while test $# -gt 0
  do
-   df -P -H $1 | tail -1 | sed 's/\([^0123456789% ]\) \([^ ]\)/\1_\2/g'
+   case "$1" in
+     =*)
+	 	dev=`echo $1|cut -d= -f2-`
+	 	shift
+		df -i | grep "^$dev"
+	    ;;
+	*)
+        df -i $1 | tail -1 | sed 's/\([^0123456789% ]\) \([^ ]\)/\1_\2/g'
+		;;
+   esac
    shift
  done) | awk '
-NR<2{printf "%-20s %10s %10s %10s %10s %s\n", $1, "itotal", $6, $7, $8, $9} 
+NR<2{printf "%-20s %10s %10s %10s %10s %s %s\n", $1, "itotal", $6, $7, $8, $9, $10} 
 (NR>=2 && $6>0) {printf "%-20s %10d %10d %10d %10s %s\n", $1, $6+$7, $6, $7, $8, $9}'
 
 echo "[mount]"
@@ -59,7 +93,7 @@
 echo "[route]"
 netstat -rn
 echo "[netstat]"
-netstat -s
+netstat -s 2>/dev/null
 echo "[ifstat]"
 netstat -ibn | egrep -v "^lo|<Link"
 echo "[ports]"


More information about the Xymon mailing list