1
2
3
4
5
6
7
8
9
10
11
12
13 """module de gestion des utilisateurs de l'application
14 """
15 from twisted.python import log
16 from zephir.backend import config
17 from zephir.backend.db_utils import *
18 from zephir.backend.config import u
19 from zephir.backend.xmlrpceole import XMLRPCEole as XMLRPC
20 from lib_backend import serveur_pool
21
22
23 import sys,base64,ldap,os
24
26 """serveur XMLRPC zephir pour la gestion des utilisateurs de l'application
27 """
28
36
38 """renvoie des statistiques générales sur les serveurs"""
39 return 1, u(self.s_pool.stats)
40
42 """liste des groupes de droits"""
43
44 query = """select * from groupes_droits"""
45 return self.dbpool.runQuery(query).addCallbacks(self._load_rights,db_client_failed)
46
48 """formattage des groupes de droits
49 """
50
51 droits=[]
52 for groupe in data:
53
54 droits.append([groupe[0],groupe[1],eval(groupe[2])])
55 return 1, u(droits)
56
58 """liste des permissions de l'application pour un utilisateur précis"""
59
60 query = """select login, droits from users where login = '%s'""" % username
61
62 return self.dbpool.runQuery(query).addCallbacks(self._get_permissions,db_client_failed)
63
65 try:
66
67 username = data[0][0]
68 groupes = eval(data[0][1])
69 except:
70
71 return 1, []
72
73 return 1, u(groupes)
74
75
77 """sauvegarde les autorisations de l'utilisateur"""
78
79
80 query = """select login,nom,prenom,mail from users where login = '%s'""" % username
81 return self.dbpool.runQuery(query).addCallbacks(self._save_permissions,db_client_failed,callbackArgs=[username,user_auths])
82
84
85 if data!=[]:
86 nom=data[0][1]
87 prenom=data[0][2]
88 mail=data[0][3]
89 else:
90 nom=""
91 prenom=""
92 mail=""
93 try:
94 l=ldap.open(config.ADRESSE_LDAP)
95
96 result=l.search_s(config.BASE_LDAP, ldap.SCOPE_SUBTREE, "(uid="+username+")")
97 res_ldap = result[0][1]
98 l.unbind()
99 if nom == "":
100 try:
101 nom=res_ldap['sn'][0]
102 except KeyError:
103 pass
104 if prenom == "":
105 try:
106 prenom=res_ldap['givenName'][0]
107 except KeyError:
108 pass
109 if mail == "":
110 try:
111 mail=res_ldap['mail'][0]
112 except KeyError:
113 pass
114 except:
115 pass
116 if data != []:
117
118 query = """update users set droits='%s',nom='%s',prenom='%s',mail='%s' where login = '%s'""" % (str(user_auths),nom,prenom,mail,username)
119 else:
120
121 query = """insert into users (login,mail_actif,sms_actif,droits,nom,prenom,mail) \
122 values ('%s',%s,%s,'%s','%s','%s','%s')""" % (username,0,0,str(user_auths),nom,prenom,mail)
123
124 return self.dbpool.runOperation(query).addCallbacks(lambda x : [1,'ok'],db_client_failed)
125
127 """ajoute des restrictions sur les serveurs accessibles à un utilisateur
128 """
129 try:
130 res = self.s_pool.get_restrictions(login, type_res)
131 except KeyError:
132 return 0, u("utilisateur ou type de contrainte non valides")
133 return 1, u(res)
134
136 """ajoute des restrictions sur les serveurs accessibles à un utilisateur
137 """
138
139 query = """select login,nom,prenom,mail from users where login = '%s'""" % login
140 return self.dbpool.runQuery(query).addCallbacks(self._add_restriction,db_client_failed,callbackArgs=[login, type_res, id_res])
141
143
144 if data!=[]:
145 nom=data[0][1]
146 prenom=data[0][2]
147 mail=data[0][3]
148 else:
149 nom=""
150 prenom=""
151 mail=""
152 try:
153 l=ldap.open(config.ADRESSE_LDAP)
154
155 result=l.search_s(config.BASE_LDAP, ldap.SCOPE_SUBTREE, "(uid="+login+")")
156 res_ldap = result[0][1]
157 l.unbind()
158 if nom == "":
159 try:
160 nom=res_ldap['sn'][0]
161 except KeyError:
162 pass
163 if prenom == "":
164 try:
165 prenom=res_ldap['givenName'][0]
166 except KeyError:
167 pass
168 if mail == "":
169 try:
170 mail=res_ldap['mail'][0]
171 except KeyError:
172 pass
173 except:
174 pass
175 if data == []:
176 user_auths = []
177
178 query = """insert into users (login,mail_actif,sms_actif,droits,nom,prenom,mail) \
179 values ('%s',%s,%s,'%s','%s','%s','%s')""" % (login,0,0,str(user_auths),nom,prenom,mail)
180 return self.dbpool.runOperation(query).addCallbacks(self._add_restriction2,db_client_failed,callbackArgs=[login, type_res, id_res])
181 else:
182 return self._add_restriction2(None, login, type_res, id_res)
183
185
186 if self.s_pool.add_restriction(login, type_res, id_res):
187 return 1, "ok"
188 else:
189 return 0, u("erreur lors de l'ajout de la contrainte")
190
192 """ajoute des restrictions sur les serveurs accessibles à un utilisateur
193 """
194 if self.s_pool.del_restriction(login, type_res, id_res):
195 return 1, "ok"
196 else:
197 return 0, u("erreur, contrainte non retrouvée")
198
199 - def _log(self,date,type_msg,msg,id_serveur=None):
200 """fonction de log des actions effectuées sur les serveurs"""
201 query = """insert into log_zephir(date,type,message) values ('%s','%s','%s','%s')""" % (id_user,date,type_msg,msg)
202 return self.dbpool.runOperation(query).addCallbacks(lambda x : [1,'ok'],db_client_failed)
203
205 """met à jour la liste des groupes surveillés par l'utilisateur"""
206 query = """update users set groupes = '%s' where login = '%s'""" % (str(groupes),username)
207 return self.dbpool.runOperation(query).addCallbacks(lambda x : [1,'ok'],db_client_failed)
208
210 """renvoie les informations d'un utilisateur
211 """
212 query = """select login,mail,nom,prenom,sms,mail_actif,sms_actif,droits,groupes,cle from users where login = '%s'""" % username
213 return self.dbpool.runQuery(query).addCallbacks(self._get_user,db_client_failed)
214
216 """retourne la liste des utilisateurs"""
217 query = """select login from users order by login asc"""
218 return self.dbpool.runQuery(query).addCallbacks(self._list_users,db_client_failed)
219
221 """formate la sortie de la base de données"""
222 logins=[]
223 for user in data:
224 logins.append(user[0])
225 return 1,u(logins)
226
228 """suppression d'un utilisateur"""
229 if login:
230
231 query = """select libelle from variantes where owner='%s'""" % login
232 return self.dbpool.runQuery(query).addCallbacks(self._del_user,db_client_failed,callbackArgs=[login])
233 else:
234 return 0,u("""donnez un identifiant""")
235
237 if len(data) > 0:
238 return 0, u("""suppression impossible, des variantes appartiennent à %s: %s""" % (login, ", ".join([lib[0] for lib in data])))
239
240 query = """delete from restrictions where login='%s'""" % login
241 self.dbpool.runOperation(query)
242 query = """delete from serveur_auth where login='%s'""" % login
243 self.dbpool.runOperation(query)
244 query = """delete from users where login='%s'""" % login
245 return self.dbpool.runOperation(query).addCallbacks(lambda x:(1,'ok'), db_client_failed)
246
247 - def xmlrpc_edit_user(self,cred_user,username,nom,prenom,mail,sms,mail_actif,sms_actif):
248 """édite les informations d'un utilisateur
249 """
250 query = """select * from users where login = '%s'""" % username
251 return self.dbpool.runQuery(query).addCallbacks(self._edit_user,db_client_failed,callbackArgs=[username,nom,prenom,mail,sms,mail_actif,sms_actif])
252
253 - def _edit_user(self,data,username,nom,prenom,mail,sms,mail_actif,sms_actif):
254 """
255 """
256 if data == []:
257
258 query = """insert into users values ('%s','%s','%s','%s','%s',%s,%s,'','')""" % \
259 (username, nom, prenom, mail, sms, mail_actif, sms_actif)
260 else:
261 query = """update users set nom='%s', prenom='%s', mail='%s', sms='%s', mail_actif=%s, sms_actif=%s where login='%s'""" % \
262 (nom, prenom, mail, sms, mail_actif, sms_actif, username)
263
264 return self.dbpool.runOperation(query).addCallbacks(lambda x : [1,'ok'],db_client_failed)
265
266
267
269 """formate la sortie de la base de données"""
270 user=[]
271 if data != []:
272 for field in data[0]:
273 if field in [None, 'None']:
274 user.append("")
275 else:
276 user.append(field)
277
278 if user[7] == "":
279 user[7] = "[]"
280 if user[8] == "":
281 user[8] = "[]"
282 if user[9] != "":
283 user[9] = 1
284 else:
285 user[9] = 0
286
287 return 1, u([user[0],user[1],user[2],user[3],user[4],int(user[5]),int(user[6]),eval(user[7]),eval(user[8]),user[9]])
288 else:
289 return 1, []
290
292 """sauvegarde la cle ssh de l'utilisateur"""
293 query = """update users set cle='%s' where login='%s'""" % (cle.replace("'","\'"),cred_user)
294 return self.dbpool.runOperation(query).addCallbacks(lambda x : [1,'ok'], db_client_failed)
295
297 """fonction de mise à jour du client disponible sur zephir"""
298
299 try:
300 rpm_dir = os.path.abspath(config.PATH_ZEPHIR)+"/sites/client/"
301 if not os.path.isdir(rpm_dir):
302 os.makedirs(rpm_dir)
303 rpms = os.listdir(rpm_dir)
304 for rpm in rpms:
305
306 if rpm.startswith(name[:name.rindex('-')]) and rpm.endswith(os.path.splitext(name)[1]):
307 os.unlink(rpm_dir+rpm)
308
309
310 if content == "":
311 import ftplib
312 conn = ftplib.FTP(config.CLIENT_UPDATE_HOST)
313 conn.login()
314 if name.endswith('.deb'):
315 conn.cwd(config.CLIENT_NG_URL)
316 else:
317 conn.cwd(config.CLIENT_UPDATE_URL)
318 conn.retrbinary('RETR %s' % name, open(rpm_dir + name, 'wb').write)
319 else:
320 content = base64.decodestring(content)
321 fic_rpm=file(rpm_dir + name,'w')
322 fic_rpm.write(content)
323 fic_rpm.close()
324 return 1, "OK"
325 except Exception, e:
326 return 0, u("Erreur de mise a jour du client")
327
329 """suppression d'un client disponible sur zephir"""
330 try:
331 rpm_dir = os.path.abspath(config.PATH_ZEPHIR)+"/sites/client/"
332 rpm = os.path.join(rpm_dir,name)
333 if not os.path.isfile(rpm):
334 return 0, u("Fichier non trouvé %s" % name)
335 os.unlink(rpm)
336 return 1, "OK"
337 except Exception, e:
338 return 0, u("Erreur de suppression du fichier")
339
341 """fonction de vérification de la version du client"""
342
343 vers_majmin=version[:version.rindex('-')]
344 try:
345 version_locale = ""
346 if os.path.isdir(os.path.abspath(config.PATH_ZEPHIR)+"/sites/client"):
347 rpms=os.listdir(os.path.abspath(config.PATH_ZEPHIR)+"/sites/client")
348 for rpm in rpms:
349
350 if rpm.startswith(vers_majmin):
351 version_locale=rpm
352 break
353 if version_locale == "":
354
355 return 1,"OK"
356 except Exception,e:
357 return 0,u('erreur lors de la lecture de la version sur zephir : %s' % str(e))
358
359 vers_loc = version_locale.replace(vers_majmin,"")
360 vers_dist = version.replace(vers_majmin,"")
361 if version.split('zephir-client')[1][1:].startswith('2'):
362
363 vers_loc = vers_loc[1:vers_loc.index('_')].replace('eole','')
364 vers_dist = vers_dist[1:].replace('eole','')
365 else:
366 vers_loc = vers_loc[1:vers_loc.index('eol')]
367 vers_dist = vers_dist[1:vers_dist.index('eol')]
368
369 maj=0
370 if int(vers_loc) > int(vers_dist):
371 maj=1
372 if maj == 1:
373 return 1,u(version_locale.strip())
374 else:
375 return 1,"OK"
376
378 """suppression d'un client disponible sur zephir"""
379 try:
380 rpms = []
381 rpm_dir = os.path.abspath(config.PATH_ZEPHIR)+"/sites/client/"
382 if os.path.isdir(rpm_dir):
383 for rpm in os.listdir(rpm_dir):
384 if rpm.startswith('zephir-client'):
385 rpms.append(rpm)
386 return 1, u(rpms)
387 except Exception, e:
388 return 0, u("Erreur de lecture du répertoire")
389