示例#1
0
class SnmpAddressReaderTest(unittest.TestCase):

	def setUp(self):
		self.reader = SnmpAddressReader()

		config = ConfigParser.ConfigParser()
		config.readfp(open('beacon.cfg'))
		self.reader.configure(dict(config.items('SnmpAddressReader')))

	def test_get_addresses(self):
		addresses = self.reader.get_addresses()
		self.assertTrue(len(addresses) > 0)
示例#2
0
文件: beacon.py 项目: jdq/beacon
class Beacon(object):
    def __init__(self):
        self.reader = None
        self.writer = None
        self.hostname = None
        # TODO: this can be improved
        self.rfc1918_addresses = ['10.',
                        '192.168.']

    def configure(self, config):
        name = 'main'
        if config.has_section(name):
            if config.has_option(name, 'hostname'):
                self.hostname = config.get(name, 'hostname')
                logger.debug("hostname = %s", self.hostname)

        self.reader = SnmpAddressReader()
        name = self.reader.__class__.__name__
        logger.debug("reader class = %s", name)
        if config.has_section(name):
            self.reader.configure(dict(config.items(name)))

        self.writer = Route53AddressWriter()
        name = self.writer.__class__.__name__
        logger.debug("writer class = %s", name)
        if config.has_section(name):
            self.writer.configure(dict(config.items(name)))

    def resolve_hostname(self):
        try:
            logger.info("attempting to resolve %s", self.hostname)
            answers = dns.resolver.query(self.hostname, 'A')
            for rdata in answers:
                logger.info("current DNS record: %s", rdata)
        except NXDOMAIN:
            logger.info("DNS record not found")

    def get_external_address(self, addresses):
        for address in addresses:
            if address == "127.0.0.1":
                continue
            for a in self.rfc1918_addresses:
                if address.startswith(a):
                    continue
            return address
        return None

    def run(self, argv):
        progname = os.path.basename(argv[0])

        parser = OptionParser()
        parser.add_option("--verbose", "-v", dest="verbose",
                        action="store_true", default=False)
        parser.add_option("-c", dest="cfgfilename",
                        default=DEFAULT_CONFIG_FILENAME)
        parser.add_option("-l", dest="logfilename")
        options, args = parser.parse_args()
        argslength = len(args)

        # log to file or using basicConfig
        logformat = '%(asctime)s %(levelname)-8s %(message)s'
        if options.logfilename:
            add_logging_file_handler(options.logfilename, logformat,
                    logging.DEBUG)
        else:
            logging.basicConfig(format=progname + ": " + logformat)

        if options.verbose:
            logging.getLogger().setLevel(logging.DEBUG)
        else:
            logging.getLogger().setLevel(logging.INFO)

        logger.info("starting")

        cfgfilename = options.cfgfilename
        config = ConfigParser.ConfigParser()
        try:
            config.readfp(open(cfgfilename))
        except IOError:
            sys.stderr.write("unable to open configuration: %s\n" % cfgfilename)
            return 2

        self.configure(config)

        self.resolve_hostname()

        addresses = self.reader.get_addresses()
        address = self.get_external_address(addresses)
        logger.debug("address obtained from reader = %s", address)
        self.writer.update_addresses(self.hostname, [address])

        logger.info("execution complete")
        return 0