def spec_dir():
spec_dir = schema_dir() + '/specs' ifnot os.path.isdir(spec_dir): raise Exception(f"Spec directory {spec_dir} does not exist") return spec_dir
class YnlEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, bytes): return bytes.hex(obj) if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj)
def main():
description = """
YNL CLI utility - a general purpose netlink utility that uses YAML
specs to drive protocol encoding and decoding. """
epilog = """
The --multi option can be repeated to include several do operations in the same netlink payload. """
parser = argparse.ArgumentParser(description=description,
epilog=epilog)
spec_group = parser.add_mutually_exclusive_group(required=True)
spec_group.add_argument('--family', dest='family', type=str,
help='name of the netlink FAMILY')
spec_group.add_argument('--list-families', action='store_true',
help='list all netlink families supported by YNL (has spec)')
spec_group.add_argument('--spec', dest='spec', type=str,
help='choose the family by SPEC file path')
def output(msg): if args.output_json:
print(json.dumps(msg, cls=YnlEncoder)) else:
pprint.PrettyPrinter().pprint(msg)
if args.list_families: for filename in sorted(os.listdir(spec_dir())): if filename.endswith('.yaml'):
print(filename.removesuffix('.yaml')) return
if args.no_schema:
args.schema = ''
attrs = {} if args.json_text:
attrs = json.loads(args.json_text)
if args.family:
spec = f"{spec_dir()}/{args.family}.yaml" if args.schema isNoneand spec.startswith(sys_schema_dir):
args.schema = ''# disable schema validation when installed if args.process_unknown isNone:
args.process_unknown = True else:
spec = args.spec ifnot os.path.isfile(spec): raise Exception(f"Spec file {spec} does not exist")
ynl = YnlFamily(spec, args.schema, args.process_unknown,
recv_size=args.dbg_small_recv) if args.dbg_small_recv:
ynl.set_recv_dbg(True)
if args.ntf:
ynl.ntf_subscribe(args.ntf)
if args.list_ops: for op_name, op in ynl.ops.items():
print(op_name, " [", ", ".join(op.modes), "]") if args.list_msgs: for op_name, op in ynl.msgs.items():
print(op_name, " [", ", ".join(op.modes), "]")
try: if args.do:
reply = ynl.do(args.do, attrs, args.flags)
output(reply) if args.dump:
reply = ynl.dump(args.dump, attrs)
output(reply) if args.multi:
ops = [ (item[0], json.loads(item[1]), args.flags or []) for item in args.multi ]
reply = ynl.do_multi(ops)
output(reply)
if args.ntf: for msg in ynl.poll_ntf(duration=args.duration):
output(msg) except NlError as e:
print(e)
exit(1) except KeyboardInterrupt: pass except BrokenPipeError: pass
if __name__ == "__main__":
main()
Messung V0.5
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.