#!/usr/bin/python3 from flask import request, send_from_directory from flask_api import FlaskAPI import RPi.GPIO as GPIO import shutil import os from xml_reader import Xml_reader from interface_handler import Interface_handler dir = os.path.dirname(os.path.abspath(__file__)) xml_reader = Xml_reader(str(dir + '/XML/config.xml'),str(dir + '/XML/config.xsd')) interface_handler = Interface_handler(xml_reader) device_names = xml_reader.get_device_names() app = FlaskAPI(__name__) @app.route('/', methods=["GET"]) def api_root(): return { "device_url": request.url + "device/", "device_url_POST": {"output": ""} } @app.route('/XML/', methods=["GET","POST"]) def xml_transfer(self): try: #return the current config.xml if request.method == "GET": return send_from_directory(str(dir + 'XML'), 'config.xml') # set a new config.xml if request.method == "POST": if not os.path.exists('/tmp/aped_device'): os.mkdir("/tmp/aped_device") tmp_file = open("/tmp/aped_device/config.xml","w") data = request.get_data(as_text=True) tmp_file.write(data) tmp_file.close() #check config.xml against the XSD file if xml_reader.validate('/tmp/aped_device/config.xml',str(dir + 'XML/config.xsd')): shutil.move(str(dir + 'XML/config.xml'),str(dir + 'XML/config_old.xml')) shutil.move('/tmp/aped_device/config.xml',str(dir + 'XML/config.xml')) self.interface_handler = Interface_handler(self.xml_reader) else: SyntaxError('the config.xml has invalid content') return {'error': ''} except Exception as e: return {'error' : str(e)} @app.route('/device//', methods=["GET", "POST"]) def api_leds_control(device_name): try: if request.method == "POST": response = interface_handler.write(device_name,request.data.get("output")) return {'output': str(response)} return {'state': interface_handler.read(device_name)} except Exception as e: return {'error': str(e)} if __name__ == "__main__": app.run(port=8080,host="0.0.0.0")