diff options
author | Jaymin Patel <jem.patel@gmail.com> | 2022-07-06 15:15:59 +0530 |
---|---|---|
committer | Jaymin Patel <jem.patel@gmail.com> | 2022-07-12 12:27:05 +0530 |
commit | e4e3206f3283e673bfac717e00332deb8dd2c079 (patch) | |
tree | d3e9a2ed5670eafcf89e1fbad12c4774741325c4 /net/apinger/files | |
parent | 797945dfaa0e7de8d6b0ada472bda63bb27f0cdc (diff) |
apinger: improve uci and procd support
- convert apinger into procd instances
- generate instance specific apinger.conf from uci
- hotplug handling for apinger alarms
- restart apinger interface instance on ifup action of interface
- don't exit on packet count mismatch, allows to use apinger as monitor
for multiple targets handling
- add srcip option to target configuration, allows specifying source ip
used to monitor target
- allow creating status file in script parseable format
Patches are ported against latest version of apinger and referenced from
https://git.pld-linux.org/?p=packages/apinger.git;a=summary
Signed-off-by: Jaymin Patel <jem.patel@gmail.com>
Diffstat (limited to 'net/apinger/files')
-rw-r--r-- | net/apinger/files/apinger-hotplug | 22 | ||||
-rw-r--r-- | net/apinger/files/apinger.config | 28 | ||||
-rw-r--r-- | net/apinger/files/apinger.init | 230 | ||||
-rw-r--r-- | net/apinger/files/iface.hotplug | 12 | ||||
-rw-r--r-- | net/apinger/files/user.hotplug | 7 |
5 files changed, 292 insertions, 7 deletions
diff --git a/net/apinger/files/apinger-hotplug b/net/apinger/files/apinger-hotplug new file mode 100644 index 000000000..70a29daf7 --- /dev/null +++ b/net/apinger/files/apinger-hotplug @@ -0,0 +1,22 @@ +#!/bin/sh + +usage_help() +{ + echo "$0 <action> <instance> <target> <srcip> <target_desc> <alarm> <alarmtype> <reason> <send> <recieved> <loss> <delay> <timestamp>" +} + +export ACTION=$1 +export INSTANCE=$2 +export APINGER_TARGET=$3 +export APINGER_SRCIP=$4 +export APINGER_TARGET_ID=$5 +export APINGER_ALARM=$6 +export APINGER_ALARM_TYPE=$7 +export APINGER_ALARM_MESSAGE=$8 +export APINGER_PROBES_SENT=$9 +export APINGER_PROBES_RECEIVED=${10} +export APINGER_LOSS=${11} +export APINGER_DELAY=${12} +export APINGER_TIMESTAMP=${13} + +exec /sbin/hotplug-call apinger $@ diff --git a/net/apinger/files/apinger.config b/net/apinger/files/apinger.config new file mode 100644 index 000000000..40190b3f5 --- /dev/null +++ b/net/apinger/files/apinger.config @@ -0,0 +1,28 @@ +config interface 'wan' + option debug '0' + option status_interval '5' + +#config interface 'wan2' +# option debug '0' +# option status_interval '5' + +# delay is in ms +#config alarm_delay 'delay200' +# option delay_low '100' +# option delay_high '200' + +# loss is in % +#config alarm_loss 'loss50' +# option percent_low '30' +# option percent_high '50' + +#config target 'target1' +# option interface 'wan' +# option address '8.8.8.8' +# option alarm_delay 'a1' +# option alarm_loss 'loss50' +# option probe_interval '5' + +#config target 'target2' +# option interface 'wan2' +# option address '8.8.8.8' diff --git a/net/apinger/files/apinger.init b/net/apinger/files/apinger.init index 8caac3869..51999880c 100644 --- a/net/apinger/files/apinger.init +++ b/net/apinger/files/apinger.init @@ -2,17 +2,233 @@ # Copyright (C) 2006-2011 OpenWrt.org START=80 +USE_PROCD=1 -SERVICE_USE_PID=1 +. /lib/functions/network.sh -start() { - service_start /usr/sbin/apinger +set_config_file() { + export CONFIG_FILE="/var/run/apinger-$instance.conf" } -stop() { - service_stop /usr/sbin/apinger +set_status_file() { + export STATUS_FILE="/var/run/apinger-$instance.status" } -reload() { - service_reload /usr/sbin/apinger +write_config_block() { + local cfg_var="CONFIG_BLOCK_$instance" + eval echo -e "\$$cfg_var" >> "$CONFIG_FILE" +} + +start_config_block() { + eval "export CONFIG_BLOCK_$instance=''" + append CONFIG_BLOCK_$instance "$* {" "\n" +} + +close_config_block() { + append CONFIG_BLOCK_$instance "}" "\n" +} + +append_config_line() { + append CONFIG_BLOCK_$instance "\t$*" "\n" +} + +append_target() { + local target=$1 + local interface address probe_interval srcip + local avg_delay_samples avg_loss_samples avg_loss_delay_samples + local alarm_down alarm_delay alarm_loss alarms + + config_get interface "$target" interface wan + [ "$interface" != "$instance" ] && return 0 + + config_get address "$target" address + config_get probe_interval "$target" probe_interval + config_get avg_delay_samples "$target" avg_delay_samples + config_get avg_loss_samples "$target" avg_loss_samples + config_get avg_loss_delay_samples "$target" avg_loss_delay_samples + config_get alarm_down "$target" alarm_down + config_get alarm_delay "$target" alarm_delay + config_get alarm_loss "$target" alarm_loss + + [ -z "$address" ] && return 0 + + srcip=$(uci_get network "$interface" ipaddr) + [ -z "$srcip" ] && network_get_ipaddr srcip "$interface" + srcip="${srcip:-0.0.0.0}" + + alarms=${alarm_down:+\"${alarm_down}\"} + alarms=${alarm_delay:+${alarms:+${alarms}, }}${alarm_delay:+\"${alarm_delay}\"} + alarms=${alarm_loss:+${alarms:+${alarms}, }}${alarm_loss:+\"${alarm_loss}\"} + + start_config_block "target \"$address\"" + append_config_line "srcip \"$srcip\"" + append_config_line "description \"$target\"" + + [ -n "$probe_interval" ] && append_config_line "interval ${probe_interval}s" + [ -n "$avg_delay_samples" ] && append_config_line "avg_delay_samples ${avg_delay_samples}" + [ -n "$avg_loss_samples" ] && append_config_line "avg_loss_samples ${avg_loss_samples}" + [ -n "$avg_loss_delay_samples" ] && append_config_line "avg_loss_delay_samples ${avg_loss_delay_samples}" + [ -n "$alarms" ] && append_config_line "alarms override ${alarms}" + + close_config_block + write_config_block +} + +append_alarm_down() { + local alarm=$1 + local time + + config_get time "$alarm" time 5 + + [ -z "$time" ] && return + + start_config_block "alarm down \"$alarm\"" + append_config_line "time ${time}s" + close_config_block + write_config_block +} + +append_alarm_delay() { + local alarm=$1 + local delay_low delay_high + + config_get delay_low "$alarm" delay_low + config_get delay_high "$alarm" delay_high + + if [ -z "$delay_low" ] || [ -z "$delay_high" ]; then + return + fi + + start_config_block "alarm delay \"$alarm\"" + append_config_line "delay_low ${delay_low}ms" + append_config_line "delay_high ${delay_high}ms" + close_config_block + write_config_block +} + +append_alarm_loss() { + local alarm=$1 + local percent_low percent_high + + config_get percent_low "$alarm" percent_low + config_get percent_high "$alarm" percent_low + + if [ -z "$percent_low" ] || [ -z "$percent_high" ]; then + return + fi + + start_config_block "alarm loss \"$alarm\"" + append_config_line "percent_low ${percent_low}" + append_config_line "percent_high ${percent_high}" + close_config_block + write_config_block +} + +init_apinger_config() { + local debug status_interval instance + instance=$1 + + config_get_bool debug apinger debug 0 + config_get status_interval apinger status_interval 1 + + [ "$debug" == "1" ] && debug=on || debug=off + + set_config_file + set_status_file + + cat << EOF > "$CONFIG_FILE" +user "root" +group "root" +debug ${debug} + +status { + scriptformat on + file "$STATUS_FILE" + interval ${status_interval}s +} +alarm down "down" { + time 30s +} +alarm delay "delay" { + delay_low 5ms + delay_high 20ms +} +alarm loss "loss" { + percent_low 3 + percent_high 5 +} +alarm default { + command on "/usr/libexec/apinger-hotplug up $instance '%t' '%i' '%T' '%a' '%A' '%r' '%p' '%P' '%l' '%d' '%s'" + command off "/usr/libexec/apinger-hotplug down $instance '%t' '%i' '%T' '%a' '%A' '%r' '%p' '%P' '%l' '%d' '%s'" +} +target default { + interval 1s + avg_delay_samples 10 + avg_loss_samples 50 + avg_loss_delay_samples 20 + alarms "down", "delay", "loss" +} +EOF +} + +start_instance() { + export instance=$1 + + local enabled + config_get_bool enabled "$instance" enabled 1 + [ "$enabled" != "1" ] && return 0 + + init_apinger_config "$instance" + config_foreach append_alarm_down alarm_down + config_foreach append_alarm_delay alarm_delay + config_foreach append_alarm_loss alarm_loss + config_foreach append_target target + + procd_open_instance "$instance" + procd_set_param command /usr/sbin/apinger -f -c $CONFIG_FILE + procd_set_param stderr 1 + procd_set_param stdout 1 + procd_close_instance +} + +start_service() { + local instance=$1 + + config_load apinger + + if [ -n "$instance" ]; then + start_instance "$instance" + else + config_foreach start_instance interface + fi +} + +service_triggers() { + procd_add_reload_trigger apinger +} + +clean_instance() { + local instance=$1 + + set_config_file + set_status_file + + [ -e $CONFIG_FILE ] && rm -f $CONFIG_FILE + [ -e $STATUS_FILE ] && rm -f $STATUS_FILE +} + +service_stopped() { + local instance=$1 + + config_load apinger + + if [ -n "$instance" ]; then + clean_instance "$instance" + else + config_foreach clean_instance interface + fi +} + +reload_service() { + restart } diff --git a/net/apinger/files/iface.hotplug b/net/apinger/files/iface.hotplug new file mode 100644 index 000000000..6c1930f93 --- /dev/null +++ b/net/apinger/files/iface.hotplug @@ -0,0 +1,12 @@ +#!/bin/sh + +. /lib/functions.sh + +/etc/init.d/apinger enabled && { + [ "$(uci_get apinger $INTERFACE)" == "interface" ] || exit 0 + + [ "$ACTION" = "ifup" ] && { + /etc/init.d/apinger $INTERFACE restart + } + +} diff --git a/net/apinger/files/user.hotplug b/net/apinger/files/user.hotplug new file mode 100644 index 000000000..50bee5e69 --- /dev/null +++ b/net/apinger/files/user.hotplug @@ -0,0 +1,7 @@ +#!/bin/sh + +[ -e /etc/apinger.user ] && { + sh /etc/apinger.user +} + +exit 0 |