Index | Thread | Search

From:
Klemens Nanni <kn@openbsd.org>
Subject:
Re: openvpn: do not force --daemon as first argument
To:
Stuart Henderson <stu@spacehopper.org>, ports <ports@openbsd.org>
Date:
Sat, 06 Dec 2025 19:05:27 +0000

Download raw body.

Thread
06.12.2025 18:50, Jeremie Courreges-Anglas пишет:
> On Sat, Dec 06, 2025 at 11:48:26AM +0000, Klemens Nanni wrote:
>> 06.12.2025 14:37, Stuart Henderson пишет:
>>> then if someone doesn't set --daemon themselves (either on the command line or in config) the script won't work properly.
> 
> Which is a problem in itself that we're trying to avoid in other rc
> scripts.

If whatever you set for flags doesn't work, the first thing should be
to check the rc.d script's defaults, the package's README/MESSAGE, etc.

OpenVPN isn't as trivial as, say tftpd(8), so I'd expect users to have
already read the manual and know how to deal with our service scripts
before starting them.

> 
>> not sure I see the problem with specifying --config?
> 
> I didn't think that people could expect
> 
>   openvpn_flags=/etc/openvpn/server.conf
> 
> to work, which wouldn't work because of the interaction with --daemon.
> I can see how that would confuse people, but it can be documented.

Sure, documenting works here and causes less friction, but not mandating
usage by hardcoding flags in `daemon' would be straight forward and allow
users to use the simplest form wrt. rc.conf.local: a single file argument
with everything else being in there  -  all without README/MESSAGE bits.

> 
>> Hence the sentence about MESSAGE or current.html.
>>
>> Altough this is more about --daemon not being usable inside a config file
>> due to our rc.d script's assumption about it not taking arguments.
> 
> This I did envision, and it was more of a compromise than an
> assumption.  But I've been lazy and didn't document the trick to set
> the name in syslog messages.
> 
>>> upstream supports multiple sockets in server mode now, btw.
>>
>> Oh?  I'll take another look, thanks.
> 
> That'll be only for openvpn-2.7.
> 
>> I don't think it's super critical, but I'd still like to rectify this;
>> we have relatively few scripts forcing flags in `daemon' and for openvpn
>> this is not strictly neccessary.
> 
> The reason we force some flags in $daemon in other scripts is
> precisely to get these programs to daemonize by default, whatever the
> user specifies in the flags.

Right, but here it has more impact than that:

    [...] The syslog redirection occurs
    immediately at the point that --daemon is parsed on the command
    line even though the daemonization point occurs later. If one of
    the --log options is present, it will supersede syslog
    redirection.

This renders -d to debug service startups useless, because everything
is syslog'd immediately, which is bad, imho:

	# rcctl enable openvpn
	# rcctl set openvpn flags --ops
	# rcctl -d start openvpn
	doing _rc_parse_conf
	openvpn_flags >--oops<
	doing rc_check
	openvpn
	doing rc_start
	doing _rc_wait_for_start
	doing rc_check
	doing _rc_rm_runfile
	(failed)

Without hardcoded flag, careful readers of the manual can defer their
`daemon' option in flags or their config file.

It's just another minor issue, but we can fix it, so why not?

> 
> See below,
> 
> [...]
>>>> Existing setups need adjusting, but I'm not sure whether MESSAGE or
>>>> current.html is the best way to signal that.
> 
> Your use case isn't niche, but as you noted it can already be achieved
> with the current script.  Dropping --daemon would be the wrong move
> anyway, both in itself and because it would break currently working
> setups.
> 
> So what about just documenting the --config and --daemon quirks?
> I tried to make it reasonably concise but it can probably be improved.
> 
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/net/openvpn/Makefile,v
> diff -u -p -r1.138 Makefile
> --- Makefile	29 Nov 2025 15:43:27 -0000	1.138
> +++ Makefile	6 Dec 2025 14:31:48 -0000
> @@ -1,6 +1,7 @@
>  COMMENT=	easy-to-use, robust, and highly configurable VPN
>  
>  DISTNAME=	openvpn-2.6.17
> +REVISION=	0
>  
>  CATEGORIES=	net security
>  
> Index: pkg/README
> ===================================================================
> RCS file: /cvs/ports/net/openvpn/pkg/README,v
> diff -u -p -r1.9 README
> --- pkg/README	22 Feb 2023 18:04:27 -0000	1.9
> +++ pkg/README	6 Dec 2025 15:35:46 -0000
> @@ -14,7 +14,17 @@ Using the openvpn rc script
>  # rcctl enable openvpn
>  # rcctl set openvpn flags '--config /etc/openvpn/server.conf'
>  
> +To avoid ambiguity in options handling, always explicitly
> +specify --config before the path to your configuration file.
> +

openvpn(8) itself explains the details and it only doesn't work because
of what is now explained below, so I'd drop that sentence.

>  To handle multiple openvpn instances see EXAMPLES in rcctl(8).
> +
> +The openvpn rc script always passes --daemon before the user-selectable
> +flags.  This breaks the effets of 'daemon <custom-progname>' in
> +configuration files.  To work around this, you can pass an optional
> +<custom-progname> at the start of the user-selectable flags:
> +
> +# rcctl set openvpn flags 'openvpn-custom --config /etc/openvpn/custom.conf'

If we go that way, this seems good enough, although I'd say just "progname"
to match openvpn(8) wording and use ... instead of --config /file for brevity.

>  
>  Using an /etc/hostname.* file without persist-tun
>  -------------------------------------------------
> Index: pkg/openvpn.rc
> ===================================================================
> RCS file: /cvs/ports/net/openvpn/pkg/openvpn.rc,v
> diff -u -p -r1.2 openvpn.rc
> --- pkg/openvpn.rc	10 Mar 2022 00:04:07 -0000	1.2
> +++ pkg/openvpn.rc	6 Dec 2025 14:31:48 -0000
> @@ -1,5 +1,7 @@
>  #!/bin/ksh
>  
> +# XXX "--daemon" must kept at the end of $daemon
> +# See pkg-readmes/openvpn
>  daemon="${TRUEPREFIX}/sbin/openvpn --daemon"
>  
>  . /etc/rc.d/rc.subr
>