2 # implements support for SFA records stored in db tables
4 # TODO: Use existing PLC database methods? or keep this separate?
7 from sfa.trust.gid import *
8 from sfa.util.record import *
9 from sfa.util.config import *
10 from sfa.util.filter import *
11 from sfa.trust.hierarchy import *
12 from sfa.trust.certificate import *
13 from sfa.trust.auth import *
14 from sfa.senslab.OARrestapi import *
18 def __init__(self, record_filter = None):
20 self.ldapserv=ldap.open("192.168.0.251")
21 self.senslabauth=Hierarchy()
22 authinfo=self.senslabauth.get_auth_info("senslab")
24 gid=authinfo.get_gid_object()
29 def db_fields(self, obj=None):
33 def is_writable (key,value,dict):
34 # if not mentioned, assume it's writable (e.g. deleted ...)
35 if key not in dict: return True
36 # if mentioned but not linked to a Parameter object, idem
37 if not isinstance(dict[key], Parameter): return True
38 # if not marked ro, it's writable
39 if not dict[key].ro: return True
47 def remove(self, record):
50 def insert(self, record):
53 def update(self, record):
56 def quote_string(self, value):
57 return str(self.db.quote(value))
59 def quote(self, value):
60 return self.db.quote(value)
62 def ldapFind(self, record_filter = None, columns=None):
66 #first, ldap for users
68 if 'authority' in record_filter:
70 if record_filter['authority']=='senslab':
72 # request all records which are under our authority, ie all ldap entries
78 if not 'hrn' in record_filter:
79 print >>sys.stderr,"find : don't know how to handle filter ",record_filter
83 h=record_filter['hrn']
84 if isinstance(h,list):
91 splited_hrn=hrn.split(".")
92 if splited_hrn[0] != "senslab" :
93 print >>sys.stderr,"i know nothing about",hrn
102 rindex=self.ldapserv.search("ou=people,dc=senslab,dc=info",ldap.SCOPE_SUBTREE,ldapfilter, ['mail','givenName', 'sn', 'uid','sshPublicKey'])
103 ldapresponse=self.ldapserv.result(rindex,1)
104 for ldapentry in ldapresponse[1]:
105 hrn="senslab."+ldapentry[1]['uid'][0]
108 RSA_KEY_STRING=ldapentry[1]['sshPublicKey'][0]
110 pkey=convert_public_key(RSA_KEY_STRING)
112 gid=self.senslabauth.create_gid("urn:publicid:IDN+senslab+user+"+ldapentry[1]['uid'][0], uuid, pkey, CA=False)
114 parent_hrn = get_authority(hrn)
115 parent_auth_info = self.senslabauth.get_auth_info(parent_hrn)
119 # 'email': ldapentry[1]['mail'][0],
120 # 'first_name': ldapentry[1]['givenName'][0],
121 # 'last_name': ldapentry[1]['sn'][0],
123 'gid': gid.save_to_string(),
125 'authority': 'senslab',
126 'peer_authority': '',
129 'date_created' : 'none',
130 'last_updated': 'none'
134 def oarFind(self, record_filter = None, columns=None):
138 if 'authority' in record_filter:
140 if record_filter['authority']=='senslab':
142 print>> sys.stderr , "ET MERDE !!!!"
145 # which is NOT senslab
148 if not 'hrn' in record_filter:
149 print >>sys.stderr,"find : don't know how to handle filter ",record_filter
153 h=record_filter['hrn']
154 if isinstance(h,list):
160 head,sep,tail=hrn.partition(".")
161 if head != "senslab" :
162 print >>sys.stderr,"i know nothing about",hrn
164 node_ids.append(tail)
166 node_list = self.oar.GetNodes( node_ids)
168 for node in node_list:
169 hrn="senslab."+node['hostname']
172 # 'email': ldapentry[1]['mail'][0],
173 # 'first_name': ldapentry[1]['givenName'][0],
174 # 'last_name': ldapentry[1]['sn'][0],
176 # 'gid': gid.save_to_string(),
178 'authority': 'senslab',
179 'peer_authority': '',
182 'date_created' : 'none',
183 'last_updated': 'none'
188 def find(self, record_filter = None, columns=None):
189 # senslab stores its users in an ldap dictionnary
190 # and nodes in a oar scheduller database
191 # both should be interrogated.
192 print >>sys.stderr,"find : ",record_filter
193 if not isinstance(record_filter,dict):
194 print >>sys.stderr,"find : record_filter is not a dict"
195 print >>sys.stderr,record_filter.__class__
198 if 'type' in record_filter:
199 if record_filter['type'] == 'slice':
200 print >>sys.stderr,"find : don't know how to handle slices yet"
202 if record_filter['type'] == 'authority':
203 if 'hrn' in record_filter and record_filter['hrn']=='senslab':
206 print >>sys.stderr,"find which authority ?"
208 if record_filter['type'] == 'user':
209 return self.ldapFind(record_filter, columns)
210 if record_filter['type'] == 'node':
211 return self.ldapFind(record_filter, columns)
213 print >>sys.stderr,"unknown type to find : ", record_filter['type']
216 allResults = self.ldapFind(record_filter, columns)
217 allResults+= self.oarFind(record_filter, columns)
221 def findObjects(self, record_filter = None, columns=None):
223 print >>sys.stderr,"find : ",record_filter
224 # print record_filter['type']
225 # if record_filter['type'] in ['authority']:
226 # print "findObjectAuthority"
227 results = self.find(record_filter, columns)
229 for result in results:
230 if result['type'] in ['authority']:
231 result_rec_list.append(AuthorityRecord(dict=result))
232 elif result['type'] in ['node']:
233 result_rec_list.append(NodeRecord(dict=result))
234 elif result['type'] in ['slice']:
235 result_rec_list.append(SliceRecord(dict=result))
236 elif result['type'] in ['user']:
237 result_rec_list.append(UserRecord(dict=result))
239 result_rec_list.append(SfaRecord(dict=result))
241 return result_rec_list
247 def sfa_records_purge(self):