print('\n\033[32mConfig index for %s\033[0m' % filename) print(json.dumps(cfg.index, **print_args)) print('\n\033[32mConfig files for %s\033[0m' % filename) print(json.dumps(cfg.files, **print_args)) print('\n\033[32mStub/plus status %s\033[0m' % filename) print(json.dumps(cfg.stub_status_urls, **print_args)) print(json.dumps(cfg.plus_status_external_urls, **print_args)) print(json.dumps(cfg.plus_status_internal_urls, **print_args)) print('\n\033[32mAccess logs %s\033[0m' % filename) print(json.dumps(cfg.access_logs, **print_args)) print('\n\033[32mError logs %s\033[0m' % filename) print(json.dumps(cfg.error_logs, **print_args)) print('\n\033[32mLog formats %s\033[0m' % filename) print(json.dumps(cfg.log_formats, **print_args)) print('\n\033[32mConfig errors for %s\033[0m' % filename) print(json.dumps(cfg.parser_errors, **print_args)) else: print('\n\033[32mLight parse results for %s\033[0m' % filename) print(json.dumps(cfg.collect_structure(), **print_args)) end_time = time.time() print('\n\033[32mParsed in %s seconds\033[0m' % (end_time-start_time))
print('\n\033[32mConfig files for %s\033[0m' % filename) print(json.dumps(cfg.files, **print_args)) print('\n\033[32mConfig directory map for %s\033[0m' % filename) print(json.dumps(cfg.directory_map, **print_args)) print('\n\033[32mStub/plus status %s\033[0m' % filename) print(json.dumps(cfg.stub_status_urls, **print_args)) print(json.dumps(cfg.plus_status_external_urls, **print_args)) print(json.dumps(cfg.plus_status_internal_urls, **print_args)) print('\n\033[32mAccess logs %s\033[0m' % filename) print(json.dumps(cfg.access_logs, **print_args)) print('\n\033[32mError logs %s\033[0m' % filename) print(json.dumps(cfg.error_logs, **print_args)) print('\n\033[32mLog formats %s\033[0m' % filename) print(json.dumps(cfg.log_formats, **print_args)) print('\n\033[32mConfig errors for %s\033[0m' % filename) print(json.dumps(cfg.parser_errors, **print_args)) else: print('\n\033[32mLight parse results for %s\033[0m' % filename) print(json.dumps(cfg.collect_structure(), **print_args)) end_time = time.time() print('\n\033[32mParsed in %s seconds\033[0m' % (end_time - start_time))
def collect(self): try: config = NginxConfig( self.object.conf_path, binary=self.object.bin_path, prefix=self.object.prefix ) # check if config is changed (changes are: new files/certs, new mtimes) config_files, config_dirs = config.collect_structure(include_ssl_certs=self.object.upload_ssl) if config_files == self.previous_files and config_dirs == self.previous_directories: return # parse config tree config.full_parse() # Send event for parsing nginx config. # Use config.parser.filename to account for default value defined in NginxConfigParser. self.object.eventd.event( level=INFO, message='nginx config parsed, read from %s' % config.filename, ) for error in config.parser_errors: self.object.eventd.event(level=WARNING, message=error) # run ssl checks if self.object.upload_ssl: config.run_ssl_analysis() else: context.log.info('ssl analysis skipped due to users settings') # run upload checksum = config.checksum() if self.object.upload_config: self.upload(config, checksum) if self.previous_checksum: # config changed, so we need to restart the object self.object.need_restart = True else: # otherwise run test if self.object.run_config_test and config.total_size() < 20*1024*1024: # 20 MB run_time = config.run_test() # send event for testing nginx config if config.test_errors: self.object.eventd.event(level=WARNING, message='nginx config test failed') else: self.object.eventd.event(level=INFO, message='nginx config tested ok') for error in config.test_errors: self.object.eventd.event(level=CRITICAL, message=error) # stop -t if it took too long if run_time > context.app_config['containers']['nginx']['max_test_duration']: context.app_config['containers']['nginx']['run_test'] = False context.app_config.mark_unchangeable('run_test') self.object.eventd.event( level=WARNING, message='%s -t -c %s took %s seconds, disabled until agent restart' % ( config.binary, config.filename, run_time ) ) self.object.run_config_test = False self.previous_checksum = checksum self.previous_files = copy.copy(config_files) self.previous_directories = copy.copy(config_dirs) except Exception as e: exception_name = e.__class__.__name__ context.log.error('failed to collect due to %s' % exception_name) context.log.debug('additional info:', exc_info=True) self.object.eventd.event( level=INFO, message='nginx config parser failed, path %s' % self.object.conf_path, onetime=True )
def main(): args = parse_args() def dump(heading, *payloads): if heading: print '\033[32m{} for {}\033[0m'.format(heading, args.config) for x in payloads: if isinstance(x, dict) and args.pretty: print json.dumps(x, indent=4, sort_keys=True) elif isinstance(x, dict): print json.dumps(x, separators=(',', ':'), sort_keys=True) else: print json.dumps(x) # never prettify print lists print start = time.time() cfg = NginxConfig(filename=args.config) if args.light: structure = cfg.collect_structure(include_ssl_certs=True) else: cfg.full_parse() runtime = time.time() - start if args.quiet: print 'Parsed in %s seconds' % runtime return if args.light: dump(None, *structure) elif args.simple: dump(None, cfg.subtree) elif args.dirmap: dump('Config files', cfg.files) dump('Config directories', cfg.directories) dump('Config directory map', cfg.directory_map) dump('Config errors', cfg.parser_errors) elif args.payload: cfg.run_ssl_analysis() payload = { 'tree': cfg.tree, 'directory_map': cfg.directory_map, 'files': cfg.files, 'directories': cfg.directories, 'ssl_certificates': cfg.ssl_certificates, 'access_logs': cfg.access_logs, 'error_logs': cfg.error_logs, 'errors': { 'parser': len(cfg.parser_errors), 'test': len(cfg.test_errors) } } dump(None, payload) else: cfg.run_ssl_analysis() dump('Config tree', cfg.tree) dump('Config files', cfg.files) dump('Config directory map', cfg.directory_map) dump('SSL certificates', cfg.ssl_certificates) dump('Stub status/plus status/api urls', cfg.stub_status_urls, cfg.plus_status_external_urls, cfg.plus_status_internal_urls, cfg.api_external_urls, cfg.api_internal_urls) dump('Access logs', cfg.access_logs) dump('Error logs', cfg.error_logs) dump('Log formats', cfg.log_formats) dump('Config errors', cfg.parser_errors) print '\033[32mParsed in %s seconds\033[0m' % runtime