================================================
         S E R V I C E    M A N A G E R
@1998,99 by Antonio GALLO <agx@TOGLIMI.linux.it>
================================================
1999-06-10, Versione 1.0.0 (2^ revisione) by AGX
1999-10-07, Versione 1.1.0 (CANDIDATE) by AGX
1999-11-14, Versione 1.6.0 (FINALE) by AGX
---------------------------------------------------

PREMESSA:
- Per un esempio semplice guardare come e' fatto inetd.service
- Un esempio complesso e senz'altro quello del mouse (gpm.service)
- Ogni funzione e' commentata in dettaglio in /etc/inet.d/service-manager.inc
  dove trovate anche i codici di ritorno.


Servizi
===============================
Gli User's Profiles offrono, tramite il 'Service Manager', un comodo
modo di gestire i daemons di sistema.
Gli script che gestiscono i servizi risiedono in /etc/init.d/ ed hanno 
estenzione ".service".
Al loro interno contengono una serie di chiamate a funzioni contenute nel
service-manager.inc (il precedente service-body.inc
 e' obsoleto),
questo rende uno script di servizio abbastanza snello e leggibile.

Un servizio deve gestire i seguenti parametri:
	- start                       - Richiesta di avvio del servizio
	- stop                        - Richiesta di arresto del servizio
	- reload                      - Forza il servizo a rileggere il suo file di configurazione
	- restart or force-reload     - Ferma e riavvia un servizio
	- query, status or probe      - Mostra lo stato del servizio
	- configure                   - Chiede al servizio di lanciare il programma di configurazione
                                        N.B. Questo ferma il servizio !
	- enable                      - abilita' il servizio a partire al boot
	- reset                       - il servizio puo' partire solo manualmente
	- disable                     - il servizio non puo' essere riavviato
	- init			      - crea il file di configurazione, device,
					etc., richiesti dal servizio secondo i
					parametri presenti nel profilo utente
					attuale.



Il file di configurazione
=========================

Il file di configurazione, come spiegato in user-profiles.txt,
e' memorizzato in
	/etc/sysconfig/$PROFILE/$SERVICE_CONFIG
se questo file non e' presente viene lanciato il tool di configurazione
del servizio.
Se il servizio e' in esecuzione viene impostato il flag file
	/var/lock/subsys/$SERVICE_SUBSYS
piu' il PID file in
	/var/run/${SERVICE_NAME}.pid



Abilitare, disabilitare un servizio
===================================
Come in Window NT, adesso si possono configurare i servizi per essere:
   - AUTO,   eseguiti direttamente al boot della macchina;
   - MANUAL, non eseguiti al boot ma solo manualmente usando il comando service;
   - LOCK,   bloccati anche usando il comando service;

Questa feature e' implementata controllando la variabile 'RUNME'
all'interno del file di configurazione del servizio.



Cambiamenti rispetto alla versione 1.1.0 : init --> initialize
==============================================================

Nella versione 1.0.0, ogni volta che partiva un servizio, importanti file
di configurazione venivano sovrascritti. Per ovviare a cio', in questa nuova
release, le operazioni che avvengono sul filesystem sono state spostate nella
funzione 'initialize' e non piu' in start. Esiste quindi la funzione 
'service_check_profile' che chiama 'initialize' nel caso in cui, al boot,
il profilo corrente in avvio sia diverso dall'ultimo profilo utilizzato
sulla macchina. Questo permette due cose fondamentali :
    - i file di configurazione non sono sovrascritti ad ogni boot
    - vengono cambiati solo se si utilizza il relativo tool di configurazione

Queste due feature sono molto importanti nel caso in cui l'amministratore
voglia gestire il sistema in maniera 'classica'.

Come detto, le modifiche ai file di sistema devono essere spostate tutte
nella funzione 'initialize', questa viene chiamata dal tool di configurazione
usando il parametro 'init'. Il funzionamento del tool di configurazione
e' spiegatp negli 'agx-userprofile'. Possiammo pero' accennare che segue
questo schema:
    service dummy stop
    # Modifica del file di configurazione
    service dummy init
    service dummy start
oppure
    service dummy restart
    ( nel caso il restart di quel servizio supporti l'initialize nella
      funzione di restart )


*************************
Come funziona un servizio
*************************

Un servizio inizia con la seguente dichiarazione di variabili
utilizzate dalla parte pre-configurata del servizio :

# Nome del servizio
SERVICE_NAME="inetd"
# Descrizione del servizio
SERVICE_DESCRIPTION="The console mouse daemon"
# Eseguibile principale del servizio
SERVICE_BIN=$SERVICE_NAME
# Nome del servizio prerequisito
SERVICE_PREREQ=""
# Nome del file di configurazione (stesso nome del servizio)
SERVICE_CONFIG="$SERVICE_NAME"
# Nome del programma di configurazione (se presente)
SERVICE_SETUP="/usr/local/lib/agx-userprofiles/$SERVICE_NAME.sh"

# Quindi vengono incluse le funzioni di utilita' necessarie
# alla correta gestione del servizio
. /etc/init.d/service-manager.inc

# Quindi sono presenti tutte le funzioni, gia' preparate di gestione
# di un servizio. ATTENZIONE pero', questo e' valido solo per servizi
# molto semplici. Per operazioni piu' complesse verranno ora discusse 
# tutte le informazioni che vengono messe a disposizione.



**************************
Personalizzare un servizio
**************************


start
-----

service_check_exec	"$SERVICE_BIN"		"$SERVICE_NAME"
    Controlla se l'eseguibile e' presente, se il vostro servizio richiede
    piu' eseguibili vanno inserite piu' righe. Se l'eseguibile e' nel path
    non utilizzate un percorso assoluto.
service_check_prereq 	"$SERVICE_PREREQ"	"$SERVICE_NAME"
    Controlla che un servizio prerequisito sia stato avviato.
    Se il vostro servizio richiede piu' prerequisiti aggiungete piu' righe.
service_check_config	"$SERVICE_CONFIG"	"$SERVICE_SETUP"
    Carica i parametri dal file di configurazioe, se questi non presente
    prova a lanciare il programma di configurazione se specificato.
service_check_running	"$SERVICE_NAME"		"$SERVICE_BIN"
    Controlla che il servizio non sia gia' in esecuzione, dovete aggiungere
    una riga per ogni demone che utilizzate.
service_check_profile
    Contralla che il profilo non sia cambiato (solo al boot) in tal caso
    chiama 'initialize' (vedi NOTE in apertura).
service_start
    Avvia il demone specificato
    


stop
----
Funzionano sulla stessa logica di 'start' ma ovviamente
applicata al contrario; le funzioni chiamate sono quasi
le stesse.

service_check_exec	"$SERVICE_BIN"		"$SERVICE_NAME"
    Non e' strettamente necessario in questa fase, si usa solo se per
    stoppare il servizio e' necessario un eseguibile diverso da quello
    per avviarlo (es. quotha)
service_check_config	"$SERVICE_CONFIG"	"$SERVICE_SETUP"
    E' necessario usarlo solo nel caso si abbia bisogno dei parametri
    di configurazione anche in fase di arresto (es. swap)
service_check_not_running	"$SERVICE_NAME"		"$SERVICE_BIN"
    Controlla che il servizio sia gia' in esecuzione.
service_stop
    Ferma il demone specificato
service_stopall
    Ferma tutti i demoni avviati con quel nome



restart
-------
Null da cambiare, viene fermato il servizio con l'opzione 'relaxed'
in modo da non visualizzare scritte di warning nel caso il servizio
fosse gia' fermo. Quindi avvia il servizio.

N.B.
  Se il servizio supporta la funzione di initialize deve essere chiamata
  la funzione init prima di quella di start


reload
------
Se il demone supporta il reload del file di configurazione tramite
il signale HUP, allora viene usata questa funzione, altrimenti 
si esegue un normale restart.

service_check_not_running	"$SERVICE_NAME"		"$SERVICE_BIN"
    Controlla che il servizio sia gia' in esecuzione. E' un prerequisito
    fondamentale.
service_sighup
    Manda il segnale di HUP al demone



configure
---------
Lancia 'service_configure' che chiama il tool di configurazione



query
-----
Lancia 'service_query' che effettua le query sullo stato del servizio



enable, disable, reset
----------------------
Chiama nell'ordine 'service_enable', 'service_disable' e 'service_reset'
per gestire l'abilitazione o meno del servizio al boot-time o manualmente.



=========================
Il service manager
=========================
Il comando service e' il front-end per gestire i servizi.
E possibile lanciarlo come:

    service --list
	per avere l'elenco dei servizi disponibili

    service --all
	per avere l'elenco di tutti i se
# ===============================================================
# service_start
# ---------------------------------------------------------------
# Avvia l'eseguibilo ad un servizio (vedi sopra)
	i comandi sono i soliti: start, stop, etc.

    service --help
	R.T.F.M. :-)
