Package zephir :: Module manage_pool
[frames] | no frames]

Source Code for Module zephir.manage_pool

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  ########################################################################### 
  4  # Eole NG - 2007 
  5  # Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon) 
  6  # Licence CeCill  cf /root/LicenceEole.txt 
  7  # eole@ac-dijon.fr 
  8  # 
  9  # manage_pool.py 
 10  # 
 11  ########################################################################### 
 12   
 13  """ 
 14  librairie de fonctions pour la gestion des identifiants ENT 
 15  """ 
 16   
 17  import sys, os, base64, xmlrpclib, time, subprocess 
 18  # imports creole 
 19  from creole.utils import print_red, print_green, print_orange 
 20  from creole.parsedico import parse_dico 
 21  # imports zephir 
 22  from entpool import ClientIdPool 
 23  try: 
 24      from zephir_conf.zephir_conf import id_serveur 
 25      from lib_zephir import zephir_proxy, convert 
 26      registered = True 
 27  except: 
 28      registered = False 
 29   
 30  ERR_FILE = '/etc/sysconfig/eole/.ent_ids_err' 
 31  OK_FILE = '/etc/sysconfig/eole/.ent_ids_ok' 
 32  # réserve d'identifiants à conserver dans la mesure du possible 
 33  MIN_STOCK = 50 
 34   
35 -def get_pool(code_ent=None):
36 """initialisation d'un pool d'identifiant 37 """ 38 # Récupération du code ent 39 config = parse_dico() 40 try: 41 if not code_ent: 42 code_ent = config['code_ent'] 43 assert len(code_ent) == 2 44 except: 45 return None 46 # Chargement du pool d'identifiants 47 return ClientIdPool(code_ent)
48
49 -def get_new_ids(num_ids):
50 # lecture de la cle ssh publique 51 cle_pub = file('/var/spool/uucp/.ssh/id_rsa.pub').read().strip() 52 try: 53 code, res = convert(zephir_proxy.entid.get_id_range(id_serveur, base64.encodestring(cle_pub), num_ids)) 54 except xmlrpclib.ProtocolError: 55 print_red("""Erreur d'authentification ou zephir non disponible""") 56 return False 57 if code == 0: 58 print_red("Erreur lors de la réservation d'une plage d'identifiants sur Zephir: %s" % str(res)) 59 return False 60 # confirmation de la réservation auprès de Zephir: 61 # - synchronisation du serveur 62 # (lancement de la lecture du fichier de plages envoyé et confirmation) 63 # - attente de la fin de l'action programmée par zephir 64 # - vérification des identifiants disponibles 65 print_orange("Réservation d'une plage d'identifiants auprès de Zephir") 66 print_orange("Veuillez patienter ...") 67 orig_stdout = sys.stdout 68 nullout = open('/dev/null','w') 69 sys.stdout = nullout 70 subprocess.Popen('/usr/share/zephir/scripts/zephir_client.py call >/dev/null 2>&1', shell=True) 71 sys.stdout = orig_stdout 72 nullout.close() 73 # boucle d'attente (60 secondes maxi) 74 # la validation est lancée par zephir à travers uucp 75 wait = 0 76 while wait < 120: 77 time.sleep(0.5) 78 wait += 1 79 if os.path.exists(OK_FILE): 80 os.unlink(OK_FILE) 81 return True 82 if os.path.exists(ERR_FILE): 83 os.unlink(ERR_FILE) 84 break 85 print_red("""La plage Réservée n'a pas pu être validée""") 86 return False
87
88 -def get_ids(num_ids, code_ent = None):
89 pool = get_pool(code_ent) 90 if pool is None: 91 return pool 92 # essai de récupération de num_ids identifiants (on essaye de conserver un stock supplémentaires) 93 required = num_ids + MIN_STOCK 94 if pool.free_space < required: 95 if not registered: 96 if pool.free_space < num_ids: 97 print_red("""Pas assez d'identifiants disponibles. 98 Serveur non enregistré sur Zephir. 99 La récupération automatique d'identifiants n'est pas gérée""") 100 return None 101 else: 102 print_orange("""Il restera moins de %s identifiants en fin de procédure""" % MIN_STOCK) 103 return pool 104 if pool.free_space < num_ids: 105 print_orange("""Pas assez d'identifiants disponibles""") 106 # calcul du nombre d'identifiants à demander (identifiants manquants + stock minimum) 107 if get_new_ids(required - pool.free_space): 108 print_green("Nouveaux identifiants réservés") 109 # chargement du pool et vérification des identifiants disponibles après demande 110 pool.load_state() 111 # on vérifie qu'on a au moins le nombre d'identifiants nécessaire 112 if pool.free_space >= num_ids: 113 print_green("Identifiants disponibles: %s" % str(pool.free_space)) 114 else: 115 print_red("""Impossible de réserver un nombre d'identifiants suffisants auprès de Zephir !""") 116 print_red("""Identifiants disponibles: %s (%s demandés)""" % (str(pool.free_space),str(num_ids))) 117 return None 118 return pool
119
120 -def get_single_id(code_ent = None):
121 pool = get_pool(code_ent) 122 if pool is None: 123 return pool 124 # essai de récupération d'un identifiant 125 if pool.free_space < 1: 126 if not registered: 127 print_red("""Pas assez d'identifiants disponibles. 128 Serveur non enregistré sur Zephir. 129 La récupération automatique d'identifiants n'est pas gérée""") 130 return None 131 else: 132 print_orange("""Pas assez d'identifiants disponibles""") 133 # calcul du nombre d'identifiants à demander (identifiants manquants + stock minimum) 134 if get_new_ids(MIN_STOCK): 135 print_green("Nouveaux identifiants réservés") 136 # chargement du pool et vérification des identifiants disponibles après demande 137 pool.load_state() 138 # on vérifie qu'on a au moins le nombre d'identifiants nécessaire 139 if pool.free_space >= 1: 140 print_green("Identifiants disponibles: %s" % str(pool.free_space)) 141 else: 142 print_red("""Impossible de réserver de nouveaux identifiants auprès de Zephir !""") 143 return None 144 return pool
145 146 if __name__ == "__main__": 147 print("test de génération de 50 identifiants :\n") 148 pool = get_ids(50) 149 if pool: 150 for ent_id in range(50): 151 print ent_id, ' -> ', pool.get_next_id() 152 else: 153 print_red("Récupération des identifiants nécessaires impossible") 154