1
2
3
4
5
6
7
8
9
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
19 from creole.utils import print_red, print_green, print_orange
20 from creole.parsedico import parse_dico
21
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
33 MIN_STOCK = 50
34
36 """initialisation d'un pool d'identifiant
37 """
38
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
47 return ClientIdPool(code_ent)
48
50
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
61
62
63
64
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
74
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
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
107 if get_new_ids(required - pool.free_space):
108 print_green("Nouveaux identifiants réservés")
109
110 pool.load_state()
111
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
121 pool = get_pool(code_ent)
122 if pool is None:
123 return pool
124
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
134 if get_new_ids(MIN_STOCK):
135 print_green("Nouveaux identifiants réservés")
136
137 pool.load_state()
138
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