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