APED_Device/app.py

65 lines
2.2 KiB
Python

#!/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_name>",
"device_url_POST": {"output": "<value>"}
}
@app.route('/XML/', methods=["GET","POST"])
def xml_transfer():
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'))
xml_reader.set_root(str(dir + '/XML/config.xml'))
interface_handler.init_gpio()
else:
SyntaxError('the config.xml has invalid content')
return {'error': ''}
except Exception as e:
return {'error' : str(e)}
@app.route('/device/<device_name>/', methods=["GET", "POST"])
def api_devices(device_name):
try:
if request.method == "POST":
response = interface_handler.write(device_name,request.data.get("output"))
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")