home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / ipsearch-1.0.tar.gz / ipsearch-1.0.tar / ipsearch-1.0 / makerules < prev    next >
Text File  |  2011-07-06  |  3KB  |  139 lines

  1. #!/usr/local/bin/python
  2. # @(#) $Id: makerules 6 2011-07-06 22:28:26Z leres $ (LBL)
  3. """Create an ipsearch lex source from a template and list of addresses"""
  4.  
  5. from __future__ import print_function
  6.  
  7. import subprocess
  8. import optparse
  9. import os
  10. import re
  11. import sys
  12.  
  13. OPTS = None
  14. PROG = '?'
  15.  
  16. def ipaddrtorule(ipaddr):
  17.     """Map an ip address to a lex rule"""
  18.     tup = ['<ipaddr>']
  19.     tup.append('\\.'.join(ipaddr))
  20.  
  21.     n = len(ipaddr)
  22.     while n < 4:
  23.     tup.append('\\.{O}')
  24.     n += 1
  25.  
  26.     tup.append('\t\tMATCH;')
  27.  
  28.     return ''.join(tup)
  29.  
  30. def readipaddrs(fn):
  31.     """Open and read the ipaddrs file, return a list of ip addresses"""
  32.     ipaddrs = []
  33.     with open(fn) as f:
  34.     for line in map(lambda x: x.rstrip(), f.readlines()):
  35.         if line == '' or line[0] == '#':
  36.         continue
  37.         tup = line.split('.')
  38.         n = len(tup)
  39.         if n < 2:
  40.         print('%s: %s: ip address missing octets "%s"' +
  41.             ' (must have at lesat 2)' % (PROG, line), file=sys.stderr)
  42.         return None
  43.         if n > 4:
  44.         print('%s: %s: too many octets "%s"' % (PROG, line),
  45.             file=sys.stderr)
  46.         return None
  47.         for o in tup:
  48.         if not o.isdigit():
  49.             print('%s: %s: Bad ip address "%s"' % (PROG, line),
  50.             file=sys.stderr)
  51.             return None
  52.         # XXX should check format
  53.         ipaddrs.append(tup)
  54.     return ipaddrs
  55.  
  56. def readtemplate(fn):
  57.     """Open and read the template file, return a list with the start and end"""
  58.     # Slurp
  59.     with open(fn) as f:
  60.     buf = f.read()
  61.  
  62.     # Parse
  63.     tup = buf.partition('\n%%')
  64.     if tup[1] == '':
  65.     print("%s: %s: Can't find start of second lex block" % (PROG, fn),
  66.         file=sys.stderr)
  67.     return None
  68.  
  69.     end = tup[2]
  70.     start = ''.join(tup[0:2])
  71.  
  72.     return (start, end)
  73.  
  74. def main(argv=sys.argv):
  75.     """Parse options, output config"""
  76.     global OPTS
  77.     global PROG
  78.  
  79.     PROG = os.path.basename(argv[0])
  80.     usage = 'usage: %prog [-dvD] template ipaddrs'
  81.     version = '$Revision: 6 $'.lstrip('$').rstrip('$')
  82.  
  83.     parser = optparse.OptionParser(usage=usage, version=version)
  84.     parser.add_option('-d', None,
  85.         action='count', dest='debug', default=0,
  86.         help='turn on debugging')
  87.     parser.add_option('-v', None,
  88.         action='store_true', dest='verbose', default=False,
  89.         help='verbose messages')
  90.     parser.add_option('-D', None,
  91.         action='store_true', dest='Debug', default=False,
  92.         help='interactive debugging')
  93.  
  94.     (OPTS, args) = parser.parse_args(args=argv[1:])
  95.  
  96.     if len(args) != 2:
  97.     parser.print_help()
  98.     return 1
  99.  
  100.     # Interactive debugging
  101.     if OPTS.Debug:
  102.         import pdb
  103.         pdb.set_trace()
  104.  
  105.     for fn in args:
  106.     if not os.access(fn, os.R_OK):
  107.         print("%s: Can't open %s" % (PROG, fn))
  108.         return 1
  109.  
  110.     templatefn = args.pop(0)
  111.     ipaddrsfn = args.pop(0)
  112.  
  113.     ttup = readtemplate(templatefn)
  114.     if ttup == None:
  115.     return 1
  116.  
  117.     if OPTS.debug > 0:
  118.     print('template, ipaddrs', template, ipaddrs);
  119.     print('foo', len(ttup[0]), len(ttup[1]))
  120.  
  121.     ipaddrs = readipaddrs(ipaddrsfn)
  122.     if ipaddrs == None:
  123.     return 1
  124.  
  125.     print('    /* WARNING: This file is automatically generated; do not edit directly */')
  126.     sys.stdout.write(ttup[0])
  127.     # Need a newline
  128.     print('')
  129.  
  130.     for ipaddr in ipaddrs:
  131.     print(ipaddrtorule(ipaddr))
  132.  
  133.     sys.stdout.write(ttup[1])
  134.  
  135.     return 0
  136.  
  137. if __name__ == "__main__":
  138.     sys.exit(main())
  139.