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
>>