--------------------------------------------------------------------------------
configuring cinit,
Nico Schottelius 2005-05-28 (Last Modified: 2005-06-05)
--------------------------------------------------------------------------------

0. Pre-compile configuration
1. General configuration layout
2. Hints
2.0 Service executing / parameters
2.1 Daemons
2.2 Logging
2.3 Using prepared scripts
3. Profiles


0. Pre-compile configuration

Have a look at conf/*. Those variable will mostly be used when
compiling cinit. Some will be read later (like destdir).


1. General configuration layout

/etc/cinit (configurable via conf/cinit_dir) stores the complete
cinit configuration.

cinit is service based.
A service consists of
   - a base directory (like /etc/cinit/getty/1)
   - dependency configuration:

      ./wants  - services it wants to be started before (but it
                 will work anyway)

      ./needs/ - services it needs. If those services fail, this service
                 won't be started.
 
   - a flag indicating whether to respawn the service:

      ./respawn (simply touch it)

   - a delay: how long to wait for the service (in seconds) before
     sending SIGKILL after the SIGTERM (only for respawning processes):
      
      ./delay (one line with only the digits)

      If delay is non-existing or not readable, the delay from
      conf/sleep_kill_svc is taken. The maximum length of this
      number ("9999" uses length 4, "42" needs 2 bytes) can be adjusted
      at compile time in conf/max_delay. Internally this is a signed
      integer, so the maximum size depends on your system. Though
      I don't think anybody will want to wait for a service as long as
      an integer would allow.

   - the program to run when switching the service on and off:

      ./on        (a link to a program or a shell script)
      ./on.params (see conf/c_params, the parameters to pass to the program)
      ./on.env    (see conf/c_env, the environment to pass to the program)

      ./off          (call that when shutting down the service)
      ./off.params   (the parameters to pass to the program)
      ./on.env       (the environment to pass to the program)

You should have a look at the samples/ directory for examples.

If things are missing, cinit will continue with what's available.
This way you only need the files you use. Some examples:

   /etc/cinit/init:
      ./wants -> services it wants
      ./needs -> services it needs
      That's everything

   /etc/cinit/testsvc:
      on       -> link to program
      on.param -> parameters to program
      respawn  -> restart it
      That's everything, as it has no dependencies
 
   /etc/cinit/fullsvc:
      on          -> program to start when switching on
      on.params   -> parameters to pass to start program
      on.env      -> environment to pass to start program

      respawn     -> respawn on service
      delay       -> wait this time before sending SIGKILL after SIGTERM

      off         -> program to start when switching off
      off.params  -> parameters to pass to stop program
      off.env     -> environment to pass to stop program

      wants/*     -> services it wants before starting (non-critical ones)
      needs/*     -> links to needed services (critical!) before starting


2. Hints

2.0 Service executing / parameters

The on and off files can and should be links to the programs you want
to execute. This way you save yourself loading the big shell (which is
on many Linux systems bash, why so ever, dash does the job as good, still
beeing small).

The on.params and off.params files could also be links to system configuration:

Assume the service is called local-tuning/keyboard. The on script
could look like:

   on -> /bin/loadkeys
   on.params -> /etc/sys/keyboard.mapping

   And /etc/sys/keyboard.mapping would contain only the string
   "dvorak" (or "de-latin1" or "sg-latin1" or ...).


2.1 Daemons

Respawning daemons is a bit more difficult, as daemons do often fork()
(go to background, the calling process exits).

This way cinit cannot watch it directly.

The first solution is to check the documentation of your daemon program,
if it has a switch to disable forking (Please have a look at
daemons.backgrounding for a list of known daemons and their switches
to avoid backgrounding).

The other possibility is to use a program, which will
   a) start the daemon
   b) look into the pidfile of the daemon
   c) will then wait until that pid does not exist anymore
   d) and then it exits and cinit will restart it (goto a) now)

Such a program is included into this cinit release,
though I do not recommend using it. You should better contact the
authors and make them implement a clean non-forking mode.

The name of the program (actually a shell script) is "cinit.wait.for.daemon".

You will use it as the "on" part of the service and you have to add

   a) the pidfile to on.params
   b) the daemon binary

Thus the service would look like:

   svc-broken-daemon/
      on -> /sbin/cinit.wait.for.daemon
      on.params:
         /var/run/apache.pid
         /usr/packages/apache-2.0.51/bin/httpd
         -DSSL

Be aware: This is just a hack, first try to avoid backgrounding
and you won't need this hack!


2.2 Logging

Currently there's no special logging support.
When programs write to stdout, it will be displayed on
the same stdout cinit is connected to
(we don't even open /dev/console - we are too lazy currently).


2.3 Using prepared scripts

In the bin/ directory of this tarball you'll find at least:

   cinit.add.dependency - add a dependency to a service
   cinit.add.getty      - add a new getty
   cinit.create.empty.service - create an empty service
   cinit.reboot         - reboot in /bin/sh
   cinit.remove.getty   - remove a getty service
   cinit.respawn.off    - switch respawing off
   cinit.respawn.on     - switch respawing on
   cinit.shutdown       - shutdown in /bin/sh


3. Profiles

Since cinit-0.0.6 there is profile in cinit.
Profiles are described in doc/profile.support.

X. Examples

Can be found in the tarballs below samples/.
