From eee89bf3a9197514526f3548fef5e5f9283280d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20L=C3=BCssing?= Date: Tue, 17 Aug 2021 05:23:04 +0200 Subject: [PATCH] bpfcountd: add initial package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. Signed-off-by: Linus Lüssing --- package/bpfcountd/Makefile | 42 +++++++++ package/bpfcountd/files/etc/bpfcountd.filters | 2 + package/bpfcountd/files/etc/config/bpfcountd | 13 +++ package/bpfcountd/files/etc/init.d/bpfcountd | 92 +++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 package/bpfcountd/Makefile create mode 100644 package/bpfcountd/files/etc/bpfcountd.filters create mode 100644 package/bpfcountd/files/etc/config/bpfcountd create mode 100755 package/bpfcountd/files/etc/init.d/bpfcountd 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 +}