AUTOMAZIONE DEI PROCESSI |
|
Lo Zen e l'arte dell'automazione del sistema
|
|
Unix è un sistema operativo
nato nei primi anni 70, grazie all'opera di due monumenti dell'informatica
quali Ken Thompson, Dennis Ritchie (l'inventore del
C, per intenderci) e vari altri. La shell è un interprete di comandi che funge sia da layer
fra il kernel del sistema operativo e l'utente sia come linguaggio
di programmazzione avanzato. Saper scrivere uno script shell non è complicato, poichè la sintassi è semplice e la filosofia su cui bisogna basarsi nella realizzazione è la stessa dalla quale nasce unix: spezzare un progetto laborioso in tanti e semplici task. Un bravo e produttivo sistemista
Unix, quindi, è colui in grado di mettere insieme i mattoni
che gli servono, creando script di "collante" che inglobano
altri script con funzioni specifiche, magari pure scritti in linguaggi
diversi. L'arte dell'automazione dei processi è strettamente
legata alla conoscenza dalla bash (o della shell che si utilizza)
e delle sue capacità di scripting. Una distribuzione Linux è di fatto un insieme
di script e comandi (e il kernel, ovviamente), ed è un'ottima
fonte di apprendimento di tecniche di scripting e automazione. |
|
Esempio script shell
|
|
Ecco un esempio di semplice script shell per la compilazione di Openssh in una RedHat linux. | |
# script shell per compilazione di openssh [12-06-2001] | Il simbolo # identifica un commento. E' preferibile intitolare con poche parole lo script per rendere più facilmente intuibile la funzione di tale script. Inoltre specificare la data di creazione potrebbe evitare problemi di aggiornamenti dello script stesso |
#!/bin/sh | Invocazione dell'interprete dello script in questo caso è sh |
OPT_CONFIGURE="--prefix=/usr --sysconfdir=/etc/ssh
--with-openssl --with-pam --with-md5-passwords --with-tcp-wrappers" EXTRA_VERSION=backup ALLOW_IP="10.0.0.0/255.255.255.0" |
Assegnazione di valori ripetitivi a delle variabili, per avere semplificazioni
sia in fase di stesura sia in fase di upgrade o modifica di parametri. |
function COMPILE () { echo "BACKUP OLD CONFIGURATION" cp -Rf /etc/ssh /etc/ssh.$EXTRA_VERSION echo " Clean Directory..." make clean echo " START WITH GCC..." ./configure $OPT_CONFIGURE make make install } |
Inizializzazione della prima funzione di questo script. In questo caso particolare la funzione si chiama COMPILE e contiene tutti i comandi per poter compilare i sorgenti e backuppare i file di configurazione. |
function COPY () { echo "COPY INIT SCRIPT..." cp contrib/redhat/sshd.init /etc/rc.d/init.d/sshd echo "COPY PAM FILE..." cp contrib/redhat/sshd.pam /etc/pam.d/sshd } |
Inizializzazione della funzione COPY, creata per eseguire la copia di file necessari per il corretto funzionamento di Openssh. |
function IP () { echo "OPEN PORT TO $ALLOW_IP" echo "sshd: $ALLOW_IP" >> /etc/hosts.allow echo CLOSE PORT 22 AT UNKNOW HOST echo "sshd: ALL" >> /etc/hosts.deny } |
Inizializzazione della funzione IP, creata per aggiungere la corretta configurazione per abilitare i tcpwrappers |
echo "--------------------------------------------------" echo " !!! WARNING !!! RUN THIS SCRIPT IN SRC DIR " echo "--------------------------------------------------" echo "" echo " DO YOU WANT RUN SSHD BY...?" echo "" echo " - INETD -----> INETD " echo " - X -----> XINETD " echo " - DAEMON ---> ...AS DAEMON " echo " - UP -------> UPDATE OPENSSH " read a |
Visualizza a video un menu all'avvio dello script per rendere interattiva
la scelta delle varie possibilità offerte dallo script. |
case "$a" in |
Il comando case ci permette di assegnare specifici comandi a seconda del valore che assume la variabile a |
inetd | INETD ) COMPILE cp -f /etc/inetd.conf /etc/inetd.conf.orig echo "ADD SERVICE TO INETD..." echo " ssh stream tcp nowait root /usr/sbin/tcpd /usr/sbin/sshd -i" >> /etc/inetd.conf IP COPY ;; |
Se il valore di a è inetd o INETD esegue i comandi e le chiamate alle funzioni richimate fino al doppio punto e virgola ;; Nel seguente caso viene richiamata la funzione COMPILE e si esegue
una copia di backup del file di configurazione di inet. |
x | X ) COMPILE touch /etc/xinetd.d/ssh echo " # describe : OPENSSH DAEMON" >>/etc/xinetd.d/ssh echo "service ssh" >>/etc/xinetd.d/ssh echo " " echo " {" >>/etc/xinetd.d/ssh echo " socket_type = stream" >>/etc/xinetd.d/ssh echo " protocol = tcp" >>/etc/xinetd.d/ssh echo " instances = 10" >>/etc/xinetd.d/ssh echo " nice = 10" >>/etc/xinetd.d/ssh echo " wait = no" >>/etc/xinetd.d/ssh echo " user = root" >>/etc/xinetd.d/ssh echo " server = /usr/sbin/sshd" >>/etc/xinetd.d/ssh echo " server_args = -i" >>/etc/xinetd.d/ssh echo " " echo " }" >>/etc/xinetd.d/ssh IP COPY ;; |
Nel caso in cui a assuma il valoredi a è pari a x o X si esegue la compilazione dei sorgenti, si crea il file di configurazione per permettere ad xinetd di gestire il demone ssh e di seguito vengono richiamate le funzioni IP e COPY |
daemon | DAEMON ) COMPILE COPY ;; |
Nel caso in cui il valore di a è pari a daemon o DAEMON si eseguono solo le funzioni di COMPILE E COPY |
up | UP ) COMPILE esac |
Nel caso in cui il valore di a è
pari a up o UP si esegue la funzione COMPILE. Da sottolineare la presenza di esac che chiude il ciclo di case |