#!/usr/bin/python3 import sys, os, getopt, pwd from fulbank import auth, data, util sessname = data.defaultsess() sess = None def usage(out): out.write("usage: netbank [-h] [-s SESSION-ID] COMMAND [ARGS...]\n") def requiresess(fn): def wrap(cmd, args): if sess is None: sys.stderr.write("netbank: %s: no current session\n" % (cmd)) sys.exit(1) return fn(cmd, args) return wrap commands = {} def cmd_login(cmd, args): global sess if len(args) < 2: sys.stderr.write("usage: login BANK-ID TYPE [ARGS...]\n") sys.exit(1) sess = data.getsessnam(args[0]).create() if args[1] == "bankid": authfun = sess.auth_bankid elif args[1] == "token": authfun = sess.auth_token else: sys.stderr.write("netbank: %s: unknown authentication type\n" % (args[1])) sys.exit(1) if len(args) < 3: sys.stderr.write("usage: login bankid USER-ID\n") sys.exit(1) with auth.ttyconv() as conv: try: authfun(args[2], conv) except auth.autherror as err: sys.stderr.write("netbank: authentication failed: %s\n" % err) sys.exit(1) commands["login"] = cmd_login @requiresess def cmd_logout(cmd, args): global sess if sess is not None: sess.close() sess = None commands["logout"] = cmd_logout @requiresess def cmd_ping(cmd, args): sess.keepalive() commands["ping"] = cmd_ping @requiresess def cmd_lsacct(cmd, args): for acct in sess.accounts: sys.stdout.write("%s (%s): %s\n" % (acct.number, acct.name, acct.balance)) commands["lsacct"] = cmd_lsacct @requiresess def cmd_lstxn(cmd, args): opts, args = getopt.getopt(args, "n:") num = 10 for o, a in opts: if o == "-n": num = int(a) if len(args) < 1: sys.stderr.write("usage: lstxn [-n NUM] ACCOUNT\n") sys.exit(1) try: acct = util.find(sess.accounts, item=args[0], key=lambda acct: acct.number, test=util.pfxmatch) except util.ambiguous as exc: sys.stderr.write("netbank: %s: ambiguous match between %s and %s\n" % (args[0], exc.a, exc.b)) sys.exit(1) except LookupError: sys.stderr.write("netbank: %s: no such account\n" % (args[0])) sys.exit(1) for i, txn in zip(range(num), acct.transactions()): sys.stdout.write("%s %s: %s\n" % (txn.date.isoformat(), txn.value, txn.message)) commands["lstxn"] = cmd_lstxn def main(): global sess, sessname opts, args = getopt.getopt(sys.argv[1:], "hs:") for o, a in opts: if o == "-h": usage(sys.stdout) sys.exit(0) if o == "-s": sessname = a if len(args) < 1: usage(sys.stderr) sys.exit(1) cmd = args[0] args = args[1:] sess = data.loadsess(sessname, None) if cmd in commands: commands[cmd](cmd, args) else: sys.stderr.write("netbank: %s: unknown command\n" % (cmd)) sys.exit(1) data.savesess(sess, sessname) try: if __name__ == "__main__": main() except KeyboardInterrupt: sys.exit(1)