On Sun, May 22, 2022, at 8:32 AM, aisha wrote:
> tested with calibre-web, vaultwarden and redmine, everything is working 
> fine :)
>
> thanks a lot!
>

Navidrome working as well!

> On 5/22/2022 4:12 AM, Antoine Jacoutot wrote:
>> Here's new diff that implements daemon_execdir.
>>
>> Index: etc/rc.d/rc.subr
>> ===================================================================
>> RCS file: /cvs/src/etc/rc.d/rc.subr,v
>> retrieving revision 1.153
>> diff -u -p -r1.153 rc.subr
>> --- etc/rc.d/rc.subr 21 May 2022 10:50:09 -0000      1.153
>> +++ etc/rc.d/rc.subr 22 May 2022 08:10:04 -0000
>> @@ -49,7 +49,7 @@ _rc_parse_conf() {
>>              while IFS='     ' read -r _l; do
>>                      [[ $_l == [!#=]*=* ]] || continue
>>                      _key=${_l%%*([[:blank:]])=*}
>> -                    [[ $_key == *_@(flags|logger|rtable|timeout|user) ]] ||
>> +                    [[ $_key == 
>> *_@(execdir|flags|logger|rtable|timeout|user) ]] ||
>>                              [[ " ${_allowed_keys[*]} " == *" $_key "* ]] ||
>>                              continue
>>                      [[ $_key == "" ]] && continue
>> @@ -114,14 +114,17 @@ _rc_write_runfile() {
>>      [ -d ${_RC_RUNDIR} ] || mkdir -p ${_RC_RUNDIR} &&
>>              cat >${_RC_RUNFILE} <<EOF
>>   daemon_class=${daemon_class}
>> +daemon_execdir=${daemon_execdir}
>>   daemon_flags=${daemon_flags}
>>   daemon_logger=${daemon_logger}
>>   daemon_rtable=${daemon_rtable}
>>   daemon_timeout=${daemon_timeout}
>>   daemon_user=${daemon_user}
>>   pexp=${pexp}
>> +rc_reload=${rc_reload}
>>   rc_reload_signal=${rc_reload_signal}
>>   rc_stop_signal=${rc_stop_signal}
>> +rc_usercheck=${rc_usercheck}
>>   EOF
>>   }
>>   
>> @@ -164,8 +167,11 @@ rc_exec() {
>>      [ "${daemon_rtable}" -eq "$(id -R)" ] ||
>>              _rcexec="route -T ${daemon_rtable} exec ${_rcexec}"
>>   
>> -    ${_rcexec} "${daemon_logger:+set -o pipefail; }$@${daemon_logger:+ 2>&1 
>> |
>> -            logger -ip ${daemon_logger} -t ${_name}}"
>> +    ${_rcexec} "${daemon_logger:+set -o pipefail; } \
>> +            ${daemon_execdir:+cd ${daemon_execdir} && } \
>> +            $@ \
>> +            ${daemon_logger:+ 2>&1 |
>> +                    logger -ip ${daemon_logger} -t ${_name}}"
>>   }
>>   
>>   rc_start() {
>> @@ -317,6 +323,7 @@ _rc_do _rc_parse_conf
>>   rc_reload_signal=${rc_reload_signal:=HUP}
>>   rc_stop_signal=${rc_stop_signal:=TERM}
>>   
>> +eval _rcexecdir=\${${_name}_execdir}
>>   eval _rcflags=\${${_name}_flags}
>>   eval _rclogger=\${${_name}_logger}
>>   eval _rcrtable=\${${_name}_rtable}
>> @@ -334,6 +341,7 @@ getcap -f /etc/login.conf.d/${_name}:/et
>>   [ -n "${_RC_FORCE}" -o "$1" != "start" ] && [ X"${_rcflags}" = X"NO" ] &&
>>      unset _rcflags
>>   
>> +[ -n "${_rcexecdir}" ] && daemon_execdir=${_rcexecdir}
>>   [ -n "${_rcflags}" ] && daemon_flags=${_rcflags}
>>   [ -n "${_rclogger}" ] && daemon_logger=${_rclogger}
>>   [ -n "${_rcrtable}" ] && daemon_rtable=${_rcrtable}
>> @@ -347,7 +355,7 @@ if [ -n "${_RC_DEBUG}" ]; then
>>   fi
>>   
>>   readonly daemon_class
>> -unset _rcflags _rclogger _rcrtable _rctimeout _rcuser
>> +unset _rcexecdir _rcflags _rclogger _rcrtable _rctimeout _rcuser
>>   # the shell will strip the quotes from daemon_flags when starting a daemon;
>>   # make sure pexp matches the process (i.e. doesn't include the quotes)
>>   pexp="$(eval echo ${daemon}${daemon_flags:+ ${daemon_flags}})"
>> Index: usr.sbin/rcctl/rcctl.8
>> ===================================================================
>> RCS file: /cvs/src/usr.sbin/rcctl/rcctl.8,v
>> retrieving revision 1.39
>> diff -u -p -r1.39 rcctl.8
>> --- usr.sbin/rcctl/rcctl.8   1 Apr 2022 10:13:35 -0000       1.39
>> +++ usr.sbin/rcctl/rcctl.8   22 May 2022 08:10:04 -0000
>> @@ -62,6 +62,7 @@ The following commands are available
>>   .Ar variable
>>   can be one of
>>   .Cm class ,
>> +.Cm execdir ,
>>   .Cm flags ,
>>   .Cm logger ,
>>   .Cm rtable ,
>> @@ -206,7 +207,8 @@ flags:
>>   # rcctl set apmd flags -A
>>   # rcctl get apmd
>>   apmd_class=daemon
>> -apmd_flags=-A
>> +apmd_execdir=
>> +apmd_flags=NO
>>   apmd_logger=
>>   apmd_rtable=0
>>   apmd_timeout=30
>> Index: usr.sbin/rcctl/rcctl.sh
>> ===================================================================
>> RCS file: /cvs/src/usr.sbin/rcctl/rcctl.sh,v
>> retrieving revision 1.112
>> diff -u -p -r1.112 rcctl.sh
>> --- usr.sbin/rcctl/rcctl.sh  10 Feb 2022 16:57:33 -0000      1.112
>> +++ usr.sbin/rcctl/rcctl.sh  22 May 2022 08:10:04 -0000
>> @@ -258,8 +258,8 @@ svc_get()
>>      [ -n "${_svc}" ] || return
>>   
>>      local _status=0 _val _var=$2
>> -    local daemon_class daemon_flags daemon_logger daemon_rtable
>> -    local daemon_timeout daemon_user
>> +    local daemon_class daemon_execdir daemon_flags daemon_logger
>> +    local daemon_rtable daemon_timeout daemon_user
>>   
>>      if svc_is_special ${_svc}; then
>>              daemon_flags="$(eval echo \${${_svc}})"
>> @@ -279,6 +279,12 @@ svc_get()
>>                              [ -z "${daemon_class}" ] && \
>>                                      daemon_class="$(svc_getdef ${_svc} 
>> class)"
>>                      fi
>> +                    if [ -z "${_var}" -o "${_var}" = "execdir" ]; then
>> +                            [ -z "${daemon_execdir}" ] && \
>> +                                    daemon_execdir="$(eval echo 
>> \"\${${_svc}_execdir}\")"
>> +                            [ -z "${daemon_execdir}" ] && \
>> +                                    daemon_execdir="$(svc_getdef ${_svc} 
>> execdir)"
>> +                    fi
>>                      if [[ -z ${_var} || ${_var} == @(flags|status) ]]; then
>>                              [ -z "${daemon_flags}" ] && \
>>                                      daemon_flags="$(eval echo 
>> \"\${${_svc}_flags}\")"
>> @@ -324,6 +330,7 @@ svc_get()
>>                      echo "${_svc}=${daemon_flags}"
>>              else
>>                      echo "${_svc}_class=${daemon_class}"
>> +                    echo "${_svc}_execdir=${daemon_execdir}"
>>                      echo "${_svc}_flags=${daemon_flags}"
>>                      echo "${_svc}_logger=${daemon_logger}"
>>                      echo "${_svc}_rtable=${daemon_rtable}"
>> @@ -341,8 +348,8 @@ svc_getdef()
>>      [ -n "${_svc}" ] || return
>>   
>>      local _status=0 _val _var=$2
>> -    local daemon_class daemon_flags daemon_logger daemon_rtable
>> -    local daemon_timeout daemon_user
>> +    local daemon_class daemon_execdir daemon_flags daemon_logger
>> +    local daemon_rtable daemon_timeout daemon_user
>>   
>>      if svc_is_special ${_svc}; then
>>              # unconditionally parse: we always output flags and/or status
>> @@ -382,6 +389,7 @@ svc_getdef()
>>                      echo "${_svc}=${daemon_flags}"
>>              else
>>                      echo "${_svc}_class=${daemon_class}"
>> +                    echo "${_svc}_execdir=${daemon_execdir}"
>>                      echo "${_svc}_flags=${daemon_flags}"
>>                      echo "${_svc}_logger=${daemon_logger}"
>>                      echo "${_svc}_rtable=${daemon_rtable}"
>> @@ -403,7 +411,7 @@ svc_rm()
>>              ( svc_getdef ${_svc} status ) && \
>>                      echo "${_svc}=NO" >>${_TMP_RCCONF}
>>      else
>> -            grep -Ev "^${_svc}_(flags|logger|rtable|timeout|user).*=" \
>> +            grep -Ev 
>> "^${_svc}_(execdir|flags|logger|rtable|timeout|user).*=" \
>>                      /etc/rc.conf.local >${_TMP_RCCONF}
>>              ( svc_getdef ${_svc} status ) && \
>>                      echo "${_svc}_flags=NO" >>${_TMP_RCCONF}
>> @@ -456,6 +464,10 @@ svc_set()
>>      fi
>>   
>>      if [ -n "${_args}" ]; then
>> +            if [ "${_var}" = "execdir" ]; then
>> +                    [[ ${_args%${_args#?}} == / ]] ||
>> +                            rcctl_err "\"${_args}\" must be an absolute 
>> path"
>> +            fi
>>              if [ "${_var}" = "logger" ]; then
>>                      logger -p "${_args}" </dev/null >/dev/null 2>&1 ||
>>                              rcctl_err "unknown priority name: \"${_args}\""
>> @@ -539,13 +551,13 @@ case ${action} in
>>                      rcctl_err "service ${svc} does not exist" 2
>>              if [ -n "${var}" ]; then
>>                      [ "${svc}" = "all" ] && usage
>> -                    [[ ${var} != 
>> @(class|flags|logger|rtable|status|timeout|user) ]] && usage
>> +                    [[ ${var} != 
>> @(class|execdir|flags|logger|rtable|status|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|logger|rtable|timeout|user) ]] && \
>> +                            [[ ${var} == 
>> @(class|execdir|logger|rtable|timeout|user) ]] && \
>>                                      rcctl_err "\"${svc}\" is a special 
>> variable, cannot \"${action} ${var}\""
>>                      fi
>>              fi
>> @@ -561,7 +573,7 @@ case ${action} in
>>                      svc_is_avail ${svc} || \
>>                              rcctl_err "service ${svc} does not exist" 2
>>              fi
>> -            [[ ${var} != @(class|flags|logger|rtable|status|timeout|user) 
>> ]] && usage
>> +            [[ ${var} != 
>> @(class|execdir|flags|logger|rtable|status|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 ]] && \
>> Index: share/man/man8/rc.d.8
>> ===================================================================
>> RCS file: /cvs/src/share/man/man8/rc.d.8,v
>> retrieving revision 1.37
>> diff -u -p -r1.37 rc.d.8
>> --- share/man/man8/rc.d.8    9 Nov 2021 11:43:47 -0000       1.37
>> +++ share/man/man8/rc.d.8    22 May 2022 08:10:04 -0000
>> @@ -102,6 +102,8 @@ variables when starting a daemon.
>>   The following can be overridden by site-specific values provided in
>>   .Xr rc.conf.local 8 :
>>   .Bl -tag -width daemon_timeout -offset indent
>> +.It Ar daemon Ns _execdir
>> +Run daemon from the specified directory.
>>   .It Ar daemon Ns _flags
>>   Additional arguments to call the daemon with.
>>   These will be appended to any mandatory arguments already contained in the
>> Index: share/man/man8/rc.subr.8
>> ===================================================================
>> RCS file: /cvs/src/share/man/man8/rc.subr.8,v
>> retrieving revision 1.43
>> diff -u -p -r1.43 rc.subr.8
>> --- share/man/man8/rc.subr.8 21 May 2022 14:11:39 -0000      1.43
>> +++ share/man/man8/rc.subr.8 22 May 2022 08:10:04 -0000
>> @@ -189,10 +189,11 @@ call
>>   .Ic rc_reload .
>>   .El
>>   .It Ic rc_exec
>> -Execute process using
>> +Execute argument using
>>   .Xr su 1
>>   according to
>>   .Va daemon_class ,
>> +.Va daemon_execdir ,
>>   .Va daemon_user ,
>>   .Va daemon_rtable
>>   and
>> @@ -256,6 +257,9 @@ script itself and uses that.
>>   If no such login class exists then
>>   .Dq daemon
>>   will be used.
>> +.It Va daemon_execdir
>> +Change to this directory before running
>> +.Ic rc_exec .
>>   .It Va daemon_flags
>>   Arguments to call the daemon with.
>>   .It Ar daemon Ns _logger
>> @@ -337,6 +341,7 @@ in an
>>   script, if the
>>   .Cm check
>>   action needs root privileges.
>> +.El
>>   .Pp
>>   All
>>   .Va daemon_*
>> @@ -347,6 +352,7 @@ Global defaults are provided by
>>   .Nm :
>>   .Bd -literal -offset indent
>>   daemon_class=daemon
>> +daemon_execdir=
>>   daemon_flags=
>>   daemon_logger=
>>   daemon_rtable=0
>> @@ -367,6 +373,7 @@ As noted in
>>   site-specific values provided in
>>   .Xr rc.conf.local 8
>>   for
>> +.Va daemon_execdir ,
>>   .Va daemon_flags ,
>>   .Va daemon_logger ,
>>   .Va daemon_rtable ,
>> @@ -374,7 +381,6 @@ for
>>   and
>>   .Va daemon_user
>>   will override those defaults.
>> -.El
>>   .El
>>   .Sh FILES
>>   .Bl -tag -width Ds
>>

Reply via email to