[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/usr/share/se3/shares/shares.avail/ -> connexion.sh (source)

   1  #!/bin/bash
   2  #shares_Win95: netlogon
   3  #shares_Win2K: homes
   4  #shares_WinXP: homes
   5  #shares_Vista: homes
   6  #shares_Seven: homes
   7  #shares_CIFSFS: homes
   8  #action: start
   9  #level: 10
  10  # $Id: connexion.sh 7555 2012-12-02 01:41:44Z flafont $
  11  # Script de connexion destine a creer/corriger si necessaire les entrees cn=COMPUTER
  12  # Et a renseigner la table se3db.connexions
  13  # Adapte par S.Boireau d'apres le connexion.pl historique et ameliore ensuite d'apres le script de C.Bellegarde.
  14  # Utilisation de nmblookup pour l'adresse MAC (d'apres Franck Molle)
  15  #
  16  if [ -z "$3" ]; then
  17      echo "Erreur d'argument."
  18      echo "$*"
  19      echo "Usage: connexion.sh utilisateur machine ip [mac]"
  20      exit
  21  fi
  22  
  23  # Pour tester l'adresse MAC meme si l'ip et le nom n'ont pas change, passer a "y" la valeur ci-dessous:
  24  corrige_mac_si_ip_et_nom_inchange="y"
  25  # Pour tester si l'adresse MAC doit etre corrigee quand l'ip a change, passer a "y" la valeur ci-dessous:
  26  corrige_mac_si_ip_change="y"
  27  
  28  # Parametres du script
  29  user=$1
  30  
  31  # test pour les clients linux
  32  regex_ip='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
  33  machine=$(echo "$2" | grep -E "$regex_ip")
  34  
  35  if [ -z "$machine" ]; then
  36      machine=$(echo "$2" | tr 'A-Z' 'a-z')
  37  else
  38      machinetmp=`nmblookup -A $machine | sed -n '2p' | cut -d' ' -f1 | sed 's/^[ \t]*//;s/[ \t]*$//'`
  39      machine=$(echo "$machinetmp" | tr 'A-Z' 'a-z')
  40  fi
  41  
  42  ip=$3
  43  
  44  if [ "$machine" == "clone" ]; then
  45      exit 0
  46  fi
  47  if echo "$4" | grep -q -E ":|-" ; then
  48      newmac=$(echo "$4" | sed "s/-/:/g" | tr '[A-F]' '[a-f]')
  49  fi
  50  # Dossier/fichier de log si nécessaire
  51  DOSS_SE3LOG=/var/log/se3
  52  mkdir -p $DOSS_SE3LOG
  53  SE3LOG=$DOSS_SE3LOG/connexions.log
  54  
  55  # recup parametres mysql
  56  . /etc/se3/config_o.cache.sh
  57  
  58  # recup parametres ldap
  59  . /etc/se3/config_l.cache.sh
  60  
  61  GET_MAC_FROM_IP()
  62  {
  63  if [ -z "$newmac" ]; then
  64      newmac=$(nmblookup -A $1 | awk  '/MAC Address/ {print  $4}' | sed -e "s/-/:/g")
  65      if [ "$newmac" == "00:00:00:00:00:00" ]; then 
  66          newmac=$(arp -n $1 | awk '/ether/ { print $3 }')
  67      fi
  68      echo $newmac
  69      
  70  else
  71             echo $newmac
  72  fi
  73  }
  74  
  75  VIRE_DN()
  76  {
  77      # on verifie l'existence de doublons et vire les enregistrements dn
  78      # attention : il faut aussi faire le menage dans les parcs, wpkg, italc, les imprimantes....
  79      local attr=$1 
  80      local valeur=$2
  81      local olddnlist=$(ldapsearch -xLLL -b $computersRdn},$ldap_base_dn} "($attr=$valeur)" dn | sed -e "s/^dn: //g;/^$/d")
  82      if [ -n "$olddnlist" ]; then
  83          echo -e "$olddnlist" | while read olddn
  84      do
  85              echo "dn: $olddn
  86  changetype: delete
  87  "
  88          done
  89      fi
  90  }
  91  VIRE_ATTR()
  92  {
  93      # on verifie l'existence d'attributs en double et on les vire
  94  
  95      local attr=$1 
  96      local valeur=$2
  97      local cn=$3 
  98      local res=$(ldapsearch -xLLL -b $computersRdn},$ldap_base_dn} "(&(!(cn=$cn))($attr=$valeur))" $attr | egrep "(^dn:|^$attr:)")
  99      if [ -n "$res" ]; then
 100          echo -e "$res" | sed -e "s/^$attr:/changetype: modify\ndelete: $attr\n$attr:/g"
 101      fi
 102  }            
 103  
 104  # Dossier dans lequel creer les fichiers LDIF temporaires de correction
 105  tmp=/var/lib/se3/connexion_ldif
 106  mkdir -p $tmp}
 107  # Fichier des modifs LDAP
 108  ldif_modif=$tmp/$machine}_$RANDOM.ldif
 109  # La creation d'un fichier est source de lenteur... cela dit, on ne fait normalement pas la modif de l'annuaire frequemment.
 110  
 111  # Recherche LDAP de la machine dans la branche ou=Computers
 112  # ---------------------------------------------------------
 113  
 114  #ldapsearch -xLLL -b ou=Computers,${ldap_base_dn} cn=$machine
 115  OLDIFS=$IFS
 116  IFS="
 117  "
 118  tst=($(ldapsearch -xLLL -b $computersRdn},$ldap_base_dn} cn=$machine ipHostNumber macAddress | egrep "(ipHostNumber|macAddress)"))
 119  IFS=$OLDIFS
 120  if [ "${#tst[*]}" == "0" ]; then
 121      # La machine n'est pas dans l'annuaire
 122  
 123      mac=$(GET_MAC_FROM_IP $ip)
 124      if [ -z "$mac" ]; then
 125          mac="--"
 126      else
 127          # on verifie qu'elle n'a pas changé de nom : on cherche les cn correspondants à l'@ mac
 128          VIRE_DN macAddress $mac > $ldif_modif} 
 129      fi
 130      echo "
 131  dn: cn=$machine,$computersRdn},$ldap_base_dn}
 132  cn: $machine
 133  objectClass: top
 134  objectClass: ipHost
 135  objectClass: ieee802Device
 136  objectClass: organizationalRole
 137  ipHostNumber: $ip
 138  macAddress: $mac
 139  " >> $ldif_modif}
 140  
 141      # Decommenter la ligne pour debug et lancer /usr/share/se3/sbin/connexion.sh admin NOM_MACHINE IP:
 142  #    cat ${ldif_modif}
 143      ldapadd -x -c -D $adminRdn},$ldap_base_dn} -w $adminPw} -f $ldif_modif} > /dev/null 2>&1
 144      touch /tmp/csvtodo
 145  else
 146      # La machine est dans l'annuaire
 147      cpt=0
 148      # Normalement on a que deux lignes dans le tableau:
 149      while [ $cpt -lt ${#tst[*]} ]
 150      do
 151          attribut=$tst[$cpt]}
 152          #echo "attribut=$attribut"
 153          if [ "$attribut:0:14}" == "ipHostNumber: " ]; then
 154              ipHostNumber=$attribut:14}
 155          else
 156              if [ "$attribut:0:12}" == "macAddress: " ]; then
 157                  macAddress=$attribut:12}
 158              fi
 159          fi
 160  
 161          cpt=$(($cpt+1))
 162      done
 163  
 164      #echo "ipHostNumber=$ipHostNumber"
 165      #echo "macAddress=$macAddress"
 166  
 167      if [ -n "$ip" ]; then
 168          if [ "$ip" == "$ipHostNumber" ]; then
 169              if [ "$corrige_mac_si_ip_et_nom_inchange" == "y" ]; then
 170                  mac=$(GET_MAC_FROM_IP $ip)
 171  
 172                  # Controle de l'adresse MAC:
 173                  # Si l'adresse MAC differe sans etre vide, on met a jour
 174                  # (au cas ou on aurait change de machine ou de carte reseau
 175                  # ou si la machine ne repondrait plus au ping)
 176                  if [ "$mac" != "$macAddress" -a -n "$mac" ]; then
 177                      # on vire des enregistrements eventuels avec cette @mac
 178                      VIRE_ATTR macAddress $mac $machine > $ldif_modif}
 179                      echo "
 180  dn: cn=$machine,$computersRdn},$ldap_base_dn}
 181  changetype: modify
 182  replace: macAddress
 183  macAddress: $mac
 184  -" >> $ldif_modif}
 185                      ldapmodify -x -c -D $adminRdn},$ldap_base_dn} -w $adminPw} -f $ldif_modif}  > /dev/null 2>&1
 186                      touch /tmp/csvtodo
 187                  fi
 188              fi
 189          else
 190              # L'adresse IP a change
 191              # on nettoie les enregistrements avec l'ancienne
 192              VIRE_ATTR ipHostNumber $ip $machine > $ldif_modif}
 193              echo "
 194  dn: cn=$machine,$computersRdn},$ldap_base_dn}
 195  changetype: modify
 196  replace: ipHostNumber
 197  ipHostNumber: $ip
 198  -" >> $ldif_modif}
 199  
 200              if [ "$corrige_mac_si_ip_change" == "y" ]; then
 201                  mac=$(GET_MAC_FROM_IP $ip)
 202  
 203                  if [ -n "$mac" ]; then
 204                      echo "replace: macAddress
 205  macAddress: $mac
 206  -" >> $ldif_modif}
 207                  fi
 208              fi
 209  
 210              ldapmodify -x -c -D $adminRdn},$ldap_base_dn} -w $adminPw} -f $ldif_modif}  > /dev/null 2>&1
 211              touch /tmp/csvtodo
 212          fi
 213      else
 214          # Ca ne devrait pas arriver... l'entree existe mais avec une adresse IP vide???
 215          # on fait le menage
 216          VIRE_ATTR ipHostNumber $ip $machine > $ldif_modif}
 217      echo >> $ldif_modif}
 218          VIRE_ATTR macAddress $mac $machine >> $ldif_modif}
 219          echo "
 220  dn: cn=$machine,$computersRdn},$ldap_base_dn}
 221  changetype: modify
 222  replace: ipHostNumber
 223  ipHostNumber: $ip
 224  -" >> $ldif_modif}
 225  
 226          mac=$(GET_MAC_FROM_IP $ip)
 227  
 228          if [ -n "$mac" ]; then
 229              echo "replace: macAddress
 230  macAddress: $mac
 231  -" >> $ldif_modif}
 232          fi
 233  
 234          ldapmodify -x -c -D $adminRdn},$ldap_base_dn} -w $adminPw} -f $ldif_modif}  > /dev/null 2>&1
 235          touch /tmp/csvtodo
 236      fi
 237  
 238  fi
 239  
 240  if [ -e "$ldif_modif}" ]; then
 241      # Pour executer a la main le script /usr/share/se3/sbin/connexion.sh toto xpbof 172.16.123.4
 242      # et suivre les modifs, decommenter les lignes ci-dessous:
 243      #echo ""
 244      #cat ${ldif_modif}
 245      #echo ""
 246      if [  "$DEBUG" != "1" ]; then
 247          rm -f $ldif_modif}
 248      fi
 249  # Pour conserver une trace des operations, on peut commenter la ligne de suppression du LDIF.
 250      #echo "Correction $machine;$ip;$mac le $(date +%Y%m%d-%H%M%S)" >> $SE3LOG
 251  fi
 252  
 253  # Insertion dans la table MySQL de la connexion de l'utilisateur sur cette machine
 254  echo "insert into connexions
 255  set username='$user',
 256  ip_address='$ip',
 257  netbios_name = '$machine',
 258  logintime=now();" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass
 259  
 260  exit 0
 261  


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1