On Sat, Oct 19, 2024 at 02:43:01PM +0200, Mike Fischer wrote:
> Hi!
>
> I’m trying to build an rc.d(8) script for a service that does not daemonize
> on OpenBSD 7.6 stable amd64. (Actually the service is a Python script,
> Radicale 3.3.0 to be precise.)
>
> Currently everything works but I’m getting a timeout from rcctl start. See
> section Questions below.
>
>
> Background:
> ===========
> There are ports for Radicale 1.x and 2.x. But unfortunately none for Radicale
> 3.x. One of the reasons might be that the -d option for Radicale no longer
> works? I.e. Radicale 3.x can not be made to daemonize.
>
>
> What I tried:
> =============
> • Installed python and py3-pip ports.
> # pkg_add python py3-pip
>
> • I have installed Radicale 3.3.0 in a Python venv (to avoid mixing up
> pkg_add(1) and pip managed stuff) at /usr/local/lib/radicale.
> # python3 -m venv /usr/local/lib/radicale
> # /usr/local/lib/radicale/bin/pip install --upgrade pip
> # /usr/local/lib/radicale/bin/pip install radicale
>
> • I have created a _radicale user and group identical to the ones created in
> the radicale-2.1.12p7 port.
>
> • Created a minimal config in /etc/radicale/config specifying the storage
> path (/var/db/radicale/collections). Reason: the default path /var/lib/… does
> not exist on OpenBSD.
>
> • Created /var/db/radicale and set its owner and group to _radicale.
>
> • Created the following script and made it executable:
> # cat /etc/rc.d/radicale3
>
> #!/bin/ksh
>
> daemon="/usr/local/lib/radicale/bin/radicale"
> daemon_user="_radicale"
>
> . /etc/rc.d/rc.subr
>
> pexp=".* ${daemon}.*"
> rc_reload=NO
> rc_configtest=NO
Missing rc_bg=YES maybe?
>
> rc_cmd $1
> #
>
>
> Observations:
> =============
> # rcctl -d start radicale3
> doing _rc_parse_conf
> radicale3_flags empty, using default ><
> doing rc_check
> radicale3
> doing rc_start
> doing _rc_wait_for_start
> doing rc_check
> No home directory /nonexistent!
> Logging in with home = "/".
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Logging of backtrace is disabled
> in this loglevel
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Logging of backtrace is disabled
> in this loglevel
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Loaded default config
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Loaded config file
> '/etc/radicale/config'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Skipped missing/unreadable config
> file '/.config/radicale/config'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Starting Radicale
> [2024-10-19 07:47:09 +0200] [43495] [WARNING] No user authentication is
> selected: '[auth] type=none' (insecure)
> [2024-10-19 07:47:09 +0200] [43495] [INFO] auth type is 'radicale.auth.none'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] storage type is
> 'radicale.storage.multifilesystem'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] rights type is
> 'radicale.rights.owner_only'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] web type is 'radicale.web.internal'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] hook type is 'radicale.hook.none'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] permit delete of collection: True
> [2024-10-19 07:47:09 +0200] [43495] [INFO] permit overwrite of collection:
> True
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Listening on '127.0.0.1:5232'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Listening on '[::1]:5232'
> [2024-10-19 07:47:09 +0200] [43495] [INFO] Radicale server ready
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> doing rc_check
> Alarm clock
> doing _rc_write_runfile
> (timeout)
> #
>
> # rcctl -d check radicale3
> doing _rc_parse_conf
> radicale3_flags empty, using default ><
> doing _rc_parse_conf /var/run/rc.d/radicale3
> radicale3
> doing rc_check
> (ok)
> #
>
> The process is running, everything seems fine. Even `rcctl stop radicale3`
> works fine. `rcctl ls started` lists the service as started. `rcctl ls
> failed` does not list the service. Terminating the terminal session that
> started the service does not stop the service. So there seems to be nothing
> wrong.
>
>
> Questions:
> ==========
> 1) Why am I getting the repeated `doing rc_check` messages and the timeout
> when starting the service? (But the manual `rcctl check radicale3` works
> fine.)
>
> 2) How can I fix this to not generate a timeout?
> Note: I know I could shorten the time this happens by modifying
> daemon_timeout to less than the 30 second default. But I’d still get the
> timeout.
>
> 3) Do I perhaps need to create a wrapper that spawns the actual Radicale
> service and which returns a status of 0? And if so, are there any examples of
> something like this that I could look at for reference?
>
>
> Other:
> ======
> I think I have looked at all of the relevant man pages and the FAQ. But I
> couldn’t find the answers there. I even tried to understand the rc.subr
> source code. But I’m not sure why the manual check works and the automated
> check in the loop when starting the service doesn’t.
>
> I have other similar situations in mind, where a long (infinitely) running
> script that does not daemonize should be started as a service. I’d like to
> find a general solution if possible.
>
>
> Thanks!
> Mike
>
--
Antoine