apinger: add rrd graph support
- add package apinger-rrd for RRD graphs - add RPC to get an overview and update graphs - fix interface hotplug to restart apinger instance - add patch to split alarms list in the status Signed-off-by: Jaymin Patel <jem.patel@gmail.com>
This commit is contained in:
parent
d1ba399006
commit
4281b7639c
6 changed files with 207 additions and 6 deletions
|
@ -65,7 +65,27 @@ define Package/apinger/install
|
||||||
$(INSTALL_DATA) ./files/user.hotplug $(1)/etc/hotplug.d/apinger/01-user
|
$(INSTALL_DATA) ./files/user.hotplug $(1)/etc/hotplug.d/apinger/01-user
|
||||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
|
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
|
||||||
$(INSTALL_DATA) ./files/iface.hotplug $(1)/etc/hotplug.d/iface/25-apinger
|
$(INSTALL_DATA) ./files/iface.hotplug $(1)/etc/hotplug.d/iface/25-apinger
|
||||||
|
$(INSTALL_DIR) $(1)/usr/libexec/rpcd
|
||||||
|
$(INSTALL_BIN) ./files/apinger.rpc $(1)/usr/libexec/rpcd/apinger
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/apinger-rrd
|
||||||
|
SECTION:=net
|
||||||
|
CATEGORY:=Network
|
||||||
|
DEPENDS:=+apinger +rrdtool1 +rrdcgi1
|
||||||
|
TITLE:=Apinger RRD Graphs
|
||||||
|
URL:=https://github.com/Jajcus/apinger
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/apinger-rrd/description
|
||||||
|
Generate RRD Graphs from Apinger Data
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/apinger-rrd/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/libexec/apinger/rpc
|
||||||
|
$(INSTALL_DATA) ./files/graphs.sh $(1)/usr/libexec/apinger/rpc
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,apinger))
|
$(eval $(call BuildPackage,apinger))
|
||||||
|
$(eval $(call BuildPackage,apinger-rrd))
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
START=80
|
START=80
|
||||||
USE_PROCD=1
|
USE_PROCD=1
|
||||||
|
BIN=/usr/sbin/apinger
|
||||||
|
APINGER_RRD=/apinger/rrd
|
||||||
|
|
||||||
. /lib/functions/network.sh
|
. /lib/functions/network.sh
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ append_target() {
|
||||||
local target=$1
|
local target=$1
|
||||||
local interface address probe_interval srcip
|
local interface address probe_interval srcip
|
||||||
local avg_delay_samples avg_loss_samples avg_loss_delay_samples
|
local avg_delay_samples avg_loss_samples avg_loss_delay_samples
|
||||||
local alarm_down alarm_delay alarm_loss alarms
|
local alarm_down alarm_delay alarm_loss alarms rrd
|
||||||
|
|
||||||
config_get interface "$target" interface wan
|
config_get interface "$target" interface wan
|
||||||
[ "$interface" != "$instance" ] && return 0
|
[ "$interface" != "$instance" ] && return 0
|
||||||
|
@ -49,6 +51,7 @@ append_target() {
|
||||||
config_get alarm_down "$target" alarm_down
|
config_get alarm_down "$target" alarm_down
|
||||||
config_get alarm_delay "$target" alarm_delay
|
config_get alarm_delay "$target" alarm_delay
|
||||||
config_get alarm_loss "$target" alarm_loss
|
config_get alarm_loss "$target" alarm_loss
|
||||||
|
config_get_bool rrd "$target" rrd 0
|
||||||
|
|
||||||
[ -z "$address" ] && return 0
|
[ -z "$address" ] && return 0
|
||||||
|
|
||||||
|
@ -69,6 +72,7 @@ append_target() {
|
||||||
[ -n "$avg_loss_samples" ] && append_config_line "avg_loss_samples ${avg_loss_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 "$avg_loss_delay_samples" ] && append_config_line "avg_loss_delay_samples ${avg_loss_delay_samples}"
|
||||||
[ -n "$alarms" ] && append_config_line "alarms override ${alarms}"
|
[ -n "$alarms" ] && append_config_line "alarms override ${alarms}"
|
||||||
|
[ "$rrd" = "1" ] && append_config_line "rrd file \"$APINGER_RRD/apinger-target-$target.rrd\""
|
||||||
|
|
||||||
close_config_block
|
close_config_block
|
||||||
write_config_block
|
write_config_block
|
||||||
|
@ -125,13 +129,14 @@ append_alarm_loss() {
|
||||||
}
|
}
|
||||||
|
|
||||||
init_apinger_config() {
|
init_apinger_config() {
|
||||||
local debug status_interval instance
|
local debug status_interval rrd_interval instance
|
||||||
instance=$1
|
instance=$1
|
||||||
|
|
||||||
config_get_bool debug apinger debug 0
|
config_get_bool debug apinger debug 0
|
||||||
config_get status_interval apinger status_interval 1
|
config_get status_interval apinger status_interval 1
|
||||||
|
config_get rrd_interval apinger rrd_interval 30
|
||||||
|
|
||||||
[ "$debug" == "1" ] && debug=on || debug=off
|
[ "$debug" = "1" ] && debug=on || debug=off
|
||||||
|
|
||||||
set_config_file
|
set_config_file
|
||||||
set_status_file
|
set_status_file
|
||||||
|
@ -141,6 +146,8 @@ user "root"
|
||||||
group "root"
|
group "root"
|
||||||
debug ${debug}
|
debug ${debug}
|
||||||
|
|
||||||
|
rrd interval ${rrd_interval}s
|
||||||
|
|
||||||
status {
|
status {
|
||||||
scriptformat on
|
scriptformat on
|
||||||
file "$STATUS_FILE"
|
file "$STATUS_FILE"
|
||||||
|
@ -185,9 +192,8 @@ start_instance() {
|
||||||
config_foreach append_target target
|
config_foreach append_target target
|
||||||
|
|
||||||
procd_open_instance "$instance"
|
procd_open_instance "$instance"
|
||||||
procd_set_param command /usr/sbin/apinger -f -c $CONFIG_FILE
|
procd_set_param command $BIN -f -c $CONFIG_FILE
|
||||||
procd_set_param stderr 1
|
procd_set_param stderr 1
|
||||||
procd_set_param stdout 1
|
|
||||||
procd_close_instance
|
procd_close_instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +202,8 @@ start_service() {
|
||||||
|
|
||||||
config_load apinger
|
config_load apinger
|
||||||
|
|
||||||
|
[ ! -d "$APINGER_RRD" ] && mkdir -p "$APINGER_RRD"
|
||||||
|
|
||||||
if [ -n "$instance" ]; then
|
if [ -n "$instance" ]; then
|
||||||
start_instance "$instance"
|
start_instance "$instance"
|
||||||
else
|
else
|
||||||
|
|
117
net/apinger/files/apinger.rpc
Normal file
117
net/apinger/files/apinger.rpc
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /usr/share/libubox/jshn.sh
|
||||||
|
|
||||||
|
RPC_SCRIPTS=/usr/libexec/apinger/rpc
|
||||||
|
|
||||||
|
[ -d $RPC_SCRIPTS ] && include $RPC_SCRIPTS
|
||||||
|
|
||||||
|
__function__() {
|
||||||
|
type "$1" > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach_extra() {
|
||||||
|
local file obj
|
||||||
|
|
||||||
|
[ ! -d $RPC_SCRIPTS ] && return
|
||||||
|
|
||||||
|
for file in $RPC_SCRIPTS/*; do
|
||||||
|
obj="${file##*/}"
|
||||||
|
$1 "${obj%%.*}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
apinger_status() {
|
||||||
|
interface_list() {
|
||||||
|
append iface_list $1
|
||||||
|
}
|
||||||
|
config_load apinger
|
||||||
|
config_foreach interface_list interface
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_array targets
|
||||||
|
|
||||||
|
for iface in $iface_list; do
|
||||||
|
local status_file="/var/run/apinger-$iface.status"
|
||||||
|
|
||||||
|
if [ -f "$status_file" ]; then
|
||||||
|
_IFS="$IFS"
|
||||||
|
IFS="|"
|
||||||
|
while read -r address srcip target received sent timestamp latency loss alarm; do
|
||||||
|
json_add_object targets
|
||||||
|
json_add_string interface "$iface"
|
||||||
|
json_add_string target "$target"
|
||||||
|
json_add_string address "$address"
|
||||||
|
json_add_string srcip "$srcip"
|
||||||
|
json_add_int sent "$sent"
|
||||||
|
json_add_int received "$received"
|
||||||
|
json_add_string latency "$latency"
|
||||||
|
json_add_string loss "$loss"
|
||||||
|
json_add_string alarm "$alarm"
|
||||||
|
json_add_int timestamp "$timestamp"
|
||||||
|
json_close_object
|
||||||
|
done < "$status_file"
|
||||||
|
IFS="$_IFS"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
json_close_array
|
||||||
|
json_dump
|
||||||
|
}
|
||||||
|
|
||||||
|
call_extra() {
|
||||||
|
if __function__ "$1"; then
|
||||||
|
$1
|
||||||
|
else
|
||||||
|
json_init
|
||||||
|
json_add_string error "invalid call $1"
|
||||||
|
json_dump
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
call_method() {
|
||||||
|
case "$1" in
|
||||||
|
status)
|
||||||
|
apinger_status
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
call_extra $1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
list_extra() {
|
||||||
|
if __function__ "${1}_help"; then
|
||||||
|
${1}_help
|
||||||
|
else
|
||||||
|
json_add_object "$1"
|
||||||
|
json_close_object
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
list_methods() {
|
||||||
|
local file
|
||||||
|
|
||||||
|
json_init
|
||||||
|
|
||||||
|
json_add_object status
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
foreach_extra list_extra ${1}
|
||||||
|
|
||||||
|
json_dump
|
||||||
|
}
|
||||||
|
|
||||||
|
main () {
|
||||||
|
case "$1" in
|
||||||
|
list)
|
||||||
|
list_methods
|
||||||
|
;;
|
||||||
|
call)
|
||||||
|
call_method $2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
44
net/apinger/files/graphs.sh
Normal file
44
net/apinger/files/graphs.sh
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /usr/share/libubox/jshn.sh
|
||||||
|
|
||||||
|
APINGER="/usr/sbin/apinger"
|
||||||
|
RRDCGI="/www/cgi-bin/apinger"
|
||||||
|
GRAPH_DIR="/apinger/graphs"
|
||||||
|
WWW_LOCATION="/www${GRAPH_DIR}"
|
||||||
|
|
||||||
|
update_interface_graphs() {
|
||||||
|
local iface cfg cmd
|
||||||
|
|
||||||
|
iface=$1
|
||||||
|
cfg=/var/run/apinger-$iface.conf
|
||||||
|
|
||||||
|
[ ! -f $cfg ] && return
|
||||||
|
|
||||||
|
cmd="$APINGER -c $cfg -g $WWW_LOCATION -l $GRAPH_DIR"
|
||||||
|
|
||||||
|
if [ -x $RRDCGI ]; then
|
||||||
|
$cmd 2>/dev/null | sed -e '/\(HTML\|TITLE\|H1\|H2\|by\|^#\)/d' >> $RRDCGI
|
||||||
|
else
|
||||||
|
$cmd 2>/dev/null | sed -e '/\(HTML\|TITLE\|H1\|H2\|by\)/d' > $RRDCGI
|
||||||
|
chmod 755 $RRDCGI
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
update_graphs() {
|
||||||
|
[ ! -d $WWW_LOCATION ] && mkdir -p $WWW_LOCATION
|
||||||
|
[ -e $RRDCGI ] && rm -f $RRDCGI
|
||||||
|
|
||||||
|
config_load apinger
|
||||||
|
config_foreach update_interface_graphs interface
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_string rrdcgi "$RRDCGI"
|
||||||
|
json_dump
|
||||||
|
}
|
||||||
|
|
||||||
|
graphs_help() {
|
||||||
|
json_add_object update_graphs
|
||||||
|
json_close_object
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
[ "$(uci_get apinger $INTERFACE)" == "interface" ] || exit 0
|
[ "$(uci_get apinger $INTERFACE)" == "interface" ] || exit 0
|
||||||
|
|
||||||
[ "$ACTION" = "ifup" ] && {
|
[ "$ACTION" = "ifup" ] && {
|
||||||
/etc/init.d/apinger $INTERFACE restart
|
/etc/init.d/apinger restart $INTERFACE
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
12
net/apinger/patches/060-format-alarm-list.patch
Normal file
12
net/apinger/patches/060-format-alarm-list.patch
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
--- a/src/apinger.c
|
||||||
|
+++ b/src/apinger.c
|
||||||
|
@@ -860,6 +860,9 @@ char *buf1,*buf2;
|
||||||
|
a=al->alarm;
|
||||||
|
if(config->status_format){
|
||||||
|
fprintf(f,"%s",a->name);
|
||||||
|
+ if(al->next){
|
||||||
|
+ fprintf(f,",");
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
fprintf(f," \"%s\"",a->name);
|
Loading…
Reference in a new issue