zephir.monitor.agents.ldapscribe

Package zephir :: Package monitor :: Package agents :: Module ldapscribe |
[frames] | no frames]

# Source Code for Module zephir.monitor.agents.ldapscribe

      1  # -*- coding: UTF-8 -*-
      2  ###########################################################################
      3  # Eole NG - 2007
      4  # Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon)
      5  # Licence CeCill  cf /root/LicenceEole.txt
      6  # eole@ac-dijon.fr
      7  ###########################################################################
      8
      9  """
     10  Agent zephir listant le contenu de l'annaire LDAP
     11  """
     12  import time
     13  from scribe import ldapconf
     14  from scribe import eoleldap
     15  from zephir.monitor.agentmanager.agent import Agent
     16  from zephir.monitor.agentmanager.data import HTMLData, TableData
     17  from zephir.monitor.agentmanager import status
     18  from zephir.monitor.agentmanager.util import log
     19
     20 -def color(string):
     21      """
     22      colorie la chaine avec en HTML
     23      """
     24      return "<font color=\"red\">%s</font>" % string
     25
     26 -def add(num1, num2) :
     27      """
     28      addition qui renvoit ??? si erreur
     29      """
     30      if '???' in (num1, num2):
     31          return '???'
     32      else:
     33          return(num1 + num2)
     34
     35 -class LdapScribe(Agent):
     36
     37 -    def __init__(self, name, **params):
     38          """
     39          Gestion du status :
     40              par défaut : OK
     41              Erreur si pas de connexion
     42              Warning si erreur lors d'une ou plusieurs requêtes
     43          """
     44          Agent.__init__(self, name, **params)
     45
     46          self.status = status.OK()
     47          self.fail = 0
     48          self.lastwarn = ''
     49
     50          title1 = HTMLData("<h3>Nombre d'utilisateurs<h3>")
     51          self.table1 = TableData([
     52             ('name', 'Utilisateurs', {'align':'center'}, None),
     53             ('nb', 'Nombre' , {'align':'center'}, None)
     54          ])
     55
     56          title2 = HTMLData("<h3>Nombre de groupes<h3>")
     57          self.table2 = TableData([
     58             ('name', 'Groupes', {'align':'center'}, None),
     59             ('nb', 'Nombre' , {'align':'center'}, None)
     60          ])
     61
     62          title3 = HTMLData("<h3>Nombre de partages<h3>")
     63          self.table3 = TableData([
     64             ('name', 'Partages', {'align':'center'}, None),
     65             ('nb', 'Nombre' , {'align':'center'}, None)
     66          ])
     67
     68          title4 = HTMLData("<h3>Nombre de Postes<h3>")
     69          self.table4 = TableData([
     70             ('name', 'Postes', {'align':'center'}, None),
     71             ('nb', 'Nombre' , {'align':'center'}, None)
     72          ])
     73
     74          self.data = [title1, self.table1, title2, self.table2,
     75                       title3, self.table3, title4, self.table4]
     76
     77 -    def measure(self):
     78          """
     79              exécute toutes les requêtes nécessaires
     80          """
     81          conn = eoleldap.Ldap()
     82          try:
     83              conn.connect()
     84          except:
     85              time.sleep(0.1)
     86              reload(eoleldap)
     87              conn = eoleldap.Ldap()
     88              try:
     89                  conn.connect()
     90              except Exception, err:
     91                  log.msg('erreur connexion ldap : %s' % str(err))
     92                  self.status = status.Warn(str(err))
     93                  return {'statistics1' : [], 'statistics2' : [],
     94                          'statistics3' : [], 'statistics4' : []}
     95
     96          # reset à chaque mesure
     97          self.status = status.OK()
     98          self.fail = 0
     99          self.lastwarn = ''
    100
    101          # ------------------------------------------------------------------ #
    102          ## les utilisateurs ##
    103          statistics1 = []
    104          total1 = 0
    105
    106          for label, filtre in [('Eleves', ldapconf.ELEVE_FILTER),
    107                                ('Enseignants', ldapconf.PROF_FILTER),
    108                                ('Responsables', ldapconf.RESPONSABLE_FILTER),
    109                                ('Administratifs', ldapconf.ADMINISTRATIF_FILTER),
    110                                ('Invités', ldapconf.AUTRE_FILTER),]:
    111              num = self._requete(conn, '(&%s)' % filtre, 'uid')
    112              total1 = add(total1, num)
    113              statistics1.append (
    114                      { 'name' : label,
    115                        'nb'   : num
    116                      })
    117
    118          statistics1.append (
    119              { 'name' : color('Total'),
    120                'nb'   : color(total1)
    121              })
    122
    123
    124          # ------------------------------------------------------------------ #
    125          ## les groupes ##
    126          statistics2 = []
    127          total2 = 0
    128
    129          for label, _type in [('Niveaux', 'Niveau'), ('Classes', 'Classe'),
    130              ('Options', 'Option'), ('Equipes pédagogiques', 'Equipe'),
    131              ('Matières', 'Matiere'), ('Services administratifs', 'Service'),
    132              ('Groupes de travail', 'Groupe'),]:
    133              num = self._requete(conn, '(&%s(type=%s))' % (ldapconf.GROUP_FILTER, _type), 'cn')
    134              total2 = add(total2, num)
    135              statistics2.append (
    136                      { 'name' : label,
    137                        'nb'   : num
    138                      })
    139
    140          try:
    141              num = self._requete(conn, '(&%s)' % (ldapconf.GROUP_FILTER), 'cn') - total2
    142          except:
    143              num = '???'
    144          total2 = add(total2, num)
    145          # nomalement : 7 (DomainAdmins/DomainUsers/DomainComputers/PrintOperators
    146          #                 professeurs/eleves/administratifs)
    147          statistics2.append (
    148                  { 'name' : 'Groupes spéciaux',
    149                    'nb'   : num
    150                  })
    151
    152          statistics2.append (
    153              { 'name' : color('Total'),
    154                'nb'   : color(total2)
    155              })
    156
    157          # ------------------------------------------------------------------ #
    158          ## les partages ##
    159
    160          statistics3 = []
    161          statistics3.append (
    162              { 'name' : color('Total'),
    163                'nb'   : color(self._requete(conn, '(objectclass=sambaFileShare)', 'cn'))
    164              })
    165
    166          # ------------------------------------------------------------------ #
    167          ## les stations ##
    168
    169          statistics4 = []
    170          statistics4.append (
    171              { 'name' : color('Total'),
    172                'nb'   : color(self._requete(conn, "(&(objectclass=posixAccount)(description=Computer))", 'cn'))
    173              })
    174
    175          if self.fail >= 2 :
    176              self.status = status.Warn(self.lastwarn)
    177
    178          return {'statistics1' : statistics1, 'statistics2' : statistics2,
    179                  'statistics3' : statistics3, 'statistics4' : statistics4}
    180
    181 -    def _requete(self, conn, filtre, attr):
    182          time.sleep(0.05)
    183          try:
    184              return len(conn._search(filtre, attr))
    185          except:
    186              try:
    187                  # 2ème tentative
    188                  time.sleep(0.1)
    189                  return len(conn._search(filtre, attr))
    190              except Exception, err:
    191                  log.msg('erreur requête ldap : %s' % str(err))
    192                  self.lastwarn = str(err)
    193                  self.fail += 1
    194                  return '???'
    195
    196 -    def write_data(self):
    197          Agent.write_data(self)
    198          if self.last_measure is not None:
    199              self.table2.table_data = self.last_measure.value['statistics2']
    200              self.table3.table_data = self.last_measure.value['statistics3']
    201              self.table1.table_data = self.last_measure.value['statistics1']
    202              self.table4.table_data = self.last_measure.value['statistics4']
    203
    204 -    def check_status(self):
    205          return self.status
    206