#!/bin/bash
#
# Nom : exxl_diagnostic
# Description : Detection de problemes courants. Simple consultation, pas d'ecriture.



###########################################
## Utilisation de ce script V1 sur les deux modules eSbl et eCdl
## nécessite la gestion des variables type serveur et type version

if [[ "$(CreoleGet ecdl_type_serv nonEcdl)" == "ecdl" ]]; then
    type_v=$(CreoleGet ecdl_type_version)
    type_s=$(CreoleGet ecdl_type_serv)
    else
        if [[ "$(CreoleGet type_serv nonEsbl)" == "esbl" ]]; then
            type_v=$(CreoleGet type_version)
            type_s=$(CreoleGet type_serv)
        else
            type_v="non reconnu"
            type_s="non reconnu"
        fi
    fi

## gestion du rapport - devrait disparaître avec adaptation 'diagnose'
##

    diagnostic_version="1.0.4"

    emplacement="/var/tmp"
    tmp_local=$emplacement"/.tmplocal"

    date_et_heure=$(date +%d-%m-%Y-%H-%M-%S)
    touch $emplacement"/diagnostic_du_"$date_et_heure
    detail=$emplacement"/diagnostic_du_"$date_et_heure

    clear

    echo "Diagnostic v.$diagnostic_version du $(date +%d.%m.%Y-%H:%M:%S)."
    echo ""



## type serveur - devrait disparaître avec adaptation 'diagnose'
##


    if [[ "$type_v" == "-v2mi" ]]
        then version="V2 Migre"
        else
            if [[ "$type_v" == "-v2" ]]; then
                version="V2 Natif"
            else
                echo "Probleme ! Serveur non reconnu."
                version=$type_v
            fi
    fi
    echo "Serveur" $type_s $version



###########################################
# IP, nom et base du serveur
# Versions du noyau et de samba
#

##

domaine_ligne=`grep -v "\(#\\)" /etc/samba/smb.conf | grep "workgroup"`
domaine_nom=${domaine_ligne#*= }

adresses_ip=`/sbin/ifconfig |grep -B1 "inet adr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'`


    echo "Adresses IP :" $adresses_ip

    echo "Nom Netbios :" `hostname`

    echo "Domaine :" $domaine_nom

    echo "Base :" `lsb_release -i -s; lsb_release -r -s`
    echo "Noyau :" `uname -r`

    echo "Samba :" `smbd -V`

    echo ""

    ## redirection pour le rapport
    echo "# ifconfig" >> $detail
    /sbin/ifconfig >> $detail

    echo "# hostname" >> $detail
    hostname >> $detail

    echo "# lsb_release -a" >> $detail
    lsb_release -a 2>> $detail 1>>$detail

    echo "# uname -r" >> $detail
    uname -r >> $detail

    echo "# smbd -V" >> $detail
    smbd -V >> $detail

    echo "" >> $detail
    echo "# /etc/samba/smb.conf" >> $detail
    cat /etc/samba/smb.conf >> $detail
    echo "# /data/etc/smb-local.conf" >> $detail
    cat /data/etc/smb-local.conf >> $detail



###########################################
# Charge Systeme
#

load_average=`uptime | awk -F "load average: " '{ print $2 }'`
memoire_utilisee=`free -mto | grep Mem: | awk '{ print $3 }'`
memoire_totale=`free -mto | grep Mem: | awk '{ print $2 }'`

    echo "Charge processeur : "$load_average
    echo "Charge memoire : "$memoire_utilisee"/"$memoire_totale" Mo"

    echo ""

    ## redirection pour le rapport
    echo "# uptime" >> $detail
    uptime >> $detail
    echo "# free" >> $detail
    free >> $detail


###########################################
# Partition pleine, non montee ?
# Saturation d'inodes ?
# /opt ou /opt/arkeia liens symboliques ?
# Prise en charge des ACLs ?
# Encodage UTF-8 des arborescences de noms ?
# Secteurs defectueux ?
#

partition_pleine=`df | grep "100%"`
saturation_inodes=`df -i | grep "100%"`
mount_acls=`mount | grep acl | awk -F " " '{ print $3 }'`

if [ -f "/var/log/rsyslog/local/smbd/smbd.err.log" ]; then
    mauvais_encodage=`cat /var/log/rsyslog/local/smbd/smbd.err.log | grep "Conversion error"`
fi

secteurs_defectueux=`cat /var/log/dmesg | grep "I/O error"`


    if [[ $partition_pleine ]]
        then echo "Probleme ! Partition pleine : " $partition_pleine
        else echo "Il n'y a pas de partitions pleines."
    fi

    if [[ $saturation_inodes ]]
        then echo "Probleme ! Saturation des inodes : " $saturation_inodes
        else echo "Il n'y a pas de saturation des inodes."
    fi

    if [ -d "/bureautique" ]
        then echo "La partition bureautique est montee."
        else echo "Probleme ! La partition bureautique n'est pas montee."
    fi

    if [[ $mount_acls ]]
        then echo "La partition bureautique gere les ACLs."
        else echo "Probleme ! La partition bureautique ne gere pas les ACLs."
    fi

    if [[ $mauvais_encodage ]]
        then echo "Probleme ! L'encodage des noms de fichiers et repertoires est incorrect."
        else echo "L'encodage des noms de fichiers et repertoires est correct."
    fi

    if [[ $secteurs_defectueux ]]
        then echo "Probleme ! Le disque comporte des secteurs defectueux."
        else echo "Le disque ne remonte pas de secteurs defectueux."
    fi

    echo ""

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# df -h" >> $detail
    df -h >> $detail
    echo "# df -i" >> $detail
    df -i >> $detail
    echo "" >> $detail
    echo "# ls /bureautique" >> $detail
    ls /bureautique >> $detail

###########################################
# Serveur bureautique dans le domaine ?
#
# pour les serveurs eSbl

    if [[ "$type_s" == "esbl" ]]
        then
        if [[ `net rpc testjoin` ]]
            then echo "Le serveur est dans le domaine" $domaine_nom"."
            else echo "Probleme ! Le serveur n'est pas dans le domaine" $domaine_nom"."
        fi
        if [[ `wbinfo -t` ]]
        then echo "Le serveur est dans le domaine et le service winbind est fonctionnel (wbinfo -t Ok)."
            else echo "Probleme ! Le service winbind n'est pas fonctionnel."
        fi

        ## redirection pour le rapport
        echo "" >> $detail
        echo "# net rpc testjoin" >> $detail
        net rpc testjoin >> $detail
        echo "" >> $detail
        echo "# wbinfo -t" >> $detail
        wbinfo -t >> $detail
    fi

###########################################
# Etat des services samba et winbind
#


    testparm -s > /dev/null 2>1

    if [[ $? == 0 ]]
        then echo "Le parametrage samba ne remonte pas d'erreur de syntaxe."
        else echo "Probleme ! Le parametrage samba remonte une ou plusieurs erreurs de syntaxe."
    fi

    if [[ `wbinfo -p` ]]
    then echo "Le service winbind est actif (wbinfo -p Ok)."
        else echo "Probleme ! Le service winbindd n'est pas actif."
    fi

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# wbinfo -p" >> $detail
    wbinfo -p >> $detail



###########################################
# Erreur winbind de cache abîmé
# ou limite des UID/GID ?
#

if [ -f "/var/log/rsyslog/local/winbindd/winbindd.err.log" ]; then
    cache_abime_bad=`cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "bad magic"`
    limite_uid=`cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "range full"`
    cache_abime_eof=`cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "beyond eof"`
fi


    if [[ ! ( -z $cache_abime_bad ) ]]
        then echo "Probleme ! Le cache winbind est abime : erreur 'bad magic'."
    fi

    if [[ ! ( -z $cache_abime_eof ) ]]
        then echo "Probleme ! Le cache winbind est abime : erreur 'beyond eof'."
    fi

    if [[ -z $cache_abime_bad && -z $cache_abime_eof ]]
        then echo "Le cache winbind semble correct."
    fi

    if [[ ! ( -z $limite_uid ) ]]
        then echo "Probleme ! La limite des UID disponibles est atteinte."
        else echo "La limite des UID n'est pas atteinte."
    fi

echo ""

    ## redirection pour le rapport
    echo "" >> $detail
    echo '# cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "bad magic"' >> $detail
    echo $cache_abime_bad >> $detail
    echo '# cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "beyond eof"' >> $detail
    echo $cache_abime_eof >> $detail
    echo '# cat /var/log/rsyslog/local/winbindd/winbindd.err.log | grep -i "range full"' >> $detail
    echo $limite_uid >> $detail


###########################################
# Test du DNS
#

    test_distant1=$(echo $(CreoleGet test_distant_domaine)|awk -F " " '{print $1}')
    if [[ $(ping -c 1 $test_distant1) ]]
        then echo "Le DNS semble fonctionner."
        else echo "Probleme ! Le DNS ne fonctionne pas : le ping $test_distant1 échoue."
    fi

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# ping -c 1 $test_distant1" >> $detail
    ping -c 1 $test_distant1 >> $detail

    echo ""


###########################################
# Résolution de noms et remontées des WINS
#

wins_brut=`grep -v "\(#\\)" /etc/samba/smb.conf | grep "wins server"`
wins_ligne=(${wins_brut#*=})
wins_tableau=${wins_ligne[@]}


    echo "Vérification de la résolution de nom netbios :"
    if [[ ! ( -z $wins_tableau ) ]]
        then echo "Utilisation des services WINS" $wins_tableau
        else echo "Pas de services WINS utilises."
    fi

    echo ""

    echo "PDC via broadcast :"
    echo "    "`nmblookup -R $domaine_nom#1B | grep 1b | awk '{ print $1}'`;

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# nmblookup -R $domaine_nom#1B" >> $detail
    nmblookup -R $domaine_nom#1B >> $detail



    i=0
    for wins in ${wins_tableau[@]}
        do pdc_tableau[$i]=`nmblookup -R -U $wins $domaine_nom#1B | grep 1b | awk '{ print $1}' | sort -u`;

            ## redirection pour le rapport
            echo "" >> $detail
            echo "# nmblookup -R -U $wins $domaine_nom#1B" >> $detail
            nmblookup -R -U $wins $domaine_nom#1B >> $detail


            echo "PDC via le serveur WINS "$wins" :"
            if [ ${pdc_tableau[$i]} == name_query ]
                then echo "    Probleme ! Ce WINS ne retourne pas le controleur : erreur 'name query failed'.";
                else echo "    "${pdc_tableau[$i]}
            fi
            ((i++))
        done


    echo ""


    echo "BDCs via broadcast : "
    echo "    "`nmblookup -R $domaine_nom#1C | grep 1c | awk '{ print $1}'`

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# nmblookup -R $domaine_nom#1C | sort -u" >> $detail
    nmblookup -R $domaine_nom#1C | sort -u >> $detail



    for wins in ${wins_tableau[@]}
        do echo "BDCs via le serveur WINS "$wins" :"
            bdcs_ligne=`nmblookup -R -U $wins $domaine_nom#1C | grep 1c | awk '{ print $1}' | sort -u`;

            ## redirection pour le rapport
            echo "" >> $detail
            echo "# nmblookup -R -U $wins $domaine_nom#1C | sort -u" >> $detail
            nmblookup -R -U $wins $domaine_nom#1C | sort -u >> $detail


            for bdc in ${bdcs_ligne[@]} ;
                do  if [ $bdc == name_query ]
                    then echo "    Probleme ! Ce WINS ne retourne pas le controleur : erreur 'name query failed'.";
                    else echo "    "$bdc;
                    fi
                done
        done

    echo""

    echo "Maitre explorateur du domaine :"
    echo "    "`nmblookup -S $domaine_nom#1D | grep 1d`


    ## redirection pour le rapport
    echo "" >> $detail
    echo "# nmblookup -S $domaine_nom#1D" >> $detail
    nmblookup -S $domaine_nom#1D >> $detail
    echo ""



## pour les eCdl

if [[ "$type_s" == "ecdl" ]]; then

compte_local="local.testldap"
pass_local="test"

    smbldap-useradd -a $compte_local
    echo "" >> $detail
    echo "# smbldap-useradd -a $compte_local" >> $detail
    touch $tmp_local
    echo $pass_local > $tmp_local
    echo $pass_local >> $tmp_local
    smbldap-passwd $compte_local < $tmp_local >> $detail
    smbldap-groupmod -m $compte_local DomainAdmins >> $detail

    echo -e " \n" >> $detail


    ref=$(echo $(CreoleGet ecdl_ldap_test_serveur_samba)|awk -F " " '{print $1}')
test_ref=$(ldapsearch -x -h $ref uid=$compte_local givenName | grep givenName:)
different=False

    if [[ "$test_ref" != "" ]]; then

        for  i in $(CreoleGet ecdl_ldap_test_serveur_samba)

            do
                test_ldap_i=$(ldapsearch -x -h $i uid=$compte_local givenName | grep givenName:)
                if [ "$test_ldap_i" != "$test_ref" ]; then
                    different=True
                fi

                ## redirection pour le rapport
                echo "# ldapsearch -x -h $i uid=$compte_local" >>$detail
                ldapsearch -x -h $i uid=$compte_local >>$detail
            done

        if [[ "$different" == "False" ]]; then
            echo "La replication des LDAP nationaux semble bien fonctionner."
        else
            echo "Probleme ! La replication des LDAP nationaux ne fonctionne pas."
        fi

        echo ""

        echo "admin.$domaine_nom membre du groupe Administrators :"
        net rpc group members Administrators -U $compte_local%test | egrep -i admin

        ## redirection pour le rapport
        echo "" >> $detail
        echo "# net rpc group members Administrators -U $compte_local%test" >> $detail
        net rpc group members Administrators -U $compte_local%test >> $detail
        echo " "
        echo "" >> $detail


        echo  "Les relations d'approbation :"
        net rpc trustdom list -U $compte_local%test
        echo "" >> $detail

        ## redirection pour le rapport
        echo "# net rpc trustdom list -U $compte_local%test" >> $detail
        net rpc trustdom list -U $compte_local%test >> $detail


    else
        echo "L'inscription de compte sur le LDAP ne fonctionne pas."
    fi



    smbldap-groupmod -x $compte_local DomainAdmins >> $detail
    smbldap-userdel $compte_local
    rm -f $tmp_local
    echo ""


fi


###########################################
# Les applications en cours
# Les ports utilises
#


    echo "Antivirus :"
    if [[ `pstree | grep clamd` ]]
        then echo "ClamAV"
        else echo "Non"
    fi

    ## redirection pour le rapport
    echo "" >> $detail
    echo "# pstree" >> $detail
    pstree >> $detail
    echo "" >> $detail
    echo "# netstat -nlatp | grep tcp | grep LIST" >> $detail
    netstat -nlatp | grep tcp | grep LIST >> $detail
    echo "" >> $detail
    echo "# ps afx" >> $detail
    ps afx >> $detail

    echo ""



    echo "Les resultats bruts des tests sont disponibles ici :" $detail
    read -p "Voulez-vous les consulter o/[n] ? " afficher_detail
    if [[ ! ( -z $afficher_detail ) ]]
        then if [ $afficher_detail == o ]
                then more $detail
            fi
    fi


exit 0
