Commit c82abbcc authored by Devaev Maxim's avatar Devaev Maxim

Refactoring

parent 877013cb
...@@ -7,7 +7,7 @@ import getopt ...@@ -7,7 +7,7 @@ import getopt
from settingsd import const from settingsd import const
from settingsd import validators from settingsd import validators
from settingsd import startup from settingsd import application
from settingsd import daemon from settingsd import daemon
...@@ -86,6 +86,6 @@ if __name__ == "__main__" : ...@@ -86,6 +86,6 @@ if __name__ == "__main__" :
##### #####
startup_proc = startup.Startup(log_level, use_syslog_flag, bus_type, daemon_mode_flag) app = application.Application(log_level, use_syslog_flag, bus_type, daemon_mode_flag)
startup_proc.run() app.run()
...@@ -3,120 +3,115 @@ ...@@ -3,120 +3,115 @@
import sys import sys
import os import os
import dbus import signal
import dbus.service import syslog
import dbus.glib
import gobject
import const import const
import config import config
import validators
import logger import logger
import server
import daemon
##### Public classes ##### ##### Public classes #####
class Application(object) : class Application(object) :
def __init__(self) : def __init__(self, log_level, use_syslog_flag, bus_type, daemon_mode_flag) :
object.__init__(self) object.__init__(self)
##### #####
self._modules_list = [] self._log_level = log_level
self._services_dict = {} self._use_syslog_flag = use_syslog_flag
self._bus_type = bus_type
self._daemon_mode_flag = daemon_mode_flag
self._main_loop = gobject.MainLoop() #####
self._server = server.Server()
### Public ### ### Public ###
def runLoop(self) : def run(self) :
logger.verbose("Running GObject loop...") self.prepare()
self._main_loop.run() if self._daemon_mode_flag :
self.runDaemon()
else :
self.runInteractive()
def quitLoop(self) : def server(self) :
self._main_loop.quit() return self._server
logger.verbose("GObject loop closed")
### ###
def loadModules(self) : def quit(self, signum = None, frame = None) :
sys.path.append(const.FUNCTIONS_DIR) if signum != None :
sys.path.append(const.ACTIONS_DIR) logger.info("Recieved signal %d, closing..." % (signum))
for modules_path_list_item in (const.FUNCTIONS_DIR, const.ACTIONS_DIR) : self._server.closeServices()
for module_name in [ item[:-3] for item in os.listdir(modules_path_list_item) if item.endswith(".py") ] : self._server.quitLoop()
try : logger.info("Closed")
self._modules_list.append(__import__(module_name, globals(), locals(), [""]))
except :
logger.error("Import error on module \"%s\"" % (module_name))
logger.attachException()
continue
self._services_dict[self._modules_list[-1].Service.serviceName()] = {
"service_class" : self._modules_list[-1].Service,
"service" : None
}
logger.verbose("Loaded module: %s" % (module_name)) ### Private ###
sys.path.remove(const.FUNCTIONS_DIR) def prepare(self) :
sys.path.remove(const.ACTIONS_DIR) if self._use_syslog_flag == None :
if self._daemon_mode_flag :
syslog.openlog(const.MY_NAME, syslog.LOG_PID, syslog.LOG_DAEMON)
config.setValue(config.RUNTIME_SECTION, "use_syslog", True)
else :
syslog.openlog(const.MY_NAME, syslog.LOG_PID, ( syslog.LOG_DAEMON if self._daemon_mode_flag else syslog.LOG_USER ))
config.setValue(config.RUNTIME_SECTION, "use_syslog", True)
### try :
self._server.loadServerConfigs()
def loadApplicationConfigs(self) : except :
config.loadConfigs(only_sections_list = (config.APPLICATION_SECTION,)) logger.error("Initialization error")
logger.attachException()
raise
def loadServicesConfigs(self) : if self._bus_type != None :
for service_name in self._services_dict.keys() : config.setValue(config.APPLICATION_SECTION, "bus_type", self._bus_type)
service_options_list = list(self._services_dict[service_name]["service_class"].optionsList())
service_options_list.append((service_name, "enabled", "no", validators.validBool))
for service_options_list_item in service_options_list : if self._log_level != None :
try : config.setValue(config.APPLICATION_SECTION, "log_level", self._log_level)
config.setValue(*service_options_list_item)
except :
logger.error("Error on set options tuple %s" % (str(service_options_list_item)))
logger.attachException()
config.loadConfigs(exclude_sections_list = (config.APPLICATION_SECTION,)) config.setValue(config.RUNTIME_SECTION, "application", self)
### ###
def initBus(self) : def runInteractive(self) :
bus_type = config.value(config.APPLICATION_SECTION, "bus_type")
service_name = config.value(config.APPLICATION_SECTION, "service_name")
try : try :
config.setValue(config.RUNTIME_SECTION, "bus_name", dbus.service.BusName(service_name, self._server.loadModules()
( dbus.SystemBus() if bus_type == const.BUS_TYPE_SYSTEM else dbus.SessionBus() ))) self._server.loadServicesConfigs()
self._server.initBus()
self._server.initServices()
logger.info("Initialized")
except : except :
logger.error("Could not connect to D-Bus \"%s\"" % (bus_type)) logger.error("Initialization error")
logger.attachException() logger.attachException()
raise raise
logger.verbose("Connected to D-Bus \"%s\" as \"%s\"" % (bus_type, service_name)) try :
signal.signal(signal.SIGTERM, self.quit)
signal.signal(signal.SIGQUIT, self.quit)
except :
logger.error("signal() error")
logger.attachException()
### try :
self._server.runLoop()
except (SystemExit, KeyboardInterrupt) :
self.quit()
except :
logger.error("Runtime error, trying to close services")
logger.attachException()
self.quit()
raise
def initServices(self) : def runDaemon(self) :
for service_name in self._services_dict.keys() : work_dir_path = ( "/" if os.getuid() == 0 else None )
if config.value(service_name, "enabled") : umask = ( 077 if os.getuid() == 0 else None )
try : daemon.startDaemon(self.runInteractive, work_dir_path, umask)
self._services_dict[service_name]["service"] = self._services_dict[service_name]["service_class"]()
self._services_dict[service_name]["service"].initService()
except :
logger.error("Cannot initialize service \"%s\"" % (service_name))
logger.attachException()
def closeServices(self) :
for service_name in self._services_dict.keys() :
if self._services_dict[service_name]["service"] != None :
try :
self._services_dict[service_name]["service"].closeService()
del self._services_dict[service_name]["service"]
except :
logger.error("Cannot close service \"%s\"" % (service_name))
logger.attachException()
self._services_dict[service_name]["service"] = None
...@@ -29,7 +29,6 @@ ConfigDictObject = { ...@@ -29,7 +29,6 @@ ConfigDictObject = {
}, },
RUNTIME_SECTION : { RUNTIME_SECTION : {
"application" : (None, None), "application" : (None, None),
"startup" : (None, None),
"bus_name" : (None, None), "bus_name" : (None, None),
"use_syslog" : (False, None) "use_syslog" : (False, None)
} }
......
...@@ -40,12 +40,12 @@ def log(message_type, message) : ...@@ -40,12 +40,12 @@ def log(message_type, message) :
if message_type[2] <= config.value(config.APPLICATION_SECTION, "log_level") : if message_type[2] <= config.value(config.APPLICATION_SECTION, "log_level") :
use_colors_flag = sys.stderr.isatty() and config.value(config.APPLICATION_SECTION, "log_use_colors") use_colors_flag = sys.stderr.isatty() and config.value(config.APPLICATION_SECTION, "log_use_colors")
message_type_texts_list = ( message_type_texts_list = (
( "\033[31mError \033[0m" if use_colors_flag else "Error " ), ( "\033[31m Error \033[0m" if use_colors_flag else " Error " ),
( "\033[33mWarning\033[0m" if use_colors_flag else "Warning" ), ( "\033[33mWarning\033[0m" if use_colors_flag else "Warning" ),
( "\033[32mNotice \033[0m" if use_colors_flag else "Notice " ), ( "\033[32mNotice \033[0m" if use_colors_flag else "Notice " ),
( "\033[32mInfo \033[0m" if use_colors_flag else "Info " ), ( "\033[32m Info \033[0m" if use_colors_flag else " Info " ),
( "\033[36mDetails\033[0m" if use_colors_flag else "Details" ), ( "\033[36mDetails\033[0m" if use_colors_flag else "Details" ),
"Debug" " Debug "
) )
for message_list_item in message.split("\n") : for message_list_item in message.split("\n") :
......
# -*- coding: utf-8 -*-
import sys
import os
import dbus
import dbus.service
import dbus.glib
import gobject
import const
import config
import validators
import logger
##### Public classes #####
class Server(object) :
def __init__(self) :
object.__init__(self)
#####
self._modules_list = []
self._services_dict = {}
self._main_loop = gobject.MainLoop()
### Public ###
def runLoop(self) :
logger.verbose("Running GObject loop...")
self._main_loop.run()
def quitLoop(self) :
self._main_loop.quit()
logger.verbose("GObject loop closed")
###
def loadModules(self) :
sys.path.append(const.FUNCTIONS_DIR)
sys.path.append(const.ACTIONS_DIR)
for modules_path_list_item in (const.FUNCTIONS_DIR, const.ACTIONS_DIR) :
for module_name in [ item[:-3] for item in os.listdir(modules_path_list_item) if item.endswith(".py") ] :
try :
self._modules_list.append(__import__(module_name, globals(), locals(), [""]))
except :
logger.error("Import error on module \"%s\"" % (module_name))
logger.attachException()
continue
self._services_dict[self._modules_list[-1].Service.serviceName()] = {
"service_class" : self._modules_list[-1].Service,
"service" : None
}
logger.verbose("Loaded module: %s" % (module_name))
sys.path.remove(const.FUNCTIONS_DIR)
sys.path.remove(const.ACTIONS_DIR)
###
def loadServerConfigs(self) :
config.loadConfigs(only_sections_list = (config.APPLICATION_SECTION,))
def loadServicesConfigs(self) :
for service_name in self._services_dict.keys() :
service_options_list = list(self._services_dict[service_name]["service_class"].optionsList())
service_options_list.append((service_name, "enabled", "no", validators.validBool))
for service_options_list_item in service_options_list :
try :
config.setValue(*service_options_list_item)
except :
logger.error("Error on set options tuple %s" % (str(service_options_list_item)))
logger.attachException()
config.loadConfigs(exclude_sections_list = (config.APPLICATION_SECTION,))
###
def initBus(self) :
bus_type = config.value(config.APPLICATION_SECTION, "bus_type")
service_name = config.value(config.APPLICATION_SECTION, "service_name")
try :
config.setValue(config.RUNTIME_SECTION, "bus_name", dbus.service.BusName(service_name,
( dbus.SystemBus() if bus_type == const.BUS_TYPE_SYSTEM else dbus.SessionBus() )))
except :
logger.error("Could not connect to D-Bus \"%s\"" % (bus_type))
logger.attachException()
raise
logger.verbose("Connected to D-Bus \"%s\" as \"%s\"" % (bus_type, service_name))
###
def initServices(self) :
for service_name in self._services_dict.keys() :
if config.value(service_name, "enabled") :
try :
self._services_dict[service_name]["service"] = self._services_dict[service_name]["service_class"]()
self._services_dict[service_name]["service"].initService()
except :
logger.error("Cannot initialize service \"%s\"" % (service_name))
logger.attachException()
def closeServices(self) :
for service_name in self._services_dict.keys() :
if self._services_dict[service_name]["service"] != None :
try :
self._services_dict[service_name]["service"].closeService()
del self._services_dict[service_name]["service"]
except :
logger.error("Cannot close service \"%s\"" % (service_name))
logger.attachException()
self._services_dict[service_name]["service"] = None
# -*- coding: utf-8 -*-
import sys
import os
import signal
import syslog
import const
import config
import logger
import application
import daemon
##### Public classes #####
class Startup(object) :
def __init__(self, log_level, use_syslog_flag, bus_type, daemon_mode_flag) :
object.__init__(self)
#####
self._log_level = log_level
self._use_syslog_flag = use_syslog_flag
self._bus_type = bus_type
self._daemon_mode_flag = daemon_mode_flag
#####
self._app = application.Application()
### Public ###
def run(self) :
self.prepare()
if self._daemon_mode_flag :
self.runDaemon()
else :
self.runInteractive()
### Private ###
def prepare(self) :
if self._use_syslog_flag == None :
if self._daemon_mode_flag :
syslog.openlog(const.MY_NAME, syslog.LOG_PID, syslog.LOG_DAEMON)
config.setValue(config.RUNTIME_SECTION, "use_syslog", True)
else :
syslog.openlog(const.MY_NAME, syslog.LOG_PID, ( syslog.LOG_DAEMON if self._daemon_mode_flag else syslog.LOG_USER ))
config.setValue(config.RUNTIME_SECTION, "use_syslog", True)
try :
self._app.loadApplicationConfigs()
except :
logger.error("Initialization error")
logger.attachException()
raise
if self._bus_type != None :
config.setValue(config.APPLICATION_SECTION, "bus_type", self._bus_type)
if self._log_level != None :
config.setValue(config.APPLICATION_SECTION, "log_level", self._log_level)
config.setValue(config.RUNTIME_SECTION, "application", self._app)
config.setValue(config.RUNTIME_SECTION, "startup", self)
###
def runInteractive(self) :
try :
self._app.loadModules()
self._app.loadServicesConfigs()
self._app.initBus()
self._app.initServices()
logger.info("Initialized")
except :
logger.error("Initialization error")
logger.attachException()
raise
try :
signal.signal(signal.SIGTERM, self.quit)
signal.signal(signal.SIGQUIT, self.quit)
except :
logger.error("signal() error")
logger.attachException()
try :
self._app.runLoop()
except (SystemExit, KeyboardInterrupt) :
self.quit()
except :
logger.error("Runtime error, trying to close services")
logger.attachException()
self.quit()
raise
def runDaemon(self) :
work_dir_path = ( "/" if os.getuid() == 0 else None )
umask = ( 077 if os.getuid() == 0 else None )
daemon.startDaemon(self.runInteractive, work_dir_path, umask)
###
def quit(self, signum = None, frame = None) :
if signum != None :
logger.info("Recieved signal %d, closing..." % (signum))
self._app.closeServices()
self._app.quitLoop()
logger.info("Closed")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment