#!/bin/sh
#
# Erstelle eine munin-Host-Liste (Teil einer munin-Konfiguration) basierend auf der Erreichbarkeit
# von erreichbaren munin-node-Gegenstellen in einem definierten Netzwerk-Bereich.
# Somit koennen alle Opennet-Knoten mit aktiviertem munin automatisch ueberwacht werden, ohne dass
# munin-update aufgrund nicht-erreichbarer Hosts zu viel Zeit benoetigt.
#
# Folgende cron-Jobs sind empfehlenswert:
# 
#   */10 *	* * *	root	/usr/local/bin/munin-oni-update-hosts update-unused
#   34 4	* * *	root	/usr/local/bin/munin-oni-update-hosts update-all && /usr/local/bin/munin-oni-update-hosts remove-outdated
#

set -eu

NETWORKS="192.168.1.0/24 192.168.2.0/24 192.168.3.0/24"
MUNIN_HOST_FILE=/etc/munin/munin-conf.d/ap.conf
EXPIRE_DAYS=30
TIMESTAMP_DIR=/var/lib/munin-oni-host-timestamps
NET_PREFIX="192.168."


update_hosts_timestamps() {
	nmap -T insane --min-parallelism 60 --max-parallelism 300 -p munin -oG - "$@" $NETWORKS \
		| awk '{ if ($5 == "4949/open/tcp//munin///") print $2; }' \
		| while read host; do touch "$TIMESTAMP_DIR/$host"; done
}


update_munin_files() {
	local name
	(
		echo "# ACHTUNG: dieses Skript wird regelmaessig via cron-Job durch $0 ueberschrieben"
		echo
		ls "$TIMESTAMP_DIR" | while read host; do
			name="${host#$NET_PREFIX}"
			echo "[ap;AP$name]"
			echo "  address ${name}.aps.on"
			echo "  use_node_name yes"
			echo
		done
	) >"${MUNIN_HOST_FILE}.neu"
	mv "${MUNIN_HOST_FILE}.neu" "$MUNIN_HOST_FILE"
}


ACTION="${1:-help}"

mkdir -p "$TIMESTAMP_DIR"
case "$ACTION" in
	update-all)
		update_hosts_timestamps
		update_munin_files
		;;
	update-unused)
		tmp_file=$(tempfile)
		ls "$TIMESTAMP_DIR" >"$tmp_file"
		update_hosts_timestamps "--excludefile=$tmp_file"
		rm -f "$tmp_file"
		update_munin_files
		;;
	remove-outdated)
		find "$TIMESTAMP_DIR" -type f -maxdepth 1 -mtime "+$EXPIRE_DAYS" -delete
		update_munin_files
		;;
	help|--help)
		echo "Syntax:  $0  { update-all | update-unused | remove-outdated }"
		echo
		;;
	*)
		"$0" help >&2
		exit 1
		;;
esac
