1lfc_python(3) Python Reference
2lfc_python(3)
3
4
5
6[1mNAME[0m
7 lfc ‐ Python interface to the LFC
8 lfcthr ‐ Thread enabled version of Python interface to the
9LFC
10
11[1mSYNOPSIS[0m
12 [1mimport lfc[0m
13
14 [1mimport lfcthr[0m
15 [1mlfcthr.init()[0m
16
17
18[1mDESCRIPTION[0m
19 The lfc module permits you to access the LFC client
20interface from
21 python programs. The lfc module is a swig wrapping of the
22standard C
23 interface. For detailed descriptions of each function see
24the individ‐
25 ual man page of each function.
26
27 The lfcthr module is a version of the lfc module sup‐
28porting multi‐
29 threaded Python clients. Its usage is similar to the us‐
30age of the lfc
31 module except the obligatory initialisation call lfc‐
32thr.init() in the
33 main program before threads are started.
34
35 There follows a series of examples of how to use selected
36functions and
37 how to retrieve the information returned by them: Examples
38are finding
39 the GUID of an existing entry, listing the replicas of a
40given GUID and
41 setting and retrieving the comment associated with an en‐
42try.
43
44[1mEXAMPLE[0m
45 #!/usr/bin/python
46
47 import sys
48 import lfc
49
50 """
51 # stat an existing entry in the LFC and print the GUID
52 """
53
54 name = "/grid/dteam/my.test"
55
56 stat = lfc.lfc_filestatg()
57 res = lfc.lfc_statg(name,"",stat)
58
59 if res == 0:
60 guid = stat.guid
61 print "The GUID for " + name + " is " + guid
62 else:
63 err_num = lfc.cvar.serrno
64 err_string = lfc.sstrerror(err_num)
65 print "There was an error while looking for " + name +
66": Error " + str(err_num) + " (" + err_string +
67")"
68 sys.exit(1)
69
70[1mEXAMPLE[0m
71 #!/usr/bin/python
72
73 import lfc
74
75 """
76 # list the replicas of a given entry, starting from the
77GUID
78 """
79
80 guid = "6a3164e0‐a4d7‐4abe‐9f76‐e3b8882735d1"
81
82 listp = lfc.lfc_list()
83 flag = lfc.CNS_LIST_BEGIN
84
85 print "Listing replicas for GUID " + guid
86
87 num_replicas=0
88
89 while(1):
90 res = lfc.lfc_listreplica("",guid,flag,listp)
91 flag = lfc.CNS_LIST_CONTINUE
92
93 if res == None:
94 break
95 else:
96 rep_name = res.sfn
97 print "Replica: " + rep_name
98 num_replicas = num_replicas + 1
99
100 lfc.lfc_listreplica("",guid,lfc.CNS_LIST_END,listp)
101 print "Found " + str(num_replicas) + " replica(s)"
102
103[1mEXAMPLE[0m
104 #!/usr/bin/python
105
106 import sys
107 import lfc
108 import re
109
110 """
111 # setting and retrieving a comment on a file
112 """
113
114 file = "/grid/dteam/my.test"
115
116 comment = "MyComment"
117 res = lfc.lfc_setcomment(file,comment)
118
119 if res != 0:
120 err_num = lfc.cvar.serrno
121 err_string = lfc.sstrerror(err_num)
122 print "Problem while setting comment for " + file + ":
123Error " + str(err_num) + " (" + err_string + ")"
124 sys.exit(1)
125
126 buffer=""
127 for i in range(0,lfc.CA_MAXCOMMENTLEN+1):
128 buffer=buffer + " "
129
130 res = lfc.lfc_getcomment(file,buffer)
131
132 if res != 0:
133 err_num = lfc.cvar.serrno
134 err_string = lfc.sstrerror(err_num)
135 print "Problem while reading the comment for " + file +
136": Error " + str(err_num) + " (" + err_string +
137")"
138 sys.exit(1)
139
140 r = re.compile("(.*?) ", re.DOTALL)
141 comment = r.findall(buffer)[0]
142
143 print "Read back comment " + comment
144
145
146[1mEXAMPLE[0m
147 #!/usr/bin/python
148
149 """
150 # Using the lfc_readdirxr method
151 """
152
153 import sys
154 import lfc
155
156 name = "/grid/dteam/my.test"
157
158 dir = lfc.lfc_opendirg(name,"")
159 if (dir == None) or (dir == 0):
160 err_num = lfc.cvar.serrno
161 err_string = lfc.sstrerror(err_num)
162 print "Error while looking for " + name + ": Error
163" + str(err_num) + " (" + err_string + ")"
164 sys.exit(1)
165
166 while 1:
167 read_pt = lfc.lfc_readdirxr(dir,"")
168 if (read_pt == None) or (read_pt == 0):
169 break
170 entry, list = read_pt
171 print entry.d_name
172 try:
173 for i in range(len(list)):
174 print " ==> %s" % list[i].sfn
175 except TypeError, x:
176 print " ==> None"
177
178 lfc.lfc_closedir(dir)
179
180
181[1mEXAMPLE[0m
182 #!/usr/bin/python
183
184 import lfc
185
186 """
187 # Using the lfc_getlinks method
188 """
189
190 result, list = lfc.lfc_getlinks("/grid/dteam/antotests/ex‐
191tratests/dir2/f105", "")
192 print result
193 print len(list)
194 if (result == 0):
195 for i in list:
196 print i.path
197
198
199[1mEXAMPLE[0m
200 #!/usr/bin/python
201
202 import lfc
203
204 """
205 # Using the lfc_getreplica method
206 """
207
208 result, list = lfc.lfc_getreplica("/grid/dteam/an‐
209totests/extratests/dir2/f105", "", "")
210 print result
211 print len(list)
212 if (result == 0):
213 for i in list:
214 print i.host
215 print i.sfn
216
217
218[1mEXAMPLE[0m
219 #!/usr/bin/python
220
221 import lfc
222
223 """
224 # Using the lfc_getacl and lfc_setacl methods to add a us‐
225er ACL
226 """
227
228 nentries, acls_list = lfc.lfc_geta‐
229cl("/grid/dteam/tests_sophie3", lfc.CA_MAXACLENTRIES)
230
231 print nentries
232 print len(acls_list)
233
234 for i in acls_list:
235 print i.a_type
236 print i.a_id
237 print i.a_perm
238
239 # When adding a first ACL for a given user, you also need
240to add the mask
241 # When adding the second user ACL, it is not necessary
242anymore
243
244 acl_user = lfc.lfc_acl()
245 acl_mask = lfc.lfc_acl()
246
247 acl_user.a_type=2 # 2 corresponds to CNS_ACL_USER
248 acl_user.a_id=18701 # user id
249 acl_user.a_perm=5
250
251 acl_mask.a_type=5 # 5 corresponds to CNS_ACL_MASK
252 acl_mask.a_id=0 # no user id specified
253 acl_mask.a_perm=5
254
255 acls_list.append(acl_user)
256 acls_list.append(acl_mask)
257
258 res = lfc.lfc_setacl("/grid/dteam/tests_sophie3",
259acls_list)
260
261 if res == 0:
262 print "OK"
263 else:
264 err_num = lfc.cvar.serrno
265 err_string = lfc.sstrerror(err_num)
266 print "There was an error : Error " + str(err_num)
267+ " (" + err_string + ")"
268 sys.exit(1)
269
270
271[1mEXAMPLE[0m
272 #!/usr/bin/python
273
274 import lfc
275
276 """
277 # Using the lfc_getacl and lfc_setacl methods to remove a
278user ACL
279 """
280
281 nentries, acls_list = lfc.lfc_geta‐
282cl("/grid/dteam/tests_sophie3", lfc.CA_MAXACLENTRIES)
283
284 # Note : you cannot remove the owner ACL (i.e. for
285CNS_ACL_USER_OBJ type) if ACLs
286 # ====== for other users exist. Ff all the other user ACLs
287are deleted, the owner
288 # ====== ACL is automatically removed.
289
290 for i in acls_list:
291 print i.a_type
292 print i.a_id
293 print i.a_perm
294
295 del acls_list[1] # delete a given user ACL from the
296list of ACLs
297
298 res = lfc.lfc_setacl("/grid/dteam/tests_sophie3",
299acls_list)
300
301 if res == 0:
302 print "OK"
303 else:
304 err_num = lfc.cvar.serrno
305 err_string = lfc.sstrerror(err_num)
306 print "There was an error : Error " + str(err_num)
307+ " (" + err_string + ")"
308 sys.exit(1)
309
310
311[1mEXAMPLE[0m
312 #!/usr/bin/env python
313 import lfcthr
314 import os
315 from threading import Thread
316
317 class slave(Thread):
318
319 def __init__ (self):
320 Thread.__init__(self)
321
322 def run(self):
323 ....
324 result = lfcthr.lfc_getreplica("", guid, "")
325 ....
326 return
327
328 if __name__ == ’__main__’:
329
330 os.environ[’LFC_HOST’] = ’my_lfc.cern.ch’
331
332 # Threaded library initialisation
333 lfcthr.init()
334
335 ....
336 # Start up of threads
337 for i in xrange(totalNumberOfSlaves):
338 slv = slave(i)
339 slv.start()
340
341 ....
342
343
344
345[1mEXAMPLE[0m
346 #!/usr/bin/python
347
348 import lfc
349
350 """
351 # Using the lfc_getusrmap method
352 """
353
354 result, list = lfc.lfc_getusrmap()
355 print result
356 print len(list)
357 if (result == 0):
358 for i in list:
359 print i.userid + " " + i.username
360
361
362[1mEXAMPLE[0m
363 #!/usr/bin/python
364
365 import lfc
366
367 """
368 # Using the lfc_getgrpmap method
369 """
370
371 result, list = lfc.lfc_getgrpmap()
372 print result
373 print len(list)
374 if (result == 0):
375 for i in list:
376 print i.gid + " " + i.groupname
377
378
379[1mKNOWN BUGS[0m
380 The current interface to the [1mlfc_getcom‐
381ment(3)[22m, [1mlfc_getcwd(3)[22m,
382 [1mlfc_readlink(3)[22m, [1mlfc_seterrbuf(3) [22mrequires
383the passing of str object
384 which is modified to contain the result (in a similar
385way to the C
386 functions, which accept a buffer). However this breaks
387the immutabil‐
388 ity of python str. This will be changed in the future.
389
390[1mSEE ALSO[0m
391 [1mLFC C interface man pages[0m
392
393
394
395LFC $Date: 2010‐02‐04 12:08:39 +0000 (Thu, 04 Feb 2010)
396$lfc_python(3)