Commit | Line | Data |
---|---|---|
7f511828 FT |
1 | #!/usr/bin/python3 |
2 | ||
88d3c3d9 FT |
3 | import sys, os, getopt, pwd |
4 | from fulbank import auth, data, util | |
7f511828 | 5 | |
be69f65b | 6 | sessname = data.defaultsess() |
7f511828 FT |
7 | sess = None |
8 | ||
7f511828 | 9 | def usage(out): |
be69f65b | 10 | out.write("usage: netbank [-h] [-s SESSION-ID] COMMAND [ARGS...]\n") |
7f511828 FT |
11 | |
12 | def requiresess(fn): | |
13 | def wrap(cmd, args): | |
14 | if sess is None: | |
15 | sys.stderr.write("netbank: %s: no current session\n" % (cmd)) | |
16 | sys.exit(1) | |
17 | return fn(cmd, args) | |
18 | return wrap | |
19 | ||
20 | commands = {} | |
21 | ||
22 | def cmd_login(cmd, args): | |
23 | global sess | |
be69f65b FT |
24 | opts, args = getopt.getopt(args, "t:") |
25 | typename = sessname | |
26 | for o, a in opts: | |
27 | if o == "-t": | |
28 | typename = a | |
7f511828 | 29 | if len(args) < 1: |
be69f65b | 30 | sys.stderr.write("usage: login [-t BANK-ID] TYPE\n") |
7f511828 | 31 | sys.exit(1) |
be69f65b | 32 | sess = data.getsessnam(typename).create() |
7f511828 | 33 | if args[0] == "bankid": |
a094b3b5 FT |
34 | authfun = sess.auth_bankid |
35 | elif args[0] == "token": | |
36 | authfun = sess.auth_token | |
7f511828 FT |
37 | else: |
38 | sys.stderr.write("netbank: %s: unknown authentication type\n" % (args[0])) | |
39 | sys.exit(1) | |
a094b3b5 FT |
40 | if len(args) < 2: |
41 | sys.stderr.write("usage: login bankid USER-ID\n") | |
42 | sys.exit(1) | |
43 | with auth.ttyconv() as conv: | |
44 | try: | |
45 | authfun(args[1], conv) | |
46 | except auth.autherror as err: | |
47 | sys.stderr.write("netbank: authentication failed: %s\n" % err) | |
48 | sys.exit(1) | |
7f511828 FT |
49 | commands["login"] = cmd_login |
50 | ||
51 | @requiresess | |
52 | def cmd_logout(cmd, args): | |
d6d73d98 | 53 | global sess |
7f511828 FT |
54 | if sess is not None: |
55 | sess.close() | |
56 | sess = None | |
57 | commands["logout"] = cmd_logout | |
58 | ||
59 | @requiresess | |
60 | def cmd_ping(cmd, args): | |
61 | sess.keepalive() | |
62 | commands["ping"] = cmd_ping | |
63 | ||
64 | @requiresess | |
65 | def cmd_lsacct(cmd, args): | |
66 | for acct in sess.accounts: | |
67 | sys.stdout.write("%s (%s): %s\n" % (acct.number, acct.name, acct.balance)) | |
68 | commands["lsacct"] = cmd_lsacct | |
69 | ||
70 | @requiresess | |
71 | def cmd_lstxn(cmd, args): | |
72 | opts, args = getopt.getopt(args, "n:") | |
73 | num = 10 | |
74 | for o, a in opts: | |
75 | if o == "-n": | |
76 | num = int(a) | |
77 | if len(args) < 1: | |
78 | sys.stderr.write("usage: lstxn [-n NUM] ACCOUNT\n") | |
79 | sys.exit(1) | |
80 | try: | |
88d3c3d9 FT |
81 | acct = util.find(sess.accounts, item=args[0], key=lambda acct: acct.number, test=util.pfxmatch) |
82 | except util.ambiguous as exc: | |
6532632d FT |
83 | sys.stderr.write("netbank: %s: ambiguous match between %s and %s\n" % (args[0], exc.a, exc.b)) |
84 | sys.exit(1) | |
7f511828 FT |
85 | except LookupError: |
86 | sys.stderr.write("netbank: %s: no such account\n" % (args[0])) | |
87 | sys.exit(1) | |
88 | for i, txn in zip(range(num), acct.transactions()): | |
89 | sys.stdout.write("%s %s: %s\n" % (txn.date.isoformat(), txn.value, txn.message)) | |
90 | commands["lstxn"] = cmd_lstxn | |
91 | ||
92 | def main(): | |
be69f65b | 93 | global sess, sessname |
7f511828 | 94 | |
be69f65b | 95 | opts, args = getopt.getopt(sys.argv[1:], "hs:") |
7f511828 FT |
96 | for o, a in opts: |
97 | if o == "-h": | |
98 | usage(sys.stdout) | |
99 | sys.exit(0) | |
be69f65b FT |
100 | if o == "-s": |
101 | sessname = a | |
102 | if len(args) < 1: | |
7f511828 FT |
103 | usage(sys.stderr) |
104 | sys.exit(1) | |
105 | ||
be69f65b FT |
106 | cmd = args[0] |
107 | args = args[1:] | |
7f511828 | 108 | |
be69f65b | 109 | sess = data.loadsess(sessname, None) |
7f511828 FT |
110 | if cmd in commands: |
111 | commands[cmd](cmd, args) | |
112 | else: | |
113 | sys.stderr.write("netbank: %s: unknown command\n" % (cmd)) | |
114 | sys.exit(1) | |
be69f65b | 115 | data.savesess(sess, sessname) |
7f511828 FT |
116 | |
117 | try: | |
118 | if __name__ == "__main__": | |
119 | main() | |
120 | except KeyboardInterrupt: | |
121 | sys.exit(1) |