#!/bin/sh # maclustr app-manager — POSIX-sh per-node collector (no python/jq needed). # Emits a simple line protocol parsed by the Node server. echo "HOST $(hostname -s 2>/dev/null)" echo "CORES $(sysctl -n hw.ncpu 2>/dev/null)" echo "MEMTOTAL $(sysctl -n hw.memsize 2>/dev/null)" ps=$(sysctl -n hw.pagesize 2>/dev/null); [ -z "$ps" ] && ps=16384 vms=$(vm_stat 2>/dev/null) act=$(printf '%s\n' "$vms" | awk '/Pages active/{gsub(/[^0-9]/,"",$NF);print $NF}') wir=$(printf '%s\n' "$vms" | awk '/Pages wired/{gsub(/[^0-9]/,"",$NF);print $NF}') cmp=$(printf '%s\n' "$vms" | awk '/occupied by compressor/{gsub(/[^0-9]/,"",$NF);print $NF}') act=${act:-0}; wir=${wir:-0}; cmp=${cmp:-0} echo "MEMUSED $(( (act + wir + cmp) * ps ))" la=$(sysctl -n vm.loadavg 2>/dev/null | tr -d '{}') [ -z "$(echo $la | tr -d ' ')" ] && la=$(uptime | sed -n 's/.*averages*[:,]* *\([0-9.]*\)[ ,]*\([0-9.]*\)[ ,]*\([0-9.]*\).*/\1 \2 \3/p') echo "LOAD $la" echo "BOOT $(sysctl -n kern.boottime 2>/dev/null | sed -n 's/.*sec = \([0-9]*\).*/\1/p')" df -k / 2>/dev/null | tail -1 | awk '{print "DISK "$2*1024" "$3*1024" "$5}' # listening TCP ports (skip pure-OS services) lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | tail -n +2 | while read -r cmd pid user fd type dev sz nod name rest; do case "$name" in *:*) ;; *) continue ;; esac case "$cmd" in ARDAgent|rapportd|sshd|launchd|mDNSResponder|identityservicesd|ControlCe|ControlCenter|sharingd|remoted|AnyDesk|anydesk|Google*) continue ;; esac port=${name##*:}; host=${name%:*} case "$port" in ''|*[!0-9]*) continue ;; esac lb=0; case "$host" in 127.0.0.1|"[::1]"|"::1"|"*") lb=1 ;; esac cwd=$(lsof -p "$pid" -a -d cwd -Fn 2>/dev/null | sed -n 's/^n//p' | head -1) printf 'PORT %s\t%s\t%s\t%s\n' "$port" "$cmd" "$lb" "$cwd" done # ngrok tunnels — split JSON into per-tunnel objects (POSIX sh, no process subst) for p in 4040 4041 4042 4043 4044 4045 4046 4047 4048; do j=$(curl -s --max-time 1 "http://127.0.0.1:$p/api/tunnels" 2>/dev/null) [ -z "$j" ] && continue { printf '%s' "$j" | sed 's/},{/}@{/g' | tr '@' '\n'; echo; } | while IFS= read -r obj; do u=$(printf '%s' "$obj" | grep -o '"public_url":"[^"]*"' | head -1 | sed 's/.*:"//;s/"$//') [ -z "$u" ] && continue a=$(printf '%s' "$obj" | grep -o '"addr":"[^"]*"' | head -1 | sed 's/.*:"//;s/"$//') printf 'TUN %s\t%s\n' "$u" "$a" done done # launchd: user agents + relevant system daemons loaded=$(launchctl list 2>/dev/null) for plist in "$HOME"/Library/LaunchAgents/*.plist; do [ -e "$plist" ] || continue label=$(basename "$plist" .plist) printf '%s' "$label" | grep -qiE 'apple|google|micro|docker|tailscale|openssh|knollsoft|anydesk' && continue info=$(printf '%s\n' "$loaded" | awk -v L="$label" '$3==L{print $1}') if [ -n "$info" ]; then ld=1; pid="$info"; run=0; { [ "$pid" != "-" ] && [ -n "$pid" ]; } && run=1; else ld=0; pid="-"; run=0; fi printf 'AGENT %s\tuser\t%s\t%s\t%s\n' "$label" "$ld" "$run" "$pid" done for plist in /Library/LaunchDaemons/*.plist; do [ -e "$plist" ] || continue label=$(basename "$plist" .plist) printf '%s' "$label" | grep -qiE 'apple|openssh|homebrew' && continue printf '%s' "$label" | grep -qiE 'maclustr|ngrok|allconverter|vquant|spb|louka|zyquo|al-l|localai|crawl|image|drive' || continue info=$(printf '%s\n' "$loaded" | awk -v L="$label" '$3==L{print $1}') if [ -n "$info" ]; then ld=1; pid="$info"; run=1; else ld=0; pid="-"; run=0; fi printf 'AGENT %s\tsystem\t%s\t%s\t%s\n' "$label" "$ld" "$run" "$pid" done echo "END"