On Wed, Jan 27, 2016 at 01:40:14PM +0100, Antoine Jacoutot wrote:
> On Wed, Jan 27, 2016 at 06:47:57AM -0500, Jiri B wrote:
> > Would it be worth to extend rc.d for rtable knobs?
> >
> > - daemon_rtable varible
> > - rc_* functions (route exec, pgrep/pkill -T $rtable...)
> >
> > Or are routing tables not much used thus not worth to make
> > rc.d more complicated?
>
> There has been several discussions about this. No decision made though.
> If you can find a nice way to implement it, I can have a look.
rc.d framework is so nice... not sure if this is nice way but it
works. Maybe check for existing rtable is not great.
Index: etc/rc.d/rc.subr
===================================================================
RCS file: /cvs/src/etc/rc.d/rc.subr,v
retrieving revision 1.105
diff -u -p -r1.105 rc.subr
--- etc/rc.d/rc.subr 21 Dec 2015 10:18:05 -0000 1.105
+++ etc/rc.d/rc.subr 27 Jan 2016 17:57:16 -0000
@@ -130,7 +130,7 @@ _rc_parse_conf() {
while IFS=' ' read -r _l; do
[[ $_l == [!#=]*=* ]] || continue
_key=${_l%%*([[:blank:]])=*}
- [[ $_key == *_@(flags|user|timeout) ]] || \
+ [[ $_key == *_@(flags|rtable|user|timeout) ]] || \
[[ " ${_allowed_keys[*]} " == *" $_key "* ]] ||
\
continue
[[ $_key == "" ]] && continue
@@ -154,15 +154,15 @@ rc_start() {
}
rc_check() {
- pgrep -q -xf "${pexp}"
+ pgrep -T ${daemon_rtable} -q -xf "${pexp}"
}
rc_reload() {
- pkill -HUP -xf "${pexp}"
+ pkill -HUP -T ${daemon_rtable} -xf "${pexp}"
}
rc_stop() {
- pkill -xf "${pexp}"
+ pkill -T ${daemon_rtable} -xf "${pexp}"
}
rc_cmd() {
@@ -172,6 +172,10 @@ rc_cmd() {
[ X"${rc_usercheck}" != X"NO" -a X"$1" = "Xcheck" ] || \
_rc_err "$0: need root privileges"
+ if ! route -T ${daemon_rtable} -n show >/dev/null 2>&1; then
+ _rc_err "$0: rtable ${daemon_rtable} does not exist"
+ fi
+
if _rc_not_supported start || _rc_not_supported stop; then
rc_restart=NO
fi
@@ -259,12 +263,14 @@ _RC_RUNFILE=${_RC_RUNDIR}/${_name}
_rc_do _rc_parse_conf
eval _rcflags=\${${_name}_flags}
+eval _rcrtable=\${${_name}_rtable}
eval _rcuser=\${${_name}_user}
eval _rctimeout=\${${_name}_timeout}
# set default values; duplicated in rcctl(8)
getcap -f /etc/login.conf ${_name} 1>/dev/null 2>&1 && \
daemon_class=${_name} || daemon_class=daemon
+[ -z "${daemon_rtable}" ] && daemon_rtable=0
[ -z "${daemon_user}" ] && daemon_user=root
[ -z "${daemon_timeout}" ] && daemon_timeout=30
@@ -273,6 +279,7 @@ getcap -f /etc/login.conf ${_name} 1>/de
unset _rcflags
[ -n "${_rcflags}" ] && daemon_flags=${_rcflags}
+[ -n "${_rcrtable}" ] && daemon_rtable=${_rcrtable}
[ -n "${_rcuser}" ] && daemon_user=${_rcuser}
[ -n "${_rctimeout}" ] && daemon_timeout=${_rctimeout}
@@ -280,9 +287,13 @@ if [ -n "${_RC_DEBUG}" ]; then
echo -n "${_name}_flags "
[ -n "${_rcflags}" ] || echo -n "empty, using default "
echo ">${daemon_flags}<"
+ echo -n "${_name}_rtable "
+ [ -n "${_rcrtable}" ] || echo -n "empty, using default "
+ echo ">${daemon_rtable}<"
fi
readonly daemon_class
-unset _rcflags _rcuser _rctimeout
+unset _rcflags _rcrtable _rcuser _rctimeout
pexp="${daemon}${daemon_flags:+ ${daemon_flags}}"
-rcexec="su -l -c ${daemon_class} -s /bin/sh ${daemon_user} -c"
+rcexec="route -T ${daemon_rtable} exec su -l -c ${daemon_class} -s /bin/sh
${daemon_user} -c"
+
Index: usr.sbin/rcctl/rcctl.sh
===================================================================
RCS file: /cvs/src/usr.sbin/rcctl/rcctl.sh,v
retrieving revision 1.88
diff -u -p -r1.88 rcctl.sh
--- usr.sbin/rcctl/rcctl.sh 24 Jan 2016 08:51:50 -0000 1.88
+++ usr.sbin/rcctl/rcctl.sh 27 Jan 2016 17:57:20 -0000
@@ -220,7 +220,7 @@ svc_get()
[ -n "${_svc}" ] || return
local _status=0 _val _var=$2
- local daemon_class daemon_flags daemon_timeout daemon_user
+ local daemon_class daemon_flags daemon_rtable daemon_timeout daemon_user
if svc_is_special ${_svc}; then
daemon_flags="$(eval echo \${${_svc}})"
@@ -246,6 +246,12 @@ svc_get()
[ -z "${daemon_flags}" ] && \
daemon_flags="$(svc_getdef ${_svc}
flags)"
fi
+ if [ -z "${_var}" -o "${_var}" = "rtable" ]; then
+ [ -z "${daemon_rtable}" ] && \
+ daemon_rtable="$(eval echo
\"\${${_svc}_rtable}\")"
+ [ -z "${daemon_rtable}" ] && \
+ daemon_rtable="$(svc_getdef ${_svc}
rtable)"
+ fi
if [ -z "${_var}" -o "${_var}" = "timeout" ]; then
[ -z "${daemon_timeout}" ] && \
daemon_timeout="$(eval echo
\"\${${_svc}_timeout}\")"
@@ -274,6 +280,7 @@ svc_get()
else
echo "${_svc}_class=${daemon_class}"
echo "${_svc}_flags=${daemon_flags}"
+ echo "${_svc}_rtable=${daemon_rtable}"
echo "${_svc}_timeout=${daemon_timeout}"
echo "${_svc}_user=${daemon_user}"
fi
@@ -288,7 +295,7 @@ svc_getdef()
[ -n "${_svc}" ] || return
local _status=0 _val _var=$2
- local daemon_class daemon_flags daemon_timeout daemon_user
+ local daemon_class daemon_flags daemon_rtable daemon_timeout daemon_user
if svc_is_special ${_svc}; then
# unconditionally parse: we always output flags and/or status
@@ -312,6 +319,7 @@ svc_getdef()
. /etc/rc.d/${_svc} >/dev/null 2>&1
daemon_class=daemon
+ [ -z "${daemon_rtable}" ] && daemon_rtable=0
[ -z "${daemon_timeout}" ] && daemon_timeout=30
[ -z "${daemon_user}" ] && daemon_user=root
fi
@@ -328,6 +336,7 @@ svc_getdef()
else
echo "${_svc}_class=${daemon_class}"
echo "${_svc}_flags=${daemon_flags}"
+ echo "${_svc}_rtable=${daemon_rtable}"
echo "${_svc}_timeout=${daemon_timeout}"
echo "${_svc}_user=${daemon_user}"
fi
@@ -346,7 +355,7 @@ svc_rm()
( svc_getdef ${_svc} status ) && \
echo "${_svc}=NO" >>${_TMP_RCCONF}
else
- grep -Ev "^${_svc}_(flags|timeout|user).*=" \
+ grep -Ev "^${_svc}_(flags|rtable|timeout|user).*=" \
/etc/rc.conf.local >${_TMP_RCCONF}
( svc_getdef ${_svc} status ) && \
echo "${_svc}_flags=NO" >>${_TMP_RCCONF}
@@ -399,6 +408,14 @@ svc_set()
fi
if [ -n "${_args}" ]; then
+ if [ "${_var}" = "rtable" ]; then
+ [[ ${_args} != +([[:digit:]]) || ${_args} -lt 0 ]] && \
+ rcctl_err "\"${_args}\" is not 0 or a positive
integer"
+ fi
+ if [ "${_var}" = "rtable" ]; then
+ route -T "${_args}" -n show >/dev/null 2>&1 || \
+ rcctl_err "rtable \"${_args}\" does not exist"
+ fi
if [ "${_var}" = "timeout" ]; then
[[ ${_args} != +([[:digit:]]) || ${_args} -le 0 ]] && \
rcctl_err "\"${_args}\" is not a positive
integer"
@@ -470,13 +487,13 @@ case ${action} in
svc_is_avail ${svc} || \
rcctl_err "service ${svc} does not exist" 2
if [ -n "${var}" ]; then
- [[ ${var} != @(class|flags|status|timeout|user) ]] &&
usage
+ [[ ${var} != @(class|flags|status|rtable|timeout|user)
]] && usage
if svc_is_meta ${svc}; then
[ "${var}" != "status" ] && \
rcctl_err "/etc/rc.d/${svc} is a meta
script, cannot \"${action} ${var}\""
fi
if svc_is_special ${svc}; then
- [[ ${var} == @(class|timeout|user) ]] && \
+ [[ ${var} == @(class|rtable|timeout|user) ]] &&
\
rcctl_err "\"${svc}\" is a special
variable, cannot \"${action} ${var}\""
fi
fi
@@ -489,7 +506,7 @@ case ${action} in
[ -z "${svc}" ] && usage
svc_is_avail ${svc} || \
rcctl_err "service ${svc} does not exist" 2
- [[ ${var} != @(class|flags|status|timeout|user) ]] && usage
+ [[ ${var} != @(class|flags|status|rtable|timeout|user) ]] &&
usage
svc_is_meta ${svc} && [ "${var}" != "status" ] && \
rcctl_err "/etc/rc.d/${svc} is a meta script, cannot
\"${action} ${var}\""
[[ ${var} = flags && ${args} = NO ]] && \