diff options
author | Kristian Lyngstol <kly@kly.no> | 2016-11-15 05:51:14 +0100 |
---|---|---|
committer | Kristian Lyngstol <kly@kly.no> | 2016-11-15 05:51:14 +0100 |
commit | 5543e7dc3072df61910350b46879908f985f94b4 (patch) | |
tree | a899d902e1a07014403a4a4c568cdfeee4206057 /templating/templating.py | |
parent | f34cb5a300e349af5b212ea1b394f85df917e61a (diff) |
Templating: Merge GET and POST and smarten error-handling
Fixes #153
Diffstat (limited to 'templating/templating.py')
-rwxr-xr-x | templating/templating.py | 80 |
1 files changed, 43 insertions, 37 deletions
diff --git a/templating/templating.py b/templating/templating.py index 7a93c9b..5156383 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 import requests,traceback -from jinja2 import Template,Environment,FileSystemLoader +from jinja2 import Template,Environment,FileSystemLoader,TemplateNotFound import json import http.server +from enum import Enum endpoints = "read/oplog read/snmp read/switches-management public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split() objects = dict() @@ -18,61 +19,66 @@ def updateData(): for a in endpoints: objects[a] = getEndpoint(a) -env = Environment(loader=FileSystemLoader(['templates/','/opt/gondul/web/templates']),lstrip_blocks=True, trim_blocks=True) +env = Environment(loader=FileSystemLoader(['templates/','/opt/gondul/data/templates', '/opt/gondul/web/templates']),lstrip_blocks=True, trim_blocks=True) + +class Mode(Enum): + Get = 1 + Post = 2 class MyHandler(http.server.BaseHTTPRequestHandler): - body = "" options = dict() def parse_options(self): - url = self.path[1:] - self.url = url + self.url = self.path[1:] self.options = dict() - if url.find("?") != -1: - (self.url, tmpoptions) = url.split("?") + if self.url.find("?") != -1: + (self.url, tmpoptions) = self.url.split("?") tmptuples = tmpoptions.split("&") for a in tmptuples: (x,y) = a.split("=") self.options[x] = y - def finalize_reply(self): - self.send_header('Content-Length', int(len(self.body))) - self.end_headers() - self.wfile.write(self.body) - self.wfile.flush() - - def do_GET(self): + def generic(self, mode): updateData() self.parse_options() + body = "" try: - template = env.get_template(self.url) - self.body = template.render(objects=objects, options=self.options).encode('UTF-8') + if mode == Mode.Get: + template = env.get_template(self.url) + elif mode == Mode.Post: + length = self.headers.get('content-length') + if not length: + length = 0 + content = self.rfile.read(int(length)).decode('UTF-8') + template = env.from_string(content) + else: + raise Exception("Invalid mode") + + body = template.render(objects=objects, options=self.options) self.send_response(200) - self.send_header('Cache-Control','max-age=30, s-maxage=5') + except TemplateNotFound as err: + body = "Template \"%s\" not found\n" % self.url + self.send_response(404) except Exception as err: - self.body = ("Templating of %s failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (self.url, err, traceback.format_exc())).encode('UTF-8') - self.send_response(500) - self.send_header('Cache-Control','max-age=1, s-maxage=1') - self.finalize_reply() + body = ("Templating of \"%s\" failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (self.url, err, traceback.format_exc())) + if mode == Mode.Get: + self.send_response(400) + else: + self.send_response(500) + finally: + self.send_header('Cache-Control','max-age=5, s-maxage=1') + body = body.encode('UTF-8') + self.send_header('Content-Length', int(len(body))) + self.end_headers() + self.wfile.write(body) + self.wfile.flush() + + def do_GET(self): + self.generic(Mode.Get) def do_POST(self): - updateData() - self.parse_options() - try: - length = self.headers.get('content-length') - if not length: - length = 0 - content = self.rfile.read(int(length)).decode('UTF-8') - template = Template(content) - self.body = template.render(objects=objects, options=self.options).encode('UTF-8') - self.send_response(200) - self.send_header('Cache-Control','max-age=30, s-maxage=5') - except Exception as err: - self.body = ("Templating of %s failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (self.url, err, traceback.format_exc())).encode('UTF-8') - self.send_response(500) - self.send_header('Cache-Control','max-age=1, s-maxage=1') - self.finalize_reply() + self.generic(Mode.Post) def run(server_class=http.server.HTTPServer, handler_class=http.server.BaseHTTPRequestHandler): server_address = ('', 8080) |