1 """An object-oriented interface to .netrc files."""
3 # Module and documentation by Eric S. Raymond, 21 Dec 1998
7 __all__
= ["netrc", "NetrcParseError"]
10 class NetrcParseError(Exception):
11 """Exception raised on syntax errors in the .netrc file."""
12 def __init__(self
, msg
, filename
=None, lineno
=None):
13 self
.filename
= filename
16 Exception.__init
__(self
, msg
)
19 return "%s (%s, line %s)" % (self
.msg
, self
.filename
, self
.lineno
)
23 def __init__(self
, file=None):
25 file = os
.path
.join(os
.environ
['HOME'], ".netrc")
29 lexer
= shlex
.shlex(fp
)
30 # Allows @ in hostnames. Not a big deal...
31 lexer
.wordchars
= lexer
.wordchars
+ '.-@'
33 # Look for a machine, default, or macdef top-level keyword
34 toplevel
= tt
= lexer
.get_token()
38 entryname
= lexer
.get_token()
41 elif tt
== 'macdef': # Just skip to end of macdefs
42 entryname
= lexer
.get_token()
43 self
.macros
[entryname
] = []
44 lexer
.whitepace
= ' \t'
46 line
= lexer
.instream
.readline()
47 if not line
or line
== '\012' and tt
== '\012':
48 lexer
.whitepace
= ' \t\r\n'
51 self
.macros
[entryname
].append(line
)
53 raise NetrcParseError(
54 "bad toplevel token %r" % tt
, file, lexer
.lineno
)
56 # We're looking at start of an entry for a named machine or default.
57 if toplevel
== 'machine':
58 login
= account
= password
= None
59 self
.hosts
[entryname
] = {}
61 tt
= lexer
.get_token()
62 if tt
=='' or tt
== 'machine' or tt
== 'default' or tt
== 'macdef':
63 if toplevel
== 'macdef':
65 elif login
and password
:
66 self
.hosts
[entryname
] = (login
, account
, password
)
70 raise NetrcParseError(
71 "malformed %s entry %s terminated by %s"
72 % (toplevel
, entryname
, repr(tt
)),
74 elif tt
== 'login' or tt
== 'user':
75 login
= lexer
.get_token()
77 account
= lexer
.get_token()
78 elif tt
== 'password':
79 password
= lexer
.get_token()
81 raise NetrcParseError("bad follower token %r" % tt
,
84 def authenticators(self
, host
):
85 """Return a (user, account, password) tuple for given host."""
86 if self
.hosts
.has_key(host
):
87 return self
.hosts
[host
]
88 elif self
.hosts
.has_key('default'):
89 return self
.hosts
['default']
94 """Dump the class data in the format of a .netrc file."""
96 for host
in self
.hosts
.keys():
97 attrs
= self
.hosts
[host
]
98 rep
= rep
+ "machine "+ host
+ "\n\tlogin " + repr(attrs
[0]) + "\n"
100 rep
= rep
+ "account " + repr(attrs
[1])
101 rep
= rep
+ "\tpassword " + repr(attrs
[2]) + "\n"
102 for macro
in self
.macros
.keys():
103 rep
= rep
+ "macdef " + macro
+ "\n"
104 for line
in self
.macros
[macro
]:
109 if __name__
== '__main__':