diff --git a/package/bpfcountd/Makefile b/package/bpfcountd/Makefile new file mode 100644 index 00000000..f6b97c2e --- /dev/null +++ b/package/bpfcountd/Makefile @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: MIT +# Copyright (C) 2022 Linus Lüssing + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bpfcountd +PKG_RELEASE:=1 + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_DATE:=2021-06-26 +PKG_SOURCE_URL=https://github.com/lemoer/bpfcountd.git +PKG_SOURCE_VERSION:=8b1aeb18d686815f93e2bfe976e536c5699d6371 +PKG_MIRROR_HASH:=e6e7adcc11c0fd33c6d3ac31423d3288812270944c2f31d9610ac8c3173a8c5f + +PKG_MAINTAINER:=Linus Lüssing +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk + +define Package/bpfcountd + SECTION:=net + CATEGORY:=Network + TITLE:=Berkeley Packet Filter Counting Daemon + DEPENDS:=+libpcap +endef + +define Package/bpfcountd/description + bpfcountd was created to obtain packet statistics in larger networks + without stressing the cpu resources. bpfcountd will count the amount + of packages and bytes over time (for each defined rule). The rules + are defined using the tcpdump filter syntax (bpf). The collected + data is provided on a unix socket in plaintext. +endef + +define Package/bpfcountd/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bpfcountd $(1)/usr/sbin/ + $(CP) ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,bpfcountd)) diff --git a/package/bpfcountd/files/etc/bpfcountd.filters b/package/bpfcountd/files/etc/bpfcountd.filters new file mode 100644 index 00000000..8c1029a2 --- /dev/null +++ b/package/bpfcountd/files/etc/bpfcountd.filters @@ -0,0 +1,2 @@ +arp;arp +icmp6;icmp6 diff --git a/package/bpfcountd/files/etc/config/bpfcountd b/package/bpfcountd/files/etc/config/bpfcountd new file mode 100644 index 00000000..790de16c --- /dev/null +++ b/package/bpfcountd/files/etc/config/bpfcountd @@ -0,0 +1,13 @@ +config bpfcountd 'eth0_in' + option ifname 'eth0' + option prefilter 'inbound' + option filterfile '/etc/bpfcountd.filters' + option buffersize '2097152' + option disabled '1' + +config bpfcountd 'eth0_out' + option ifname 'eth0' + option prefilter 'outbound' + option filterfile '/etc/bpfcountd.filters' + option buffersize '2097152' + option disabled '1' diff --git a/package/bpfcountd/files/etc/init.d/bpfcountd b/package/bpfcountd/files/etc/init.d/bpfcountd new file mode 100755 index 00000000..2db2a4ba --- /dev/null +++ b/package/bpfcountd/files/etc/init.d/bpfcountd @@ -0,0 +1,92 @@ +#!/bin/sh /etc/rc.common +# SPDX-License-Identifier: MIT +# Copyright (C) 2022 Linus Lüssing + +USE_PROCD=1 +START=20 +STOP=90 + +UNIXSOCKDIR=/var/run/bpfcountd + +bpfcountd_start() { + local cfg="$1" + local disabled + + local ifname + local prefilter + local filterfile + local buffersize + + config_get_bool disabled "$cfg" disabled 0 + [ "$disabled" -gt 0 ] && return 0 + + mkdir -p "$UNIXSOCKDIR" + + config_get ifname "$cfg" "ifname" + config_get prefilter "$cfg" "prefilter" + config_get filterfile "$cfg" "filterfile" + config_get buffersize "$cfg" "buffersize" + + [ -z "$ifname" ] && { + echo "Error: no ifname specified for $cfg" >&2 + return 0 + } + [ -z "$filterfile" ] && { + echo "Error: no filterfile specified for $cfg" >&2 + return 0 + } + + procd_open_instance "$cfg" + + procd_set_param command /usr/sbin/bpfcountd + procd_append_param command -i "$ifname" + procd_append_param command -f "$filterfile" + procd_append_param command -u $UNIXSOCKDIR/"$cfg".sock + [ -n "$prefilter" ] && procd_append_param command -F "$prefilter" + [ -n "$buffersize" ] && procd_append_param command -b "$buffersize" + + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + + procd_set_param stderr 1 + procd_close_instance +} + +start_service() { + local cfg="$1" + local instance_found=0 + + . /lib/functions/network.sh + + config_cb() { + local type="$1" + local name="$2" + if [ "$type" = "bpfcountd" ]; then + if [ -n "$cfg" -a "$cfg" = "$name" ]; then + instance_found=1 + fi + fi + } + + config_load bpfcountd + + if [ -n "$cfg" ]; then + [ "$instance_found" -gt 0 ] || return + bpfcountd_start "$cfg" + else + config_foreach bpfcountd_start bpfcountd + fi +} + +stop_service() { + local cfg="$1" + + if [ -n "$cfg" ]; then + rm $UNIXSOCKDIR/$cfg.sock + else + rm $UNIXSOCKDIR/*.sock + fi +} + +service_triggers() { + procd_add_reload_trigger bpfcountd +}