blob: fa2396d84f745dea48e5567cfa2fe129f0cb2fa2 [file] [log] [blame]
James Feist7248e962020-09-10 11:10:47 -07001#!/usr/bin/python3
2
3# SPDX-License-Identifier: Apache-2.0
4# Copyright 2020 Intel Corp.
5
6import subprocess
7from flask import Flask
8from flask import send_file
9import argparse
10
11REPLACE_CHAR = '~'
12
13app = Flask(__name__)
14
15parser = argparse.ArgumentParser(description='Remote DBus Viewer')
16parser.add_argument('-u', '--username', default='root')
17parser.add_argument('-p', '--password', default='0penBmc')
18parser.add_argument('-a', '--address', required=True)
19parser.add_argument('-x', '--port', required=True)
20args = parser.parse_args()
21
22busctl = 'sshpass -p {} busctl -H {}@{} '.format(
23 args.password, args.username, args.address)
24header = '<head><link rel="icon" href="https://avatars1.githubusercontent.com/u/13670043?s=200&v=4" /></head>'
25
26
27def getBusNames():
28 out = subprocess.check_output(busctl + 'list --acquired', shell=True)
29 out = out.split(b'\n')
30 out = out[1:]
31 names = []
32 for line in out:
33 name = line.split(b' ')[0]
34 if name:
35 names.append(name.decode())
36 return names
37
38
39def doTree(busname):
40 out = subprocess.check_output(busctl + 'tree ' + busname, shell=True)
41 out = out.split(b'\n')
42 tree = []
43 for line in out:
44 path = line.split(b'/', 1)[-1].decode()
45 path = '/' + path
46 tree.append(path)
47 return tree
48
49
50def doIntrospect(busname, path):
51 out = subprocess.check_output(
52 busctl + 'introspect {} {}'.format(busname, path), shell=True)
53 return out.decode().split('\n')
54
55
56@app.route('/')
57def root():
58 out = header
59 out += '<div><H2>Bus Names {}</H2></div>'.format(args.address)
60 for name in getBusNames():
61 out += '<div> '
62 out += '<a href="{}"> {} </a>'.format(name, name)
63 out += '</div>'
64 return out
65
66
67@app.route('/favicon.ico')
68def favicon():
69 return '<link rel="icon" type="image/png" href="https://avatars1.githubusercontent.com/u/13670043?s=200&v=4" />'
70
71
72@app.route('/<name>')
73def busname(name):
74 out = header
75 out += '<div><H2>tree {}</H2></div>'.format(name)
76 for path in doTree(name):
77 out += '<div> '
78 out += '<a href="{}/{}"> {} </a>'.format(
79 name, path.replace('/', REPLACE_CHAR), path)
80 out += '</div>'
81 return out
82
83
84@app.route('/<name>/<path>')
85def path(name, path):
86 path = path.replace(REPLACE_CHAR, '/')
87 out = header
88 out += '<div><H2>introspect {} {}</H2></div>'.format(name, path)
89 for line in doIntrospect(name, path):
90 out += '<div> '
91 out += '<pre> {} </pre>'.format(line)
92 out += '</div>'
93 return out
94
95
96app.run(port=args.port, host='0.0.0.0')