def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: {0!s}".format(config_name)) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print( "Additional configuration can be read from the file {0!s}".format( config_file)) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to {0!s}!\n".format(config_file)) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') app.register_blueprint(radiusserver_blueprint, url_prefix='/radiusserver') app.register_blueprint(privacyideaserver_blueprint, url_prefix='/privacyideaserver') app.register_blueprint(eventhandling_blueprint, url_prefix='/event') app.register_blueprint(smsgateway_blueprint, url_prefix='/smsgateway') app.register_blueprint(client_blueprint, url_prefix='/client') app.register_blueprint(subscriptions_blueprint, url_prefix='/subscriptions') db.init_app(app) migrate = Migrate(app, db) try: # Try to read logging config from file log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): logging.config.fileConfig(log_config_file) if not silent: print("Reading Logging settings from {0!s}".format( log_config_file)) else: raise Exception("The config file specified in PI_LOGCONFIG does " "not exist.") except Exception as exx: if not silent: sys.stderr.write("{0!s}\n".format(exx)) sys.stderr.write("Could not use PI_LOGCONFIG. " "Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.DEBUG) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE") if logfile: if not silent: sys.stderr.write("Using PI_LOGLEVEL {0!s}.\n".format(level)) sys.stderr.write("Using PI_LOGFILE {0!s}.\n".format(logfile)) PI_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile PI_LOGGING_CONFIG["handlers"]["file"]["level"] = level PI_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(PI_LOGGING_CONFIG) else: if not silent: sys.stderr.write("No PI_LOGFILE found. Using default " "config.\n") logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) babel = Babel(app) @babel.localeselector def get_locale(): # if we are not in the request context, return None to use the default # locale if not request: return None # otherwise try to guess the language from the user accept # header the browser transmits. We support de/fr/en in this # example. The best match wins. return request.accept_languages.best_match( ['de', 'fr', 'it', 'es', 'en']) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: {0!s}".format(config_name)) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print("Additional configuration can be read from the file {0!s}".format( config_file)) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to {0!s}!\n".format(config_file)) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') app.register_blueprint(radiusserver_blueprint, url_prefix='/radiusserver') app.register_blueprint(periodictask_blueprint, url_prefix='/periodictask') app.register_blueprint(privacyideaserver_blueprint, url_prefix='/privacyideaserver') app.register_blueprint(eventhandling_blueprint, url_prefix='/event') app.register_blueprint(smsgateway_blueprint, url_prefix='/smsgateway') app.register_blueprint(client_blueprint, url_prefix='/client') app.register_blueprint(subscriptions_blueprint, url_prefix='/subscriptions') app.register_blueprint(monitoring_blueprint, url_prefix='/monitoring') db.init_app(app) migrate = Migrate(app, db) try: # Try to read logging config from file log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): logging.config.fileConfig(log_config_file) if not silent: print("Reading Logging settings from {0!s}".format(log_config_file)) else: raise Exception("The config file specified in PI_LOGCONFIG does " "not exist.") except Exception as exx: if not silent: sys.stderr.write("{0!s}\n".format(exx)) sys.stderr.write("Could not use PI_LOGCONFIG. " "Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.DEBUG) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE") if logfile: if not silent: sys.stderr.write("Using PI_LOGLEVEL {0!s}.\n".format(level)) sys.stderr.write("Using PI_LOGFILE {0!s}.\n".format(logfile)) PI_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile PI_LOGGING_CONFIG["handlers"]["file"]["level"] = level PI_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(PI_LOGGING_CONFIG) else: if not silent: sys.stderr.write("No PI_LOGFILE found. Using default " "config.\n") logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) babel = Babel(app) @babel.localeselector def get_locale(): # if we are not in the request context, return None to use the default # locale if not request: return None # otherwise try to guess the language from the user accept # header the browser transmits. We support de/fr/en in this # example. The best match wins. return request.accept_languages.best_match(['de', 'fr', 'it', 'es', 'en']) queue.register_app(app) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: {0!s}".format(config_name)) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print("Additional configuration will be read " "from the file {0!s}".format(config_file)) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) # Set up flask-versioned versioned = Versioned(app, format='%(path)s?v=%(version)s') try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to {0!s}!\n".format(config_file)) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) # We allow to set different static folders app.static_folder = app.config.get("PI_STATIC_FOLDER", "static/") app.template_folder = app.config.get("PI_TEMPLATE_FOLDER", "static/templates/") app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') app.register_blueprint(radiusserver_blueprint, url_prefix='/radiusserver') app.register_blueprint(periodictask_blueprint, url_prefix='/periodictask') app.register_blueprint(privacyideaserver_blueprint, url_prefix='/privacyideaserver') app.register_blueprint(eventhandling_blueprint, url_prefix='/event') app.register_blueprint(smsgateway_blueprint, url_prefix='/smsgateway') app.register_blueprint(client_blueprint, url_prefix='/client') app.register_blueprint(subscriptions_blueprint, url_prefix='/subscriptions') app.register_blueprint(monitoring_blueprint, url_prefix='/monitoring') db.init_app(app) migrate = Migrate(app, db) app.response_class = PiResponseClass # Setup logging log_read_func = { 'yaml': lambda x: logging.config.dictConfig(yaml.safe_load( open(x, 'r').read())), 'cfg': lambda x: logging.config.fileConfig(x) } have_config = False log_exx = None log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): for cnf_type in ['cfg', 'yaml']: try: log_read_func[cnf_type](log_config_file) if not silent: print('Read Logging settings from {0!s}'.format( log_config_file)) have_config = True break except Exception as exx: log_exx = exx pass if not have_config: if log_exx: sys.stderr.write("Could not use PI_LOGCONFIG: " + str(log_exx) + "\n") if not silent: sys.stderr.write("Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.INFO) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE", '/var/log/privacyidea/privacyidea.log') if not silent: sys.stderr.write("Using PI_LOGLEVEL {0!s}.\n".format(level)) sys.stderr.write("Using PI_LOGFILE {0!s}.\n".format(logfile)) DEFAULT_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile DEFAULT_LOGGING_CONFIG["handlers"]["file"]["level"] = level DEFAULT_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) babel = Babel(app) @babel.localeselector def get_locale(): # if we are not in the request context, return None to use the default # locale if not request: return None # otherwise try to guess the language from the user accept # header the browser transmits. We support de/fr/en in this # example. The best match wins. return request.accept_languages.best_match( ['de', 'nl', 'fr', 'cs', 'it', 'es', 'en']) queue.register_app(app) logging.debug(u"Reading application from the static folder {0!s} and " u"the template folder {1!s}".format(app.static_folder, app.template_folder)) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg'): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :return: The flask application :rtype: App object """ print "The configuration name is: %s" % config_name print "Additional configuration can be read from the file %s" % config_file if os.environ.get(ENV_KEY): print("Additional configuration can be read from " "the file %s" % os.environ[ENV_KEY]) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: print 50*"!" print " WARNING: privacyidea create_app has no access" print " to %s!" % config_file print 50*"!" # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') db.init_app(app) migrate = Migrate(app, db) # Create the logger # Read log file from config from logging import handlers fhandler = handlers.RotatingFileHandler(app.config.get("PI_LOGFILE", "privacyidea.log"), backupCount=4, maxBytes=10000000) formatter = SecureFormatter(MY_LOG_FORMAT) # Set the formatter fhandler.setFormatter(formatter) # read level from config fhandler.setLevel(app.config.get("PI_LOGLEVEL", logging.INFO)) logging.getLogger("privacyidea").addHandler(fhandler) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg'): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :return: The flask application :rtype: App object """ print("The configuration name is: %s" % config_name) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] print("Additional configuration can be read from the file %s" % config_file) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: print(50*"!") print(" WARNING: privacyidea create_app has no access") print(" to %s!" % config_file) print(50*"!") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') db.init_app(app) migrate = Migrate(app, db) try: # Try to read logging config from file log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") logging.config.fileConfig(log_config_file) print("Reading Logging settings from %s" % log_config_file) except Exception as exx: #print("%s" % traceback.format_exc()) print("%s" % exx) print("No log config file defined in PI_LOGCONFIG. Using PI_LOGLEVEL " "and PI_LOGFILE.") # If there is another level in pi.cfg we use this. level = app.config.get("PI_LOGLEVEL") if level: print("PI_LOGLEVEL found. Setting to %s" % level) logging.getLogger("privacyidea").setLevel(level) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE") if logfile: logger = logging.getLogger("privacyidea") handlers = logger.handlers for handler in handlers: if type(handler) == logging.handlers.RotatingFileHandler: # Set a new filename for the RotatingFileHandler print("PI_LOGFILE found. Setting to %s" % logfile) if handler.baseFilename != logfile: # We need to reopen the file, if it has changed logger.removeHandler(handler) handler.baseFilename = logfile handler.doRollover() logger.addHandler(handler) else: print("No PI_LOGFILE found. Using default config.") logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) return app
def create_app(config_name="development", config_file='/etc/privacyidea/pi.cfg', silent=False): """ First the configuration from the config.py is loaded depending on the config type like "production" or "development" or "testing". Then the environment variable PRIVACYIDEA_CONFIGFILE is checked for a config file, that contains additional settings, that will overwrite the default settings from config.py :param config_name: The config name like "production" or "testing" :type config_name: basestring :param config_file: The name of a config file to read configuration from :type config_file: basestring :param silent: If set to True the additional information are not printed to stdout :type silent: bool :return: The flask application :rtype: App object """ if not silent: print("The configuration name is: %s" % config_name) if os.environ.get(ENV_KEY): config_file = os.environ[ENV_KEY] if not silent: print("Additional configuration can be read from the file %s" % config_file) app = Flask(__name__, static_folder="static", template_folder="static/templates") if config_name: app.config.from_object(config[config_name]) try: # Try to load the given config_file. # If it does not exist, just ignore it. app.config.from_pyfile(config_file, silent=True) except IOError: sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") sys.stderr.write(" WARNING: privacyidea create_app has no access\n") sys.stderr.write(" to %s!\n" % config_file) sys.stderr.write("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") # Try to load the file, that was specified in the environment variable # PRIVACYIDEA_CONFIG_FILE # If this file does not exist, we create an error! app.config.from_envvar(ENV_KEY, silent=True) app.register_blueprint(validate_blueprint, url_prefix='/validate') app.register_blueprint(token_blueprint, url_prefix='/token') app.register_blueprint(system_blueprint, url_prefix='/system') app.register_blueprint(resolver_blueprint, url_prefix='/resolver') app.register_blueprint(realm_blueprint, url_prefix='/realm') app.register_blueprint(defaultrealm_blueprint, url_prefix='/defaultrealm') app.register_blueprint(policy_blueprint, url_prefix='/policy') app.register_blueprint(login_blueprint, url_prefix='/') app.register_blueprint(jwtauth, url_prefix='/auth') app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(audit_blueprint, url_prefix='/audit') app.register_blueprint(machineresolver_blueprint, url_prefix='/machineresolver') app.register_blueprint(machine_blueprint, url_prefix='/machine') app.register_blueprint(application_blueprint, url_prefix='/application') app.register_blueprint(caconnector_blueprint, url_prefix='/caconnector') app.register_blueprint(cert_blueprint, url_prefix='/certificate') app.register_blueprint(ttype_blueprint, url_prefix='/ttype') app.register_blueprint(register_blueprint, url_prefix='/register') app.register_blueprint(smtpserver_blueprint, url_prefix='/smtpserver') app.register_blueprint(recover_blueprint, url_prefix='/recover') db.init_app(app) migrate = Migrate(app, db) try: # Try to read logging config from file log_config_file = app.config.get("PI_LOGCONFIG", "/etc/privacyidea/logging.cfg") if os.path.isfile(log_config_file): logging.config.fileConfig(log_config_file) if not silent: print("Reading Logging settings from %s" % log_config_file) else: raise Exception("The config file specified in PI_LOGCONFIG does " "not exist.") except Exception as exx: sys.stderr.write("%s\n" % exx) sys.stderr.write("Could not use PI_LOGCONFIG. " "Using PI_LOGLEVEL and PI_LOGFILE.\n") level = app.config.get("PI_LOGLEVEL", logging.DEBUG) # If there is another logfile in pi.cfg we use this. logfile = app.config.get("PI_LOGFILE") if logfile: sys.stderr.write("Using PI_LOGLEVEL %s.\n" % level) sys.stderr.write("Using PI_LOGFILE %s.\n" % logfile) PI_LOGGING_CONFIG["handlers"]["file"]["filename"] = logfile PI_LOGGING_CONFIG["handlers"]["file"]["level"] = level PI_LOGGING_CONFIG["loggers"]["privacyidea"]["level"] = level logging.config.dictConfig(PI_LOGGING_CONFIG) else: sys.stderr.write("No PI_LOGFILE found. Using default config.\n") logging.config.dictConfig(DEFAULT_LOGGING_CONFIG) return app