[Résolu] Script bash - community name Vide - snmpwalk

Salut à tous,

J’ai un petit problème pour un script que j’essaye d’améliorer. j’ai ajouter des options à mon script via un ‘case’ pour que cela fasse plus propre, mais je me rend compte que l’options du nom de communauté de la commande ‘snmpwalk’ que j’invoque dans mon script est vide.

j’ai par ailleurs remarqué lorsque j’utilise la commande que le nom de communauté est toujours vide (e.g. ps -ax):

 /usr/bin/snmpwalk -v 2c -c        ip_address .1.3.6.1.4.1.334.72.1.1.2

Est-ce lié ?

De plus j’ai beau chercher je ne trouve pas de script bash sur le net qui utiliserai “snmpwalk”, y’a bien la solution d’écrire tout en Perl mais ceci est mon premier gros script et je métrise encore moins le Perl.

Enfin je post à tout hasard si jamais quelqu’un a déjà rencontré le problème.

#! /bin/bash

#########################################################################################
#
#    Author:    Ludo
#    Date:      2008.01.11
#########################################################################################

PROGNAME="check_AV_update.sh"
VERSION="1.0"
AUTHOR="(c) 2008 Ludo"
LASTCHANGE="2008.02.18"

# EXIT CODE

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# COMMANDS

CAT=/bin/cat
GREP=/bin/grep
CUT=/bin/cut
SED=/bin/sed
AWK=/usr/bin/awk
ECHO=/bin/echo
LS=/bin/ls
PATH_TMP=/tmp
SNMP=/usr/bin/snmpwalk


# HELP AND USAGE
print_version() {
        $ECHO ""
        $ECHO "------------------------------------------------------------------------------------"         
        $ECHO "$PROGNAME - V$VERSION, by $AUTHOR - Last Modification: $LASTCHANGE"
        $ECHO "------------------------------------------------------------------------------------"
        $ECHO ""
}

print_usage() {

   $ECHO ""
   $ECHO ""
   $ECHO "Usage: $PROGNAME [-h|-V] | --com=<public> --hostaddress=<ip_address> -w <warning_value> -c <critical_value>"; $ECHO ""
   $ECHO "  -h, --help"; $ECHO "print the help message and exit"
   $ECHO "  -V"; $ECHO "print version and exit"
   $ECHO "  --hostaddress=*"; $ECHO "Host Address"
   $ECHO "  --com=*"; $ECHO "community name"
   $ECHO "  -w n"; $ECHO "warning day for database age"
   $ECHO "  -c n"; $ECHO "critical day for database age"
   $ECHO ""
   $ECHO ""
}

print_help() {
   print_version
   $ECHO ""
   $ECHO "Plugin for Nagios to check the LNSNMP OID for AV datatbase age"
   $ECHO ""
   print_usage
   $ECHO ""
}

# Make sure the correct argument have been supplied

if [[ ! `$ECHO "$*" | $GREP -E "(-[hVwc]\>|--(help|com|hostaddress)=)"` ]]; then
    print_usage
    exit $STATE_UNKNOWN
fi

# grab the command line arguments

thresh_warn=""
thresh_crit=""
hostaddress=""
com=""
while test -n "$1"; do

        case "$1" in
                --help)
                        print_help
                        exit $STATE_OK
                        ;;
                -h)
                        print_help
                        exit $STATE_OK
                        ;;
                -V)
                        print_version
                        exit $STATE_OK
                        ;;
                --com=*)
                        com=`$ECHO $2 | cut -d= -f2`
                        shift
                        ;;
                --hostaddress=*)
                        hostaddress=`$ECHO $1 | cut -d= -f2`
#                        if [[ `expr match "$hostaddress" '\[0-9]*.[0-9]*.[0-9]*.[0-9]*\'` != $hostaddress ]] || [ -z $hostaddress ]; then
#                        $ECHO "The address ip is not valid"
#                        exit $STATE_UNKNOWN
#                        fi
                        shift
                        ;;
                -w)
                        thresh_warn=$2
# if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
#                        $ECHO "Warning value must be a number greater than zero"
#                        exit $STATE_UNKNOWN
#                        fi
                        shift
                        ;;
                -c)
                        thresh_crit=$2
#                       if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
#                        $ECHO "Criticale value must be a number greater than zero"
#                        exit $STATE_UNKNOWN
#                        fi
                        shift
                        ;;
                *)
                        $ECHO "UNKNOW argument: $1"
                        print_usage
                        exit $STATE_UNKNOWN
                        ;;
        esac
   shift
done

$ECHO ------------------------
$ECHO $hostaddress
$ECHO $com
$ECHO $thresh_warn
$ECHO $thresh_crit
$ECHO ------------------------

###########
# VARIABLES
###########

NOW=$(date +%c | $CUT -d\  -f1-5)
CHECK=/usr/bin/check_lnsmp_Mibs.sh
NOTES_MIBS=.1.3.6.1.4.1.334
NOTES_MIBS_START=.1.3.6.1.4.1.334.72.1.1.3
NOTES_MIBS_START_NAME=NOTES-MIB::lnStatsCurrentTime.0
NAME_AGE=SAV.Current.Definitions.Age
NAME_DATE=SAV.Current.Definitions.Date

#####################
# Check if file exist
#####################

FILE=$($LS $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp)

if [[ $FILE == "" ]];
    then
       $CHECK hostname $hostaddress
fi

# DEBUG
#$ECHO -------
#$ECHO $FILE
#$ECHO -------
# DEBUG

#####################
# assign value to VAR
#####################

DATE_MIB_FILE=$($CAT /tmp/tmp_Nagios-$hostaddress-result.lnsnmp | grep $NOTES_MIBS_START_NAME | $CUT -d\  -f4 )
DATE_MIB_SNMP=$($SNMP -v 2c -c $com $hostaddress $NOTES_MIBS_START | $CUT -d\  -f4)

#$ECHO --------
#$ECHO $DATE_MIB_FILE
#$ECHO $DATE_MIB_SNMP
#$ECHO --------


########################
# Verify the date of mib
########################

if [[ $DATE_MIB_FILE == "" ]];
   then
        $CHECK hostname $hostaddress
 elif [[ $DATE_MIB_FILE != $DATE_MIB_SNMP ]];
   then
         $CHECK hostname $hostaddress
fi

##################################
# Assign Value to ask the good OID
##################################

SNMP_DMAJ=$($CAT $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp  | $GREP -i $NAME_AGE | $CUT -d\  -f1)
SNMP_IMAJ=$($CAT $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp  | $GREP -i $NAME_DATE | $CUT -d\  -f1)
DMAJ=$($SNMP -v 2c -c $com $hostaddress $SNMP_DMAJ | $CUT -d\  -f6 | $CUT -d\" -f1)
IMAJ=$($SNMP -v 2c -c $com $hostaddress $SNMP_IMAJ | $CUT -d\  -f6 | $CUT -d\" -f1)

#$ECHO ------
#$ECHO $DMAJ
#$ECHO $SNMP_DMAJ
#$ECHO $IMAJ
#$ECHO $SNMP_IMAJ
#$ECHO ------
#################################################################################
# check if the result is not null and verify the age of the Malaware/AV database.
#################################################################################

if [[ $DMAJ > $thresh_warn  ]];
  then
        echo "$NOW :$($ECHO "The last update:" $IMAJ | $CUT -d= -f1-3) : WARNING"
        exit $STATE_WARNING
 elif [[ $DMAJ = "" ]] ;
   then
        echo "$NOW : No response from this host"
        exit $STATE_UNKNOWN
 elif [[ $DMAJ > $thresh_crit ]];
   then
        echo "$NOW :$($ECHO "The last update:" $IMAJ | $CUT -d= -f1-3) : CRITICAL"
        exit $STATE_CRITICAL
 elif [[ $DMAJ < $thresh_warn  ]];
   then
         echo "$NOW :$($ECHO "The last update:" $IMAJ | $CUT -d= -f1-3) : OK"
         exit $STATE_OK
fi

Merci de vos lecture :wink:

p.s.: La variable $CHECK qui pointe vers le programme check_lnmp_Mibs.sh est juste un script qui lance une requête snmpwalk sur l’OIDs Lotus et l’envoi vers un fichier

p.s. 2: Si vous avez des avis ou remarque je suis toutes ouies ^^

Alors je n’y connais rien de rien à snmp (vraiment), et je ne connais pas le sens des mots que je vais utiliser, mais je causais l’autre jour avec un pôte qui travaillait sur des trucs snmp, et qui me disait qu’il etait obligé de réécrire des mib (c’est ça le terme ?) parceque justement son snmpwalk, sans lui donner d’erreur, ne lui renvoyait rien.
Ou un truc comme ça.
Enfin si cette info peut t’aider… :wink:

Il écoute même pas ses amis :astonished: :unamused: :slightly_smiling:

Ecouter, si. C’est retenir ce qu’on me dit quand je n’y comprends rien qui est plus dur. :laughing:

[quote=“mattotop”]Alors je n’y connais rien de rien à snmp (vraiment), et je ne connais pas le sens des mots que je vais utiliser, mais je causais l’autre jour avec un pôte qui travaillait sur des trucs snmp, et qui me disait qu’il etait obligé de réécrire des mib (c’est ça le terme ?) parceque justement son snmpwalk, sans lui donner d’erreur, ne lui renvoyait rien.
Ou un truc comme ça.
Enfin si cette info peut t’aider… :wink:[/quote]

C’est plutôt avec le commande que j’ai des problème plus qu’avec snmp. Mais c’est pas grave je commence à réecrire tout en Perl ca me fera un bon exercice ^^

Enfin si quelqu’un sait me dire pourquoi ça marche pas, le fait que le nom de communauté de la commande ne reste pas dans la variable, je suis preneur, car j’aime pas ne ‘pas savoir pourquoi’ :stuck_out_tongue:

Ton argument c’est bien de la forme :

?

Si c’est le cas le problème viens de:

--com=*) com=`$ECHO $2 | cut -d= -f2` shift ;;
parce que à ce moment là $1 contient --com=salut, $2 je sais pas ce qu’il contient ça dépend de comment est lancé ton script donc met

--com=*) com=`$ECHO $1 | cut -d= -f2` shift ;;
Et ça devrait être bon :wink:

Ooo… oui bien vu je l’avais changer pour “–hostaddress=” mais pas pour “–com=”, merci de ton regard averti :smiley:

[EDIT après changement]

En fait c’est le deuxième élément de ma commande qui est vide.

Quand je fait :

./check_AV_update-V2.sh --com=public --hostaddress=10.0.0.1000 -w 6 -c 10

c’est la variable de l’option ‘–hostaddress’ qui est vide, mais quand je fait:

./check_AV_update-V2.sh --hostaddress=10.0.0.1000 --com=public -w 6 -c 10

C’est la variable qui est sensé avoir le nom de communauté qui est vide. Le problème doit se situé au niveau du case, mais comme je débute je ne maitrise pas encore très bien.

En fait tu fais des shift en trop. Tu en fait un à la fin de chaque while et un à la fin de chaque traitement de paramètre alors que pour le --com et le --hostadress un seul suffit.

Donc tu supprime juste le shift du case de --com et de --hostadress :astonished:

Et bien je serais curieux d’avoir une explication sur cela, j’ai remplacer le “–com=” et “–hostaddress=” par un “-C” et “-H” ce qui donne ceci:

                      -C)
                        com=$2
                        shift
                        ;;
                      -H)
                        hostaddress=$2
                        shift
                        ;;

A la place de ceci:

                --com=*)
                        com=`$ECHO $1 | cut -d= -f2`
                        shift
                        ;;
                --hostaddress=*)
                        hostaddress=`$ECHO $1 | cut -d= -f2`
                        shift
                        ;;

Super étrange … Enfin si quelqu’un a une explication rationnel je suis preneur car la je nage :wink:

[quote=“MisterFreez”]En fait tu fais des shift en trop. Tu en fait un à la fin de chaque while et un à la fin de chaque traitement de paramètre alors que pour le --com et le --hostadress un seul suffit.

Donc tu supprime juste le shift du case de --com et de --hostadress :astonished:[/quote]

ha bon ? ben je vais tester.

C’est ce que je te disait tout à l’heure.

Les paramètres de type

sont en deux mots donc il te faut deux shifts pour les supprimer de la ligne de commande.

Les paramètres de type

sont en un seul mot donc un seul shift suffit pour les passer.

Or tu fais un shift dans chaque case et un à la fin ce qui fait 2

Ca marche nickel, j’ai même agrémenté le script avec --com et -C ou --hostaddress et -H.
Et j’ai mieux compris l’utilité de “shift”

Merci de ton aide :smiley:

[quote=“MisterFreez”]C’est ce que je te disait tout à l’heure.

Les paramètres de type

sont en deux mots donc il te faut deux shifts pour les supprimer de la ligne de commande.

Les paramètres de type

sont en un seul mot donc un seul shift suffit pour les passer.

Or tu fais un shift dans chaque case et un à la fin ce qui fait 2[/quote]

Je viens de lire une peu de doc sur le shift, je ne m’étais pas attarder assez sur la chose ^^

Tu a pris en compte l’utilisateur qui t’envoie les deux ?

Non, mais c’est une commande qui seras entrée dans un fichier de config donc à priori vu que c’est moi qui vais remplir le fichier, je ne pense pas me tromper, mais il est vrai que c’est une bonne idée :slightly_smiling:

La il me reste à obliger les utilisateurs à rentrer un adresse ip valide, et je bloque au niveau du parsing.

Voila le travail de plus j’ai intégrer des fonctions et un appel à un autre script à été fusionné dans ce script. Il me reste pour que ce soit parfait à intégrer un mode ‘verbose’ pour virer tous ces ‘echo’ de variable, le parsing sur l’ip, le fait que l’ont entre pas 2 options comme tu me l’as siganlé.

[code]
#! /bin/bash

#########################################################################################

Author: Ludo

Date: 2008.01.11

This program is free software: you can redistribute it and/or modify

it under the terms of the GNU General Public License as published by

the Free Software Foundation, either version 3 of the License, or

(at your option) any later version.

This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

GNU General Public License for more details.

You should have received a copy of the GNU General Public License

along with this program. If not, see http://www.gnu.org/licenses.

#########################################################################################

PROGNAME="check_AV_update.sh"
VERSION="1.0"
AUTHOR="© 2008 Ludo"
LASTCHANGE=“2008.02.22”

EXIT CODE

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

COMMANDS

CAT=/bin/cat
GREP=/bin/grep
CUT=/bin/cut
SED=/bin/sed
ECHO=/bin/echo
LS=/bin/ls
PATH_TMP=/tmp
SNMP=/usr/bin/snmpwalk

HELP AND USAGE

print_version() {
$ECHO “”
$ECHO “------------------------------------------------------------------------------------”
$ECHO “$PROGNAME - V$VERSION, by $AUTHOR - Last Modification: $LASTCHANGE”
$ECHO “------------------------------------------------------------------------------------”
$ECHO “”
}

print_usage() {

$ECHO “”
$ECHO “”
$ECHO “Usage: $PROGNAME [-h|-V] | -C or --com= -H or --hostaddress=<ip_address> -w <warning_value> or --warning=<warning_value> -c <critical_value> or --critical=<critical_value>”; $ECHO “”
$ECHO " -h, --help"; $ECHO “print the help message and exit”
$ECHO " -V"; $ECHO “print version and exit”
$ECHO " -H | --hostaddress="; $ECHO “Host Address”
$ECHO " -C | --com=
"; $ECHO “community name”
$ECHO " -w n | --warning=n"; $ECHO “warning number of day for database age”
$ECHO " -c n | --critical=n"; $ECHO “critical number of day for database age”
$ECHO “”
$ECHO “”
}

print_help() {
print_version
$ECHO “”
$ECHO “Plugin for Nagios to check the LNSNMP OID for AV datatbase age”
$ECHO ""
print_usage
$ECHO “”
}

Make sure the correct argument have been supplied

if [[ ! $ECHO "$*" | $GREP -E "(-[hVwc]\>|--(help|com|hostaddress|warning|critical)=)" ]]; then
print_usage
exit $STATE_UNKNOWN
fi

grab the command line arguments

thresh_warn="“
thresh_crit=”“
hostaddress=”“
com=”"
while test -n “$1”; do

    case "$1" in
            --help)
                    print_help
                    exit $STATE_OK
                    ;;
            -h)
                    print_help
                    exit $STATE_OK
                    ;;
            -V)
                    print_version
                    exit $STATE_OK
                    ;;
            --com=*)
                    com=`$ECHO $1 | $CUT -d= -f2`
                    ;;
            -C)
                    com=$2
                    shift
                    ;;
            --hostaddress=*)
                    hostaddress=`$ECHO $1 | $CUT -d= -f2`
                    ;;
            -H)
                    hostaddress=$2
                    #if [[ `expr match "$hostaddress" '\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)'` != $hostaddress ]] || [ -z $hostaddress ]; then
                    #$ECHO "This is not a valid address"
                    #exit $STATE_UNKNOWN
                    #fi
                    shift
                    ;;
            --warning=*)
                    thresh_warn=`$ECHO $1 | $CUT -d= -f2`
                     if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
                    $ECHO "Warning value must be a number greater than zero"
                    exit $STATE_UNKNOWN
                    fi
                    ;;
            -w)
                    thresh_warn=$2
                    if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
                    $ECHO "Warning value must be a number greater than zero"
                    exit $STATE_UNKNOWN
                    fi
                    shift
                    ;;
            --critical=*)
                    threshold=`$ECHO $1 | $CUT -d= -f2`
                    if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
                    $ECHO "Criticale value must be a number greater than zero"
                    exit $STATE_UNKNOWN
                    fi
                    ;;
            -c)
                    thresh_crit=$2
                    if [[ `expr match "$thresh_warn" '\([0-9]*\)'` != $thresh_warn ]] || [ -z $thresh_warn ]; then
                    $ECHO "Criticale value must be a number greater than zero"
                    exit $STATE_UNKNOWN
                    fi
                    shift
                    ;;
            *)
                    $ECHO "UNKNOW argument: $1"
                    print_usage
                    exit $STATE_UNKNOWN
                    ;;
    esac

shift
done

#$ECHO ------------------------
#$ECHO $hostaddress
#$ECHO $com
#$ECHO $thresh_warn
#$ECHO $thresh_crit
#$ECHO ------------------------

###########

VARIABLES

###########

NOW=$(date +%c | $CUT -d\ -f1-5)
NOTES_MIBS=.1.3.6.1.4.1.334
NOTES_MIBS_START=.1.3.6.1.4.1.334.72.1.1.3
NOTES_MIBS_START_NAME=NOTES-MIB::lnStatsCurrentTime.0
NAME_AGE=SAV.Current.Definitions.Age
NAME_DATE=SAV.Current.Definitions.Date

#########################################

If the file not exist or not up to date

#########################################
update_file() {
if [[ $($CAT /tmp/tmp_Nagios-$hostaddress-result.lnsnmp | grep $NOTES_MIBS_START_NAME | $CUT -d\ -f4 ) != $($SNMP -v 2c -c $com $hostaddress $NOTES_MIBS_START | grep $NOTES_MIBS_START_NAME | $CUT -d\ -f4) ]]
then
$SNMP -v 2c -c $com $hostaddress .1.3.6.1.4.1.334 > /tmp/tmp_Nagios-$hostaddress-result.lnsnmp
fi
}

#####################

Check if file exist

#####################

FILE=$($LS $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp)

if [[ $FILE == “” ]];
then
update_file #hostname $hostaddress
else verify_date
fi

DEBUG

#$ECHO -------
#$ECHO $FILE
#$ECHO -------

DEBUG

#####################

assign value to VAR

#####################

DATE_MIB_FILE=$($CAT /tmp/tmp_Nagios-$hostaddress-result.lnsnmp | grep $NOTES_MIBS_START_NAME | $CUT -d\ -f4 )
DATE_MIB_SNMP=$($SNMP -v 2c -c $com $hostaddress $NOTES_MIBS_START | $CUT -d\ -f4)

#$ECHO --------
#$ECHO $DATE_MIB_FILE
#$ECHO $DATE_MIB_SNMP
#$ECHO --------

########################

Verify the date of mib

########################

verify_date(){
if [[ $DATE_MIB_FILE == “” ]];
then
update_file
elif [[ $DATE_MIB_FILE != $DATE_MIB_SNMP ]];
then
update_file
fi
}

##################################

Assign Value to ask the good OID

##################################

SNMP_DMAJ=$($CAT $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp | $GREP -i $NAME_AGE | $CUT -d\ -f1)
SNMP_IMAJ=$($CAT $PATH_TMP/tmp_Nagios-$hostaddress-result.lnsnmp | $GREP -i $NAME_DATE | $CUT -d\ -f1)
DMAJ=$($SNMP -v 2c -c $com $hostaddress $SNMP_DMAJ | $CUT -d\ -f6 | $CUT -d" -f1)
IMAJ=$($SNMP -v 2c -c $com $hostaddress $SNMP_IMAJ | $CUT -d\ -f6 | $CUT -d" -f1)

#$ECHO ------
#$ECHO $DMAJ
#$ECHO $SNMP_DMAJ
#$ECHO $IMAJ
#$ECHO $SNMP_IMAJ
#$ECHO ------

#################################################################################

check if the result is not null and verify the age of the Malaware/AV database.

#################################################################################

if [[ $DMAJ > $thresh_warn ]];
then
echo "$NOW :$($ECHO “The last update:” $IMAJ | $CUT -d= -f1-3) : WARNING"
exit $STATE_WARNING
elif [[ $DMAJ = “” ]] ;
then
echo "$NOW : No response from this host"
exit $STATE_UNKNOWN
elif [[ $DMAJ > $thresh_crit ]];
then
echo "$NOW :$($ECHO “The last update:” $IMAJ | $CUT -d= -f1-3) : CRITICAL"
exit $STATE_CRITICAL
elif [[ $DMAJ < $thresh_warn ]];
then
echo "$NOW :$($ECHO “The last update:” $IMAJ | $CUT -d= -f1-3) : OK"
exit $STATE_OK
fi
#END[/code]

Elle est un peu compliquée mais elle est relativement restrictive. L'adresse 10.23.1.1 passe mais pas 324.56.2.89 par exemple. Tu dois aussi pouvoir interdire le broadcast ou les adresses non routables sur internet si tu veut.

Elle est un peu compliquée mais elle est relativement restrictive. L’adresse 10.23.1.1 passe mais pas 324.56.2.89 par exemple. Tu dois aussi pouvoir interdire le broadcast ou les adresses non routables sur internet si tu veut.