| #!/usr/bin/python3 |
| |
| # SPDX-License-Identifier: Apache-2.0 |
| # Copyright 2020 Intel Corp. |
| |
| import argparse |
| import subprocess |
| |
| from flask import Flask |
| |
| 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 |
| ) |
| AVATAR_URL = "https://avatars1.githubusercontent.com/u/13670043?s=200&v=4" |
| header = f'<head><link rel="icon" href="{AVATAR_URL}" /></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 f'<link rel="icon" type="image/png" href="{AVATAR_URL}" />' |
| |
| |
| @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") |