コード例 #1
0
    def setup_class(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        self.settings = Settings(settingsFilename, appInfo.path)

        section = ActionSendMessagePowerAlarm.PLUGIN_TYPE + Plugin.NAME_SEPARATOR + "send_poweralarm"
        self.settings.setString(section, "api_key", "NO_API_KEY")

        self.settings.setString(section, "api_group_nodetails", "NODETAILS")
        self.settings.setString(section, "api_group_reduced", "REDUCED")
        self.settings.setString(section, "api_group_full", "FULL")
        self.settings.setString(section, "api_group_tablet", "TABLET")
        self.settings.setString(section, "api_group_binary", "BINARY")
        self.settings.setString(section, "api_group_admin", "ADMIN")

        self.settings.setBoolean(section, "send_invalid", True)

        self.settings.setBoolean(section, "admin_send_setting", True)
        self.settings.setBoolean(section, "admin_send_unhandled", True)
        self.settings.setBoolean(section, "admin_send_invalid", False)

        self.settings.setString(section, "alarm_message", "TEST_ALARM")

        self.action = ActionSendMessagePowerAlarm("", self.settings, test=True)
コード例 #2
0
    def setup_class(self) -> None:
        #pylint: disable=W0201
        self.appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(self.appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(self.appInfo.path, ".temp/situationboard.conf")
        databaseFilename = os.path.join(self.appInfo.path, ".temp/situationboard.sqlite")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        self.database = Database(databaseFilename, reset = True)

        settings = Settings(settingsFilename, self.appInfo.path)
        settings.setFrontendHeader("header")
        settings.setFrontendNews("news")
        settings.setBoolean(Settings.SECTION_BACKEND, "web_api", True)

        displayPowerManager = DisplayPowerManager(settings)

        self.webSocket = WebSocket(self.appInfo, settings, self.database)

        pluginManager = PluginManager(settings, self.database, self.webSocket, displayPowerManager)

        self.webSocket.init(pluginManager)

        self.appClient = self.webSocket.app_test_client()
        self.socketClient = self.webSocket.socket_test_client(self.appClient)
コード例 #3
0
    def test_settings(self) -> None:
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path, ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        s = Settings(settingsFilename, appInfo.path)

        frontendHeaderTest = "Frontend\n\"Complicated\"\tHeader\\=Test=1234"
        assert(s.getFrontendHeader() != frontendHeaderTest)
        s.setFrontendHeader(frontendHeaderTest)
        assert(s.getFrontendHeader() == frontendHeaderTest)

        frontendNewsTest = "Frontend\n\"Complicated\"\tNews\\=Test=1234"
        assert(s.getFrontendNews() != frontendNewsTest)
        s.setFrontendNews(frontendNewsTest)
        assert(s.getFrontendNews() == frontendNewsTest)

        test_string = "test_string"
        test_boolean = True
        test_int = 112
        test_float = 1.12

        s.setString("test", "test_string", test_string)
        s.setBoolean("test", "test_boolean", test_boolean)
        s.setInt("test", "test_int", test_int)
        s.setFloat("test", "test_float", test_float)

        s.store()

        sr = Settings(settingsFilename, appInfo.path)

        assert(sr.getFrontendHeader() == frontendHeaderTest)
        assert(sr.getFrontendNews() == frontendNewsTest)

        assert(sr.getString("test", "test_string", "") == test_string)
        assert(sr.getBoolean("test", "test_boolean", not test_boolean) == test_boolean)
        assert(sr.getInt("test", "test_int", 0) == test_int)
        assert(sr.getFloat("test", "test_float", 0.0) == test_float)

        defaultSources = ["dummy"]
        defaultActions = ["search_location", "update_database", "update_settings", "update_frontend" , "update_calendar"]
        defaultLanguage = "de"
        assert(sr.getBackendSources() == defaultSources)    # test getList and correct default sources
        assert(sr.getBackendActions() == defaultActions)    # test getList and correct default actions
        assert(sr.getFrontendLanguage() == defaultLanguage) # test getOption and correct default language
コード例 #4
0
    def setup_class(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        s = Settings(settingsFilename, appInfo.path)

        self.p = MessageParserSMS("", s)

        self.defaultSender = "112"
        self.alarmSender = "+49112"  # alarm sender set in config
        self.settingSender = "123"
        self.defaultTimestamp = datetime.datetime.now().strftime(
            AlarmEvent.TIMESTAMP_FORMAT)
        self.eid = 1302
コード例 #5
0
    def test_handle_event(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        settings = Settings(settingsFilename, appInfo.path)

        action = ActionUpdateSettings("", settings)

        # init and check initial settings
        settings.setFrontendHeader(Test_ActionUpdateSettings.INITIAL_HEADER)
        settings.setFrontendNews(Test_ActionUpdateSettings.INITIAL_NEWS)
        assert (settings.getFrontendHeader() ==
                Test_ActionUpdateSettings.INITIAL_HEADER)
        assert (settings.getFrontendNews() ==
                Test_ActionUpdateSettings.INITIAL_NEWS)

        # check that updating header setting succeeds
        settingEvent = SettingEvent()
        settingEvent.key = "header"
        settingEvent.value = Test_ActionUpdateSettings.UPDATED_HEADER
        settingEvent.flags = SettingEvent.FLAGS_VALID
        action.handleEvent(settingEvent)
        assert (settings.getFrontendHeader() ==
                Test_ActionUpdateSettings.UPDATED_HEADER)

        # check that updating news setting succeeds
        settingEvent = SettingEvent()
        settingEvent.key = "news"
        settingEvent.value = Test_ActionUpdateSettings.UPDATED_NEWS
        settingEvent.flags = SettingEvent.FLAGS_VALID
        action.handleEvent(settingEvent)
        assert (settings.getFrontendNews() ==
                Test_ActionUpdateSettings.UPDATED_NEWS)
コード例 #6
0
    def test_handle_event(self) -> None:
        #pylint: disable=W0201
        appInfo = AppInfo()
        settingsFilenameOrig = os.path.join(
            appInfo.path, "misc/setup/situationboard_default.conf")
        settingsFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.conf")
        databaseFilename = os.path.join(appInfo.path,
                                        ".temp/situationboard.sqlite")

        shutil.copy(settingsFilenameOrig, settingsFilename)

        settings = Settings(settingsFilename, appInfo.path)

        maxLastEvents = 10

        displayPowerManager = DisplayPowerManager(settings)

        db = Database(databaseFilename, reset=True)

        webSocket = WebSocket(appInfo, settings, db)

        pluginManager = PluginManager(settings, db, webSocket,
                                      displayPowerManager)

        webSocket.init(pluginManager)

        # check that creating a database works and yields an empty database
        assert (db.getEventCount(textOnly=False) == 0)
        assert (db.getEventCount(textOnly=True) == 0)
        assert (db.getEvent(1302) is None)
        assert (len(db.getEvents(textOnly=False)) == 0)
        assert (len(db.getEvents(textOnly=True)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 0)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 0)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 0)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 0)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 0)

        action = ActionUpdateDatabase("", settings, db, webSocket)

        # check that inserting an alarm event succeeds
        newEvent = self.__createEvent()
        action.handleEvent(newEvent)
        assert (not newEvent.noID)
        assert (db.getEventCount(textOnly=False) == 1)
        assert (db.getEventCount(textOnly=True) == 1)
        assert (len(db.getEvents(textOnly=False)) == 1)
        assert (len(db.getEvents(textOnly=True)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 1)
        newEventID = newEvent.eventID
        assert (db.getEvent(newEventID) is not None)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 1)

        # check that updating an alarm event succeeds
        self.__updateEvent(newEvent)
        action.handleEvent(newEvent)
        assert (newEvent.eventID == newEventID)
        assert (db.getEventCount(textOnly=False) == 1)
        assert (db.getEventCount(textOnly=True) == 1)
        assert (len(db.getEvents(textOnly=False)) == 1)
        assert (len(db.getEvents(textOnly=True)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=False)) == 1)
        assert (len(db.getLastEvents(maxLastEvents, textOnly=True)) == 1)
        retrievedEvent = db.getEvent(newEventID)
        assert (retrievedEvent is not None)
        assert (retrievedEvent.comment ==
                Test_ActionUpdateDatabase.UPDATED_COMMENT)

        # check for valid stats
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=False) == 1)
        assert (db.getEventStats(DatabaseTimespan.TOTAL, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.YEAR, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.MONTH, textOnly=True) == 1)
        assert (db.getEventStats(DatabaseTimespan.TODAY, textOnly=True) == 1)

        db.commitAndClose()
コード例 #7
0
    def run(self, argv: List[str]) -> None:
        """This is the main entry point of the backend application."""

        defaultConfigPath = os.path.join(
            self.appInfo.path, SituationBoard.DEFAULT_CONFIG_FILENAME)
        defaultConfigPath = os.getenv("SB_CONFIG", defaultConfigPath)

        defaultDatabasePath = os.path.join(
            self.appInfo.path, SituationBoard.DEFAULT_DATABASE_FILENAME)
        defaultDatabasePath = os.getenv("SB_DATABASE", defaultDatabasePath)

        parser = argparse.ArgumentParser(
            description=f"{self.appInfo.name} v{self.appInfo.version}",
            add_help=False)
        igroup = parser.add_argument_group("Important Commands and Parameters")
        mmutex = igroup.add_mutually_exclusive_group()
        mmutex.add_argument("-s",
                            "--server",
                            help="start backend server (default)",
                            default=True,
                            action='store_true')
        mmutex.add_argument("-i",
                            "--import",
                            help="import data from CSV",
                            default=None,
                            dest='importFile')
        mmutex.add_argument("-e",
                            "--export",
                            help="export data to CSV",
                            default=None,
                            dest='exportFile')
        mmutex.add_argument("-n",
                            "--version",
                            help="show version number and exit",
                            default=False,
                            action='store_true')
        mmutex.add_argument("-h",
                            "--help",
                            help="show this help message and exit",
                            action='help')
        ogroup = parser.add_argument_group("Other Parameters and Options")
        ogroup.add_argument("-c",
                            "--config",
                            help="alternate path to config file",
                            default=defaultConfigPath,
                            dest='configPath')
        ogroup.add_argument("-d",
                            "--database",
                            help="alternate path to database file",
                            default=defaultDatabasePath,
                            dest='databasePath')
        ogroup.add_argument("-r",
                            "--reset",
                            help="reset database before import",
                            default=False,
                            action='store_true')
        ogroup.add_argument("-v",
                            "--verbose",
                            help="force debug output",
                            default=False,
                            action='store_true')

        # args = parser.parse_args(argv)
        args = parser.parse_args()

        # Check command line parameters
        if (args.reset is True) and (args.importFile is None):
            parser.error("reset is only allowed for the import command")
            sys.exit(1)

        # Show version number and exit (if requested)
        if args.version:
            print(f"{self.appInfo.name} {self.appInfo.version}")
            sys.exit(0)

        # Print application header
        if args.importFile is not None:
            self.print("Starting import from CSV...")
        elif args.exportFile is not None:
            self.print("Starting export to CSV...")
        else:
            self.clrPrint(
                f"Starting {self.appInfo.name} backend v{self.appInfo.version} (PID {self.appInfo.pid})"
            )

        # Load configuration and database
        settings = Settings(args.configPath, self.appInfo.path, args.verbose)
        database = Database(args.databasePath, args.reset)
        self.lateInit(settings)

        # Handle CSV import/export (if required)
        if args.importFile is not None:
            csvImporter = CSVImporter(database)
            result = csvImporter.importEvents(args.importFile)
            sys.exit(result)
        elif args.exportFile is not None:
            csvExporter = CSVExporter(database)
            result = csvExporter.exportEvents(args.exportFile)
            sys.exit(result)

        # Start SituationBoard backend service
        backendService = SituationBoardBackend(self.appInfo, settings,
                                               database)
        backendService.run()
コード例 #8
0
def get_settings():
    appInfo = AppInfo()
    settingsFilenameOrig = os.path.join(appInfo.path, "misc/setup/situationboard_default.conf")
    settingsFilename = os.path.join(appInfo.path, ".temp/situationboard.conf")
    shutil.copy(settingsFilenameOrig, settingsFilename)
    return Settings(settingsFilename, appInfo.path)