blob: 7c1de2697e08ef81dc08d630d01100dc54385ef3 [file] [log] [blame]
Guido van Rossum9c30c241998-12-22 05:19:29 +00001#!/usr/bin/python
2# Module and documentation by Eric S. Raymond, 21 Dec 1998
3
4import sys, os, string, shlex
5
6class netrc:
7 def __init__(self, file=None):
8 if not file:
9 file = os.path.join(os.environ['HOME'], ".netrc")
10 try:
11 fp = open(file)
12 except:
13 return None
14 self.hosts = {}
15 self.macros = {}
16 lexer = shlex.shlex(fp)
17 lexer.wordchars = lexer.wordchars + '.'
18 while 1:
19 # Look for a machine, default, or macdef top-level keyword
20 toplevel = tt = lexer.get_token()
21 if tt == '' or tt == None:
22 break
23 elif tt == 'machine':
24 entryname = lexer.get_token()
25 elif tt == 'default':
26 entryname = 'default'
27 elif tt == 'macdef': # Just skip to end of macdefs
28 entryname = lexer.get_token()
29 self.macros[entryname] = []
30 lexer.whitepace = ' \t'
31 while 1:
32 line = lexer.instream.readline()
33 if not line or line == '\012' and tt == '\012':
34 lexer.whitepace = ' \t\r\n'
35 break
36 tt = line
37 self.macros[entryname].append(line)
38 else:
39 raise SyntaxError, "bad toplevel token %s, file %s, line %d" \
40 % (tt, file, lexer.lineno)
41
42 # We're looking at start of an entry for a named machine or default.
43 if toplevel == 'machine':
44 login = account = password = None
45 self.hosts[entryname] = {}
46 while 1:
47 tt = lexer.get_token()
48 if tt=='' or tt == 'machine' or tt == 'default' or tt == 'macdef':
49 if toplevel == 'macdef':
50 break;
51 elif login and password:
52 self.hosts[entryname] = (login, account, password)
53 lexer.push_token(tt)
54 break
55 else:
56 raise SyntaxError, "malformed %s entry %s terminated by %s" % (toplevel, entryname, repr(tt))
57 elif tt == 'login' or tt == 'user':
58 login = lexer.get_token()
59 elif tt == 'account':
60 account = lexer.get_token()
61 elif tt == 'password':
62 password = lexer.get_token()
63 else:
64 raise SyntaxError, "bad follower token %s, file %s, line %d"%(tt,file,lexer.lineno)
65
66 def authenticators(self, host):
67 "Return a (user, account, password) tuple for given host."
68 if self.hosts.has_key(host):
69 return self.hosts[host]
70 elif self.hosts.has_key('default'):
71 return self.hosts['default']
72 else:
73 return None
74
75 def __repr__(self):
76 "Dump the class data in the format of a .netrc file"
77 rep = ""
78 for host in self.hosts.keys():
79 attrs = self.hosts[host]
80 rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n"
81 if attrs[1]:
82 rep = rep + "account " + repr(attrs[1])
83 rep = rep + "\tpassword " + repr(attrs[2]) + "\n"
84 for macro in self.macros.keys():
85 rep = rep + "macdef " + macro + "\n"
86 for line in self.macros[macro]:
87 rep = rep + line
88 rep = rep + "\n"
89 return rep
90
91if __name__ == '__main__':
92 print netrc()
93