On Sun, May 22, 2022, at 8:50 AM, Aaron Bieber wrote:
> 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!
Forgot to add: OK abieber@ :D
>
>> 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
>>>