aboutsummaryrefslogtreecommitdiffstats
path: root/net-mgmt
diff options
context:
space:
mode:
Diffstat (limited to 'net-mgmt')
-rw-r--r--net-mgmt/flow-tools/Makefile2
-rw-r--r--net-mgmt/flow-tools/files/flow_capture.in77
-rw-r--r--net-mgmt/flow-tools/files/patch-lib-ftfile.c100
3 files changed, 169 insertions, 10 deletions
diff --git a/net-mgmt/flow-tools/Makefile b/net-mgmt/flow-tools/Makefile
index d12a74f95505..eb40154a604a 100644
--- a/net-mgmt/flow-tools/Makefile
+++ b/net-mgmt/flow-tools/Makefile
@@ -7,7 +7,7 @@
PORTNAME= flow-tools
PORTVERSION= 0.68
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= net-mgmt
MASTER_SITES= ftp://ftp.eng.oar.net/pub/flow-tools/
diff --git a/net-mgmt/flow-tools/files/flow_capture.in b/net-mgmt/flow-tools/files/flow_capture.in
index f19ebfd05f12..cfbad2a35949 100644
--- a/net-mgmt/flow-tools/files/flow_capture.in
+++ b/net-mgmt/flow-tools/files/flow_capture.in
@@ -13,39 +13,98 @@
# Set to "NO" by default.
# flow_tools_datadir (str): Base flow data directory.
# Default is "/var/db/flows"
-# flow_tools_datasize (str): Maximum allowed size of the flow data on disk
-# Default is "128M"
# flow_capture_localip (str): IP address to bind to
# Default to "0.0.0.0"
# flow_capture_remoteip (str): IP address to accept flows from
# Default to "0.0.0.0" or all IPs
# flow_capture_port (int): Port to accept flow data on
# Default is "8787"
-# flow_capture_args (str): Custom additional arguments to be passed
-# to flow-collector (default empty).
+# flow_capture_flags (str): Custom additional arguments to be passed
+# to flow-collector (default "-E 128M").
+# flow_capture_profiles (str): A list of configuration profiles to enable.
+# This allows you to run several instances of
+# flow-capture with different parameters.
+# Consider the following example:
+# flow_capture_enable="YES"
+# flow_capture_localip="85.172.168.9"
+# flow_capture_profiles="r1 r2"
+# flow_capture_r1_datadir="/var/db/flows/r1"
+# flow_capture_r1_port="4444"
+# flow_capture_r1_flags="-E20G -n287 -N-2"
+# flow_capture_r2_datadir="/var/db/flows/r2"
+# flow_capture_r2_port="4445"
+# flow_capture_r2_flags="-E5G -n287 -N-2"
#
+# This will run two instances of the flow-capture
+# with parameters taken from appropriate
+# flow_capture_PROFILENAME_xxx variables. For
+# unspecified parameters flow_capture_xxx
+# varialbes will be used.
. /etc/rc.subr
name="flow_capture"
rcvar=`set_rcvar`
+setup_profile_vars()
+{
+ name=flow_capture_$1
+ eval ": \${flow_capture_${1}_datadir=${flow_capture_datadir}}"
+ eval ": \${flow_capture_${1}_localip=${flow_capture_localip}}"
+ eval ": \${flow_capture_${1}_remoteip=${flow_capture_remoteip}}"
+ eval ": \${flow_capture_${1}_port=${flow_capture_port}}"
+ eval ": \${flow_capture_${1}_user=${flow_capture_user}}"
+ eval ": \${flow_capture_${1}_group=${flow_capture_group}}"
+ eval ": \${flow_capture_${1}_flags=${flow_capture_flags}}"
+ eval "pidfile=${flow_capture_pid}.\${flow_capture_${1}_port}"
+ eval "command_args=\"-w \${flow_capture_${1}_datadir} -p ${flow_capture_pid} \${flow_capture_${1}_localip}/\${flow_capture_${1}_remoteip}/\${flow_capture_${1}_port}\""
+}
+
+start_profiles()
+{
+ unset start_cmd
+ for _profile in ${flow_capture_profiles}; do
+ setup_profile_vars $_profile
+ run_rc_command "${rc_arg}"
+ done
+}
+
+stop_profiles()
+{
+ unset stop_cmd
+ for _profile in ${flow_capture_profiles}; do
+ setup_profile_vars $_profile
+ run_rc_command "${rc_arg}"
+ done
+}
+
load_rc_config $name
: ${flow_capture_enable="NO"}
-: ${flow_tools_datadir="%%FLOW_CAPTURE_SPOOL%%"}
-: ${flow_tools_datasize="128M"}
+: ${flow_capture_datadir="%%FLOW_CAPTURE_SPOOL%%"}
: ${flow_capture_localip="0.0.0.0"}
: ${flow_capture_remoteip="0.0.0.0"}
: ${flow_capture_port="8787"}
: ${flow_capture_pid="%%FLOW_CAPTURE_PIDDIR%%/flow-capture.pid"}
: ${flow_capture_user="flowtools"}
: ${flow_capture_group="flowtools"}
-: ${flow_capture_args=""}
+: ${flow_capture_flags="-E 128M"}
pidfile="${flow_capture_pid}.${flow_capture_port}"
command="%%PREFIX%%/bin/flow-capture"
-command_args="${flow_capture_args} -E ${flow_tools_datasize} -w ${flow_tools_datadir} -p ${flow_capture_pid} ${flow_capture_localip}/${flow_capture_remoteip}/${flow_capture_port}"
+command_args="-w ${flow_capture_datadir} -p ${flow_capture_pid} ${flow_capture_localip}/${flow_capture_remoteip}/${flow_capture_port}"
+
+cmd="$1"
+if [ $# -gt 0 ]; then
+ shift
+fi
+
+[ -n "$*" ] && flow_capture_profiles="$*"
+
+if [ "${flow_capture_profiles}" ]; then
+ start_cmd="start_profiles"
+ stop_cmd="stop_profiles"
+fi
-run_rc_command "$1"
+run_rc_command "$cmd"
diff --git a/net-mgmt/flow-tools/files/patch-lib-ftfile.c b/net-mgmt/flow-tools/files/patch-lib-ftfile.c
new file mode 100644
index 000000000000..0418caa8ac0a
--- /dev/null
+++ b/net-mgmt/flow-tools/files/patch-lib-ftfile.c
@@ -0,0 +1,100 @@
+--- lib/ftfile.c.orig Thu Feb 13 05:38:42 2003
++++ lib/ftfile.c Fri Feb 10 10:39:40 2006
+@@ -311,7 +311,7 @@
+ int ftfile_expire (struct ftfile_entries *fte, int doit, int curbytes)
+ {
+ u_int i;
+- struct ftfile_entry *n1;
++ struct ftfile_entry *n1, *n2;
+ u_int64 bytes;
+
+ /*
+@@ -323,15 +323,20 @@
+ bytes = 0;
+
+ if (fte->max_files && (fte->num_files > fte->max_files)) {
++ n2 = NULL;
+ FT_TAILQ_FOREACH(n1, &fte->head, chain) {
++ if (n2 != NULL) {
++ ftfile_entry_free(n2);
++ n2 = NULL;
++ }
+ fterr_info("remove/1 %s", n1->name);
+ bytes += n1->size;
+ ++i;
+ if (doit) {
++ n2 = n1;
+ FT_TAILQ_REMOVE(&fte->head, n1, chain);
+ if (unlink(n1->name) == -1)
+ fterr_warn("unlink(%s)", n1->name);
+- ftfile_entry_free(n1);
+ } /* doit */
+ if ((fte->num_files - i) <= fte->max_files)
+ break;
+@@ -340,6 +345,10 @@
+ fte->num_files -= i;
+ fte->num_bytes -= bytes;
+ } /* doit */
++ if (n2 != NULL) {
++ ftfile_entry_free(n2);
++ n2 = NULL;
++ }
+ } /* if */
+
+ if (debug)
+@@ -354,15 +363,20 @@
+ */
+
+ if (fte->max_bytes && (fte->num_bytes+curbytes > fte->max_bytes)) {
++ n2 = NULL;
+ FT_TAILQ_FOREACH(n1, &fte->head, chain) {
++ if (n2 != NULL) {
++ ftfile_entry_free(n2);
++ n2 = NULL;
++ }
+ fterr_info("remove/2 %s", n1->name);
+ bytes += n1->size;
+ ++i;
+ if (doit) {
++ n2 = n1;
+ FT_TAILQ_REMOVE(&fte->head, n1, chain);
+ if (unlink(n1->name) == -1)
+ fterr_warn("unlink(%s)", n1->name);
+- ftfile_entry_free(n1);
+ } /* doit */
+ if ((fte->num_bytes+curbytes - bytes) <= fte->max_bytes)
+ break;
+@@ -371,6 +385,10 @@
+ fte->num_files -= i;
+ fte->num_bytes -= bytes;
+ } /* doit */
++ if (n2 != NULL) {
++ ftfile_entry_free(n2);
++ n2 = NULL;
++ }
+ } /* if */
+
+ if (debug)
+@@ -762,13 +780,19 @@
+ {
+ struct ftfile_entry *n1, *n2;
+
++ n2 = NULL;
+ FT_TAILQ_FOREACH(n1, &fte->head, chain) {
++ if (n2 != NULL) {
++ ftfile_entry_free(n2);
++ n2 = NULL;
++ }
+ FT_TAILQ_REMOVE(&fte->head, n1, chain);
+ n2 = n1;
+- n1 = FT_TAILQ_NEXT(n1, chain);
++ }
++
++ if (n2 != NULL) {
+ ftfile_entry_free(n2);
+- if (!n1)
+- break;
++ n2 = NULL;
+ }
+
+ } /* ftfile_free */