aboutsummaryrefslogtreecommitdiff
path: root/net/apinger/files
diff options
context:
space:
mode:
authorJaymin Patel <jem.patel@gmail.com>2022-07-06 15:15:59 +0530
committerJaymin Patel <jem.patel@gmail.com>2022-07-12 12:27:05 +0530
commite4e3206f3283e673bfac717e00332deb8dd2c079 (patch)
treed3e9a2ed5670eafcf89e1fbad12c4774741325c4 /net/apinger/files
parent797945dfaa0e7de8d6b0ada472bda63bb27f0cdc (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-hotplug22
-rw-r--r--net/apinger/files/apinger.config28
-rw-r--r--net/apinger/files/apinger.init230
-rw-r--r--net/apinger/files/iface.hotplug12
-rw-r--r--net/apinger/files/user.hotplug7
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