-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathkeydb.py
More file actions
executable file
·172 lines (145 loc) · 6.54 KB
/
Copy pathkeydb.py
File metadata and controls
executable file
·172 lines (145 loc) · 6.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/usr/bin/env python3
"""
SupportProxy key database management.
"""
import argparse
import sys
import conntdb_lib
import keydb_lib
from keydb_lib import CLIError, FLAG_NAMES
def _expect(args, n, usage):
if len(args) != n:
raise CLIError("Usage: %s" % usage)
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--keydb", default="keys.tdb",
help="key database tdb filename")
parser.add_argument("action", default=None,
choices=['list', 'convert', 'add', 'remove',
'setname', 'setpass', 'setport1',
'initialise', 'resettimestamp',
'setflag', 'clearflag', 'flags',
'setretention',
'setsysid',
'stats'],
help="action to perform")
parser.add_argument("args", default=[], nargs=argparse.REMAINDER)
args = parser.parse_args()
if args.action == "initialise":
keydb_lib.init_db(args.keydb)
print("Database %s initialised" % args.keydb)
return 0
try:
db = keydb_lib.open_db(args.keydb)
except FileNotFoundError:
print("%s not found, you need to use 'keydb.py initialise' "
"to initialise the database" % args.keydb)
return 1
db.transaction_start()
try:
if args.action == "convert":
count = keydb_lib.convert_db(db)
print("Converted %u records" % count)
elif args.action == "list":
for ke in keydb_lib.list_entries(db):
print(str(ke))
elif args.action == "add":
_expect(args.args, 4, "keydb.py add PORT1 PORT2 NAME PASSPHRASE")
ke = keydb_lib.add_entry(db, int(args.args[0]), int(args.args[1]),
args.args[2], args.args[3])
print("Added %s" % ke)
elif args.action == "remove":
_expect(args.args, 1, "keydb.py remove PORT2")
ke = keydb_lib.remove_entry(db, int(args.args[0]))
print("Removed %s" % ke)
elif args.action == "setname":
_expect(args.args, 2, "keydb.py setname PORT2 NAME")
ke = keydb_lib.set_name(db, int(args.args[0]), args.args[1])
print("Set name for %s" % ke)
elif args.action == "setpass":
_expect(args.args, 2, "keydb.py setpass PORT2 PASSPHRASE")
ke = keydb_lib.set_pass(db, int(args.args[0]), args.args[1])
print("Set passphrase for %s" % ke)
elif args.action == "setport1":
_expect(args.args, 2, "keydb.py setport1 PORT2 PORT1")
ke = keydb_lib.set_port1(db, int(args.args[0]), int(args.args[1]))
print("Set port1 for %s" % ke)
elif args.action == "resettimestamp":
_expect(args.args, 1, "keydb.py resettimestamp PORT2")
ke = keydb_lib.reset_timestamp(db, int(args.args[0]))
print("Reset timestamp for %s" % ke)
elif args.action == "setflag":
_expect(args.args, 2, "keydb.py setflag PORT2 FLAG (known: %s)"
% ', '.join(sorted(FLAG_NAMES)))
ke = keydb_lib.set_flag(db, int(args.args[0]), args.args[1])
print("Set flag %s for %s" % (args.args[1], ke))
elif args.action == "clearflag":
_expect(args.args, 2, "keydb.py clearflag PORT2 FLAG")
ke = keydb_lib.clear_flag(db, int(args.args[0]), args.args[1])
print("Cleared flag %s for %s" % (args.args[1], ke))
elif args.action == "flags":
_expect(args.args, 1, "keydb.py flags PORT2")
port2 = int(args.args[0])
ke = keydb_lib.KeyEntry(port2)
if not ke.fetch(db):
raise CLIError("No entry for port2 %d" % port2)
on = ke.flag_names()
print("flags=0x%x %s" % (ke.flags, ','.join(on) if on else '(none)'))
elif args.action == "setretention":
_expect(args.args, 2,
"keydb.py setretention PORT2 DAYS "
"(float; 0 = keep forever)")
try:
days = float(args.args[1])
except ValueError:
raise CLIError("retention DAYS must be a number, got %r"
% args.args[1])
ke = keydb_lib.set_log_retention(db, int(args.args[0]), days)
if days == 0.0:
print("Set log retention=0 (keep forever) for %s" % ke)
else:
print("Set log retention=%.4g days for %s" % (days, ke))
elif args.action == "setsysid":
_expect(args.args, 2,
"keydb.py setsysid PORT2 SYSID "
"(0 = match any, 1..255 = filter to that MAVLink sysid)")
try:
sysid = int(args.args[1])
except ValueError:
raise CLIError("SYSID must be an integer, got %r"
% args.args[1])
ke = keydb_lib.set_fc_sysid(db, int(args.args[0]), sysid)
if sysid == 0:
print("Cleared fc_sysid (match any) for %s" % ke)
else:
print("Set fc_sysid=%u for %s" % (sysid, ke))
elif args.action == "stats":
# Live-connection stats from connections.tdb (sibling of
# keys.tdb), joined with each entry's name from this DB.
entries = {ke.port2: ke for ke in keydb_lib.list_entries(db)}
conn_path = conntdb_lib.conn_path_for(args.keydb)
active = conntdb_lib.list_active(conn_path)
if not active:
print("(no active connections)")
else:
for c in active:
ke = entries.get(c.port2)
if ke is not None:
label = "%d/%d '%s'" % (ke.port1, ke.port2, ke.name)
else:
label = "?/%d" % c.port2
side = 'user' if c.is_user else 'eng#%d' % c.conn_index
print("%s %s %s peer=%s uptime=%ds rx=%u tx=%u"
% (label, side, c.transport_name, c.peer,
c.uptime_s(), c.rx_msgs, c.tx_msgs))
else:
raise CLIError("Unknown action: %s" % args.action)
except CLIError as e:
print(str(e))
db.transaction_cancel()
return 1
db.transaction_prepare_commit()
db.transaction_commit()
return 0
if __name__ == '__main__':
sys.exit(main())