1
2
3
4
5
6
7
8
9
10
11
12
13 """module de gestion des identifiants ent
14 """
15 from zephir.backend.db_utils import db_connect
16 from zephir.backend.aaf import AAF
17 from zephir.backend.config import u, AAF_DIR
18 from zephir.backend.xmlrpceole import XMLRPCEole as XMLRPC
19 from zephir.backend.uucp_utils import uucp_pool, UUCPError
20 import os, shutil, traceback
21
23 """serveur XMLRPC zephir pour la gestion des fichiers d'import AAF
24 """
25
27 self.dbpool = db_connect()
28 self.dbpool.noisy = 0
29 self.parent = parent
30 self.aaf = AAF()
31 XMLRPC.__init__(self)
32
34 """associe un fichier AAF à un serveur
35 """
36 try:
37 id_serveur = int(serveur)
38 self.parent.s_pool.get(cred_user, id_serveur)
39 except (KeyError, ValueError):
40 return 0, """serveur %s non retrouvé""" % str(serveur)
41 try:
42 self.aaf.add_file(filename, id_serveur)
43 except:
44 traceback.print_exc()
45 return 0, u("Erreur lors de l'attribution du fichier \
46 au serveur %s" % str(id_serveur))
47 return 1, "OK"
48
50 """supprime l'association d'un fichier AAF à un serveur
51 """
52
53 try:
54 id_serveur = self.aaf.get_serveur(filename)
55 self.parent.s_pool.get(cred_user, id_serveur)
56 except (KeyError, ValueError):
57 return 0, """serveur associé à %s non retrouvé""" % str(filename)
58 try:
59 self.aaf.del_file(filename)
60 except:
61 traceback.print_exc()
62 return 0, "Impossible de supprimer l'entrée"
63 return 1, "OK"
64
66 """renvoie la liste des fichiers associés à un serveur"""
67 try:
68 id_serveur = int(serveur)
69 self.parent.s_pool.get(cred_user, id_serveur)
70 except (KeyError, ValueError):
71 return 0, """serveur %s non retrouvé""" % str(serveur)
72 try:
73 files = self.aaf.list_files(id_serveur)
74 except:
75 traceback.print_exc()
76 return 0, "Erreur de recherche des fichiers associés au serveur"
77 return 1, u(files)
78
80 """préviens Zéphir qu'un fichier a été mis à jour
81 Envoie le fichier au serveur associé si besoin
82 """
83 if not os.path.isfile(os.path.join(AAF_DIR, filename)):
84 return 0, u("Fichier non retrouvé sur Zéphir : %s" % filename)
85
86 try:
87 id_serveur = self.aaf.get_serveur(filename)
88 serv = self.parent.s_pool[int(id_serveur)]
89 except (KeyError, ValueError):
90 return 0, """serveur associé à %s non retrouvé""" % str(filename)
91
92 def_hash = self.aaf.check_hash(filename)
93 return def_hash.addBoth(self.check_aff_callb, filename, serv)
94
96 if result == True:
97
98 archive = 'import_%s' % filename
99 serveur_dir = serv.get_confdir()
100
101 if os.path.isfile(os.path.join(serveur_dir, archive)):
102 os.unlink(os.path.join(serveur_dir, archive))
103 shutil.copy(os.path.join(AAF_DIR, filename),
104 os.path.join(serveur_dir, archive))
105
106 cmd_checksum = """cd %s;/usr/bin/sha256sum -b %s > %s.sha""" \
107 % (serveur_dir, archive, archive)
108 os.system(cmd_checksum)
109
110 try:
111 id_uucp = "%s-%s" % (str(serv.get_rne()), str(serv.id_s))
112 uucp_pool.add_file(id_uucp, os.path.join(serveur_dir, archive))
113
114
115 uucp_pool.add_cmd(id_uucp, "zephir_client import_aaf")
116 except UUCPError, err:
117 return 0, u("Erreur d'envoi du fichier par uucp: %s" % str(err))
118 return 1, "OK"
119
121 """vérifie que les fichiers transférés sont bien pris en compte
122 et met à jour leur hash dans la base de données
123 """
124 try:
125 serv = self.parent.s_pool[int(id_serveur)]
126 except:
127 return 0, u("Serveur invalide : %s" % str(id_serveur))
128 errors = []
129 for fic_aaf, hash_res in dict_hash.items():
130
131 fic_hash = os.path.join(serv.get_confdir(), "%s.sha" % fic_aaf)
132 if not os.path.isfile(fic_hash):
133 errors.append(fic_aaf)
134 else:
135 hash_data = file(fic_hash).read().split('\n')
136
137 if not hash_res.strip() in hash_data:
138 errors.append(fic_aaf)
139
140 else:
141
142
143 fic_ori = fic_aaf.lstrip('import_')
144 self.aaf.update_hash(fic_ori, hash_res.split()[0])
145
146 os.unlink(os.path.join(serv.get_confdir(), "%s.sha" % fic_aaf))
147 os.unlink(os.path.join(serv.get_confdir(), fic_aaf))
148 if errors != []:
149 return 0, u(errors)
150 return 1, "OK"
151