File Filtering
To keep the UI cleaner I have implemented a simple filter to remove items that match the ignore list.
This commit is contained in:
parent
1af3678ce2
commit
705880c217
1 changed files with 75 additions and 57 deletions
132
configurator.py
132
configurator.py
|
@ -16,15 +16,18 @@ import cgi
|
|||
import shlex
|
||||
import subprocess
|
||||
import logging
|
||||
import fnmatch
|
||||
from string import Template
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import urllib.request
|
||||
from urllib.parse import urlparse, parse_qs, unquote
|
||||
|
||||
|
||||
### Some options for you to change
|
||||
LISTENIP = "0.0.0.0"
|
||||
LISTENPORT = 3218
|
||||
# Set BASEPATH to something like "/home/hass/.homeassistant/" if you're not running the configurator from that path
|
||||
# Set BASEPATH to something like "/home/hass/.homeassistant/" if you're not running the
|
||||
# configurator from that path
|
||||
BASEPATH = None
|
||||
# Set the paths to a certificate and the key if you're using SSL, e.g "/etc/ssl/certs/mycert.pem"
|
||||
SSL_CERTIFICATE = None
|
||||
|
@ -32,6 +35,7 @@ SSL_KEY = None
|
|||
# Set the destination where the HASS API is reachable
|
||||
HASS_API = "http://127.0.0.1:8123/api/"
|
||||
# If a password is required to access the API, set it in the form of "password"
|
||||
# if you have HA ignoring SSL locally this is not needed if on same machine.
|
||||
HASS_API_PASSWORD = None
|
||||
# To enable authentication, set the credentials in the form of "username:password"
|
||||
CREDENTIALS = None
|
||||
|
@ -40,10 +44,14 @@ CREDENTIALS = None
|
|||
ALLOWED_NETWORKS = []
|
||||
# List of statically banned IP addresses, e.g. ["1.1.1.1", "2.2.2.2"]
|
||||
BANNED_IPS = []
|
||||
# Ban IPs after n failed login attempts. Restart service to reset banning. The default of `0` disables this feature.
|
||||
# Ban IPs after n failed login attempts. Restart service to reset banning. The default
|
||||
# of `0` disables this feature.
|
||||
BANLIMIT = 0
|
||||
# Enable git integration. GitPython (https://gitpython.readthedocs.io/en/stable/) has to be installed.
|
||||
# Enable git integration. GitPython (https://gitpython.readthedocs.io/en/stable/) has
|
||||
# to be installed.
|
||||
GIT = False
|
||||
# Files to ignore. ["*.", "*.log"] helps cleanup the UI.
|
||||
IGNORE_PATTERN = [".*", "*.log", "deps", "icloud", "*.conf", "*.json", "certs", "__pycache__"]
|
||||
### End of options
|
||||
|
||||
LOGLEVEL = logging.INFO
|
||||
|
@ -64,7 +72,7 @@ if GIT:
|
|||
try:
|
||||
from git import Repo as REPO
|
||||
except Exception:
|
||||
LOG.warn("Unable to import Git module")
|
||||
LOG.warning("Unable to import Git module")
|
||||
INDEX = Template(r"""<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
|
@ -2665,7 +2673,7 @@ INDEX = Template(r"""<!DOCTYPE html>
|
|||
|
||||
def signal_handler(sig, frame):
|
||||
global HTTPD
|
||||
LOG.info("Got signal: %s. Shutting down server" % str(sig))
|
||||
LOG.info("Got signal: %s. Shutting down server", str(sig))
|
||||
HTTPD.server_close()
|
||||
sys.exit(0)
|
||||
|
||||
|
@ -2689,8 +2697,8 @@ def load_settings(settingsfile):
|
|||
BANLIMIT = settings.get("BANLIMIT", BANLIMIT)
|
||||
DEV = settings.get("DEV", DEV)
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warn("Not loading static settings")
|
||||
LOG.warning(err)
|
||||
LOG.warning("Not loading static settings")
|
||||
return False
|
||||
|
||||
def get_dircontent(path, repo=None):
|
||||
|
@ -2706,7 +2714,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:
|
||||
LOG.warn("Exception: %s" % str(err))
|
||||
LOG.warning("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:
|
||||
|
@ -2738,7 +2746,16 @@ def get_dircontent(path, repo=None):
|
|||
elif edata['fullpath'] in staged:
|
||||
edata['gitstatus'] = 'staged'
|
||||
edata['changetype'] = staged.get(edata['name'], None)
|
||||
dircontent.append(edata)
|
||||
|
||||
hidden = False
|
||||
if IGNORE_PATTERN is not None:
|
||||
for file_pattern in IGNORE_PATTERN:
|
||||
if fnmatch.fnmatch(edata['name'], file_pattern):
|
||||
hidden = True
|
||||
|
||||
if not hidden:
|
||||
dircontent.append(edata)
|
||||
|
||||
return dircontent
|
||||
|
||||
def get_html():
|
||||
|
@ -2748,8 +2765,8 @@ def get_html():
|
|||
html = Template(fptr.read())
|
||||
return html
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warn("Delivering embedded HTML")
|
||||
LOG.warning(err)
|
||||
LOG.warning("Delivering embedded HTML")
|
||||
return INDEX
|
||||
|
||||
def check_access(clientip):
|
||||
|
@ -2796,7 +2813,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
else:
|
||||
content = "File not found"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
content = str(err)
|
||||
self.wfile.write(bytes(content, "utf8"))
|
||||
return
|
||||
|
@ -2817,7 +2834,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
else:
|
||||
content = "File not found"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
content = str(err)
|
||||
self.send_header('Content-type', 'text/text')
|
||||
self.wfile.write(bytes(content, "utf8"))
|
||||
|
@ -2854,7 +2871,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
}
|
||||
self.wfile.write(bytes(json.dumps(filedata), "utf8"))
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
content = str(err)
|
||||
self.wfile.write(bytes(content, "utf8"))
|
||||
return
|
||||
|
@ -2900,7 +2917,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
res = json.loads(response.read().decode('utf-8'))
|
||||
LOG.debug(res)
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
res['restart'] = str(err)
|
||||
self.wfile.write(bytes(json.dumps(res), "utf8"))
|
||||
return
|
||||
|
@ -2920,7 +2937,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
# print(json.loads(response.read().decode('utf-8')))
|
||||
# res['service'] = "called successfully"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
res['restart'] = str(err)
|
||||
self.wfile.write(bytes(json.dumps(res), "utf8"))
|
||||
return
|
||||
|
@ -2940,7 +2957,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
LOG.debug(json.loads(response.read().decode('utf-8')))
|
||||
res['service'] = "called successfully"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
res['restart'] = str(err)
|
||||
self.wfile.write(bytes(json.dumps(res), "utf8"))
|
||||
return
|
||||
|
@ -2960,7 +2977,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
LOG.debug(json.loads(response.read().decode('utf-8')))
|
||||
res['service'] = "called successfully"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
res['restart'] = str(err)
|
||||
self.wfile.write(bytes(json.dumps(res), "utf8"))
|
||||
return
|
||||
|
@ -2980,7 +2997,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
LOG.debug(json.loads(response.read().decode('utf-8')))
|
||||
res['service'] = "called successfully"
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
res['restart'] = str(err)
|
||||
self.wfile.write(bytes(json.dumps(res), "utf8"))
|
||||
return
|
||||
|
@ -3000,8 +3017,8 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
boot = response.read().decode('utf-8')
|
||||
|
||||
except Exception as err:
|
||||
LOG.warn("Exception getting bootstrap")
|
||||
LOG.warn(err)
|
||||
LOG.warning("Exception getting bootstrap")
|
||||
LOG.warning(err)
|
||||
|
||||
color = "green"
|
||||
try:
|
||||
|
@ -3010,8 +3027,8 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
if VERSION != latest:
|
||||
color = "red"
|
||||
except Exception as err:
|
||||
LOG.warn("Exception getting release")
|
||||
LOG.warn(err)
|
||||
LOG.warning("Exception getting release")
|
||||
LOG.warning(err)
|
||||
html = get_html().safe_substitute(bootstrap=boot,
|
||||
current=VERSION,
|
||||
versionclass=color,
|
||||
|
@ -3039,7 +3056,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
try:
|
||||
postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1)
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'filename' in postvars.keys() and 'text' in postvars.keys():
|
||||
|
@ -3058,7 +3075,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
return
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
else:
|
||||
response['message'] = "Missing filename or text"
|
||||
elif req.path == '/api/upload':
|
||||
|
@ -3095,7 +3112,7 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
try:
|
||||
postvars = parse_qs(self.rfile.read(length).decode('utf-8'), keep_blank_values=1)
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys():
|
||||
|
@ -3116,20 +3133,20 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
self.wfile.write(bytes(json.dumps(response), "utf8"))
|
||||
return
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'command' in postvars.keys():
|
||||
|
@ -3153,30 +3170,30 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
try:
|
||||
response['stdout'] = stdout.decode(sys.getdefaultencoding())
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['stdout'] = stdout.decode("utf-8", errors="replace")
|
||||
try:
|
||||
response['stderr'] = stderr.decode(sys.getdefaultencoding())
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['stderr'] = stderr.decode("utf-8", errors="replace")
|
||||
self.wfile.write(bytes(json.dumps(response), "utf8"))
|
||||
return
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys():
|
||||
|
@ -3196,20 +3213,20 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
self.wfile.write(bytes(json.dumps(response), "utf8"))
|
||||
return
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys() and 'message' in postvars.keys():
|
||||
|
@ -3235,14 +3252,14 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
|
||||
except Exception as err:
|
||||
response['message'] = "Not a git repository: %s" % (str(err))
|
||||
LOG.warn("Exception (no repo): %s" % str(err))
|
||||
LOG.warning("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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys() and 'branch' in postvars.keys():
|
||||
|
@ -3265,18 +3282,18 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
except Exception as err:
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
LOG.warn(response)
|
||||
LOG.warning(response)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "Not a git repository: %s" % (str(err))
|
||||
LOG.warn("Exception (no repo): %s" % str(err))
|
||||
LOG.warning("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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys() and 'branch' in postvars.keys():
|
||||
|
@ -3298,18 +3315,18 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
except Exception as err:
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
LOG.warn(response)
|
||||
LOG.warning(response)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "Not a git repository: %s" % (str(err))
|
||||
LOG.warn("Exception (no repo): %s" % str(err))
|
||||
LOG.warning("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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys():
|
||||
|
@ -3329,18 +3346,18 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
except Exception as err:
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
LOG.warn(response)
|
||||
LOG.warning(response)
|
||||
|
||||
except Exception as err:
|
||||
response['message'] = "Not a git repository: %s" % (str(err))
|
||||
LOG.warn("Exception (no repo): %s" % str(err))
|
||||
LOG.warning("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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys() and 'name' in postvars.keys():
|
||||
|
@ -3359,17 +3376,17 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
self.wfile.write(bytes(json.dumps(response), "utf8"))
|
||||
return
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(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:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['message'] = "%s" % (str(err))
|
||||
postvars = {}
|
||||
if 'path' in postvars.keys() and 'name' in postvars.keys():
|
||||
|
@ -3389,12 +3406,12 @@ class RequestHandler(BaseHTTPRequestHandler):
|
|||
self.wfile.write(bytes(json.dumps(response), "utf8"))
|
||||
return
|
||||
except Exception as err:
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
response['error'] = True
|
||||
response['message'] = str(err)
|
||||
except Exception as err:
|
||||
response['message'] = "%s" % (str(err))
|
||||
LOG.warn(err)
|
||||
LOG.warning(err)
|
||||
else:
|
||||
response['message'] = "Missing filename or text"
|
||||
else:
|
||||
|
@ -3429,7 +3446,7 @@ class AuthHandler(RequestHandler):
|
|||
if BANLIMIT:
|
||||
bancounter = FAIL2BAN_IPS.get(self.client_address[0], 1)
|
||||
if bancounter >= BANLIMIT:
|
||||
LOG.warn("Blocking access from %s" % self.client_address[0])
|
||||
LOG.warning("Blocking access from %s" % self.client_address[0])
|
||||
self.do_BLOCK()
|
||||
return
|
||||
else:
|
||||
|
@ -3454,7 +3471,7 @@ class AuthHandler(RequestHandler):
|
|||
if BANLIMIT:
|
||||
bancounter = FAIL2BAN_IPS.get(self.client_address[0], 1)
|
||||
if bancounter >= BANLIMIT:
|
||||
LOG.warn("Blocking access from %s" % self.client_address[0])
|
||||
LOG.warning("Blocking access from %s" % self.client_address[0])
|
||||
self.do_BLOCK()
|
||||
return
|
||||
else:
|
||||
|
@ -3483,8 +3500,8 @@ def main(args):
|
|||
keyfile=SSL_KEY,
|
||||
server_side=True)
|
||||
LOG.info('Listening on: %s://%s:%i' % ('https' if SSL_CERTIFICATE else 'http',
|
||||
LISTENIP,
|
||||
LISTENPORT))
|
||||
LISTENIP,
|
||||
LISTENPORT))
|
||||
if BASEPATH:
|
||||
os.chdir(BASEPATH)
|
||||
HTTPD.serve_forever()
|
||||
|
@ -3492,3 +3509,4 @@ def main(args):
|
|||
if __name__ == "__main__":
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
main(sys.argv[1:])
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue