From b885721fa0bc40496216e7f2a1f86ff26f736989 Mon Sep 17 00:00:00 2001 From: Jean-Michel Lacroix Date: Tue, 10 Nov 2015 15:13:52 -0500 Subject: [PATCH] bandwidthd: Addition of a variant of the bandwidthd package. Addition of the bandwidthd-pgsql package variant that can save also in a postgres database. Modification of bandwidthd.config to have the default IP address of an OpenWrt router (192.168.1.1) Addition of a small OpenWrt logo in the logo.gif Compile tested on CC and trunk (ar71xx and mvebu in both cases) run tested on CC (ar71xx) and trunk (r47397 on mvebu) Signed-off-by: Jean-Michel Lacroix --- utils/bandwidthd/Makefile | 67 ++++++++++++- .../bandwidthd/files/bandwidthd-pgsql.config | 13 +++ utils/bandwidthd/files/bandwidthd-pgsql.init | 90 ++++++++++++++++++ utils/bandwidthd/files/bandwidthd.config | 2 +- utils/bandwidthd/files/logo.gif | Bin 7573 -> 9431 bytes 5 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 utils/bandwidthd/files/bandwidthd-pgsql.config create mode 100644 utils/bandwidthd/files/bandwidthd-pgsql.init diff --git a/utils/bandwidthd/Makefile b/utils/bandwidthd/Makefile index 6ef14e52b..6cbace921 100644 --- a/utils/bandwidthd/Makefile +++ b/utils/bandwidthd/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=bandwidthd PKG_VERSION:=2.0.1 -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz PKG_SOURCE_URL:=@SF/bandwidthd @@ -18,22 +18,50 @@ PKG_MD5SUM:=aa79aad7bd489fd2cae1f7dc086ca8b6 PKG_MAINTAINER:=Jean-Michel Lacroix PKG_LICENSE:=GPL-2.0 -PKG_LICENSE_FILES:= + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) include $(INCLUDE_DIR)/package.mk -define Package/bandwidthd +define Package/bandwidthd/Default SECTION:=utils CATEGORY:=Utilities TITLE:=Bandwidthd URL:=http://bandwidthd.sourceforge.net/ +endef + +define Package/bandwidthd +$(call Package/bandwidthd/Default) + TITLE += (without postgresql) + VARIANT:=no-pgsql DEPENDS:=+libgd +libpcap endef +define Package/bandwidthd-pgsql +$(call Package/bandwidthd/Default) + TITLE += (with postgresql enabled) + VARIANT:=pgsql + DEPENDS:=+libgd +libpcap +libpq +endef + +define Package/bandwidthd/description + A bandwidthd tracking utility. +endef + +define Package/bandwidthd-pgsql/description +$(call Package/bandwidthd/description) +With the ability to store in a postgresql database. +endef + define Package/bandwidthd/daemon This package contains bandwidthd a bandwith tracking utility. endef +define Package/bandwidthd-pgsql/daemon + This package contains bandwidthd a bandwith tracking utility. +endef + +ifeq ($(BUILD_VARIANT),no-pgsql) CONFIGURE_ARGS += \ ac_cv_file__sw_lib=no \ ac_cv_file__sw_include=no \ @@ -41,7 +69,18 @@ CONFIGURE_ARGS += \ ac_cv_file__usr_pkg_include=no \ ac_cv_file__usr_local_pgsql_lib=no \ ac_cv_file__usr_local_pgsql_include=no \ - ac_cv_lib_pq_PQconnectdb=no \ + ac_cv_lib_pq_PQconnectdb=no +endif + +ifeq ($(BUILD_VARIANT),pgsql) +CONFIGURE_ARGS += \ + ac_cv_file__sw_lib=no \ + ac_cv_file__sw_include=no \ + ac_cv_file__usr_pkg_lib=no \ + ac_cv_file__usr_pkg_include=no \ + ac_cv_file__usr_local_pgsql_lib=no \ + ac_cv_file__usr_local_pgsql_include=no +endif EXTRA_CFLAGS+= $(TARGET_CPPFLAGS) EXTRA_LDFLAGS+= $(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib @@ -58,8 +97,28 @@ define Package/bandwidthd/install $(INSTALL_DATA) $(PKG_BUILD_DIR)/htdocs/logo.gif $(1)/www/ endef +define Package/bandwidthd-pgsql/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bandwidthd $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/bandwidthd-pgsql.config $(1)/etc/config/bandwidthd + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/bandwidthd-pgsql.init $(1)/etc/init.d/bandwidthd + $(INSTALL_DIR) $(1)/www/phphtdocs + $(INSTALL_DATA) $(PKG_BUILD_DIR)/htdocs/legend.gif $(1)/www/ + $(INSTALL_DATA) ./files/logo.gif $(1)/www/ + $(INSTALL_DIR) $(1)/usr/share/postgresql + $(INSTALL_DATA) $(PKG_BUILD_DIR)/schema.postgresql $(1)/usr/share/postgresql + $(INSTALL_BIN) $(PKG_BUILD_DIR)/phphtdocs/bd_pgsql_purge.sh $(1)/usr/share/postgresql +endef + define Package/bandwidthd/conffiles /etc/config/bandwidthd endef +define Package/bandwidthd-pgsql/conffiles +/etc/config/bandwidthd +endef + $(eval $(call BuildPackage,bandwidthd)) +$(eval $(call BuildPackage,bandwidthd-pgsql)) diff --git a/utils/bandwidthd/files/bandwidthd-pgsql.config b/utils/bandwidthd/files/bandwidthd-pgsql.config new file mode 100644 index 000000000..0f8768792 --- /dev/null +++ b/utils/bandwidthd/files/bandwidthd-pgsql.config @@ -0,0 +1,13 @@ +config bandwidthd + option dev br-lan + option subnets "192.168.1.0/24" + option skip_intervals 0 + option graph_cutoff 1024 + option promiscuous true + option output_cdf false + option recover_cdf false + option filter ip + option graph true + option meta_refresh 150 + option disabled_pgsql_connect_string "user = postgres dbname = bandwidthd host = 192.168.1.1" + option disabled_sensor_id "openwrt.mydomain.domain" diff --git a/utils/bandwidthd/files/bandwidthd-pgsql.init b/utils/bandwidthd/files/bandwidthd-pgsql.init new file mode 100644 index 000000000..232fa0cb8 --- /dev/null +++ b/utils/bandwidthd/files/bandwidthd-pgsql.init @@ -0,0 +1,90 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2008-2015 OpenWrt.org + +START=99 + +config_cb() { + local cfg_type="$1" + local cfg_name="$2" + + case "$cfg_type" in + bandwidthd) + append cfgs "$cfg_name" + ;; + esac +} + +export_bool() { + local option="$1" + local section="$2" + local _loctmp + config_get_bool _loctmp "$section" "$option" + if [ -n "$_loctmp" ]; then + conffile="${conffile}$option " + if [ 1 -eq "$_loctmp" ]; then + conffile="${conffile}true" + else + conffile="${conffile}false" + fi + conffile="${conffile}\n" + fi +} + +export_number() { + local option="$1" + local section="$2" + local _loctmp + config_get _loctmp "$section" "$option" + if [ -n "$_loctmp" ]; then + conffile="${conffile}$option ${_loctmp}\n" + fi +} + +export_string() { + local option="$1" + local section="$2" + local _loctmp + config_get _loctmp "$section" "$option" + if [ -n "$_loctmp" ]; then + conffile="${conffile}$option \"${_loctmp}\"\n" + fi +} + +start() { + local subnet conffile + + [ -d /tmp/bandwidthd ] || mkdir -p /tmp/bandwidthd && cp /www/legend.gif /www/logo.gif /tmp/bandwidthd/ + [ -e /htdocs ] || ln -s /tmp/bandwidthd /htdocs + [ -e /www/bandwidthd ] || ln -s /tmp/bandwidthd /www/bandwidthd + rm -f /tmp/bandwidthd.conf + touch /tmp/bandwidthd.conf + [ -e /etc/bandwidthd.conf ] || ln -s /tmp/bandwidthd.conf /etc/bandwidthd.conf + + + config_load bandwidthd + for cfg in $cfgs; do + config_get subnets $cfg subnets + for subnet in $subnets; do + conffile="${conffile}subnet ${subnet}\n" + done + export_string dev $cfg + export_number skip_intervals $cfg + export_number graph_cutoff $cfg + export_bool promiscuous $cfg + export_bool output_cdf $cfg + export_bool recover_cdf $cfg + export_string filter $cfg + export_bool graph $cfg + export_number meta_refresh $cfg + export_string pgsql_connect_string $cfg + export_string sensor_id $cfg + [ -n "$conffile" ] && echo -e "$conffile" >>/tmp/bandwidthd.conf + unset conffile + done + cd / + service_start /usr/sbin/bandwidthd +} + +stop() { + service_stop /usr/sbin/bandwidthd +} diff --git a/utils/bandwidthd/files/bandwidthd.config b/utils/bandwidthd/files/bandwidthd.config index 4bb18cf92..0769b1c8e 100644 --- a/utils/bandwidthd/files/bandwidthd.config +++ b/utils/bandwidthd/files/bandwidthd.config @@ -1,6 +1,6 @@ config bandwidthd option dev br-lan - option subnets "192.168.0.0/16 10.0.0.0/8 172.16.0.0/12" + option subnets "192.168.1.0/24" option skip_intervals 0 option graph_cutoff 1024 option promiscuous true diff --git a/utils/bandwidthd/files/logo.gif b/utils/bandwidthd/files/logo.gif index 7b17cc6cbc70b45aa4b21bcf6bb3f6d6462760e7..2ffec5605b72c48f49d8ee3dc069e80baccd6aa7 100644 GIT binary patch delta 8668 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 delta 6795 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