Package zephir :: Package backend :: Module users_rpc
[hide private]
[frames] | no frames]

Source Code for Module zephir.backend.users_rpc

  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  # users_rpc.py 
  9  #   
 10  # fonctions xmlrpc pour la gestion des utilisateurs et permissions 
 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   
25 -class RPCUsers(XMLRPC):
26 """serveur XMLRPC zephir pour la gestion des utilisateurs de l'application 27 """ 28
29 - def __init__(self,bdd='zephir-parc'):
30 self.dbpool = db_connect() 31 self.dbpool.noisy = 0 32 # pool de représentation des serveurs 33 self.s_pool = serveur_pool() 34 XMLRPC.__init__(self) 35 self.reload_perms=0
36
37 - def xmlrpc_get_stats(self, cred_user):
38 """renvoie des statistiques générales sur les serveurs""" 39 return 1, u(self.s_pool.stats)
40
41 - def xmlrpc_get_rights(self,cred_user):
42 """liste des groupes de droits""" 43 # on précharge les groupes de droits 44 query = """select * from groupes_droits""" 45 return self.dbpool.runQuery(query).addCallbacks(self._load_rights,db_client_failed)
46
47 - def _load_rights(self,data):
48 """formattage des groupes de droits 49 """ 50 # on crée en mémoire un dictionnaire des groupes de droits 51 droits=[] 52 for groupe in data: 53 # dictionnaire du type : {id:[droits,libelle]} 54 droits.append([groupe[0],groupe[1],eval(groupe[2])]) 55 return 1, u(droits)
56
57 - def xmlrpc_get_permissions(self,cred_user,username):
58 """liste des permissions de l'application pour un utilisateur précis""" 59 # on récupère la liste des groupes de permissions pour l'utilisateur 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
64 - def _get_permissions(self,data):
65 try: 66 # si l'utilisateur existe, on récupère ses groupes de droits 67 username = data[0][0] 68 groupes = eval(data[0][1]) 69 except: 70 # aucun groupe autorisé pour cet utilisateur 71 return 1, [] 72 73 return 1, u(groupes)
74 75
76 - def xmlrpc_save_permissions(self,cred_user,username,user_auths):
77 """sauvegarde les autorisations de l'utilisateur""" 78 79 # on regarde si l'utilisateur existe dans la base de données 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
83 - def _save_permissions(self,data,username,user_auths):
84 # on tente de récupèrer certaines valeurs dans l'annuaire (mail, nom, prenom) 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 # on récupère le dn complet de l'utilisateur 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 # si utilisateur existant, on le met à jour 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 # sinon on le crée avec des valeurs par défaut 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
126 - def xmlrpc_get_restrictions(self, cred_user, login, type_res=None):
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
135 - def xmlrpc_add_restriction(self, cred_user, login, type_res, id_res):
136 """ajoute des restrictions sur les serveurs accessibles à un utilisateur 137 """ 138 # on regarde si l'utilisateur existe 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
142 - def _add_restriction(self,data,login,type_res,id_res):
143 # on tente de récupèrer certaines valeurs dans l'annuaire (mail, nom, prenom) 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 # on récupère le dn complet de l'utilisateur 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 # si l'utilisateur n'existe pas encore, on le crée avec des valeurs par défaut 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
184 - def _add_restriction2(self,retour,login,type_res,id_res):
185 # ajout réel de la restriction demandée 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
191 - def xmlrpc_del_restriction(self, cred_user, login, type_res, id_res):
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
204 - def xmlrpc_user_group(self,cred_user,username,groupes):
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
209 - def xmlrpc_get_user(self,cred_user,username):
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
215 - def xmlrpc_list_users(self,cred_user):
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
220 - def _list_users(self,data):
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
227 - def xmlrpc_del_user(self,cred_user,login):
228 """suppression d'un utilisateur""" 229 if login: 230 # on interdit la suppression si des variantes appartiennent à l'utilisateur 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
236 - def _del_user(self, data, login):
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 # suppression de l'utilisateur service dans la base de données 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 # utilisateur inexistant 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
268 - def _get_user(self,data):
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
291 - def xmlrpc_save_key(self,cred_user,cle):
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
296 - def xmlrpc_update_client(self,cred_user,name,content=""):
297 """fonction de mise à jour du client disponible sur zephir""" 298 # on supprime l'ancienne version du fichier. 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 # on enlève les rpm avec même version (majeure+mineure) 306 if rpm.startswith(name[:name.rindex('-')]) and rpm.endswith(os.path.splitext(name)[1]): 307 os.unlink(rpm_dir+rpm) 308 # on écrit le nouveau paquet 309 # si pas de contenu, on essaye de télécharger la version officielle sur le site ftp 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
328 - def xmlrpc_remove_client(self,cred_user,name):
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
340 - def xmlrpc_maj_client(self,cred_user,version):
341 """fonction de vérification de la version du client""" 342 # on regarde la version actuelle du client sur zephir 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 # on regarde si on a un paquet correspondant (mm version globale du client) 350 if rpm.startswith(vers_majmin): 351 version_locale=rpm 352 break 353 if version_locale == "": 354 # on a pas trouvé de rpm de mise à jour 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 # on compare avec la version envoyée par le client 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 # cas de eole2 : revision avec X ou Xeol ? 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 # comparaison de la révision 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
377 - def xmlrpc_list_client(self,cred_user):
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