Skip to content
Snippets Groups Projects
monitor.py 3.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # Aura Engine
    #
    # Copyright (C) 2020    David Trattnig <david.trattnig@subsquare.at>
    
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU Affero General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU Affero General Public License for more details.
    
    # You should have received a copy of the GNU Affero General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    
    import urllib
    import logging
    import os.path
    from os import path
    
    from modules.communication.redis.adapter import ClientRedisAdapter
    
    
    class Monitoring:
        """
        Engine Monitoring
        """
        logger = None
        soundsystem = None
        status = None
    
    
        def __init__(self, config, soundsystem):
            """
            Initialize Monitoring
            """
            self.logger = logging.getLogger("AuraEngine")
            self.config = config
            self.soundsystem = soundsystem
            self.status = dict()
            self.status["soundsystem"] = dict()
    
    
    
        def update_status(self):
            """
            Requests the current status of all components
            """
            self.status["soundsystem"]["mixer"] = self.soundsystem.get_mixer_status()
            #self.status["soundsystem"]["recorder"] = self.soundsystem.get_recorder_status()
            self.status["redis_ready"] = self.validate_redis_connection()
            self.status["api_steering_ready"] = self.validate_url_connection(self.config.get("api_steering_status"))
            self.status["api_tank_ready"] = self.validate_url_connection(self.config.get("api_tank_status"))
            self.status["audio_store"] = self.validate_directory(self.config.get("audiofolder"))
    
            # Set overall status
            if self.has_valid_status():
                self.status["engine_status"] = "OK"
            else:
                self.status["engine_status"] = "INVALID"
    
    
    
        def get_status(self):
            """
            Retrieves the current monitoring status.
            """
            self.update_status()
            return self.status
    
    
    
        def has_valid_status(self):
            """
            Checks if the current status is valid to run engine
            """
    
            try:
                if self.status["soundsystem"]["mixer"]["in_filesystem_0"] \
                    and self.status["redis_ready"] \
                    and self.status["audio_store"]["exists"]:
    
                    return True
                return False
            except Exception as e:
                self.logger.error("Exception while validating engine status: " + str(e))
                return False
    
    
    
        def validate_url_connection(self, url):
            """
            Checks if connection to passed URL is successful.
            """
            try:
                request = urllib.request.Request(url)
                response = urllib.request.urlopen(request)
                response.read()
            except Exception:
                return False
    
            return True
    
    
    
        def validate_redis_connection(self):
            """
            Checks if the connection to Redis is successful.
            """
            try:
                cra = ClientRedisAdapter(self.config)
                cra.publish("aura", "status")
            except:
                return False
    
            return True
    
    
    
        def validate_directory(self, dir_path):
            """
            Checks if a given directory is existing and holds content
            """
            status = dict()
            status["exists"] = path.exists(dir_path) and os.path.isdir(dir_path)
            status["has_content"] = False
    
            if status["exists"]:
                status["has_content"] = any([True for _ in os.scandir(dir_path)])
    
            return status