home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / pub / palmos / pippy-0.6beta-src.tar.gz / pippy-0.6beta-src.tar / pippy-0.6beta-src / src / Lib / netrc.py < prev    next >
Text File  |  2000-12-21  |  4KB  |  95 lines

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