From 366d8857dd65e81ba572653af57f499e30258d87 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sun, 23 Apr 2017 20:48:47 +0200 Subject: [PATCH] Removed check_config, minor changes, new logging --- configurator.py | 162 ++++++++++++++++++++++++++---------------------- dev.html | 26 +++----- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/configurator.py b/configurator.py index 1e3b515..3c475a9 100755 --- a/configurator.py +++ b/configurator.py @@ -15,6 +15,7 @@ import signal import cgi import shlex import subprocess +import logging from string import Template from http.server import BaseHTTPRequestHandler, HTTPServer import urllib.request @@ -45,7 +46,14 @@ BANLIMIT = 0 GIT = False ### End of options -RELEASEURL = "https://api.github.com/repos/danielperna84/hass-poc-configurator/releases/latest" +LOGLEVEL = logging.INFO +LOG = logging.getLogger(__name__) +LOG.setLevel(LOGLEVEL) +SO = logging.StreamHandler(sys.stdout) +SO.setLevel(LOGLEVEL) +SO.setFormatter(logging.Formatter('%(levelname)s:%(asctime)s:%(name)s:%(message)s')) +LOG.addHandler(SO) +RELEASEURL = "https://api.github.com/repos/danielperna84/hass-configurator/releases/latest" VERSION = "0.1.6" BASEDIR = "." DEV = False @@ -56,7 +64,7 @@ if GIT: try: from git import Repo as REPO except Exception: - print("Unable to import Git module") + LOG.warn("Unable to import Git module") INDEX = Template(r""" @@ -580,7 +588,7 @@ INDEX = Template(r"""
  • Editor Settings
  • About HASS-Configurator
  • -
  • Check HASS Configuration
  • +
  • Reload automations
  • Reload groups
  • Restart HASS
  • @@ -594,7 +602,7 @@ INDEX = Template(r"""
  • Editor Settings
  • About HASS-Configurator
  • -
  • Check HASS Configuration
  • +
  • Reload automations
  • Reload groups
  • Restart HASS
  • @@ -2646,7 +2654,7 @@ INDEX = Template(r""" def signal_handler(sig, frame): global HTTPD - print("Got signal: %s. Shutting down server" % str(sig)) + LOG.info("Got signal: %s. Shutting down server" % str(sig)) HTTPD.server_close() sys.exit(0) @@ -2670,8 +2678,8 @@ def load_settings(settingsfile): BANLIMIT = settings.get("BANLIMIT", BANLIMIT) DEV = settings.get("DEV", DEV) except Exception as err: - print(err) - print("Not loading static settings") + LOG.warn(err) + LOG.warn("Not loading static settings") return False def get_dircontent(path, repo=None): @@ -2687,7 +2695,7 @@ def get_dircontent(path, repo=None): for element in repo.index.diff("HEAD"): staged["%s%s%s" % (repo.working_dir, os.sep, "%s"%os.sep.join(element.b_path.split('/')))] = element.change_type except Exception as err: - print("Exception: %s" % str(err)) + LOG.warn("Exception: %s" % str(err)) for element in repo.index.diff(None): unstaged["%s%s%s" % (repo.working_dir, os.sep, "%s"%os.sep.join(element.b_path.split('/')))] = element.change_type else: @@ -2729,8 +2737,8 @@ def get_html(): html = Template(fptr.read()) return html except Exception as err: - print(err) - print("Delivering embedded HTML") + LOG.warn(err) + LOG.warn("Delivering embedded HTML") return INDEX def check_access(clientip): @@ -2747,6 +2755,10 @@ def check_access(clientip): return False class RequestHandler(BaseHTTPRequestHandler): + def log_message(self, format, *args): + LOG.info("%s - %s" % (self.client_address[0], format%args)) + return + def do_BLOCK(self): self.send_response(420) self.end_headers() @@ -2773,7 +2785,7 @@ class RequestHandler(BaseHTTPRequestHandler): else: content = "File not found" except Exception as err: - print(err) + LOG.warn(err) content = str(err) self.wfile.write(bytes(content, "utf8")) return @@ -2783,7 +2795,7 @@ class RequestHandler(BaseHTTPRequestHandler): try: if filename: filename = unquote(filename[0]).encode('utf-8') - print(filename) + LOG.info(filename) if os.path.isfile(os.path.join(BASEDIR.encode('utf-8'), filename)): with open(os.path.join(BASEDIR.encode('utf-8'), filename), 'rb') as fptr: filecontent = fptr.read() @@ -2794,7 +2806,7 @@ class RequestHandler(BaseHTTPRequestHandler): else: content = "File not found" except Exception as err: - print(err) + LOG.warn(err) content = str(err) self.send_header('Content-type', 'text/text') self.wfile.write(bytes(content, "utf8")) @@ -2820,7 +2832,7 @@ class RequestHandler(BaseHTTPRequestHandler): for branch in repo.branches: branches.append(branch.name) except Exception as err: - print("Exception (no repo): %s" % str(err)) + LOG.debug("Exception (no repo): %s" % str(err)) dircontent = get_dircontent(dirpath.decode('utf-8'), repo) filedata = {'content': dircontent, 'abspath': os.path.abspath(dirpath).decode('utf-8'), @@ -2831,7 +2843,7 @@ class RequestHandler(BaseHTTPRequestHandler): } self.wfile.write(bytes(json.dumps(filedata), "utf8")) except Exception as err: - print(err) + LOG.warn(err) content = str(err) self.wfile.write(bytes(content, "utf8")) return @@ -2842,9 +2854,9 @@ class RequestHandler(BaseHTTPRequestHandler): dirpath = query.get('path', None) if dirpath: dirpath = unquote(dirpath[0]).encode('utf-8') - print(dirpath) + LOG.debug(dirpath) absp = os.path.abspath(dirpath) - print(absp) + LOG.debug(absp) if os.path.isdir(dirpath): self.wfile.write(os.path.abspath(dirpath)) return @@ -2855,14 +2867,14 @@ class RequestHandler(BaseHTTPRequestHandler): dirpath = query.get('path', None) if dirpath: dirpath = unquote(dirpath[0]).encode('utf-8') - print(dirpath) + LOG.debug(dirpath) absp = os.path.abspath(dirpath) - print(absp) + LOG.debug(absp) if os.path.isdir(dirpath): self.wfile.write(os.path.abspath(os.path.dirname(dirpath))) return elif req.path == '/api/restart': - print("/api/restart") + LOG.info("/api/restart") self.send_header('Content-type', 'text/json') self.end_headers() res = {"restart": False} @@ -2875,14 +2887,14 @@ class RequestHandler(BaseHTTPRequestHandler): req = urllib.request.Request("%sservices/homeassistant/restart" % HASS_API, headers=headers, method='POST') with urllib.request.urlopen(req) as response: res = json.loads(response.read().decode('utf-8')) - print(res) + LOG.debug(res) except Exception as err: - print(err) + LOG.warn(err) res['restart'] = str(err) self.wfile.write(bytes(json.dumps(res), "utf8")) return elif req.path == '/api/check_config': - print("/api/check_config") + LOG.info("/api/check_config") self.send_header('Content-type', 'text/json') self.end_headers() res = {"check_config": False} @@ -2893,16 +2905,16 @@ class RequestHandler(BaseHTTPRequestHandler): if HASS_API_PASSWORD: headers["x-ha-access"] = HASS_API_PASSWORD req = urllib.request.Request("%sservices/homeassistant/check_config" % HASS_API, headers=headers, method='POST') - with urllib.request.urlopen(req) as response: - res = json.loads(response.read().decode('utf-8')) - print(res) + # with urllib.request.urlopen(req) as response: + # print(json.loads(response.read().decode('utf-8'))) + # res['service'] = "called successfully" except Exception as err: - print(err) + LOG.warn(err) res['restart'] = str(err) self.wfile.write(bytes(json.dumps(res), "utf8")) return elif req.path == '/api/reload_automations': - print("/api/reload_automations") + LOG.info("/api/reload_automations") self.send_header('Content-type', 'text/json') self.end_headers() res = {"reload_automations": False} @@ -2914,15 +2926,15 @@ class RequestHandler(BaseHTTPRequestHandler): headers["x-ha-access"] = HASS_API_PASSWORD req = urllib.request.Request("%sservices/automation/reload" % HASS_API, headers=headers, method='POST') with urllib.request.urlopen(req) as response: - res = json.loads(response.read().decode('utf-8')) - print(res) + LOG.debug(json.loads(response.read().decode('utf-8'))) + res['service'] = "called successfully" except Exception as err: - print(err) + LOG.warn(err) res['restart'] = str(err) self.wfile.write(bytes(json.dumps(res), "utf8")) return elif req.path == '/api/reload_groups': - print("/api/reload_groups") + LOG.info("/api/reload_groups") self.send_header('Content-type', 'text/json') self.end_headers() res = {"reload_groups": False} @@ -2934,10 +2946,10 @@ class RequestHandler(BaseHTTPRequestHandler): headers["x-ha-access"] = HASS_API_PASSWORD req = urllib.request.Request("%sservices/group/reload" % HASS_API, headers=headers, method='POST') with urllib.request.urlopen(req) as response: - res = json.loads(response.read().decode('utf-8')) - print(res) + LOG.debug(json.loads(response.read().decode('utf-8'))) + res['service'] = "called successfully" except Exception as err: - print(err) + LOG.warn(err) res['restart'] = str(err) self.wfile.write(bytes(json.dumps(res), "utf8")) return @@ -2957,8 +2969,8 @@ class RequestHandler(BaseHTTPRequestHandler): boot = response.read().decode('utf-8') except Exception as err: - print("Exception getting bootstrap") - print(err) + LOG.warn("Exception getting bootstrap") + LOG.warn(err) color = "green" try: @@ -2967,8 +2979,8 @@ class RequestHandler(BaseHTTPRequestHandler): if VERSION != latest: color = "red" except Exception as err: - print("Exception getting release") - print(err) + LOG.warn("Exception getting release") + LOG.warn(err) html = get_html().safe_substitute(bootstrap=boot, current=VERSION, versionclass=color, @@ -2996,7 +3008,7 @@ class RequestHandler(BaseHTTPRequestHandler): try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'filename' in postvars.keys() and 'text' in postvars.keys(): @@ -3015,7 +3027,7 @@ class RequestHandler(BaseHTTPRequestHandler): return except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) else: response['message'] = "Missing filename or text" elif req.path == '/api/upload': @@ -3052,7 +3064,7 @@ class RequestHandler(BaseHTTPRequestHandler): try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys(): @@ -3073,20 +3085,20 @@ class RequestHandler(BaseHTTPRequestHandler): self.wfile.write(bytes(json.dumps(response), "utf8")) return except Exception as err: - print(err) + LOG.warn(err) response['error'] = True response['message'] = str(err) except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) else: response['message'] = "Missing filename or text" elif req.path == '/api/exec_command': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'command' in postvars.keys(): @@ -3110,30 +3122,30 @@ class RequestHandler(BaseHTTPRequestHandler): try: response['stdout'] = stdout.decode(sys.getdefaultencoding()) except Exception as err: - print(err) + LOG.warn(err) response['stdout'] = stdout.decode("utf-8", errors="replace") try: response['stderr'] = stderr.decode(sys.getdefaultencoding()) except Exception as err: - print(err) + LOG.warn(err) response['stderr'] = stderr.decode("utf-8", errors="replace") self.wfile.write(bytes(json.dumps(response), "utf8")) return except Exception as err: - print(err) + LOG.warn(err) response['error'] = True response['message'] = str(err) except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) else: response['message'] = "Missing command" elif req.path == '/api/gitadd': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys(): @@ -3153,20 +3165,20 @@ class RequestHandler(BaseHTTPRequestHandler): self.wfile.write(bytes(json.dumps(response), "utf8")) return except Exception as err: - print(err) + LOG.warn(err) response['error'] = True response['message'] = str(err) except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) else: response['message'] = "Missing filename" elif req.path == '/api/commit': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys() and 'message' in postvars.keys(): @@ -3188,18 +3200,18 @@ class RequestHandler(BaseHTTPRequestHandler): except Exception as err: response['error'] = True response['message'] = str(err) - print(response) + LOG.debug(response) except Exception as err: response['message'] = "Not a git repository: %s" % (str(err)) - print("Exception (no repo): %s" % str(err)) + LOG.warn("Exception (no repo): %s" % str(err)) else: response['message'] = "Missing path" elif req.path == '/api/checkout': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys() and 'branch' in postvars.keys(): @@ -3222,18 +3234,18 @@ class RequestHandler(BaseHTTPRequestHandler): except Exception as err: response['error'] = True response['message'] = str(err) - print(response) + LOG.warn(response) except Exception as err: response['message'] = "Not a git repository: %s" % (str(err)) - print("Exception (no repo): %s" % str(err)) + LOG.warn("Exception (no repo): %s" % str(err)) else: response['message'] = "Missing path or branch" elif req.path == '/api/newbranch': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys() and 'branch' in postvars.keys(): @@ -3255,18 +3267,18 @@ class RequestHandler(BaseHTTPRequestHandler): except Exception as err: response['error'] = True response['message'] = str(err) - print(response) + LOG.warn(response) except Exception as err: response['message'] = "Not a git repository: %s" % (str(err)) - print("Exception (no repo): %s" % str(err)) + LOG.warn("Exception (no repo): %s" % str(err)) else: response['message'] = "Missing path or branch" elif req.path == '/api/init': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys(): @@ -3286,18 +3298,18 @@ class RequestHandler(BaseHTTPRequestHandler): except Exception as err: response['error'] = True response['message'] = str(err) - print(response) + LOG.warn(response) except Exception as err: response['message'] = "Not a git repository: %s" % (str(err)) - print("Exception (no repo): %s" % str(err)) + LOG.warn("Exception (no repo): %s" % str(err)) else: response['message'] = "Missing path or branch" elif req.path == '/api/newfolder': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys() and 'name' in postvars.keys(): @@ -3316,17 +3328,17 @@ class RequestHandler(BaseHTTPRequestHandler): self.wfile.write(bytes(json.dumps(response), "utf8")) return except Exception as err: - print(err) + LOG.warn(err) response['error'] = True response['message'] = str(err) except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) elif req.path == '/api/newfile': try: postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1) except Exception as err: - print(err) + LOG.warn(err) response['message'] = "%s" % (str(err)) postvars = {} if 'path' in postvars.keys() and 'name' in postvars.keys(): @@ -3346,12 +3358,12 @@ class RequestHandler(BaseHTTPRequestHandler): self.wfile.write(bytes(json.dumps(response), "utf8")) return except Exception as err: - print(err) + LOG.warn(err) response['error'] = True response['message'] = str(err) except Exception as err: response['message'] = "%s" % (str(err)) - print(err) + LOG.warn(err) else: response['message'] = "Missing filename or text" else: @@ -3364,7 +3376,7 @@ class RequestHandler(BaseHTTPRequestHandler): class AuthHandler(RequestHandler): def do_AUTHHEAD(self): - print("Requesting authorization") + LOG.info("Requesting authorization") self.send_response(401) self.send_header('WWW-Authenticate', 'Basic realm=\"HASS-PoC-Configurator\"') self.send_header('Content-type', 'text/html') @@ -3386,7 +3398,7 @@ class AuthHandler(RequestHandler): if BANLIMIT: bancounter = FAIL2BAN_IPS.get(self.client_address[0], 1) if bancounter >= BANLIMIT: - print("Blocking access from %s" % self.client_address[0]) + LOG.warn("Blocking access from %s" % self.client_address[0]) self.do_BLOCK() return else: @@ -3411,7 +3423,7 @@ class AuthHandler(RequestHandler): if BANLIMIT: bancounter = FAIL2BAN_IPS.get(self.client_address[0], 1) if bancounter >= BANLIMIT: - print("Blocking access from %s" % self.client_address[0]) + LOG.warn("Blocking access from %s" % self.client_address[0]) self.do_BLOCK() return else: @@ -3424,7 +3436,7 @@ def main(args): global HTTPD, CREDENTIALS if args: load_settings(args[0]) - print("Starting server") + LOG.info("Starting server") server_address = (LISTENIP, LISTENPORT) if CREDENTIALS: CREDENTIALS = base64.b64encode(bytes(CREDENTIALS, "utf-8")) @@ -3439,7 +3451,7 @@ def main(args): certfile=SSL_CERTIFICATE, keyfile=SSL_KEY, server_side=True) - print('Listening on: %s://%s:%i' % ('https' if SSL_CERTIFICATE else 'http', + LOG.info('Listening on: %s://%s:%i' % ('https' if SSL_CERTIFICATE else 'http', LISTENIP, LISTENPORT)) if BASEPATH: diff --git a/dev.html b/dev.html index 93fe1d1..e6ba973 100644 --- a/dev.html +++ b/dev.html @@ -521,7 +521,7 @@
  • Editor Settings
  • About HASS-Configurator
  • -
  • Check HASS Configuration
  • +
  • Reload automations
  • Reload groups
  • Restart HASS
  • @@ -535,7 +535,7 @@
  • Editor Settings
  • About HASS-Configurator
  • -
  • Check HASS Configuration
  • +
  • Reload automations
  • Reload groups
  • Restart HASS
  • @@ -2170,34 +2170,22 @@ } else { var $toastContent = $("
    " + resp[0].state + "
    "); - Materialize.toast($toastContent, 5000); + Materialize.toast($toastContent, 2000); } }); } function reload_automations() { $.get("api/reload_automations", function (resp) { - if (resp.length == 0) { - var $toastContent = $("
    Automations reloaded.
    "); - Materialize.toast($toastContent, 2000); - } - else { - var $toastContent = $("
    " + resp[0].state + "
    "); - Materialize.toast($toastContent, 5000); - } + var $toastContent = $("
    Automations reloaded
    "); + Materialize.toast($toastContent, 2000); }); } function reload_groups() { $.get("api/reload_groups", function (resp) { - if (resp.length == 0) { - var $toastContent = $("
    Groups reloaded.
    "); - Materialize.toast($toastContent, 2000); - } - else { - var $toastContent = $("
    " + resp[0].state + "
    "); - Materialize.toast($toastContent, 5000); - } + var $toastContent = $("
    Groups reloaded
    "); + Materialize.toast($toastContent, 2000); }); }