17
|
1 |
|
|
2 |
Compilació:
|
|
3 |
--------------------------------------
|
|
4 |
Per compilar-lo fent servir gcc (crec que com a mínim 3.4, pel c99):
|
|
5 |
$ make
|
|
6 |
|
|
7 |
Per compilar-lo fent servir tcc (que suporta c99, és fàcil d'instal·lar, etc.
|
|
8 |
(Tiny C Compiler, http://fabrice.bellard.free.fr/tcc/ ):
|
|
9 |
$ make -f Makefile.tcc
|
|
10 |
|
59
|
11 |
Per a testejar una mica el programa (no completament!), hi ha un petit script
|
|
12 |
de test que requereix bash.
|
17
|
13 |
Per a execultar-lo:
|
|
14 |
$ ./test.sh
|
|
15 |
|
|
16 |
|
|
17 |
Els fitxers:
|
|
18 |
--------------------------------------
|
|
19 |
syslog_in_udp <port> Espera missatges pel port UDP especificat
|
|
20 |
(IPv4 i IPv6)
|
|
21 |
syslog_in_npipe <npipe> Espera missatges per la named pipe (ha d'existir!)
|
|
22 |
syslog_in_unix <usocket> Crea i escolta el socket unix per missatges
|
|
23 |
syslog_kernel Executa els anteriors programes, i llegeix de tots
|
59
|
24 |
alhora. A més, inclou el tcp server.
|
18
|
25 |
unix_writer <usocket> Programa per escriure a un Unix socket
|
17
|
26 |
|
46
|
27 |
|
|
28 |
Configuració del programa:
|
|
29 |
--------------------------------------
|
|
30 |
La configuració la trobem al fitxer "syslog.conf". Aquests són els seus
|
|
31 |
valors per defecte (a config.c):
|
|
32 |
from_unix=unixlog
|
|
33 |
from_npipe=disabled
|
|
34 |
from_udp=disabled
|
|
35 |
to_udp_host=localhost
|
|
36 |
to_udp_port=1235
|
59
|
37 |
tcp_manager=1234 (Port per on rebre els logs per tcp)
|
46
|
38 |
log_file=file.log
|
59
|
39 |
pid_file=syslog.pid
|
46
|
40 |
|
|
41 |
No hi poden haver espais; el format és <paràmetre>=<valor> per cada línia.
|
|
42 |
Si el fitxer de configuració "syslog.conf" no defineix res d'un paràmetre,
|
|
43 |
valdrà el valor per defecte.
|
|
44 |
Si a un paràmetre li donem el valor "disabled", la part afectada no estarà
|
|
45 |
activa.
|
|
46 |
|
17
|
47 |
Notes:
|
|
48 |
--------------------------------------
|
|
49 |
El programa està escrit en c99.
|
|
50 |
|
46
|
51 |
El programa no gestiona bé lectures de múltiples missatges per cada crida
|
|
52 |
read(). Només pot llegir un missatge per crida.
|
59
|
53 |
Això és perquè no he implementat completament l'especificació rfc3164.
|
17
|
54 |
|
|
55 |
Els syslog_in_* entenen el missatge "close", cosa que fa que morin. Si moren
|
|
56 |
tots els fills de syslog_kernel, el kernel també mor.
|
|
57 |
|
46
|
58 |
Al fitxer syslog_in_udp se li pot passar el paràmetre de port en negatiu,
|
|
59 |
cosa que vol dir que escoltarà també per IPv6 al port "-(port)" donat. Si es
|
|
60 |
dóna en positiu, només escoltarà IPv4.
|
18
|
61 |
|
|
62 |
El codi de llegir la "named pipe" intenta fer el possible amb locks i
|
|
63 |
reobertures de la pipe de manera que no es perdi mai la lectura de la
|
|
64 |
named pipe donada.
|
46
|
65 |
|
|
66 |
Els syslog_in_* ignoren el senyal HUP. El syslog_in_unix capta SIGTERM i
|
|
67 |
SIGINT, perquè a més de tancar els handles, també ha de tancar el unix socket.
|
|
68 |
|
|
69 |
El syslog_kernel pot passar missatges a un servidor udp. També pot escriure
|
|
70 |
els missatges rebuts a un fitxer de log.
|
|
71 |
|
59
|
72 |
El syslog_kernel escriu el seu pid a pid_file. Si engeguem syslog_kernel i el
|
|
73 |
fitxer existeix amb el pid d'un syslog_kernel actiu, no s'engega un segon
|
|
74 |
syslog_kernel sino que s'envia SIGHUP a l'existent.
|
|
75 |
|
|
76 |
El syslog_kernel inclou un servidor tcp per a poder consultar els logs. Quan
|
|
77 |
un client tcp es connecta a ell, s'envia el contingut del log_file (si
|
|
78 |
es fa servir), i es tanca la connexió.
|
|
79 |
|
|
80 |
El syslog_kernel pare entén els senyals:
|
46
|
81 |
- SIGHUP - rellegir i reaplicar el que digui el fitxer de configuració.
|
|
82 |
- SIGTERM o SIGINT - matar els fills, i després morir ell.
|
|
83 |
(Atenció - si apretem Control-C des d'un xterm, envia SIGINT al grup de
|
|
84 |
processos del terminal; així, si hem executat el kernel, els fills
|
|
85 |
rebran SIGINT igualment)
|
|
86 |
|
|
87 |
No he implementat el SIGUSR1 per a buidar el caché de missatges rebuts a disc.
|
|
88 |
|
|
89 |
El programa dóna informació de debug per stderr.
|
|
90 |
|
|
91 |
El programa no és gaire "error-safe": si no es compleixen certes condicions,
|
|
92 |
el programa simplement abortarà - a vegades amb assert(). De tota manera,
|
|
93 |
tots els casos crítics crec que estan sota control.
|