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')