<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
  <title>daemontools howto</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta name="GENERATOR" content="vi">
</head>
<body>

<hr>
<h1>daemontools >= 0.76</h1>
<h2>Di Ivan Fabris,
&#105;&#46;&#102;&#97;&#98;&#114;&#105;&#115;&#64;&#100;&#97;&#114;&#116;&#104;&#120;&#105;&#111;&#110;&#103;&#46;&#110;&#101;&#116;
</h2>
<p>r. 20020302, per versioni di daemontools uguali o superiori alla 0.76</p>
<hr>
Guida pratica all' installazione di daemontools e alla configurazione dei
 servizi
<hr>

<a name="d1_toc"></a><h1>1 <a href="#d1_start">Intro</a></h1>
<ol>
    <li><a href="#d1_licenza">Licenza</a></li>
    <li><a href="#d1_intro">Introduzione</a></li>
    <li><a href="#d1_caveats">Attenzione!!</a></li>
</ol>

<a name="d2_toc"></a><h1>2 <a href="#d2_start">Installazione e
 configurazione</a></h1>
<ol>
    <li><a href="#d2_install">Installazione</a></li>
    <li><a href="#d2_upgrade">Upgrade da versioni inferiori</a></li>
    <li><a href="#d2_ctrl">La radice dei servizi</a><br>
    <li><a href="#d2_descr">Descrizione comandi</a><br>
        <ol>
            <li><a href="#d2_descr_svscanboot">svscanboot</a></li>
            <li><a href="#d2_descr_svscan">svscan</a></li>
            <li><a href="#d2_descr_supervise">supervise</a></li>
            <li><a href="#d2_descr_svc">svc</a></li>
            <li><a href="#d2_descr_svok">svok</a></li>
            <li><a href="#d2_descr_svstat">svstat</a></li>
            <li><a href="#d2_descr_fghack">fghack</a></li>
            <li><a href="#d2_descr_pgrphack">pgrphack</a></li>
            <li><a href="#d2_descr_readproctitle">readproctitle</a></li>
            <li><a href="#d2_descr_multilog">multilog</a></li>
            <li><a href="#d2_descr_tai64n">tai64n</a></li>
            <li><a href="#d2_descr_tai64nlocal">tai64nlocal</a></li>
            <li><a href="#d2_descr_setuidgid">setuidgid</a></li>
            <li><a href="#d2_descr_envuidgid">envuidgid</a></li>
            <li><a href="#d2_descr_envdir">envdir</a></li>
            <li><a href="#d2_descr_softlimit">softlimit</a></li>
            <li><a href="#d2_descr_setlock">setlock</a></li>
        </ol>
    </li>
    <li><a href="#d2_ctrl">Chi controlla i processi ?</a></li>
    <li><a href="#d2_uso">Usare i daemontools</a></li>
</ol>

<a name="d3_toc"></a><h1>3 <a href="#d3_start">daemontools con qmail</a></h1>
<ol>
    <li><a href="#d3_intro">Intro</a></li>
    <li><a href="#d3_services">I 3 servizi di qmail</a></li>
    <li><a href="#d3_qmaild">qmaild</a></li>
    <li><a href="#d3_smtpd">smtpd</a></li>
    <li><a href="#d3_pop3d">pop3d</a></li>
    <li><a href="#d3_connect">Aggancio ai daemontools</a></li>
    <li><a href="#d3_ctrl">avvio e controllo</a></li>
    <li><a href="#d3_log">I log</a></li>
    <li><a href="#d3_ps">Sta funzionando ?</a></li>
</ol>



<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>


<!-- MARK d1_start = intro -->
<a name="d1_start"></a>
<table border=0 align=center><tr><td>
<pre>
 _       _
(_)_ __ | |_ _ __ ___
| | '_ \| __| '__/ _ \
| | | | | |_| | | (_) |
|_|_| |_|\__|_|  \___/
</pre>
</td></tr></table>
<br>

<a name="d1_licenza"></a><h1>Licenza</h2>
<p>Se non specificato diversamente, il copyright dei documenti HOWTO di Linux
appartiene ai loro rispettivi autori. I documenti HOWTO di Linux possono
essere riprodotti e distribuiti nella totalit&agrave; o in parte, su ogni
mezzo  fisico o elettronico, purch&eacute; questo messaggio sia contenuto in
tutte le  copie. &Egrave; consentita e incoraggiata la ridistribuzione
commerciale; tuttavia,  all'autore piacerebbe ricevere informazioni su
ciascuna di tali distribuzioni.</p>
<p>Tutte le traduzioni, lavori derivati o lavori aggregati che contengono
qualsiasi documento HOWTO di Linux devono essere ricoperti da questo messaggio
di copyright. <br> Ossia, non &egrave; possibile produrre un lavoro derivato
da un HOWTO e imporre  delle restrizioni addizionali alla sua distribuzione.
Eventuali eccezioni  a queste regole possono essere concesse sotto particolari
condizioni; si  prega di contattare il coordinatore degli HOWTO di Linux. <br>
In breve, desideriamo promuovere la diffusione di queste informazioni
attraverso  pi&ugrave; canali possibile. Tuttavia, vogliamo mantenere il
copyright sui documenti&nbsp;&nbsp;  HOWTO, e gradiremmo essere informati su
qualsiasi intenzione di ridistribuire  gli HOWTO. </p>
<p>Per maggiori dettagli sulla licenza fate riferimento al documento
orginale della licenza LDP prelevabile all'indirizzo
<a
 href="http://metalab.unc.edu/LDP/COPYRIGHT.html">http://metalab.unc.edu/LDP/COPYRIGHT.html</a>.
</p>

<p>&nbsp;</p>

<a name="d1_intro"></a><h1>Introduzione</h1>
<p>I daemontools sono un insieme di programmi per il controllo dei servizi
 UNIX. <br>
<tt>supervise</tt> controlla i servizi, li avvia o li riavvia se
muoiono.  Inizializzare un servizio e' semplice, serve solo una directory con
uno script di nome <tt>run</tt> che  avvi il servizio, e che eventualmente
passi informazioni di log a  <tt>multilog</tt>.<br>
Altri programmi servono a preparare l' ambiente di esecuzione, ad impostare
i permessi per l' esecuzione dei programmi, a fornire una interfaccia di
comando e controllo per l' utente.

<p>&nbsp;</p>

<a name="d1_caveats"><h1>Caveats</h1>
E' <b>ASSOLUTAMENTE NECESSARIO</b> creare e conservare la
directory di compilazione, dei comandi e dei servizi  nella root directory e
con il loro nome, perche' i programmi di D J B sono costruiti  per lavorare
assieme, e cercano programmi e variabili di configurazione in  determinati
posti. L' unico sistema per non mettere cose strane nella root directory e,
contemporaneamente, assicurare stabilita' ai programmi, sono i link
simbolici.<br> Ne riparlero' anche in altri documenti. <br>
<p>Nel seguito saranno presentati script e comandi vari, gia pronti per
essere copiati/incollati o su un editor o direttamente in console. Si trovano
in tabelle con sfondo azzurro, mentre cio che si trova su sfondo grigio e',
nella maggior parte dei casi, cio' che andremo a rimpiazzare.<p>
<p>Gli script ed i comandi sono stati creati e provati su
<a href="http://www.debian.org">Linux Debian</a> Woody, quindi una versione
di Linux piuttosto aggiornata. Sistemi piu' vecchi o diversi da Linux
potrebbero necessitare di alcuni aggiustamenti.<br>
Fate attenzione agli apici singoli che racchiudono valori o comandi :
in certi casi in un file html possono essere rappresentati male, quindi se
qualche comando o script sembra non funzionare, la prima cosa da controllare
e' il carattere di apice ( carattere ASCII 39, esadecimale 27 ).</p>
<p>Il percorso ai comandi negli script e' /usr/local/bin. Il percorso reale
sarebbe /command, e se /usr/local/bin e' nel PATH dei comandi, potrebbe
persino essere omesso. Conviene tuttavia lasciare gli script come indicato</p>


<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>


<!-- MARK d2_start = installazione e configurazione -->
<a name="d2_start"></a>
<table border=0 align=center><tr><td>
<pre>
 _           _      ___                      __
(_)_ __  ___| |_   ( _ )     ___ ___  _ __  / _|
| | '_ \/ __| __|  / _ \/\  / __/ _ \| '_ \| |_
| | | | \__ \ |_  | (_>  < | (_| (_) | | | |  _|
|_|_| |_|___/\__|  \___/\/  \___\___/|_| |_|_|
</pre>
</td></tr></table>
<br>

<a name="d2_install"><h1>Installare i daemontools</h1>
<p>Come quasi tutto il software di D J Bernstein, le directory usate dai
daemontools per la compilazione ed il funzionamento sono un po' inusuali,
prevedendo di default di essere compilati in /package, e di risiedere nella
directory di compilazione ma di essere linkati in /command ed in
/usr/local/bin.<br>Se questo da' fastidio, avrete modo di usare una via
traversa nel seguito. Ma andiamo con ordine!</p>

Creare la directory <tt>/package</tt>
<pre>
     mkdir -p /package
     chmod 1755 /package
     cd /package
</pre>
Ora volendo si puo' spostare <tt>/package</tt> in <tt>/usr/local/</tt> per
mantanere pulita la root directory, e farne un link
<pre>
     mv /package /usr/local
     ln -s /usr/local/package /package
</pre>

Scaricare <a href="http://cr.yp.to/daemontools/daemontools-0.76.tar.gz">
daemontools-0.76.tar.gz</a>
in <tt>/package</tt>.
estrarre l' archivio
<pre>
     tar zxpvf daemontools-0.76.tar.gz
     cd admin/daemontools-0.76
</pre>

Compilare i programmi
<pre>
     package/install
</pre>

Opzionale, vedi il <a href="#d1_caveats">caveats</a> precedente : spostare
<tt>/command</tt> in <tt>/usr/local/command</tt>
<pre>
    mv -r /command /usr/local
    ln -s /usr/local/command /command
</pre>

Su sistemi BSD, riavviare la macchina per far ripartire <tt>svscan</tt>.
<p>
Per far infine sapere a D J B che l' installazione ha funzionato :
<pre>
     mail djb-sysdeps@cr.yp.to &lt; /package/admin/daemontools/compile/sysdeps
</pre>
</p>


<p>&nbsp;</p>


<a name="d2_upgrade"></a><h1>Upgrade da versioni inferiori</h1>
<h2> da 0.53 a 0.60 o 0.61</h2><b>TODO</b>
<h2> da 0.61 a 0.70</h2><b>TODO</b>
<h2> da 0.70 a 0.75 o 0.76</h2><b>TODO</b>


<p>&nbsp;</p>

<a name="d2_ctrl"><h1>Chi controlla il tutto?</h1>
Come ultimo passaggio del processo di installazione, l' installer aggiunge a
<tt>/etc/inittab</tt> la seguente linea
<pre>SV:12345:respawn:/usr/local/command/svscanboot</pre>
Oppure, se questo file non esiste, aggiunge
<pre>csh -cf '/command/svscanboot  &'</pre> a <tt>/etc/rc.local</tt>.
<br>
Perche' <tt>init</tt> ? E' il padre di tutti i processi, riavvia in automatico
tutti i processi che sono sotto il suo diretto controllo, come le tty, e' il
massimo dell'  affidabilita'; se morisse init, la macchina sarebbe da
riavviare. La linea di controllo stabilisce  che <tt>init</tt> deve avviare
<tt>svscanboot</tt> su tutti i runlevel, e li deve riavviare ( respawn ) se
muoiono. Piu' sicuro di cosi'....

<p>&nbsp;</p>



<a name="d2_descr"></a><h1>I programmi in dettaglio</h1>

<a name="d2_descr_svscanboot"></a><h2>svscanboot</h2>
<tt>svscanboot</tt> attiva il controllo sui servizi, che vengono registrati in
<tt>/service</tt>. Viene avviato di norma da <tt>init</tt> e non fa altro che
lanciare il  programma <a href="#d2_descr_svscan"><tt>svscan</tt></a>, mettendo l' output
in pipe a <a href="#d2_descr_readproctitle"><tt>readproctitle</tt></a>. Questo output
sara'  visibile con il comando <tt>ps</tt> come una sequenza di 400
&quot;.&quot;, i quali saranno sostituiti dall'  eventuale messaggio di errore
occorso. <tt>svscanboot</tt> imposta <tt>$PATH</tt> a
<pre>/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/us
r/X11R6/bin</pre>
e azzera ogni altra variabile d' ambiente.


<a name="d2_descr_svscan"></a><h2>svscan</h2>
<tt>svscan</tt> e' il programma che avvia e sorveglia i singoli servizi
<p>Uso : <tt>svscan</tt></p>
<p><tt>svscan</tt> lancia un <a
 href="#d2_descr_supervise"><tt>supervise</tt></a> per ogni
sottodirectory della  directory corrente ( tipicamente <tt>/service</tt> ),
fino ad un limite di 1000 e saltando le  directory i cui nomi iniziano con un
punto. <tt>svscan</tt> puo' avviare due <tt>supervise</tt> per una directory
 <tt>s</tt>, uno in <tt>s</tt> ed uno in <tt>s/log</tt>, ma solo se il nome
assoluto di <tt>s</tt> e' lungo meno di  255 caratteri e se <tt>s/log</tt>
esiste.
<tt>svscan</tt> richiede due descrittori di file.<br> <tt>svscan</tt>
controlla la directory dei servizi ogni 5 secondi, se trova  una nuova
directory avvia un nuovo processo <tt>supervise</tt>, mentre se uno dei
processi e' morto, ne  avvia uno nuovo mantenendo la stessa pipe di log,
cosicche' non vi siano perdite di  informazioni.<br>
<tt>svscan</tt> e' concepito per funzionare all' infinito. Se ha problemi ad
avviare <tt>supervise</tt> che deve essere nel <tt>PATH</tt>, stampa un
messaggio su <tt>STDERR</tt> e poi  riprova dopo 5 secondi.<br>
<tt>svscan</tt> puo' ricevere un parametro sulla linea di comando, che usa
come directory in cui cercare il servizio. In assenza di esso, viene cercato
in <tt>/service</tt>. <br><br>


<a name="d2_descr_supervise"></a><h2>supervise</h2>
<p><tt>supervise</tt> avvia e controlla un servizio.</p>

<p>Uso : <tt>supervise</tt> <i>s</i></p>

<p><tt>supervise</tt> si posiziona nella directory indicata ( <i>s</i> ) ed
avvia <tt>./run</tt>. Se <tt>./run</tt> termina, lo riavvia. Per evitare un
ciclo troppo veloce nel caso che <tt>./run</tt> termini subito,
<tt>supervise</tt> attende 1 secondo tra un avvio ed il successivo.<br>
Se esiste un file <tt>./down</tt>, allora <tt>./run</tt> non viene avviato.
In tal caso, per avviare il servizio usate <a href="#d2_descr_svc">
<tt>svc</tt></a> per controllare <tt>supervise</tt>.</p>
<tt>supervise</tt> mantiene le proprie informazioni di stato in
<tt>s/supervise</tt>, che deve essere scrivibile dal processo. Queste
informazioni possono essere lette con <a href="#d2_descr_svstat">
<tt>svstat</tt></a>.</p>
<p><tt>supervise</tt> potrebbe terminare immediatamente se non trova i file
di cui ha bisogno o se un' altro processo <tt>spervise</tt> e' attivo su
quella directory. Se <tt>supervise</tt> e' attivo, non terminera' a meno che
non gli arrivi un segnale di terminazione. Per controllare che <tt>
supervise</tt> sia effettivamente in esecuzione si usa
<a href="#d2_descr_svok"><tt>svok</tt></a>. Per mandare ordini a
<tt>supervise</tt> in maniera pulita ed affidabile si usa
<a href="#d2_descr_svscan"><tt>svscan</tt></a>.</p>


<a name="d2_descr_svc"></a><h2>svc</h2>
<p><tt>svc</tt> controlla i servizi monitorati da <tt>supervise</tt></p>

<p>Uso : <tt>svc</tt> <i>opts services</i>
<p><i>opts</i> e' una serie di comandi stile getopt. <i>services</i>
e' una lista di argomenti del tipo <tt>/service/nomeservizio</tt>, o
comunque il nome di una directory usata da <tt>supervise</tt> e contenente
uno script <tt>run</tt>
<p><tt>svc</tt> esegue i comandi su ogni servizio specificato, i comandi
possibili sono : </p>

<ul>
    <li>-u: Up. Se il servizio e' fermo, attivalo. Se il servizio dovesse
            fermarsi nel futuro, riattivalo.</li>
    <li>-d: Down. Se il servizio e' attivo. mandagli il segnale TERM e
            poi il segnale CONT. Dopo che si e' fermato, non riavviarlo.</li>
    <li>-o: Once. Se il servizio e' fermo, avvialo. Se dovesse fermarsi nel
            futuro, non riavviarlo.</li>
    <li>-p: Pause. Manda il segnale STOP al servizio.</li>
    <li>-c: Continue. Manda il segnale CONT al servizio.</li>
    <li>-h: Hangup. Manda il segnale HUP al servizio.</li>
    <li>-a: Alarm. Manda il segnale ALRM al servizio.</li>
    <li>-i: Interrupt. Manda il segnale INT al servizio.</li>
    <li>-t: Terminate. Manda il segnale TERM al servizio.</li>
    <li>-k: Kill. Manda il segnale KILL al servizio.</li>
    <li>-x: Exit. supervise si terminera' dopo che il servizio si e' fermato.
            Se stai usando questo comando in un sistema stabile, stai facendo
            una cosa errata : supervise e' progettato per funzionare in
            eterno.</li>
</ul>

<a name="d2_descr_svok"></a><h2>svok</h2>
<p><tt>svok</tt> controlla se un servizio
<a href="#d2_descr_supervise"><tt>supervise</tt></a> e' attivo</p>
<p>Uso : <tt>svok</tt> <i>servizio</i></p>
<p><tt>svok</tt> controlla se <tt>supervise</tt> e' attivo nella
directory chiamata <i>servizio</i>. Se si restituisce silenziosamente
il valore <b>0</b>, altrimenti restituisce altrettanto silenziosamente
il valore <b>100</b></p>


<a name="d2_descr_svstat"></a><h2>svstat</h2>
<tt>svstat</tt> stampa lo stato dei servizi controllati
da <a href="#d2_descr_supervise"><tt>supervise</tt></a>.
<p>Uso : <tt>svstat</tt> <i>servizi</i>
<p>
<i>servizi</i> e' una lista di argomenti, ciascuno dei quali e' il nome
di una directory. <tt>svstat</tt> stampa in forma leggibile da umani, una
linea per ogni directory, dicendo se <tt>supervise</tt> sta funzionando
con successo in quella directory, e riportando le informazioni di stato
prodotte da <tt>supervise</tt>.</p>


<a name="d2_descr_fghack"></a><h2>fghack</h2>
<b>TODO</b>


<a name="d2_descr_pgrphack"></a><h2>pgrphack</h2>
<b>TODO</b>


<a name="d2_descr_readproctitle"></a><h2>readproctitle</h2>
<p><tt>readproctitle</tt> mantiene informazioni di stato che possono essere
lette con il programma di sistema <tt>ps</tt>.
<tt>readproctitle</tt> e' disponibile dalla versione di daemoontools dalla
 0.75 in avanti</p>
<p>Uso : readproctitle <i>L</i> <i>D</i></p>

<p><tt><i>L</i></tt> e' un numero qualunqe di argomenti,
<tt><i>D</i></tt> e' un solo argomento che consiste come minimo di 5 punti<br>
<tt>readproctitle</tt> scrive il suo rapporto nella stringa dimensionata da
<tt><i>D</i></tt>, partendo dalla fine e scorrendo via via verso sinistra, il
che significa che i dati piu' recenti, che ancora permangono nella stringa,
possono essere visionati con un programma di controllo dei processi, come
<tt>ps</tt>. <tt>readproctitle</tt> lascia sempre 3 punti all' inizio della
stringa.</p>

Per esempio :
<pre>
     readproctitle io errors: ....................
</pre>
scriverebbe i dati di errore
<pre>
     fatal error xyz
     warning abc
</pre>
in questo modo
<pre>
     readproctitle io errors: ... xyz!warning abc!
</pre>

( i <tt>!</tt> sono fittizi, in realta' sarebbero dei caratteri di nuova
linea ). I programmi di rapporto dei processi normalmente mostrani i
caratteri di nuova linea come dei <tt>?</tt> o dei <tt>\n</tt>.
<tt>readproctitle</tt> termina quando raggiunge la fine dell' input.</p>
<p>Fate attenzione che alcune implementazioni di <tt>ps</tt> hanno
limitazioni nella lunghezza della lista degli argomenti. Questi limiti
si applicano alla lunghezza totale del comando <tt>readproctitle <i>L</i>
<i>D</i></tt>, ma difficilmente sara' inferiore a 512 bytes.</p>


<a name="d2_descr_multilog"></a><h2>multilog</h2>
<tt>multilog</tt> legge una sequenza di linee dallo standard input e le
aggiunge le linee selezionate ad un numero arbitrario di file di log</p>
<p>Uso : multilog <i>script</i><p>

<p><tt><i>script</i></tt> rappresenta un arbitrario numero di parametri che
specificano una particolare azione. Ogni azione viene eseguita nell' ordine
specificato e su ogni line di input. La azioni possono contenere dei
metacaratteri che vanno quotati ( racchiusi tra virgolette o preceduti da
un apposito carattere di escape ) nel caso che <tt>multilog</tt> sia avviato
da shell.</p>

<p><tt>multilog</tt> restiruisce <b>0</b> quando raggiunge la fine dello
standard input. Se stdin termina con una linea incompleta, <tt>multilog</tt>
aggiunge un carattere di nuova linea</p>

<p><tt>multilog</tt> scrive un messaggio di errore sullo standard error ed esce
restituendo <b>111</b>, senza leggere alcun dato da stdin, se finisce la
memoria o se un altro processo <tt>multilog</tt> sta scrivendo sullo stesso
file di log.</p>

<p>Se <tt>multilog</tt> non riesce a scrivere sul disco dopo aver cominciato a
leggere stdin, scrive un messaggio a stderr, si mette in pausa, e poi riprova,
( ripetendo il ciclo finche' necessario ), senza perdita di dati. IMPORTANTE
questo potrebbe pero' bloccare il processo che sta scrivendo sull' input di
<tt>multilog</tt>.</p>

<p>Se <tt>multilog</tt> riceve il segnale TERM, leggera' ed elaborera' stdin
fino al primo carattere di nuova linea, e poi terminera', lasciando stdin al
tutti e solo i dati non elaborati.</p>

<p><b>Selezione delle linee</b><br>
Di default viene selezionata ogni linea.<br>

L' azione <tt>-<i>pattern</i></tt>
deseleziona la linea se <tt><i>pattern</i></tt> ha una corrispondenza nella
stessa.<br>

L' azione <tt>+<i>pattern</i></tt>
seleziona la linea se <tt><i>pattern</i></tt> ha una corrispondenza nella
stessa.</p>

<p><tt><i>pattern</i></tt> e' una stringa di asterischi e non-asterischi.
La corrispondeza e' vera su ogni combinazione di * e non-* nell' ordine
in cui sono inseriti. Ogni non-* ha corrispondenza con se stesso, un *
corrisponde, con certe condizioni. ad una qualsiasi sequenza di
caratteri.<br>
Un * prima della fine di <tt><i>pattern</i></tt> corrisponde ad ogni
stringa che <i>non</i> contiene il carattere a lui successivo in
<tt><i>pattern</i></tt>.<br>
Un * alla fine di <tt><i>pattern</i></tt> corrisponde ad una qualsiasi
stringa</p>
<p>Esempi :<br>
l' azione <tt>+hello</tt> seleziona <tt>hello</tt> ma non
<tt>hello world</tt>.<br>
l' azione <tt>-named[*]: Cleaned cache *</tt> deseleziona la linea
<tt>named[135]: Cleaned cache of 3121 RRs</tt>. Il primo * corrisponde
ad ogni stringa che non include una ']'<br>
L' azione <tt>-*</tt> deselezione tutte le linee.</p>
<p>Per risparmiare memoria, <tt>multilog</tt> controlla
<tt><i>pattern</i></tt> soltanto sui primi 1000 caratteri di ogni linea</p>

<p><b>Avvisi</b><br>
L' azione <tt>e</tt> stampa su stderr i primi 200 bytes di ogni linea
selezionata.</p>

<p>
<b>Files di Stato</b><br>
L' azione <tt>=<i>file</i></tt> sostituisce il contenuto di
<tt><i>file</i></tt> con i primi 1000 bytes di ogni linea selezionata,
eventualmente riempiendo la linea con caratteri di nuova linea fino al
1001esimo carattere.<br>
Non ci sono meccanismi di protezione contro un eventuale spegnimento.</p>

<p>Per esempio, la sequenza di azioni
<tt>-* +STAT* =log/status</tt> fa si che il file <tt>log/status</tt>
conservi una copia della piu' recente linea che inizia con <tt>STAT</tt>.</p>

<p><b>L' istante dell' evento</b><br>
L' azione <tt>t</tt> inserisce una @, un timestamp preciso, ed uno spazio
all' inizio di ogni linea, usando lo stesso formato di
<a href="#d2_descr_tai64n">tai64n</a>. Se richiesto, <tt>t</tt> _deve_ essere
specificato come prima azione.</p>
<p>Eventuali corrispondenze nella linea verranno ricercate dopo l'
inserimento del timestamp.<br>
Per esempio : <br>
<tt>multilog t '-*' '+* fatal: *' ./main</tt>
leggera' in input la seguente linea
<pre>
     fatal: out of memory
</pre>
e registrera' nel file di log una linea tipo questa :
<pre>
     @400000003b4a39c23294b13c fatal: out of memory
</pre>
in cui il primo <tt>*</tt> corrispondera' al timestamp.</p>
<p>Per leggere in formato &quot;umano&quot; i timestamp precisi, si usa il
programma <a href="#d2_descr_tai64nlocal">tai64nlocal</a>, a cui si puo'
passare tramite pipe il log da leggere.</p>

<p><b>Rotazione automatica dei log</b><br>
Se <tt><i>dir</i></tt> inizia con un punto o una barra ( &quot;.&quot; o
&quot;/&quot; ) allora l' azione<tt><i>dir</i></tt>
appende ogni linea selezionata al file di log chiamato <tt><i>dir</i></tt>.
Se <tt><i>dir</i></tt> non esiste, <tt>multilog</tt> la crea.
<p>Non scrivete sullo stesso file con due processi<tt>multilog</tt>
simultanei, e non eseguite due azioni dallo stesso processo.</p>
<p>Il formato del log e' :
<tt><i>dir</i></tt> e' una directory contenente un certo numero di file di
log vecchi, un file di log chiamato <tt>current</tt>, ed altri file che
servono a <tt>multilog</tt> per tenere traccia delle proprie azioni.<br>
Ogni file di log vecchio ha un nume che comincia con @, continua col
timestamp dell' istante in cui il file di log e' stato finito, e termina
con uno dei seguenti codici:
<ul>
<li><tt>.s</tt>: Completato e scritto su disco
<li><tt>.u</tt>: Creato al momento di un disservizio; puo' essere stato
troncato, e non e' stato elaborato.
</ul>
Attenzione al fatto che NFS, filesistem asincroni, o filesistem journaled
potrebbero non registrare file che non sono stati scritti su disco al
momento di un' interruzione di corrente</p>
<p>Mentre <tt>multilog</tt> e' attivo, i permessi di <tt>current</tt>
sono impostati a 644. Se il flusso dello standard input a <tt>multilog</tt>
termina, <tt>multilog</tt> scrive <tt>current</tt> sul disco, ed imposta
i permessi di <tt>current</tt> a 744.
Quando riparte, reimpsta i permessi di <tt>current</tt> a 644 e continua
scrivendo nuove linee</p>
<p>Quando <tt>multilog</tt> decide che <tt>current</tt> e' grande a
sufficienza, scrive <tt>current</tt> sul disco, ne imposta i permessi
<tt>current</tt> a 744, e lo rinomina come un file di log vecchio.</p>

L' azione <tt>s<i>size</i></tt>
imposta la massima lunghezza del file di log per le successive
azioni <tt><i>dir</i></tt>. <tt>multilog</tt> decidera' che <tt>current</tt>
e' grande a sufficienza se e' lungo <tt><i>size</i></tt> bytes.
(<tt>multilog</tt> decidera' in tal senso anche se non vedra' un carattere
di nuova linea entro 2000 bytes dal raggiungingimento del limite massimo;
in quel caso completera' il log con l' ultima linea, sforando il limite
di al massimo 1999 bytes.
<tt><i>size</i></tt> deve essere tra 4096 e 16777215. Il default e' 99999.</p>
<p>Dalla versione 0.75 and in avanti, se <tt>multilog</tt> riceve un segnale
ALRM, e se <tt>current</tt> non e' vuoto, si comporta come se il file avesse
raggiunto la grandezza massima.</p>
<p>
L' azione <tt>n<i>num</i></tt>
imposta il numero di file di log per le successive azioni <tt><i>dir</i></tt>.
Dopo aver rinominato <tt>current</tt>, <tt>multilog</tt> controlla il numero
di vecchi file: se ci sono <tt><i>num</i></tt> o piu' file, cancella uno o
piu' dei file di log piu' vecchi.<br>
<tt><i>num</i></tt> deve essere almeno 2, il default e' 10.</p>

<p>L' azione <tt>!<i>processor</i></tt> imposta un processore per l' azione
<tt><i>dir</i></tt> seguente.<br>
<tt>multilog</tt> scrivera' sul file di log <tt>current</tt> atraverso
<tt><i>processor</i></tt> e salvera' l' ouput come se fosse un file di log
vecchio anziche' <tt>current</tt>.
<tt>multilog</tt> inoltre salvera' l' output che <tt><i>processor</i></tt>
scrivera' sul Descrittore File n. 5, rendendolo leggibile sul Descrittore
File n. 4 quando usera' <tt><i>processor</i></tt> sul file di log
successivo.<br>
<tt><i>processor</i></tt> deve uscire con un valore diverso da zero, nel caso
avesse problemi a creare il sou output, nel qual caso <tt>multilog</tt> lo
riavviera'. IMPORTANTE : <tt><i>processor</i></tt> potrebbe bloccare il
programma che sta scivendo attraverso <tt>multilog</tt>.


<a name="d2_descr_tai64n"></a><h2>tai64n</h2>
<p><tt>tai64n</tt> inserisce un orario ( timestamp ) preciso in ogni linea.</p>
<p>Uso : <tt>tai64n</tt></p>
<p><tt>tai64n</tt> legge linee dallo standard input, e per ogni linea scrive
<ol>
<li>un @,
<li>un timestamp preciso
<li>uno spazio
<li>una copia della linea letta
</ol>
sullo standard output. Il timestamp e' riferito al momento in cui
<tt>tai64n</tt> legge il primo carattere della linea corrente.</p>

<p><tt>tai64n</tt> esce restituendo <b>0</b> appena arriva alla fine di stdin.
Restituisce invece <b>111</b> senza alcun messaggio di errore se ha problemi
a leggere stdin o a scrivere su stdout.</p>
<p><tt>tai64n</tt> non alloca memoria.</p>

<p><b>Timestamp</b><br>
I timestamp usati da <tt>tai64n</tt> sono un blocco di 12 byte espressi come
24 caratteri esadecimali. Maggiori informazioni sul formato TAI64N (
Temps Atomique International ) le potete trovare
<a href="http://cr.yp.to/libtai/tai64.html#tai64n" target="_blank">qui</a>.
</p>

<p>Per convertire i timestamp tai64n in un formato leggibile, usate
<a href="#d2_descr_tai64nlocal">tai64nlocal</a>.</p>

<p>Per esempio, il timestamp 4000000037c219bf2ef02e94 si riferisce al
nanosecondo che inizia esattamente a 935467455.787492500 secondi di
distanza dall' inizio del 1970 TAI;
37c219bf in decimale e' 935467455, e 2ef02e94 e' 787492500.</p>

<p>L' attuale implementazione di <tt>tai64n</tt> usa la funzione di sistema
UNIX <tt>gettimeofday</tt> per ottenere il numero di secondi dal
1970-01-01 00:00:10 TAI. Attenzione perche' molte implementazioni
di <tt>gettimeofday</tt> non sono Y2038-compliant. Inoltre, molti orologi
di sistema non sono impostati correttamente.</p>


<a name="d2_descr_tai64nlocal"></a><h2>tai64nlocal</h2>
<p><tt>tai64nlocal</tt> converte i timestamp TAI64N in un formato
comprensibile per le persone.</p>
<p>Uso : <tt>tai64nlocal</tt></p>
<p><tt>tai64nlocal</tt> legge linee dallo standard input.<br>
Se la linea non inizia con un @, <tt>tai64nlocal</tt> la scrive sullo
standard output senza alcuna modifica.<br>
Se la linea inizia con un @, <tt>tai64nlocal</tt> cerca un timestamp dopo
la @, nel formato usato da <a href="#d2_descr_tai64n">tai64n</a>, e scrive
su stdout il timestamp convertito nel formato ISO:
AAAA-MM-GG HH:MM:SS.SSSSSSSSS.</p>

Per esmpio, la linea
<pre>
     @4000000037c219bf2ef02e94 mark
</pre>
verrebbe scritta come
<pre>
     1999-08-23 21:03:43.787492500 mark
</pre>

<p>Attenzione, l' attuale implementazione di <tt>tai64nlocal</tt>
si base sulla funzione UNIX <tt>localtime</tt> per ottenere l' ora locale.
Alcune implementazioni di <tt>localtime</tt> usano una scala temporale
che non conteggia i secondi aggiuntivi ( propriamente "intercalari" ) che,
qualche volta al secolo, vengono inseriti per compensare la diminuzione di
velocita' di rotazione della terra ( anni fa, l' ultimo minuto del 31
dicembre venne fatto durare 61 secondi ). <br>
La libreria Olson Time Zone tiene conto di questo; per utilizzarla, la time
zone puo' essere specificata come, per esempio,
<tt>right/US/Pacific</tt> invece che <tt>US/Pacific</tt>.<br>
Maggiori informazioni sulla differenza fra il Tempo Universale ed il Tempo
Atomico e sul perche' ogni tanto alcuni minuti durano 61 secondi anziche'
60 potete trovarli qui
<ul>
    <li><a href="http://cr.yp.to/proto/utctai.html" target="_blank">utc - tai</a></li>
    <li><a href="http://toi.iriti.cnr.it/it/utctime.html" target="_blank">CNR</a></li>
    <li><a href="http://www.ien.it" target="_blank">I.E.N.</a></li>
</ul>
In questi documenti troverete inoltre riferimenti ad altri ulteriori, sia
per la programmazione che per la teoria.</p>

<p>Attenzione perche' molte implementazioni di <tt>gettimeofday</tt>
non sono Y2038-compliant.</p>

<p><tt>tai64nlocal</tt> esce restituendo <b>0</b> appena arriva alla fine
di stdin, esce restituendo invece <b>111</b> se ha problemi a leggere da
stdin o a scrivere su stdout.</p>

<p><tt>tai64nlocal</tt> non alloca memoria, ma potrebbe eventualmente farlo
la funzione <tt>localtime</tt>.</p>



<a name="d2_descr_setuidgid"></a><h2>setuidgid</h2>
<p><tt>setuidgid</tt> avvia un programma impostandone lo userid ed il
groupid a quelli specificati</p>

<p><tt>setuidgid <i>account</i> <i>child</i></tt></p>

<p><tt><i>account</i></tt> e' un singolo argomento, <tt><i>child</i></tt>
invece consiste di uno o piu' argomenti</p>

<p><tt>setuidgid</tt> imposta il proprio uid e gid a quelli dell'
<tt><i>account</i></tt> indicato, ignorando eventuali gruppi supplementari.
Dopodiche' avvia i <tt><i>child</i></tt>.</p>

<p><tt>setuidgid</tt> esce restituendo <b>111</b> se non riesce a trovare
un nome di account uguale a <tt><i>account</i></tt>, o se non riesce ad
impostare gli id, o se non riesce ad eseguire <tt><i>child</i></tt>.
Altrimenti restituisce lo stesso valore restituito da
<tt><i>child</i></tt>.</p>

<p><tt>setuidgid</tt> puo' essere lanciato solo da root.</p>


<a name="d2_descr_envuidgid"></a><h2>envuidgid</h2>
<p><tt>envuidgid</tt> avvia un programma impostando le variabili di ambiente
UID e GID al uid e gid dell' utente indicato.</p>

<p>Uso : <tt>envuidgid <i>account</i> <i>child</i></tt></p>

<p><tt><i>account</i></tt> e' un singolo argomento, <tt><i>child</i></tt>
invece consiste di uno o piu' argomenti</p>

<p><tt>envuidgid</tt> assegna a $UID il valore dell' uid di
<tt><i>account</i></tt> e a $GID il valore del gid primario di
<tt><i>account</i></tt>, dopodiche' avvia <tt><i>child</i></tt>.</p>

<p><tt>envuidgid</tt> esce restituendo <b>111</b> se non riesce a trovare
un nome di account uguale a <tt><i>account</i></tt>, se esaurisce la
memoria per le variabili di ambiente, o se non riesce ad avviare
Altrimenti restituisce lo stesso valore restituito da
<tt><i>child</i></tt>.</p>


<a name="d2_descr_envdir"></a><h2>envdir</h2>
<p><tt>envdir</tt> avvia un programma in un ambiente modificato secondo
quanto indicato dai file che si trovano nella directory specificata.</p>

<p>Uso : <tt>envdir <i>d</i> <i>child</i></tt></p>

<p><tt><i>d</i></tt> e' un singolo argomento, <tt><i>child</i></tt>
consiste in uno o piu' argomenti.</p>

<p><tt>envdir</tt> imposta le variabili di ambiente come specificato
dai file nella directory <tt><i>d</i></tt>, dopodiche' avvia
<tt><i>child</i></tt>.<br>
Se <tt><i>d</i></tt> contiene un file chiamato <tt><i>s</i></tt>, la cui
prima linea e' <tt><i>t</i></tt>, allora <tt>envdir</tt> cancella la
variabile di ambiente chiamata <tt><i>s</i></tt>, se esiste, e poi crea
la variabile di ambiente chiamata <tt><i>s</i></tt> impostandone il valore
a <tt><i>t</i></tt>.<br>
Il nome <tt><i>s</i></tt> non deve contenere un <tt>=</tt>.
Spazi e tabulazioni in coda a <tt><i>t</i></tt> sono rimossi.
Valori nulli equivalgono a caratteri di nuova linea.</p>

<p>Se il file <tt><i>s</i></tt> e' completamente vuoto ( lunghezza di 0 byte )
<tt>envdir</tt> rimuove la variabile <tt><i>s</i></tt>, se esiste, senza
crearne una nuova.</p>

<p><tt>envdir</tt> esce restituendo <b>111</b> se non riesce a leggere
<tt><i>d</i></tt>, se non ha memoria sufficiente per le variabili di
ambiente, o se non riesce ad eseguire <tt><i>child</i></tt>.
Altrimenti restituisce lo stesso valore restituito da
<tt><i>child</i></tt>.</p>


<a name="d2_descr_softlimit"></a><h2>softlimit</h2>
<p><tt>softlimit</tt> avvia un programma controllandone e limitandone
le risorse.</p>

<p>Uso : <tt>softlimit <i>opts</i> <i>child</i></tt></p>

<p><tt><i>opts</i></tt> e' una serie di opzioni in stile getopt,
<tt><i>child</i></tt> consiste in uno o piu' argomenti.</p>

<p><tt>softlimit</tt> imposta limiti all' uso delle risorse software
come specificato da <tt><i>opts</i></tt>, dopodiche' avvia
<tt><i>child</i></tt>.</p>

<p><b>Opzioni</b><br>
Per ognuna delle opzioni seguenti, <tt><i>n</i></tt> puo' essere
sostituito da un <tt>=</tt>, nel qual caso si richiede che il limite
software sia uguale a quello di default del sistema.</p>

<p>Opzioni per il controllo della memoria
<ul>
<li><tt>-m <i>n</i></tt>:
    uguale a <tt>-d <i>n</i> -s <i>n</i> -l <i>n</i> -a <i>n</i></tt>.
<li><tt>-d <i>n</i></tt>:
    Limita il data segment per processo a <tt><i>n</i></tt> bytes.
<li><tt>-s <i>n</i></tt>:
    Limita il stack segment per processo a <tt><i>n</i></tt> bytes.
<li><tt>-l <i>n</i></tt>:
    Limita le locked physical pages per processo a <tt><i>n</i></tt> bytes.
    Questo potrebbe non avere effetto su alcuni Sistemi Operativi.
<li><tt>-a <i>n</i></tt>:
    Limita la dimensione totale di tutti i segment per processo a <tt><i>n</i></tt> bytes.
    Questo potrebbe non avere effetto su alcuni Sistemi Operativi.
<li><tt>-o <i>n</i></tt>:
    Limita il numero di Descrittori File aperti per processo a <tt><i>n</i></tt>.
    Questo potrebbe non avere effetto su alcuni Sistemi Operativi.
<li><tt>-p <i>n</i></tt>:
    Limita il numero di processi avviabili dal uid corrente a <tt><i>n</i></tt>.
</ul>
</p>

<p>Optioni per il controllo della dimensione dei file :
<ul>
<li><tt>-f <i>n</i></tt>:
  Limita  la dimensione del file in output a <tt><i>n</i></tt> bytes.
<li><tt>-c <i>n</i></tt>:
  Limita la dimensione dei file core a <tt><i>n</i></tt> bytes.
</ul>
</p>

<p>Optioni per l' efficienza :
<ul>
<li><tt>-r <i>n</i></tt>:
    Limita la dimensione dell' ambiente a <tt><i>n</i></tt> bytes.
<li><tt>-t <i>n</i></tt>:
    Limita il tempo di usa della CPU a <tt><i>n</i></tt> secondi.
</ul>
</p>


<a name="d2_descr_setlock"></a><h2>setlock</h2>
<b>TODO</b>


<p>&nbsp;</p>

<a name="d2_ctrl"></a><h1>Chi controlla i processi ?</h1>
<b>TODO</b>

<p>&nbsp;</p>

<a name="d2_uso"></a><h1>Usare i daemontools</h1>
<b>TODO</b>


<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>


<a name="d3_start"></a><h1>E con Qmail??</h1>
<a name="d3_intro"><p>Quasi tutti i software di D J B sono predisposti per l'
 uso con i daemontools >= 0.76, fa eccezione proprio qmail. Non mi dilunghero'
su come installare e configurare qmail, e' gia stato ottimamente descritto
nell' <a href="http://folug.linux.it/doc/qmail/qmail-HOWTO.html"
target="_blak">HOWTO di Davide giunchi</a>. Descrivero' come adattarlo a
questi strumenti.</p>
<p>Cio' che ci occorre e' una directory <tt>service</tt>
in cui inserire lo script <tt>run</tt>, la directory con le variabili di
ambiente e i log. Chi preferisce concentrare i log in <tt>/var/log</tt> potra'
poi spostare i relativi rami di directory e collegarli con dei link.</p>
<p>Ecco la serie di comandi per creare le directory di servizio. Come
prima cosa _occorre_diventare_root_ e FERMARE TUTTI I SERVIZI DI QMAIL
ED IMPEDIRNE IL RIAVVIO!!!</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    su - root
</pre>
</td></tr></table>

<p>Ora possiamo cominciare lo scripting. Potete copiare ed eseguire il
seguente codice incollandolo sulla consolle o in uno script. Se avete qmail in
un posto diverso da <tt>/var/qmail/</tt> cambiate la prima linea qui e il
percorso degli eseguibili in tutti gli script successivi.</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    cd /var/qmail
    QMR=`pwd` && export QMR

    mkdir -p service && cd service

    mkdir -p qmaild && chmod 03755 qmaild
        mkdir -p qmaild/env && chmod 02755 qmaild/env
        mkdir -p qmaild/log && chmod 02755 qmaild/log
        mkdir -p qmaild/log/env && chmod 02755 qmaild/log/env
        mkdir -p qmaild/log/main && chmod 02755 qmaild/log/main && chown qmaill qmaild/log/main
        touch qmaild/log/status && chown qmaill qmaild/log/status

    mkdir -p smtpd && chmod 03755 smtpd
        mkdir -p smtpd/env && chmod 02755 smtpd/env
        mkdir -p smtpd/log && chmod 02755 smtpd/log
        mkdir -p smtpd/log/env && chmod 02755 smtpd/log/env
        mkdir -p smtpd/log/main && chmod 02755 smtpd/log/main && chown qmaill smtpd/log/main
        touch smtpd/log/status && chown qmaill smtpd/log/status

    mkdir -p pop3d && chmod 03755 pop3d
        mkdir -p pop3d/env && chmod 02755 pop3d/env
        mkdir -p pop3d/log && chmod 02755 pop3d/log
        mkdir -p pop3d/log/env && chmod 02755 pop3d/log/env
        mkdir -p pop3d/log/main && chmod 02755 pop3d/log/main && chown qmaill pop3d/log/main
        touch pop3d/log/status && chown qmaill pop3d/log/status

</pre>
</td></tr></table>
<a name="d3_services"></a>
<p>Molto bene, le directory di lavoro sono pronte, ora servono le variabili di
ambiente per il funzionamento dei programmi e gli script di avvio. Vediamo
prima le variabili. Esse sono un modo per rendere dinamici i parametri che
prima venivano passati a tcpserver sulla linea di comando. Nulla vi vieta di
lasciarle li e di non creare queste variabili, pero' tutte le volte che
vorrete variare qualche valore dovrete editare lo script di avvio. Con le
variabili e' tutto molto piu' comodo</p>

<p>Ma vediamo ora in dettaglio la configurazione dei 3 servizi di email</p>



<!--
                       _ _     _
  __ _ _ __ ___   __ _(_) | __| |
 / _` | '_ ` _ \ / _` | | |/ _` |
| (_| | | | | | | (_| | | | (_| |
 \__, |_| |_| |_|\__,_|_|_|\__,_|
    |_|
-->
<hr width=50%>
<a name="d3_qmaild"><h2>qmaild ( delivery service )</h2>
<p>la linea di comando per l' avvio del servizio qmail e' tipicamente :

<table bgcolor=#C0C0C0 border=0><tr><td>
<pre>
    /var/qmail/bin/qmail-start ./Maildir/ | \
    /command/setuidgid qmaill \
        /command/multilog t n100 s1000000 /var/log/qmail &
</pre>
</td></tr></table>

<p>I valori dei parametri potete adattarle alle vostre esigenze.</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

    cd $QMR/service/qmaild/env

    cd $QMR/service/qmaild/log/env
        echo '9' >          MAXLOGFILES
        echo '1048575' >    MAXFILESIZE

    cd $QMR/service

</pre>
</td></tr></table>

<p>E infine gli script di avvio per il servizio ed il suo logging.</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/qmaild/run
    chmod 755 $QMR/service/qmaild/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin qmaild start-up script

exec sh -c '
        PATH=/var/qmail/bin:$PATH
        export PATH

        /var/qmail/bin/qmail-start ./Maildir/
'

# end qmaild start-up script

</pre>
</td></tr></table>

<p>La pipe al logger non e' piu' necessaria, il log viene avviato da uno
script simile</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/qmaild/log/run
    chmod 755 $QMR/service/qmaild/log/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin qmaild multilog start-up script

exec \
    setuidgid qmaill \
    envdir ./env \
    sh -c '
        exec /usr/local/bin/multilog \
            t \
            ${MAXFILESIZE+" s$MAXFILESIZE "} \
            ${MAXLOGFILES+" n$MAXLOGFILES "} \
            ./main
    '

# end qmaild multilog start-up script

</pre>
</td></tr></table>




<!--
               _             _
 ___ _ __ ___ | |_ _ __   __| |
/ __| '_ ` _ \| __| '_ \ / _` |
\__ \ | | | | | |_| |_) | (_| |
|___/_| |_| |_|\__| .__/ \__,_|
                  |_|
-->
<hr width=50%>
<a name="d3_smtpd"><h2>smtpd</h2>
<p>la linea di comando di <tt>tcpserver</tt> tradizionale e' simile a questa:

<table bgcolor=#C0C0C0 border=0><tr><td>
<pre>
    tcpserver -v -H -R \
    -l$HOSTNAME \
    -c$CONCURRENCY \
    -b$BACKLOG \
    -u$QMAILUID -g$NOFILESGID \
    -x /home/vpopmail/etc/tcp.smtp.cdb \
    0 smtp fixcrio /var/qmail/bin/qmail-smtpd 2>&1 \
        | \
    /usr/local/bin/setuidgid qmaill \
    /command/multilog t n100 s1000000 /var/log/smtpd &
</pre>
</td></tr></table>

<p>I valori delle variabili potete adattarle alle vostre esigenze, altri,
come LOCALNAME, <b>dovete</b> adattarli al vostro caso!. Qui ci sono i valori
che uso io per il traffico di una piccola azienda o casalinghi. Alcune
variabili, infine, e' conveniente assegnarle dentro lo script di avvio</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    cd $QMR/service/smtpd/env
        echo -ne '20' >                 BACKLOG
        echo -ne '30' >                 CONCURRENCY
        echo -ne '1000000' >            DATALIMIT
        echo -ne '0'>                   IP
        echo -ne 'nome.com' >           LOCALNAME
        echo -ne '25' >                 PORT
        echo -ne '' >                   REMOTEINFO
        echo -ne '' >                   REMOTENAME
        echo -ne '/etc/tcp.smtp.cdb' >  TCP

    cd $QMR/service/smtpd/log/env
        echo '9' >          MAXLOGFILES
        echo '1048575' >    MAXFILESIZE

    cd $QMR/service

</pre>
</td></tr></table>

<p>Nel caso si usi <tt>vpopmail</tt>, il file <tt>TCP</tt> dovra'
probabilmente contenere non <tt>/etc/tcp.smtp.cdb</tt> ma
<tt>/home/vpopmail/etc/tcp.smtp.cdb</tt>, perche' <tt>vpopmail</tt> ha bisogno
di scrivere su questo file e quindi bisogna metterlo in una directory su cui
esso possa scrivere.</p>
<p><b>ATTENZIONE</b> al valore di DATALIMIT, specie se si usano particolari passaggi
nella coda, tipo filtri aggiuntivi o antivirus. Il valore puo' richiedere
aggiustamenti sostanziali. Per esempio, per l' antivirus <b>fsav</b> un valore
che sembra funzionare e' 16 milioni. A seconda di quanta memoria richiede il filtro,
e della dimensione massima ammessa di una email, puo' essere quasi il caso di scrivere
<pre>
        echo -ne '' > DATALIMIT
</pre>
annullando cosi' la variabile.</p>

<p>E infine gli script di avvio per il servizio ed il suo logging.</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/smtpd/run
    chmod 755 $QMR/service/smtpd/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin smptd start-up script

exec 2>&1 \
envdir ./env \
sh -c '
    TCPSERVER=/usr/local/bin/tcpserver

    case "$REMOTENAME" in h) H=;; p) H="-p";; *) H="-H";; esac
    case "$REMOTEINFO" in r) R=;; [0-9]*) R="-t$REMOTEINFO";; *) R="-R";; esac

    exec \
        envuidgid qmaild \
        softlimit ${DATALIMIT+"-d$DATALIMIT"} \
        $TCPSERVER \
            -v -D -U $H $R \
            ${LOCALNAME+"-l$LOCALNAME"} \
            ${BACKLOG+"-b$BACKLOG"} \
            ${CONCURRENCY+"-c$CONCURRENCY"} \
            ${TCP+"-x$TCP"} \
            -- "${IP-0}" "${PORT-25}" \
            /var/qmail/bin/qmail-smtpd
'

# end smptd start-up script

</pre>
</td></tr></table>

<p>Nel caso si abbiano patch al qmail, oppure filtri, puo' essere utile o
necessario usare ed esportare particolari variabili. Per esempio se si usano
patch per filtri puo' essere necessario creare ed esportare questa variabile :
<tt>QMAILQUEUE="/var/qmail/bin/qmail-alternate-queue" && export
QMAILQUEUE</tt>.<br>
La pipe al logger non e' piu' necessaria, il log viene
avviato da uno script simile</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/smtpd/log/run
    chmod 755 $QMR/service/smtpd/log/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin smtpd multilog start-up script

exec \
    setuidgid qmaill \
    envdir ./env \
    sh -c '
        exec /usr/local/bin/multilog \
            t \
            ${MAXFILESIZE+" s$MAXFILESIZE "} \
            ${MAXLOGFILES+" n$MAXLOGFILES "} \
            ./main
'

# end smtpd multilog start-up script

</pre>
</td></tr></table>




<!--
                  _____     _
 _ __   ___  _ __|___ /  __| |
| '_ \ / _ \| '_ \ |_ \ / _` |
| |_) | (_) | |_) |__) | (_| |
| .__/ \___/| .__/____/ \__,_|
|_|         |_|
-->
<hr width=50%>
<a name="d3_pop3d"><h2>pop3d</h2>
<p>la linea di comando di <tt>tcpserver</tt> tradizionale e' simile a questa:

<table bgcolor=#C0C0C0 border=0><tr><td>
<pre>
    tcpserver -v -H -R \
    -l$HOSTNAME \
    -c$CONCURRENCY \
    -b$BACKLOG \
    -u$VPOPMAILUID -g$VPOPMAILGID 0 pop3 \
    /var/qmail/bin/qmail-popup $HOSTNAME \
    /bin/checkpassword \        # ( oppure /home/vpopmail/bin/vchkpw  )
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
    /usr/local/bin/setuidgid qmaill \
        /command/multilog t n100 s1000000 \
        /var/log/pop3d &
</pre> </td></tr></table>

<p>I valori delle variabili potete adattarle alle vostre esigenze. Qui ci
sono i valori che uso io per il traffico di una piccola azienda o casalinghi.
Alcune variabili, infine, e' conveniente assegnarle dentro lo script di
avvio</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    cd $QMR/service/pop3d/env
        echo -ne '20' >         BACKLOG
        echo -ne '30' >         CONCURRENCY
        echo -ne '250000' >     DATALIMIT
        echo -ne '0'>           IP
        echo -ne 'nome.com' >   LOCALNAME
        echo -ne '' >           MAILDIRNAME
        echo -ne '' >           POPUPHOST
        echo -ne '110' >        PORT
        echo -ne '' >           REMOTEINFO
        echo -ne '' >           REMOTENAME
        echo -ne '' >           TCP

    cd $QMR/service/pop3d/log/env
        echo '9' >         MAXLOGFILES
        echo '1048575' >    MAXFILESIZE

    cd $QMR/service

</pre>
</td></tr></table>

<p>Ebbene si, anche per il servizio pop3 potrebbe avere senso limitare gli
host di accesso. In tal caso il file <tt>TCP</tt> conterra' il percorso al
file di controllo relativo, che potra' essere per esempio
<tt>/etc/tcp.pop3.cdb</tt>

<p>E infine gli script di avvio per il servizio ed il suo logging.</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/pop3d/run
    chmod 755 $QMR/service/pop3d/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin pop3d start-up script

exec 2>&1 \
envdir ./env \
sh -c '
    TCPSERVER=/usr/local/bin/tcpserver

    case "$REMOTENAME" in h) H=;; p) H="-p";; *) H="-H";; esac
    case "$REMOTEINFO" in r) R=;; [0-9]*) R="-t$REMOTEINFO";; *) R="-R";; esac

    exec \
        softlimit ${DATALIMIT+"-d$DATALIMIT"} \
        $TCPSERVER \
            -v -D $H $R \
            ${LOCALNAME+"-l$LOCALNAME"} \
            ${BACKLOG+"-b$BACKLOG"} \
            ${CONCURRENCY+"-c$CONCURRENCY"} \
            ${TCP+"-x$TCP"} \
            -- "${IP-0}" "${PORT-110}" \
        /var/qmail/bin/qmail-popup "${POPUPHOST-`sed 1q /var/qmail/control/me`}" \
            /bin/checkpassword \
            /var/qmail/bin/qmail-pop3d "${MAILDIRNAME-Maildir}"
'

# end pop3d start-up script

</pre>
</td></tr></table>

<p>Nel caso si usi vpopmail, lo script in questione diventera'</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin pop3d start-up script

exec 2>&1 \
envdir ./env \
sh -c '
    VPOPMAILUID=`id -u vpopmail`
    VPOPMAILGID=`id -g vpopmail`
    TCPSERVER=/usr/local/bin/tcpserver

    case "$REMOTENAME" in h) H=;; p) H="-p";; *) H="-H";; esac
    case "$REMOTEINFO" in r) R=;; [0-9]*) R="-t$REMOTEINFO";; *) R="-R";; esac

    exec \
        softlimit ${DATALIMIT+"-d$DATALIMIT"} \
        $TCPSERVER \
            -v -D $H $R \
            -u$VPOPMAILUID -g$VPOPMAILGID \
            ${LOCALNAME+"-l$LOCALNAME"} \
            ${BACKLOG+"-b$BACKLOG"} \
            ${CONCURRENCY+"-c$CONCURRENCY"} \
            ${TCP+"-x$TCP"} \
            -- "${IP-0}" "${PORT-110}" \
        /var/qmail/bin/qmail-popup "${POPUPHOST-`sed 1q /var/qmail/control/me`}" \
             /home/vpopmail/bin/vchkpw \
            /var/qmail/bin/qmail-pop3d "${MAILDIRNAME-Maildir}"
'

# end pop3d start-up script

</pre>
</td></tr></table>

<p>le prime due servono se si usa <tt>vpopmail</tt>, la terza se si usano
filtri, e vanno scritte sotto la definizione di QMAILDUID e NOFILESGID.
Nel caso si usi <tt>vpopmail</tt> bisognera' anche cambiare il percorso al
database <tt>tcp.smtp</tt>, che sara' probabilmente in
<tt>/home/vpopmail/etc/tcp.smtp.cdb</tt><br>
La pipe al logger non e' piu' necessaria, il log viene avviato da uno script
simile</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch $QMR/service/pop3d/log/run
    chmod 755 $QMR/service/pop3d/log/run
</pre>
</td></tr></table>

<p>scrivete in questo file con <tt>vi</tt> o altro editor il seguente codice
</p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

#!/bin/sh

# begin pop3d multilog start-up script

exec \
    setuidgid qmaill \
    envdir ./env \
    sh -c '
        exec /usr/local/bin/multilog \
            t \
            ${MAXFILESIZE+" s$MAXFILESIZE "} \
            ${MAXLOGFILES+" n$MAXLOGFILES "} \
            ./main
'

# end pop3d multilog start-up script

</pre>
</td></tr></table>

<p>Ed anche il pop3 e' pronto. </p>




<!--
 _ _       _
| (_)_ __ | | _____
| | | '_ \| |/ / __|
| | | | | |   <\__ \
|_|_|_| |_|_|\_\___/
-->

<hr width=50%>
<a name="d3_connect"></a><h2>collegamento dei servizi</h2>/command/multilog
<p>Come ultimo passo, dobbiamo collegare le directory di controllo dei tre
servizi alla directory di controllo generale <tt>/service</tt><p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

ln -sf /var/qmail/service/qmaild /service/qmaild
ln -sf /var/qmail/service/smtpd /service/smtpd
ln -sf /var/qmail/service/pop3d /service/pop3d

</pre>
</td></tr></table>

<p>Se <tt>supervise</tt> e' in funzione, i tre servizi dovrebbero avviarsi
entro 5 secondi</p>


<!--
                       _ _      _        _
  __ _ _ __ ___   __ _(_) | ___| |_ _ __| |
 / _` | '_ ` _ \ / _` | | |/ __| __| '__| |
| (_| | | | | | | (_| | | | (__| |_| |  | |
 \__, |_| |_| |_|\__,_|_|_|\___|\__|_|  |_|
    |_|
-->
<hr width=50%>
<a name="d3_ctrl"></a><h2>Lo script di avvio e controllo</h2>
<p>Ora che qmail non dipende piu' da inetd o da un tcpserver stand-alone, per
controllarlo dobbiamo usare gli appositi daemontools, descritti in dettaglio
precedentemente Ecco come puo' apparire uno script di avvio pressoche'
 completo,
da porre in <tt>/etc/init.d/</tt>.<br>Come al solito, copiare il codice
 sottostante
in un editor salvarlo come <tt>/etc/init.d/qmail</tt>, dopo averlo
 eventualmente
modificato per adattarlo al proprio sistema.<br>una modifica potrebbe essere
 la
locazione del file, nel caso non si usi un avvio di tipo SysV </p>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>
    touch /etc/init.d/qmail
    chmod 755 /etc/init.d/qmail
</pre>
</td></tr></table>

<br>
<p>Questo script e' stato adattato da uno precedente di Henry Chen, di cui mi
piacerebbe dare maggiorni informazioni, ma ho perso il documento originale</p>
<br>

<table bgcolor=#BBDDFF border=0><tr><td nowrap>
<pre>

#!/bin/sh

PATH=/var/qmail/bin:$PATH
export PATH

case "$1" in

  start)
    echo "Starting qmail : "
    if svok /service/qmaild ; then
      svc -u /service/qmaild
      echo "qmail-deliver "
    else
      echo qmail-deliver service not running
    fi
    if svok /service/smtpd ; then
      svc -u /service/smtpd
      echo "smtpd "
    else
      echo smtpd qmail service not running
    fi
    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    if svok /service/pop3d ; then
      svc -u /service/pop3d
      echo "pop3d "
    else
      echo pop3d qmail service not running
    fi
    echo -ne "\n"
    ;;

  stop)
    echo "Stopping qmail : "
    echo "smtpd "
    svc -d /service/smtpd
    echo "deliver "
    svc -d /service/qmaild
    if [ -f /var/lock/subsys/qmail ]; then
      rm /var/lock/subsys/qmail
    fi
    echo "pop3d "
    svc -d /service/pop3d
    echo -ne "\n"
    ;;

  stat)
    svstat /service/qmaild
    svstat /service/qmaild/log
    svstat /service/smtpd
    svstat /service/smtpd/log
    qmail-qstat
    svstat /service/pop3d
    svstat /service/pop3d/log
    ;;

  doqueue|alrm|alarm|flush)
    echo "Sending ALRM signal to qmail-deliver."
    svc -a /service/qmaild
    ;;

  queue)
    qmail-qstat
    qmail-qread
    ;;

  reload|hup)
    echo "Sending HUP signal to qmail-deliver."
    svc -h /service/qmaild
    ;;

  pause)
    echo "Pausing qmail-deliver"
    svc -p /service/qmaild
    echo "Pausing smtpd"
    svc -p /service/smtpd
    echo "Pausing pop3d"
    svc -p /service/pop3d
    ;;

  cont)
    echo "Continuing qmail-deliver"
    svc -c /service/qmaild
    echo "Continuing smtpd"
    svc -c /service/smtpd
    echo "Continuing pop3d"
    svc -c /service/pop3d
    ;;

  restart)
    echo "Restarting qmail:"
    echo "* Stopping smtpd."
    svc -d /service/smtpd
    echo "* Sending qmail-deliver SIGTERM and restarting."
    svc -t /service/qmaild
    echo "* Restarting smtpd."
    svc -u /service/smtpd
    echo "* Restarting pop3d."
    svc -t /service/pop3d
    ;;

  help)
    cat &lt;&lt;HELP
   stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (smtp connections accepted, but nothing leaves)
   cont -- continues paused mail service
   stat -- displays status of mail service
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-deliver ALRM, scheduling queued messages for delivery
 reload -- sends qmail-deliver HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
  alarm -- same as doqueue
  flush -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0
 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0

</pre>
</td></tr></table>



<a name="d3_log"></a><h2>Logs</h2>
<p>Per controllare i log, anziche' cercarli nella loro directory di servizio,
potete comodamente linkarli in <tt>/var/log</tt>

<table bgcolor=#BBDDFF border=0><tr><td>
<pre>

ln -s /var/qmail/service/qmaild/log/main/current /var/log/qmaild.log
ln -s /var/qmail/service/smtpd/log/main/current /var/log/smtpd.log
ln -s /var/qmail/service/pop3d/log/main/current /var/log/pop3d.log

</pre>
</td></tr></table>

<p>Come ultima comodita', conviene far passare i log attraverso il daemontool
<a href="#d2_descr_tai64nlocal">tai64nlocal</a>, per vedere il timestamp in
forma leggibile da umani.</p>


<a name="d3_ps"></a><h2>Avra' funzionato tutto ?</h2>
<p>Controllate con <tt>ps afx</tt>, dovreste ottenere un output tipo questo :
<pre>
master:~# ps axf
  PID TTY      STAT   TIME COMMAND
  ..........
  311 ?        S      0:00 sh /command/svscanboot
  313 ?        S      0:00  \_ svscan /service
  315 ?        S      0:00  |   \_ supervise qmaild
  321 ?        S      0:00  |   |   \_ qmail-send
  327 ?        S      0:00  |   |       \_ qmail-lspawn ./Maildir/
  328 ?        S      0:00  |   |       \_ qmail-rspawn
  331 ?        S      0:00  |   |       \_ qmail-clean
  316 ?        S      0:00  |   \_ supervise log
  324 ?        S      0:00  |   |   \_ /usr/local/bin/multilog t  s1048575  n9  ./mai
  317 ?        S      0:00  |   \_ supervise smtpd
  323 ?        S      0:00  |   |   \_ /usr/local/bin/tcpserver -v -D -U -H -R -lmast
  318 ?        S      0:00  |   \_ supervise log
  325 ?        S      0:00  |   |   \_ /usr/local/bin/multilog t  s1048575  n9  ./mai
  319 ?        S      0:00  |   \_ supervise pop3d
  326 ?        S      0:00  |   |   \_ /usr/local/bin/tcpserver -v -D -H -R -u89 -g89
  320 ?        S      0:00  |   \_ supervise log
  322 ?        S      0:00  |       \_ /usr/local/bin/multilog t  s1048575  n9  ./mai
  314 ?        S      0:00  \_ readproctitle service errors: ........................
 1114 tty1     S      0:00 /sbin/getty 38400 tty1
 ............

master:~#
</pre>



<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>


<p><b>Commento alla sintassi</b><br>
<b>TODO</b>


<table bgcolor=#BBDDFF border=0 width=80%><tr><td>
<pre>

</pre>
</td></tr></table>


</body>
</html>