--- /dev/null
+#!/usr/bin/env python
+# -*-mode: python; coding: iso-8859-1 -*-
+#
+# Copyright (c) 2002-2005 Cendio AB. All rights reserved.
+
+import sys
+import rpc
+import mountclient
+import socket
+import os
+import md5
+
+
+class PartialMOUNTClient:
+ def __init__(self):
+ pass
+
+ def addpackers(self):
+ self.packer = mountclient.mountpacker.MOUNTPacker(self)
+ self.unpacker = mountclient.mountpacker.MOUNTUnpacker(self, '')
+
+ def mnt(self, dirpath):
+ res = mountclient.mounttypes.mountres3(self)
+ self.make_call(mountclient.mountconstants.MOUNTPROC_MNT,
+ dirpath, self.packer.pack_string, res.unpack)
+ return res
+
+
+class TCPMOUNTClient(PartialMOUNTClient, rpc.RawTCPClient):
+ def __init__(self, host, port):
+ rpc.RawTCPClient.__init__(self, host,
+ mountclient.mountconstants.MOUNT_PROGRAM,
+ mountclient.mountconstants.MOUNT_V3,
+ port)
+ PartialMOUNTClient.__init__(self)
+
+
+class NFSOTPClient:
+ def __init__(self, host, port):
+ self.mountcl = TCPMOUNTClient(host, port)
+
+ def getotp(self, password):
+ res = self.mountcl.mnt("@getnonce")
+
+ if res.fhs_status != mountclient.mountconstants.MNT3_OK:
+ print >>sys.stderr, "Failed to get nonce:", mountclient.mountconstants.mountstat3_id[res.fhs_status]
+ sys.exit(1)
+
+ fhandle = res.mountinfo.fhandle
+ digest = md5.new(fhandle + password).hexdigest()
+ return digest
+
+
+def usage():
+ print >>sys.stderr, "Usage: nfsotpclient.py host[:port]"
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ if len(sys.argv) != 2:
+ usage()
+
+ fields = sys.argv[1].split(":")
+ host = fields[0]
+ del fields[0]
+ if fields:
+ port = int(fields[0])
+ else:
+ # No port specified, fetch from portmapper
+ # FIXME
+ print >>sys.stderr, "Portmapper support not yet implemented"
+ sys.exit(1)
+
+ cl = NFSOTPClient(host, port)
+ import getpass
+ password = getpass.getpass()
+
+ print cl.getotp(password)