#!/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)
syntax highlighted by Code2HTML, v. 0.9.1