Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Aug 2004 17:08:00 -0700
From:      Brooks Davis <brooks@one-eyed-alien.net>
To:        Jon Passki <cykyc@yahoo.com>
Cc:        freebsd-rc@freebsd.org
Subject:   Re: Feature request to rc.d: managing subsets of scripts
Message-ID:  <20040811000800.GA5987@Odin.AC.HMC.Edu>
In-Reply-To: <20040807214302.73783.qmail@web50307.mail.yahoo.com>
References:  <20040807214302.73783.qmail@web50307.mail.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--ReaqsoxgOBHFXBhH
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sat, Aug 07, 2004 at 02:43:02PM -0700, Jon Passki wrote:
> Hello All,
>=20
> I wish accomplish the following with rc.d scripts:
>=20
> 1) Scripts can be assigned to a subset;
> 2) Subsets can be ordered, with this order honored by rcorder;
> 3) Subsets can be independently started and stopped after the
> initial system startup;
>=20
> For me, the usage would be in situations where I have a bunch of
> interdependent scripts that would need a stop/start when for
> example I'm remounting a file system or reassigning daemons to a
> different network interface.  This way, I could assign scripts to
> subsets if I know that they utilize common interfaces or mounts.=20
> It is implied that if a script wasn't placed in a subset it should
> continue to function even though it may depend on or be a dependent
> of a subset that was stopped.  It is the responsibility of the
> sysadmin to properly segment subsets.
>=20
> 1) & 2) can be accomplished with the REQUIRE, PROVIDE and BEFORE
> lines.  This would also make me alter each rc.d script I wish to
> manage, but that is acceptable.  It's unknown to me if subsets
> should be disjointed.
>=20
> It isn't obvious to me, though, if 3) could work that way.  I still
> would see rcorder doing it's magic, but it would need a filter to
> only order that subset.  The KEYWORD line could be used in addition
> to the other lines, but adds some redundancy.  According to  [1],
> rcorder logically OR's keep list switches.  It would have to AND
> them in this case to handle a) the FreeBSD switch and b) more
> importantly, manage more than one subset.

I want this feature.  What I want it for is to have a set of scripts
that run before the standard ones so initdiskless can add scripts to
/etc/rc.d (and thus I can keep /etc/rc.d stock).  What I'm planning to
do is to add a -K option to rcorder which will make keywords evaluate
ANDed.  Keywords will still be passed with -k, just the evaluation
function will change.  Here's a patch for rcorder that adds this
function.  A patch to /etc/rc is also needed to handle the subsets.  I'm
not 100% sure how to do this given my desire to have an "early" set that
runs before everything.  Maybe we should just hardcode that one.

-- Brooks

=3D=3D=3D=3D //depot/user/brooks/cleanup/sbin/rcorder/rcorder.8#2 - /home/b=
rooks/working/freebsd/p4/cleanup/sbin/rcorder/rcorder.8 =3D=3D=3D=3D
@@ -39,6 +39,7 @@
 .Nd print a dependency ordering of interdependent files
 .Sh SYNOPSIS
 .Nm
+.Op Fl K
 .Op Fl k Ar keep
 .Op Fl s Ar skip
 .Ar
@@ -92,12 +93,23 @@
 .Pp
 The options are as follows:
 .Bl -tag -width indent
+.It Fl K
+Require all keywords in the
+.Dq "keep list"
+to be in each file.
+The default is to require one or more.
 .It Fl k
 Add the specified keyword to the
 .Dq "keep list" .
 If any
 .Fl k
-option is given, only those files containing the matching keyword are list=
ed.
+option is given, only those files containing one or more of the matching
+keyword are listed.
+The
+.Fl K
+option causes all keywords in the
+.Dq "keep list"
+to be required.
 .It Fl s
 Add the specified keyword to the
 .Dq "skip list" .
=3D=3D=3D=3D //depot/user/brooks/cleanup/sbin/rcorder/rcorder.c#1 - /home/b=
rooks/working/freebsd/p4/cleanup/sbin/rcorder/rcorder.c =3D=3D=3D=3D
@@ -69,6 +69,7 @@
 #define KEYWORDS_STR	"# KEYWORDS:"
 #define KEYWORDS_LEN	(sizeof(KEYWORDS_STR) - 1)
=20
+int keyword_or =3D 1;
 int exit_code;
 int file_count;
 char **file_list;
@@ -155,7 +156,7 @@
 {
 	int ch;
=20
-	while ((ch =3D getopt(argc, argv, "dk:s:")) !=3D -1)
+	while ((ch =3D getopt(argc, argv, "dKk:s:")) !=3D -1)
 		switch (ch) {
 		case 'd':
 #ifdef DEBUG
@@ -164,6 +165,9 @@
 			warnx("debugging not compiled in, -d ignored");
 #endif
 			break;
+		case 'K':
+			keyword_or =3D 0;
+			break;
 		case 'k':
 			strnode_add(&keep_list, optarg, 0);
 			break;
@@ -704,13 +708,25 @@
 	strnodelist *s;
 	strnodelist *k;
=20
-	for (s =3D keep_list; s; s =3D s->next)
-		for (k =3D fnode->keyword_list; k; k =3D k->next)
-			if (strcmp(k->s, s->s) =3D=3D 0)
-				return (1);
+	for (s =3D keep_list; s; s =3D s->next) {
+		for (k =3D fnode->keyword_list; k; k =3D k->next) {
+			if (strcmp(k->s, s->s) =3D=3D 0) {
+				if (keyword_or)
+					return (1);
+				else
+					break;
+			}
+		}
+		if (!keyword_or && k =3D=3D NULL)
+			return (0);
+	}
=20
-	/* an empty keep_list means every one */
-	return (!keep_list);
+	if (keyword_or) {
+		/* an empty keep_list means every one */
+		return (!keep_list);
+	} else {
+		return (1);
+	}
 }
=20
 /*

--=20
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529  9BF0 5D8E 8BE9 F238 1AD4

--ReaqsoxgOBHFXBhH
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQFBGWNfXY6L6fI4GtQRAtTfAJwNtTm5IwrxHn7vpl+TBaQLMoeEEgCgsE2b
M6cxpa85PDBUOHqTWwYlehg=
=i71T
-----END PGP SIGNATURE-----

--ReaqsoxgOBHFXBhH--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040811000800.GA5987>