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 >
Wrap
Text File
|
2011-07-06
|
3KB
|
139 lines
#!/usr/local/bin/python
# @(#) $Id: makerules 6 2011-07-06 22:28:26Z leres $ (LBL)
"""Create an ipsearch lex source from a template and list of addresses"""
from __future__ import print_function
import subprocess
import optparse
import os
import re
import sys
OPTS = None
PROG = '?'
def ipaddrtorule(ipaddr):
"""Map an ip address to a lex rule"""
tup = ['<ipaddr>']
tup.append('\\.'.join(ipaddr))
n = len(ipaddr)
while n < 4:
tup.append('\\.{O}')
n += 1
tup.append('\t\tMATCH;')
return ''.join(tup)
def readipaddrs(fn):
"""Open and read the ipaddrs file, return a list of ip addresses"""
ipaddrs = []
with open(fn) as f:
for line in map(lambda x: x.rstrip(), f.readlines()):
if line == '' or line[0] == '#':
continue
tup = line.split('.')
n = len(tup)
if n < 2:
print('%s: %s: ip address missing octets "%s"' +
' (must have at lesat 2)' % (PROG, line), file=sys.stderr)
return None
if n > 4:
print('%s: %s: too many octets "%s"' % (PROG, line),
file=sys.stderr)
return None
for o in tup:
if not o.isdigit():
print('%s: %s: Bad ip address "%s"' % (PROG, line),
file=sys.stderr)
return None
# XXX should check format
ipaddrs.append(tup)
return ipaddrs
def readtemplate(fn):
"""Open and read the template file, return a list with the start and end"""
# Slurp
with open(fn) as f:
buf = f.read()
# Parse
tup = buf.partition('\n%%')
if tup[1] == '':
print("%s: %s: Can't find start of second lex block" % (PROG, fn),
file=sys.stderr)
return None
end = tup[2]
start = ''.join(tup[0:2])
return (start, end)
def main(argv=sys.argv):
"""Parse options, output config"""
global OPTS
global PROG
PROG = os.path.basename(argv[0])
usage = 'usage: %prog [-dvD] template ipaddrs'
version = '$Revision: 6 $'.lstrip('$').rstrip('$')
parser = optparse.OptionParser(usage=usage, version=version)
parser.add_option('-d', None,
action='count', dest='debug', default=0,
help='turn on debugging')
parser.add_option('-v', None,
action='store_true', dest='verbose', default=False,
help='verbose messages')
parser.add_option('-D', None,
action='store_true', dest='Debug', default=False,
help='interactive debugging')
(OPTS, args) = parser.parse_args(args=argv[1:])
if len(args) != 2:
parser.print_help()
return 1
# Interactive debugging
if OPTS.Debug:
import pdb
pdb.set_trace()
for fn in args:
if not os.access(fn, os.R_OK):
print("%s: Can't open %s" % (PROG, fn))
return 1
templatefn = args.pop(0)
ipaddrsfn = args.pop(0)
ttup = readtemplate(templatefn)
if ttup == None:
return 1
if OPTS.debug > 0:
print('template, ipaddrs', template, ipaddrs);
print('foo', len(ttup[0]), len(ttup[1]))
ipaddrs = readipaddrs(ipaddrsfn)
if ipaddrs == None:
return 1
print(' /* WARNING: This file is automatically generated; do not edit directly */')
sys.stdout.write(ttup[0])
# Need a newline
print('')
for ipaddr in ipaddrs:
print(ipaddrtorule(ipaddr))
sys.stdout.write(ttup[1])
return 0
if __name__ == "__main__":
sys.exit(main())