Mercoledì, 14 Agosto 2019 17:29

Bacula è un potente sistema di backup di rete di classe enterprise in architettura server-client.
I backup vengono scritti su nastri, su dischi o su qualsiasi altra memoria di massa che vogliamo.
Se eliminiamo un backup fisicamente (es. cancelliamo il file di backup o una cassetta) otterremo, però, degli errori perché restano nel database le scritture dei backup e dei lavori eseguiti. In pratica Bacula continua a cerca quello che abbiamo appena eliminato.

Venerdì, 09 Agosto 2019 16:20

Ci sono diversi modi e diverse guide che spiegano come fare, ma alcuni metodi sprevedono come unità di misura bits e non bytes, così per avere 5MB devo scrivere 5242880!!.
Qui di seguito riporto un metodo dove scrivendo 5 ottengo 5MB.

Sabato, 13 Luglio 2019 22:54

Usando l'applicazione esempio "MySchool" dal pacchetto 6.1.2 ( https://www.openxava.org/downloads/ ) si ottengono degli errori e non funziona, malgrado si proceda come indicato nella guida "Quick start" ( https://www.openxava.org/OpenXavaDoc/docs/quick-start_en.html ).

Accedendo alla pagina principale dell'applicazione si ottengono le due seguenti righe di errore:

Impossible to execute Init list action: Transaction marked as rollbackOnly

Errors trying to obtain data list

Lunedì, 13 Maggio 2019 22:04

In alcune situazioni è necessario definire la risoluzione grafica di Linux in fase di avvio o, addirittura, forzarlo per la modalità testuale.

Domenica, 28 Aprile 2019 12:12

Problema

Provando a connettersi sia ssh ad un server UCS (www.univention.com/) si ha il seguente errore

ssh: connect to host server.example.com port 22: Connection refused

Sabato, 20 Aprile 2019 10:07

In un sistema che impiega ApcUPSd (www.apcupsd.org) per monitorare il gruppo di continuità, dopo un cambio batterie, malgrado l'aggiornamento della stringa “BATTDATE” in apcupsd.conf, la data delle batterie non cambia nel monitoraggio.
Il problema riguarda UPS non recenti, ma funzionanti.

Giovedì, 18 Aprile 2019 23:47

Se lanciando logstash si ha un errore e non colleziona i dati la causa è una doppia stringa di imput sulla stessa porta.

Giovedì, 18 Aprile 2019 23:05

In CentOS 7 alcuni log (es. /var/log/secure) riportano un orario degli eventi sbagliato malgrado il fuso orario e l'orario hardware siano corretti.
Se avviene questo problema significa che manca il pacchetto tzdata :

Mercoledì, 17 Aprile 2019 23:41

Da riga di comando per impostare il fuso orario abbiamo l'utility timedatectl .

Venerdì, 29 Marzo 2019 22:50

Questa guida descrive, passo, passo, come installare iDempiere in un server privato (fisico o in cloud).

L'HowTo descrive le operazioni base prescindendo dall'architettura di rete, dall'integrazione, ecc...

Non descritto, invece, come inizializzare l'ERP (creazione dell'azienda, caricamento del piano contabile, ecc...).

Da tener presente che la versione qui indicata di iDempiere non funziona con il JDK 11 (attualmente rilasciato da Oracle).

Lunedì, 25 Marzo 2019 21:49

Installando etherape in Ubuntu 18 LTS crasha dando l'errore

Domenica, 24 Febbraio 2019 23:26

Apache httpd è un web server con molte futures. Tra le varie potenzialità permette di elencare il contenuto di una directory, cioè di mostrare la lista dei file e delle directory contenute.

L'impostazione di base, però, è molto semplice.

In questa guida vediamo come modificare l'aspetto dell'elenco dei file e delle directory generato dal server web Apache.

Mercoledì, 20 Febbraio 2019 11:50

Queste pagine descrivono, passo, passo, la realizzazione di un server che invia SMS.

La soluzione proposta si basa su Gammu e PlaySMS. Ciò permette di mantenere relativamente bassa la complessità tecnica e di poter usare hardware domestico.

Domenica, 13 Gennaio 2019 16:13

Ecco come prendere un PC fisico e farlo diventare virtuale mettendolo in un virtualizzatore KVM Proxmox.

Domenica, 13 Gennaio 2019 15:50

Ci sono diversi modi per creare un pendrive bottante con a bordo Knoppix. Da cli possiamo usare dd; ecco come

Giovedì, 03 Gennaio 2019 00:02

OCSinvenctory ( http://ocsinventory.sourceforge.net ) è un potente sistema di inventariazione automatica degli asset IT. Si tratta di una potente e flessibile soluzione veramente pregevole.

Anche se si impiega solo in una LAN è opportuno (o meglio necessario) usare il protocollo https. Con poca fatica si può avere una propria CA.

Con questa architettura l’installazione necessita di alcune particolarità che se trascurate OCSinventory non funziona.

In queste pagine descrivo, passo, passo, come creare questa configurazione nei client per un corretto funzionamento di tutta la rete di auto-inventariazione.

Domenica, 25 Novembre 2018 22:03

Nelle impostazioni via web è possibile disattivare l’inserimento di commenti solo per alcuni contenuti.

Per una disattivazione completa bisogna intervenire nel file portal-ext.properties .

Domenica, 25 Novembre 2018 18:26

Le recenti versioni di Liferay usano il moderno editor AlloyUI, un framework molto bello, ma se si ama il vecchio ckeditor può essere disagevole.

Ecco come riportare ckeditor come editor di default.

Giovedì, 09 Agosto 2018 22:58

FET, aconimo di “Free Educational Timetabling”, è un programma per la generazione automatica degli orari di lezione per scuole secondarie e università.
Applicazione desktop, multi-piattaforma, al momento l’ultima versione (la 5.37.1) compilata è disponibile solo per Windows. Per MAC e Linux va compilata.
Questa guida descrive, passo, passo, come compilarlo e creare un pacchetto .DEB per distribuirlo per sistemi Debian e derivate.

Venerdì, 13 Luglio 2018 00:13

Questa piccola guida descrive come modificare il laucher default di Unity, ovvero il menu default di Unity.

Sabato, 02 Giugno 2018 21:23

CMDBuild ( www.cmdbuild.org ) è un programma per gestire il database delle configurazioni. In realtà, creando le opportune tabelle (in gergo “classi”) è un MS Access via web.
In questa guida è descritta, passo, passo, l’installazione all’interno di CentOS 7. A differenza di quanto descritto nella guida ufficiale ( www.cmdbuild.org/it/documentazione/manuali/technical-manual ) sono necessarie alcuni accorgimenti non descritti altrimenti l’operazione non va in porto.
Infine in questa guida:

  • non sono descritte le operazioni per installare l’intero ecosistema (Alfresco, GIS, Sharkm ecc…);
  • non sono descritte le operazioni di configurazione;
  • non viene descritto come creare i report con JasperStudio.

Ultima nota: anche in questa versione non è possibile inserire direttamente un file in una scheda (es. una foto), né renderizzare file di immagine salvati sul DMS di backend, né usare motori di workflow diversi dal datato Shark e, ufficlmente, gira solo su Tomcat.

Lunedì, 05 Febbraio 2018 23:23

Può capitare di cambiare il proprio computer e, per chi è più geek, reinstallare il sistema operativo. Salvare i propri dati non è un problema, ma salvare il proprio profilo (configurazioni dei programmi, rubriche, ecc...) diviene già più complesso. Se vogliamo salvare anche il join ad un dominio AD serve qualche accorgimento ulteriore.
Ecco una guida passo-passo per sistemi Linux.

Venerdì, 08 Dicembre 2017 17:53

Quando ci si collega ad una macchina remota via SSH e successivamente si acquisisce l'identità di un altro utente non partono le applicazioni grafiche con errore "cannot open display: localhost:10.0" malgrado si attivato sia l'X11 forward e SSH sia stato invocato con l'opzione "-X" o "-Y".

Lunedì, 29 Agosto 2016 00:00

Il fatto: un hard disk di un server si rompe mentre il server è in funzione.
Epilogo finale: quasi tutto è integro e funzionante!

Condivido questa storia perché mi sembra efficace per raccontare tecnologie e pratiche vincenti e, anche, per evitare leggerezze che hanno conseguenze non positive.
I fatti narrati sono tutti veri. Di fantasia, invece, i nomi.
Quindi ora allaccia le cinture; inizia il racconto e la condivisione di alcune considerazioni alla fine.

Sabato, 13 Agosto 2016 17:51

Xibo è un potente e versatile “Digital Signage CMS Open Source”, ovvero un sito che trasmette PowerPoint che vengono visualizzati da applicativi player.

Molto potente (l’affermazione non è esagerata) e versatile in questo momento risulta limitato negli applicativi client. Xibo implementa un protocollo privato. Offre tutte le informazioni necessarie per costruirne uno in proprio, ma di applicativi ne offre solo due: uno per Windows e uno per Android. Per Linux al momento non c’è nulla.

Questo howto spiega un work around fatto tramite Wine.

Il testo prende come riferimento Ubuntu 16, come distribuzione. Con piccole differenze è applicabile ad ogni altra distro.

Domenica, 26 Giugno 2016 09:54

La guida pubblica per il deploy di Xwiki non descrive in modo completo la procedura (almeno per una persona con poca esperienza).
Questa guida descrive l'installazione partendo dall'Application Server, poi la preparazione del pacchetto WAR e, infine, l'inizializzazione di Xwiki.
Un howto essenziale e pratico.

Venerdì, 19 Febbraio 2016 19:57

A little guide, in cookbook stile, to install AtoM into Linux RedHat or CentOS release 7 from zero.

Venerdì, 19 Febbraio 2016 19:55

SCP è un comando nello stack di ssh che permette di copiare file/directory in/da un server remoto su una connesione criptata. Usa fondamentalmente la sintassi di cp.

Venerdì, 19 Febbraio 2016 19:54

Per suonare un file audio dando il comando da riga di comando possiamo usa canberra-gtk-play.
NB: questo howto funziona solo se X è attivo e se si usa Gnome.

Venerdì, 19 Febbraio 2016 19:53

1. Problema

Cone Red Hat 7.x e derivate, usando il set di comandi di LVM si ottiene un errore “xxxx not unlocked” sia nel vedere, manipolare, creare o cancellare un qualcosa dell'LVM.
L'errore compare anche se uno o più volumi nell'host funzionano senza apparenti problemi.
Pur non causando danni non è più possibile la manipolazione/manutenzione dei volumi LVM.

Venerdì, 19 Febbraio 2016 19:48
Passando a MariaDB da MySQL si può avere la sorpresa che alcuni username non vengono accettati perché più lunghi di 16 caratteri. Ecco l'errore restituito:
ERROR 1470 (HY000): String 'stefano.bortolato' is too long for user name (should be no longer than 16)
Il problema è causato da una modifica restrittiva nel database mysql . Ecco come estendere i limiti.
Venerdì, 19 Febbraio 2016 19:45
L'entropia è la misurazione della confusione. Maggiore è la confusione, maggiore è l'entropia.
In un sistema informatica è importante tenere alta l'entropia per avere delle generazioni casuali di qualità. Alcuni programmi, come quelli per la generazione di chiavi ssl, gpg, ecc... usano l'entropia di sistema per creare dati validi.
Ora in un sistema virtualizzato l'entropia tende ad essere così bassa da essere insufficiente (=inferiore a 200). Ciò causa alcuni strani come falsi positivi di attacchi CSRF, chiavi SSL non consistenti, ecc....
Nei sistemi Linux RedHat e derivate si può vedere l'entropia del sistema con
# cat /proc/sys/kernel/random/entropy_avail
Un valore inferiore a 200 è da considerarsi insufficiente. Valori normali sono nell'ordine di grandezza di 3000-4000.
Venerdì, 19 Febbraio 2016 18:05

In questo breve howto presento due soluzioni per poter avere più istanze (=server) MySQL in un unico server. Le istanze saranno perfettamente isolate l'una dall'altra.
I vantaggi di questa soluzione sono la riduzione dell'hardware (basta un solo server) e la possibilità di avere ambienti/istanze isolate con poca fatica e bassissimi costi.
L'ambiente di riferimento in questo testo è:

  • sistema operativo Red Hat 6.5 o derivata
  • layout di installazione: “basic server”
  • MySQL 5.1.73
  • Apache 2.2.15
  • PHP 5.3.3 con le librerie: php-cli, php-common, php-gd, php-imap, php-mbstring, php-mcrypt, php-mysql, php-pdo, php-pear, php-pear-Auth-SASL, php-php-gettext, php-process, php-xml.

In fine si tenga presente che questa soluzione non implementa alcuna forma di clusterizzazione volutamente.
Scarica l'howto in forma ODT, DOC e PDF: clicca qui


La realizzazione di più istanze indipendenti sullo stesso host, senza alcuna forma di cluster, è possibile realizzarla tramite due strategie con relativi pro e contro:

  1. ogni istanza è in ascolto su una porta TCP/IP diversa
  2. ogni istanza è in ascolto su un indirizzo TCP/IP diverso.

NOTA 1: alcune applicazioni popolari PHP (Joomla, WordPress, GLPI, ...) non permettono di impostare la porta pertanto non sono usabili se il server MySQL lavora su una porta diversa dalla 3306 .
NOTA 2: il server MySQL, per le connessioni provenienti da localhost (indirizzo 127.0.0.1), le esegue, di default, tutte tramite socket UNIX e non tramite TCP/IP.
Vediamo opportunità e limiti per ciascun soluzione. Successivamente vedremo l'implementazione delle due soluzioni in modo pratico.

1. Pro e contro: porte vs. indirizzi

In sintesi la soluzione sul multi-porta richiede applicazioni client di tipo enterprise.
La soluzione multi-indirizzi è compatibile con ogni tipo di applicazione.

1.1. Istanze su porte diverse

A pro:

  • facile da implementare
  • poca configurazione richiesta
  • non necessita di riserva altri indirizzi IP.

A contro:

  • potrebbe richiedere il ritocco delle regole di firewall
  • non è compatibile con applicazioni client "semplici".

1.2. Istanze su indirizzi diversi

A pro:

  • compatibile con ogni applicazione client
  • se si usano indirizzi di loopback non è richiesto il ritocco delle regole di firewall.

A contro:

  • è più laboriosa l'implementazione
  • richiede una pianificazione previa rigida.

2. HowTo di MySQL multi-istanza

Presentiamo la realizzazione di entrambe le soluzioni procedendo passo-passo.
Vogliamo ottenere 4 istanze totalmente isolate tra loro con datadir separati:


 
Istanza Nome Datadir
 Produzione pro  /opt/mysql/pro
 Pre-produzione pre  /opt/mysql/pre
 Sviluppo dev  /opt/mysql/dev
 Amministrazione adm  /opt/mysql/adm


A fattore comune poniamo le due seguenti attività/configurazioni prima di iniziare. Da qui in poi ogni attività è svolta come utente root:
1. disattiviamo SELinux.
1.1. editiamo il file selinux 

# vi /etc/sysconfig/selinux 

1.2. e correggiamo la seguente riga

...
SELINUX=disabled
...

2. riavviamo la macchina

# reboot

3. creiamo e impostiamo le directory per le relative istanze:

# mkdir -p /opt/mysql/pro /opt/mysql/pre /opt/mysql/dev /opt/mysql/adm
# chown mysql.mysql -R /opt/mysql/pro /opt/mysql/pre /opt/mysql/dev /opt/mysql/adm

2.1. Istanze su porte diverse

Il disegno di questa soluzione è il seguente (arbitrariamente pongo un offset di porta a 100)

Istanza Nome Datadir Porta
Produzione pro /opt/mysql/pro 3306
Pre-produzione pre /opt/mysql/pre 3406
Sviluppo dev /opt/mysql/dev 3506
Amministrazione adm /opt/mysql/adm 3606


NOTA: le configurazioni riportate qui di seguito sono minimali.
1. Iniziamo assicurandoci che il server MySQL sia down e sia a off come servizio

# service mysqld stop
# chkconfig mysqld off

2. rinominiamo il file standard di configurazione (in alcune situazioni può generare falsi errori)

# mv /etc/my.cnf /etc/my.cnf.OLD

3. creiamo i file di configurazione delle rispettive istanze. Qui di seguito riporto i file completi con una configurazione di esempio base adatta per istanze di piccola dimensione.
3.1. istanza "pro"
3.1.1. creiamo il file my-pro.cnf

# vi /etc/ my-pro.cnf

3.1.2. popoliamolo con il seguente contenuto

# PRO 3306

[client]
port=3306
socket=/var/lib/mysql/mysql-pro.sock

[mysqld]
datadir=/opt/mysql/pro
port=3306
socket=/var/lib/mysql/mysql-pro.sock
user=mysql
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-pro.log
pid-file=/var/run/mysqld/mysqld-pro.pid

3.2. istanza "pre"
3.2.1. creiamo il file my-pre .cnf

# vi /etc/ my-pre.cnf

3.2.2. popoliamolo con il seguente contenuto

# PRE 3406
[client]
port=3406
socket=/var/lib/mysql/mysql-pre.sock

[mysqld]
datadir=/opt/mysql/pre
port=3406
socket=/var/lib/mysql/mysql-pre.sock
user=mysql
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-pre.log
pid-file=/var/run/mysqld/mysqld-pre.pid

3.3. istanza "dev"
3.3.1. creiamo il file my-dev .cnf

# vi /etc/ my-dev.cnf

3.3.2. popoliamolo con il seguente contenuto

# DEV 3506
[client]
port=3506
socket=/var/lib/mysql/mysql-dev.sock

[mysqld]
datadir=/opt/mysql/dev
port=3506
socket=/var/lib/mysql/mysql-dev.sock
user=mysql
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-dev.log
pid-file=/var/run/mysqld/mysqld-dev.pid

3.4. istanza "adm"
3.4.1. creiamo il file my-adm .cnf

# vi /etc/ my-adm.cnf

3.4.2. popoliamolo con il seguente contenuto

# ADM 3606
[client]
port=3606
socket=/var/lib/mysql/mysql-adm.sock

[mysqld]
datadir=/opt/mysql/adm
port=3606
socket=/var/lib/mysql/mysql-adm.sock
user=mysql
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-adm.log
pid-file=/var/run/mysqld/mysqld-adm.pid

4. creiamo i file di bootstrap delle istanze. Per comodità cloneremo lo script originale e successivamente personalizzeremo ciascuna copia. Riporterò i file con il codice completo evidenziando i punti in qui le stringhe sono aggiornate rispetto all'originale (si tratta sempre di aggiunte)
4.1. creiamo le copie

# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-pro
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-pre
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-dev
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-adm

4.2. personalizziamo ciascuno script
4.2.1. editiamo mysqld-pro

# vi /etc/init.d/mysqld-pro

4.2.2. popoliamolo con il seguente contenuto

#!/bin/sh
#
# PRO
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-pro.cnf
# pidfile: /var/run/mysqld/mysqld-pro.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-pro"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-pro.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/pro"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-pro.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-pro.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-pro.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-pro.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

4.2.3. editiamo mysqld-pre

# vi /etc/init.d/mysqld-pre

4.2.4. popoliamolo con il seguente contenuto

#!/bin/sh
#
# PRE
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-pre.cnf
# pidfile: /var/run/mysqld/mysqld-pre.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-pre"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-pre.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/pre"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-pre.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-pre.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-pre.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-pre.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

4.2.5. editiamo mysqld-dev

# vi /etc/init.d/mysqld-dev

4.2.6. popoliamolo con il seguente contenuto

#!/bin/sh
#
# DEV
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-dev.cnf
# pidfile: /var/run/mysqld/mysqld-dev.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-dev"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-dev.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/dev"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-dev.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-dev.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-dev.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-dev.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

4.2.7. editiamo mysqld-adm

# vi /etc/init.d/mysqld-adm

4.2.8. popoliamolo con il seguente contenuto

#!/bin/sh
#
# ADM
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-adm.cnf
# pidfile: /var/run/mysqld/mysqld-adm.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-adm"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-adm.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/adm"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-adm.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-adm.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-adm.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-adm.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

5. avviamo le nostre istanze

# service mysqld-pro start
# service mysqld-pre start
# service mysqld-dev start
# service mysqld-adm start

6. se vogliamo porle a on come servizio procediamo con le seguenti istruzioni

# chkconfig mysqld-pro on
# chkconfig mysqld-pre on
# chkconfig mysqld-dev on
# chkconfig mysqld-adm on

NOTA: è possibile che qualche errore scappi in mezzo a qualche script. Se un'istanza non parte è una buona pratica consultare il relativo log. Qui di seguito riporto il log dell'istanza “pre”. Con il lancio del servizio ho visto la creazione (corretta) del datadir, ma subito dopo ho ottenuto un errore e non è partita. Il log evidenzia che non ho aggiornato la porta dell'istanza (punta ancora alla 3306) ed entra in conflitto con l'istanza “pro”.

140704 10:19:52 mysqld_safe Starting mysqld daemon with databases from /opt/mysql/pre
140704 10:19:52 InnoDB: Initializing buffer pool, size = 8.0M
140704 10:19:52 InnoDB: Completed initialization of buffer pool
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
140704 10:19:52 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
140704 10:19:52 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
140704 10:19:53 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
140704 10:19:53 InnoDB: Started; log sequence number 0 0
140704 10:19:53 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
140704 10:19:53 [ERROR] Do you already have another mysqld server running on port: 3306 ?
140704 10:19:53 [ERROR] Aborting

2.2. Istanze su indirizzi diversi

Il disegno di questa soluzione è il seguente:

Istanza Nome Datadir IP hostname
Produzione pro /opt/mysql/pro 127.0.0.30 pro.db.example.loc
Pre-produzione pre /opt/mysql/pre 127.0.0.31 pre.db.example.loc
Sviluppo dev /opt/mysql/dev 127.0.0.32 dev.db.example.loc
Amministrazione adm /opt/mysql/adm 127.0.0.33 adm.db.example.loc

1. Iniziamo assicurandoci che il server MySQL sia down e sia a off come servizio

# service mysqld stop
# chkconfig mysqld off

2. aggiungiamo gli indirizzi IP e attiviamoli
2.1. editiamo il file ifcfg-lo

# vi /etc/sysconfig/network-scripts/ifcfg-lo

2.2. aggiungiamo le seguenti righe al fondo del file

...
IPADDR1=127.0.0.30
IPADDR2=127.0.0.31
IPADDR3=127.0.0.32
IPADDR4=127.0.0.33

2.3. attiviamo i nuovi indirizzi

# ifdown lo
# ifup lo

2.4. editiamo il file hosts

# vi /etc/hosts

2.5. aggiungiamo le seguenti righe

...
127.0.0.30 pro.db.example.loc
127.0.0.31 pre.db.example.loc
127.0.0.32 adm.db.example.loc
127.0.0.33 dev.db.example.loc

3. rinominiamo il file standard di configurazione (in alcune situazioni può generare falsi errori)

# mv /etc/my.cnf /etc/my.cnf.OLD

4. creiamo i file di configurazione delle rispettive istanze. Qui di seguito riporto i file completi con una configurazione di esempio base adatta per istanze di piccola dimensione.
4.1. istanza "pro"
4.1.1. creiamo il file my-pro .cnf

# vi /etc/my-pro .cnf

4.1.2. popoliamolo con il seguente contenuto

# PRO 3306
[client]
port = 3306
socket = /var/lib/mysql/mysql-pro.sock

[mysqld]
datadir=/opt/mysql/pro
port=3306
socket=/var/lib/mysql/mysql-pro.sock
user=mysql
# bind-address=127.0.0.30
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-pro.log
syslog
pid-file=/var/run/mysqld/mysqld-pro.pid

4.2. istanza "pre"
4.2.1. creiamo il file my-pre .cnf

# vi /etc/my-pre.cnf

4.2.2. popoliamolo con il seguente contenuto

# PRE 3306
[client]
port=3306
socket=/var/lib/mysql/mysql-pre.sock

[mysqld]
datadir=/opt/mysql/pre
port=3306
socket=/var/lib/mysql/mysql-pre.sock
user=mysql
# bind-address=127.0.0.31
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-pre.log
pid-file=/var/run/mysqld/mysqld-pre.pid

4.3. istanza "dev"
4.3.1. creiamo il file my-dev .cnf

# vi /etc/my-dev.cnf

4.3.2. popoliamolo con il seguente contenuto

# DEV 3306
[client]
port=3306
socket=/var/lib/mysql/mysql-dev.sock

[mysqld]
datadir=/opt/mysql/dev
port=3306
socket=/var/lib/mysql/mysql-dev.sock
user=mysql
# bind-address=127.0.0.33
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-dev.log
pid-file=/var/run/mysqld/mysqld-dev.pid

4.4. istanza "adm"
4.4.1. creiamo il file my-adm .cnf

# vi /etc/my-adm.cnf

4.4.2. popoliamolo con il seguente contenuto

# ADM 3306
[client]
port = 3306
socket = /var/lib/mysql/mysql-adm.sock

[mysqld]
datadir=/opt/mysql/adm
port=3306
socket=/var/lib/mysql/mysql-adm.sock
user=mysql
# bind-address=127.0.0.32
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld-adm.log
pid-file=/var/run/mysqld/mysqld-adm.pid

5. creiamo i file di bootstrap delle istanze. Per comodità cloneremo lo script originale e successivamente personalizzeremo ciascuna copia. Riporterò i file con il codice completo evidenziando i punti in cui le stringhe sono state aggiornate rispetto all'originale (si tratta sempre di aggiunte)
5.1. creiamo le copie

# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-pro
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-pre
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-dev
# cp -p /etc/init.d/mysqld /etc/init.d/mysqld-adm

5.2. personalizziamo ciascuno script
5.2.1. editiamo mysqld-pro

# vi /etc/init.d/mysqld-pro

5.2.2. popoliamolo con il seguente contenuto

#!/bin/sh
#
# PRO
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-pro.cnf
# pidfile: /var/run/mysqld/mysqld-pro.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-pro"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-pro.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/pro"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-pro.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-pro.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-pro.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-pro.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

5.2.3. editiamo mysqld-pre

# vi /etc/init.d/mysqld-pre

5.2.4. popoliamolo con il seguente contenuto

#!/bin/sh
#
# PRE
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-pre.cnf
# pidfile: /var/run/mysqld/mysqld-pre.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-pre"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-pre.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/pre"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-pre.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-pre.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-pre.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-pre.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

5.2.5. editiamo mysqld-dev

# vi /etc/init.d/mysqld-dev

5.2.6. popoliamolo con il seguente contenuto

#!/bin/sh
#
# DEV
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-dev.cnf
# pidfile: /var/run/mysqld/mysqld-dev.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-dev"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-dev.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/dev"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-dev.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-dev.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-dev.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-dev.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

5.2.7. editiamo mysqld-adm

# vi /etc/init.d/mysqld-adm

5.2.8. popoliamolo con il seguente contenuto

#!/bin/sh
#
# ADM
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description: MySQL database server.
# processname: mysqld
# config: /etc/my-adm.cnf
# pidfile: /var/run/mysqld/mysqld-adm.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="/usr/bin/mysqld_safe"
prog="mysqld-adm"

# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
STARTTIMEOUT=120
STOPTIMEOUT=60

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog


# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
result=`/usr/bin/my_print_defaults -c /etc/my-adm.cnf "$1" | sed -n "s/^--$2=//p" | tail -n 1`
if [ -z "$result" ]; then
# not found, use default
result="$3"
fi
}

get_mysql_option mysqld datadir "/opt/mysql/adm"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql-adm.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/log/mysqld-adm.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld-adm.pid"
mypidfile="$result"


start(){
[ -x $exec ] || exit 5
# check to see if it's already running
MYSQLDRUNNING=0
if [ -f "$mypidfile" ]; then
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
MYSQLDRUNNING=1
fi
fi
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
then
# already running, do nothing
action $"Starting $prog: " /bin/true
ret=0
else
# prepare for start
touch "$errlogfile" 2>/dev/null
if [ $? -ne 0 ]; then
# failed to touch log file, probably insufficient permissions
action $"Starting $prog: " /bin/false
return 4
fi
chown mysql:mysql "$errlogfile"
chmod 0640 "$errlogfile"
[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
if [ ! -d "$datadir/mysql" ] ; then
# First, make sure $datadir is there with correct permissions
if [ ! -e "$datadir" -a ! -h "$datadir" ]
then
mkdir -p "$datadir" || exit 1
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
# Now create the database
action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
ret=$?
chown -R mysql:mysql "$datadir"
if [ $ret -ne 0 ] ; then
return $ret
fi
fi
chown mysql:mysql "$datadir"
chmod 0755 "$datadir"
# We check if there is already a process using the socket file,
# since otherwise this init script could report false positive
# result and mysqld_safe would remove the socket file, which
# actually uses a different daemon.
if fuser "$socketfile" &>/dev/null ; then
echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
action $"Starting $prog: " /bin/false
return 1
fi
# Pass all the options determined above, to ensure consistent behavior.
# In many cases mysqld_safe would arrive at the same conclusions anyway
# but we need to be sure. (An exception is that we don't force the
# log-error setting, since this script doesn't really depend on that,
# and some users might prefer to configure logging to syslog.)
# Note: set --basedir to prevent probes that might trigger SELinux
# alarms, per bug #547485
$exec --defaults-file="/etc/my-adm.cnf" --datadir="$datadir" \
--socket="$socketfile" --pid-file="$mypidfile" \
--basedir=/usr --user=mysql >/dev/null 2>&1 &
safe_pid=$!
# Spin for a maximum of N seconds waiting for the server to come up;
# exit the loop immediately if mysqld_safe process disappears.
# Rather than assuming we know a valid username, accept an "access
# denied" response as meaning the server is functioning.
ret=0
TIMEOUT="$STARTTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
mret=$?
if [ $mret -eq 0 ]; then
break
fi
# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
# anything else suggests a configuration error
if [ $mret -ne 1 -a $mret -ne 11 ]; then
echo "$RESPONSE"
echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
ret=1
break
fi
echo "$RESPONSE" | grep -q "Access denied for user" && break
if ! /bin/kill -0 $safe_pid 2>/dev/null; then
echo "MySQL Daemon failed to start."
ret=1
break
fi
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to start MySQL Daemon."
ret=1
fi
if [ $ret -eq 0 ]; then
action $"Starting $prog: " /bin/true
chmod o+r $mypidfile >/dev/null 2>&1
touch $lockfile
else
action $"Starting $prog: " /bin/false
fi
fi
return $ret
}

stop(){
if [ ! -f "$mypidfile" ]; then
# not running; per LSB standards this is "ok"
action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
# failed to read pidfile, probably insufficient permissions
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}

restart(){
stop
start
}

condrestart(){
[ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p "$mypidfile" $prog
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
reload)
exit 3
;;
force-reload)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac

exit $?

6. avviamo ciascuna istanza e procediamo inserendo l'utente root abilitato per il relativo host
6.1. istanza "pro"
6.1.1. avviamo l'istanza

# service mysqld-pro start

6.1.2. colleghiamoci con il monitor MySQL
NOTA: usiamo una sintassi personalizzata per garantire il collegamento con i diversi parametri impostati lato server

# mysql --socket=/var/lib/mysql/mysql-pro.sock --protocol=socket -u root

6.1.3. creiamo l'utente root per l'host pro.db.example.loc (sostituire password con una reale password!)

mysql> CREATE USER 'root'@'pro.db.example.loc' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'root'@'pro.db.example.loc' IDENTIFIED BY 'password' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

6.1.4. stoppiamo l'istanza

# service mysqld-pro stop

6.2. istanza "pre"
6.2.1. avviamo l'istanza

# service mysqld-pre start

6.2.2. colleghiamoci con il monitor MySQL
NOTA: usiamo una sintassi personalizzata per garantire il collegamento con i diversi parametri impostati lato server

# mysql --socket=/var/lib/mysql/mysql-pre.sock --protocol=socket -u root

6.2.3. creiamo l'utente root per l'host pre.db.example.loc (sostituire password con una reale password!)

mysql> CREATE USER 'root'@'pre.db.example.loc' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'root'@'pre.db.example.loc' IDENTIFIED BY 'password' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

6.2.4. stoppiamo l'istanza

# service mysqld-pre stop

6.3. istanza "dev"
6.3.1. avviamo l'istanza

# service mysqld-dev start

6.3.2. colleghiamoci con il monitor MySQL
NOTA: usiamo una sintassi personalizzata per garantire il collegamento con i diversi parametri impostati lato server

# mysql --socket=/var/lib/mysql/mysql-dev.sock --protocol=socket -u root

6.3.3. creiamo l'utente root per l'host dev.db.example.loc (sostituire password con una reale password!)

mysql> CREATE USER 'root'@'dev.db.example.loc' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'root'@'dev.db.example.loc' IDENTIFIED BY 'password' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

6.3.4. stoppiamo l'istanza

# service mysqld-dev stop

6.4. istanza "adm"
6.4.1. avviamo l'istanza

# service mysqld-adm start

6.4.2. colleghiamoci con il monitor MySQL
NOTA: usiamo una sintassi personalizzata per garantire il collegamento con i diversi parametri impostati lato server

# mysql --socket=/var/lib/mysql/mysql-adm.sock --protocol=socket -u root

6.4.3. creiamo l'utente root per l'host adm.db.example.loc (sostituire password con una reale password!)

mysql> CREATE USER 'root'@'adm.db.example.loc' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'root'@'adm.db.example.loc' IDENTIFIED BY 'password' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

6.4.4. stoppiamo l'istanza

# service mysqld-adm stop

7. aggiorniamo i file di configurazione delle istanze introducendo il bind su un solo indirizzo IP . Per fare questo de-commentiamo, nei rispettivi file *.cnf, la riga con la chiave “bind-address”.
7.1. istanza “pro”
7.1.1. editiamo il file my-pro.cnf

# vi /etc/my-pro.cnf

7.1.2. de-commentiamo la riga “bind-address”

...
user=mysql
bind-address=127.0.0.30
symbolic-links=0
...

7.2. istanza “pre”
7.2.1. editiamo il file my-pre.cnf

# vi /etc/my-pre.cnf

7.2.2. de-commentiamo la riga “bind-address”

...
user=mysql
bind-address=127.0.0.31
symbolic-links=0
...

7.3. istanza “dev”
7.3.1. editiamo il file my-dev.cnf

# vi /etc/my-dev.cnf

7.3.2. de-commentiamo la riga “bind-address”

...
user=mysql
bind-address=127.0.0.32
symbolic-links=0
...

7.4. istanza “adm”
7.4.1. editiamo il file my-adm.cnf

# vi /etc/my-adm.cnf

7.4.2. de-commentiamo la riga “bind-address”

...
user=mysql
bind-address=127.0.0.33
symbolic-links=0
...

8. avviamo le nostre istanze

# service mysqld-pro start
# service mysqld-pre start
# service mysqld-dev start
# service mysqld-adm start

9. se vogliamo porle a on come servizio procediamo con le seguenti istruzioni

# chkconfig mysqld-pro on
# chkconfig mysqld-pre on
# chkconfig mysqld-dev on
# chkconfig mysqld-adm on

NOTA: è possibile che qualche errore scappi in mezzo a qualche script. Se un'istanza non parte è una buona pratica consultare il relativo log.

3. Appendice

A titolo di esempio riporto la configurazione base per PhpMyAdmin per usarlo come multi-dominio sia nella situazione di MySQL multi-porte, sia su multi-IP.
Il file di configurazione di PhpMyAdmin è “config.inc.php”. Se lo si è installato da rpm il file si trova:

/etc/phpMyAdmin/config.inc.php

Se si è installato manualmente si trova nel path della docroot di PhpMyAdmin.
Nel caso di MySQL in multi-porta possiamo usare il socket UNIX e configurare PhpMyAdmin come segue:

?php

$cfg['blowfish_secret'] = 'cbahdterpofsg237543oduryDVH2q-we';

$i = 0;

$i++;
/* PRO */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-pro.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'PRO';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* PRE */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3406';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-pre.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'PRE';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* DEV */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3506';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-dev.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'DEV';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* ADM */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3606';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-adm.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'ADM';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$cfg['UploadDir'] = '/var/lib/phpMyAdmin/upload';
$cfg['SaveDir'] = '/var/lib/phpMyAdmin/save';

$cfg['PmaNoRelation_DisableWarning'] = TRUE;
?></pre>
<p>Nel caso di MySQL in multi-IP possiamo usare il socket TCP/IP e configurare PhpMyAdmin come segue:</p>
<pre><?php

$cfg['blowfish_secret'] = 'cbahdterpofsg237543oduryDVH2q-we';

$i = 0;

$i++;
/* PRO */
$cfg['Servers'][$i]['host'] = 'pro.db.example.loc';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'PRO';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* PRE */
$cfg['Servers'][$i]['host'] = 'pre.db.example.loc';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-pre.sock';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'PRE';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* DEV */
$cfg['Servers'][$i]['host'] = 'dev.db.example.loc';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-dev.sock';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'DEV';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$i++;
/* ADM */
$cfg['Servers'][$i]['host'] = 'adm.db.example.loc';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql-adm.sock';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['compress'] = FALSE;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql)';
$cfg['Servers'][$i]['verbose'] = 'ADM';
$cfg['Servers'][$i]['verbose_check'] = TRUE;
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
$cfg['Servers'][$i]['bs_garbage_threshold'] = 50;
$cfg['Servers'][$i]['bs_repository_threshold'] = '32M';
$cfg['Servers'][$i]['bs_temp_blob_timeout'] = 600;
$cfg['Servers'][$i]['bs_temp_log_threshold'] = '32M';

$cfg['UploadDir'] = '/var/lib/phpMyAdmin/upload';
$cfg['SaveDir'] = '/var/lib/phpMyAdmin/save';

$cfg['PmaNoRelation_DisableWarning'] = TRUE;
?></pre>
<h1>4. Conclusione</h1>
<p>MySQL permette diverse architetture per rispondere alle richieste enterprise. Le indicazioni per configurare repliche automatiche, cluster o soluzioni HA sono abbondanti.<br /> Queste pagine raccolgono una piccola valutazione di opportunità e le indicazioni operative per un caso meno richiesto (e, pertanto, un po' meno documentato), ma utile in alcune situazioni.
Seguendo queste indicazioni, opportunamente aggiornate per i nostri specifici bisogni, nel giro di poco tempo possiamo avere running un server MySQL multi-istanza con un comodo PhpMyAdmin funzionante per gestire il nostro DBMRS.

Venerdì, 19 Febbraio 2016 18:02

Scopo di questa guida è di presentare in modo semplice e veloce come installare JBoss e avviarlo automaticamente. A corredo vengono date alcune indicazione aggiuntive di natura sistemistica utili soprattutto agli inizi.

Venerdì, 19 Febbraio 2016 17:52
In questo howto spiego l'installazione manuale di EGroupware partendo dai pacchetti tarball/SVN. A installazione completata spiegherò, con un esempio pratico, l'aggiunta di due domini indipendenti, in EGroupware.
Venerdì, 19 Febbraio 2016 17:51

Per diventare root senza conoscere la password di root

La password di root è l'elemento più delicato da gestire in un sistema *NIX. A volte, però, è necessario concedere a qualcuno di diventare root. La soluzione tradizione prevede di invocare su e usare, naturalmente, la password di root. Attraverso sudo possiamo controllare meglio questo permesso aggirando l'uso della password di root.

In questo howto vedremo come permettere a un utente di diventare root usando solo la propria password. Vedremo anche come poter concedere il privilegio di diventare root senza dover fornire alcuna password.

Venerdì, 19 Febbraio 2016 17:48

Il servizio sieve permette di creare filtri email direttamente lato server. Ciò permette un uso-servizio ottimale con le webmail e/o con il protocollo IMAP.

Venerdì, 19 Febbraio 2016 17:46

Un piccolo modo perché tutto avvenga automaticamente ogni giorno
Alcune operazioni non vengono eseguite subito da MySQL sulle tabelle. Questo comportamento ha lo scopo di rendere più performante ed efficiente il nostro DBMS e serve per una certa sicurezza.

Venerdì, 19 Febbraio 2016 17:43

Rkhunter è un programma cacciatore di Rootkit in grado di funzionare su sistemi Linux, BSD, Solaris e *NIX.
L'installazione e l'uso sono semplici, ma la documentazione non descrive operativamente la fase di tuning, di configurazione di cron e di logrotate indispensabili per un buon funzionamento ed evitare falsi positivi.
In questa guida viene descritta l'installazione, la configurazione, il tuning, la configurazione di cron e di logrotate per un corretto funzionamento.

Venerdì, 19 Febbraio 2016 17:42

Questo howto descrive una soluzione per creare un utente e permettergli di acquisire i diritti di root senza dovergli comunicare la password di root. Naturalmente l’account che creiamo per l’utente avrà tutte le caratteristiche di un accesso usa-e-getta.


1 Premessa

Le indicazioni riportate di seguito si riferiscono ad un ambiente RedHat 6.3 o derivata. Nel caso di impiego di una diversa distribuzione possono cambiare la posizione di alcuni file o le specifiche delle opzioni dei comandi.
Nei paragrafi seguiti realizzeremo la seguente situazione:

  1. creiamo una account con username "utente1" e password "password_A1"
  2. l'account sarà impostata per il cambio obbligatorio della password al primo login
  3. l'account è attiva per 24 ore: facciamo il lavoro 2012-02-01 e scade il 2012-02-02.

Nota: per mantenere sicuro il sistema si deve disattivare le account create con la seguente procedura appena terminato lo scopo d'uso. Essendo completamente manuale la procedura si deve porre molta attenzione a non lasciare account attive.

2 Concessione del permesso

La creazione di una account che permetta di diventare root senza conoscerne la password comporta due fasi:

  1. creazione di un’account
  2. configurazione di sudo.

Tutte le operazioni descritte qui di seguito vanno eseguite come utente root.

2.1 Creazione account

1. Apriamo un terminale
2. creare l'utente utente1

# useradd -m utente1

3. impostare la password

# passwd utente1

Inserire nuova password UNIX:
Reinserire la nuova password UNIX:
passwd: password aggiornata correttamente

4. impostare il periodo di cambio e di vita dell'account

# chage -d 0 -M 1 -E 2012-02-02 utente1

2.2 Permessi sudo

1. Editiamo sudo invocando visudo

# visudo

2. aggiungiamo alla fine la riga

...
utente1 ALL=NOPASSWD: ALL

2.3 Accesso utente

A questo punto il nostro utente può accedere e diventare root senza dover conoscere la password di root. Appena entrato per diventare root è sufficiente che usi il seguente comando:

$ sudo su -

3 Revoca del permesso

Anche se siamo stati previdenti impostando una scadenza dell'account è opportuno rimuovere l'account e revocare il permesso inserito in sudo.

3.1 Revoca sudo

1. Editiamo sudo invocando visudo

# visudo

2. cancelliamo la riga precedentemente inserita

...
utente1 ALL=NOPASSWD: ALL

3.2 Cancellazione account

Rimuoviamo l'account e quanto connesso all'account

# userdel -r utente1

4 Varianti

Possiamo introdurre due varianti per rendere più facilmente usabile la soluzione.
La prima riguarda l'autorizzazione di un gruppo, piuttosto che il singolo utente, in sudo. In questo modo sarà sufficiente iscrivere il nuovo utente al gruppo e non dovremmo più editare sudo per inserire l'utente. A titolo di esempio vedremo come creare e rimuovere un utente.
La seconda variante è la realizzazione di uno script che automatizza tutte le operazioni di creazione e rimozione ed invia automaticamente un'email al nuovo utente con i dati di accesso.

4.1 Diritti a un gruppo

Per assegnare a un gruppo il diritto di diventare root senza conoscerne la password dobbiamo creare il gruppo e successivamente configurare opportunamente sudo. A titolo di esempio si riporta un esempio di aggiunta d'un utente.

4.1.1 Creazione gruppo sudo

Premessa: il gruppo che creiamo si chiama "sudo". Tutti gli utenti appartenenti a questo gruppo possono diventare root senza conoscerne la password.
Creiamo il gruppo:

# groupadd sudo

4.1.2 Configurazione sudo

1. Editiamo sudo invocando visudo

# visudo

2. aggiungiamo alla fine la riga

...
%sudo1 ALL=NOPASSWD: ALL

4.1.3 Creazione account

1. Apriamo un terminale
2. creare l'utente utente1

# useradd -m -G sudo utente1

3. impostare la password

# passwd utente1
Inserire nuova password UNIX:
Reinserire la nuova password UNIX:
passwd: password aggiornata correttamente

4. impostare il periodo di cambio e di vita dell'account

# chage -d 0 -M 1 -E 2012-02-02 utente1

4.1.4 Cancellazione account

Rimuoviamo l'account e quanto connesso all'account

# userdel -r utente1

4.2 Script di semi-automazione

Se è un'operazione che facciamo con una certa frequenza può essere d'aiuto la realizzazione di uno script che si occupa di fare le operazioni sopra descritte ed invia un'email al nuovo utente con le credenziali di accesso.
Il codice di questo script sarà, però, oggetto di un prossimo howto.

5 Limiti e problemi noti

  1. L'utente a cui concediamo i diritti di accesso per diventare root senza dover usare la password di root può vedere e fare tutto nel server. Pertanto è una prerogativa da concedere con molta cautela.
  2. La lavorazione totalmente manuale lascia un margine alto di possibili errori. Pertanto le operazioni sono da fare con molta attenzione e precisione.

6 Bibliografia

Forzare un utente a cambiare la password al primo login, http://linuxiana.blogspot.it/2008/09/forzare-un-utente-cambiare-la-password.html
Linux: come forzare il cambio della password al login per un utente, http://paranoidcomputer.com/linux-come-forzare-il-cambio-della-password-al-login-per-un-utente/

Venerdì, 19 Febbraio 2016 17:39

Come schedulare l'auto-invio delle newsletter

Questo howto presenta una via semplice per automatizzare l'invio dei messaggi creati in PHPlist evitando di dover tenere aperta la finestra del browser durante tutto il tempo necessario per l'elaborazione della coda e senza doverlo fare nel momento in cui si vuole che inizi l'invio.
Inoltre questa implementazione permette di ottenere un log centralizzato di tutti gli invii schedulati.

Venerdì, 19 Febbraio 2016 17:28

Questa guida spiega come procedere per bloccare la luminosità dello schermo e della tastiera nei sistemi Mac Book PRO 8.3 equipaggiati con Linux e Gnome come desktop grafico.

Infatti le distribuzioni non prevedono di serie un registrazione dei settaggi della retroilluminazione dello schermo e della tastiera. Pertanto ad ogni riavvio la retroilluminazione è sempre al massimo.

La presente guida presenta una soluzione collaudata su un sistema Ubuntu 12.04.

Venerdì, 19 Febbraio 2016 17:22
Questo howto descrive come poter realizzazione un server di stampa PDF ed il collegamento con eGroupWare, tramite protocollo WebDAV, per l'esportazione e l'accesso ai PDF. Si descrive anche l'implementazione di una futures per l'aggregazione dei PDF in unico file che verrà automaticamente spostato in una directory specifica sempre tramite il protocollo WebDAV.
Alla fine avremo un completo sistema di lavoro per gruppo accessibile via web tramite PC, tablet, smartphone, ecc... con il completo sync del nostro device via WebDAV, CalDAV, CardDAV e GroupDAV.

1 Panoramica

Questo howto descrive una soluzione client-server. Tramite la rete le stampe prodotte da un PC vengono inviate ad un server che lavora le code generando dei PDF che verranno caricati in un disco virtuale WebDAV. Il seguente disegno illustra il processo. Segue un spiegazione didascalica del processo.

 

Descrizione del processo:

  1. il PC genera la stampa

  2. il server trasforma la stampa in un file PDF

  3. il processo di copia sposta il file PDF nel disco virtuale WebDAV

  4. una volta al giorno, durante la notte, viene eseguito un processo che unisce tutti i PDF del giorno e li sposta nella directory “giornaliero”

  5. a inizio mese, subito dopo la mezzanotte, un processo unisce tutti i PDF presenti nella directory “giornaliero” e li sposta nella directory “mensile”

  6. a inizio anno, subito dopo la mezzanotte, un processo unisce tutti i PDF presenti nella directory “mensile” e li sposta nella directory “annuale”

  7. sempre a inizio anno, subito dopo la mezzanotte, viene verificata l’esistenza di PDF annuali più vecchi del limite stabilito e vengono cancellati.

Con questa soluzione è possibile una completa smaterializzazione delle stampe ed una diretta integrazione con il proprio IT. Inoltre, se l'uso di eGroupWare è sistematico, ritroveremo automaticamente tutti i documenti direttamente in eGroupWare potendoli condividere e/o allegare alle altre entry del sistema.

 

In fine questo howto immagina che:

  • si è organizzato il proprio ICT con un uso centrale di eGroupWare. A scopo esemplificativo si immagina tre gruppi di utenti all'interno di eGroupWare

  • il server con eGroupWare ed il server di stampa sono la stessa macchina (server1.exmple.com)

  • i file PDF vengono periodicamente aggregati e spostati in directory appropriate (la logica è aggregazione per giorno, directory "giornaliero", per mese, directory "mensile", per anno, directory "annuale")

  • i PDF generati vengono creati con un nome univoco, costruito come data_ora.pdf, ma non si distingue né il PC né l'utente che inviano la stampa

  • il server è realizzato con con RHEL (RedHat Enterprise Linux) 6.3, o CentOS 6.3 o Scientific Linux 6.3.

    Qualora si usi una distribuzione diversa alcune parti della guida vanno opportunamente adattate

  • la client si descrive l'installazione della stampante PDF solo per sistemi Windows XP, 7 ed 8. Naturalmente è possibile usare qualsiasi altro sistema operativo come client (OS, Linux, BSD, ecc...)

  • per semplicità non si descrive l'installazione e la configurazione di eGroupWare. Si presenterà semplicemente la customizzazione dell'utenza e dei gruppi in relazione al WebDAV

  • per semplicità non si descrive l'implementazione di alcuna restrizione, controllo o autenticazione del sistema di stampa. Questa guida descrive la realizzazione di un server aperto.

2 Preliminari

Per implementare il sistema è necessario che siano presenti alcuni software e alcune configurazioni specifiche lato server.

2.1 Personalizzazione eGroupWare

eGroupWare espone il disco virtuale WebDAV e controlla gli accessi ed i permessi. Procediamo alla creazione dell’utente-macchina (cioè un utente legato la servizio e non a una persona fisica) e alla corretta assegnazione dei permessi.

Il risultato che vogliamo ottenere è:

  • pdf-tlg è l’utente che scrive i file nel disco WebDAV

  • gli utenti che appartengono al gruppo “admins” possono accedere, scrivere e cancellare i file

  • gli utenti che appartengono ai gruppi “PDF Direzione” e “PDF Utenti” possono accedere in sola lettura.

Per impostare questi permessi in eGroupWare:

  1. accediamo a eGroupWare come amministratori

  2. creiamo l’utente pdf-tlg con le seguenti caratteristiche:

    Username: pdf-tlg
    Passwrod: Password_1
    Gruppo: PDF Utenti

  3. accediamo al componente Filemanager. Creiamo la directory /home/pdf-tlg

    1. autentichiamoci come amministratori

    2. accediamo a Filemanager

    3. risaliamo a monte delle directory e clicchiamo sull’icona “Edit setting” della directory “home”

    4. sulla nuova finestra clicchiamo sul bottone “superuser”1 e autentichiamoci come:

      Utente: admin
      Password: Password_Admin1

    5. impostiamo i permessi come segue

       

        1. entrare nella directory home e creare una nuova directory pdf-tlg

        2. ritornare a monte e cliccare su “Edit setting” della directory home. Ripristinare i permessi come in origine

    6.  

        1. procediamo impostando i permessi per la directory pdf-tlg. Entriamo nella cartella home e clicchiamo sull’icona “Edit setting” della directory pdf-tlg

        2. sulla nuova finestra clicchiamo sul bottone “superuser” e autentichiamoci come:

          Utente: admin
          Password: Password_Admin1

        3. impostiamo i permessi come segue

       

      2.2 Installare il repository rpmforge.org

      Iniziamo aggiungendo il repository rpmforge.org, necessario per i tool pdftk e davfs2.

      Una volta collegati al server e acquisiti i diritti di root procediamo:

    7. importiamo la chiave GPG

      rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

    8. scarichiamo l’rpm dal repository e installiamolo

      wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
      rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

    9. aggiorniamo il database di yum

      yum update

    2.3 Cups-pdf

    Installiamo e configuriamo il pacchetto cups-pdf per la generazione dei PDF.

    Una volta collegati al server e acquisiti i diritti di root procediamo:

  4. installiamo il pacchetto

    yum install cups-pdf

  5. personalizziamo la configurazione di cups-pdf. Iniziamo con la copia di sicurezza dei file non modificati

    cp -p /etc/cups/cups-pdf.conf /etc/cups/cups-pdf.conf.ORG

  6. modifichiamo /etc/cups/cups-pdf.conf nelle seguenti righe decommentandole e personalizzandole così:


    Out /var/spool/pdf-tlg

    PDFVer 1.4

    PostProcessing /usr/local/sbin/pdf-tlg.sh

    NOTA: il parametro "PDFVer" imposta la versione di PDF creato. Impostando la 1.4 ci garantiamo la compatibilità con qualsiasi reader

  7. creiamo la directory per l’output e settiamo i corretti permessi

    # mkdir /var/spool/pdf-tlg
    # chgrp lp /var/spool/pdf-tlg
    # chmod 777 /var/spool/pdf-tlg

2.4 Pdftk

Una volta collegati al server e acquisiti i diritti di root installiamo il pacchetto pdftk. Servirà per la manipolazione dei file PDF:

# yum install pdftk

2.5 Davfs2

Installiamo e configuriamo davfs2. Servirà per l’accesso e la manipolazione del disco virtuale WebDAV. Come i passi precedenti dobbiamo essere a console ed avere i diritti di root.

  1. Installiamo il pacchetto

    # yum install davfs2

  2. creiamo una copia dei file di configurazione originali

    # cp -p /etc/davfs2/davfs2.conf /etc/davfs2/davfs2.conf.ORG
    # cp -p /etc/davfs2/secrets /etc/davfs2/secrets.ORG

  3. editiamo /etc/davfs2/davfs2.conf togliendo il “#” alla seguente righe:


    use_locks 0

  4. mettiamo le credenziali di accesso a WebDAV nel file /etc/davfs2/secrets come segue


    /srv/samba/pdf-tlg pdf-tlg Password_1

  5. impostiamo i permessi per /etc/davfs2/secrets

    # chmod 600 /etc/davfs2/secrets

  6. mettiamo la riga di montaggio in /etc/fstab


    http://tlspv01.scv.va/egroupware/webdav.php/home/pdf-tlg /srv/samba/pdf-tlg davfs defaults 0 0

  7. creiamo il punto di montaggio

    # mkdir /srv/samba/pdf-tlg

  8. testiamo il tutto montando il disco WebDAV

    # mount /srv/samba/pdf-tlg

3 Script pdf-tlg

Passiamo a creare gli script che automatizzano lo spostamento dei PDF. Prima di procedere è opportuno accertarsi che Samba e Cups siano attivi:

# service smb status
# service cups status

Qualora non siano attivi lanciarli e assicurarsi che diventino servizi lanciati automaticamente all’avvio del server:

# service smb start
# service cups start
# chkconfig smb on
# chkconfig cups on

Procediamo con l’installazione degli script pdf-tlg.

3.1 Installazione server side

Verifichiamo l'export, da parte di Samba, delle stampanti. Dopo aver acquisito i diritti di root editiamo il file /etc/samba/smb.conf e assicuriamoci che le seguenti righe non siano commentate

...
load printers = yes

cups options = raw
...
[printers]

comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
...

Se dobbiamo modificare la configurazione di Samba assicuriamoci che vengano caricate le subito le modifiche forzando il ricaricamento della configurazione

# service smb reload

Passiamo ora a creare gli script e, successivamente, li inseriamo in cron. Prima di presentare il codice offro una panoramica dei X script che implementiamo:

pdf-tlg.conf

configurazione del sistema di script

pdf-tlg.sh

crea il nome dei nostri PDF

pdf-tlg-cp.sh

copia i PDF dallo spool di stampa alla root del disco WebDAV

pdf-tlg-day.sh

unisce i singoli PDF creati il giorno prima in un unico PDF e lo mette nella directory "giornaliero"

pdf-tlg-month.sh

unisce i singoli PDF presenti in "giornaliero" e mette il file nella directory "mensile"

pdf-tlg-year.sh

unisce i singoli PDF presenti in "mensile", mette il file nella directory "annuale" e cancella i file più vecchi del limite stabilito.

Procediamo.

3.1.1 pdf-tlg.conf

  1. Creiamo il file /usr/local/etc/pdf-tlg.conf

  2. inseriamo il seguente codice

    # Configurazione globale

    # location file di configurazione
    TLG_CONF=/usr/local/etc

    # location file degli scripting
    TLG_SH_CP=/usr/local/sbin/pdf-tlg-cp.sh
    TLG_SH_DAY=/usr/local/sbin/pdf-tlg-day.sh
    TLG_SH_MONTH=/usr/local/sbin/pdf-tlg-month.sh
    TLG_SH_YEAR=/usr/local/sbin/pdf-tlg-year.sh

    # location directory dello spool dei PDF generati da CUPS
    TLG_SPOOL=/var/spool/pdf-tlg

    # location directory destinazione dei PDF dei telegrammi
    TLG_REPO=/srv/samba/pdf-tlg

    # location (path+file) del file con specifiche aggiuntive.
    # Optionale
    TLG_INC=

    # Warning email indirizzi
    EMAIL_TO="Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo."
    EMAIL_CC="Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo., Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo."
    EMAIL_CCN=""

    # Oggetto email
    EMAIL_OBJ_ERR="pdf-tlg ERROR"
    EMAIL_OBJ_WAR="pdf-tlg WARNING"

    # Numero di anni di conservazione dei PDF
    TLG_RETENTION=2

    # Log file
    LOG=/var/log/pdf-log.log

  3. impostiamo i corretti permessi

    # chown root:root /usr/local/etc/pdf-tlg.conf
    # chmod 600 /usr/local/etc/pdf-tlg.conf

 

3.1.2 pdf-tlg.sh

  1. Creiamo il file /usr/local/sbin/pdf-tlg.sh

  2. inseriamo il seguente codice

    #!/bin/bash

    #if [ -e /etc/cups/pdf-tlg.conf ]; then
    # . /etc/cups/pdf-tlg.conf
    # DATA=`date +%Y%m%d`
    # cp /var/spool/pdf-tlg/*.pdf /srv/samba/swap/$DATA.pdf
    # /bin/rm /var/spool/pdf-tlg/*.pdf
    ###############################################
    # DATA=`date +%Y%m%d`
    # cp /var/spool/cups-pdf/*.pdf /srv/samba/swap/$DATA.pdf
    # /bin/rm /var/spool/pdf-tlg/*.pdf
    ################################################
    #else
    # mail -s "CUPS pdf-tlg error" root < EOF
    # WARNING
    # CUPS printing pdf-tlg error and not works.
    # I can't locate /etc/cups/pdf-tlg.conf .
    # EOF
    #fi

    FILENAME=`basename $1`
    DIRNAME=`dirname $1`
    DATE=`date +"%Y-%m-%d_%H-%M-%S"`
    mv $1 $DIRNAME"/"$DATE".pdf"

    # DEBUG section
    ID=`id`
    echo "IF = $ID
    FILENAME = $FILENAME
    DIRNAME = $DIRNAME
    DATE = $DATE
    0 = $0
    1 = $1
    2 = $2
    3 = $3
    4 = $4
    ? = $?" >> /var/log/pdftlg.log
    # /tmp/pdftlg.log

  3. impostiamo i corretti permessi

    # chown root:root /usr/local/sbin/pdf-tlg.sh
    # chmod 755 /usr/local/sbin/pdf-tlg.sh

3.1.3 pdf-tlg-cp.sh

  1. Creiamo il file /usr/local/sbin/pdf-tlg-cp.sh

  2. inseriamo il seguente codice

    #!/bin/bash
    ####################
    # Descrizione
    # Questo script gira 1 volta al minuto e procede a copiare i PDF dal repository nello spool di stampa
    # al repository del disco telegrammi.
    #
    # RUN: cron */1 * * * *
    #
    # 20121217 Don Stefano bortolato FDP, Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
    ####################
    # 0 funzione di errore critico "error()"
    # 1 carica conf
    # 2 verifica presenze direcotry/file
    # 3 sposta i file
    # 4 in caso di errore manda email di warning
    ####################

    if [ -e /usr/local/etc/pdf-tlg.conf ]; then
    . /usr/local/etc/pdf-tlg.conf
    else
    echo "pdf-tlg-cp.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." | mail -s "pdf-tlg critical error" root
    echo "pdf-tlg-cp.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." >> /var/log/messages
    exit
    fi

    ### dichirazione funzioni
    # funzione di errore critico
    error() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-cp.sh error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-cp.sh error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-cp.sh error. Forced exit." >> /var/log/messages
    }
    # funzione di warning
    warning() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-cp.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-cp.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-cp.sh warning messages. mv operation return an error." >> /var/log/messages
    }

    ### verifica directories di repository
    # verifica directory di repository principale
    if ! [ -e $TLG_REPO ]; then
    mkdir $TLG_REPO > /dev/null 2>&1
    chown root:root $TLG_REPO > /dev/null 2>&1
    chmod 755 $TLG_REPO > /dev/null 2>&1
    fi

    # verifica directory di repository giornaliro
    #if ! [ -e $TLG_REPO/giornaliero ]: then
    # mkdir $TLG_REPO/giornaliero > /dev/null 2>&1
    # chown root:root $TLG_REPO/giornaliero > /dev/null 2>&1
    # chmod 755 $TLG_REPO/giornaliero > /dev/null 2>&1
    #fi

    ### copiatura file PDF
    if [ "`ls $TLG_SPOOL/`" != "" ]; then
    mv $TLG_SPOOL/*.pdf $TLG_REPO/ > /dev/null 2>&1
    fi

    ### verifica out di errore
    ERROR=$?

    case "$ERROR" in
    0)
    exit
    ;;
    1)
    warning
    ;;
    2)
    error
    ;;
    *)
    error
    ;;
    esac

  3. impostiamo i corretti permessi

    # chown root:root /usr/local/etc/pdf-tlg-cp.sh
    # chmod 650 /usr/local/etc/pdf-tlg-cp.sh

3.1.4 pdf-tlg-day.sh

  1. Creiamo il file /usr/local/sbin/pdf-tlg-day.sh

  2. inseriamo il seguente codice

    #!/bin/bash
    ####################
    # Descrizione
    # questo script è richiamato alle 01:00 di ogni giorno
    #
    # RUN: cron 0 1 * * *
    #
    # 20121217 Don Stefano bortolato FDP, Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
    ####################
    # 0 funzione di errore critico "error()"
    # 1 carica conf
    # 2 funzione di warning "warning()"
    # ?3 verifica presenze file script?
    # 3 verifica presenze direcotry/file
    # 4 creazione variabili
    # 5 crea file pdf come collect dei file del giorno di ieri
    # 6 rimouve i file del giorno
    # 7 in caso di errore manda email di warning

    if [ -e /usr/local/etc/pdf-tlg.conf ]; then
    . /usr/local/etc/pdf-tlg.conf
    else
    echo "pdf-tlg-day.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." | mail -s "pdf-tlg critical error" root
    echo "pdf-tlg-day.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." >> /var/log/messages
    exit
    fi

    ### funzioni
    # funzione di errore critico
    error() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-day.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-day.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-day.sh abnormali error. Forced exit." >> /var/log/messages
    }

    # funzione di warning
    warning() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-day.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-day.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-day.sh warning messages. mv operation return an error." >> /var/log/messages
    }

    #? verifiche presenze degli script, directory, ecc...
    #?if ! [ -e $TLG_SH_DAY ]; then
    #? error
    #? exit 1
    #?fi

    ### verifica directories di repository
    # verifica directory di repository principale
    if ! [ -e $TLG_REPO ]; then
    mkdir $TLG_REPO > /dev/null 2>&1
    chown root:root $TLG_REPO > /dev/null 2>&1
    chmod 755 $TLG_REPO > /dev/null 2>&1
    fi

    # verifica directory di repository giornaliro
    if ! [ -e $TLG_REPO/giornaliero ]; then
    mkdir $TLG_REPO/giornaliero > /dev/null 2>&1
    chown root:root $TLG_REPO/giornaliero > /dev/null 2>&1
    chmod 755 $TLG_REPO/giornaliero > /dev/null 2>&1
    fi

    # creazione variabili
    PDF_LIST=`ls $TLG_REPO/*pdf 2> /dev/null`
    ERROR=$?
    DAY1=`date +"%d"`
    if [ "$DAY1" > "1" ]; then
    DAY=$(($DAY1-1))
    else
    DAY=$DAY1
    fi
    PDF_OUT=$TLG_REPO/giornaliero/$DAY.pdf

    # verifica se la lista PDF è popolato altrimenti esce
    #case "$ERROR" in
    # 2)
    # exit
    # ;;
    #esac
    if [ $ERROR != 0 ]; then
    error
    exit
    fi

    # crea file pdf come collect dei file giornalieri
    pdftk $PDF_LIST cat output $PDF_OUT
    ERROR=$?
    if [ "$ERROR" != "0" ]; then
    error
    exit
    else
    # rimouve i file del giorno
    /bin/rm $PDF_LIST
    echo "`date +\"%b %d %H:%M:%S \"`pdf-tlg-month.sh been done" >> /var/log/messages
    fi

  3. impostiamo i corretti permessi

    # chown root:root /usr/local/etc/pdf-tlg-cp.sh
    # chmod 650 /usr/local/etc/pdf-tlg-cp.sh

 

3.1.5 pdf-tlg-month.sh

  1. Creiamo il file /usr/local/sbin/pdf-tlg-month.sh

  2. inseriamo il seguente codice

    #!/bin/bash
    ####################
    # Descrizione
    # questo script è richiamato alle 00:01 del primo del mese
    #
    # RUN: cron 1 0 1 * *
    #
    # 20121217 Don Stefano bortolato FDP, Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
    ####################
    # 0 funzione di errore critico "error()"
    # 1 carica conf
    # 2 funzione di warning "warning()"
    # 3 verifica presenze direcotry/file
    # 4 creazione variabili
    # 5 crea file pdf come collect dei file giornalieri
    # 6 rimouve i file dal giornaliero
    # 7 in caso di errore manda email di warning

    if [ -e /usr/local/etc/pdf-tlg.conf ]; then
    . /usr/local/etc/pdf-tlg.conf
    else
    echo "pdf-tlg-month.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." | mail -s "pdf-tlg critical error" root
    echo "pdf-tlg-month.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." >> /var/log/messages
    exit
    fi

    # funzione di errore critico
    error() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-month.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-month.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-month.sh abnormali error. Forced exit." >> /var/log/messages
    }

    # funzione di warning
    warning() {
    if [ "$EMAIL_CC" != "" ]; then
    EMAIL_EXTRA=" -c $EMAIL_CC"
    fi
    if [ "$EMAIL_CCN" != "" ]; then
    EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
    fi
    #echo "pdf-tlg-month.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
    echo "pdf-tlg-month.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO $EMAIL_EXTRA
    echo "pdf-tlg-month.sh warning messages. mv operation return an error." >> /var/log/messages
    }

    ### verifica directories di repository
    # verifica directory di repository principale
    if ! [ -e $TLG_REPO ]; then
    error
    exit
    fi

    # verifica directory di repository giornaliro
    if ! [ -e $TLG_REPO/giornaliero ]; then
    error
    exit
    fi

    # verifica directory di repository giornaliro
    if ! [ -e $TLG_REPO/mensile ]; then
    mkdir $TLG_REPO/mensile > /dev/null 2>&1
    chown root:root $TLG_REPO/mensile > /dev/null 2>&1
    chmod 755 $TLG_REPO/mensile > /dev/null 2>&1
    fi

    # creazione variabili
    PDF_LIST1=`ls $TLG_REPO/giornaliero/*pdf 2> /dev/null`
    ERROR=$?
    MONTH1=`date +"%m"`
    if [ "$MONTH1" > "1" ]; then
    MONTH=$(($MONTH1-1))
    else
    MONTH=$MONTH1
    fi
    PDF_OUT=$TLG_REPO/mensile/$MONTH.pdf

    # verifica se la lista PDF è popolato altrimenti esce
    if [ $ERROR != 0 ]; then
    error
    exit
    fi

    # aggiunge il path assoluto ad ogni nome file
    for i in $PDF_LIST1; do
    PDF_LIST="$PDF_LIST $TLG_REPO/giornaliero/$i"
    done

    # crea file pdf come collect dei file giornalieri
    pdftk $PDF_LIST cat output $PDF_OUT
    ERROR=$?
    if [ $ERROR != 0 ]; then
    error
    exit
    else
    # rimouve i file del giorno
    /bin/rm $PDF_LIST
    echo "`date +\"%b %d %H:%M:%S \"`pdf-tlg-month.sh been done" >> /var/log/messages
    fi

  3. impostiamo i corretti permessi

    # chown root:root /usr/local/etc/pdf-tlg-cp.sh
    # chmod 650 /usr/local/etc/pdf-tlg-cp.sh

3.1.6 pdf-tlg-year.sh

  1. Creiamo il file /usr/local/sbin/pdf-tlg-year.sh

  2. inseriamo il seguente codice

#!/bin/bash
####################
# Descrizione
# questo script è richiamato alle 00:01 del primo del mese
#
# RUN: cron 1 2 1 1 *
#
# 20121218 Don Stefano bortolato FDP, Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
####################
# 0 funzione di errore critico "error()"
# 1 carica conf
# 2 funzione di warning "warning()"
# 3 verifica presenze direcotry/file
# 4 creazione variabili
# 5 crea file pdf come collect dei file mensili
# 6 rimouve i file dal giornaliero
# 7 in caso di errore manda email di warning
 
if [ -e /usr/local/etc/pdf-tlg.conf ]; then
. /usr/local/etc/pdf-tlg.conf
else
echo "pdf-tlg-year.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." | mail -s "pdf-tlg critical error" root
echo "pdf-tlg-year.sh dasn't found /usr/local/etc/pdf-tlg.conf. Forced exit." >> /var/log/messages
exit
fi
 
# funzione di errore critico
error() {
if [ "$EMAIL_CC" != "" ]; then
EMAIL_EXTRA=" -c $EMAIL_CC"
fi
if [ "$EMAIL_CCN" != "" ]; then
EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
fi
#echo "pdf-tlg-year.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
echo "pdf-tlg-year.sh abnormali error. Forced exit." | mail -s "$EMAIL_OBJ_ERR" $EMAIL_TO $EMAIL_EXTRA
echo "pdf-tlg-year.sh abnormali error. Forced exit." >> /var/log/messages
}
 
# funzione di warning
warning() {
if [ "$EMAIL_CC" != "" ]; then
EMAIL_EXTRA=" -c $EMAIL_CC"
fi
if [ "$EMAIL_CCN" != "" ]; then
EMAIL_EXTRA="$EMAIL_EXTRA -b $EMAIL_CCN"
fi
#echo "pdf-tlg-year.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO -c $EMAIL_CC -b $EMAIL_CCN
echo "pdf-tlg-year.sh warning messages. mv operation return an error." | mail -s "$EMAIL_OBJ_WAR" $EMAIL_TO $EMAIL_EXTRA
echo "pdf-tlg-year.sh warning messages. mv operation return an error." >> /var/log/messages
}
 
### verifica directories di repository
# verifica directory di repository principale
if ! [ -e $TLG_REPO ]; then
mkdir $TLG_REPO > /dev/null 2>&1
chown root:root $TLG_REPO > /dev/null 2>&1
chmod 755 $TLG_REPO > /dev/null 2>&1
fi
 
# verifica directory di repository giornaliro
if ! [ -e $TLG_REPO/mensile ]; then
error
exit
fi
 
# verifica directory di repository giornaliro
if ! [ -e $TLG_REPO/annuale ]; then
mkdir $TLG_REPO/annuale > /dev/null 2>&1
chown root:root $TLG_REPO/annuale > /dev/null 2>&1
chmod 755 $TLG_REPO/annuale > /dev/null 2>&1
fi
 
# creazione variabili
PDF_LIST=`ls $TLG_REPO/mensile/*pdf 2> /dev/null`
ERROR=$?
YEAR=`date +"%Y"`
YEAR=$(($YEAR-1))
YEAR_OLD=$(($YEAR-$TLG_RETENTION))

PDF_OUT=$TLG_REPO/annuale/$YEAR.pdf
 
# verifica se la lista PDF è popolato altrimenti esce
if [ $ERROR != 0 ]; then
error
exit
fi
 
# crea file pdf come collect dei file giornalieri
pdftk $PDF_LIST cat output $PDF_OUT
ERROR=$?
if [ $ERROR != 0 ]; then
error
exit
else
# rimouve i file mensili e, se ci sono, gli anni antecedenti a 2 anni prima
/bin/rm $PDF_LIST
if [ -e $TLG_REPO/annuale/$YEAR_OLD.pdf ]; then
rm $TLG_REPO/annuale/$YEAR_OLD.pdf > /dev/null 2>&1
fi
fi
echo "`date +\"%b %d %H:%M:%S \"`pdf-tlg-year.sh been done" >> /var/log/messages

  1. impostiamo i corretti permessi

    # chown root:root /usr/local/etc/pdf-tlg-cp.sh
    # chmod 650 /usr/local/etc/pdf-tlg-cp.sh

3.1.7 Crontab

  1. Creiamo il crontab per automatizzare i processi. Richiamiamo l'editor dei cron

    # crontab -e

  2. inseriamo il seguente codice

    */1 * * * * /usr/local/sbin/pdf-tlg-cp.sh
    0 1 * * * /usr/local/sbin/pdf-tlg-day.sh
    1 0 1 * * /usr/local/sbin/pdf-tlg-month.sh
    1 2 1 1 * /usr/local/sbin/pdf-tlg-year.sh

Procediamo con l’installare la stampante virtuale nel/i PC client.

3.2 Installazione client side

L’installazione nel PC consiste in una semplice aggiunta di una stampante di rete con driver PS.

I driver di serie di Windows vanno bene, ma XP, 7 ed 8 non dispongono dello stesso elenco di driver embedded.

  1. Facciamo il logon sul nostro PC con un utente con permessi di amministratore

  2. apriamo la box “Risorse del computer”

  3. sulla barra degli indirizzi inseriamo \\server1.exmple.com

  4. clicchiamo con il bottone destro del mouse sull’icona “Cups-PDF”

  5. sul menu contestuale che si apre clicchiamo sulla voce “Connetti...”

  6. comparirà una box che informa che il server non ha i driver. Procediamo e dalla finestra di scelta dei driver scegliamo:

    per XP: Apple LaserWriter 16/600 PS
    per 7 e 8: Savin 7025 PS

NOTA: il sistema per funziona necessita di una coda PS in bianco e nero o colori. Qualsiasi tipo di driver è adatto a patto che generi una coda PS.

4 Limiti e problemi noti

  1. La presente guida fa riferimento solamente alle specifiche della distribuzione RHEL e derivate. Questa soluzione pur funzionando con qualsiasi distribuzione Linux, BSD e *NIX, in genere, necessita di personalizzazioni proprie per ciascuna distribuzione. In queste pagine non vengono volutamente trattate.

  2. In questa guida non si tratta circa l'installazione e la configurazione di eGroupWare. Per questo si rimanda alla documentazione e al sostegno della Stylite AG su www.egroupware.org .

  3. Questa soluzione è molto flessibile. Ciò comporta una complessità dovute alle molteplici possibilità. U na trattazione completa richiede la stesura di una nutrita guida e non di un semplice howto. Pertanto si è scelto di stendere un semplice howto che descrive solo una delle applicazioni possibili.

  4. Controllo autenticazioni stampe: la configurazione server descritta non applica controlli e restrizioni ai computer o utenti che si collegano alla stampante virtuale Cups-PDF. Per una restrizione e un controllo sugli accessi alla stampante virtuale si rimanda alla manualistica di Samba (www.samba.org) e di Cups (www.cups.org).

5 Bibliografia

Strumenti di editing PDF per Ubuntu,
http://ubuntu-inside.blogspot.it/2010/04/strumenti-di-editing-pdf-per-ubuntu.html

EGroupware.org, http://www.egroupware.org/iPad

DavFS2, https://fradeve.org/log/2012/03/usare-rsync-con-box.html

davfs2 – Riepilogo [Savannah], http://savannah.nongnu.org/projects/davfs2

PDFtk – The PDF Toolkit, http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

CUPS-PDF, http://www.cups-pdf.de/

CUPS (Italiano) – ArchWiki, https://wiki.archlinux.org/index.php/CUPS_(Italiano)

Howto Install and Customize CUPS-PDF in Debian,
http://www.debianadmin.com/howto-install-and-customize-cups-pdf-in-debian.html

6 Ringraziamenti

Per il collaudo di questa soluzione e la stesura di questa documentazione si ringrazia Luciano Mazzei in qualità di amico, collaboratore, tester e assistente editoriale-grafico. 


1L'utente superuser è l'utente impostato in fase di installazione di eGroupWare e serve per l'installazione-rimozione delle applicazioni in eGroupWare.


 

Venerdì, 19 Febbraio 2016 17:21

La rimozione di vecchi kernel è opportuno farla con yum. Infatti yum provvede automaticamente alle rimozione dei pacchetti correlati/dipendenti (es. i moduli ed i file di header specifici) e aggiornaautomaticamente sia il menu di boot che gli elenchi dei pacchetti installati.
L'articolo della RedHat descrive la procedura tramite rpm. Questa non aggiorna il menu di boot e non rimuove moduli ed header.


Per rimuovere con yum:

 

  1.  fare login come root o diventare root:
    $ su -
     
  2. OPZIONALE: per verificare empiricamente le modifiche automatiche che fa yum verificare il descrittore del menu di boot
     # less /boot/grub/menu.lst
     
  3. chiedere l'elenco dei pacchetti rpm di kernel installati (a titolo di esempio riporto un output reale):
     # rpm -q kernel
        kernel-2.6.32-279.el6.x86_64
        kernel-2.6.32-279.2.1.el6.x86_64
        kernel-2.6.32-279.5.1.el6.x86_64
     #
     
  4. rimouvere il kernel desiderato riportando per inter il nome ottenuto dalla precedente query:
     # yum remove kernel-2.6.32-279.el6.x86_64
     
  5. OPZIONALE: per verificare empiricamente le modifiche fatte da yum verificare il descrittore del menu di boot
     # less /boot/grub/menu.lst

Articolo di partenza: https://access.redhat.com/knowledge/solutions/1227
Distro: RedHad, CentOS e derivate

Venerdì, 19 Febbraio 2016 17:19

La rimozione di vecchi kernel è opportuno farla con yum. Infatti yum provvede automaticamente alla rimozione dei pacchetti correlati/dipendenti (es. i moduli ed i file di header specifici) e aggiorna automaticamente sia il menu di boot che gli elenchi dei pacchetti installati. Ma come si fa? Ecco le istruzioni...


Un articolo della knoledge base della RedHat è stato il mio punto di partenza:
URL: https://access.redhat.com/knowledge/solutions/1227
ma descrive la procedura tramite l'uso diretto di rpm. Rpm non aggiorna il menu di boot e non rimuove moduli ed header.
Per rimuovere con yum:

 

  1.  fare login come root o diventare root:
    [adminpv@srv ~] su -
     
  2. OPZIONALE: per verificare empiricamente le modifiche automatiche che fa yum verificare il descrittore del menu di boot
     [root@srv ~]# less /boot/grub/menu.lst
     
  3. chiedere l'elenco dei pacchetti rpm di kernel installati (a titolo di esempio riporto un output reale):
    [root@srv ~]# rpm -q kernel
    kernel-2.6.32-279.el6.x86_64
    kernel-2.6.32-279.2.1.el6.x86_64
    kernel-2.6.32-279.5.1.el6.x86_64
    [root@srv ~]#
     
  4. rimouvere il kernel desiderato riportando per inter il nome ottenuto dalla precedente query:
    [root@srv ~]# yum remove kernel-2.6.32-279.el6.x86_64
     
  5. OPZIONALE: per verificare empiricamente le modifiche fatte da yum verificare il descrittore del menu di boot
    [root@srv ~]# less /boot/grub/menu.lst
Venerdì, 19 Febbraio 2016 17:16

HowTo in salsa cookbook

Questo documento descrive, in salsa cookbook, come realizzare il join di una macchina Red Hat Linux Server versione 6 ad un dominio Active Directory realizzato con Windows server 2003 o 2008.

Segue una seconda parte che descrive come poter montare i dischi esposti da Windows ed usarli in scrittura e lettura.

A seconda dei requisiti una volta fatto il join sarà anche possibile usare le utenze del dominio Windows per fare le autenticazioni sulla macchina Linux.

Essendo un testo in salsa cookbook non c’è spiegazione o approfondimento tecnico. Si aggiunge una piccola sezione di troubleshooting, sempre in forma cookbook.


1. Premessa

Prima di passare alla parte operativa è bene raccogliere i dati del dominio dal sistemista che gestisce il dominio. In questa guida si ipotizza la seguente configurazione:

Hostname del server Windows: win1.dom.it

IP del server Windows: 10.0.0.1

DNS 1: 10.0.0.3

DNS 2: 10.0.0.4

Server NTP: 10.0.0.5

Nome Dominio: dom.it

Nome Gruppo Windows: domit

Hostname del server Linux: redhat100.dom.it

IP del server Linux: 10.0.0.100

Disco contiviso da Windows: testsharing


 

NOTA 1: il server NTP deve essere quello usato dal server Windows.

NOTA 2: le indicazioni qui riportate potrebbe non dare successo. Esistono alcune varianti in Linux e in Windows server, ma, sopratutto, dipende dalle configurazioni del dominio Windows. Windows facilita molto l’amministratore nel configurare il server, ma non rende subito visibili alcuni parametri di configurazione. Potrebbe essere necessaria una analisi più dettagliata della configurazione del server da parte dall’amministratore.

NOTA 3: il nome del server Linux deve essere già registrato nel DNS del dominio Windows.

2. Join di una macchia RHEL a Dominio Windows 2K3/2K8

Per poter fare il join a un dominio Windows dobbiamo intervenire sul nostro server Linux prima configurando adeguatamente il DNS, poi la sincronizzazione dell’orario in sintonia con la configurazione del PDC del dominio Windows, configureremo poi Kerberos ed in fine faremo il join.

2.1. Verifica firewall

Prima di procedere oltre è bene controllare che non sia attivo un firewall in Linux. Infatti potrebbe verificarsi che le corrette configurazioni diano risultati fallimentare perché le comunicazioni sono interrotte dal firewall. Finita tutta la configurazione e certi del buon funzionamento di tutto si può ripristinare il firewall facendo attenzione a lasciare aperte le varie porte necessarie al funzionamento di tutto.

Per disattivare il firewall:

service iptables off

chkconfig iptables off

2.2. Configurazione del DNS

  1. Collegarsi al server Red Hat come root ed editare il file /etc/resolv.conf

  2. inserire le seguenti righe:

    search dom.it

    nameserver 10.0.0.3

    nameserver 10.0.0.4

2.3. Configurazione client NTP

  1. Verificare l’installazione del demone NTP ed installarlo se non presente:

    yum install ntp atpdate

  2. editare /etc/ntp.conf e aggiungere il server NTP del dominio (nota: se ci sono altri server inseriti, quello usato dal dominio deve essere il primo):

    server 10.0.0.5

  3. riavviamo il demone

    service ntpd restart

  4. impostiamo il demone come servizio di defualt all’avvio della macchina

    chkconfig ntpd on

NOTA: se la differenza di orario e data del server Linux rispetto a quella fornita dal server NTP impostata dovesse essere molto grande (ore o giorni) l’orario e la data corretta del server Linux devono essere impostati manualmente.

2.4. Configurazione di Kerberos

  1. Verificare l’installazione dei pacchetti kerberos client ed installarli se non presenti:

    yum install krb5-workstation

  2. editare il file /etc/krb5.conf

    [logging]

    default = FILE:/var/log/krb5libs.log

    kdc = FILE:/var/log/krb5kdc.log

    admin_server = FILE:/var/log/kadmind.log

    [libdefaults]

    default_realm = DOM.IT

    dns_lookup_realm = false

    dns_lookup_kdc = false

    ticket_lifetime = 24h

    renew_lifetime = 7d

    forwardable = true

    [realms]

    DOM.IT = {

    kdc = win1.dom.it

    admin_server = 10.0.0.1

    }

    [domain_realm]

    .dom.it = DOM.IT

    dom.it = DOM.IT

  3. testiamo la configurazione chiedendo la creazione di un ticket e successivamente chiediamo di vedere l’elenco dei ticket ricevuti. Per far questo dobbiamo usare un utente qualsiasi presente e attivo nel dominio:

    kinit Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

    klist

2.5. Configurazione di samba

  1. Editare il file /etc/samba/smb.conf. Le righe riportate sono quelle fondamentali per il join:

    workgroup = DOMIT

    password server = 10.0.0.1

    realm = DOM.IT

    security = ads

    idmap uid = 16777216-33554431

    idmap gid = 16777216-33554431

    template shell = /sbin/nologin

    winbind use default domain = true

    winbind offline logon = false

    winbind enum users = Yes

    winbind enum groups = Yes

    client use spnego = Yes

    encrypt passwords = yes

    restrict anonymous = 2

    winbind refresh tickets = yes

    preferred master = no

    server string = Server RedHat

    passdb backend = tdbsam

  2. Avviare il demone winbind

    service winbind start

  3. Rendere il demone un servizio di default all’avvio:

    chkconfig winbind on

NOTA: ai fini del join e dell’SSO (descritta qui di seguito) è necessario il solo demone winbind. Winbind è una parte di SAMBA e si occupa esclusivamente del dialogo con i server Windows. Per far erogare servizi Windows anche alla nostra macchina Linux dobbiamo lanciare i demoni smbd e nmbd e completare adeguatamente la configurazione di SAMBA.

2.6. Join del server Linux

  1. Prima di dare l’istruzione accertarsi di avere username e password di un amministratore del server Windows abilitato ad accettare i join. Inoltre assicurasi di essere root sul server Linux. Per evidenziare eventuali errori si può aggiungere al comando qui di seguito l’opzione “--verbose”:

    net ads join -S win1.dom.it -U Administrator

  2. verifichiamo il buon risultato del join tramite il test base e la richiesta della lista degli utenti e dei gruppi del dominio:

    net ads testjoin

    wbinfo -u

    wbinfo -g

Arrivati a questo punto la nostra macchina è a tutti gli effetti un membro del dominio Windows. A seconda di quello che desideriamo possiamo sfruttare il server Windows per diversi vantaggi. I capitoli 3 e 4 illustrano due possibilità:

  • SSO, ovvero l'autenticazione usando la lista utenti presente sul server Windows

  • usare gli sharing esposti dal server Windows.

2.7. Troubleshooting

  1. Per verificare se il firewall è attivo, per spegnerlo e impostarlo come servizio standard o meno collegarsi come utente root.

    Per vedere se il firewall è attivo e vedere le regole attive:

    service iptables status

    Per disattivare al volo il firewall

    service iptables stop

    Per attivare al volo il firewall

    service iptables start

    Per rendere permanente la disattivazione del firewall

    chkconfig iptables off

    service iptables stop

    Per rendere permanente l’attivazione del firewall

    chkconfig iptables on

    service iptables start

  2. Per verificare se il DNS funziona regolarmente si può usare dig. Questo programma stampa sul monitor la risposta del DNS permettendo di capire la correttezza della configurazione e l’eventuale errore. Esempio

    dig www.libero.it

  3. L’ora della macchina Linux è sbagliata e ntp non la riallinea.

    Il demone ntp riallinea l’ora della macchina solo se la differenza è contenuta. Qualora ci siano ore di differenza, o giorni, o mesi o anni bisogna reimpostare manualmente data e ora. Successivamente ntp manterrà sincronizzata l’ora. Ipotizzando che vogliamo impostare data e ora al 1 agosto 2012, ore 9:00 procedere, come root, con il seguente comando. Il primo imposta date e ora del sistema, il comando seguente imposta data e ora del BIOS:

    service ntpd stop

    date -u -s "20120801 09:00:00"

    hwclock -u --set --date="1/8/12 9:00:00"

    service ntpd start

  4. La configurazione di SAMBA ed il suo corretto funzionamento può risultare complicato per l’estrema flessibilità che ha. Per avere documentazione ed eventuale supporto rimando ai siti di samba (http://www.samba.org) e di RedHat (http://www.redhat.com). Con RedHat è opportuno avere una sottoscrizione attiva per poter accedere anche alla parte FAQ, knoledgebase e supporto diretto.

    Un programma estremamente utile per verificare subito la correttezza formale della configurazione, ad avere riscontro dello stato di configurazione, ed, eventualmente, il dump della configurazione seza tutte le righe di commento è “testparm”. Come utente root dare il comando:

    testparm

3. Autenticazione centralizzata SSO

In questo capitolo vediamo come configurare il Server Red Hat per usare i nomi utente e le password presenti nel server Windows per autenticarsi anche sul Server Linux. A seconda di quello che si vuole ottenere si dovranno inserire specifiche righe di configurazione in SAMBA, Apache, ecc...

L'utente root è sempre locale. Inoltre dobbiamo creare anche un secondo utente locale per i login remoti e/o assumere l'identità di root se non lo configuriamo come nologin.

3.1. Personalizzazioni dei file di configurazione

  1. Editare /etc/samba/smb.conf e modificare la riga “template shell = /sbin/nologin” in

    template shell = /bin/bash

  2. editare il file /etc/nsswitch.conf

    passwd: files winbind

    shadow: files winbind

    group: files winbind

    hosts: files dns

    bootparams: nisplus [NOTFOUND=return] files

    ethers: files

    netmasks: files

    networks: files

    protocols: files

    rpc: files

    services: files

    netgroup: files

    publickey: nisplus

    automount: files

    aliases: files nisplus

  3. editare il file /etc/pam.d/system-auth-ac

    auth required pam_env.so

    auth sufficient pam_unix.so nullok try_first_pass

    auth requisite pam_succeed_if.so uid >= 500 quiet

    auth sufficient pam_winbind.so use_first_pass

    auth required pam_deny.so

    account required pam_unix.so broken_shadow

    account sufficient pam_localuser.so

    account sufficient pam_succeed_if.so uid < 500 quiet

    account [default=bad success=ok user_unknown=ignore] pam_winbind.so

    account required pam_permit.so

    password requisite pam_cracklib.so try_first_pass retry=3 type=

    password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok

    password sufficient pam_winbind.so use_authtok

    password required pam_deny.so

    session optional pam_keyinit.so revoke

    session required pam_limits.so

    session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

    session required pam_unix.so

  4. editiamo il file/etc/pam.d/passwd

    auth include system-auth

    account include system-auth

    password substack system-auth

    -password optional pam_gnome_keyring.so

  5. editiamo il file /etc/pam.d/password-auth-ac

    auth required pam_env.so

    auth sufficient pam_unix.so nullok try_first_pass

    auth requisite pam_succeed_if.so uid >= 500 quiet

    auth sufficient pam_winbind.so use_first_pass

    auth required pam_deny.so

    account required pam_unix.so broken_shadow

    account sufficient pam_localuser.so

    account sufficient pam_succeed_if.so uid < 500 quiet

    account [default=bad success=ok user_unknown=ignore] pam_winbind.so

    account required pam_permit.so

    password requisite pam_cracklib.so try_first_pass retry=3 type=

    password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok

    password sufficient pam_winbind.so use_authtok

    password required pam_deny.so

    session optional pam_keyinit.so revoke

    session required pam_limits.so

    session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

    session required pam_unix.so

A questo punto è possibile loggarsi sulla nostra macchina Linux con un utente presente sul dominio, ma non presente sul nostro server.


 

NOTA: tutte le configurazioni sopre riportate possono essere fatte automaticamente tramite l’utility testuale:
authconfig-tui
o tramite l’utility grafica:

system-config-authentication

Personalmente sconsiglio l’uso di questi tool per l’operazione di join se non si è sicuri dei parametri del dominio o se, dopo il tentativo di join, i test danno risultato negativo. Questi due programmi mascherano i messaggi di output dell’operazione di join. Se c’è qualcosa di sbagliato ed il join non può essere completato con successo i messaggi di output notificano subito questa situazione e danno precise indicazione su dove si trovano gli errori.

3.2. Troubleshooting

Ci sono molti potenziali problemi in cui si potrebbe incappare. La questione è molto variegata soprattutto in riferimento alla nostra specifica configurazione. Qui di seguito do qualche dritta semplicemente per verificare il join (requisito NECESSARIO per far funzionare l’autenticazione SSO), gli utenti e gruppi del dominio Windows e sull’errore della home al login con un utente del dominio.

  1. Abbiamo fatto il join, ma non siamo sicuri che sia riuscito. Per testare la validità del join da utente root dare l’istruzione

    net ads jointest

    Se otteniamo una risposta d’errore e ripetiamo il join potrebbe essere necessario che l’amministratore del dominio Windows rimuova la nostra macchina Linux dal dominio.

  2. Per verificare l’appartenenza al dominio e per usare gli utenti ed i gruppi del dominio Windows possiamo usare getent. Se non specifichiamo un nome utente o un nome gruppo ci restituisce la lista completa degli utenti e dei gruppi disponibili. Rimando alla documentazione di SAMBA, per l’istruzione “net”, per manipolazioni avanzate come il caching degli utenti/gruppi in locale.

    getent passwd

    getent group

    getent passwd utente.dominio

    getent group gruppo.dominio

  3. Completato con successo il join e la configurazione dell’SSO potremmo trovarci con un errore come il seguente dopo aver fatto il login con un utente del dominio Windows:

    Could not chdir to home directory /home/DOMIT/stefano.bortolato: No such file or directory

    Questo significa che non esiste la directory dell’utente. Bisogna procedere per configurare SAMBA e Linux che crei automaticamente la home degli utenti e, manualmente, creare la directory del gruppo Windows. Nel caso di questa guida si tratta di creare /home/DOMIT.

    Per il come fare rimando alla documentazione di SAMBA (www.samba.org) e di RedHat (www.redhat.com).

4. Usare condivisioni esposte da Windows server 2K3/2K8

Una volta completato il join al dominio è possibile usare i dischi condivisi dal server Windows.

4.1. Montaggio manuale temporaneo

Per montare manualmente un disco condiviso dal server è sufficiente:

  1. loggarsi al server Linux come utente root o diventare l’utente root tramite il comando “su -”

  2. dare il comando

    mount -t cifs //win1.dom.it/testsharing /mnt -o rw,nosuid,nodev,user=nome.utente,domain=DOM.IT

Con questa istruzione verrà chiesta la password dell’utente.

4.2. Montaggio permanente

Per rendere persistenti le impostazioni del mount e rendere automatico l’operazione dobbiamo:

  1. loggarsi a linux come utente root o diventare root tramite il comando “su -”

  2. creare il file /etc/samba/credentials (nota: sostituire "nome.utente" w "password" con nomi e password reali!):

    user=nome.utente

    pass=password

    domain=DOM.IT

  3. cambiare i permessi al file

    chmod 600 /etc/samba/credentials

  4. editare il file /etc/fstab e aggiungere la seguente riga

    //win1.dom.it/testsharing /mnt cifs rw,nosuid,nodev,credentials=/etc/samba/credentials 0 0

A questo punto per montare subito il disco dare l’istruzione:

mount /mnt

Successivamente ad ogni reboot ci ritroveremo il disco automaticamente montato.

4.3. Troubleshooting

  1. È possibile che a un tentativo di montaggio di un disco ci venga restituito il seguente errore:

    mount error(13): Permission denied

    Il significato è chiaro, ma le cause possono essere molteplici. Per individuare l’errore è utile adottare le seguenti pratiche:

    1. verificare, lato server Windows, i log. Potrebbe essere scritta la causa, ma in alcune situazioni non viene tracciato nulla

    2. se abbiamo dato il comando manualmente verificare la correttezza sintattica di mount, in particolare:

      aver messo una corretta username, password e dominio

      aver usato le virgole (,) come separatori dopo il “- o” e non gli spazi ( )

      aver scritto correttamente il nome della condivisione Windows

      che la condivisione Windows sia effettivamente accessibile per l’utente ed il computer da cui facciamo la richiesta

    3. che il join precedentemente fatto del computer da cui facciamo la richiesta di montaggio sia effettivamente valido (usare, come root, il comando “net ads jointest”).

5. Conclusione

Questa guida in miniatura spiega cosa fare riportando i comandi da dare al computer senza alcuna spiegazione tecnica.

L'argomento affrontato è una configurazione avanzata, articolata e complessa. Offre delle grandi opportunità ed è estremamente flessibile.

Tutto ciò significa:

  • è consigliabile avere esperienza

  • è opportuno studiare le varie tecnologie coinvolte

  • è possibile che l'applicazione fedele di queste indicazioni diano risultati fallimentari.

La complessità e varietà delle situazioni reali non permette una esposizione esaustiva in poche pagine e, soprattutto, realizzate con questo stile cookbook.

Avventurarsi seguendo questa guida, comunque, non è da sconsiderati, basta agire con prudenza. In caso di successo è buono, a fine lavoro, approfondire la conoscenza su questa tecnologia. In caso di fallimento si sa che serve un supplemento di indagine sul server/rete Windows e/o un approfondimento tecnico sulle tecnologie coinvolte.

6. Appendici

Riporto due articoli della knowledge di Red Hat che illustrano parte delle procedure sopra descritte. Essendo nella parte del sito accessibile dietro autenticazione li riporto per esteso qui di seguito.

6.1. How to join Red Hat Enterprise Linux 6 to Microsoft Windows Active Directory 2003 domain using Kerberos and samba/winbind method ?

Da: https://access.redhat.com/knowledge/solutions/67432

Ultima modifica di Nirupama Karandikar il 05/07/12 - 06:44

Problema

  • How to join Red Hat Enterprise Linux 5 to Microsoft Windows Active  Directory 2003 domain using Kerberos and samba/winbind method ?

Ambiente

  • Red Hat Enterprise Linux 6

  • Microsoft Windows Active Directory 2003

  • samba-client- 3.5.10-114.el6 

  • samba-common-3.5.10-114.el6

  • samba-winbind-3.5.10-114.el6

  • samba-winbind-clients-3.5.10-114.el6

  • samba-winbind-krb5-locator-3.5.10-114.el6

  • pam_krb5-2.3.11-1.el6.x86_64

  • krb5-libs-1.9-9.el6_1.2.x86_64krb5-workstation-1.9-9.el6_1.2.x86_64

Risoluzione

Here are steps to join RHEL 6 system to Microsoft Windows Active  Directory 2003 native domain, including home directory integration. This  document was written specifically for Microsoft Windows 2003 AD domin.  Authentication against Windows 2003 R2 /2008/2008 R2 requires different  configuration.

1. Need to install 'Services For UNIX'   component in Microsoft Windows AD 2003 in case "imap backend = ad" is  used in smb.conf file. For all other idmap backend this is step is  optional.

2. To configure kerberos for AD 2003 authentication. Here is sample configuration to /etc/krb5.conf file :

# cat /etc/krb5.conf

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
ticket_lifetime = 24000
default_realm = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = false

[realms]
EXAMPLE.COM = {
kdc = server1.example.com
default_domain = example.directory
}

[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
     debug = false
     ticket_lifetime = 36000
     renew_lifetime = 36000
     forwardable = true
     krb4_convert = false
}

Where  example.com is Microsoft Windows Active Directory Domain name and and  server1.example.com is FQDN of Windows 2003 AD Domain Controller.

3. Here is the sample configuration to configure smb.conf for Microsoft Windows AD 2003 Authentication using samba/winbind.

[global]
security = ADS
workgroup = EXAMPLE.COM
realm = EXAMPLE.COM
password server = server1.example.com

Because  this document is tailored specifically for Windows 2003 AD services, it  will be necessary to also include the following two lines in the  [global] section of the smb.conf file:

client use spnego = yes
server signing = auto
server string = Samba Server

In  addition to the above, the following additional options may also be  included. The first three references to winbind entries enable getent on  the Samba server to provide the correct responses when called. If  desired, idmap entries can also be included in order to specify user and  group IDs for AD accounts. Finally, below specified /bin/bash as the  template shell for AD users. If users do not require a shell access  specify /bin/false as the template shell for AD users .

 winbind enum users = yes
 winbind enum groups = yes
 winbind use default domain = yes
 winbind separator = +
 template shell = /bin/bash

For idmap tdb backend

idmap backend = tdb
idmap uid = 1000000-1999999
idmap gid = 1000000-1999999

For idmap AD backend

idmap config CORP : backend  = ad
idmap config CORP : range = 1000-999999

Where 'CORP' is AD domain short name.

For Windows 2003 R2, Windows 2008 and Windows 2008 R2 above add following parameters in smb.conf file. The Windows 2003 R2 uses Identity Management for UNIX Components instead of SFU.

idmap config CORP : schema_mode = rfc2307
winbind nss info = rfc2307

It is also necessary to include winbind as options within the passwd, shadow and group lines within /etc/nsswitch.conf:

passwd:     files winbind
shadow:     files winbind
group:      files winbind

4.  Running "authconfig-tui"command line utility will do all above  configuration automatcially, including proper PAM configuratiom in  /etc/pam.d/system-auth file. For example :

# authconfig-tui

Under  "User Information" section select "Use Winbind" and under  "Authentication" section Select "Use Kerberos Authentication" =>  Click Next.

Click Next and specify Kerberos Settings

REALM:
KDC: 
Admin Server: 

Click on "Use DNS to resolve hosts to realms" and "Use DNS to locate KDCs for realms" if you want DNS server to
resolve the AD server and locate the appropriate kdc server

For example :

Realm: EXAMPLE.COM
KDC: server1.example.com:88
Admin Server: server1.example.com:749
[ ] Use DNS to resolve hosts to realms     
[ ] Use DNS to locate KDCs for realms

Under Winbind Settings, specify Microsoft Windows Active Directory Domian Controller information, for example :

Security Model: ads
Domain: example
Domain Controller: server1.example.com
ADS Realm : EXAMPLE.COM
Template Shell: /bin/bash

Click ok. Do not use "Join Domain" button from authconfig-tui utility.

5.  The kerberos is a time sensitive protocol. As kerberos is used for authentication here.

Before  joining the domain, please ensure that system time between the AD  server and the RHEL 5 server are synchronised. If the AD server is  running as an NTP server, set up NTP to point at the DC. One method  would be by using the redhat-config-date GUI:

system-config-date

check  the synchronisation has worked with the following command on the RHEL 5 server. Note the asterix at the start of the bottom line of the file. This denotes that the syncronisation is complete:

[root@dhcp-103 samba]# ntpq -c peers
remote           refid      st t when poll reach   delay   offset  jitter
    ==================================================
*dhcp-107.winlab 86.77.84.80      2 u  108  512  377    2.834   -7.901  12.137

6. If smb and winbind are currently running, stop both services before proceeding:

# service smb stop
# service winbind stop
  1. Run following command to join RHEL 5 system to Microsoft Windows AD  domain. To use an account other than Administrator, ensure that the user  has the appropriate permissions to join systems to the domain.

# net ads join -U Administrator

8. Configuring Home Directories:

Home  directory configuration needs to be defined within /etc/samba/smb.conf.  In the example below, we have used '%D+%S' for valid user definition.  If this syntax is to be employed, ensure that the 'winbind separator =  +' line is included in the [global] section (see above). %D defines  'domain' and %S defines 'share'.

[homes]
	comment = AD User Home Directories
	browseable = no
	writable = yes
	valid users = %D+%S

9. It is also necessary to create the top level directory in which each of  the AD user's home directories will be mounted. In our example, that  would be as follows.

# mkdir /home/EXAMPLE

so an AD user 'test' would have the following home directory:

/home/EXAMPLE/test

10. Here is sample /etc/pam.d/system-auth file.

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam\_env.so
auth        sufficient    pam\_unix.so nullok try\_first\_pass
auth        requisite     pam\_succeed\_if.so uid >= 500 quiet
auth        sufficient    pam\_krb5.so use\_first\_pass
auth        required      pam\_deny.so
account     required      pam\_unix.so broken\_shadow
account     sufficient    pam\_succeed\_if.so uid < 500 quiet
account     [default=bad success=ok user\_unknown=ignore] pam\_krb5.so
account     required      pam\_permit.so
password    requisite     pam\_cracklib.so try\_first\_pass retry=3
password    sufficient    pam\_unix.so md5 shadow nullok try\_first\_pass use\_authtok
password    sufficient    pam\_krb5.so use\_authtok
password    required      pam\_deny.so
session     optional      pam\_keyinit.so revoke
session     required      pam\_limits.so
session     optional      pam\_mkhomedir.so
session     [success=1 default=ignore] pam\_succeed\_if.so service in crond quiet use\_uid
session     required      pam\_unix.so
session     optional      pam\_krb5.so

11. Now from RHEL 5 system. Check output following commands and see whether AD users/groups are listed their.

# wbinfo -u 
# wbinfo -g
# getent passwd
# getent group

12. Try to login with any AD user credentials from this RHEL 6 system.

Prodotto(s)

Red Hat Enterprise Linux

Componente

krb5

samba

6.2. Join RHEL 6 with Active Directory 2003 R2 Using Winbind

Da: https://access.redhat.com/knowledge/solutions/43065

Ultima modifica di Himanshu Bansal il 07/03/12 - 16:39

Problema

  • Join Red Hat Enterprise Linux to Active Directory 2003 R2 Using Winbind.

Ambiente

  • Red Hat Enterprise Linux 5/6

  • Windows 2003 R2 (SP2) with active directory configured

Risoluzione

  • In order to join Red Hat Enterprise Linux 6 with active directory, install following packages in your system:

    # yum install libtdb samba-client samba-common samba-winbind samba-winbind-clients

  • After installing above packages, execute following steps:

    1. Modify /etc/samba/smb.conf -

      [global]
      workgroup =
      realm =
      log level = 2
      syslog = 0
      preferred master = no
      server string = Linux Test Machine
      security = ads
      encrypt passwords = yes
      log file = /var/log/samba/%m
      max log size = 50
      printcap name = cups
      printing = cups
      winbind enum users = Yes
      winbind enum groups = Yes
      winbind use default domain = yes
      winbind nested groups = Yes
      idmap uid = 600-20000
      idmap gid = 600-20000
      template shell = /bin/bash
      password server =
    2. Join to domain

      # net ads join -U Administrator
    3. Start winbind

      # service winbind start
    4. Verify

      # wbinfo -t
      checks whether the trust secret via RPC calls succeeded
      
      # wbinfo -u (will list AD users)
      # wbinfo -g (will list AD groups)
    5. Run "authconfig-tui" and select Winbind for "User Information" and "Authentication".

    6. Click on "Next" and check all the entries and then click on "OK".

    7. You can see AD users and groups with these commands -

# getent passwd test
test::600:602:test:/home/PNQ/kery:/bin/bash

# id test
uid=600(test) gid=602(domain users)
groups=602(domain users),603(group1)

# getent group "domain users"
domain users::602:

 

Prodotto(s)

Red Hat Enterprise Linux

Componente

samba

6.3. Risorse utili

Segnalo dei link che possono essere utili per trovare risposte immediate a problemi topici e una guida che offre un’ottima descrizione a 360° sulla questione di integrazione di sistemi basati su SAMBA con il mondo Windows Active Directory:

www.samba.org, Samba - opening windows to a wider world

www.redhat.com, Red Hat | The World's Open Source Leader

docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Configuring_Authentication.html, Chapter 10. Configuring Authentication

www.linuxtopia.org/online_books/rhel6/rhel_6_deployment/rhel_6_deployment_ch-Authentication_Configuration.html, Chapter 8. Authentication Configuration

www.gpaterno.com/pubblicazioni/single-sign-on-con-kerberos-e-ldap, Single Sign-On con Kerberos e LDAP

Venerdì, 19 Febbraio 2016 15:58

Questa guida spiega come procedere per bloccare la luminosità dello schermo e della tastiera nei sistemi Mac Book PRO 8.3 equipaggiati con Linux e Gnome come desktop grafico.

Infatti le distribuzioni non prevedono di serie un registrazione dei settaggi della retroilluminazione dello schermo e della tastiera. Pertanto ad ogni riavvio la retroilluminazione è sempre al massimo.

La presente guida presenta una soluzione collaudata su un sistema Ubuntu 12.04.

Mercoledì, 10 Febbraio 2016 23:02

Costruire un Web Server da zero

Stefano Bortolato

stefano bortolato gmail com

Versione v0.01 26 Luglio 2008

Questo documento tenta di insegna come costruire un web server full options usando Linux su un PC.

Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezione Cookie Policy.