From f4d951a088dd2b6755c57ceff966978661207aaf Mon Sep 17 00:00:00 2001
From: sqozz <sqozz@geekify.de>
Date: Sat, 17 Nov 2018 16:20:00 +0100
Subject: [PATCH] Add first PoC

---
 requirements.txt |  1 +
 update_server.py | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 requirements.txt
 create mode 100644 update_server.py

diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..35a47a7
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+bottle==0.12.13
diff --git a/update_server.py b/update_server.py
new file mode 100644
index 0000000..bbfafce
--- /dev/null
+++ b/update_server.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+import hashlib
+from bottle import route, run, request, HTTPResponse, response
+import pdb
+
+updated = True
+filename = "firmware.bin"
+
+@route('/update')
+def update():
+    #for header in request.headers.keys():
+    #    print("{}: {}".format(header, request.headers.get(header, "")))
+
+    requestor_mac = request.headers.get("X-Esp8266-Sta-Mac")
+    running_fw_md5 = request.headers.get("X-Esp8266-Sketch-Md5", "")
+    print("Update request from {} with fw {}".format(requestor_mac, running_fw_md5))
+    available_fw_md5 = md5(filename)
+
+    print("Lates firmware available is {} - ".format(available_fw_md5), end="")
+    if available_fw_md5 != running_fw_md5:
+        print("Differs, updating…")
+        response.set_header('Content-Type', 'application/octet-stream')
+        response.set_header('Content-Disposition', ' attachment; filename={}'.format(filename))
+        with open(filename, "rb") as firmware:
+            fw = firmware.read()
+            response.set_header('Content-Length', '{}'.format(len(fw)))
+        response.set_header('X-MD5', available_fw_md5)
+        return fw
+    else:
+        print("Same, skipping…")
+        return HTTPResponse(status=304, body="")
+
+def md5(fname):
+    hash_md5 = hashlib.md5()
+    with open(fname, "rb") as f:
+        for chunk in iter(lambda: f.read(4096), b""):
+            hash_md5.update(chunk)
+    return hash_md5.hexdigest()
+
+run(host='localhost', port=8080, debug=True)