Skip site navigation (1)Skip section navigation (2)
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>