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

  1. #!/bin/sh
  2. #---------------------------------------------------------------------- 
  3. # NOM                                        
  4. #    fchgrp = Changement recursif de groupe avec test de propriete.
  5. # SYNTAXE                                    
  6. #    fchgrp -h|H          (aide)   
  7. #    fchgrp [-v] [-u user] [-o old_group] [-g new_group] [fichiers]
  8. #---------------------------------------------------------------------- 
  9. # VERSION
  10. #    1.0
  11. # DESCRIPTION
  12. #    * Changement recursif des droits GROUPE pour un utilisateur
  13. #    particulier. A la difference de la commande Chgrp -R, cette
  14. #    procedure peut effectuer le changement de groupe a partir de la
  15. #    designation d'un nom precis de groupe. Dans le cas ou pour une
  16. #    meme arborescence, il existe des fichiers de groupes differents,
  17. #    la procedure modifie uniquement les fichiers designes par
  18. #    l'option -g
  19. #    * Cette procedure est pratique via une utilisation en tant que
  20. #    super utilisateur (root).
  21. # OPTIONS
  22. #    -h|H      aide courte ou longue.        
  23. #                                            
  24. #    -v        Mode verbose, par defaut la procedure n'affiche pas les
  25. #              informations d'execution sur la sortie standard.
  26. #              Cette option permet de valider cet affichage.
  27. #                                            
  28. #    -u user   Effectue les modifications pour un utilisateur
  29. #              particulier. C'est a dire que seuls les fichiers
  30. #              appartenant a l'utilisateur sont modifies. Si 
  31. #              l'option est ommise, l'utilisateur courant (whoami)
  32. #              est utilise.
  33. #    -o group  Effectue les modifications pour un groupe bien
  34. #              precis. Seul les fichiers appartenant a ce groupe
  35. #              sont concernes par la modification. Option tres
  36. #              importante puisqu'elle justifie l'existance de la
  37. #              procedure vis a vis de : chgrp -R
  38. #              Sauf si desormais cette possibilite est integree
  39. #              a la commande chgrp(1M), mais peu importe la
  40. #              procedure fait bien son travail !
  41. #    -g group  Le nom du nouveau groupe a affecte aux fichiers et
  42. #              aux repertoires.
  43. #    fichiers  Les noms des repertoires et/ou fichiers de depart des
  44. #              modifications. Par defaut, la procedure utilise le
  45. #              repertoire courant (.).
  46. # EXEMPLE(S)
  47. #    * Lancement de l'application avec affichage de l'aide longue:
  48. #        $ fchgrp -H
  49. #    * Liste l'ensemble des fichiers appartenant a l'utilisateur
  50. #      courant, sans l'option -g aucune modification n'est effectuee,
  51. #      la procedure se transforme alors en commande ls(1M) un peu
  52. #      particuliere :
  53. #        $ fchgrp /home 
  54. #    * Modifie tous les fichiers du repertoire courant du groupe other
  55. #      en groupe sys pour l'utilisateur root :
  56. #        $ fchgrp -u root -o other -g sys
  57. # DEPENDANCE(S)
  58. #    find(1M), ls(1M), chgrp(1M), awk(1M) ou nawk(1M).
  59. #                                            
  60. # VOIR AUSSI
  61. #    chgrp(1M).
  62. #                                            
  63. # AUTEUR
  64. #    Copyright (c) 1998 Bertrand LE QUELLEC, All Rigths Reserved.
  65. # CONTACT
  66. #   eMail : blq@mygale.org ou blq@wanadoo.fr
  67. #   Url   : http://www.mygale.org/09/blq/ ou http://perso.wanadoo.fr/blq/
  68. #
  69. # Cree : 19/03/98
  70. #---------------------------------------------------------------------- 
  71. # Permission to use, copy, modify, distribute, and sell this software
  72. # and its documentation for any purpose is hereby granted without fee,
  73. # provided that the above copyright notice appear in all copies and
  74. # that both that copyright notice and this permission notice appear in
  75. # supporting documentation, and that the name of Bertrand LE QUELLEC    
  76. # not be used in advertising or publicity pertaining to distribution 
  77. # of the software without specific, written prior permission. Bertrand 
  78. # LE QUELLEC makes no representations about the suitability of
  79. # this software for any purpose. It is provided "as is" without
  80. # express or implied warranty.
  81. #
  82. # THIS SOFTWARE IS PROVIDED BY Bertrand LE QUELLEC `AS IS' AND ANY
  83. # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  84. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  85. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bertrand LE QUELLEC BE
  86. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  87. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  88. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  89. # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  90. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  91. # OR OTHERWISE)     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  92. # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  93. #---------------------------------------------------------------------- 
  94.  
  95. # ------------------------------------------ 
  96. # ZONE DE DEFINITION DES VARIABLES GLOBALES:
  97. # ------------------------------------------
  98. NOM_PROCEDURE=`basename $0`
  99. LA_PROCEDURE=$0
  100. CD=`pwd`
  101. AWK=`[ -f /usr/bin/nawk ] && echo "nawk" || echo "awk" `
  102.  
  103.  
  104. ##
  105. ## Variables particulieres:
  106. ##
  107. DATE=`date "+%d/%m/%y"`
  108. MODE_COULEUR=0
  109. VISU_HTML=netscape
  110.  
  111.  
  112. ##
  113. ## Les variables concernant l'utilisateur:
  114. ##
  115. DEFAUT_AUTEUR=`whoami`
  116. DEFAUT_EDITEUR=${EDITOR}
  117. DEFAUT_SHELL=${SHELL}
  118.  
  119.  
  120. #---------------------------------------------------------------------- 
  121. # ----------------------------------------- 
  122. # ZONE DE DEFINITION DES FONCTIONS LOCALES:
  123. # -----------------------------------------
  124. # La fonction doit etre precedee d'un commentaire avec en debut de ligne
  125. # le caractere # (diese) repete deux fois.
  126.  
  127. ##
  128. ## En cas d'une interruption la fonction suivante est executee.
  129. ## Les interruptions sont des signaux envoyes au processus du script,
  130. ## par la commande Unix: kill(1). La "capture" de ces signaux est
  131. ## identifiee par la commande Shell: trap definie apres la zone des
  132. ## options.
  133. ##
  134. TrapInterrup()
  135. {
  136.     # Vous pouvez executer des instructions avant une sortie 
  137.     # par signal (ou brutale!).
  138.     exit 1
  139. }
  140.  
  141.  
  142. ##
  143. ## Renvoie le PATH et nom d'un ou plusieurs executables.
  144. ## Si le ou les executables sont introuvables la fonction ne renvoie rien.
  145. ## Dans le cas d'un alias la fonction ne renvoie rien, car le PATH n'est
  146. ## pas recuperable.
  147. ##
  148. Type()
  149. {
  150.     [ $# -ne 0 ] && type $* | ${AWK} '$2=="is" && $4!="alias" {print $NF}'
  151. }
  152.  
  153.  
  154. ##
  155. ## Affiche l'aide indiquee en en-tete du script shell.
  156. ## Ne pas supprimer car cette fonction est utilisee a l'appel de la
  157. ## procedure avec les options -H ou -H
  158. ##
  159. AideProc()
  160. {
  161.     fichier=$1
  162.     niveau=$2
  163.  
  164.     [ -z "$fichier" ] && {
  165.         Erreur "AideProc(): nombre d'argument incorect."
  166.         return 0
  167.     }
  168.  
  169.     [ ! -f "$fichier" ] && {
  170.         [ -f "`basename $fichier`" ] && fichier=`basename $fichier` || {
  171.             Erreur "AideProc(): impossible d'atteindre le fichier $fichier."
  172.             return 0
  173.         }
  174.     }
  175.  
  176.     [ ${niveau:=2} = 2 ] && {
  177.         ${AWK} 'BEGIN {i=2}
  178.             /^#[-]+/{
  179.                 if(--i<=0)exit
  180.                 next
  181.             }
  182.             /^#[     ]*[A-Z]*[     ]*$/{
  183.                 next
  184.             }
  185.             /^#[^!]/{
  186.                 print substr($0,1,80)
  187.             }
  188.             /^#[ \t]*$/{
  189.                 print ""
  190.             }
  191.         ' $fichier | sed -e 's/^#[     ]*//'
  192.     } || {
  193.         ${AWK} '\
  194.             /^#[-]+/{
  195.                 if(--i<=0) exit
  196.                 next
  197.             }
  198.             /^#[^!]/{
  199.                 print substr($0,2,80)
  200.             }
  201.             /^#[ \t]*$/{
  202.                 print ""
  203.             }
  204.         ' i=$niveau $fichier | pg -e
  205.     }
  206. }
  207.  
  208. ##
  209. ## Renvoie le type de la machine ou l'on se trouve et surtout le
  210. ## systeme d'exploitation en cours. La fonction renvoie un des numero
  211. ## suivant en reponse:
  212. ##
  213. ##    inconue            0
  214. ##
  215. ##    SunOs            1
  216. ##    Sun Solaris        2
  217. ##    HP s700            3
  218. ##    HP s800            4
  219. ##    HP s300            5
  220. ##    Silicon Graphic     6
  221. ##    IBM AIX            7
  222. ##
  223. ## Pour recuperer le code retour de la fonction, utilisez la variable $?
  224. ##
  225. Machine()
  226. {
  227.     os=`uname`
  228.  
  229.     [ "$os" = "Solaris" ] && return 2
  230.  
  231.     [ "$os" = "SunOS" ] && {
  232.         [ -f /vmunix ] && return 1 || return 2
  233.     }
  234.     
  235.     [ "$os" = "HP-UX" ] && {
  236.         if uname -a | grep "PA-RISC" 1> /dev/null
  237.         then
  238.             return 3
  239.         elif uname -a | grep "HP-PA" 1> /dev/null
  240.             return 4
  241.         then
  242.             return 5
  243.         fi
  244.     }
  245.  
  246.     [ "$os" = "IRIX" ] && return 6
  247.  
  248.     [ "$os" = "AIX" ] && return 7
  249.  
  250.     return 0
  251. }
  252.  
  253.  
  254. ##
  255. ## Affiche un message en rouge si l'on se trouve dans une fenetre hpterm
  256. ## et se met en attente de 2 secondes.
  257. ## Il est possible de recuperer le code retour de la fonction.
  258. ##
  259. Erreur()
  260. {
  261.     [ $# -eq 0 ] && return -1
  262.  
  263.     echo "\n\t${ROUGE}$*${NORMAL}"
  264.     sleep 2
  265.  
  266.     return 0
  267. }
  268.  
  269.  
  270. ##
  271. ## Permet de visualiser un fichier HTML avec le bon executable:
  272. ##    netscape ou mosaic
  273. ##
  274. VoirHTML ()
  275. {
  276.     fichier="$*"
  277.  
  278.     [ -z "$VISU_HTML" ] && VISU_HTML=mosaic
  279.  
  280.     chemin=`Type $VISU_HTML`
  281.     [ -z "$chemin" ] && VISU_HTML=netscape
  282.  
  283.     chemin=`Type $VISU_HTML`
  284.     [ -z "$chemin" ] && {
  285.         Erreur "Executable du visualiseur HTML non accessible !"
  286.         return 0
  287.     }
  288.  
  289.     $VISU_HTML $fichier &
  290.     return 1
  291. }
  292.  
  293.  
  294. #---------------------------------------------------------------------- 
  295. # ---------------------------------------------- 
  296. # DEFENITION DES VARIABLES LOCALES AU PROGRAMME:
  297. # ----------------------------------------------
  298.  
  299. LE_USER=${DEFAUT_AUTEUR}
  300. OLD_GROUP=
  301. LE_GROUP=
  302. LE_DIR="."
  303. VERBOSE=0
  304.  
  305.  
  306. #---------------------------------------------------------------------- 
  307. # ---------------------------------------------- 
  308. # DEFENITION DES FONCTIONS LOCALES AU PROGRAMME:
  309. # ----------------------------------------------
  310.  
  311.  
  312.  
  313. #---------------------------------------------------------------------- 
  314. # ------------------------- 
  315. # RECUPERATION DES OPTIONS:
  316. # -------------------------
  317. set -- `getopt hHxvu:g:o: $*`                
  318. for opt in $*                                            
  319. do                                                             
  320.     case $opt in                                           
  321.         -h) AideProc $LA_PROCEDURE    ; exit 0 ;;
  322.         -H) AideProc $LA_PROCEDURE 3  ; exit 0 ;;
  323.  
  324.         -x) set -x ; shift ;;
  325.  
  326.         -u)    LE_USER="$2" ; shift ; shift ;;
  327.         -g)    LE_GROUP="$2" ; shift ; shift ;;
  328.         -o)    OLD_GROUP="-group $2" ; shift ; shift ;;
  329.         -v)    VERBOSE=1 ; shift ;;
  330.  
  331.         --) shift ; LE_DIR="$*" ; break ;;
  332.     esac                                                        
  333. done                                                          
  334.  
  335.  
  336. #----------------------------------------------------------------------
  337. # AUTRES DEFINITIONS:
  338. # -------------------
  339. trap TrapInterrup 3 2 15    # Recuperation des interruptions 3, 2 et 15
  340.  
  341. #----------------------------------------------------------------------
  342. # DEBUT ZONE DU PROGRAMME:
  343. # ------------------------
  344.  
  345. # Boucle sur les repertoires/fichiers passes en argument
  346. for un_dir in `echo $LE_DIR`
  347. do
  348.     [ $un_dir != "--" ] && {
  349.         # Traitement recursif sur un repertoire/fichier.
  350.         # Le awk permet de traiter les noms de fichiers avec des espaces, ils sont
  351.         # quelques fois utilises et autorises par certaines applications.
  352.         find $un_dir -user $LE_USER $OLD_GROUP -print | awk '{ 
  353.             gsub(/ /, "\\\\ ", $0)
  354.             print $0
  355.         }' | while read file        # L'utilisation du While et non du For est ici importante !
  356.         do
  357.             [ $VERBOSE -eq 1 ] && {
  358.                 echo ""
  359.                 echo ">> `ls -ld "$file" | ${AWK} '{ printf(\"%s %s %s\", $1, $3, $4) }'`\t$file"
  360.             }
  361.  
  362.             [ ! -z "$LE_GROUP" ] && {
  363.                 # Changement du groupe effective
  364.                 chgrp -h $LE_GROUP "$file"
  365.  
  366.                 [ $VERBOSE -eq 1 ] && {
  367.                     echo "<< `ls -ld "$file" | ${AWK} '{ printf(\"%s %s %s\", $1, $3, $4) }'`\t$file"
  368.                 }
  369.             }
  370.         done
  371.     }
  372. done
  373.  
  374.