SYNOPSIS

import lfc

import lfcthr

lfcthr.init()

DESCRIPTION

The lfc module permits you to access the LFC client interface from python programs. The lfc module is a swig wrapping of the standard C interface. For detailed descriptions of each function see the individual man page of each function.

The lfcthr module is a version of the lfc module supporting multi-threaded Python clients. Its usage is similar to the usage of the lfc module except the obligatory initialisation call lfcthr.init() in the main program before threads are started.

There follows a series of examples of how to use selected functions and how to retrieve the information returned by them: Examples are finding the GUID of an existing entry, listing the replicas of a given GUID and setting and retrieving the comment associated with an entry.

EXAMPLE

#!/usr/bin/python

import sys
import lfc

"""
# stat an existing entry in the LFC and print the GUID
"""

name = "/grid/dteam/my.test"

stat = lfc.lfc_filestatg()
res = lfc.lfc_statg(name,"",stat)

if res == 0:
   guid = stat.guid
   print "The GUID for " + name + " is " + guid
else:
   err_num = lfc.cvar.serrno
   err_string = lfc.sstrerror(err_num)
   print "There was an error while looking for " + name + ": Error " + str(err_num) \
		+ " (" + err_string + ")"
   sys.exit(1)

EXAMPLE

#!/usr/bin/python

import lfc

"""
# list the replicas of a given entry, starting from the GUID
"""

guid = "6a3164e0-a4d7-4abe-9f76-e3b8882735d1"

listp = lfc.lfc_list()
flag = lfc.CNS_LIST_BEGIN

print "Listing replicas for GUID " + guid

num_replicas=0

while(1):
   res = lfc.lfc_listreplica("",guid,flag,listp)
   flag = lfc.CNS_LIST_CONTINUE

   if res == None:
      break
   else:
      rep_name = res.sfn
      print "Replica: " + rep_name
      num_replicas = num_replicas + 1

lfc.lfc_listreplica("",guid,lfc.CNS_LIST_END,listp)
print "Found " + str(num_replicas) + " replica(s)"

EXAMPLE

#!/usr/bin/python

import sys
import lfc
import re

"""
# setting and retrieving a comment on a file
"""

file = "/grid/dteam/my.test"

comment = "MyComment"
res = lfc.lfc_setcomment(file,comment)

if res != 0:
   err_num = lfc.cvar.serrno
   err_string = lfc.sstrerror(err_num)
   print "Problem while setting comment for " + file + ": Error " + str(err_num) \
		+ " (" + err_string + ")"
   sys.exit(1)

buffer=""
for i in range(0,lfc.CA_MAXCOMMENTLEN+1):
  buffer=buffer + " "

res = lfc.lfc_getcomment(file,buffer)

if res != 0:
   err_num = lfc.cvar.serrno
   err_string = lfc.sstrerror(err_num)
   print "Problem while reading the comment for " + file + ": Error " + str(err_num) \
		+ " (" + err_string + ")"
   sys.exit(1)

r = re.compile("(.*?) ", re.DOTALL)
comment = r.findall(buffer)[0]

print "Read back comment " + comment

EXAMPLE

#!/usr/bin/python

"""
# Using the lfc_readdirxr method
"""

import sys
import lfc

name = "/grid/dteam/my.test"

dir = lfc.lfc_opendirg(name,"")
if (dir == None) or (dir == 0):
        err_num = lfc.cvar.serrno
        err_string = lfc.sstrerror(err_num)
        print "Error while looking for " + name + ": Error " + str(err_num) \
			+ " (" + err_string + ")"
        sys.exit(1)

while 1:
        read_pt = lfc.lfc_readdirxr(dir,"")
        if (read_pt == None) or (read_pt == 0):
                break
        entry, list = read_pt
        print entry.d_name
        try:
                for i in range(len(list)):
                        print " ==> %s" % list[i].sfn
        except TypeError, x:
                print " ==> None"

lfc.lfc_closedir(dir)

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getlinks method
"""

result, list = lfc.lfc_getlinks("/grid/dteam/antotests/extratests/dir2/f105", "")
print result
print len(list)
if (result == 0):
	for i in list:
		print i.path

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getreplica method
"""

result, list = lfc.lfc_getreplica("/grid/dteam/antotests/extratests/dir2/f105", "", "")
print result
print len(list)
if (result == 0):
	for i in list:
		print i.host
		print i.sfn

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getacl and lfc_setacl methods to add a user ACL
"""

nentries, acls_list = lfc.lfc_getacl("/grid/dteam/tests_sophie3", lfc.CA_MAXACLENTRIES)

print nentries
print len(acls_list)

for i in acls_list:
        print i.a_type
        print i.a_id
        print i.a_perm

# When adding a first ACL for a given user, you also need to add the mask
# When adding the second user ACL, it is not necessary anymore

acl_user = lfc.lfc_acl()
acl_mask = lfc.lfc_acl()

acl_user.a_type=2		# 2 corresponds to CNS_ACL_USER
acl_user.a_id=18701		# user id
acl_user.a_perm=5

acl_mask.a_type=5		# 5 corresponds to CNS_ACL_MASK
acl_mask.a_id=0			# no user id specified
acl_mask.a_perm=5

acls_list.append(acl_user)
acls_list.append(acl_mask)

res = lfc.lfc_setacl("/grid/dteam/tests_sophie3", acls_list)

if res == 0:
        print "OK"
else:
        err_num = lfc.cvar.serrno
        err_string = lfc.sstrerror(err_num)
        print "There was an error : Error " + str(err_num) + " (" + err_string + ")"
        sys.exit(1)

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getacl and lfc_setacl methods to remove a user ACL
"""

nentries, acls_list = lfc.lfc_getacl("/grid/dteam/tests_sophie3", lfc.CA_MAXACLENTRIES)

# Note : you cannot remove the owner ACL (i.e. for CNS_ACL_USER_OBJ type) if ACLs
# ====== for other users exist. Ff all the other user ACLs are deleted, the owner
# ====== ACL is automatically removed.

for i in acls_list:
        print i.a_type
        print i.a_id
        print i.a_perm

del acls_list[1]	# delete a given user ACL from the list of ACLs

res = lfc.lfc_setacl("/grid/dteam/tests_sophie3", acls_list)

if res == 0:
        print "OK"
else:
        err_num = lfc.cvar.serrno
        err_string = lfc.sstrerror(err_num)
        print "There was an error : Error " + str(err_num) + " (" + err_string + ")"
        sys.exit(1)

EXAMPLE

#!/usr/bin/env python
import lfcthr
import os
from threading import Thread

class slave(Thread):

   def __init__ (self):
      Thread.__init__(self)

   def run(self):
        ....
        result = lfcthr.lfc_getreplica("", guid, "")
        ....
        return

if __name__ == '__main__':

    os.environ['LFC_HOST'] = 'my_lfc.cern.ch'

    #	Threaded library initialisation
    lfcthr.init()

    ....
    #	Start up of threads
    for i in xrange(totalNumberOfSlaves):
        slv = slave(i)
        slv.start()

    ....

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getusrmap method
"""

result, list = lfc.lfc_getusrmap()
print result
print len(list)
if (result == 0):
	for i in list:
		print i.userid + " " + i.username

EXAMPLE

#!/usr/bin/python

import lfc

"""
# Using the lfc_getgrpmap method
"""

result, list = lfc.lfc_getgrpmap()
print result
print len(list)
if (result == 0):
	for i in list:
		print i.gid + " " + i.groupname

KNOWN BUGS

The current interface to the lfc_getcomment(3), lfc_getcwd(3), lfc_readlink(3), lfc_seterrbuf(3) requires the passing of str object which is modified to contain the result (in a similar way to the C functions, which accept a buffer). However this breaks the immutability of python str. This will be changed in the future.

RELATED TO lfc_python…

LFC C interface man pages