From 270be2f59e6c5f902a8fd4407d099b93ba15792b Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Wed, 4 Apr 2018 05:38:05 +0200 Subject: [PATCH] add new plugin "wireless_signal_ranges_" monitor an overview for an anonymous (and maybe varying) set of wireless peers --- .../wireless_signal_ranges_-day.png | Bin 0 -> 32260 bytes plugins/wifi/wireless_signal_ranges_ | 160 ++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 plugins/wifi/example-graphs/wireless_signal_ranges_-day.png create mode 100755 plugins/wifi/wireless_signal_ranges_ diff --git a/plugins/wifi/example-graphs/wireless_signal_ranges_-day.png b/plugins/wifi/example-graphs/wireless_signal_ranges_-day.png new file mode 100644 index 0000000000000000000000000000000000000000..830c710f4604bafdaf1003d5024c387efe55ff85 GIT binary patch literal 32260 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 literal 0 HcmV?d00001 diff --git a/plugins/wifi/wireless_signal_ranges_ b/plugins/wifi/wireless_signal_ranges_ new file mode 100755 index 00000000..f17029c6 --- /dev/null +++ b/plugins/wifi/wireless_signal_ranges_ @@ -0,0 +1,160 @@ +#!/bin/sh + +: << =cut + +=head1 NAME + +wireless_signal_ranges_ - Group and count all connected wifi peers by signal strength ranges + + +=head1 APPLICABLE SYSTEMS + +Information is parsed from the output of the tool "iwinfo" (OpenWrt) or "iw" (most systems). + +This plugin is suitable for wifi interfaces with a variable selection of peers (e.g. mobile +clients). + + +=head1 CONFIGURATION + +Symlink this plugin with the name of the wifi interface added (e.g. "wlan0"). + +Root permissions are probably required for accessing "iw". + + [wireless_signal_ranges_*] + user root + + +=head1 VERSION + + 1.1 + + +=head1 AUTHOR + +Lars Kruse + + +=head1 LICENSE + +GPLv3 or above + + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf suggest + +=cut + +set -eu + + +SCRIPT_PREFIX="wireless_signal_ranges_" + +# thresholds for signal quality ranges: ascending values +SIGNAL_THRESHOLDS="-88 -80 -60 0" + + +# prefer "iwinfo" for information retrieval, if it is available +if which iwinfo >/dev/null; then + # "iwinfo" has a stable output format but is only available on openwrt + get_wifi_interfaces() { iwinfo | grep "^[a-zA-Z]" | awk '{print $1}'; } + # return MAC of peer and the signal strength + get_wifi_peers() { iwinfo "$1" assoclist | grep "^[0-9a-fA-F]" | awk '{print $2}'; } +else + # "iw" is available everywhere - but its output format is not recommended for non-humans + get_wifi_interfaces() { iw dev | awk '{ if ($1 == "Interface") print $2; }'; } + get_wifi_peers() { iw dev wlan0 station dump \ + | awk '{ if (($1 == "signal") && ($2 == "avg:")) print $3}'; } +fi + + +clean_fieldname() { + echo "$1" | sed 's/^\([^A-Za-z_]\)/_\1/; s/[^A-Za-z0-9_]/_/g' +} + + +get_level_fieldname() { + echo "range_${1#-}" +} + + +get_wifi_device_from_suffix() { + local suffix + local real_dev + # pick the part after the basename of the real file + suffix=$(basename "$0" | sed "s/^$SCRIPT_PREFIX//") + for real_dev in $(get_wifi_interfaces); do + [ "$suffix" != "$(clean_fieldname "$real_dev")" ] || echo "$real_dev" + done | head -1 +} + + +do_config() { + local wifi + local lower + wifi=$(get_wifi_device_from_suffix) + [ -z "$wifi" ] && echo >&2 "Missing wifi: $wifi" && return 1 + echo "graph_title Wireless signal quality ranges - $wifi" + echo "graph_args --upper-limit 0" + echo "graph_vlabel Signal ranges" + echo "graph_category network" + echo "graph_info This graph shows numbers of peers with defined wifi signal ranges" + lower="noise" + for level in $SIGNAL_THRESHOLDS; do + fieldname=$(get_level_fieldname "$level") + echo "${fieldname}.label $lower...$level" + echo "${fieldname}.draw AREASTACK" + lower="$level" + done +} + + +do_fetch() { + local wifi + local peer_data + local previous_count + local current_count + local fieldname + wifi=$(get_wifi_device_from_suffix) + [ -z "$wifi" ] && echo >&2 "Missing wifi: $wifi" && return 1 + peer_data=$(get_wifi_peers "$wifi") + previous_count=0 + for level in $SIGNAL_THRESHOLDS; do + current_count=$(echo "$peer_data" | awk ' + BEGIN { count=0; } + { if (($1 != "") && ($1 <= '"$level"')) count++; } + END { print count; }') + fieldname=$(get_level_fieldname "$level") + echo "${fieldname}.value $((current_count - previous_count))" + previous_count="$current_count" + done +} + + +ACTION="${1:-}" + +case "$ACTION" in + config) + do_config || exit 1 + [ "${MUNIN_CAP_DIRTYCONFIG:-0}" = 1 ] && do_fetch + ;; + autoconf) + [ -z "$(get_wifi_interfaces)" ] && echo "no (no wifi interfaces found)" && exit 1 + echo "yes" + ;; + suggest) + get_wifi_interfaces | while read -r ifname; do + clean_fieldname "$ifname" + done + ;; + "") + do_fetch + ;; + *) + echo >&2 "Invalid action (valid: config / autoconf / suggest / )" + echo >&2 + exit 2 + ;; +esac