diff --git a/TerminusTTF-4.49.3.ttf b/TerminusTTF-4.49.3.ttf new file mode 100644 index 0000000..d125e63 Binary files /dev/null and b/TerminusTTF-4.49.3.ttf differ diff --git a/dnsmonitor.py b/dnsmonitor.py new file mode 100644 index 0000000..d60e32c --- /dev/null +++ b/dnsmonitor.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2014-18 Richard Hull and contributors +# See LICENSE.rst for details. +# PYTHON_ARGCOMPLETE_OK + +import math +import time +import datetime +import random +import urllib.request +import re +import sys +import random +import signal +#from demo_opts import get_device +from luma.core import cmdline, error +from luma.core.render import canvas +from pathlib import Path +from PIL import ImageFont + +def make_font(name, size): + return ImageFont.truetype(name, size) + +def display_settings(device, args): + """ + Display a short summary of the settings. + + :rtype: str + """ + iface = '' + display_types = cmdline.get_display_types() + if args.display not in display_types['emulator']: + iface = f'Interface: {args.interface}\n' + + lib_name = cmdline.get_library_for_display_type(args.display) + if lib_name is not None: + lib_version = cmdline.get_library_version(lib_name) + else: + lib_name = lib_version = 'unknown' + + import luma.core + version = f'luma.{lib_name} {lib_version} (luma.core {luma.core.__version__})' + + return f'Version: {version}\nDisplay: {args.display}\n{iface}Dimensions: {device.width} x {device.height}\n{"-" * 60}' + +def get_device(actual_args=None): + """ + Create device from command-line arguments and return it. + """ + if actual_args is None: + actual_args = sys.argv[1:] + parser = cmdline.create_parser(description='luma.examples arguments') + args = parser.parse_args(actual_args) + + if args.config: + # load config from file + config = cmdline.load_config(args.config) + args = parser.parse_args(config + actual_args) + + # create device + try: + device = cmdline.create_device(args) + print(display_settings(device, args)) + return device + + except error.Error as e: + parser.error(e) + return None + +def sigterm_handler(signum, frame): + sys.exit(0) + +def scalepoints(points): + if device.height == 32: + h = 31 + else: + h = 46 + sclpoint = [0] * 15 + scl = 1 + maxpnt = 0 + i = 0 + while i <= 14: + if points[i] > maxpnt: + maxpnt = points[i] + i += 1 + while h * scl < maxpnt: + scl += 1 + i = 0 + while i <= 14: + sclpoint[i] = int(points[i] / scl) + i += 1 + maxcanv = h * scl + return sclpoint, maxcanv + +def movepoints(points, insert): + i = 1 + tmp = points[0] + tmp2 = 0 + points[0] = insert + while i < 15: + if i == 14: + points[i] = tmp + else: + tmp2 = points[i] + points[i] = tmp + tmp = tmp2 + i += 1 + return points + +def getdata(prev, flaunch): + data = str(urllib.request.urlopen("http://10.0.0.28:4500/metrics").read()).split("\\n") + count = 0 + i = 0 + try: + while data[i] != "# TYPE blocky_query_total counter": + i += 1 + except: + if flaunch == True: + return -1 + else: + return -1, 0 + i += 1 + while True: + if data[i] == "# HELP blocky_request_duration_ms Request duration distribution": + break + else: + try: + count += int(re.sub('blocky_query_total{.*?} ', '', data[i])) + except: + if flaunch == True: + return -1 + else: + return -1, 0 + i += 1 + if flaunch == True: + return count + else: + return count, count - prev + +def drawres32(sclpo, maxcanv, failture): + with canvas(device) as draw: + d1 = 1 + d2 = device.width - 66 + now = datetime.datetime.now() + while d1 < 15: + draw.line((d2 + 10, 31 - sclpo[d1 - 1], d2, 31 - sclpo[d1]), fill="white") + d1 += 1 + d2 -= 10 + draw.text((device.width - 53, device.height - 19), now.strftime("%H:%M"), font=regfont, fill="white") + draw.text((0, 0), str(maxcanv), font=smafont, fill="white") + draw.text((0, device.height / 2 - 4), str(int(maxcanv / 2)), font=smafont, fill="white") + draw.text((0, device.height - 9), "0", font=smafont, fill="white") + #draw.text((0, device.height - 14), "\uf011", font=icons, fill="white") + if failture: + draw.text((device.width - 50, 0), "\uf071", font=icons, fill="white") + +def drawres64(sclpo, maxcanv, failture, restart): + with canvas(device) as draw: + d1 = 1 + d2 = device.width - 10 + now = datetime.datetime.now() + while d1 < 15: + draw.line((d2 + 10, 47 - sclpo[d1 - 1], d2, 47 - sclpo[d1]), fill="white") + d1 += 1 + d2 -= 10 + draw.text((device.width - 53, device.height - 19), now.strftime("%H:%M"), font=regfont, fill="white") + draw.text((0, 0), str(maxcanv), font=smafont, fill="white") + draw.text((0, (device.height - 19) / 2 - 2), str(int(maxcanv / 2)), font=smafont, fill="white") + draw.text((0, device.height - 26), "0", font=smafont, fill="white") + #draw.text((0, device.height - 14), "\uf011", font=icons, fill="white") + if failture: + draw.text((2, device.height - 14), "\uf071", font=icons, fill="white") + if restart: + draw.text((22, device.height - 14), "\uf021", font=icons, fill="white") + + +def main(): + print("Blocky Graph Monitor for OLED v1.4") + print("(C) Nikopol 2024") + today_last_time = "NaN" + last_hrs = "NaN" + failture = False + restart = False + resticker = 0 + device.contrast(0) + points = [0] * 15 + total = getdata(0, True) + if total == -1: + failture = True + while True: + now = datetime.datetime.now() + today_time = now.strftime("%H:%M") + hrs = now.strftime("%H") + if today_time != today_last_time: + today_last_time = today_time + if hrs != last_hrs: + #if 1: + last_hrs = hrs + if resticker > 0: + resticker = resticker + 1 + elif resticker >= 15: + resticker = 0 + restart = False + total, query = getdata(total, False) + print(total) + print(query) + if total == -1: + failture = True + else: + failture = False + if query < 0: + restart = True + query = 0 + resticker = 1 + points = movepoints(points, query) + sclpo, maxcanv = scalepoints(points) + if device.height == 32: + drawres32(sclpo, maxcanv, failture) + else: + drawres64(sclpo, maxcanv, failture, restart) + + + time.sleep(1) + + +if __name__ == "__main__": + try: + device = get_device() + regfont = make_font("TerminusTTF-4.49.3.ttf", 22) + smafont = make_font("TerminusTTF-4.49.3.ttf", 12) + icons = make_font("fontawesome-webfont.ttf", 15) + signal.signal(signal.SIGTERM, sigterm_handler) + main() + except KeyboardInterrupt: + pass diff --git a/dnsmonitor.py.save b/dnsmonitor.py.save new file mode 100644 index 0000000..fa47008 --- /dev/null +++ b/dnsmonitor.py.save @@ -0,0 +1,211 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2014-18 Richard Hull and contributors +# See LICENSE.rst for details. +# PYTHON_ARGCOMPLETE_OK + +import math +import time +import datetime +import random +import urllib.request +import re +import sys +import random +#from demo_opts import get_device +from luma.core import cmdline, error +from luma.core.render import canvas +from pathlib import Path +from PIL import ImageFont + +def make_font(name, size): + return ImageFont.truetype(name, size) + +def display_settings(device, args): + """ + Display a short summary of the settings. + + :rtype: str + """ + iface = '' + display_types = cmdline.get_display_types() + if args.display not in display_types['emulator']: + iface = f'Interface: {args.interface}\n' + + lib_name = cmdline.get_library_for_display_type(args.display) + if lib_name is not None: + lib_version = cmdline.get_library_version(lib_name) + else: + lib_name = lib_version = 'unknown' + + import luma.core + version = f'luma.{lib_name} {lib_version} (luma.core {luma.core.__version__})' + + return f'Version: {version}\nDisplay: {args.display}\n{iface}Dimensions: {device.width} x {device.height}\n{"-" * 60}' + + +def get_device(actual_args=None): + """ + Create device from command-line arguments and return it. + """ + if actual_args is None: + actual_args = sys.argv[1:] + parser = cmdline.create_parser(description='luma.examples arguments') + args = parser.parse_args(actual_args) + + if args.config: + # load config from file + config = cmdline.load_config(args.config) + args = parser.parse_args(config + actual_args) + + # create device + try: + device = cmdline.create_device(args) + print(display_settings(device, args)) + return device + + except error.Error as e: + parser.error(e) + return None + + + +def scalepoints(points): + if device.height == 32: + h = 31 + else: + h = 46 + sclpoint = [0] * 15 + scl = 1 + maxpnt = 0 + i = 0 + while i <= 14: + if points[i] > maxpnt: + maxpnt = points[i] + i += 1 + while h * scl < maxpnt: + scl += 1 + i = 0 + while i <= 14: + sclpoint[i] = int(points[i] / scl) + i += 1 + maxcanv = h * scl + return sclpoint, maxcanv + +def movepoints(points, insert): + i = 1 + tmp = points[0] + tmp2 = 0 + points[0] = insert + while i < 15: + if i == 14: + points[i] = tmp + else: + tmp2 = points[i] + points[i] = tmp + tmp = tmp2 + i += 1 + return points + +def getdata(prev, flaunch): + data = str(urllib.request.urlopen("http://10.0.0.28:4500/metrics").read()).split("\\n") + count = 0 + i = 0 + while data[i] != "# TYPE blocky_query_total counter": + i += 1 + i += 1 + while True: + if data[i] == "# HELP blocky_request_duration_ms Request duration distribution": + break + else: + try: + count += int(re.sub('blocky_query_total{.*?} ', '', data[i])) + except: + if flaunch == True: + return -1 + else: + return -1, -1 + i += 1 + if flaunch == True: + return count + else: + return count, count-prev + +def drawres32(sclpo, maxcanv, failture): + with canvas(device) as draw: + d1 = 1 + d2 = device.width - 66 + now = datetime.datetime.now() + while d1 < 15: + draw.line((d2 + 10, 31 - sclpo[d1 - 1], d2, 31 - sclpo[d1]), fill="white") + d1 += 1 + d2 -= 10 + draw.text((device.width - 53, device.height - 19), now.strftime("%H:%M"), font=regfont, fill="white") + draw.text((0, 0), str(maxcanv), font=smafont, fill="white") + draw.text((0, device.height / 2 - 4), str(int(maxcanv / 2)), font=smafont, fill="white") + draw.text((0, device.height - 9), "0", font=smafont, fill="white") + #draw.text((0, device.height - 14), "\uf011", font=icons, fill="white") + if failture: + draw.text((device.width - 50, 0), "\uf071", font=icons, fill="white") + +def drawres64(sclpo, maxcanv, failture): + with canvas(device) as draw: + d1 = 1 + d2 = device.width - 10 + now = datetime.datetime.now() + while d1 < 15: + draw.line((d2 + 10, 47 - sclpo[d1 - 1], d2, 47 - sclpo[d1]), fill="white") + d1 += 1 + d2 -= 10 + draw.text((device.width - 53, device.height - 19), now.strftime("%H:%M"), font=regfont, fill="white") + draw.text((0, 0), str(maxcanv), font=smafont, fill="white") + draw.text((0, (device.height - 19) / 2 - 2), str(int(maxcanv / 2)), font=smafont, fill="white") + draw.text((0, device.height - 26), "0", font=smafont, fill="white") + #draw.text((0, device.height - 14), "\uf011", font=icons, fill="white") + if failture: + draw.text((0, device.height - 14), "\uf071", font=icons, fill="white") + + +def main(): + print("Blocky Graph Monitor for OLED v1.2") + today_last_time = "NaN" + last_hrs = "NaN" + failture = False + device.contrast(0) + points = [0] * 15 + total = getdata(0, True) + while True: + now = datetime.datetime.now() + today_time = now.strftime("%H:%M") + hrs = now.strftime("%H") + + if today_time != today_last_time: + today_last_time = today_time + if hrs != last_hrs: + #if 1: + last_hrs = hrs + total, query = getdata(total, False) + if total == -1: + failture = True + else: + failture = False + points = movepoints(points, query) + sclpo, maxcanv = scalepoints(points) + if device.height == 32: + drawres32(sclpo, maxcanv, failture) + else: + drawres64(sclpo, maxcanv, failture) + + + time.sleep(1) + + +if __name__ == "__main__": + try: + device = get_device() + regfont = make_font("TerminusTTF-4.49.3.ttf", 22) + smafont = make_font("TerminusTTF-4.49.3.ttf", 12) + icons = make_font("fontawesome-webfont.ttf", 15) + main() + except KeyboardInterrupt: + pass diff --git a/fontawesome-webfont.ttf b/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/fontawesome-webfont.ttf differ