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

Reply via email to