Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 Jul 2004 17:56:16 +0300
From:      Mike Makonnen <mtm@identd.net>
To:        Oliver Eikemeier <eikemeier@fillmore-labs.com>
Cc:        current@freebsd.org
Subject:   Re: RFC: Alternate patch to have true new-style rc.d scripts in ports (without touching localpkg)
Message-ID:  <20040731145616.GA14576@rogue.acs-et.com>
In-Reply-To: <03C7D82F-E2F5-11D8-9C56-00039312D914@fillmore-labs.com>
References:  <20040731104933.GA1312@rogue.acs-et.com> <03C7D82F-E2F5-11D8-9C56-00039312D914@fillmore-labs.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jul 31, 2004 at 03:24:56PM +0200, Oliver Eikemeier wrote:
> Mike Makonnen wrote:
> 
> 
> Lets be realistic: Nearly nobody wants his scripts to be sourced in the 
> startup shell, especially not in /usr/local/etc/rc.d. People who really 
> want to do this are experts that exactly know what they are doing, and 
> are not easily confused.

*sigh* You cannot arbitrarily declare that "nearly nobody wants his
scripts to be sourced in the startup shell". You have no idea of knowing
what a user might want to do with his system and what his level of
expertise is.

> >>Legacy script were never executed when put in
> >>/etc/rc.d, and won't after this patch. I can't really follow your
> >>argument here.
> >
> >I'm not talking about legacy scripts. I mean local rc.d scripts.
> 
> Local rc.d scripts will continue to be executed as before.

except if they have a .sh extension.

> 
> I'm not exactly concerned with NetBSD compatibility here, especially 
> considering the facts that (a) rc.subr has already set_rcvar with `case 
> ${OSTYPE}' in it (only in the FreeBSD version, I can't find that in 
> NetBSD), which doesn't exist in NetBSD, (b) The only two scripts with 
> an `.sh' extension (early.sh rcconf.sh) are FreeBSD specific, while the 
> only NetBSD script with an `.sh' extension (bootconf.sh) doensn't exist 
> in FreeBSD. Compatibility with NetBSD seems to be a myth, especially 
> since they never bothered to merge the changes back from FreeBSD.

I don't mean source code compatibility. I don't really care *too much*
about that either. What I am concerned with is compatibility 
behaviour-wise.

> 
> >>>Also, a sysadmin
> >>>might have a local script in /usr/local/etc/rc.d that may for example,
> >>>load a different rc.conf depending on circumstances.
> >>
> >>{He,She} might, although I consider such a functionality to be exotic
> >>and fragile. Anyway, /etc/rc.d could be used for that purpose.
> >
> >You have no way of knowing what users want to do or what their 
> >circumstances
> >are. This would be be an instance of enforcing policy instead of
> >providing mechanisms for users to do what they want.
> 
> When you have no way of knowing what users want to do, how can you 
> provide mechanisms for them to do so?

By leaving their options open. By not forcing them to do it one way.

> (a) I want rc.d scripts in /usr/local/etc/rc.d to behave exactly like 
> they do in /etc/rc.d, namely participate in rcorder(8). This was the 
> most common reason to move scripts from /usr/local/etc/rc.d to /etc/rc.d.

If ports rc.d scripts with .sh extensions aren't sourced in the same shell,
then they don't behave "exactly like they do in /etc/rc.d". Participating
in the boot ordering is not the stick by which the "rc.d'ness" (for lack
of a better word) of a script is measured.

> 
> (b) While doing this, I want to keep documented behaviour, so users can 
> keep what worked for them before.

Correction-- what worked for them in most of 5-CURRENT up to now.

> We shouldn't break backwards compatibility for no good reason. 
> Compatibility with NetBSD in aspects we never have been compatible is 
> not a good reason to introduce an incompatiblity with -CURRENT.

We *have* been compatible with respect to behaviour of an rc.d script.
While we have digressed somewhat by *adding* features, the base behaviour
is the same.

Additionaly, compatibility with -CURRENT is not a valid
excuse for introducing hacks or allowing buggy behaviour to continue.

> 
> >>>2. Sourcing of ports rc.d scripts with the base sytem scripts to be
> >>>  put behind a knob. If the knob is enabled rc.d/localpkg does not
> >>>  run rc.d scripts in the local_startup directories. If it is turned
> >>>  off, then rc.d/localpkg does ports rc.d scripts in addition to the
> >>>  legacy scripts.
> >>
> >>I see no reason why localpkg should do rc.d scripts. It was always 
> >>meant
> >>to execute old-style scripts, and this behavior shouldn't be changed.
> >>Why do you want to introduce a semantic split here, that you seem to 
> >>try
> >>to avoid above?
> >
> >This feature MUST be put behind a knob. It
> >might have been okay if we had discussed this earlier in the 5-CURRENT
> >lifecycle, but not just before 5-STABLE. We need more time to evaluate
> >the impact of ordering ports rc.d scripts with the base system scripts.
> >Two weeks is not enough time.
> 
> I see absolutely no problems with having this feature now. You wanted 
> similar behaviour of scripts in /etc/rc.d and /usr/local/etc/rc.d, and 
> this is what this patch provides.

*sigh* No, it doesn't. It hacks rc.d to treat /usr/local/etc/rc.d scripts
with a .sh extension as old style scripts. That is not the same thing.

> It is completely backwards compatible, 
> so we don't have to fear breakage. Every new port that starts to 
> participate in rcorder(8) could be tested individually by the maintainer 
> before submitting, so this should be pretty save.

NO, because it's impossible for the maintainer to test it with even a
fraction of the possible combinations. Remember that the script has to
play nice with the scripts as they are currently in /etc/rc.d, with any
future changes we might have to make to the ordering, with any
new scripts we might add in the future (or we might have to remove
a script the script depends on), with current ports rc.d scripts,
with future ports rc.d scripts, and with any local rc.d scripts
written by a user.  By defenition, it is impossible for a maintainer
to be absolutely certain that his script will not break something.

> And we have time for 
> an adequate migration phase, which will help us detect problems. What 
> should be the issues of ordering ports rc.d scripts with the base system 
> scripts, especially when we require that nearly every of them has a 
> `REQUIRE: LOGIN' line? I except very few have the need for something 
> else, but the base will greatly benefit from them.
> 

1. Not all ports require that they be ordered with the base system scripts. As
   such not all users will benefit from ports being ordered along with the
   base system. It makes sense that these people be able to reduce their
   security exposure by keeping the ports startup order as it is now
   (i.e. somewhat separate from the base system scripts).

2. This is a major change that requires more than just 2 weeks of testing.
   If it should happen to break something users should be able to turn it
   off.

> 
> Ah, no: They where relying on documented behaviour in rc(8). localpkg is 
> not buggy, and should not be changed. The scripts are not buggy either, 
> they are simply old-style scripts that source rc.subr and use some of 
> its features. They have never been tested as rc.d scripts, but it should 
> be easy to convert them to become  that, since they are pretty similar. 
> Nevertheless one should not be confused of their character because of 
> their similarity to rc.d scripts: they are not, and should not be 
> treated so. Read rc(8) on how they should be handled. What we are trying 
> to do here is to introduce a *new* functionality, which requires new 
> scripts (although they conversion should be easy in most cases).
> 

Oh please, let's not get into semantic arguments here. If they
source /etc/rc.subr and implement the functionality that typically
defines rc.d scripts, then thay are rc.d scripts (or atleast
they are trying to be).

And since you brought up rc(8), these rc.d scripts you want to treat
as old style scripts violate one of the rules of old-style scripts:

     o   The output from each script is traditionally a space character, fol-
         lowed by the name of the software package being started or shut down,
         without a trailing newline character (see the EXAMPLES section).

rc(8) also gives a clear example of what an old-style ports script should
look like:

     The following is a simple, hypothetical example of an old-style
     /usr/local/etc/rc.d/ script, which would start a daemon at boot time, and
     kill it at shutdown time.

           #!/bin/sh -
           #
           #    initialization/shutdown script for foobar package

           case "$1" in
           start)
                   /usr/local/sbin/foo -d && echo -n ' foo'
                   ;;
           stop)
                   kill `cat /var/run/foo.pid` && echo -n ' foo'
                   ;;
           *)
                   echo "unknown option: $1 - should be 'start' or 'stop'" >&2
                   ;;
           esac


> 
> The only proposal I made in changing the behavior of rc.d is changing 
> the extension to something more well thought out, like `.rc'. Said that, 
> I can live with keeping `.sh' as the extension for sourcing rc.d 
> scripts, although it will do us no good. Anyway, I'm not a big fan of 
> changing documented behavior, be it -CURRENT or not. I think this is a 
> pretty reasonable attitude, but YMMV.

Ok, can you do the following then:

1. When you (portmgr) are ready put back the rc.d/localpkg changes
2. Put the ordering of ports scripts with base system
   scripts behind an rc.conf(5) knob, and modify your patch so both
   /etc/rc and /etc/rc.d/localpkg do the right thing depending on whether
   it's on or off.

Cheers.
-- 
Mike Makonnen  | GPG-KEY: http://www.identd.net/~mtm/mtm.asc
mtm@identd.net | Fingerprint: AC7B 5672 2D11 F4D0 EBF8  5279 5359 2B82 7CD4 1F55
mtm@FreeBSD.Org| FreeBSD - Unleash the Daemon !



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