1992-12-14 19:25:04 -04:00
|
|
|
# NFS RPC client -- RFC 1094
|
|
|
|
|
1992-12-17 13:12:38 -04:00
|
|
|
# XXX This is not yet complete.
|
|
|
|
# XXX Only GETATTR, SETTTR, LOOKUP and READDIR are supported.
|
|
|
|
|
1992-12-14 19:25:04 -04:00
|
|
|
# (See mountclient.py for some hints on how to write RPC clients in
|
|
|
|
# Python in general)
|
|
|
|
|
1992-12-15 16:52:31 -04:00
|
|
|
import rpc
|
1992-12-14 19:25:04 -04:00
|
|
|
from rpc import UDPClient, TCPClient
|
|
|
|
from mountclient import FHSIZE, MountPacker, MountUnpacker
|
|
|
|
|
|
|
|
NFS_PROGRAM = 100003
|
|
|
|
NFS_VERSION = 2
|
|
|
|
|
|
|
|
# enum stat
|
|
|
|
NFS_OK = 0
|
|
|
|
# (...many error values...)
|
|
|
|
|
|
|
|
# enum ftype
|
|
|
|
NFNON = 0
|
|
|
|
NFREG = 1
|
|
|
|
NFDIR = 2
|
|
|
|
NFBLK = 3
|
|
|
|
NFCHR = 4
|
|
|
|
NFLNK = 5
|
|
|
|
|
|
|
|
|
|
|
|
class NFSPacker(MountPacker):
|
|
|
|
|
2004-07-18 02:56:09 -03:00
|
|
|
def pack_sattrargs(self, sa):
|
|
|
|
file, attributes = sa
|
|
|
|
self.pack_fhandle(file)
|
|
|
|
self.pack_sattr(attributes)
|
|
|
|
|
|
|
|
def pack_sattr(self, sa):
|
|
|
|
mode, uid, gid, size, atime, mtime = sa
|
|
|
|
self.pack_uint(mode)
|
|
|
|
self.pack_uint(uid)
|
|
|
|
self.pack_uint(gid)
|
|
|
|
self.pack_uint(size)
|
|
|
|
self.pack_timeval(atime)
|
|
|
|
self.pack_timeval(mtime)
|
|
|
|
|
|
|
|
def pack_diropargs(self, da):
|
|
|
|
dir, name = da
|
|
|
|
self.pack_fhandle(dir)
|
|
|
|
self.pack_string(name)
|
|
|
|
|
|
|
|
def pack_readdirargs(self, ra):
|
|
|
|
dir, cookie, count = ra
|
|
|
|
self.pack_fhandle(dir)
|
|
|
|
self.pack_uint(cookie)
|
|
|
|
self.pack_uint(count)
|
|
|
|
|
|
|
|
def pack_timeval(self, tv):
|
|
|
|
secs, usecs = tv
|
|
|
|
self.pack_uint(secs)
|
|
|
|
self.pack_uint(usecs)
|
1992-12-14 19:25:04 -04:00
|
|
|
|
|
|
|
|
|
|
|
class NFSUnpacker(MountUnpacker):
|
|
|
|
|
2004-07-18 02:56:09 -03:00
|
|
|
def unpack_readdirres(self):
|
|
|
|
status = self.unpack_enum()
|
|
|
|
if status == NFS_OK:
|
|
|
|
entries = self.unpack_list(self.unpack_entry)
|
|
|
|
eof = self.unpack_bool()
|
|
|
|
rest = (entries, eof)
|
|
|
|
else:
|
|
|
|
rest = None
|
|
|
|
return (status, rest)
|
|
|
|
|
|
|
|
def unpack_entry(self):
|
|
|
|
fileid = self.unpack_uint()
|
|
|
|
name = self.unpack_string()
|
|
|
|
cookie = self.unpack_uint()
|
|
|
|
return (fileid, name, cookie)
|
|
|
|
|
|
|
|
def unpack_diropres(self):
|
|
|
|
status = self.unpack_enum()
|
|
|
|
if status == NFS_OK:
|
|
|
|
fh = self.unpack_fhandle()
|
|
|
|
fa = self.unpack_fattr()
|
|
|
|
rest = (fh, fa)
|
|
|
|
else:
|
|
|
|
rest = None
|
|
|
|
return (status, rest)
|
|
|
|
|
|
|
|
def unpack_attrstat(self):
|
|
|
|
status = self.unpack_enum()
|
|
|
|
if status == NFS_OK:
|
|
|
|
attributes = self.unpack_fattr()
|
|
|
|
else:
|
|
|
|
attributes = None
|
|
|
|
return status, attributes
|
|
|
|
|
|
|
|
def unpack_fattr(self):
|
|
|
|
type = self.unpack_enum()
|
|
|
|
mode = self.unpack_uint()
|
|
|
|
nlink = self.unpack_uint()
|
|
|
|
uid = self.unpack_uint()
|
|
|
|
gid = self.unpack_uint()
|
|
|
|
size = self.unpack_uint()
|
|
|
|
blocksize = self.unpack_uint()
|
|
|
|
rdev = self.unpack_uint()
|
|
|
|
blocks = self.unpack_uint()
|
|
|
|
fsid = self.unpack_uint()
|
|
|
|
fileid = self.unpack_uint()
|
|
|
|
atime = self.unpack_timeval()
|
|
|
|
mtime = self.unpack_timeval()
|
|
|
|
ctime = self.unpack_timeval()
|
|
|
|
return (type, mode, nlink, uid, gid, size, blocksize, \
|
|
|
|
rdev, blocks, fsid, fileid, atime, mtime, ctime)
|
|
|
|
|
|
|
|
def unpack_timeval(self):
|
|
|
|
secs = self.unpack_uint()
|
|
|
|
usecs = self.unpack_uint()
|
|
|
|
return (secs, usecs)
|
1992-12-14 19:25:04 -04:00
|
|
|
|
|
|
|
|
|
|
|
class NFSClient(UDPClient):
|
|
|
|
|
2004-07-18 02:56:09 -03:00
|
|
|
def __init__(self, host):
|
|
|
|
UDPClient.__init__(self, host, NFS_PROGRAM, NFS_VERSION)
|
|
|
|
|
|
|
|
def addpackers(self):
|
|
|
|
self.packer = NFSPacker()
|
|
|
|
self.unpacker = NFSUnpacker('')
|
|
|
|
|
|
|
|
def mkcred(self):
|
Merged revisions 62021,62029,62035-62038,62043-62044,62052-62053 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62021 | benjamin.peterson | 2008-03-28 18:11:01 -0500 (Fri, 28 Mar 2008) | 2 lines
NIL => NULL
........
r62029 | amaury.forgeotdarc | 2008-03-28 20:42:31 -0500 (Fri, 28 Mar 2008) | 3 lines
Correctly call the base class tearDown();
otherwise running test_logging twice produce the errors we see on all buildbots
........
r62035 | raymond.hettinger | 2008-03-29 05:42:07 -0500 (Sat, 29 Mar 2008) | 1 line
Be explicit about what efficient means.
........
r62036 | georg.brandl | 2008-03-29 06:46:18 -0500 (Sat, 29 Mar 2008) | 2 lines
Fix capitalization.
........
r62037 | amaury.forgeotdarc | 2008-03-29 07:42:54 -0500 (Sat, 29 Mar 2008) | 5 lines
lib2to3 should install a logging handler only when run as a main program,
not when used as a library.
This may please the buildbots, which fail when test_lib2to3 is run before test_logging.
........
r62043 | benjamin.peterson | 2008-03-29 10:24:25 -0500 (Sat, 29 Mar 2008) | 3 lines
#2503 make singletons compared with "is" not == or !=
Thanks to Wummel for the patch
........
r62044 | gerhard.haering | 2008-03-29 14:11:52 -0500 (Sat, 29 Mar 2008) | 2 lines
Documented the lastrowid attribute.
........
r62052 | benjamin.peterson | 2008-03-30 14:35:10 -0500 (Sun, 30 Mar 2008) | 2 lines
Updated README regarding doc formats
........
r62053 | georg.brandl | 2008-03-30 14:41:39 -0500 (Sun, 30 Mar 2008) | 2 lines
The other download formats will be available for 2.6 too.
........
2008-03-30 22:51:45 -03:00
|
|
|
if self.cred is None:
|
2004-07-18 02:56:09 -03:00
|
|
|
self.cred = rpc.AUTH_UNIX, rpc.make_auth_unix_default()
|
|
|
|
return self.cred
|
|
|
|
|
|
|
|
def Getattr(self, fh):
|
|
|
|
return self.make_call(1, fh, \
|
|
|
|
self.packer.pack_fhandle, \
|
|
|
|
self.unpacker.unpack_attrstat)
|
|
|
|
|
|
|
|
def Setattr(self, sa):
|
|
|
|
return self.make_call(2, sa, \
|
|
|
|
self.packer.pack_sattrargs, \
|
|
|
|
self.unpacker.unpack_attrstat)
|
|
|
|
|
|
|
|
# Root() is obsolete
|
|
|
|
|
|
|
|
def Lookup(self, da):
|
|
|
|
return self.make_call(4, da, \
|
|
|
|
self.packer.pack_diropargs, \
|
|
|
|
self.unpacker.unpack_diropres)
|
|
|
|
|
|
|
|
# ...
|
|
|
|
|
|
|
|
def Readdir(self, ra):
|
|
|
|
return self.make_call(16, ra, \
|
|
|
|
self.packer.pack_readdirargs, \
|
|
|
|
self.unpacker.unpack_readdirres)
|
|
|
|
|
|
|
|
# Shorthand to get the entire contents of a directory
|
|
|
|
def Listdir(self, dir):
|
|
|
|
list = []
|
|
|
|
ra = (dir, 0, 2000)
|
|
|
|
while 1:
|
|
|
|
(status, rest) = self.Readdir(ra)
|
2006-08-29 01:39:12 -03:00
|
|
|
if status != NFS_OK:
|
2004-07-18 02:56:09 -03:00
|
|
|
break
|
|
|
|
entries, eof = rest
|
|
|
|
last_cookie = None
|
|
|
|
for fileid, name, cookie in entries:
|
|
|
|
list.append((fileid, name))
|
|
|
|
last_cookie = cookie
|
Merged revisions 62021,62029,62035-62038,62043-62044,62052-62053 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62021 | benjamin.peterson | 2008-03-28 18:11:01 -0500 (Fri, 28 Mar 2008) | 2 lines
NIL => NULL
........
r62029 | amaury.forgeotdarc | 2008-03-28 20:42:31 -0500 (Fri, 28 Mar 2008) | 3 lines
Correctly call the base class tearDown();
otherwise running test_logging twice produce the errors we see on all buildbots
........
r62035 | raymond.hettinger | 2008-03-29 05:42:07 -0500 (Sat, 29 Mar 2008) | 1 line
Be explicit about what efficient means.
........
r62036 | georg.brandl | 2008-03-29 06:46:18 -0500 (Sat, 29 Mar 2008) | 2 lines
Fix capitalization.
........
r62037 | amaury.forgeotdarc | 2008-03-29 07:42:54 -0500 (Sat, 29 Mar 2008) | 5 lines
lib2to3 should install a logging handler only when run as a main program,
not when used as a library.
This may please the buildbots, which fail when test_lib2to3 is run before test_logging.
........
r62043 | benjamin.peterson | 2008-03-29 10:24:25 -0500 (Sat, 29 Mar 2008) | 3 lines
#2503 make singletons compared with "is" not == or !=
Thanks to Wummel for the patch
........
r62044 | gerhard.haering | 2008-03-29 14:11:52 -0500 (Sat, 29 Mar 2008) | 2 lines
Documented the lastrowid attribute.
........
r62052 | benjamin.peterson | 2008-03-30 14:35:10 -0500 (Sun, 30 Mar 2008) | 2 lines
Updated README regarding doc formats
........
r62053 | georg.brandl | 2008-03-30 14:41:39 -0500 (Sun, 30 Mar 2008) | 2 lines
The other download formats will be available for 2.6 too.
........
2008-03-30 22:51:45 -03:00
|
|
|
if eof or last_cookie is None:
|
2004-07-18 02:56:09 -03:00
|
|
|
break
|
|
|
|
ra = (ra[0], last_cookie, ra[2])
|
|
|
|
return list
|
|
|
|
|
|
|
|
|
1992-12-14 19:25:04 -04:00
|
|
|
def test():
|
2004-07-18 02:56:09 -03:00
|
|
|
import sys
|
|
|
|
if sys.argv[1:]: host = sys.argv[1]
|
|
|
|
else: host = ''
|
|
|
|
if sys.argv[2:]: filesys = sys.argv[2]
|
|
|
|
else: filesys = None
|
|
|
|
from mountclient import UDPMountClient, TCPMountClient
|
|
|
|
mcl = TCPMountClient(host)
|
Merged revisions 62021,62029,62035-62038,62043-62044,62052-62053 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62021 | benjamin.peterson | 2008-03-28 18:11:01 -0500 (Fri, 28 Mar 2008) | 2 lines
NIL => NULL
........
r62029 | amaury.forgeotdarc | 2008-03-28 20:42:31 -0500 (Fri, 28 Mar 2008) | 3 lines
Correctly call the base class tearDown();
otherwise running test_logging twice produce the errors we see on all buildbots
........
r62035 | raymond.hettinger | 2008-03-29 05:42:07 -0500 (Sat, 29 Mar 2008) | 1 line
Be explicit about what efficient means.
........
r62036 | georg.brandl | 2008-03-29 06:46:18 -0500 (Sat, 29 Mar 2008) | 2 lines
Fix capitalization.
........
r62037 | amaury.forgeotdarc | 2008-03-29 07:42:54 -0500 (Sat, 29 Mar 2008) | 5 lines
lib2to3 should install a logging handler only when run as a main program,
not when used as a library.
This may please the buildbots, which fail when test_lib2to3 is run before test_logging.
........
r62043 | benjamin.peterson | 2008-03-29 10:24:25 -0500 (Sat, 29 Mar 2008) | 3 lines
#2503 make singletons compared with "is" not == or !=
Thanks to Wummel for the patch
........
r62044 | gerhard.haering | 2008-03-29 14:11:52 -0500 (Sat, 29 Mar 2008) | 2 lines
Documented the lastrowid attribute.
........
r62052 | benjamin.peterson | 2008-03-30 14:35:10 -0500 (Sun, 30 Mar 2008) | 2 lines
Updated README regarding doc formats
........
r62053 | georg.brandl | 2008-03-30 14:41:39 -0500 (Sun, 30 Mar 2008) | 2 lines
The other download formats will be available for 2.6 too.
........
2008-03-30 22:51:45 -03:00
|
|
|
if filesys is None:
|
2004-07-18 02:56:09 -03:00
|
|
|
list = mcl.Export()
|
|
|
|
for item in list:
|
2007-07-17 17:59:35 -03:00
|
|
|
print(item)
|
2004-07-18 02:56:09 -03:00
|
|
|
return
|
|
|
|
sf = mcl.Mnt(filesys)
|
2007-07-17 17:59:35 -03:00
|
|
|
print(sf)
|
2004-07-18 02:56:09 -03:00
|
|
|
fh = sf[1]
|
|
|
|
if fh:
|
|
|
|
ncl = NFSClient(host)
|
Merged revisions 66394,66404,66412,66414,66424-66436 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r66394 | benjamin.peterson | 2008-09-11 17:04:02 -0500 (Thu, 11 Sep 2008) | 1 line
fix typo
........
r66404 | gerhard.haering | 2008-09-12 08:54:06 -0500 (Fri, 12 Sep 2008) | 2 lines
sqlite3 module: Mark iterdump() method as "Non-standard" like all the other methods not found in DB-API.
........
r66412 | gerhard.haering | 2008-09-12 13:58:57 -0500 (Fri, 12 Sep 2008) | 2 lines
Fixes issue #3103. In the sqlite3 module, made one more function static. All renaming public symbos now have the pysqlite prefix to avoid name clashes. This at least once created problems where the same symbol name appeared somewhere in Apache and the sqlite3 module was used from mod_python.
........
r66414 | gerhard.haering | 2008-09-12 17:33:22 -0500 (Fri, 12 Sep 2008) | 2 lines
Issue #3846: Release GIL during calls to sqlite3_prepare. This improves concurrent access to the same database file from multiple threads/processes.
........
r66424 | andrew.kuchling | 2008-09-12 20:22:08 -0500 (Fri, 12 Sep 2008) | 1 line
#687648 from Robert Schuppenies: use classic division. (RM Barry gave permission to update the demos.)
........
r66425 | andrew.kuchling | 2008-09-12 20:27:33 -0500 (Fri, 12 Sep 2008) | 1 line
#687648 from Robert Schuppenies: use classic division. From me: don't use string exception; flush stdout after printing
........
r66426 | andrew.kuchling | 2008-09-12 20:34:41 -0500 (Fri, 12 Sep 2008) | 1 line
#687648 from Robert Schuppenies: use classic division. From me: don't use string exception; add __main__ section
........
r66427 | andrew.kuchling | 2008-09-12 20:42:55 -0500 (Fri, 12 Sep 2008) | 1 line
#687648 from Robert Schuppenies: use classic division. From me: remove two stray semicolons
........
r66428 | andrew.kuchling | 2008-09-12 20:43:28 -0500 (Fri, 12 Sep 2008) | 1 line
#687648 from Robert Schuppenies: use classic division.
........
r66429 | andrew.kuchling | 2008-09-12 20:47:02 -0500 (Fri, 12 Sep 2008) | 1 line
Remove semicolon
........
r66430 | andrew.kuchling | 2008-09-12 20:48:36 -0500 (Fri, 12 Sep 2008) | 1 line
Subclass exception
........
r66431 | andrew.kuchling | 2008-09-12 20:56:56 -0500 (Fri, 12 Sep 2008) | 1 line
Fix SyntaxError
........
r66432 | andrew.kuchling | 2008-09-12 20:57:25 -0500 (Fri, 12 Sep 2008) | 1 line
Update uses of string exceptions
........
r66433 | andrew.kuchling | 2008-09-12 21:08:30 -0500 (Fri, 12 Sep 2008) | 1 line
Use title case
........
r66434 | andrew.kuchling | 2008-09-12 21:09:15 -0500 (Fri, 12 Sep 2008) | 1 line
Remove extra 'the'; the following title includes it
........
r66435 | andrew.kuchling | 2008-09-12 21:11:51 -0500 (Fri, 12 Sep 2008) | 1 line
#3288: Document as_integer_ratio
........
r66436 | andrew.kuchling | 2008-09-12 21:14:15 -0500 (Fri, 12 Sep 2008) | 1 line
Use title case
........
2008-09-13 12:58:53 -03:00
|
|
|
attrstat = ncl.Getattr(fh)
|
|
|
|
print(attrstat)
|
2004-07-18 02:56:09 -03:00
|
|
|
list = ncl.Listdir(fh)
|
2007-07-17 17:59:35 -03:00
|
|
|
for item in list: print(item)
|
2004-07-18 02:56:09 -03:00
|
|
|
mcl.Umnt(filesys)
|