---
name: "lfc_python"
section: "3"
platform: "linux"
package: "python-lfc"
version: "1.10.0-2+b3"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/lfc_python"
---

# lfc\_python(3)

Python interface to the LFC lfcthr - Thread enabled version of Python interface to the LFC

## NAME

lfc - Python interface to the LFC\
 lfcthr - Thread enabled version of Python interface to the LFC

## 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_getcomment/3.md)**, **[lfc\_getcwd(3)](/lfc_getcwd/3.md)**, **[lfc\_readlink(3)](/lfc_readlink/3.md)**, **[lfc\_seterrbuf(3)](/lfc_seterrbuf/3.md)** 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.

## SEE ALSO

**LFC C interface man pages**
