#! /usr/bin/env python # # $Id$ import os import os.path import sys import stat import subprocess Prefix = "/usr/local/bro" # match Bro's default. BroDist = os.path.abspath("../..") BroCtlSrc = os.path.join(BroDist, "aux/broctl") BroBuild = BroDist BroCtlBuild = os.path.join(BroDist, "aux/broctl") StandAlone = False def usage(): print """ Usage: ./configure [--prefix=] [--brodist=] [--standalone] --prefix= Base directory for cluster installation [Default: %s] --brodist= Base directory of Bro distribution [Default: %s] --standalone Do a non-cluster, one-Bro-only installation """ % (Prefix, BroDist) sys.exit(1) args = {} for arg in sys.argv[1:]: try: m = arg.find("=") if m >= 0: opt = arg[0:m].strip() val = arg[m+1:].strip() else: opt = arg.strip() val = None if opt == "--prefix" and val: if val != "NONE": Prefix = os.path.abspath(val) elif opt == "--brodist" and val: BroDist = os.path.abspath(val) BroCtlSrc = os.path.join(BroDist, "aux/broctl") elif opt == "--builddir" and val: BroCtlBuild = os.path.abspath(val) BroBuild = os.path.abspath(os.path.join(BroCtlBuild, "../..")) elif opt == "--standalone": StandAlone = True else: usage() args[opt] = val except ValueError: usage() Version = open(os.path.join(BroDist, "aux/broctl/VERSION")).readline().strip() try: p = subprocess.Popen("svnversion", stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True) (stdin, stdout) = (p.stdin, p.stdout) stdin.close() svnversion = stdout.readline().split()[0] if svnversion != "exported": Version += " [r%s]" % svnversion except: pass bin = os.path.join(BroCtlBuild, "bin") if not os.path.exists(bin): os.mkdir(bin) # Create Makefile, bin/broctl and bin/make-env by replacing configuration variables. for file in ("Makefile", "bin/broctl", "bin/make-wrapper"): src = os.path.join(BroDist, "aux/broctl/%s.in" % file) dst = os.path.join(BroCtlBuild, file) try: os.unlink(dst) except OSError: pass out = open(dst, "w") for line in open(src): line = line.replace("$PREFIX", Prefix) line = line.replace("$BRODIST", BroDist) line = line.replace("$BROBUILD", BroBuild) line = line.replace("$BROCTLBUILD", BroCtlBuild) line = line.replace("$BROCTLSRC", BroCtlSrc) line = line.replace("$STANDALONE", StandAlone and "True" or "False") line = line.replace("$VERSION", Version) print >>out, line, # Copy the mode of the source file but remove write permission # to prevent accidental modifications. mode = os.stat(src).st_mode os.chmod(dst, mode &~ 0222) print "Created %s." % file # Create config.status. status = os.path.join(BroCtlBuild, "config.status") out = open(status, "w") print >>out, """#! /bin/sh # Generated by configure. # Run this file to recreate the current configuration. echo Recreating configuration. echo if [ -e ./BroControl ]; then configure=./configure args["--brodist"] = "../../" else configure=%s/configure fi $configure %s && exit """ % (BroCtlSrc, " ".join(["%s=%s" % (k, v) for (k, v) in args.items()])) os.chmod(status, 0750) # Done. print """ Bro Control Configuration Summary ========================================================== Installation directory: %s Bro distribution: %s Bro build directory: %s Bro Control distribution: %s Bro Control build directory: %s Standalone installation: %s """ % (Prefix, BroDist, BroBuild, BroCtlSrc, BroCtlBuild, (StandAlone and "yes" or "no"))