Subversion Repositories ALCASAR

Rev

Rev 306 | Rev 308 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log

#!/bin/sh
#  $Id: alcasar.sh 307 2010-10-22 21:44:53Z richard $

# alcasar.sh
# by Franck BOUIJOUX, Pascal LEVANT and Richard REY
# This script is distributed under the Gnu General Public License (GPL)

# Install script for ALCASAR (a secured and authenticated Internet access control captive portal)
# Script d'installation d'ALCASAR (Application Libre pour le Contrôle d'Accès Sécurisé et Authentifié au Réseau)

# ALCASAR is based on a stripped Mandriva (LSB) with the following open source softwares :
# ALCASAR est architecturé autour d'une distribution Linux Mandriva minimaliste et les logiciels libres suivants :
# Coovachilli (a fork of chillispot), freeradius, mysql, apache, netfilter, squid, dansguardian, mondo, mindi, dialupadmin, awstat, ntpd, openssl, dnsmasq, havp, libclamav  and firewalleyes

# Options :
#       -install
#       -uninstall

# Funtions :
#       testing         : Tests de connectivité et de téléchargement avant installation
#       init            : Installation des RPM et des scripts
#       network         : Paramètrage du réseau
#       gestion         : Installation de l'interface de gestion
#       AC              : Initialisation de l'autorité de certification. Création des certificats
#       init_db         : Création de la base 'radius' sur le serveur MySql
#       param_radius    : Configuration du serveur d'authentification FreeRadius
#       param_web_radius: Configuration de l'interface de gestion de FreeRadius (dialupadmin)
#       param_chilli    : Configuration du daemon 'coova-chilli' et de la page d'authentification
#       param_squid     : Configuration du proxy squid en mode 'cache'
#       param_dansguardian : Configuration de l'analyseur de contenu DansGuardian
#       antivirus       : Installation havp + clamav
#       firewall        : Mise en place des règles du parefeu et de l'interface WEB FirewallEyes
#       param_awstats   : Configuration de l'interface des statistiques de consultation WEB
#       dnsmasq         : Configuration du serveur de noms et du serveur dhcp de secours
#       cron            : Mise en place des exports de logs (+ chiffrement)


VERSION=`cat VERSION`
MDV_NEEDED="2010.1"
DATE=`date '+%d %B %Y - %Hh%M'`
DATE_SHORT=`date '+%d/%m/%Y'`
# ******* Files parameters - paramètres fichiers *********
DIR_INSTALL=`pwd`                               # répertoire d'installation
DIR_GESTION="$DIR_INSTALL/gestion"              # répertoire d'installation contenant l'interface de gestion
DIR_CONF="$DIR_INSTALL/conf"                    # répertoire d'installation contenant les fichiers de configuration
DIR_SCRIPTS="$DIR_INSTALL/scripts"              # répertoire d'installation contenant les scripts
DIR_SAVE="/var/Save"                            # répertoire de sauvegarde (ISO, backup, etc.)
DIR_WEB="/var/www/html"                         # répertoire du centre de gestion
DIR_DEST_BIN="/usr/local/bin"                   # répertoire des scripts
DIR_DEST_SBIN="/usr/local/sbin"                 # répertoire des scripts d'admin
DIR_DEST_ETC="/usr/local/etc"                   # répertoire des fichiers de conf
FIC_PARAM="/root/ALCASAR-parameters.txt"        # fichier texte résumant les paramètres d'installation
FIC_PASSWD="/root/ALCASAR-passwords.txt"        # fichier texte contenant les mots de passe et secrets partagés
# ******* DBMS parameters - paramètres SGBD ********
DB_RADIUS="radius"                              # nom de la base de données utilisée par le serveur FreeRadius
DB_USER="radius"                                # nom de l'utilisateur de la base de données
# ******* Network parameters - paramètres réseau *******
DOMAIN="localdomain"                            # domaine local
EXTIF="eth0"                                    # ETH0 est l'interface connectée à Internet (Box FAI)
INTIF="eth1"                                    # ETH1 est l'interface connectée au réseau local de consultation
CUSTOM_PRIVATE_NETWORK_MASK="192.168.182.0/24"  # adresse du réseau de consultation proposée par défaut
SQUID_PORT="3128"                               # Port d'écoute du proxy Squid
UAMPORT="3990"
# ****** Paths - chemin des commandes *******
SED="/bin/sed -i"
# ****** Alcasar needed RPMS - paquetages nécessaires au fonctionnement d'Alcasar ******
PACKAGES="freeradius freeradius-mysql freeradius-ldap freeradius-web apache-mpm-prefork apache-mod_ssl apache-mod_php squid dansguardian postfix MySQL logwatch ntp awstats mondo cdrecord buffer vim-enhanced bind-utils wget arpscan ulogd openssh-server php-xml coova-chilli pam_ccreds rng-utils lsb-release dnsmasq clamav sudo cronie-anacron"
# ****************** End of global parameters *********************

header_install ()
{
        clear
        echo "-----------------------------------------------------------------------------"
        echo "                     Installation d'ALCASAR V$VERSION"
        echo "Application Libre pour le Contrôle d'Accès Sécurisé et Authentifié au Réseau"
        echo "-----------------------------------------------------------------------------"
} # End of header_install ()

##################################################################
##                      Fonction TESTING                        ##
## - Test de la connectivité Internet                          ##
##################################################################
testing ()
{
        echo -n "Tests des paramètres réseau : "
# On teste l'état du lien des interfaces réseau
        for i in $EXTIF $INTIF
        do
                /sbin/ip link set $i up
                sleep 3
                if [ "`/usr/sbin/ethtool $i|grep Link|cut -d' ' -f3`" != "yes" ]
                        then
                        echo "Échec"
                        echo "Le lien réseau de la carte $i n'est pas actif."
                        echo "Réglez ce problème avant de poursuivre l'installation d'ALCASAR."
                        exit 0
                fi
        done
# On teste la présence d'un routeur par défaut (Box FAI)
        if [ `/sbin/route -n|grep -c ^0.0.0.0` -ne "1" ] ; then
                echo "Échec"
                echo "Vous n'avez pas configuré l'accès à Internet ou le câble réseau n'est pas sur la bonne carte."
                echo "Réglez ce problème avant de poursuivre."
                exit 0
        fi
# On traite le cas où l'interface configurée lors de l'installation est "eth1" au lieu de "eth0" (mystère sur certains BIOS et sur VirtualBox)
        if [ `/sbin/route -n|grep ^0.0.0.0|grep -c eth1` -eq "1" ] ; then
                echo "Échec. La configuration des cartes réseau va être corrigée."
                /etc/init.d/network stop
                mv -f /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-eth0
                $SED "s?eth1?eth0?g" /etc/sysconfig/network-scripts/ifcfg-eth0
                /etc/init.d/network start
                echo 0 > /proc/sys/net/ipv4/conf/all/log_martians
                sleep 2
                echo "Configuration corrigée"
                sleep 2
                echo "Vous pouvez relancer ce script (sh alcasar.sh -install)."
                exit 0
        fi
# On teste la connectivité Internet
        rm -rf /tmp/con_ok.html
        /usr/bin/curl www.google.fr -# -o /tmp/con_ok.html
        if [ ! -e /tmp/con_ok.html ]
        then
                echo "La tentative de connexion vers Internet a échoué (google.fr)."
                echo "Vérifiez que la carte $EXTIF est bien connectée au routeur du FAI."
                echo "Vérifiez la validité des adresses DNS."
                exit 0
        fi
        echo "Tests de connectivité Internet corrects"
        rm -rf /tmp/con_ok.html
} # end of testing

##################################################################
##                      Fonction INIT                           ##
## - Création du fichier "/root/ALCASAR_parametres.txt"                ##
## - Installation et modification des scripts du portail        ##
## - Mise à jour système                                      ##
## - Installation des paquetages complémentaires               ##
##################################################################
init ()
{
        if [ ! "$mode" = "update" ]
        then
                header_install
# On affecte le nom d'organisme
                header_install
                ORGANISME=!
                PTN='^[a-zA-Z0-9-]*$'
                until [[ $(expr $ORGANISME : $PTN) -gt 0 ]]
                do
                        echo -n "Entrez le nom de votre organisme : "
                        read ORGANISME
                        if [ "$ORGANISME" = "" ]
                                then
                                ORGANISME=!
                        fi
                done
        fi
# On configure les dépots et on les teste
        echo "Configuration des dépôts de paquetages Internet (repository)"
        chmod u+x $DIR_SCRIPTS/alcasar-urpmi.sh
        $DIR_SCRIPTS/alcasar-urpmi.sh >/dev/null
        if [ "$?" != "0" ]
        then
                echo
                echo "Une erreur s'est produite lors de la synchronisation avec les dépôts Internet"
                echo "Relancez l'installation ultérieurement."
               echo "Si vous rencontrez de nouveau ce problème, changez de dépôt en modifiant le fichier 'scripts/alcasar-urpmi.sh'"
                exit 0
        fi
# On teste la mise à jour du système
        echo "Récupération des paquetages de mise à jour. Veuillez patienter ..."
        urpmi --auto --auto-update --quiet --test --retry 2
        if [ "$?" != "0" ]
        then
                echo
                echo "Une erreur  a été détectée lors de la récupération des paquetages de mise à jour."
                echo "Relancez l'installation ultérieurement."
               echo "Si vous rencontrez de nouveau ce problème, changez de dépôt en modifiant le fichier 'scripts/alcasar-urpmi.sh'"
                exit 0
        fi
# On teste l'installation des paquetages complémentaires
        echo "Récupération des paquetages complémentaires. Veuillez patienter ..."
        urpmi --auto $PACKAGES --quiet --test --retry 2
        if [ "$?" != "0" ]
        then
                echo
                echo "Une erreur a été détectée lors de la récupération des paquetages complémentaires."
                echo "Relancez l'installation ultérieurement."
               echo "Si vous rencontrez de nouveau ce problème, changez de dépôt en modifiant le fichier 'scripts/alcasar-urpmi.sh'"
                exit 0
        fi
# On mets à jour le système
        urpmi --auto --auto-update
# On installe les paquetages complémentaires
        urpmi --auto $PACKAGES
# On empêche les mises à jour de coova-chilli et freeradius par le biais des dépôts
        echo -n "/^coova/" >> /etc/urpmi/skip.list
        echo -n "/^freeradius/" >> /etc/urpmi/skip.list
# On supprime les paquetages, les services et les utilisateurs inutiles
        for rm_rpm in avahi mandi shorewall libc-icap0 cyrus-sasl
        do
                /usr/sbin/urpme --auto $rm_rpm --auto-orphans
        done
        for svc in alsa sound dm atd dc_server
        do
                /sbin/chkconfig --del $svc
        done
        for rm_users in avahi-autoipd avahi icapd
        do
                user=`cat /etc/passwd|grep $rm_users|cut -d":" -f1`
                if [ "$user" == "$rm_users" ]
                then
                        /usr/sbin/userdel -f $rm_users
                fi
        done
# On installe les RPMs spécifiques à la version
        fic=`cat /etc/product.id`
        old="$IFS"
        IFS=","
        set $fic
        for i in $*
        do
                if [ "`echo $i|grep arch|cut -d'=' -f1`" == "arch" ]
                then
                        ARCH=`echo $i|cut -d"=" -f2`
                fi
        done
        IFS="$old"
        urpmi --no-verify --auto $DIR_CONF/rpms/$ARCH/*.rpm
# On vide le répertoire temporaire
        urpmi --clean
# On crée aléatoirement les mots de passe et les secrets partagés
        rm -f $FIC_PASSWD
        grubpwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8`        # mot de passe de protection du menu Grub
        echo -n "mot de passe de protection du menu de démarrage (GRUB) : " > $FIC_PASSWD
        echo "$grubpwd" >> $FIC_PASSWD
        md5_grubpwd=`/usr/bin/md5pass $grubpwd`
        sed -i "/^password.*/d" /boot/grub/menu.lst
        sed -i "1ipassword --md5 $md5_grubpwd" /boot/grub/menu.lst
        mysqlpwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8`       # mot de passe de l'administrateur Mysqld
        echo -n "compte et mot de passe de l'administrateur Mysqld : " >> $FIC_PASSWD
        echo "root / $mysqlpwd" >> $FIC_PASSWD
        radiuspwd=`cat /dev/urandom | tr -dc [:alnum:] | head -c8`      # mot de passe de l'utilisateur Mysqld (utilisé par freeradius)
        echo -n "compte et mot de passe de l'utilisateur Mysqld : " >> $FIC_PASSWD
        echo "$DB_USER / $radiuspwd" >> $FIC_PASSWD
        secretuam=`cat /dev/urandom | tr -dc [:alnum:] | head -c8`      # secret partagé entre intercept.php et coova-chilli
        echo -n "secret partagé entre le script 'intercept.php' et coova-chilli : " >> $FIC_PASSWD
        echo "$secretuam" >> $FIC_PASSWD
        secretradius=`cat /dev/urandom | tr -dc [:alnum:] | head -c8`   # secret partagé entre coova-chilli et FreeRadius
        echo -n "secret partagé entre coova-chilli et FreeRadius : " >> $FIC_PASSWD
        echo "$secretradius" >> $FIC_PASSWD
        chmod 640 $FIC_PASSWD
# On installe et on modifie les scripts d'Alcasar
        cp -f $DIR_SCRIPTS/alcasar* $DIR_DEST_BIN/. ; chown root:root $DIR_DEST_BIN/alcasar* ; chmod 740 $DIR_DEST_BIN/alcasar*
        cp -f $DIR_SCRIPTS/sbin/alcasar* $DIR_DEST_SBIN/. ; chown root:root $DIR_DEST_SBIN/alcasar* ; chmod 740 $DIR_DEST_SBIN/alcasar*
        cp -f $DIR_SCRIPTS/etc/alcasar* $DIR_DEST_ETC/. ; chown root:apache $DIR_DEST_ETC/alcasar* ; chmod 660 $DIR_DEST_ETC/alcasar*
        $SED "s?^radiussecret.*?radiussecret=\"$secretradius\"?g" $DIR_DEST_SBIN/alcasar-logout.sh
        $SED "s?^DB_RADIUS=.*?DB_RADIUS=\"$DB_RADIUS\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh
        $SED "s?^DB_USER=.*?DB_USER=\"$DB_USER\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh $DIR_DEST_BIN/alcasar-conf.sh
        $SED "s?^radiuspwd=.*?radiuspwd=\"$radiuspwd\"?g" $DIR_DEST_SBIN/alcasar-mysql.sh $DIR_DEST_BIN/alcasar-conf.sh
# On génère le début du fichier récapitulatif
        cat <<EOF > $FIC_PARAM
########################################################
##                                                    ##
##   Fichier récapitulatif des paramètres d'ALCASAR   ##
##                                                    ##
########################################################

- Date d'installation : $DATE
- Version istallée : $VERSION
- Organisme : $ORGANISME
EOF
        chmod o-rwx $FIC_PARAM
} # End of init ()

##################################################################
##                      Fonction network                        ##
## - Définition du plan d'
adressage du réseau de consultation ##
##  (merci à Alexandre Trias pour le calcul de masque et RegEx) ##
## - Nommage DNS du système (portail + nom d'organisme)                ##
## - Configuration de l'interface eth1 (réseau de consultation)        ##
## - Modification du fichier /etc/hosts                         ##
## - Configuration du serveur de temps (NTP)                    ##
## - Renseignement des fichiers hosts.allow et hosts.deny       ##
##################################################################
network ()
{
        header_install
        echo "Par défaut, le plan d'adressage du réseau de consultation est : $CUSTOM_PRIVATE_NETWORK_MASK"
        response=0
        PTN='^[oOnN]$'
        until [[ $(expr $response : $PTN) -gt 0 ]]
                do
                        echo -n "Voulez-vous utiliser ce plan d'adressage (recommandé) (O/n)? : "
                        read response
                done
        if [ "$response" = "n" ] || [ "$response" = "N" ]
        then
                CUSTOM_PRIVATE_NETWORK_MASK="0"
                PTN='^\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\)/[012]\?[[:digit:]]$'
                until [[ $(expr $CUSTOM_PRIVATE_NETWORK_MASK : $PTN) -gt 0 ]]
                        do
                                echo -n "Entrez un plan d'adressage au format CIDR (a.b.c.d/xx) : "
                                read CUSTOM_PRIVATE_NETWORK_MASK

                        done
        fi
# Récupération de la config réseau côté "LAN de consultation"
        HOSTNAME=alcasar-$ORGANISME
        hostname $HOSTNAME
        echo "- Nom du système : $HOSTNAME" >> $FIC_PARAM
        PRIVATE_NETWORK=`/bin/ipcalc -n $CUSTOM_PRIVATE_NETWORK_MASK | cut -d"=" -f2`           # @ réseau de consultation (ex.: 192.168.182.0)
        private_prefix=`/bin/ipcalc -p $CUSTOM_PRIVATE_NETWORK_MASK |cut -d"=" -f2`             # prefixe du réseau (ex. 24)
        PRIVATE_NETWORK_MASK=$PRIVATE_NETWORK/$private_prefix                                   # @ réseau + masque (x.0.0.0/8 ou x.y.0.0/16 ou x.y.z.0/24)
        classe=$((private_prefix/8));                                                           # classe de réseau (ex.: 2=classe B, 3=classe C)
        PRIVATE_NETWORK_SHORT=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`.                  # @ compatible hosts.allow et hosts.deny (ex.: 192.168.182.)
        PRIVATE_MASK=`/bin/ipcalc -m $PRIVATE_NETWORK_MASK | cut -d"=" -f2`                     # masque réseau de consultation (ex.: 255.255.255.0)
        PRIVATE_BROADCAST=`/bin/ipcalc -b $PRIVATE_NETWORK_MASK | cut -d"=" -f2`                # @ broadcast réseau de consultation (ex.: 192.168.182.255)
        TMP_MASK=`echo $PRIVATE_NETWORK_MASK|cut -d"/" -f2`; HALF_MASK=`expr $TMP_MASK + 1`     # masque du 1/2 réseau de consultation (ex.: 25)
        PRIVATE_STAT_IP=$PRIVATE_NETWORK/$HALF_MASK                                             # plage des adresses statiques (ex.: 192.168.182.0/25)
        PRIVATE_STAT_MASK=`/bin/ipcalc -m $PRIVATE_STAT_IP/$HALF_MASK | cut -d"=" -f2`          # masque des adresses statiques (ex.: 255.255.255.128)
        classe_sup=`expr $classe + 1`
        classe_sup_sup=`expr $classe + 2`
        private_network_ending=`echo $PRIVATE_NETWORK | cut -d"." -f$classe_sup`
        private_broadcast_ending=`echo $PRIVATE_BROADCAST | cut -d"." -f$classe_sup`
        private_plage=`expr $private_broadcast_ending - $private_network_ending + 1`
        private_half_plage=`expr $private_plage / 2`
        private_dyn=`expr $private_half_plage + $private_network_ending`
        private_dyn_ip_network=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`"."$private_dyn"."`echo $PRIVATE_NETWORK | cut -d"." -f$classe_sup_sup-5`
        PRIVATE_DYN_IP=`echo $private_dyn_ip_network | cut -d"." -f1-4`/$HALF_MASK              # plage des adresses dynamiques (ex.: 192.168.182.128/25)
        PRIVATE_DYN_MASK=`/bin/ipcalc -m $PRIVATE_DYN_IP/$HALF_MASK | cut -d"=" -f2`            # masque des adresses dynamiques (ex.: 255.255.255.128)
        private_dyn_ip_network=`echo $PRIVATE_DYN_IP | cut -d"/" -f1`                           # plage des adresses dynamiques sans le masque (ex.: 192.168.182.0)
        private_dyn_ip_end=`echo $private_dyn_ip_network | cut -d"." -f4`                       # dernier octet de la plage des adresses dynamiques (ex.: 128)
        PRIVATE_DYN_FIRST_IP=`echo $private_dyn_ip_network | cut -d"." -f1-3`"."`expr $private_dyn_ip_end + 1`  # 1ère adresse de la plage dynamique (ex.: 192.168.182.129)
        private_broadcast_end=`echo $PRIVATE_BROADCAST | cut -d"." -f4`
        PRIVATE_DYN_LAST_IP=`echo $PRIVATE_BROADCAST | cut -d"." -f1-3`"."`expr $private_broadcast_end - 1`     # dernière adresse de la plage dynamique (ex.: 192.168.182.254)
        PRIVATE_IP=`echo $PRIVATE_NETWORK | cut -d"." -f1-3`"."`expr $private_network_end + 1`  # @ip du portail (côté réseau de consultation)
# Récupération de la config réseau côté "Internet"
        [ -e /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF ] || cp /etc/sysconfig/network-scripts/ifcfg-$EXTIF /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF
        EXT_IP=`grep IPADDR /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`  # @ip du portail (côté Internet)
        [ -e /etc/sysconfig/network.default ] || cp /etc/sysconfig/network /etc/sysconfig/network.default
        DNS1=`grep DNS1 /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`      # @ip 1er DNS
        DNS2=`grep DNS2 /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`      # @ip 2ème DNS
        DNS1=${DNS1:=208.67.220.220}
        DNS2=${DNS2:=208.67.222.222}
        EXT_NETMASK=`grep NETMASK /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`
        EXT_GATEWAY=`grep GATEWAY /etc/sysconfig/network-scripts/default-ifcfg-$EXTIF|cut -d"=" -f2`
        echo "- Adresse IP 'côté Internet' ($EXTIF) : $EXT_IP / $EXT_NETMASK" >> $FIC_PARAM
        echo "- Serveurs DNS renseignés : $DNS1 et $DNS2" >> $FIC_PARAM
        echo "- Routeur de sortie : $EXT_GATEWAY" >> $FIC_PARAM
# Configuration réseau
        cat <<EOF > /etc/sysconfig/network
NETWORKING=yes
HOSTNAME="$HOSTNAME"
FORWARD_IPV4=true
EOF
# Modif /etc/hosts
        [ -e /etc/hosts.default ] || cp /etc/hosts /etc/hosts.default
        cat <<EOF > /etc/hosts
127.0.0.1       $HOSTNAME localhost.localdomain localhost
$PRIVATE_IP     $HOSTNAME alcasar portail
EOF
        echo "- Adresse IP 'côté réseau de consultation' ($INTIF) : $PRIVATE_IP / $PRIVATE_NETWORK_MASK" >> $FIC_PARAM
        echo "    - plage d'adresses statiques : $PRIVATE_STAT_IP" >> $FIC_PARAM
        echo "    - plage d'adresses dynamiques (via DHCP) : $PRIVATE_DYN_IP" >> $FIC_PARAM
# Configuration de l'interface eth0 (Internet)
        cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$EXTIF
DEVICE=$EXTIF
BOOTPROTO=static
IPADDR=$EXT_IP
NETMASK=$EXT_NETMASK
GATEWAY=$EXT_GATEWAY
DNS1=127.0.0.1
ONBOOT=yes
METRIC=10
NOZEROCONF=yes
MII_NOT_SUPPORTED=yes
IPV6INIT=no
IPV6TO4INIT=no
ACCOUNTING=no
USERCTL=no
EOF
# Configuration de l'interface eth1 (réseau de consultation)
        cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$INTIF
DEVICE=$INTIF
BOOTPROTO=static
IPADDR=$PRIVATE_IP
NETMASK=$PRIVATE_MASK
ONBOOT=yes
METRIC=10
NOZEROCONF=yes
MII_NOT_SUPPORTED=yes
IPV6INIT=no
IPV6TO4INIT=no
ACCOUNTING=no
USERCTL=no
EOF
# Configuration du serveur de temps
        [ -e /etc/ntp.conf.default ] || cp /etc/ntp.conf /etc/ntp.conf.default
        cat <<EOF > /etc/ntp.conf
server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
restrict default nomodify notrap noquery
restrict $PRIVATE_NETWORK mask $PRIVATE_MASK
restrict 127.0.0.1
driftfile /etc/ntp/drift
logfile /var/log/ntp.log
EOF
        chown -R ntp:ntp /etc/ntp
# synchronisation horaire
        ntpd -q -g &
# Renseignement des fichiers hosts.allow et hosts.deny
        [ -e /etc/hosts.allow.default ]  || cp /etc/hosts.allow /etc/hosts.allow.default
        cat <<EOF > /etc/hosts.allow
ALL: LOCAL, 127.0.0.1, localhost, $PRIVATE_IP
sshd: $PRIVATE_NETWORK_SHORT
ntpd: $PRIVATE_NETWORK_SHORT
EOF
        [ -e /etc/host.deny.default ]  || cp /etc/hosts.deny /etc/hosts.deny.default
        cat <<EOF > /etc/hosts.deny
ALL: ALL: spawn ( /bin/echo "service %d demandé par %c" | /bin/mail -s "Tentative d'accès au service %d par %c REFUSE !!!" security ) &
EOF
} # End of network ()

##################################################################
##                      Fonction gestion                        ##
## - installation du centre de gestion                          ##
## - configuration du serveur web (Apache)                      ##
## - définition du 1er comptes de gestion                      ##
## - sécurisation des accès                                   ##
##################################################################
gestion()
{
# Suppression des CGI et des pages WEB installés par défaut
        rm -rf /var/www/cgi-bin/*
        [ -d $DIR_WEB ] && rm -rf $DIR_WEB
        mkdir $DIR_WEB
# Copie et configuration des fichiers du centre de gestion
        cp -rf $DIR_GESTION/* $DIR_WEB/
        echo "$VERSION du $DATE" > $DIR_WEB/VERSION
        $SED "s?99/99/9999?$DATE_SHORT?g" $DIR_WEB/menu.php
        $SED "s?\$DB_RADIUS = .*?\$DB_RADIUS = \"$DB_RADIUS\"\;?g" $DIR_WEB/phpsysinfo/includes/xml/portail.php
        $SED "s?\$DB_USER = .*?\$DB_USER = \"$DB_USER\"\;?g" $DIR_WEB/phpsysinfo/includes/xml/portail.php
        $SED "s?\$radiuspwd = .*?\$radiuspwd = \"$radiuspwd\"\;?g" $DIR_WEB/phpsysinfo/includes/xml/portail.php
        chmod 640 $DIR_WEB/phpsysinfo/includes/xml/portail.php
        chown -R apache:apache $DIR_WEB/*
        for i in ISO base logs/firewall logs/httpd logs/squid ;
        do
                [ -d $DIR_SAVE/$i ] || mkdir -p $DIR_SAVE/$i
        done
        chown -R root:apache $DIR_SAVE
# Configuration et sécurisation php
        [ -e /etc/php.ini.default ] || cp /etc/php.ini /etc/php.ini.default
        $SED "s?^upload_max_filesize.*?upload_max_filesize = 20M?g" /etc/php.ini
        $SED "s?^post_max_size.*?post_max_size = 20M?g" /etc/php.ini
        $SED "s?^html_errors.*?html_errors = Off?g" /etc/php.ini
        $SED "s?^expose_php.*?expose_php = Off?g" /etc/php.ini
# Configuration et sécurisation Apache
        [ -e /etc/httpd/conf/httpd.conf.default ] || cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.default
        $SED "s?^#ServerName.*?ServerName $PRIVATE_IP?g" /etc/httpd/conf/httpd.conf
        $SED "s?^Listen.*?Listen $PRIVATE_IP:80?g" /etc/httpd/conf/httpd.conf
        $SED "s?^ServerTokens.*?ServerTokens Prod?g" /etc/httpd/conf/httpd.conf
        $SED "s?^ServerSignature.*?ServerSignature Off?g" /etc/httpd/conf/httpd.conf
        $SED "s?^#ErrorDocument 404 /missing.html.*?ErrorDocument 404 /index.html?g" /etc/httpd/conf/httpd.conf
        FIC_MOD_SSL=`find /etc/httpd/modules.d/ -type f -name *mod_ssl.conf`
        $SED "s?^Listen.*?Listen $PRIVATE_IP:443?g" $FIC_MOD_SSL # On écoute en SSL que sur INTIF
        $SED "s?background-color.*?background-color: #EFEFEF; }?g" /var/www/error/include/top.html
        [ -e /var/www/error/include/bottom.html.default ] || mv /var/www/error/include/bottom.html /var/www/error/include/bottom.html.default
        cat <<EOF > /var/www/error/include/bottom.html
</body>
</html>
EOF
        echo "- URL d'accès au centre de gestion : https://$PRIVATE_IP" >> $FIC_PARAM
# On crée le VirtualHost pour l'accès au port 80 (redirection après filtrage)
        FIC_VIRTUAL=`find /etc/httpd/conf -type f -name *default_vhosts*`
        [ -e /etc/httpd/conf/vhosts.default ]  || cp $FIC_VIRTUAL /etc/httpd/conf/vhosts.default
        cat <<EOF > $FIC_VIRTUAL
NameVirtualHost *:80
<VirtualHost *:80>
ServerName $HOSTNAME
DocumentRoot $DIR_WEB/redirect
</VirtualHost>
EOF
# Définition du premier compte lié au profil 'admin'
        if [ "$mode" = "install" ]
        then
                header_install
                echo "Pour administrer Alcasar via le centre de gestion WEB, trois profils de comptes ont été définis :"
                echo " - le profil 'admin' capable de réaliser toutes les opérations"
                echo " - le profil 'backup' lié uniquement aux fonctions d'archivage"
                echo " - le profil 'manager' lié uniquement aux fonctions de gestion des usagers"
                echo ""
                echo "Définissez le premier compte du profil 'admin' :"
                echo
                echo -n "Nom : "
                read admin_portail
                echo "- Nom du premier compte lié au profil 'admin' : $admin_portail" >> $FIC_PARAM
# Création du fichier de clés de ce compte dans le profil "admin"
                [ -d $DIR_WEB/digest ] && rm -rf $DIR_WEB/digest
                mkdir -p $DIR_WEB/digest
                chmod 755 $DIR_WEB/digest
                until [ -s $DIR_WEB/digest/key_admin ]
                        do
                                /usr/sbin/htdigest -c $DIR_WEB/digest/key_admin $HOSTNAME $admin_portail
                        done
# Création des fichiers de clés des deux autres profils (backup + manager) contenant ce compte
                $DIR_DEST_SBIN/alcasar-profil.sh -list
        fi
# Sécurisation du centre
        rm -f /etc/httpd/conf/webapps.d/*
        cat <<EOF > /etc/httpd/conf/webapps.d/alcasar.conf
<Directory $DIR_WEB/digest>
        AllowOverride none
        Order deny,allow
        Deny from all
</Directory>
<Directory $DIR_WEB/admin>
        SSLRequireSSL
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
        AuthUserFile $DIR_WEB/digest/key_admin
        ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_WEB/manager/htdocs>
        SSLRequireSSL
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
        AuthUserFile $DIR_WEB/digest/key_manager
        ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_WEB/manager/html>
        SSLRequireSSL
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
        AuthUserFile $DIR_WEB/digest/key_manager
        ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
<Directory $DIR_WEB/backup>
        SSLRequireSSL
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
        AuthUserFile $DIR_WEB/digest/key_backup
        ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
Alias /save/ "$DIR_SAVE/"
<Directory $DIR_SAVE>
        SSLRequireSSL
        Options Indexes
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        AuthUserFile $DIR_WEB/digest/key_backup
        ErrorDocument 404 https://$PRIVATE_IP/
        ReadmeName      /readmeSave.html
</Directory>
EOF
} # End of gestion ()

##########################################################################################
##                              Fonction AC()                                           ##
## - Création d'une Autorité de Certification et du certificat serveur pour apache    ##
##########################################################################################
AC ()
{
        $SED "s?ifcfg-eth.?ifcfg-$INTIF?g" $DIR_DEST_BIN/alcasar-CA.sh
        $DIR_DEST_BIN/alcasar-CA.sh $mode
        FIC_VIRTUAL_SSL=`find /etc/httpd/conf -type f -name *default_ssl*`
        [ -e /etc/httpd/conf/vhosts-ssl.default ]  || cp $FIC_VIRTUAL_SSL /etc/httpd/conf/vhosts-ssl.default
        $SED "s?localhost.crt?alcasar.crt?g" $FIC_VIRTUAL_SSL
        $SED "s?localhost.key?alcasar.key?g" $FIC_VIRTUAL_SSL
        chown -R root:apache /etc/pki
        chmod -R 750 /etc/pki
} # End AC ()

##########################################################################################
##                      Fonction init_db()                                              ##
## - Initialisation de la base Mysql                                                    ##
## - Affectation du mot de passe de l'administrateur (root)                             ##
## - Suppression des bases et des utilisateurs superflus                                ##
## - Création de la base 'radius'                                                      ##
## - Installation du schéma de cette base                                              ##
## - Import des tables de comptabilité (mtotacct, totacct) et info_usagers (userinfo)  ##
##       ces table proviennent de 'dialupadmin' (paquetage freeradius-web)              ##
##########################################################################################
init_db ()
{
        mkdir -p /var/lib/mysql/.tmp
        chown mysql:mysql /var/lib/mysql/.tmp
        [ -e /etc/my.cnf.rpmnew ] && mv /etc/my.cnf.rpmnew /etc/my.cnf          # prend en compte les migrations de MySQL
        [ -e /etc/my.cnf.default ] || cp /etc/my.cnf /etc/my.cnf.default
        $SED "s?^#bind-address.*?bind-address=127.0.0.1?g" /etc/my.cnf
        /etc/init.d/mysqld start
        sleep 4
        mysqladmin -u root password $mysqlpwd
        MYSQL="/usr/bin/mysql -uroot -p$mysqlpwd --exec"
# On supprime les tables d'exemple
        $MYSQL="DROP DATABASE IF EXISTS test;DROP DATABASE IF EXISTS tmp;CONNECT mysql;DELETE from user where user='';FLUSH PRIVILEGES;"
        # On crée la base 'radius'
        $MYSQL="CREATE DATABASE IF NOT EXISTS $DB_RADIUS;GRANT ALL ON $DB_RADIUS.* TO $DB_USER@localhost IDENTIFIED BY '$radiuspwd';FLUSH PRIVILEGES"
        FICSQL_LIBFREERADIUS=`find /etc/raddb/sql/mysql -type f -name schema.sql`
        mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $FICSQL_LIBFREERADIUS
        $MYSQL="connect $DB_RADIUS;ALTER table radpostauth DROP column pass;"
# Ajout des tables de comptabilité journalière et mensuelle (accounting)
        DIRSQL_FREERADIUS=`find /usr/share/doc/freeradius-web* -type d -name mysql`
        mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIRSQL_FREERADIUS/mtotacct.sql
        mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIRSQL_FREERADIUS/totacct.sql
# correction d'un bug sur la table 'userinfo' avant import
        $SED "s?^  id int(10).*?  id int(10) NOT NULL auto_increment,?g" $DIRSQL_FREERADIUS/userinfo.sql
        mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIRSQL_FREERADIUS/userinfo.sql
# correction d'un bug sur la table 'badusers' avant import (elle reste inutilisée par Alcasar pour l'instant)
        #$SED "s?^  id int(10).*?  id int(10) NOT NULL auto_increment,?g" $DIRSQL_FREERADIUS/badusers.sql
        #mysql -u$DB_USER -p$radiuspwd $DB_RADIUS < $DIRSQL_FREERADIUS/badusers.sql
} # End init_db ()

##########################################################################
##                      Fonction param_radius                           ##
## - Paramètrage des fichiers de configuration FreeRadius              ##
## - Affectation du secret partagé entre coova-chilli et freeradius    ##
## - Modification de fichier de conf pour l'accès à Mysql             ##
##########################################################################
param_radius ()
{
        cp -f $DIR_CONF/radiusd-db-vierge.sql /etc/raddb/
        chown -R radius:radius /etc/raddb
        [ -e /etc/raddb/radiusd.conf.default ] || cp /etc/raddb/radiusd.conf /etc/raddb/radiusd.conf.default
# paramètrage radius.conf
        $SED "s?^[\t ]*#[\t ]*user =.*?user = radius?g" /etc/raddb/radiusd.conf
        $SED "s?^[\t ]*#[\t ]*group =.*?group = radius?g" /etc/raddb/radiusd.conf
        $SED "s?^[\t ]*status_server =.*?status_server = no?g" /etc/raddb/radiusd.conf
# suppression de la fonction proxy
        $SED "s?^[\t ]*proxy_requests.*?proxy_requests = no?g" /etc/raddb/radiusd.conf
        $SED "s?^[\t ]*\$INCLUDE proxy.conf.*?#\$INCLUDE proxy.conf?g" /etc/raddb/radiusd.conf
# écoute sur loopback uniquement (à modifier plus tard pour l'EAP)
        $SED "s?^[\t ]*ipaddr =.*?ipaddr = 127.0.0.1?g" /etc/raddb/radiusd.conf
# prise en compte du module SQL et des compteurs SQL
        $SED "s?^[\t ]*#[\t ]*\$INCLUDE sql.conf.*?\$INCLUDE sql.conf?g" /etc/raddb/radiusd.conf
        $SED "s?^[\t ]*#[\t ]*\$INCLUDE sql/mysql/counter.conf?\$INCLUDE sql/mysql/counter.conf?g" /etc/raddb/radiusd.conf
        $SED "s?^[\t ]*\$INCLUDE policy.conf?#\$INCLUDE policy.conf?g" /etc/raddb/radiusd.conf
# purge du répertoire des serveurs virtuels et copie du fichier de configuration d'Alcasar
        rm -f /etc/raddb/sites-enabled/*
        cp $DIR_CONF/alcasar-radius /etc/raddb/sites-available/alcasar
        chown radius:apache /etc/raddb/sites-available/alcasar /etc/raddb/modules/ldap # droits rw pour apache (module ldap)
        chmod 660 /etc/raddb/sites-available/alcasar /etc/raddb/modules/ldap
        chgrp apache /etc/raddb /etc/raddb/sites-available /etc/raddb/modules
        ln -s /etc/raddb/sites-available/alcasar /etc/raddb/sites-enabled/alcasar
        # Inutile dans notre fonctionnement mais les liens sont recrés par un update de radius ... donc là forcé en tant que fichier
        touch /etc/raddb/sites-enabled/{inner-tunnel,control-socket,default}
# configuration du fichier client.conf (127.0.0.1 suffit mais on laisse le deuxième client pour la future gestion de l'EAP)
        [ -e /etc/raddb/clients.conf.default ] || cp -f /etc/raddb/clients.conf /etc/raddb/clients.conf.default
        cat << EOF > /etc/raddb/clients.conf
client 127.0.0.1 {
        secret = $secretradius
        shortname = localhost
}
client $PRIVATE_NETWORK_MASK {
        secret = $secretradius
        shortname = localhost
}
EOF
# modif sql.conf
        [ -e /etc/raddb/sql.conf.default ] || cp /etc/raddb/sql.conf /etc/raddb/sql.conf.default
        $SED "s?^[\t ]*login =.*?login = \"$DB_USER\"?g" /etc/raddb/sql.conf
        $SED "s?^[\t ]*password =.*?password = \"$radiuspwd\"?g" /etc/raddb/sql.conf
        $SED "s?^[\t ]*radius_db =.*?radius_db = \"$DB_RADIUS\"?g" /etc/raddb/sql.conf
        $SED "s?^[\t ]*sqltrace =.*?sqltrace = no?g" /etc/raddb/sql.conf
# modif dialup.conf
        [ -e /etc/raddb/sql/mysql/dialup.conf.default ] || cp /etc/raddb/sql/mysql/dialup.conf /etc/raddb/sql/mysql/dialup.conf.default
        cp -f $DIR_CONF/dialup.conf /etc/raddb/sql/mysql/dialup.conf
} # End param_radius ()

##########################################################################
##                      Fonction param_web_radius                       ##
## - Import, modification et paramètrage de l'interface "dialupadmin"  ##
## - Création du lien vers la page de changement de mot de passe        ##
##########################################################################
param_web_radius ()
{
# copie de l'interface d'origine dans la structure Alcasar
        [ -d /usr/share/freeradius-web ] && cp -rf /usr/share/freeradius-web/* $DIR_WEB/manager/
# copie des fichiers modifiés et suppression des fichiers inutiles
        cp -rf $DIR_GESTION/manager/* $DIR_WEB/manager/
        rm -f $DIR_WEB/manager/index.html $DIR_WEB/manager/readme
        rm -f $DIR_WEB/manager/htdocs/about.html $DIR_WEB/manager/htdocs/index.html $DIR_WEB/manager/htdocs/content.html
        chown -R apache:apache $DIR_WEB/manager/
# Modification du fichier de configuration
        [ -e /etc/freeradius-web/admin.conf.default ] || cp /etc/freeradius-web/admin.conf /etc/freeradius-web/admin.conf.default
        $SED "s?^general_domain:.*?general_domain: $ORGANISME.$DOMAIN?g" /etc/freeradius-web/admin.conf
        $SED "s?^sql_username:.*?sql_username: $DB_USER?g" /etc/freeradius-web/admin.conf
        $SED "s?^sql_password:.*?sql_password: $radiuspwd?g" /etc/freeradius-web/admin.conf
        $SED "s?^sql_debug:.*?sql_debug: false?g" /etc/freeradius-web/admin.conf
        $SED "s?^sql_usergroup_table: .*?sql_usergroup_table: radusergroup?g" /etc/freeradius-web/admin.conf
        $SED "s?^sql_password_attribute:.*?sql_password_attribute: Crypt-Password?g" /etc/freeradius-web/admin.conf
        $SED "s?^general_finger_type.*?# general_finger_type: snmp?g" /etc/freeradius-web/admin.conf
        $SED "s?^general_stats_use_totacct.*?general_stats_use_totacct: yes?g" /etc/freeradius-web/admin.conf
        cat <<EOF > /etc/freeradius-web/naslist.conf
nas1_name: alcasar.%{general_domain}
nas1_model: Portail captif
nas1_ip: $PRIVATE_IP
nas1_port_num: 0
nas1_community: public
EOF
# Modification des attributs visibles lors de la création d'un usager ou d'un groupe
        [ -e /etc/freeradius-web/user_edit.attrs.default ] || mv /etc/freeradius-web/user_edit.attrs /etc/freeradius-web/user_edit.attrs.default
        cp -f $DIR_CONF/user_edit.attrs /etc/freeradius-web/user_edit.attrs
# Ajout du mappage des attributs chillispot
        [ -e /etc/freeradius-web/sql.attrmap.default ] || mv /etc/freeradius-web/sql.attrmap /etc/freeradius-web/sql.attrmap.default
        cp -f $DIR_CONF/sql.attrmap /etc/freeradius-web/sql.attrmap
# Modification des attributs visibles sur les pages des statistiques (suppression NAS_IP et NAS_port)
        [ -e /etc/freeradius-web/sql.attrs.default ] || cp /etc/freeradius-web/sql.attrs /etc/freeradius-web/user_edit.attrs.default
        $SED "s?^NASIPAddress.*?NASIPAddress\tNas IP Address\tno?g" /etc/freeradius-web/sql.attrs
        $SED "s?^NASPortId.*?NASPortId\tNas Port\tno?g" /etc/freeradius-web/sql.attrs
        chown -R apache:apache /etc/freeradius-web
# Ajout de l'alias vers la page de "changement de mot de passe usager"
        cat <<EOF >> /etc/httpd/conf/webapps.d/alcasar.conf
Alias /pass/ "$DIR_WEB/manager/pass/"
<Directory $DIR_WEB/manager/pass>
        SSLRequireSSL
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        ErrorDocument 404 https://$PRIVATE_IP
</Directory>
EOF
        echo "- URL pour le changement du mot de passe usager : https://$PRIVATE_IP/pass/" >> $FIC_PARAM
} # End of param_web_radius ()

##########################################################################
##                      Fonction param_chilli                           ##
## - Paramètrage du fichier de configuration de coova-chilli           ##
## - Paramètrage de la page d'authentification (intercept.php)         ##
##########################################################################
param_chilli ()
{
# modification du générateur du fichier de conf
        [ -e /etc/chilli/functions.default ] || cp /etc/chilli/functions /etc/chilli/functions.default
        # suppression du domaine "coova.org" dans la primitive uamallowed
        $SED "s?www.coova.org,??g" /etc/chilli/functions
        # suppression de la primitive "uamanydns"
        $SED "s?uamanydns??g" /etc/chilli/functions
        # on fixe la socket de commande local (/var/run/chilli.sock)
        $SED "s?^CMDSOCK=.*?CMDSOCK=\$RUN_D/chilli.sock?g" /etc/chilli/functions
# modification du fichier d'initialisation
        [ -e /etc/init.d/chilli.default ] || cp /etc/init.d/chilli /etc/init.d/chilli.default
        # configuration d'eth1 (utile pour dnsmasq))
        $SED "s?ifconfig.*?ifconfig \$HS_LANIF $PRIVATE_IP?g" /etc/init.d/chilli
        # ajout de la fontion 'status' (utile pour la gestion du process)
        $SED "/^[\t ]*stop)/i\    status)\n        status chilli\n        RETVAL=$?\n        ;;\n" /etc/init.d/chilli
        # insertion d'une tempo sur le 'restart' pour permettre à tun0 d'être libérée
        $SED "/^[\t ]*\$0 start/i\        sleep 2" /etc/init.d/chilli
# création du fichier de conf
        cp /etc/chilli/defaults /etc/chilli/config
        $SED "s?^# HS_WANIF=.*?HF_WANIF=$EXTIF?g" /etc/chilli/config
        $SED "s?^HS_LANIF=.*?HS_LANIF=$INTIF?g" /etc/chilli/config
        $SED "s?^HS_NETWORK=.*?HS_NETWORK=$PRIVATE_NETWORK?g" /etc/chilli/config
        $SED "s?^HS_NETMASK=.*?HS_NETMASK=$PRIVATE_MASK?g" /etc/chilli/config
        $SED "s?^HS_UAMLISTEN=.*?HS_UAMLISTEN=$PRIVATE_IP?g" /etc/chilli/config
        $SED "s?^HS_UAMPORT=.*?HS_UAMPORT=$UAMPORT?g" /etc/chilli/config
        $SED "s?^# HS_DYNIP=.*?HS_DYNIP=$PRIVATE_DYN_IP?g" /etc/chilli/config
        $SED "s?^# HS_DYNIP_MASK=.*?HS_DYNIP_MASK=$PRIVATE_DYN_MASK?g" /etc/chilli/config
        $SED "s?^# HS_STATIP=.*?HS_STATIP=$PRIVATE_STAT_IP?g" /etc/chilli/config
        $SED "s?^# HS_STATIP_MASK.*?HS_STATIP_MASK=$PRIVATE_STAT_MASK?g" /etc/chilli/config
        $SED "s?^# HS_DNS_DOMAIN=.*?HS_DNS_DOMAIN=$DOMAIN?g" /etc/chilli/config
        $SED "s?^HS_DNS1=.*?HS_DNS1=$PRIVATE_IP?g" /etc/chilli/config
        $SED "s?^HS_DNS2=.*?HS_DNS2=$PRIVATE_IP?g" /etc/chilli/config
        $SED "s?^HS_UAMSECRET=.*?HS_UAMSECRET=$secretuam?g" /etc/chilli/config
        $SED "s?^HS_RADIUS=.*?HS_RADIUS=127.0.0.1?g" /etc/chilli/config
        $SED "s?^HS_RADIUS2=.*?HS_RADIUS2=127.0.0.1?g" /etc/chilli/config
        $SED "s?^HS_RADSECRET=.*?HS_RADSECRET=$secretradius?g" /etc/chilli/config
        $SED "s?^HS_UAMALLOW=.*?# HS_UAMALLOW?g" /etc/chilli/config
        $SED "s?^HS_UAMSERVER=.*?HS_UAMSERVER=$PRIVATE_IP?g" /etc/chilli/config
        $SED "s?^HS_UAMFORMAT=.*?HS_UAMFORMAT=https://\$HS_UAMSERVER/intercept.php?g" /etc/chilli/config
        $SED "s?^HS_UAMHOMEPAGE=.*?HS_UAMHOMEPAGE=?g" /etc/chilli/config
        $SED "s?^HS_UAMSERVICE=.*?# HS_UAMSERVICE?g" /etc/chilli/config
        $SED "s?^# HS_ANYIP=.*?HS_ANYIP=on?g" /etc/chilli/config
        $SED "s?^# HS_DNSPARANOIA=.*?HS_DNSPARANOIA=on?g" /etc/chilli/config
        $SED "s?^HS_LOC_NAME=.*?HS_LOC_NAME=\"$HOSTNAME\"?g" /etc/chilli/config
        $SED "s?^HS_WWWDIR.*?# HS_WWWDIR?g" /etc/chilli/config
        $SED "s?^HS_WWWBIN.*?# HS_WWWBIN?g" /etc/chilli/config
        $SED "s?^HS_PROVIDER_LINK.*?HS_PROVIDER_LINK=https://\$HS_UAMSERVER/?g" /etc/chilli/config
        echo "HS_COAPORT=3799" >> /etc/chilli/config
        echo "HS_ADMINTERVAL=0" >> /etc/chilli/config
# création des fichiers de sites, d'urls et d'adresses MAC de confiance
        echo -e "HS_UAMALLOW=\"\"" > /etc/chilli/alcasar-uamallowed
        echo -e "HS_UAMDOMAINS=\"\"" > /etc/chilli/alcasar-uamdomain
        $SED "s?^# HS_MACAUTHMODE=.*?HS_MACAUTHMODE=local?g" /etc/chilli/config
        echo -e "HS_MACALLOW=\"\"" > /etc/chilli/alcasar-macallowed
        chown root:apache /etc/chilli/alcasar-*
        chmod 660 /etc/chilli/alcasar-*
        echo ". /etc/chilli/alcasar-uamallowed" >> /etc/chilli/config
        echo ". /etc/chilli/alcasar-uamdomain" >> /etc/chilli/config
        echo ". /etc/chilli/alcasar-macallowed" >> /etc/chilli/config
        echo "- URL de deconnexion du portail : http://$PRIVATE_IP:$UAMPORT/logoff" >> $FIC_PARAM
# Définition du secret partagé entre coova-chilli et la page d'authentification (intercept.php)
        $SED "s?^\$uamsecret =.*?\$uamsecret = \"$secretuam\";?g" $DIR_WEB/intercept.php
        $SED "s?^\$userpassword=1.*?\$userpassword=1;?g" $DIR_WEB/intercept.php
        $SED "s?^\$organisme = .*?\$organisme = \"$ORGANISME\";?g" $DIR_WEB/intercept.php
# Suppression des modifications "iptables" effectuées lors du lancement du daemon coova
        $SED "s?^    iptables \$opt \$\*?#   iptables \$opt \$\*?g" /etc/chilli/up.sh
}  # End of param_chilli ()

##########################################################
##                      Fonction param_squid            ##
## - Paramètrage du proxy 'squid' en mode 'cache'      ##
## - Initialisation de la base de données              ##
##########################################################
param_squid ()
{
# paramètrage de Squid (connecté en série derrière Dansguardian)
        [ -e /etc/squid/squid.conf.default  ] || cp /etc/squid/squid.conf /etc/squid/squid.conf.default
# suppression des références 'localnet', 'icp', 'htcp' et 'always_direct'
        $SED "/^acl localnet/d" /etc/squid/squid.conf
        $SED "/^icp_access allow localnet/d" /etc/squid/squid.conf
        $SED "/^icp_port 3130/d" /etc/squid/squid.conf
        $SED "/^http_access allow localnet/d" /etc/squid/squid.conf
        $SED "/^htcp_access allow localnet/d" /etc/squid/squid.conf
        $SED "/^always_direct allow localnet/d" /etc/squid/squid.conf
# mode 'proxy transparent local'
        $SED "s?^http_port.*?http_port 127.0.0.1:$SQUID_PORT transparent?g" /etc/squid/squid.conf
# compatibilité des logs avec awstats
        $SED "s?^# emulate_httpd_log.*?emulate_httpd_log on?g" /etc/squid/squid.conf
        $SED "s?^access_log.*?access_log /var/log/squid/access.log?g" /etc/squid/squid.conf
# Initialisation du cache de Squid
        /usr/sbin/squid -z
}  # End of param_squid ()
       
##################################################################
##              Fonction param_dansguardian                     ##
## - Paramètrage du gestionnaire de contenu Dansguardian       ##
## - Copie de la blacklist de toulouse                          ##
##################################################################
param_dansguardian ()
{
# modification du fichier d'initialisation (correction de la procédure d'arret)
        [ -e /etc/init.d/dansguardian.default ] || cp /etc/init.d/dansguardian /etc/init.d/dansguardian.default
        cp -f $DIR_CONF/dansguardian-init /etc/init.d/dansguardian
        mkdir /var/dansguardian
        chown dansguardian /var/dansguardian
        [ -e /etc/dansguardian/dansguardian.conf.default ] || cp /etc/dansguardian/dansguardian.conf /etc/dansguardian/dansguardian.conf.default
# Le filtrage est désactivé par défaut
        $SED "s/^reportinglevel =.*/reportinglevel = -1/g" /etc/dansguardian/dansguardian.conf
# la page d'interception est en français
        $SED "s?^language =.*?language = french?g" /etc/dansguardian/dansguardian.conf
# on limite l'écoute de Dansguardian côté LAN
        $SED "s?^filterip =.*?filterip = $PRIVATE_IP?g" /etc/dansguardian/dansguardian.conf
# on chaîne Dansguardian au proxy antivirus HAVP
        $SED "s?^proxyport.*?proxyport = 8090?g" /etc/dansguardian/dansguardian.conf
# on remplace la page d'interception (template)
        cp -f $DIR_CONF/template.html /usr/share/dansguardian/languages/ukenglish/
        cp -f $DIR_CONF/template-fr.html /usr/share/dansguardian/languages/french/template.html
# on ne loggue que les deny (pour le reste, on a squid)
        $SED "s?^loglevel =.*?loglevel = 1?g" /etc/dansguardian/dansguardian.conf
# on désactive par défaut le controle de contenu des pages html
        $SED "s?^weightedphrasemode =.*?weightedphrasemode = 0?g" /etc/dansguardian/dansguardian.conf
        cp /etc/dansguardian/lists/bannedphraselist /etc/dansguardian/lists/bannedphraselist.default
        $SED "s?^[^#]?#&?g" /etc/dansguardian/lists/bannedphraselist # (on commente ce qui ne l'est pas)
# on désactive par défaut le contrôle d'URL par expressions régulières
        cp /etc/dansguardian/lists/bannedregexpurllist /etc/dansguardian/lists/bannedregexpurllist.default
        $SED "s?^[^#]?#&?g" /etc/dansguardian/lists/bannedregexpurllist # (on commente ce qui ne l'est pas)
# on désactive par défaut le contrôle de téléchargement de fichiers
        [ -e /etc/dansguardian/dansguardianf1.conf.default ] || cp /etc/dansguardian/dansguardianf1.conf /etc/dansguardian/dansguardianf1.conf.default
        $SED "s?^blockdownloads =.*?blockdownloads = off?g" /etc/dansguardian/dansguardianf1.conf
        [ -e /etc/dansguardian/lists/bannedextensionlist.default ] || mv /etc/dansguardian/lists/bannedextensionlist /etc/dansguardian/lists/bannedextensionlist.default
        [ -e /etc/dansguardian/lists/bannedmimetypelist.default ] || mv /etc/dansguardian/lists/bannedmimetypelist /etc/dansguardian/lists/bannedmimetypelist.default
        touch /etc/dansguardian/lists/bannedextensionlist
        touch /etc/dansguardian/lists/bannedmimetypelist
# on vide la liste des @IP du Lan ne subissant pas le filtrage WEB
        [ -e /etc/dansguardian/lists/exceptioniplist.default ] || mv /etc/dansguardian/lists/exceptioniplist /etc/dansguardian/lists/exceptioniplist.default
        touch /etc/dansguardian/lists/exceptioniplist
# on copie les fichiers de la BL de toulouse
        [ -d /etc/dansguardian/lists/blacklists ] && mv /etc/dansguardian/lists/blacklists /etc/dansguardian/lists/blacklists.default
        tar zxvf $DIR_CONF/blacklists.tar.gz --directory=/etc/dansguardian/lists/ 2>&1 >/dev/null
        cp -f $DIR_CONF/VERSION-BL $DIR_WEB/
        chown apache:apache $DIR_WEB/VERSION-BL
# on crée la BL secondaire
        mkdir /etc/dansguardian/lists/blacklists/ossi
        touch /etc/dansguardian/lists/blacklists/ossi/domains
        touch /etc/dansguardian/lists/blacklists/ossi/urls
# On crée une WhiteList vide
        [ -e /etc/dansguardian/lists/exceptionsitelist.default ] || mv /etc/dansguardian/lists/exceptionsitelist  /etc/dansguardian/lists/exceptionsitelist.default
        [ -e /etc/dansguardian/lists/exceptionurllist.default ] || mv /etc/dansguardian/lists/exceptionurllist  /etc/dansguardian/lists/exceptionurllist.default
        touch /etc/dansguardian/lists/exceptionsitelist
        touch /etc/dansguardian/lists/exceptionurllist
# on configure le filtrage de site WEB
        [ -e /etc/dansguardian/lists/bannedsitelist.default ] || cp /etc/dansguardian/lists/bannedsitelist /etc/dansguardian/lists/bannedsitelist.default
        $SED "s?^[^#]?#&?g" /etc/dansguardian/lists/bannedsitelist # (on commente ce qui ne l'est pas)
# on bloque les sites ne possédant pas de nom de domaine (ex: http://12.13.14.15)
        $SED "s?^#\*ip?\*ip?g" /etc/dansguardian/lists/bannedsitelist
# on bloque le ssl sur port 80
        $SED "s?^#\*\*s?\*\*s?g" /etc/dansguardian/lists/bannedsitelist
# (pris en compte par dnsmasq)  cat $DIR_CONF/bannedsitelist >> /etc/dansguardian/lists/bannedsitelist
# on configure le filtrage d'url
[ -e /etc/dansguardian/lists/bannedurllist.default ] || cp /etc/dansguardian/lists/bannedurllist /etc/dansguardian/lists/bannedurllist.default
        $SED "s?^[^#]?#&?g" /etc/dansguardian/lists/bannedurllist # (on commente ce qui ne l'est pas)
        cat $DIR_CONF/bannedurllist >> /etc/dansguardian/lists/bannedurllist
        chown -R dansguardian:apache /etc/dansguardian/
        chmod -R g+rw /etc/dansguardian
} # End of param_dansguardian ()

##################################################################
##                      Fonction antivirus                      ##
## - configuration havp + clamav                                ##
##################################################################
antivirus ()           
{
# création de l'usager 'havp'
        havp_exist=`grep havp /etc/passwd|wc -l`
        if [ "$havp_exist" == "1" ]
        then
              userdel -r havp
        fi
        groupadd -f havp
        useradd -g havp havp
# création de la partition de stockage temporaire (100Mo)
        dd if=/dev/zero of=/tmp/havp-disk bs=1024k count=30
        mkfs.ext4 -qF /tmp/havp-disk
        echo "# Entry for havp tmp files scan partition" >> /etc/fstab
        echo "/tmp/havp-disk /var/tmp/havp ext4 loop,mand,noatime,async" >> /etc/fstab
        $SED "/$HAVP_BIN -c $HAVP_CONFIG/i chown -R havp:havp \/var\/tmp\/havp" /etc/init.d/havp
        mkdir -p /var/tmp/havp /var/log/havp
        chown -R havp /var/log/havp /var/run/havp
# configuration d'HAVP
        [ -e /etc/havp/havp.config.default ] || cp /etc/havp/havp.config /etc/havp/havp.config.default
        $SED "/^REMOVETHISLINE/d" /etc/havp/havp.config
        $SED "s?^# PARENTPROXY.*?PARENTPROXY 127.0.0.1?g" /etc/havp/havp.config
        $SED "s?^# PARENTPORT.*?PARENTPORT 3128?g" /etc/havp/havp.config
        $SED "s?^# PORT.*?PORT 8090?g" /etc/havp/havp.config
        $SED "s?^# BIND_ADDRESS.*?BIND_ADDRESS 127.0.0.1?g" /etc/havp/havp.config
        $SED "s?^ENABLECLAMLIB.*?ENABLECLAMLIB true?g" /etc/havp/havp.config
# mise à jour de la base antivirale de clamav toutes les 2 heures
        $SED "s?^Checks.*?Checks 12?g" /etc/freshclam.conf
        $SED "s?^NotifyClamd.*?# NotifyClamd /etc/clamd.conf?g" /etc/freshclam.conf
}

##################################################################################
##                              Fonction firewall                               ##
## - adaptation des scripts du parefeu                                          ##
## - mise en place des règles et sauvegarde pour un lancement automatique      ##
## - configuration Ulogd                                                        ##
##################################################################################
firewall ()
{
        $SED "s?^EXTIF=.*?EXTIF=\"$EXTIF\"?g" $DIR_DEST_BIN/alcasar-iptables.sh  $DIR_DEST_BIN/alcasar-iptables-bypass.sh
        $SED "s?^INTIF=.*?INTIF=\"$INTIF\"?g" $DIR_DEST_BIN/alcasar-iptables.sh  $DIR_DEST_BIN/alcasar-iptables-bypass.sh
        $SED "s?^PRIVATE_NETWORK_MASK=.*?PRIVATE_NETWORK_MASK=\"$PRIVATE_NETWORK_MASK\"?g" $DIR_DEST_BIN/alcasar-iptables.sh  $DIR_DEST_BIN/alcasar-iptables-bypass.sh
        $SED "s?^PRIVATE_IP=.*?PRIVATE_IP=\"$PRIVATE_IP\"?g" $DIR_DEST_BIN/alcasar-iptables.sh $DIR_DEST_BIN/alcasar-iptables-bypass.sh
        chmod o+r $DIR_DEST_BIN/alcasar-iptables.sh #lecture possible pour apache (interface php du filtrage réseau)
        [ -d /var/log/firewall ] || mkdir -p /var/log/firewall
        [ -e /var/log/firewall/firewall.log ] || touch /var/log/firewall/firewall.log
        chown -R root:apache /var/log/firewall
        chmod 750 /var/log/firewall
        chmod 640 /var/log/firewall/firewall.log
        $SED "s?^file=\"/var/log/ulogd.syslogemu\"?file=\"/var/log/firewall/firewall.log\"?g" /etc/ulogd.conf
        sh $DIR_DEST_BIN/alcasar-iptables.sh
}  # End of firewall ()

##################################################################################
##                              Fonction param_awstats                          ##
## - configuration de l'interface des logs de consultation WEB (AWSTAT)         ##
##################################################################################
param_awstats()
{
        ln -s /var/www/awstats $DIR_WEB/awstats
        cp /etc/awstats/awstats.conf /etc/awstats/awstats.conf.default
        $SED "s?^LogFile=.*?LogFile=\"/var/log/squid/access.log\"?g" /etc/awstats/awstats.conf
        $SED "s?^LogFormat=.*?LogFormat=4?g" /etc/awstats/awstats.conf
        $SED "s?^SiteDomain=.*?SiteDomain=\"$HOSTNAME\"?g" /etc/awstats/awstats.conf
        $SED "s?^HostAliases=.*?HostAliases=\"$PRIVATE_IP\"?g" /etc/awstats/awstats.conf
        $SED "s?^DNSLookup=.*?DNSLookup=0?g" /etc/awstats/awstats.conf
        $SED "s?^DirData=.*?DirData=\"/var/lib/awstats\"?g" /etc/awstats/awstats.conf   # corrige le fichier de config awstats natif ...
        $SED "s?^StyleSheet=.*?StyleSheet=\"/css/style.css\"?g" /etc/awstats/awstats.conf
        $SED "s?^BuildReportFormat=.*?BuildReportFormat=xhtml?g" /etc/awstats/awstats.conf
        $SED "s?^UseFramesWhenCGI=.*?UseFramesWhenCGI=0?g" /etc/awstats/awstats.conf
        cat <<EOF >> /etc/httpd/conf/webapps.d/alcasar.conf
<Directory $DIR_WEB/awstats>
        SSLRequireSSL
        Options ExecCGI
        AddHandler cgi-script .pl
        DirectoryIndex awstats.pl
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from $PRIVATE_NETWORK_MASK
        require valid-user
        AuthType digest
        AuthName $HOSTNAME
        BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
        AuthUserFile $DIR_WEB/digest/key_admin
        ErrorDocument 404 https://$PRIVATE_IP/
</Directory>
SetEnv PERL5LIB /usr/share/awstats/lib:/usr/share/awstats/plugins
EOF
} # End of param_awstats ()

##########################################################
##              Fonction param_dnsmasq                  ##
##########################################################
param_dnsmasq ()
{
        [ -d /etc/dnsmasq.d ] || mkdir /etc/dnsmasq.d
        [ -d /var/log/dnsmasq ] || mkdir /var/log/dnsmasq
        [ -e /etc/dnsmasq.conf ] && cp /etc/dnsmasq.conf /etc/dnsmasq.conf.default
        $SED "s?^[^#]?#&?g" /etc/dnsmasq.conf                                   # (on commente ce qui ne l'est pas)
        $SED "s?^#conf-dir=.*?conf-dir=/etc/dnsmasq.d?g" /etc/dnsmasq.conf      # les fichiers de config se trouvent dans /etc/dnsmasq.d/*
        $SED "s?^DHCP_LEASE=.*?DHCP_LEASE=/var/log/dnsmasq/lease.log?g" /etc/sysconfig/dnsmasq # fichier contenant les baux
# on crée le fichier de conf spécifique pour Alcasar
        cat << EOF > /etc/dnsmasq.d/alcasar-dnsmasq.conf
# Inclusion de la blacklist <domains> de Toulouse dans la configuration
conf-dir=/usr/local/etc/alcasar-dnsfilter-enabled

listen-address=$PRIVATE_IP
listen-address=127.0.0.1
no-dhcp-interface=$INTIF
bind-interfaces

cache-size=256
domain=$DOMAIN
domain-needed
expand-hosts
bogus-priv
filterwin2k
server=$DNS1
server=$DNS2

dhcp-range=$ORGANISME,$PRIVATE_DYN_FIRST_IP,$PRIVATE_DYN_LAST_IP,$PRIVATE_MASK,12h
#dhcp-option=3,1.2.3.4
#dhcp-option=option:router,1.2.3.4
#dhcp-option=42,0.0.0.0
#dhcp-option=option:ntp-server,192.168.0.4,10.10.0.5

# Exemple de configuration statique : <@MAC>,<name>,<@IP>,<MASK>,<ttl bail>
#dhcp-host=11:22:33:44:55:66,ssic-test,192.168.10.20,255.255.255.0,45m
EOF
# On crée la structure du DNS-blackhole :
#       - import des domaines de la BL Toulouse dans /usr/local/etc/alcasar-dns-availabled (1 fichier par domaine)
#       - lien symbolique de ces fichiers dans /usr/local/etc/alcasar-dns-enabled pour activation/désactivation
        mkdir /usr/local/etc/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
        chown -R 770 /usr/local/etc/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
        chown -R root:apache /usr/local/etc/{alcasar-dnsfilter-available,alcasar-dnsfilter-enabled}
        $SED "s?^IP_RETOUR=.*?IP_RETOUR=\"$PRIVATE_IP\"?g" /usr/local/bin/alcasar-dnsfilter-import.sh
        /usr/local/bin/alcasar-dnsfilter-import.sh
        /usr/local/bin/alcasar-dnsfilter-activate.sh
} # End dnsmasq

##########################################################
##              Fonction cron                           ##
## - Mise en place des différents fichiers de cron     ##
##########################################################
cron ()
{
# Modif du fichier 'crontab' pour passer les cron à minuit au lieu de 04h00
        [ -e /etc/crontab.default ] || cp /etc/crontab /etc/crontab.default
        cat <<EOF > /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root nice -n 19 run-parts --report /etc/cron.hourly
02 0 * * * root nice -n 19 run-parts --report /etc/cron.daily
22 0 * * 0 root nice -n 19 run-parts --report /etc/cron.weekly
42 0 1 * * root nice -n 19 run-parts --report /etc/cron.monthly
EOF
        [ -e /etc/anacrontab.default ] || cp /etc/anacrontab /etc/anacrontab.default
        cat <<EOF >> /etc/anacrontab
7       10      cron.logExport          nice /etc/cron.d/export_log
7       15      cron.logClean           nice /etc/cron.d/clean_log
7       20      cron.importClean        nice /etc/cron.d/clean_import
EOF
# suppression des fichiers de logs de plus d'un an (tous les lundi à 4h30)
        cat <<EOF > /etc/cron.d/clean_log
30 4 * * 1 root $DIR_DEST_BIN/alcasar-log-clean.sh
EOF
# export de la base des usagers (tous les lundi à 4h45)
        cat <<EOF > /etc/cron.d/mysql
45 4 * * 1 root $DIR_DEST_SBIN/alcasar-mysql.sh -dump
EOF
# export des log squid, firewall et apache (tous les lundi à 5h00)
        cat <<EOF > /etc/cron.d/export_log
#!/bin/sh
00 5 * * 1 root $DIR_DEST_BIN/alcasar-log-export.sh
EOF
# mise à jour des stats de consultation WEB toutes les 30'  ## existe en double pour le daily sans l'@IP
# sans mèl ( > /dev/null 2>&1)
        cat << EOF > /etc/cron.d/awstats
*/30 * * * * root /var/www/awstats/awstats.pl -config=localhost -update >/dev/null 2>&1
EOF
# suppression des fichiers de mots de passe lors d'imports massifs par fichier de plus de 24h
        cat << EOF > /etc/cron.d/clean_import
30 * * * *  root /usr/local/bin/alcasar-import-clean.sh
EOF
# mise à jour des stats de connexion (accounting). Scripts provenant de "dialupadmin" (rpm freeradius-web) (cf. wiki.freeradius.org/Dialup_admin).
# on écrase le crontab d'origine installé par le RPM "freeradius-web" (bug remonté à qa.mandriva.com : 46739).
# 'tot_stats' (tout les jours à 01h01) : aggrégat des connexions journalières par usager (renseigne la table 'totacct')
# 'monthly_tot_stat' (tous les jours à 01h05) : aggrégat des connexions mensuelles par usager (renseigne la table 'mtotacct')
# 'truncate_raddact' (tous les 1er du mois à 01h10) : supprime les entrées journalisées plus vieilles que '$back_days' jours (défini ci-après)
# 'clean_radacct' (tous les 1er du mois à 01h15) : ferme les session ouvertes de plus de '$back_days' jours (défini ci-après)
        $SED "s?^\$back_days.*?\$back_days = 365;?g" /usr/bin/truncate_radacct
        $SED "s?^\$back_days.*?\$back_days = 30;?g" /usr/bin/clean_radacct
        rm -f /etc/cron.daily/freeradius-web
        rm -f /etc/cron.monthly/freeradius-web
        cat << EOF > /etc/cron.d/freeradius-web
1 1 * * * root /usr/bin/tot_stats > /dev/null 2>&1
5 1 * * * root /usr/bin/monthly_tot_stats > /dev/null 2>&1
10 1 1 * * root /usr/bin/truncate_radacct > /dev/null 2>&1
15 1 1 * * root /usr/bin/clean_radacct > /dev/null 2>&1
EOF
# activation du "chien de garde" (watchdog) toutes les 3' afin de déconnecter les usagers authentifiés dont la station est usurpée ou ne répond plus
        cat << EOF > /etc/cron.d/watchdog
*/3 * * * * root $DIR_DEST_BIN/alcasar-watchdog.sh > /dev/null 2>&1
EOF
} # End cron

##################################################################
##                      Fonction post_install                   ##
## - Modification des bannières (locales et ssh) et des prompts ##
## - Installation de la structure de chiffrement pour root      ##
## - Mise en place du sudoers et de la sécurité sur les fichiers##
## - Mise en place du la rotation des logs                      ##
## - Configuration dans le cas d'une mise à jour               ##
##################################################################
post_install()
{
# adaptation du script "chien de garde" (watchdog)
        $SED "s?^PRIVATE_IP=.*?PRIVATE_IP=\"$PRIVATE_IP\"?g" $DIR_DEST_BIN/alcasar-watchdog.sh
# création de la bannière locale
        [ -e /etc/mandriva-release.default ]  || cp /etc/mandriva-release /etc/mandriva-release.default
cat <<EOF > /etc/mandriva-release
 Bienvenue sur $HOSTNAME

EOF
# création de la bannière SSH
        cp /etc/mandriva-release /etc/ssh/alcasar-banner-ssh
        chmod 644 /etc/ssh/alcasar-banner-ssh ; chown root:root /etc/ssh/alcasar-banner-ssh
        [ -e /etc/ssh/sshd_config.default ] || cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
        $SED "s?^Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
        $SED "s?^#Banner.*?Banner /etc/ssh/alcasar-banner-ssh?g" /etc/ssh/sshd_config
# sshd écoute côté LAN
        $SED "s?^#ListenAddress 0\.0\.0\.0?ListenAddress $PRIVATE_IP?g" /etc/ssh/sshd_config
# sshd n'est pas lancé automatiquement au démarrage
        /sbin/chkconfig --del sshd
# Coloration des prompts
        [ -e /etc/bashrc.default ]  || cp /etc/bashrc /etc/bashrc.default
        cp -f $DIR_CONF/bashrc /etc/. ; chmod 644 /etc/bashrc ; chown root:root /etc/bashrc
# Droits d'exécution pour utilisateur apache et sysadmin
        [ -e /etc/sudoers.default ]  || cp /etc/sudoers /etc/sudoers.default
        cp -f $DIR_CONF/sudoers /etc/. ; chmod 440 /etc/sudoers ; chown root:root /etc/sudoers
        $SED "s?^Host_Alias.*?Host_Alias        LAN_ORG=$PRIVATE_NETWORK_MASK,localhost         #réseau de l'organisme?g" /etc/sudoers
# prise en compte de la rotation des logs sur 1 an (concerne mysql, httpd, dansguardian, squid, radiusd, ulogd)
        cp -f $DIR_CONF/logrotate.d/* /etc/logrotate.d/
        chmod 644 /etc/logrotate.d/*
# processus lancés par défaut au démarrage
        $SED "s?^# Default-Start.*?# Default-Start: 3 4 5?g" /etc/init.d/mysqld
        $SED "s?^# Default-Stop.*?# Default-Stop: 0 1 2?g" /etc/init.d/mysqld   # pour éviter les alertes de dépendance de services (netfs)
        $SED "s?^# chkconfig:.*?# chkconfig: 23 61 40?g" /etc/init.d/dnsmasq    # pour démarrer dnsmasq avec eth1 up avant chilli - utile ??
        for i in netfs ntpd iptables ulogd dnsmasq squid chilli httpd radiusd mysqld dansguardian havp freshclam
        do
                /sbin/chkconfig --add $i
        done
# On affecte le niveau de sécurité du système : type "fileserver"
        $SED "s?BASE_LEVEL=.*?BASE_LEVEL=fileserver?g" /etc/security/msec/security.conf
# On supprime la vérification du mode promiscious des interfaces réseaux ( nombreuses alertes sur eth1 dûes à Tun0 )
        $SED "s?CHECK_PROMISC=.*?CHECK_PROMISC=no?g" /etc/security/msec/level.fileserver
# On supprime les log_martians
        $SED "s?^ENABLE_LOG_STRANGE_PACKETS=.*?ENABLE_LOG_STRANGE_PACKETS=no?g" /etc/security/msec/level.fileserver
# On supprime la gestion du <CTRL>+<ALT>+<SUPPR> et des Magic SysReq Keys
        $SED "s?^ALLOW_REBOOT=.*?ALLOW_REBOOT=no?g" /etc/security/msec/level.fileserver
# On mets en place la sécurité sur les fichiers
# des modif par rapport à radius update
        cat <<EOF > /etc/security/msec/perm.local
/var/log/firewall/                      root.apache     750
/var/log/firewall/*                     root.apache     640
/etc/security/msec/perm.local           root.root       640
/etc/security/msec/level.local          root.root       640
/etc/freeradius-web                     root.apache     750
/etc/freeradius-web/admin.conf          root.apache     640
/etc/freeradius-web/config.php          root.apache     640
/etc/raddb/dictionnary                  root.radius     640
/etc/raddb/ldap.attrmap                 root.radius     640
/etc/raddb/hints                        root.radius     640
/etc/raddb/huntgroups                   root.radius     640
/etc/raddb/attrs.access_reject          root.radius     640
/etc/raddb/attrs.accounting_response    root.radius     640
/etc/raddb/acct_users                   root.radius     640
/etc/raddb/preproxy_users               root.radius     640
/etc/raddb/modules/ldap                 radius.apache   660
/etc/raddb/sites-available/alcasar      radius.apache   660
/etc/pki/*                              root.apache     750
EOF
        /usr/sbin/msec
# modification /etc/inittab
        [ -e /etc/inittab.default ] || cp /etc/inittab /etc/inittab.default
# On ne garde que 3 terminaux
        $SED "s?^4.*?#&?g" /etc/inittab
        $SED "s?^5.*?#&?g" /etc/inittab
        $SED "s?^6.*?#&?g" /etc/inittab
# dans le cas d'une mise à jour, on charge la conf d'une version précédente
if [ "$mode" = "update" ]
then
        $DIR_DEST_BIN/alcasar-conf.sh -load
fi
        cd $DIR_INSTALL
        echo ""
        echo "#############################################################################"
        echo "#                        Fin d'installation d'ALCASAR                       #"
        echo "#                                                                           #"
        echo "#         Application Libre pour le Contrôle Authentifié et Sécurisé        #"
        echo "#                     des Accès au Réseau ( ALCASAR )                       #"
        echo "#                                                                           #"
        echo "#############################################################################"
        echo
        echo "- ALCASAR sera fonctionnel après redémarrage du système"
        echo
        echo "- Lisez attentivement la documentation d'exploitation"
        echo
        echo "- L'interface de gestion est consultable à partir de n'importe quel poste"
        echo "  situé sur le réseau de consultation à l'URL https://$PRIVATE_IP "
        echo "                                   ou à l'URL https://alcasar "
        echo
        echo "                   Appuyez sur 'Entrée' pour continuer"
        read a
        clear
        reboot
} # End post_install ()

#################################
#  Boucle principale du script  #
#################################
usage="Usage: alcasar.sh {-i or --install} | {-u or --uninstall}"
nb_args=$#
args=$1
if [ $nb_args -eq 0 ]
then
        nb_args=1
        args="-h"
fi
case $args in
        -\? | -h* | --h*)
                echo "$usage"
                exit 0
                ;;
        -i | --install)
                header_install
                testing
# On teste la présence d'une version déjà installée
                header_install
                if [ -e $DIR_WEB/VERSION ]
                then
                        echo -n "La version "; echo -n `cat $DIR_WEB/VERSION`; echo " d'ALCASAR est déjà installée";
                        response=0
                        PTN='^[oOnN]$'
                        until [[ $(expr $response : $PTN) -gt 0 ]]
                        do
                                echo -n "Voulez-vous effectuer une mise à jour (O/n)? ";
                                read response
                        done
                        if [ "$response" = "o" ] || [ "$response" = "O" ]
                        then
# On crée le fichier de conf de la version actuelle
                                chmod u+x $DIR_SCRIPTS/alcasar-conf.sh
                                $DIR_SCRIPTS/alcasar-conf.sh -create
                        fi
# On désinstalle la version actuelle
                $DIR_SCRIPTS/sbin/alcasar-uninstall.sh
                fi
# On teste la version du système
                fic=`cat /etc/product.id`
                old="$IFS"
                IFS=","
                set $fic
                for i in $*
                do
                        if [ "`echo $i|grep version|cut -d'=' -f1`" == "version" ]
                        then
                                version=`echo $i|cut -d"=" -f2`
                        fi
                done
                IFS="$old"
                if [ ! "$version" = "$MDV_NEEDED" ]
                then
                        echo "La version actuelle de Linux Mandriva va être mise à jour en ($MDV_NEEDED). En cas de problème, suivez la procédure manuelle (cf. doc exploitation)"
                        sleep 5
                        $DIR_SCRIPTS/sbin/alcasar-dist-upgrade.sh
                fi
                if [ -e /tmp/alcasar-conf.tar.gz ]
                then
                echo "#### Installation avec mise à jour ####"
# On récupère le nom d'organisme à partir de fichier de conf
                        tar -xvf /tmp/alcasar-conf.tar.gz conf/hostname
                        ORGANISME=`cat $DIR_CONF/hostname|cut -b 9-`
                        hostname `cat $DIR_CONF/hostname`
                        mode="update"
                else
                        mode="install"
                fi
                for func in init network gestion AC init_db param_radius param_web_radius param_chilli param_squid param_dansguardian antivirus firewall param_awstats param_dnsmasq cron post_install

                do
                        $func
 echo "*** 'debug' : end of function $func ***"; read a
                done
                ;;
        -u | --uninstall)
                if [ ! -e $DIR_DEST_SBIN/alcasar-uninstall.sh ]
                then
                        echo "Aucune version d'ALCASAR n'a été trouvée.";
                        exit 0
                fi
                response=0
                PTN='^[oOnN]$'
                until [[ $(expr $response : $PTN) -gt 0 ]]
                do
                        echo -n "Voulez-vous créer le fichier de conf de la version actuelle (0/n)? "
                        read response
                done
                if [ "$reponse" = "o" ] || [ "$reponse" = "O" ]
                then
                        $DIR_SCRIPT/alcasar-conf.sh -create
                fi
# On désinstalle la version actuelle
                $DIR_SCRIPTS/sbin/alcasar-uninstall.sh
                ;;
        *)
                echo "Argument inconnu :$1";
                echo "$usage"
                exit 1
                ;;
esac
# end of script