Эх сурвалжийг харах

create rest api. get all synapse ok

nico 8 жил өмнө
parent
commit
061413fbcf

+ 19 - 1
core/ConfigurationManager/SettingLoader.py

@@ -1,6 +1,7 @@
 from YAMLLoader import YAMLLoader
 import logging
 
+from core.Models.RestAPI import RestAPI
 from core.Models.Settings import Settings
 from core.Models.Stt import Stt
 from core.Models.Trigger import Trigger
@@ -46,6 +47,7 @@ class SettingLoader(object):
         triggers = cls._get_triggers(settings)
         random_wake_up_answers = cls._get_random_wake_up_answers(settings)
         random_wake_up_sounds = cls._get_random_wake_up_sounds(settings)
+        rest_api = cls._get_rest_api(settings)
 
         # create a setting object
         setting_object = Settings(default_stt_name=default_stt_name,
@@ -55,7 +57,8 @@ class SettingLoader(object):
                                   ttss=ttss,
                                   triggers=triggers,
                                   random_wake_up_answers=random_wake_up_answers,
-                                  random_wake_up_sounds=random_wake_up_sounds)
+                                  random_wake_up_sounds=random_wake_up_sounds,
+                                  rest_api=rest_api)
         return setting_object
 
     @staticmethod
@@ -210,3 +213,18 @@ class SettingLoader(object):
             raise NullSettingException("random_wake_up_sounds settings is empty")
 
         return random_wake_up_sounds_list
+
+    @classmethod
+    def _get_rest_api(cls, settings):
+        try:
+            rest_api = settings["rest_api"]
+        except KeyError:
+            return None
+
+        if rest_api is not None:
+            password_protected = rest_api["password_protected"]
+            login = rest_api["login"]
+            password = rest_api["password"]
+            rest_api_obj = RestAPI(password_protected=password_protected, login=login, password=password)
+
+            return rest_api_obj

+ 11 - 0
core/Models/RestAPI.py

@@ -0,0 +1,11 @@
+class RestAPI(object):
+    def __init__(self, password_protected=None, login=None, password=None):
+        self.password_protected = password_protected
+        self.login = login
+        self.password = password
+
+    def __str__(self):
+        return "%s: RestAPI: password_protected: %s, login: %s, password: %s" % (self.__class__.__name__,
+                                                                                 self.password_protected,
+                                                                                 self.login,
+                                                                                 self.password)

+ 2 - 1
core/Models/Settings.py

@@ -3,7 +3,7 @@
 class Settings(object):
     def __init__(self, default_tts_name=None, default_stt_name=None,
                  default_trigger_name=None, ttss=None, stts=None,
-                 random_wake_up_answers=None, random_wake_up_sounds=None, triggers=None):
+                 random_wake_up_answers=None, random_wake_up_sounds=None, triggers=None, rest_api=None):
         self.default_tts_name = default_tts_name
         self.default_stt_name = default_stt_name
         self.default_trigger_name = default_trigger_name
@@ -12,3 +12,4 @@ class Settings(object):
         self.random_wake_up_answers = random_wake_up_answers
         self.random_wake_up_sounds = random_wake_up_sounds
         self.triggers = triggers
+        self.rest_api = rest_api

+ 26 - 0
core/RestAPI/FlaskAPI.py

@@ -0,0 +1,26 @@
+import threading
+
+from flask import jsonify
+
+from core.ConfigurationManager.BrainLoader import BrainLoader
+from core.RestAPI.utils import requires_auth
+
+
+class FlaskAPI(threading.Thread):
+    def __init__(self, app, brain):
+        super(FlaskAPI, self).__init__()
+        self.app = app
+        self.brain = brain
+
+        self.app.add_url_rule('/synapses', view_func=self.get_synapses, methods=['GET'])
+
+    def run(self):
+        self.app.run(host='0.0.0.0', debug=True, threaded=True, use_reloader=False)
+
+    @requires_auth
+    def get_synapses(self):
+        """
+        get all synapse
+        """
+        data = jsonify(synapses=BrainLoader.get_yaml_config())
+        return data, 200

+ 0 - 0
core/RestAPI/__init__.py


+ 33 - 0
core/RestAPI/utils.py

@@ -0,0 +1,33 @@
+from functools import wraps
+from flask import request, Response
+
+from core.ConfigurationManager import SettingLoader
+
+
+def check_auth(username, password):
+    """This function is called to check if a username /
+    password combination is valid.
+    """
+    settings = SettingLoader.get_settings()
+    # we only check the password if the user select password protected
+    if settings.rest_api.password_protected:
+        return username == settings.rest_api.login and password == settings.rest_api.password
+    return True
+
+
+def authenticate():
+    """Sends a 401 response that enables basic auth"""
+    return Response(
+        'Could not verify your access level for that URL.\n'
+        'You have to login with proper credentials', 401,
+        {'WWW-Authenticate': 'Basic realm="Login Required"'})
+
+
+def requires_auth(f):
+    @wraps(f)
+    def decorated(*args, **kwargs):
+        auth = request.authorization
+        if not auth or not check_auth(auth.username, auth.password):
+            return authenticate()
+        return f(*args, **kwargs)
+    return decorated

+ 9 - 0
settings.yml

@@ -95,3 +95,12 @@ random_wake_up_sounds:
   - "ding.wav"
   - "dong.wav"
   # - "/my/personal/full/path/my_file.mp3"
+
+
+# ---------------------------
+# Rest API
+# ---------------------------
+rest_api:
+  password_protected: True
+  login: admin
+  password: secret

+ 17 - 3
test.py

@@ -3,8 +3,13 @@ import logging
 import re
 from collections import Counter
 
+from flask import Flask
+
 from core import OrderAnalyser
+from core.ConfigurationManager import SettingLoader
 from core.ConfigurationManager import YAMLLoader
+from core.ConfigurationManager.BrainLoader import BrainLoader
+from core.RestAPI.FlaskAPI import FlaskAPI
 from neurons import Systemdate
 from neurons.tasker_autoremote.tasker_autoremote import Tasker_autoremote
 
@@ -12,9 +17,18 @@ logging.basicConfig()
 logger = logging.getLogger("kalliope")
 logger.setLevel(logging.DEBUG)
 
-order = "bonjour"
-oa = OrderAnalyser(order=order)
-oa.start()
+# order = "quelle heure est-il"
+# oa = OrderAnalyser(order=order)
+# oa.start()
+
+
+brain = BrainLoader.get_brain()
+
+app = Flask(__name__)
+flask_api = FlaskAPI(app, brain)
+flask_api.start()
+
+