Date: Thu, 16 Oct 2014 23:41:39 -0400 From: Allan Jude <allanjude@freebsd.org> To: freebsd-current@freebsd.org Cc: "dte >> Devin Teske" <dteske@FreeBSD.org> Subject: Re: [CFT] multiple instance support in rc.d script Message-ID: <54408FF3.10902@freebsd.org> In-Reply-To: <20141017.102259.2303779237508789020.hrs@allbsd.org> References: <20141017.102259.2303779237508789020.hrs@allbsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--KjqH1SK7gMFcjvNrbxSvMMsqEkCcmPP1J
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable
On 2014-10-16 21:22, Hiroki Sato wrote:
> [Please reply to freebsd-rc@]
>=20
> Hi,
>=20
> I would like your feedback and testers of the attached patch. This
> implements multiple instance support in rc.d scripts. You can try it
> by replacing /etc/rc.subr with the attached one.
>=20
> More details are as follow. Typically, an rc.d/foo script has the
> following structure and rc.conf variables:
>=20
> /etc/rc.d/foo:
> ----
> name=3Dfoo
> rcvar=3Dfoo_enable
> ...
> load_rc_command $name
> run_rc_command $*
> ----
>=20
> /etc/rc.conf:
> ----
> foo_enable=3D"YES"
> foo_flags=3D"-f -l -a -g"
> ----
>=20
> The above supports one instance for one script. After replacing
> rc.subr, you can specify additional instances in rc.conf:
>=20
> /etc/rc.conf:
> ----
> foo_instances=3D"one two"
>=20
> foo_one_enable=3D"YES"
> foo_one_flags=3D"-f -l -a -g"
>=20
> foo_two_enable=3D"YES"
> foo_two_flags=3D"-F -L -A -G"
> ----
>=20
> $foo_instances defines instances by space-separated list of instance
> names, and rc.conf variables for them are something like
> ${name}_${instname}_enable. The following command
>=20
> # service foo start
>=20
> starts foo_one and foo_two with the specified flags. Instances can
> be specified in the following form:
>=20
> # service foo start:one
>=20
> or multiple instances in a particular order:
>=20
> # service foo start:two,one
>=20
> Basically, no change is required for the rc.d/foo script itself.
> However, there is a problem that default values of the instantiated
> variables are not defined.
>=20
> For example, if an rc.d/script uses $foo_mode, you need to define
> $foo_one_mode. The default value of $foo_mode is usually defined in
> etc/defaults/rc.conf for rc.d scripts in the base system and ":
> ${foo_mode:=3Dvalue}" idiom in scripts from Ports Collection. So all
> of the variables should be defined for each instance, too. As you
> noticed, this is not easy without editing the script itself.
>=20
> To alleviate this, set_rcvar() can be used:
>=20
> /etc/rc.d/foo:
> ----
> name=3Dfoo
> rcvar=3Dfoo_enable
>=20
> set_rcvar foo_enable YES "Enable $name"
> set_rcvar foo_program "/tmp/test" "Command for $name"
> ...
> load_rc_command $name
> run_rc_command $*
> ----
>=20
> The three arguments are varname, default value, and description. If
> a variable is defined by set_rcvar(), default values instantiated
> variables will be set automatically---foo_one_program is set by
> foo_program if it is not defined.
>=20
> This approach still has another problem. set_rcvar() is not
> supported in all branches, so a script using it does not work in old
> supported branches. One solution which can be used for scripts in
> Ports Collection is adding both definitions before and after
> load_rc_command() until EoL of old branches like this:
>=20
> /etc/rc.d/foo:
> ----
> name=3Dfoo
> rcvar=3Dfoo_enable
>=20
> if type set_rcvar >/dev/null 2>&1; then
> set_rcvar foo_enable YES "Enable $name"
> set_rcvar foo_program "/tmp/test" "Command for $name"
> fi
> ...
> load_rc_command $name
>=20
> # will be removed after all supported branches have set_rcvar().
> if ! type set_rcvar >/dev/null 2>&1; then
> : ${foo_enable:=3D"YES"}
> : ${foo_program:=3D"/tmp/test"}
> for _i in $foo_instances; do
> for _j in enable program; do
> eval : \${foo_${_i}_enable:=3D\$foo_$_j}
> done
> done
> fi
>=20
> run_rc_command $*
> ----
>=20
> This is a bit ugly but should work fine.
>=20
> I am using this patch to invoke multiple named (caching
> server/contents server) and syslogd (local only/listens INET/INET6
> socket only) daemons. While $foo_instances is designed as a
> user-defined knob, this can be applied to software which need to
> invoke multiple/different daemons which depend on each other in a
> script, too.
>=20
> I am feeling this patch still needs more careful review from others.
> Any comments are welcome. Thank you.
>=20
> -- Hiroki
>=20
This feature is quite useful. I've used the built in version that the
rc.d script in memcached and it is very helpful to be able to run
multiple named instances.
I wonder if sysrc could be improved to support an 'append', so you can ha=
ve:
foo_instances=3D"one two"
and do:
sysrc --append foo_instances=3Dthree
to get:
foo_instances=3D"one two three"
instead of having to do:
sysrc foo_instances=3D"`sysrc -n foo_instances` three"
or something more convoluted
--=20
Allan Jude
--KjqH1SK7gMFcjvNrbxSvMMsqEkCcmPP1J
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (MingW32)
iQIcBAEBAgAGBQJUQI/2AAoJEJrBFpNRJZKf82wP/1j1bAHgJqk4moMCI6fLgK4y
yATrAPOY7NcX7TIqI719JvhLTrgxzUrdTVAY9O/TYuOtlVz0FabtvPbL2Pd8yS+f
z94IKkiF3dNglXz0DeFNBoi3bIstAL6eP9Rxrbx5zFxDOCLQjqZBWTIhjElPSrUF
JsiWcsHGcbtG8aD9YKI4zXlK8WrKtWISBGikZ3B2jEuT5yw+mIkCKspmHMac+DfY
Y1/wdxECjuLkvhNHgJCvR6pZLDEyu3O8bzRxfKpI/68T131S/4SEDZeNUN69NFYG
927v5ZqOX0AYIFZPw05NpEmFjUUz9/f1GJTYnyHfpP7ZaXF5o8FbUFXS/zAzFFgs
VH/I/ws45xfsrKNDH1JXfxPQJczAvFxnR6LIaqiOKAqm1lvM5HKDqplftWlA5uox
/CzY6njDiugYGaOY2yJhx2Qj6g0PNUUECjDPeZqw6dCHQohltiYK81LaNG6vOLJK
12vizOcqYIb+eQm9UI8vBqY9wFwWuDJNu963YtkNiVDc74Z2k/1w2qhtHzrHkMvW
SYO1BTo+OZApo2Nvh/U3qyd9huOmaBa3YL8aUCOHruE8zqbmkEzgWKj67gQM9Nk9
OowYx8y8+36jij7QkJiDqP2Rm5Y6nFsVWn2Y94PJGXMS3tZ2fckZp8f178+fwLQs
TfDfGRs7IK65f3VfITbz
=VlVl
-----END PGP SIGNATURE-----
--KjqH1SK7gMFcjvNrbxSvMMsqEkCcmPP1J--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?54408FF3.10902>
