<!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,
i.fabris@darthxiong.net
</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> </p>
<hr>
<p> </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à o in parte, su ogni
mezzo fisico o elettronico, purché questo messaggio sia contenuto in
tutte le copie. È 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 è 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ù canali possibile. Tuttavia, vogliamo mantenere il
copyright sui documenti 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> </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> </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> </p>
<hr>
<p> </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 < /package/admin/daemontools/compile/sysdeps
</pre>
</p>
<p> </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> </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> </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
".", 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 "umano" 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 ( "." o
"/" ) 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> </p>
<a name="d2_ctrl"></a><h1>Chi controlla i processi ?</h1>
<b>TODO</b>
<p> </p>
<a name="d2_uso"></a><h1>Usare i daemontools</h1>
<b>TODO</b>
<p> </p>
<hr>
<p> </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 <<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> </p>
<hr>
<p> </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>