aboutsummaryrefslogtreecommitdiffstats
path: root/templating/templating.py
diff options
context:
space:
mode:
authorKristian Lyngstol <kly@kly.no>2016-11-15 05:51:14 +0100
committerKristian Lyngstol <kly@kly.no>2016-11-15 05:51:14 +0100
commit5543e7dc3072df61910350b46879908f985f94b4 (patch)
treea899d902e1a07014403a4a4c568cdfeee4206057 /templating/templating.py
parentf34cb5a300e349af5b212ea1b394f85df917e61a (diff)
Templating: Merge GET and POST and smarten error-handling
Fixes #153
Diffstat (limited to 'templating/templating.py')
-rwxr-xr-xtemplating/templating.py80
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)