home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_python.idb / usr / freeware / lib / python1.5 / netrc.py.z / netrc.py
Encoding:
Python Source  |  1999-04-16  |  3.5 KB  |  94 lines

  1. #!/usr/bin/python
  2. # Module and documentation by Eric S. Raymond, 21 Dec 1998 
  3.  
  4. import sys, os, string, shlex
  5.  
  6. class 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.  
  91. if __name__ == '__main__': 
  92.     print netrc()
  93.  
  94.