diff options
author | Guido van Rossum <guido@python.org> | 1998-12-22 05:19:29 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-12-22 05:19:29 (GMT) |
commit | 9c30c24bc2285438dbe94c28c05f1aa9127a04a3 (patch) | |
tree | 3caa5411aab7ca0aeea1b72dad1c9ca9d4cba6ae /Lib/netrc.py | |
parent | 5e97c9dff91ad885d36a9d26f97549f198b90ee8 (diff) | |
download | cpython-9c30c24bc2285438dbe94c28c05f1aa9127a04a3.zip cpython-9c30c24bc2285438dbe94c28c05f1aa9127a04a3.tar.gz cpython-9c30c24bc2285438dbe94c28c05f1aa9127a04a3.tar.bz2 |
Adding shlex and netrc by Eric Raymond.
Diffstat (limited to 'Lib/netrc.py')
-rw-r--r-- | Lib/netrc.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Lib/netrc.py b/Lib/netrc.py new file mode 100644 index 0000000..7c1de26 --- /dev/null +++ b/Lib/netrc.py @@ -0,0 +1,93 @@ +#!/usr/bin/python +# Module and documentation by Eric S. Raymond, 21 Dec 1998 + +import sys, os, string, shlex + +class netrc: + def __init__(self, file=None): + if not file: + file = os.path.join(os.environ['HOME'], ".netrc") + try: + fp = open(file) + except: + return None + self.hosts = {} + self.macros = {} + lexer = shlex.shlex(fp) + lexer.wordchars = lexer.wordchars + '.' + while 1: + # Look for a machine, default, or macdef top-level keyword + toplevel = tt = lexer.get_token() + if tt == '' or tt == None: + break + elif tt == 'machine': + entryname = lexer.get_token() + elif tt == 'default': + entryname = 'default' + elif tt == 'macdef': # Just skip to end of macdefs + entryname = lexer.get_token() + self.macros[entryname] = [] + lexer.whitepace = ' \t' + while 1: + line = lexer.instream.readline() + if not line or line == '\012' and tt == '\012': + lexer.whitepace = ' \t\r\n' + break + tt = line + self.macros[entryname].append(line) + else: + raise SyntaxError, "bad toplevel token %s, file %s, line %d" \ + % (tt, file, lexer.lineno) + + # We're looking at start of an entry for a named machine or default. + if toplevel == 'machine': + login = account = password = None + self.hosts[entryname] = {} + while 1: + tt = lexer.get_token() + if tt=='' or tt == 'machine' or tt == 'default' or tt == 'macdef': + if toplevel == 'macdef': + break; + elif login and password: + self.hosts[entryname] = (login, account, password) + lexer.push_token(tt) + break + else: + raise SyntaxError, "malformed %s entry %s terminated by %s" % (toplevel, entryname, repr(tt)) + elif tt == 'login' or tt == 'user': + login = lexer.get_token() + elif tt == 'account': + account = lexer.get_token() + elif tt == 'password': + password = lexer.get_token() + else: + raise SyntaxError, "bad follower token %s, file %s, line %d"%(tt,file,lexer.lineno) + + def authenticators(self, host): + "Return a (user, account, password) tuple for given host." + if self.hosts.has_key(host): + return self.hosts[host] + elif self.hosts.has_key('default'): + return self.hosts['default'] + else: + return None + + def __repr__(self): + "Dump the class data in the format of a .netrc file" + rep = "" + for host in self.hosts.keys(): + attrs = self.hosts[host] + rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n" + if attrs[1]: + rep = rep + "account " + repr(attrs[1]) + rep = rep + "\tpassword " + repr(attrs[2]) + "\n" + for macro in self.macros.keys(): + rep = rep + "macdef " + macro + "\n" + for line in self.macros[macro]: + rep = rep + line + rep = rep + "\n" + return rep + +if __name__ == '__main__': + print netrc() + |