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_DIR) $(1)/etc/hotplug.d/iface
|
||||
$(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
|
||||
|
||||
$(eval $(call BuildPackage,apinger))
|
||||
$(eval $(call BuildPackage,apinger-rrd))
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
START=80
|
||||
USE_PROCD=1
|
||||
BIN=/usr/sbin/apinger
|
||||
APINGER_RRD=/apinger/rrd
|
||||
|
||||
. /lib/functions/network.sh
|
||||
|
||||
|
@ -36,7 +38,7 @@ 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
|
||||
local alarm_down alarm_delay alarm_loss alarms rrd
|
||||
|
||||
config_get interface "$target" interface wan
|
||||
[ "$interface" != "$instance" ] && return 0
|
||||
|
@ -49,6 +51,7 @@ append_target() {
|
|||
config_get alarm_down "$target" alarm_down
|
||||
config_get alarm_delay "$target" alarm_delay
|
||||
config_get alarm_loss "$target" alarm_loss
|
||||
config_get_bool rrd "$target" rrd 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_delay_samples" ] && append_config_line "avg_loss_delay_samples ${avg_loss_delay_samples}"
|
||||
[ -n "$alarms" ] && append_config_line "alarms override ${alarms}"
|
||||
[ "$rrd" = "1" ] && append_config_line "rrd file \"$APINGER_RRD/apinger-target-$target.rrd\""
|
||||
|
||||
close_config_block
|
||||
write_config_block
|
||||
|
@ -125,13 +129,14 @@ append_alarm_loss() {
|
|||
}
|
||||
|
||||
init_apinger_config() {
|
||||
local debug status_interval instance
|
||||
local debug status_interval rrd_interval instance
|
||||
instance=$1
|
||||
|
||||
config_get_bool debug apinger debug 0
|
||||
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_status_file
|
||||
|
@ -141,6 +146,8 @@ user "root"
|
|||
group "root"
|
||||
debug ${debug}
|
||||
|
||||
rrd interval ${rrd_interval}s
|
||||
|
||||
status {
|
||||
scriptformat on
|
||||
file "$STATUS_FILE"
|
||||
|
@ -185,9 +192,8 @@ start_instance() {
|
|||
config_foreach append_target target
|
||||
|
||||
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 stdout 1
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
|
@ -196,6 +202,8 @@ start_service() {
|
|||
|
||||
config_load apinger
|
||||
|
||||
[ ! -d "$APINGER_RRD" ] && mkdir -p "$APINGER_RRD"
|
||||
|
||||
if [ -n "$instance" ]; then
|
||||
start_instance "$instance"
|
||||
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
|
||||
|
||||
[ "$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