Esempio n. 1
0
    def setUp(self):
        self.db = FacilityDB()

        self.db.load_config(
            os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))
Esempio n. 2
0
class FacilitiesTest(unittest.TestCase):
    def setUp(self):
        self.db = FacilityDB()

        self.db.load_config(
            os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))

    def test_parse_mod_id_1(self):
        mod_id = parse_mod_id('web')
        self.assertEqual(('root', 'web'), mod_id)

    def test_parse_mod_id_2(self):
        mod_id = parse_mod_id('web.foo')
        self.assertEqual(('root', 'web', 'foo'), mod_id)

    def test_parse_mod_id_3(self):
        mod_id = parse_mod_id('')
        self.assertEqual(('root', ), mod_id)

    def test_parse_mod_id_4(self):
        mod_id = parse_mod_id('root')
        self.assertEqual(('root', ), mod_id)

    def test_pretty_mod_id_1(self):
        mod_id = pretty_mod_id(('root', 'web'))
        self.assertEqual('web', mod_id)

    def test_pretty_mod_id_2(self):
        mod_id = pretty_mod_id(('root', 'web', 'foo'))
        self.assertEqual('web.foo', mod_id)

    def test_pretty_mod_id_3(self):
        mod_id = pretty_mod_id(('root', ))
        self.assertEqual('root', mod_id)

    def test_mod_id_identity_1(self):
        self.assertEqual('root', pretty_mod_id(parse_mod_id('root')))

    def test_mod_id_identity_2(self):
        self.assertEqual('web', pretty_mod_id(parse_mod_id('root.web')))

    def test_mod_id_identity_3(self):
        self.assertEqual('web.foo',
                         pretty_mod_id(parse_mod_id('root.web.foo')))

    def test_mod_id_identity_4(self):
        self.assertEqual(('root', ), parse_mod_id(pretty_mod_id(('root', ))))

    def test_mod_id_identity_5(self):
        self.assertEqual(('root', 'web'),
                         parse_mod_id(pretty_mod_id(('root', 'web'))))

    def test_mod_id_identity_6(self):
        self.assertEqual(('root', 'web', 'foo'),
                         parse_mod_id(pretty_mod_id(('root', 'web', 'foo'))))

    def test_facility_search_1(self):
        f = self.db.get_facility('app-name', '')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', )))

    def test_facility_search_2(self):
        f = self.db.get_facility('app-name', 'web')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', (
            'root',
            'web',
        )))

    def test_facility_search_3(self):
        f = self.db.get_facility('app-name', 'web.errors')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', (
            'root',
            'web',
            'errors',
        )))

    def test_facility_search_4(self):
        f = self.db.get_facility('app-name', 'web.does-not-exist')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', (
            'root',
            'web',
        )))

    def test_facility_search_5(self):
        f = self.db.get_facility('app-name', 'does-not-exist')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', )))

    def test_facility_search_6(self):
        f = self.db.get_facility('no-such-app', '')
        self.assertEqual(f, None)

    def test_root_inheritance(self):
        f = self.db.get_facility('app-name', 'web')
        self.assertEqual(f.secret, 'foo')

    def test_no_root_config(self):
        filename = os.path.join(os.path.dirname(__file__), 'data',
                                'facilities-with-no-root.conf')
        self.assertRaises(FacilityError, self.db.load_config, filename)
Esempio n. 3
0
def main():
    try:
        init_options()
    except OptionsError as e:
        sys.stderr.write("Error: {0}\n\n".format(e))
        sys.stderr.write(usage())
        sys.stderr.write("\n");
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)
        
    if options.main.generate_config:
        print(generate_sample_config()) # XXX: this doesn't yet work properly because of groper
        sys.exit()

    conf_root = os.path.dirname(os.path.abspath(options.main.config))

    facility_db = FacilityDB()
    try:
        facility_db.load_config(normalize_path(options.main.facilities_config, conf_root))
    except (IOError) as e:
        sys.stderr.write("Error reading {0}: {1}\n".format(options.main.facilities_config, e))
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)
    except (FacilityError, configparser.Error) as e:
        sys.stderr.write("{0} contains errors:\n\n".format(options.main.facilities_config))

        if hasattr(e, 'lineno'):
            e = 'Error on line {0}: {1}'.format(e.lineno, e.message.split("\n")[0].strip())

        sys.stderr.write("{0}\n\n".format(e))
        sys.stderr.write("Exiting now.\n")
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)

    if options.main.check_config:
        sys.exit() # We are just checking the config file, so exit here.

    cache_config_checksum()
    create_dirs()

    if options.main.daemon:
        daemonize()

    if options.main.user:
        drop_privileges(options.main.user)

    if options.main.pidfile:
        write_pid(options.main.pidfile)
        atexit.register(exit_handler)

    setup_logging()

    try:
        logging.getLogger().info("Starting loghogd.")

        compressor = Compressor()
        compressor.find_uncompressed(options.main.logdir, r'.+\.log\..+')

        writer = Writer(facility_db, compressor, options.main.logdir)
        processor = Processor(facility_db, writer)

        server = Server(processor.on_message, conf_root)

        signal_handler = make_shutdown_handler(server, writer, compressor)

        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)
        
        signal.signal(signal.SIGHUP, make_reload_handler(facility_db, writer))
    except Exception as e:
        logging.getLogger().error(e)
        logging.getLogger().error('Exiting abnormally due to an error at startup.')
        sys.exit(os.EX_CONFIG)

    try:
        compressor.start()
        server.run()
    except Exception as e:
        logging.getLogger().exception(e)
        logging.getLogger().error('Exiting abnormally due to an error at runtime.')
        shutdown(None, server, writer, compressor)
        sys.exit(os.EX_SOFTWARE)
    
    logging.getLogger().info('Shutdown complete. Exiting.')
Esempio n. 4
0
def main():
    try:
        init_options()
    except OptionsError as e:
        sys.stderr.write("Error: {0}\n\n".format(e))
        sys.stderr.write(usage())
        sys.stderr.write("\n")
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)

    if options.main.generate_config:
        print(generate_sample_config()
              )  # XXX: this doesn't yet work properly because of groper
        sys.exit()

    conf_root = os.path.dirname(os.path.abspath(options.main.config))

    facility_db = FacilityDB()
    try:
        facility_db.load_config(
            normalize_path(options.main.facilities_config, conf_root))
    except (IOError) as e:
        sys.stderr.write("Error reading {0}: {1}\n".format(
            options.main.facilities_config, e))
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)
    except (FacilityError, configparser.Error) as e:
        sys.stderr.write("{0} contains errors:\n\n".format(
            options.main.facilities_config))

        if hasattr(e, 'lineno'):
            e = 'Error on line {0}: {1}'.format(
                e.lineno,
                e.message.split("\n")[0].strip())

        sys.stderr.write("{0}\n\n".format(e))
        sys.stderr.write("Exiting now.\n")
        sys.stderr.flush()
        sys.exit(os.EX_CONFIG)

    if options.main.check_config:
        sys.exit()  # We are just checking the config file, so exit here.

    cache_config_checksum()
    create_dirs()

    if options.main.daemon:
        daemonize()

    if options.main.user:
        drop_privileges(options.main.user)

    if options.main.pidfile:
        write_pid(options.main.pidfile)
        atexit.register(exit_handler)

    setup_logging()

    try:
        logging.getLogger().info("Starting loghogd.")

        compressor = Compressor()
        compressor.find_uncompressed(options.main.logdir, r'.+\.log\..+')

        writer = Writer(facility_db, compressor, options.main.logdir)
        processor = Processor(facility_db, writer)

        server = Server(processor.on_message, conf_root)

        signal_handler = make_shutdown_handler(server, writer, compressor)

        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)

        signal.signal(signal.SIGHUP, make_reload_handler(facility_db, writer))
    except Exception as e:
        logging.getLogger().error(e)
        logging.getLogger().error(
            'Exiting abnormally due to an error at startup.')
        sys.exit(os.EX_CONFIG)

    try:
        compressor.start()
        server.run()
    except Exception as e:
        logging.getLogger().exception(e)
        logging.getLogger().error(
            'Exiting abnormally due to an error at runtime.')
        shutdown(None, server, writer, compressor)
        sys.exit(os.EX_SOFTWARE)

    logging.getLogger().info('Shutdown complete. Exiting.')
Esempio n. 5
0
    def setUp(self):
        self.db = FacilityDB()

        self.db.load_config(os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))
Esempio n. 6
0
class FacilitiesTest(unittest.TestCase):
 
    def setUp(self):
        self.db = FacilityDB()

        self.db.load_config(os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))

    def test_parse_mod_id_1(self):
        mod_id = parse_mod_id('web')
        self.assertEqual(('root', 'web'), mod_id)

    def test_parse_mod_id_2(self):
        mod_id = parse_mod_id('web.foo')
        self.assertEqual(('root', 'web', 'foo'), mod_id)

    def test_parse_mod_id_3(self):
        mod_id = parse_mod_id('')
        self.assertEqual(('root', ), mod_id)

    def test_parse_mod_id_4(self):
        mod_id = parse_mod_id('root')
        self.assertEqual(('root', ), mod_id)

    def test_pretty_mod_id_1(self):
        mod_id = pretty_mod_id(('root', 'web'))
        self.assertEqual('web', mod_id)

    def test_pretty_mod_id_2(self):
        mod_id = pretty_mod_id(('root', 'web', 'foo'))
        self.assertEqual('web.foo', mod_id)

    def test_pretty_mod_id_3(self):
        mod_id = pretty_mod_id(('root',))
        self.assertEqual('root', mod_id)

    def test_mod_id_identity_1(self):
        self.assertEqual('root', pretty_mod_id(parse_mod_id('root')))
        
    def test_mod_id_identity_2(self):
        self.assertEqual('web', pretty_mod_id(parse_mod_id('root.web')))
        
    def test_mod_id_identity_3(self):
        self.assertEqual('web.foo', pretty_mod_id(parse_mod_id('root.web.foo')))
        
    def test_mod_id_identity_4(self):
        self.assertEqual(('root', ), parse_mod_id(pretty_mod_id(('root', ))))
        
    def test_mod_id_identity_5(self):
        self.assertEqual(('root', 'web'), parse_mod_id(pretty_mod_id(('root', 'web'))))
        
    def test_mod_id_identity_6(self):
        self.assertEqual(('root', 'web', 'foo'), parse_mod_id(pretty_mod_id(('root', 'web', 'foo'))))
        
    def test_facility_search_1(self):
        f = self.db.get_facility('app-name', '')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', )))

    def test_facility_search_2(self):
        f = self.db.get_facility('app-name', 'web')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', 'web', )))

    def test_facility_search_3(self):
        f = self.db.get_facility('app-name', 'web.errors')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', 'web', 'errors', )))

    def test_facility_search_4(self):
        f = self.db.get_facility('app-name', 'web.does-not-exist')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', 'web', )))

    def test_facility_search_5(self):
        f = self.db.get_facility('app-name', 'does-not-exist')
        self.assertEqual((f.app_id, f.mod_id), ('app-name', ('root', )))

    def test_facility_search_6(self):
        f = self.db.get_facility('no-such-app', '')
        self.assertEqual(f, None)
    
    def test_root_inheritance(self):
        f = self.db.get_facility('app-name', 'web')
        self.assertEqual(f.secret, 'foo')

    def test_no_root_config(self):
        filename = os.path.join(os.path.dirname(__file__), 'data', 'facilities-with-no-root.conf')
        self.assertRaises(FacilityError, self.db.load_config, filename)