def readMainConf(): """Read main configuration data Input: none Output: none """ global main_config # read path to config file from CLI main_config.readCli() # apply config to enable/disable logging main_config.applyConfig() # read config file info("--- Reading configuration ---") confFilePath = main_config["PATHS"]["config_file"] parsedFiles = main_config.readFiles(confFilePath) # check if all neccessary files are read if confFilePath not in parsedFiles: from bsdradius import misc misc.quit("Can not read required configuration files", 1) # read CLI again to overwrite options from file main_config.readCli() # apply config to avoid overwritten values from config file main_config.applyConfig()
def execShutdownModules(): """Execute all shutdown-capable modules Input: none Output: none """ for moduleName, module in loadedModules.iteritems(): if module.shutdownCapable: try: module.shutdown_funct() # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit('Can not execute shutdown function in module "%s"' % moduleName, 1)
def execShutdownModules(): """Execute all shutdown-capable modules Input: none Output: none """ for moduleName, module in loadedModules.iteritems(): if module.shutdownCapable: try: module.shutdown_funct() # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit( 'Can not execute shutdown function in module "%s"' % moduleName, 1)
def execShutdownModules(): """Execute all shutdown-capable modules Input: none Output: none """ for moduleName, module in loadedModules.iteritems(): if module.shutdownCapable: # prepare and print log message modstr = '### Shutdown module "%s" ###' % module.name framestr = ('#' * len(modstr)) info ('%s\n%s\n%s' % (framestr, modstr, framestr)) try: module.shutdown_funct() # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit('Can not execute shutdown function in module "%s"' % moduleName, 1)
def readMainConf(): """Read main configuration data Input: none Output: none """ global main_config # read path to config file from CLI main_config.readCli() # apply config to enable/disable logging main_config.applyConfig() # read config file info('--- Reading configuration ---') confFilePath = main_config['PATHS']['config_file'] parsedFiles = main_config.readFiles(confFilePath) # check if all neccessary files are read if confFilePath not in parsedFiles: from bsdradius import misc misc.quit("Can not read required configuration files", 1) # read CLI again to overwrite options from file main_config.readCli() # apply config to avoid overwritten values from config file main_config.applyConfig()
def loadModules(): """Load all configured modules. Shutdown server if loading unsuccessful. Input: none Output: none """ global loadedModules global authzModules global acctModules global authcModules if not modulesConfig: return disabledModules = [] # list of modules disabled by user userModDir = main_config['PATHS']['user_module_dir'] # try to import modules for moduleName, tokens in modulesConfig.items(): # check if module is enabled if not modulesConfig.getbool(moduleName, 'enable'): disabledModules.append(moduleName) debug('WARNING: Module "%s" disabled by user. Skipping.' % moduleName) continue debug('Loading module: ', moduleName) mod = BsdRadiusModule(moduleName) try: # read custom config file if tokens['configfile']: mod.radParsedConfig = readModCustomConfig(tokens['configfile']) # load python modules and functions for BSDRadius module if (tokens['startup_module']): mod.startup_module = importModule(tokens['startup_module'], userModDir) mod.startup_funct = loadFunction(mod.startup_module, tokens['startup_function']) mod.startupCapable = True mod.startup_module.radParsedConfig = mod.radParsedConfig if (tokens['authorization_module']): mod.authz_module = importModule(tokens['authorization_module'], userModDir) mod.authz_funct = loadFunction( mod.authz_module, tokens['authorization_function']) mod.authorizationCapable = True mod.authz_module.radParsedConfig = mod.radParsedConfig if (tokens['authentication_module']): mod.authc_module = importModule( tokens['authentication_module'], userModDir) mod.authc_funct = loadFunction( mod.authc_module, tokens['authentication_function']) mod.authenticationCapable = True mod.authc_module.radParsedConfig = mod.radParsedConfig if (tokens['accounting_module']): mod.acct_module = importModule(tokens['accounting_module'], userModDir) mod.acct_funct = loadFunction(mod.acct_module, tokens['accounting_function']) mod.accountingCapable = True mod.acct_module.radParsedConfig = mod.radParsedConfig if (tokens['shutdown_module']): mod.shutdown_module = importModule(tokens['shutdown_module'], userModDir) mod.shutdown_funct = loadFunction(mod.shutdown_module, tokens['shutdown_function']) mod.shutdownCapable = True mod.shutdown_module.radParsedConfig = mod.radParsedConfig # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit('Can not load BSD Radius server modules', 1) else: loadedModules[moduleName] = mod debug(mod) info('Setting order of authorization modules') # set module executing order in authorization and accounting phases authModuleOrder = main_config['AUTHORIZATION']['modules'].split(',') for moduleName in authModuleOrder: moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) # make list of authorization module references if not loadedModules[moduleName].authorizationCapable: misc.quit('Module "%s" not authorization capable' % moduleName, 1) authzModules.append(loadedModules[moduleName]) info('Mapping auth types with modules') authTypes = main_config['AUTH_TYPES'] for authType, moduleName in authTypes.items(): authType = authType.strip() moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].authenticationCapable: misc.quit('Module "%s" not authentication capable' % moduleName, 1) authcModules[authType] = loadedModules[moduleName] info('Setting order of accounting modules') acctModuleOrder = main_config['ACCOUNTING']['modules'].split(',') for moduleName in acctModuleOrder: moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].accountingCapable: misc.quit('Module "%s" not accounting capable' % moduleName, 1) acctModules.append(loadedModules[moduleName])
def main(): """Prepare and execute server """ # make sure that keyboard interrupt stops our server # and clean up before exiting signal.signal(signal.SIGINT, misc.killSignalHandler) signal.signal(signal.SIGTERM, misc.killSignalHandler) # try: # import psyco # psyco.full() # print ('--- Running psyco ---') # except: # print('Using psyco failed') # read main configuration data Config.readMainConf() main_config = Config.main_config debug(main_config) # fork and run as daemon if mayRunInBackground and not main_config['SERVER']['foreground']: info('Daemonizing...') childProcId = os.fork() if childProcId != 0: sys.exit(0) # store pid in file user = main_config['SERVER']['user'] group = main_config['SERVER']['group'] runDirPath = main_config['PATHS']['run_dir'] if not misc.checkDir(runDirPath, user=user, group=group): misc.quit("Checking %s directory failed" % runDirPath, 1) misc.makePidfile() # check and/or create log directory logDirPath = main_config['PATHS']['log_dir'] if not misc.checkDir(logDirPath, user=user, group=group): misc.quit("Checking %s directory failed" % logDirPath, 1) # open log file logFilePath = main_config['PATHS']['server_log_file'] if logFilePath and main_config['SERVER']['log_to_file']: info('--- Opening log file ---') # open file try: logger.logFile = open(logFilePath, 'a+') # misc.setOwner(logFilePath, user, group) except: misc.printExceptionError() quit('Can not open logfile') # parse dictionaries info('--- Parsing dictionary files ---') radiusDict = dictionary.Dictionary(main_config['PATHS']['dictionary_file']) # connect to database if main_config['DATABASE']['enable']: info('--- Connecting to database ---') # set driver name if main_config['DATABASE']['type'] == 'postgresql': DatabaseConnection.dbadapterName = 'psycopg' else: DatabaseConnection.dbadapterName = 'MySQLdb' # connect to host and store connection globally available try: dbh1 = DatabaseConnection.DatabaseConnection.getHandler( 'bsdradius dbh1') dbh1.connect(host=main_config['DATABASE']['host'], user=main_config['DATABASE']['user'], password=main_config['DATABASE']['pass'], dbname=main_config['DATABASE']['name']) except: misc.printExceptionError() misc.quit( "Error connecting to database. Check DATABASE section in config file.", 1) # start server itself authport = main_config["SERVER"]["auth_port"] acctport = main_config["SERVER"]["acct_port"] srv = BsdRadiusServer.BsdRadiusServer(dict = radiusDict, authport = authport, \ acctport = acctport) # add valid server client hosts from file if main_config['PATHS']['clients_file']: info('--- Reading server clients from file ---') clientsConf = Config.Config() clientsConf.readFiles([main_config['PATHS']['clients_file']]) srv.addClientHosts(clientsConf) # add valid server client hosts from DB # overwrite hosts from file if main_config['DATABASE']['enable']: info('--- Reading server clients from DB ---') confDb = ConfigDb(dbh1) confDb.ReadClients() srv.addClientHosts(confDb['CLIENTS']) debug('--- Clients: ---') for addr in srv.hosts: debug('%s: %s' % (addr, srv.hosts[addr].name)) # bind to IP address (default: all) srv.BindToAddress(main_config['SERVER']['home']) # switch to nonprivileged user misc.switchUid(user, group) # Load BSD Radius server modules. # Do it just before starting the server to provide modules with maximum info. info('--- Reading module configuration ---') modules.readConfig([ main_config['PATHS']['modules_file'], main_config['PATHS']['user_modules_file'] ]) debug('Module configuration:') debug(modules.modulesConfig) info('--- Loading modules ---') modules.loadModules() info('--- Executing startup modules ---') modules.execStartupModules() # run server info("--- Starting server ---") srv.Run() # do some maintenace tasks everythingOk = True dbEnable = main_config['DATABASE']['enable'] dbRefreshCounter = 0 dbRefreshRate = main_config['DATABASE']['refresh_rate'] while everythingOk: time.sleep(1) # refresh radius server clients from DB if dbEnable: dbRefreshCounter += 1 if dbRefreshCounter >= dbRefreshRate: #info ('Refreshing config from DB') #debug ('I was waiting for it %s seconds :)' % dbRefreshCounter) dbRefreshCounter = 0 confDb.ReadClients() srv.addClientHosts(confDb['CLIENTS']) # print only changed clients # exit program misc.quit()
def loadModules(): """Load all configured modules. Shutdown server if loading unsuccessful. Input: none Output: none """ global loadedModules global authzModules global acctModules global authcModules if not modulesConfig: return userModDir = main_config['PATHS']['user_module_dir'] # try to import modules for moduleName, tokens in modulesConfig.items(): debug ('Loading module: ', moduleName) mod = BsdRadiusModule(moduleName) try: if (tokens['startup_module']): mod.startup_module = importModule(tokens['startup_module'], userModDir) mod.startup_funct = loadFunction(mod.startup_module, tokens['startup_function']) mod.startupCapable = True if (tokens['authorization_module']): mod.authz_module = importModule(tokens['authorization_module'], userModDir) mod.authz_funct = loadFunction(mod.authz_module, tokens['authorization_function']) mod.authorizationCapable = True if (tokens['authentication_module']): mod.authc_module = importModule(tokens['authentication_module'], userModDir) mod.authc_funct = loadFunction(mod.authc_module, tokens['authentication_function']) mod.authenticationCapable = True if (tokens['accounting_module']): mod.acct_module = importModule(tokens['accounting_module'], userModDir) mod.acct_funct = loadFunction(mod.acct_module, tokens['accounting_function']) mod.accountingCapable = True if (tokens['shutdown_module']): mod.shutdown_module = importModule(tokens['shutdown_module'], userModDir) mod.shutdown_funct = loadFunction(mod.shutdown_module, tokens['shutdown_function']) mod.shutdownCapable = True # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit('Can not load BSD Radius server modules', 1) else: loadedModules[moduleName] = mod debug (mod) info ('Setting order of authorization modules') # set module executing order in authorization and accounting phases authModuleOrder = main_config['AUTHORIZATION']['modules'].split(',') for moduleName in authModuleOrder: moduleName = moduleName.strip() if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) # make list of authorization module references if not loadedModules[moduleName].authorizationCapable: misc.quit('Module "%s" not authorization capable' % moduleName, 1) authzModules.append(loadedModules[moduleName]) info ('Mapping auth types with modules') authTypes = main_config['AUTH_TYPES'] for authType, moduleName in authTypes.items(): authType = authType.strip() moduleName = moduleName.strip() if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].authenticationCapable: misc.quit('Module "%s" not authentication capable' % moduleName, 1) authcModules[authType] = loadedModules[moduleName] info ('Setting order of accounting modules') acctModuleOrder = main_config['ACCOUNTING']['modules'].split(',') for moduleName in acctModuleOrder: moduleName = moduleName.strip() if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].accountingCapable: misc.quit('Module "%s" not accounting capable' % moduleName, 1) acctModules.append(loadedModules[moduleName])
def main(): """Prepare and execute server """ # make sure that keyboard interrupt stops our server # and clean up before exiting signal.signal(signal.SIGINT, misc.killSignalHandler) signal.signal(signal.SIGTERM, misc.killSignalHandler) # try: # import psyco # psyco.full() # print ('--- Running psyco ---') # except: # print('Using psyco failed') # read main configuration data Config.readMainConf() main_config = Config.main_config debug (main_config) # fork and run as daemon if mayRunInBackground and not main_config['SERVER']['foreground']: info ('Daemonizing...') childProcId = os.fork() if childProcId != 0: sys.exit(0) # store pid in file user = main_config['SERVER']['user'] group = main_config['SERVER']['group'] runDirPath = main_config['PATHS']['run_dir'] if not misc.checkDir(runDirPath, user = user, group = group): misc.quit("Checking %s directory failed" % runDirPath, 1) misc.makePidfile() # check and/or create log directory logDirPath = main_config['PATHS']['log_dir'] if not misc.checkDir(logDirPath, user = user, group = group): misc.quit("Checking %s directory failed" % logDirPath, 1) # open log file logFilePath = main_config['PATHS']['server_log_file'] if logFilePath and main_config['SERVER']['log_to_file']: info ('--- Opening log file ---') # open file try: logger.logFile = open(logFilePath, 'a+') # misc.setOwner(logFilePath, user, group) except: misc.printExceptionError() quit('Can not open logfile') # parse dictionaries info ('--- Parsing dictionary files ---') radiusDict = dictionary.Dictionary(main_config['PATHS']['dictionary_file']) # connect to database if main_config['DATABASE']['enable']: info ('--- Connecting to database ---') # set driver name if main_config['DATABASE']['type'] == 'postgresql': DatabaseConnection.dbadapterName = 'psycopg' else: DatabaseConnection.dbadapterName = 'MySQLdb' # connect to host and store connection globally available try: dbh1 = DatabaseConnection.DatabaseConnection.getHandler('bsdradius dbh1') dbh1.connect ( host = main_config['DATABASE']['host'], user = main_config['DATABASE']['user'], password = main_config['DATABASE']['pass'], dbname = main_config['DATABASE']['name'] ) except: misc.printExceptionError() misc.quit("Error connecting to database. Check DATABASE section in config file.", 1) # start server itself authport = main_config["SERVER"]["auth_port"] acctport = main_config["SERVER"]["acct_port"] srv = BsdRadiusServer.BsdRadiusServer(dict = radiusDict, authport = authport, \ acctport = acctport) # add valid server client hosts from file if main_config['PATHS']['clients_file']: info ('--- Reading server clients from file ---') clientsConf = Config.Config() clientsConf.readFiles([main_config['PATHS']['clients_file']]) srv.addClientHosts(clientsConf) # add valid server client hosts from DB # overwrite hosts from file if main_config['DATABASE']['enable']: info ('--- Reading server clients from DB ---') confDb = ConfigDb(dbh1) confDb.ReadClients() srv.addClientHosts(confDb['CLIENTS']) debug ('--- Clients: ---') for addr in srv.hosts: debug ('%s: %s' % (addr, srv.hosts[addr].name)) # bind to IP address (default: all) srv.BindToAddress(main_config['SERVER']['home']) # switch to nonprivileged user misc.switchUid(user, group) # Load BSD Radius server modules. # Do it just before starting the server to provide modules with maximum info. info ('--- Reading module configuration ---') modules.readConfig([main_config['PATHS']['modules_file'], main_config['PATHS']['user_modules_file']]) debug ('Module configuration:') debug (modules.modulesConfig) info ('--- Loading modules ---') modules.loadModules() info ('--- Executing startup modules ---') modules.execStartupModules() # run server info ("--- Starting server ---") srv.Run() # do some maintenace tasks everythingOk = True dbEnable = main_config['DATABASE']['enable'] dbRefreshCounter = 0 dbRefreshRate = main_config['DATABASE']['refresh_rate'] while everythingOk: time.sleep(1) # refresh radius server clients from DB if dbEnable: dbRefreshCounter += 1 if dbRefreshCounter >= dbRefreshRate: #info ('Refreshing config from DB') #debug ('I was waiting for it %s seconds :)' % dbRefreshCounter) dbRefreshCounter = 0 confDb.ReadClients() srv.addClientHosts(confDb['CLIENTS']) # print only changed clients # exit program misc.quit()
def loadModules(): """Load all configured modules. Shutdown server if loading unsuccessful. Input: none Output: none """ global loadedModules global authzModules global acctModules global authcModules if not modulesConfig: return disabledModules = [] # list of modules disabled by user userModDir = main_config['PATHS']['user_module_dir'] # try to import modules for moduleName, tokens in modulesConfig.items(): # check if module is enabled if not modulesConfig.getbool(moduleName, 'enable'): disabledModules.append(moduleName) debug ('WARNING: Module "%s" disabled by user. Skipping.' % moduleName) continue debug ('Loading module: ', moduleName) mod = BsdRadiusModule(moduleName) try: # read custom config file if tokens['configfile']: mod.radParsedConfig = readModCustomConfig(tokens['configfile']) # set up additional path for python modules and packages # it must be done before actually importing modules if tokens['pythonpath']: for pth in tokens['pythonpath'].split(':'): if pth not in sys.path: sys.path.insert(0, pth) debug ('Added additional pythonpath: %s' % pth) # load python modules and functions for BSDRadius module if (tokens['startup_module']): mod.startup_module = importModule(tokens['startup_module'], userModDir) mod.startup_funct = loadFunction(mod.startup_module, tokens['startup_function']) mod.startupCapable = True mod.startup_module.radParsedConfig = mod.radParsedConfig if (tokens['authorization_module']): mod.authz_module = importModule(tokens['authorization_module'], userModDir) mod.authz_funct = loadFunction(mod.authz_module, tokens['authorization_function']) mod.authorizationCapable = True mod.authz_module.radParsedConfig = mod.radParsedConfig if (tokens['authentication_module']): mod.authc_module = importModule(tokens['authentication_module'], userModDir) mod.authc_funct = loadFunction(mod.authc_module, tokens['authentication_function']) mod.authenticationCapable = True mod.authc_module.radParsedConfig = mod.radParsedConfig if (tokens['accounting_module']): mod.acct_module = importModule(tokens['accounting_module'], userModDir) mod.acct_funct = loadFunction(mod.acct_module, tokens['accounting_function']) mod.accountingCapable = True mod.acct_module.radParsedConfig = mod.radParsedConfig if (tokens['shutdown_module']): mod.shutdown_module = importModule(tokens['shutdown_module'], userModDir) mod.shutdown_funct = loadFunction(mod.shutdown_module, tokens['shutdown_function']) mod.shutdownCapable = True mod.shutdown_module.radParsedConfig = mod.radParsedConfig # catch all exceptions, report them to user and shutdown server except: misc.printException() misc.quit('Can not load BSD Radius server modules', 1) else: loadedModules[moduleName] = mod debug (mod) info ('Setting order of authorization modules') # set module executing order in authorization and accounting phases authModuleOrder = main_config['AUTHORIZATION']['modules'].split(',') for moduleName in authModuleOrder: moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) # make list of authorization module references if not loadedModules[moduleName].authorizationCapable: misc.quit('Module "%s" not authorization capable' % moduleName, 1) authzModules.append(loadedModules[moduleName]) info ('Mapping auth types with modules') authTypes = main_config['AUTH_TYPES'] for authType, moduleName in authTypes.items(): authType = authType.strip() moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].authenticationCapable: misc.quit('Module "%s" not authentication capable' % moduleName, 1) authcModules[authType] = loadedModules[moduleName] info ('Setting order of accounting modules') acctModuleOrder = main_config['ACCOUNTING']['modules'].split(',') for moduleName in acctModuleOrder: moduleName = moduleName.strip() if moduleName in disabledModules: continue if moduleName not in loadedModules: misc.quit('Module "%s" not loaded' % moduleName, 1) if not loadedModules[moduleName].accountingCapable: misc.quit('Module "%s" not accounting capable' % moduleName, 1) acctModules.append(loadedModules[moduleName])
def testQuit(self): try: misc.quit() except SystemExit, e: pass