Vega strike Python Modules doc  0.5.1
Documentation of the " Modules " folder of Vega strike
 All Data Structures Namespaces Files Functions Variables
netrc.py
Go to the documentation of this file.
1 """An object-oriented interface to .netrc files."""
2 
3 # Module and documentation by Eric S. Raymond, 21 Dec 1998
4 
5 import os, shlex
6 
7 __all__ = ["netrc", "NetrcParseError"]
8 
9 
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
14  self.lineno = lineno
15  self.msg = msg
16  Exception.__init__(self, msg)
17 
18  def __str__(self):
19  return "%s (%s, line %s)" % (self.msg, self.filename, self.lineno)
20 
21 
22 class netrc:
23  def __init__(self, file=None):
24  if not file:
25  file = os.path.join(os.environ['HOME'], ".netrc")
26  fp = open(file)
27  self.hosts = {}
28  self.macros = {}
29  lexer = shlex.shlex(fp)
30  # Allows @ in hostnames. Not a big deal...
31  lexer.wordchars = lexer.wordchars + '.-@'
32  while 1:
33  # Look for a machine, default, or macdef top-level keyword
34  toplevel = tt = lexer.get_token()
35  if not tt:
36  break
37  elif tt == 'machine':
38  entryname = lexer.get_token()
39  elif tt == 'default':
40  entryname = 'default'
41  elif tt == 'macdef': # Just skip to end of macdefs
42  entryname = lexer.get_token()
43  self.macros[entryname] = []
44  lexer.whitespace = ' \t'
45  while 1:
46  line = lexer.instream.readline()
47  if not line or line == '\012':
48  lexer.whitespace = ' \t\r\n'
49  break
50  self.macros[entryname].append(line)
51  continue
52  else:
53  raise NetrcParseError(
54  "bad toplevel token %r" % tt, file, lexer.lineno)
55 
56  # We're looking at start of an entry for a named machine or default.
57  login = account = password = None
58  self.hosts[entryname] = {}
59  while 1:
60  tt = lexer.get_token()
61  if (tt=='' or tt == 'machine' or
62  tt == 'default' or tt =='macdef'):
63  if login and password:
64  self.hosts[entryname] = (login, account, password)
65  lexer.push_token(tt)
66  break
67  else:
68  raise NetrcParseError(
69  "malformed %s entry %s terminated by %s"
70  % (toplevel, entryname, repr(tt)),
71  file, lexer.lineno)
72  elif tt == 'login' or tt == 'user':
73  login = lexer.get_token()
74  elif tt == 'account':
75  account = lexer.get_token()
76  elif tt == 'password':
77  password = lexer.get_token()
78  else:
79  raise NetrcParseError("bad follower token %r" % tt,
80  file, lexer.lineno)
81 
82  def authenticators(self, host):
83  """Return a (user, account, password) tuple for given host."""
84  if self.hosts.has_key(host):
85  return self.hosts[host]
86  elif self.hosts.has_key('default'):
87  return self.hosts['default']
88  else:
89  return None
90 
91  def __repr__(self):
92  """Dump the class data in the format of a .netrc file."""
93  rep = ""
94  for host in self.hosts.keys():
95  attrs = self.hosts[host]
96  rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n"
97  if attrs[1]:
98  rep = rep + "account " + repr(attrs[1])
99  rep = rep + "\tpassword " + repr(attrs[2]) + "\n"
100  for macro in self.macros.keys():
101  rep = rep + "macdef " + macro + "\n"
102  for line in self.macros[macro]:
103  rep = rep + line
104  rep = rep + "\n"
105  return rep
106 
107 if __name__ == '__main__':
108  print netrc()