def setUp(self): self.db = FacilityDB() self.db.load_config( os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))
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)
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.')
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.')
def setUp(self): self.db = FacilityDB() self.db.load_config(os.path.join(os.path.dirname(__file__), 'data', 'facilities.conf'))
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)