Problème syntaxe script shell

Fermé
polox - 15 avril 2010 à 10:42
 Daniel - 27 sept. 2011 à 16:48
Bonjour à tous,

J'ai un problème lors de l'exécution de mon script. Il me génère des erreurs et je n'arrive pas à régler le pb.

Néanmoins, il semble que cela provienne du ini file parser.

Je vous laisse mon script, le fichier ini (qui est parcouru) et enfin les erreurs trouvées.

Merci pour votre aide.

script:


#!/bin/bash

# check_snmp_printer_consummables
# Description : Check the consummables of the printer
# Version : 1.5
# Licence : GPLv2

# Commands
CMD_BASENAME="/usr/bin/basename"
CMD_SNMPGET="/usr/bin/snmpget"
CMD_SNMPWALK="/usr/bin/snmpwalk"
CMD_GREP="/bin/grep"
CMD_AWK="/usr/bin/awk"
CMD_EXPR="/usr/bin/expr"

# INI file providing OID for consummables (name, state and total)
FILE_OID="/usr/local/nagios/libexec/printers.ini"

# Script name
SCRIPTNAME='$CMD_BASENAME $0'

# Version
VERSION="1.5"

# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

# Default OID
OID_NAME=".1.3.6.1.2.1.43.12.1.1.4.1.1"
OID_TOTAL=".1.3.6.1.2.1.43.11.1.1.8.1.1"
OID_STATUS=".1.3.6.1.2.1.43.11.1.1.9.1.1"

# Default variables
DESCRIPTION="Unknown"
STATE=$STATE_UNKNOWN
CONSUMMABLE_USED_POURCENT="Unknown"

# Default options
COMMUNITY="public"
HOSTNAME="192.168.0.225"
MODEL="sharpmx2301n"
CONSUMMABLE="cyan"
WARNING=0
CRITICAL=0

# Option processing
print_usage() {
echo "Usage: ./check_snmp_printer_consummables -H 192.168.0.225 -C public -m sharpmx2301n -o cyan -w 85 -c 90"
echo " $SCRIPTNAME -H ADDRESS"
echo " $SCRIPTNAME -C STRING"
echo " $SCRIPTNAME -w INTEGER"
echo " $SCRIPTNAME -c INTEGER"
echo " $SCRIPTNAME -h"
echo " $SCRIPTNAME -V"
}

print_version() {
echo $SCRIPTNAME version $VERSION
echo ""
echo "The nagios plugins come with ABSOLUTELY NO WARRANTY."
echo "You may redistribute copies of the plugins under the terms of the GNU General Public License v2."
}

print_help() {
print_version
echo ""
print_usage
echo ""
echo "Check the consummable of the printer"
echo ""
echo "-H ADDRESS"
echo " Name or IP address of host (default: 192.168.0.225)"
echo "-C STRING"
echo " Community name for the host's SNMP agent (default: public)"
echo "-m STRING"
echo " Printer model (default: sharpmx2301n)"
echo "-o STRING"
echo " Consummable (black, cyan, magenta, yellow, drum) (default: cyan)"
echo "-w INTEGER"
echo " Warning level for consummable in percent (default: 0)"
echo "-c INTEGER"
echo " Critical level for consummable in percent (default: 0)"
echo "-h"
echo " Print this help screen"
echo "-V"
echo " Print version and license information"
echo ""
echo ""
echo "This plugin uses the 'snmpget' command and 'snmpwalk' command included with the NET-SNMP package."
echo "This plugin support performance data output."
echo "If the percentage of the warning level and the critical level are 0, then the script returns a state OK."
}

while getopts H:C:m:o:w:c:hV OPT
do
case $OPT in
H) HOSTNAME="$OPTARG" ;;
C) COMMUNITY="$OPTARG" ;;
m) MODEL="$OPTARG" ;;
o) CONSUMMABLE="$OPTARG" ;;
w) WARNING=$OPTARG ;;
c) CRITICAL=$OPTARG ;;
h)
print_help
exit $STATE_UNKNOWN
;;
V)
print_version
exit $STATE_UNKNOWN
;;
esac
done

# Plugin processing

# INI File parser
cfg.parser () {
IFS=$'\n' && ini=( $(<$1) )
ini=( ${ini[*]//;*/} )
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )
ini=( ${ini[*]/%]/ \(} )
ini=( ${ini[*]/=/=\( } )
ini=( ${ini[*]/%/ \)} )
ini=( ${ini[*]/%\( \)/\(\) \{} )
ini=( ${ini[*]/%\} \)/\}} )
ini[0]=''
ini[${#ini[*]} + 1]='}'
eval "$(echo "${ini[*]}")"
}

if [ -e ${FILE_OID} ]; then
cfg.parser $FILE_OID
cfg.section.${MODEL}

OID_NAME=$name
OID_TOTAL=$total
OID_STATUS=$status
fi

CONSUMMABLE_NAME=$CONSUMMABLE
if [ $CONSUMMABLE = "cyan" ]; then
CONSUMMABLE_NAME="cyan\|cartouche\|toner"
fi

CONSUMMABLE_ID='$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME | $CMD_GREP -i "${CONSUMMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}''

if [ -n "$CONSUMMABLE_ID" ]; then
CONSUMMABLE_TOTAL='$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_TOTAL}.${CONSUMMABLE_ID}'
CONSUMMABLE_STATUS='$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_STATUS}.${CONSUMMABLE_ID}'

if [ -n "$CONSUMMABLE_TOTAL" ] && [ -n "$CONSUMMABLE_STATUS" ]; then

CONSUMMABLE_POURCENT='$CMD_EXPR \( $CONSUMMABLE_STATUS \* 100 \) / \( $CONSUMMABLE_TOTAL \)'
CONSUMMABLE_USED_POURCENT='$CMD_EXPR 100 \- $CONSUMMABLE_POURCENT'

if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then

if [ $CONSUMMABLE_USED_POURCENT -gt $CRITICAL ] && [ $CRITICAL != 0 ]; then
STATE=$STATE_CRITICAL
elif [ $CONSUMMABLE_USED_POURCENT -gt $WARNING ] && [ $WARNING != 0 ]; then
STATE=$STATE_WARNING
else
STATE=$STATE_OK
fi
else
STATE=$STATE_OK
fi

case "$CONSUMMABLE" in
black)
CONSUMMABLE_NAME="of the black cartridge"
;;
cyan)
CONSUMMABLE_NAME="of the cyan cartridge"
;;
magenta)
CONSUMMABLE_NAME="of the magenta cartridge"
;;
magenta)
CONSUMMABLE_NAME="of the magenta cartridge"
;;
yellow)
CONSUMMABLE_NAME="of the yellow cartridge"
;;
drum)
CONSUMMABLE_NAME="of the printing device"
;;
*)
CONSUMMABLE_NAME="of the consummable"
esac

DESCRIPTION="Utilisation $CONSUMMABLE_NAME : ${CONSUMMABLE_USED_POURCENT}% | cons_used=${CONSUMMABLE_USED_POURCENT};$WARNING;$CRITICAL;0"
else
DESCRIPTION="Printer is waiting"
fi

fi

echo $DESCRIPTION
exit $STATE


fichier ini

[sharpmx2301n]
name=.1.3.6.1.2.1.43.12.1.1.4.1.1
total=.1.3.6.1.2.1.43.11.1.1.8.1.1
status=.1.3.6.1.2.1.43.11.1.1.9.1.1


erreurs

./check_snmp_printer_consummables: eval: line 133: Erreur de syntaxe près du symbole inattendu « ) »
)'heck_snmp_printer_consummables: eval: line 133: 'cfg.section.sharpmx2301n]
./check_snmp_printer_consummables: line 137: cfg.section.sharpmx2301n : commande introuvable
Timeout: No Response from 192.168.0.225
Unknown



A voir également:

17 réponses

Personne pour me filer un coup de main????
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 11:26
Salut,

Difficile de débuguer un script (assez complexe) qu'on n'a pas développé soit même ;-((

Commence par rajouter "set -xv" après le shebang, et voir déjà si la verbosité te montre des choses qui t'auraient échappé, non ?

Qu'est sensée faire exactement cette partie :

# INI File parser
cfg.parser () {
IFS=$'\n' && ini=( $(<$1) )
ini=( ${ini[*]//;*/} )
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )
ini=( ${ini[*]/%]/ \(} )
ini=( ${ini[*]/=/=\( } )
ini=( ${ini[*]/%/ \)} )
ini=( ${ini[*]/%\( \)/\(\) \{} )
ini=( ${ini[*]/%\} \)/\}} )
ini[0]=''
ini[${#ini[*]} + 1]='}'
eval "$(echo "${ini[*]}")"
} 
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 11:33
Re,

Je vois quelque chose qui me semble bizarre ici (voir en gras)

# INI File parser 
cfg.parser () { 
  IFS=$'\n' && ini=( $(<$1) ) 
  ini=( ${ini[*]//;*/} ) 
  ini=( ${ini[*]/#[/\}$'\n'cfg.section.} ) 
  ini=( ${ini[*]/%]/ \(} ) 
  ini=( ${ini[*]/=/=\( } ) 
  ini=( ${ini[*]/%/ \)} ) 
  ini=( ${ini[*]/%\( \)/\(\) \{} ) 
  ini=( ${ini[*]/%\} \)/\}} ) 
  ini[0]='' 
  ini[${#ini[*]} + 1]='}' 
  eval "$(echo "${ini[*]}")" 
} 

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 11:37
Salut,

Il ne me semble pas, c'est la fin de la 1ère (l'autre du milieu étant échappée) ;-\

ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 11:42
Re,

@Jipicy

Tu as raison, j'ai mal vu ;-)
0
Cette partie sert à lire le fichier ini qui contient les OID. Ces derniers correspondent à des identifiants du copieur en question. Les trois OID sont:

la cartouche cyan, son niveau total, son niveau actuel.

Je suis loin d'être un pro en shell je dirai même que je suis novice dans ce domaine.

Au vu des erreurs, n'as tu vraiment aucune idée du pb??

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 11:48
Non elle ne sert pas à lire le fichier, mais à en changer la forme, du moins parser certains caractères pour les changer ou les supprimer.

Par contre il faudrait savoir ce que chaque ligne est sensée faire exactement parce que c'est assez pénible à décoder (même si certaines coulent de source), et il serait plus facile de connaitre le résultat attendu de ce fichier en sortie...
0
Tu penses qu'il y a une accolade en trop lami20j?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 11:40
Non, j'ai mal vu, jipicy a raison.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 11:41
Re,

C'est normal d'utiliser le . dans le nom de procédures?!!
Pourquoi pas utiliser cfg_parser plutôt ?
0
ça ne change rien que ce soit _ ou . les erreurs sont les mêmes.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 11:47
Ben, moi, avec ton script la seule erreur que j'ai eu c'est

~ $ sh script.sh
script.sh: line 132: 'cfg.parser': not a valid identifier


Déjà tu peux commencer par modifier les noms des procédures.
Ensuite lance le script et colle ici les erreurs
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 11:52
J'ai la même erreur ;-)
0
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
15 avril 2010 à 12:01
et avec bash script.sh ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 avril 2010 à 12:14
Effectivement de cette façon plus d'erreur dans l'interprétation de la fonction :

jp@MDK:~/tmpfs ssh$ cat foo.sh
#! /bin/sh

#set -xv

FILE="ini.file"

# INI File parser
cfg.parser () {
IFS=$'\n' && ini=( $(<$1) )
ini=( ${ini[*]//;*/} )
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )
ini=( ${ini[*]/%]/ \(} )
ini=( ${ini[*]/=/=\( } )
ini=( ${ini[*]/%/ \)} )
ini=( ${ini[*]/%\( \)/\(\) \{} )
ini=( ${ini[*]/%\} \)/\}} )
ini[0]=''
ini[${#ini[*]} + 1]='}'
eval "$(echo "${ini[*]}")"
}

cfg.parser $FILE

jp@MDK:~/tmpfs ssh$ cat ini.file
[sharpmx2301n]
name=.1.3.6.1.2.1.43.12.1.1.4.1.1
total=.1.3.6.1.2.1.43.11.1.1.8.1.1
status=.1.3.6.1.2.1.43.11.1.1.9.1.1

jp@MDK:~/tmpfs ssh$ bash foo.sh

jp@MDK:~/tmpfs ssh$ RIEN ;-((

jp@MDK:~/tmpfs ssh$ bash foo.sh     # En mode verbeux

FILE="ini.file"
+ FILE=ini.file

# INI File parser
cfg.parser () {
IFS=$'\n' && ini=( $(<$1) )
ini=( ${ini[*]//;*/} )
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )
ini=( ${ini[*]/%]/ \(} )
ini=( ${ini[*]/=/=\( } )
ini=( ${ini[*]/%/ \)} )
ini=( ${ini[*]/%\( \)/\(\) \{} )
ini=( ${ini[*]/%\} \)/\}} )
ini[0]=''
ini[${#ini[*]} + 1]='}'
eval "$(echo "${ini[*]}")"
}

cfg.parser $FILE
+ cfg.parser ini.file
+ IFS='
'
+ ini=($(<$1))
<$1
+ ini=(${ini[*]//;*/})
+ ini=(${ini[*]/#[/\}'
'cfg.section.})
+ ini=(${ini[*]/%]/ \(})
+ ini=(${ini[*]/=/=\( })
+ ini=(${ini[*]/%/ \)})
+ ini=(${ini[*]/%\( \)/\(\) \{})
+ ini=(${ini[*]/%\} \)/\}})
+ ini[0]=
+ ini[${#ini[*]} + 1]='}'
echo "${ini[*]}"
++ echo '
cfg.section.sharpmx2301n () {
name=( .1.3.6.1.2.1.43.12.1.1.4.1.1 )
total=( .1.3.6.1.2.1.43.11.1.1.8.1.1 )
status=( .1.3.6.1.2.1.43.11.1.1.9.1.1 )
}'
+ eval '
cfg.section.sharpmx2301n () {
name=( .1.3.6.1.2.1.43.12.1.1.4.1.1 )
total=( .1.3.6.1.2.1.43.11.1.1.8.1.1 )
status=( .1.3.6.1.2.1.43.11.1.1.9.1.1 )
}'

cfg.section.sharpmx2301n () {
name=( .1.3.6.1.2.1.43.12.1.1.4.1.1 )
total=( .1.3.6.1.2.1.43.11.1.1.8.1.1 )
status=( .1.3.6.1.2.1.43.11.1.1.9.1.1 )
}
jp@MDK:~/tmpfs ssh$
0
Je suis sûr que c'est pas grand chose mais franchement j'ai beau retourner tout ça dans tous les sens, je vois pas...

D'autres idées??
0
si ça peut aider:

cfg.parser () {
IFS=$'\n' && ini=( $(<$1) ) # convert to line-array
ini=( ${ini[*]//;*/} ) # remove comments
ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )# set section prefix
ini=( ${ini[*]/%]/ \(} ) # convert text2function (1)
ini=( ${ini[*]/=/=\( } ) # convert item to array
ini=( ${ini[*]/%/ \)} ) # close array parenthesis
ini=( ${ini[*]/%\( \)/\(\) \{} ) # convert text2function (2)
ini=( ${ini[*]/%\} \)/\}} ) # remove extra parenthesis
ini[0]='' # remove first element
ini[${#ini[*]} + 1]='}' # add the last brace
eval "$(echo "${ini[*]}")" # eval the result
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
Modifié par jipicy le 15/04/2010 à 12:08
Mouais ;-(

Faudrait surtout avoir la tronche du fichier une fois parsé ;-\

Chez moi cette ligne "ini=( ${ini[*]/#[/\}$'\n'cfg.section.} )# set section prefix " me renvoie ça :

jp@MDK:~/tmpfs ssh$ echo ${ini[@]}  
[sharpmx2301n] name=.1.3.6.1.2.1.43.12.1.1.4.1.1 total=.1.3.6.1.2.1.43.11.1.1.8.1.1 status=.1.3.6.1.2.1.43.11.1.1.9.1.1  

 jp@MDK:~/tmpfs ssh$ echo ${ini[*]/#<a href='/\\}$'\n'cfg.section.} 
} cfg.section.\sharpmx2301n] name=.1.3.6.1.2.1.43.12.1.1.4.1.1 total=.1.3.6.1.2.1.43.11.1.1.8.1.1 status=.1.3.6.1.2.1.43.11.1.1.9.1.1 

jp@MDK:~/tmpfs ssh$

Je ne pense pas que ce soit le résultat escompté, surtout quand on on sait que plus loin :

ini[0]='' # remove first element

Edit : Désolé impossible de mettre en page, un élément interfère avec le code source de la page ;-((
Edit2 : J'y suis arrivé ;-))
0
Je veux bien changer le nom des proc mais je mets quoi à la place?

Je fais une pause, reviens à 14h.

Si vous avez du nv d'ici là...

Merci
0
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
Modifié par dubcek le 15/04/2010 à 14:18
'
CONSUMMABLE_USED_POURCENT='$CMD_EXPR 100 \- $CONSUMMABLE_POURCENT'
ne serait-ce pas
CONSUMMABLE_USED_POURCENT=$($CMD_EXPR 100 \- $CONSUMMABLE_POURCENT)
qu'il faut utiliser ?
n'y a-t-il pas confusion entre
' et  ' back quote

à moins que ce soit l'affichage de CCM ?
0
Si, c'est bien le résultat que je cherche à avoir jipicy.

En fait j'ai oublié de préciser que le but de ce plugin c'est de pouvoir récupérer le nom de la cartouche son niveau total et actuel sous NAGIOS.

Ce script est en fait un plugin nagios check_snmp_printer_consummables.

S'il s'exécute correctement je devrais avoir sous nagios un statut OK avec les infos du toner.
0
mais comme je n'y arrive pas il se met en état UNKNOWN avec comme satut "printer is waiting"
0
Daniel Youla
22 sept. 2011 à 23:26
J'ai trouvé la solution au problème pour le OP. Son script est bien à part cette ligne:

ini[${#ini[*]} + 1]='}'

devient

ini[$ {#ini[*]} + 1]='}' (il y a une espace entre le $ et le { )

redémarrer Nagios et le plugin devra afficher les % des cartouches utilisées.
0
Utilisateur anonyme
23 sept. 2011 à 00:12
c'est très bizarre, car ${#ini[*]} retourne le nombre d'éléments du tableau ini, alors que $ {#ini[*]} ne veut rien dire, et devrait retourner une erreur.
0
Daniel Youla
23 sept. 2011 à 15:17
Ben, pour moi ça a marché avec l'espace, sinon mon Nagios affichait Unknow et Unknow pour les % des cartouches utilisées et j'avais aussi des erreurs de syntaxe à la ligne 131, 133 et 137 dans le fichier check_snmp_printer_consummables (qui est tout le "plugin processing" et "file ini parse"). En mettant une espace entre le $ et le {, j'ai éliminé 6-7 erreurs à la fois à cet endroit.

j'ai encore une petite erreur de rien du tout à cette ligne, mais au moins, les % des cartouches utilisées s'affiche dans Nagios au lieu de Unknow. Et mes 3 OIDs sont corrects aussi pour l'imprimantes dans le fichier printer.ini
0
Daniel Youla
23 sept. 2011 à 16:30
MAJ: J'ai aussi réussi à faire fonctionner le script en recollant le $ au { (plus d'espace) et en enlevant le # qui est avant le ini (même ligne) et ça fonctionne à merveille sans erreur.
0
Utilisateur anonyme
23 sept. 2011 à 16:56
de plus en plus bizarre (pour ce qui est d'enlever le dièse).
0
p-ê, mais ça ne marche pas pour moi sinon. J'ai le status Unknown-Unknown sinon. Je ne suis pas le seul à avoir ce problème, regarde le post de polox. Il y a une erreur de syntaxe dans la partie file ini parse.

Juste fait la commande ./check_snmp_printer_consummables avec les 4-5 paramètres et infos avec l'adresse IP de ton imprimantes que tu veux monitorer en terminal et tu vas voir l'erreur que ça va faire sur les lignes 131, 133 et 137
0
ça
ini[${#ini[*]} + 1]='}' 
peut être remplacé par
ini+=( } )
c'est à dire, ajouter une accolade en tant que dernier élément du tableau ini.

et là
eval "$(echo "${ini[*]}")"
le echo n'est pas nécessaire.

eval "${ini[@]}"
est suffisant.
0
ok, je vais essayer ça aussi. Merci pour l'info.
0

Discussions similaires