Add support for multiple instances of ftp-proxy
and pflog devices. PR: conf/158171 Submitted by: Thomas Johnson <tom@claimlynx.com>
This commit is contained in:
parent
1bea62add7
commit
e2838b315a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=258080
@ -14,4 +14,62 @@ rcvar="ftpproxy_enable"
|
||||
command="/usr/sbin/ftp-proxy"
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
||||
|
||||
#
|
||||
# manage_pid argument
|
||||
# Create or remove a pidfile manually, for daemons that can't be bothered
|
||||
# to do it themselves. Takes one argument, which is the argument provided
|
||||
# to the rc script. The pidfile will be named /var/run/<$name>.pid,
|
||||
# unless $pidfile is defined.
|
||||
#
|
||||
# The method used to determine the pid is rather hacky; grep ps output to
|
||||
# find '$procname|$command', then grep for ${name}_flags. If at all
|
||||
# possible, use another method if at all possible, to avoid that dirty-
|
||||
# code feeling.
|
||||
#
|
||||
manage_pid() {
|
||||
local search_string ps_pid
|
||||
case $1 in
|
||||
*start)
|
||||
cmd_string=`basename ${procname:-${command}}`
|
||||
eval flag_string=\"\$${name}_flags\"
|
||||
# Determine the pid.
|
||||
ps_pid=`ps ax -o pid= -o command= | grep $cmd_string | grep -e "$flag_string" | grep -v grep | awk '{ print $1 }'`
|
||||
# Write the pidfile depending on $pidfile status.
|
||||
echo $ps_pid > ${pidfile:-"/var/run/$name.pid"}
|
||||
;;
|
||||
stop)
|
||||
rm $pidfile
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Allow ftp-proxy to start up in two different ways. The typical behavior
|
||||
# is to start up one instance of ftp-proxy by setting ftpproxy_enable and
|
||||
# ftpproxy_flags. The alternate behavior allows multiple instances of ftp-
|
||||
# proxy to be started, allowing different types of proxy behavior. To use the
|
||||
# new behavior, a list of instances must be defined, and a list of flags for
|
||||
# each instance. For example, if we want to start two instances of ftp-proxy,
|
||||
# foo and bar, we would set the following vars.
|
||||
# ftpproxy_enable="YES"
|
||||
# ftpproxy_instances="foo bar"
|
||||
# ftpproxy_foo="<arguments for foo>"
|
||||
# ftpproxy_bar="<arguments for bar>"
|
||||
#
|
||||
# Starting more than one ftp-proxy?
|
||||
if [ "$ftpproxy_instances" ] && [ -n "${ftpproxy_instances}" ]; then
|
||||
# Iterate through instance list.
|
||||
for i in $ftpproxy_instances; do
|
||||
#eval ftpproxy_${i}_flags=\$ftpproxy_${i}
|
||||
#eval name=ftpproxy_${i}
|
||||
# Set flags for this instance.
|
||||
eval ftpproxy_flags=\$ftpproxy_${i}
|
||||
# Define a unique pid file name.
|
||||
pidfile="/var/run/ftp-proxy.$i.pid"
|
||||
run_rc_command "$1"
|
||||
manage_pid $1
|
||||
done
|
||||
else
|
||||
# Traditional single-instance behavior
|
||||
run_rc_command "$1"
|
||||
fi
|
||||
|
@ -24,25 +24,41 @@ pflog_prestart()
|
||||
{
|
||||
load_kld pflog || return 1
|
||||
|
||||
# set pflog0 interface to up state
|
||||
if ! ifconfig pflog0 up; then
|
||||
warn 'could not bring up pflog0.'
|
||||
# set pflog_dev interface to up state
|
||||
if ! ifconfig $pflog_dev up; then
|
||||
warn "could not bring up $pflog_dev."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# prepare the command line for pflogd
|
||||
rc_flags="-f $pflog_logfile $rc_flags"
|
||||
rc_flags="-f $pflog_logfile -i $pflog_dev $rc_flags"
|
||||
|
||||
# report we're ready to run pflogd
|
||||
return 0
|
||||
}
|
||||
|
||||
pflog_poststart() {
|
||||
# Allow child pflogd to settle
|
||||
sleep 0.10
|
||||
# More elegant(?) method for getting a unique pid
|
||||
if [ -f /var/run/pflogd.pid ]; then
|
||||
mv /var/run/pflogd.pid $pidfile
|
||||
else
|
||||
warn "/var/run/pflogd.pid does not exist. Too fast."
|
||||
fi
|
||||
}
|
||||
|
||||
pflog_poststop()
|
||||
{
|
||||
if ! ifconfig pflog0 down; then
|
||||
warn 'could not bring down pflog0.'
|
||||
if ! ifconfig $pflog_dev down; then
|
||||
warn "could not bring down $pflog_dev."
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "$pflog_instances" ] && [ -n "$pflog_instances" ]; then
|
||||
rm $pidfile
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -53,4 +69,33 @@ pflog_resync()
|
||||
}
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
||||
|
||||
# Check if spawning multiple pflogd
|
||||
echo "Starting pflogd: $pflog_instances"
|
||||
if [ "$pflog_instances" ] && [ -n "$pflog_instances" ]; then
|
||||
start_postcmd="pflog_poststart"
|
||||
# Interate through requested instances.
|
||||
for i in $pflog_instances; do
|
||||
# Set required variables
|
||||
eval pflog_dev=\$pflog_${i}_dev
|
||||
eval pflog_logfile=\$pflog_${i}_logfile
|
||||
eval pflog_flags=\$pflog_${i}_flags
|
||||
# Check that required vars have non-zero length, warn if not.
|
||||
if [ -z $pflog_dev ]; then
|
||||
warn "pflog_dev not set"
|
||||
continue
|
||||
fi
|
||||
if [ -z $pflog_logfile ]; then
|
||||
warn "pflog_logfile not set"
|
||||
continue
|
||||
fi
|
||||
# pflogd sets a pidfile, but the name is hardcoded. Concoct a
|
||||
# unique pidfile name.
|
||||
pidfile="/var/run/pflogd.$i.pid"
|
||||
run_rc_command "$1"
|
||||
done
|
||||
else
|
||||
# Typical case, spawn single instance only.
|
||||
pflog_dev=${pflog_dev:-"pflog0"}
|
||||
run_rc_command "$1"
|
||||
fi
|
||||
|
@ -917,6 +917,33 @@ Empty by default.
|
||||
This variable contains additional flags passed to the
|
||||
.Xr pflogd 8
|
||||
program.
|
||||
.It Va pflog_instances
|
||||
.Pq Vt str
|
||||
If logging to more than one
|
||||
.Xr pflog 4
|
||||
interface is desired,
|
||||
.Va pflog_instances
|
||||
is set to the list of
|
||||
.Xr pflogd 8
|
||||
instances that should be started at system boot time. If
|
||||
.Va pflog_instances
|
||||
is set, for each whitespace-seperated
|
||||
.Ar element
|
||||
in the list,
|
||||
.Ao Ar element Ac Ns Va _dev
|
||||
and
|
||||
.Ao Ar element Ac Ns Va _logfile
|
||||
elements are assumed to exist.
|
||||
.Ao Ar element Ac Ns Va _dev
|
||||
must contain the
|
||||
.Xr pflog 4
|
||||
interface to be watched by the named
|
||||
.Xr pflogd 8
|
||||
instance.
|
||||
.Ao Ar element Ac Ns Va _logfile
|
||||
must contain the name of the logfile that will be used by the
|
||||
.Xr pflogd 8
|
||||
instance.
|
||||
.It Va ftpproxy_enable
|
||||
.Pq Vt bool
|
||||
Set to
|
||||
@ -935,6 +962,19 @@ Empty by default.
|
||||
This variable contains additional flags passed to the
|
||||
.Xr ftp-proxy 8
|
||||
program.
|
||||
.It Va ftpproxy_instances
|
||||
.Pq Vt str
|
||||
Empty by default. If multiple instances of
|
||||
.Xr ftp-proxy 8
|
||||
are desired at boot time,
|
||||
.Va ftpproxy_instances
|
||||
should contain a whitespace-seperated list of instance names. For each
|
||||
.Ar element
|
||||
in the list, a variable named
|
||||
.Ao Ar element Ac Ns Va _flags
|
||||
should be defined, containing the command-line flags to be passed to the
|
||||
.Xr ftp-proxy 8
|
||||
instance.
|
||||
.It Va pfsync_enable
|
||||
.Pq Vt bool
|
||||
Set to
|
||||
|
Loading…
Reference in New Issue
Block a user