On Wed, Jan 27, 2016 at 12:58:48PM -0500, Jiri B wrote: > 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.
I'll have a look but don't hold your breath. Thanks. > 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 ]] && \ > -- Antoine