home *** CD-ROM | disk | FTP | other *** search
/ Freelog 9 / Freelog009.iso / BAS / Systeme / ShellUnix / HLOOP.SH < prev    next >
Linux/UNIX/POSIX Shell Script  |  1998-07-09  |  10KB  |  367 lines

  1. #!/bin/sh 
  2. #---------------------------------------------------------------------- 
  3. # NOM 
  4. #    hloop = Execute une meme commande sur une liste de stations.
  5. #  
  6. # SYNTAXE 
  7. #    hloop -h|H            (aide) 
  8. #    hloop commande        (execute la commande)
  9. #    hloop [-q] [-s station] [-u user] [-f fichier] commande
  10. #  
  11. #---------------------------------------------------------------------- 
  12. # VERSION
  13. #    1.1
  14. # DESCRIPTION 
  15. #    * Cette commande permet d'executer une liste de stations une meme
  16. #    commande passee en argument.
  17. #    Si aucune liste n'est passe en argument la procedure prend le 
  18. #    fichier /etc/hosts ou si l'on se trouve dans un domaine NIS
  19. #    la procedure utilise la commande ypcat.
  20. #  
  21. #    * Le fichier de stations doit contenir une station par ligne.
  22. #  
  23. #  
  24. # OPTION(S) 
  25. #    -h|H        Aide courte ou longue. 
  26. #  
  27. #    -f fichier  Prend la liste des station inscrites dans 
  28. #                fichier.
  29. #    -u user     Execute les remote commande a travers une entree
  30. #                utilisateur.
  31. #  
  32. #    -s station  Execute une commande uniquement sur une station.
  33. #                Il est plus rapide faire directement un remsh
  34. #                sur la station souhaite, mais une telle option
  35. #                peut etre utile.
  36. #  
  37. #    -q          Mode silence, se contente juste d'executer la
  38. #                commande.
  39. #  
  40. # EXEMPLE(S) 
  41. #    * Lance la commande "users" sur la liste de station inscrites dans 
  42. #    le fichier liste :
  43. #        prompt_unix> hloop -f liste users
  44. #  
  45. #    * Lance la commande "bdf" sur la liste de station inscrites dans 
  46. #    le fichier file.txt avec comme entree l'utilisateur toto :
  47. #        prompt_unix> hloop -q -u toto -f file.txt bdf
  48. #  
  49. # DEPENDANCE(S) 
  50. #    * remsh|rsf, domainname, awk, ping, sed, grep, ypcat.
  51. #  
  52. # AUTEUR
  53. #     Copyright (c) 1998 Bertrand LE QUELLEC, All Rigths Reserved.
  54. # CONTACT
  55. #   eMail : blq@mygale.org ou blq@wanadoo.fr
  56. #   Url   : http://www.mygale.org/09/blq/ ou http://perso.wanadoo.fr/blq/
  57. #
  58. # Cree : 18/11/93
  59. #---------------------------------------------------------------------- 
  60. # Permission to use, copy, modify, distribute, and sell this software
  61. # and its documentation for any purpose is hereby granted without fee,
  62. # provided that the above copyright notice appear in all copies and
  63. # that both that copyright notice and this permission notice appear in
  64. # supporting documentation, and that the name of Bertrand LE QUELLEC    
  65. # not be used in advertising or publicity pertaining to distribution 
  66. # of the software without specific, written prior permission. Bertrand 
  67. # LE QUELLEC makes no representations about the suitability of
  68. # this software for any purpose. It is provided "as is" without
  69. # express or implied warranty.
  70. #
  71. # THIS SOFTWARE IS PROVIDED BY Bertrand LE QUELLEC `AS IS' AND ANY
  72. # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  73. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  74. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bertrand LE QUELLEC BE
  75. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  76. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  77. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  78. # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  79. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  80. # OR OTHERWISE)     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  81. # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  82. #---------------------------------------------------------------------- 
  83.  
  84. # ------------------------------------------ 
  85. # ZONE DE DEFINITION DES VARIABLES GLOBALES:
  86. # ------------------------------------------
  87. NOM_PROCEDURE=`basename $0`
  88. LA_PROCEDURE=$0
  89. CD=`pwd`
  90. AWK=`[ -f /usr/bin/nawk ] && echo "nawk" || echo "awk" `
  91.  
  92. HOSTNAME=`hostname`
  93. UNAME=`uname`
  94. RSH=`[ "$UNAME" = "HP-UX" -o "$UNAME" = "AIX" ] && echo "remsh" || echo "rsh"`
  95. TEST_PING=`[ "$UNAME" = "HP-UX" -o "$UNAME" = "AIX" ] && echo "0% packet loss" || echo "alive"`
  96.  
  97. ##
  98. ## Variables particulieres:
  99. ##
  100. DATE=`date "+%d/%m/%y"`
  101. MODE_COULEUR=0
  102.  
  103.  
  104. ##
  105. ## Les variables concernant l'utilisateur:
  106. ##
  107. DEFAUT_AUTEUR=`whoami`
  108. DEFAUT_EDITEUR=${EDITOR}
  109. DEFAUT_SHELL=${SHELL}
  110.  
  111.  
  112. #---------------------------------------------------------------------- 
  113. # ----------------------------------------- 
  114. # ZONE DE DEFINITION DES FONCTIONS LOCALES:
  115. # -----------------------------------------
  116. # La fonction doit etre precedee d'un commentaire avec en debut de ligne
  117. # le caractere # (diese) repete deux fois.
  118.  
  119. ##
  120. ## En cas d'une interruption la fonction suivante est executee.
  121. ## Les interruptions sont des signaux envoyes au processus du script,
  122. ## par la commande Unix: kill(1). La "capture" de ces signaux est
  123. ## identifiee par la commande Shell: trap definie apres la zone des
  124. ## options.
  125. ##
  126. TrapInterrup()
  127. {
  128.     # Vous pouvez executer des instructions avant une sortie 
  129.     # par signal (ou brutale!).
  130.     exit 1
  131. }
  132.  
  133.  
  134. ##
  135. ## Renvoie le PATH et nom d'un ou plusieurs executables.
  136. ## Si le ou les executables sont introuvables la fonction ne renvoie rien.
  137. ## Dans le cas d'un alias la fonction ne renvoie rien, car le PATH n'est
  138. ## pas recuperable.
  139. ##
  140. Type()
  141. {
  142.     [ $# -ne 0 ] && type $* | ${AWK} '$2=="is" && $4!="alias" {print $NF}'
  143. }
  144.  
  145.  
  146. ##
  147. ## Affiche l'aide indiquee en en-tete du script shell.
  148. ## Ne pas supprimer car cette fonction est utilisee a l'appel de la
  149. ## procedure avec les options -H ou -H
  150. ##
  151. AideProc()
  152. {
  153.     fichier=$1
  154.     niveau=$2
  155.  
  156.     [ -z "$fichier" ] && {
  157.         Erreur "AideProc(): nombre d'argument incorect."
  158.         return 0
  159.         }
  160.  
  161.     [ ! -f "$fichier" ] && {
  162.         Erreur "AideProc(): impossible d'atteindre le fichier $fichier."
  163.         return 0
  164.     }
  165.  
  166.     [ ${niveau:=2} = 2 ] && {
  167.         ${AWK} 'BEGIN {i=2}
  168.             /^#(#+|-+|÷+|\*+|\\+|\++|=+|\.+|\/+)+ *$/{
  169.                 if(--i<=0)exit
  170.                 next
  171.             }
  172.             /^#[     ]*[A-Z]*[     ]*$/{
  173.                 next
  174.             }
  175.             /^#[^!]/{
  176.                 print substr($0,1,80)
  177.             }
  178.             /^#[ \t]*$/{
  179.                 print ""
  180.             }
  181.         ' $fichier | sed -e 's/^#[     ]*//'
  182.     } || {
  183.         ${AWK} '\
  184.             /^#(#+|-+|÷+|\*+|\\+|\++|=+|\.+|\/+)+ *$/{
  185.                 if(--i<=0) exit
  186.                 next
  187.             }
  188.             /^#[^!]/{
  189.                 print substr($0,2,80)
  190.             }
  191.             /^#[ \t]*$/{
  192.                 print ""
  193.             }
  194.         ' i=$niveau $fichier | pg -e
  195.     }
  196. }
  197.  
  198. ##
  199. ## Renvoie le type de la machine ou l'on se trouve et surtout le
  200. ## systeme d'exploitation en cours. La fonction renvoie un des numero
  201. ## suivant en reponse:
  202. ##
  203. ##    inconue            0
  204. ##
  205. ##    SunOs            1
  206. ##    Sun Solaris        2
  207. ##    HP s700            3
  208. ##    HP s800            4
  209. ##    HP s300            5
  210. ##    Silicon Graphic     6
  211. ##    IBM AIX            7
  212. ##
  213. ## Pour recuperer le code retour de la fonction, utilisez la variable $?
  214. ##
  215. Machine()
  216. {
  217.     os=`uname`
  218.  
  219.     [ "$os" = "SunOS" ] && return 1
  220.     
  221.     [ "$os" = "HP-UX" ] && {
  222.         if uname -a | grep "PA-RISC" 1> /dev/null
  223.         then
  224.             return 3
  225.         elif uname -a | grep "HP-PA" 1> /dev/null
  226.             return 4
  227.         then
  228.             return 5
  229.         fi
  230.     }
  231.  
  232.     [ "$os" = "IRIX" ] && return 6
  233.  
  234.     [ "$os" = "AIX" ] && return 7
  235.  
  236.     return 0
  237. }
  238.  
  239.  
  240. ##
  241. ## Affiche un message en rouge si l'on se trouve dans une fenetre hpterm
  242. ## et se met en attente de 2 secondes.
  243. ## Il est possible de recuperer le code retour de la fonction.
  244. ##
  245. Erreur()
  246. {
  247.     [ $# -eq 0 ] && return -1
  248.  
  249.     echo "\n\t${ROUGE}$*"
  250.     sleep 2
  251.  
  252.     return 0
  253. }
  254.  
  255.  
  256. #---------------------------------------------------------------------- 
  257. # ---------------------------------------------- 
  258. # DEFENITION DES VARIABLES LOCALES AU PROGRAMME:
  259. # ----------------------------------------------
  260.  
  261. LISTE=
  262. USER=
  263. QUIET=0
  264.  
  265.  
  266. #---------------------------------------------------------------------- 
  267. # ---------------------------------------------- 
  268. # DEFENITION DES FONCTIONS LOCALES AU PROGRAMME:
  269. # ----------------------------------------------
  270.  
  271. ## --------------------------------------------------
  272. ## verification que la station est Up ou Down.
  273. ##
  274. ## 0 Down
  275. ## 1 Up
  276. ##
  277. UpDown ()
  278. {
  279.     Machine
  280.     [ $? -eq 7 ] && {
  281.         perc=`ping $1 -c 1 | grep -c "${TEST_PING}"'`
  282.     } || {
  283.         perc=`ping $1 64 -n 1 | grep -c "${TEST_PING}"'`
  284.     }
  285.  
  286.     [ `echo $perc | grep -c unknown` -gt 0 ] && return 0
  287.     [ "$perc" -eq 0 -o "$perc" = "1" ] && return 1 || return 0
  288. }
  289.  
  290. ## --------------------------------------------------
  291. ## execution de la commande sur la station distante.
  292. ##
  293. hexec()
  294. {
  295.     [ $QUIET -eq 1 ] || echo "Execution sur $host ..."
  296.  
  297.     if UpDown $host
  298.     then
  299.         [ `$RSH $host $USER echo 2>&1 | grep -c incorrect` -gt 0 ] && ( [ $QUIET -eq 1 ] || echo "\t>> Pas d'entree sur $host" ) || eval $RSH $host $USER $*
  300.     else
  301.         [ $QUIET -eq 1 ] || echo "\t>> $host est down"
  302.     fi
  303.  
  304.     [ $QUIET -eq 1 ] || echo ""
  305. }
  306.  
  307.  
  308. #---------------------------------------------------------------------- 
  309. # ------------------------- 
  310. # RECUPERATION DES OPTIONS:
  311. # -------------------------
  312. set -- `getopt hHxf:u:s:q $*` 
  313. for opt in $*                                            
  314. do                                                             
  315.     case $opt in                                           
  316.         -h) AideProc $LA_PROCEDURE    ; exit 0 ;;
  317.         -H) AideProc $LA_PROCEDURE 3  ; exit 0 ;;
  318.  
  319.         -x) set -x ; shift ;;
  320.  
  321.         -f)    LISTE=$2     ; shift ; shift ;;
  322.         -u)    USER="-l $2" ; shift ; shift ;;
  323.         -s)    echo "$2" > /tmp/liste$$ ; LISTE=/tmp/liste$$
  324.             shift ; shift ;;
  325.         -q)    QUIET=1 ; shift ;;
  326.  
  327.         --)    shift            ; break ;;
  328.     esac                                                        
  329. done                                                          
  330.  
  331.  
  332. #----------------------------------------------------------------------
  333. # AUTRES DEFINITIONS:
  334. # -------------------
  335. trap TrapInterrup 3 2 15    # Recuperation des interruptions 3, 2 et 15
  336.  
  337. #----------------------------------------------------------------------
  338. # DEBUT ZONE DU PROGRAMME:
  339. # ------------------------
  340.  
  341. [ -z "$LISTE" ] && (
  342.     if domainname > /dev/null
  343.     then
  344.         for host in `${AWK} '$1 !~ "#" {car=substr($1,1,1);if(car!="#")print $2}' /etc/hosts`
  345.         do
  346.             hexec $*
  347.         done
  348.     else
  349.         for host in `ypcat hosts | ${AWK} '{print $2}'`
  350.         do
  351.             hexec $*
  352.         done
  353.     fi ) || (
  354.     for host in `${AWK} '{print $1}' $LISTE`
  355.     do
  356.         hexec $*
  357.     done 
  358.     
  359.     [ "$LISTE" = /tmp/liste$$ ] && rm -f /tmp/liste$$ )
  360.  
  361.