Add dbusView

dbusView is a simple python server that runs busctl
commands on a remote server.

Change-Id: Iea10d54ca275544f833e12bd1231c1e597330f12
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/feistjj/dbusView.py b/feistjj/dbusView.py
new file mode 100755
index 0000000..fa2396d
--- /dev/null
+++ b/feistjj/dbusView.py
@@ -0,0 +1,96 @@
+#!/usr/bin/python3
+
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2020 Intel Corp.
+
+import subprocess
+from flask import Flask
+from flask import send_file
+import argparse
+
+REPLACE_CHAR = '~'
+
+app = Flask(__name__)
+
+parser = argparse.ArgumentParser(description='Remote DBus Viewer')
+parser.add_argument('-u', '--username', default='root')
+parser.add_argument('-p', '--password', default='0penBmc')
+parser.add_argument('-a', '--address', required=True)
+parser.add_argument('-x', '--port', required=True)
+args = parser.parse_args()
+
+busctl = 'sshpass -p {} busctl -H {}@{} '.format(
+    args.password, args.username, args.address)
+header = '<head><link rel="icon" href="https://avatars1.githubusercontent.com/u/13670043?s=200&v=4" /></head>'
+
+
+def getBusNames():
+    out = subprocess.check_output(busctl + 'list --acquired', shell=True)
+    out = out.split(b'\n')
+    out = out[1:]
+    names = []
+    for line in out:
+        name = line.split(b' ')[0]
+        if name:
+            names.append(name.decode())
+    return names
+
+
+def doTree(busname):
+    out = subprocess.check_output(busctl + 'tree ' + busname, shell=True)
+    out = out.split(b'\n')
+    tree = []
+    for line in out:
+        path = line.split(b'/', 1)[-1].decode()
+        path = '/' + path
+        tree.append(path)
+    return tree
+
+
+def doIntrospect(busname, path):
+    out = subprocess.check_output(
+        busctl + 'introspect {} {}'.format(busname, path), shell=True)
+    return out.decode().split('\n')
+
+
+@app.route('/')
+def root():
+    out = header
+    out += '<div><H2>Bus Names {}</H2></div>'.format(args.address)
+    for name in getBusNames():
+        out += '<div> '
+        out += '<a href="{}"> {} </a>'.format(name, name)
+        out += '</div>'
+    return out
+
+
+@app.route('/favicon.ico')
+def favicon():
+    return '<link rel="icon" type="image/png" href="https://avatars1.githubusercontent.com/u/13670043?s=200&v=4" />'
+
+
+@app.route('/<name>')
+def busname(name):
+    out = header
+    out += '<div><H2>tree {}</H2></div>'.format(name)
+    for path in doTree(name):
+        out += '<div> '
+        out += '<a href="{}/{}"> {} </a>'.format(
+            name, path.replace('/', REPLACE_CHAR), path)
+        out += '</div>'
+    return out
+
+
+@app.route('/<name>/<path>')
+def path(name, path):
+    path = path.replace(REPLACE_CHAR, '/')
+    out = header
+    out += '<div><H2>introspect {} {}</H2></div>'.format(name, path)
+    for line in doIntrospect(name, path):
+        out += '<div> '
+        out += '<pre> {} </pre>'.format(line)
+        out += '</div>'
+    return out
+
+
+app.run(port=args.port, host='0.0.0.0')