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