1 #!/usr/bin/env python3 2 # SPDX-License-Identifier: GPL-2.0 OR BSD-3-Cl 3 4 import argparse 5 import json 6 import pprint 7 import time 8 9 from lib import YnlFamily, Netlink, NlError 10 11 12 class YnlEncoder(json.JSONEncoder): 13 def default(self, obj): 14 if isinstance(obj, bytes): 15 return bytes.hex(obj) 16 if isinstance(obj, set): 17 return list(obj) 18 return json.JSONEncoder.default(self, 19 20 21 def main(): 22 description = """ 23 YNL CLI utility - a general purpose netlin 24 specs to drive protocol encoding and decod 25 """ 26 epilog = """ 27 The --multi option can be repeated to incl 28 in the same netlink payload. 29 """ 30 31 parser = argparse.ArgumentParser(descripti 32 epilog=ep 33 parser.add_argument('--spec', dest='spec', 34 parser.add_argument('--schema', dest='sche 35 parser.add_argument('--no-schema', action= 36 parser.add_argument('--json', dest='json_t 37 38 group = parser.add_mutually_exclusive_grou 39 group.add_argument('--do', dest='do', meta 40 group.add_argument('--multi', dest='multi' 41 metavar=('DO-OPERATION' 42 group.add_argument('--dump', dest='dump', 43 group.add_argument('--list-ops', action='s 44 group.add_argument('--list-msgs', action=' 45 46 parser.add_argument('--sleep', dest='sleep 47 parser.add_argument('--subscribe', dest='n 48 parser.add_argument('--replace', dest='fla 49 const=Netlink.NLM_F_RE 50 parser.add_argument('--excl', dest='flags' 51 const=Netlink.NLM_F_EX 52 parser.add_argument('--create', dest='flag 53 const=Netlink.NLM_F_CR 54 parser.add_argument('--append', dest='flag 55 const=Netlink.NLM_F_AP 56 parser.add_argument('--process-unknown', a 57 parser.add_argument('--output-json', actio 58 parser.add_argument('--dbg-small-recv', de 59 action='store', nargs= 60 args = parser.parse_args() 61 62 def output(msg): 63 if args.output_json: 64 print(json.dumps(msg, cls=YnlEncod 65 else: 66 pprint.PrettyPrinter().pprint(msg) 67 68 if args.no_schema: 69 args.schema = '' 70 71 attrs = {} 72 if args.json_text: 73 attrs = json.loads(args.json_text) 74 75 ynl = YnlFamily(args.spec, args.schema, ar 76 recv_size=args.dbg_small_r 77 if args.dbg_small_recv: 78 ynl.set_recv_dbg(True) 79 80 if args.ntf: 81 ynl.ntf_subscribe(args.ntf) 82 83 if args.sleep: 84 time.sleep(args.sleep) 85 86 if args.list_ops: 87 for op_name, op in ynl.ops.items(): 88 print(op_name, " [", ", ".join(op. 89 if args.list_msgs: 90 for op_name, op in ynl.msgs.items(): 91 print(op_name, " [", ", ".join(op. 92 93 try: 94 if args.do: 95 reply = ynl.do(args.do, attrs, arg 96 output(reply) 97 if args.dump: 98 reply = ynl.dump(args.dump, attrs) 99 output(reply) 100 if args.multi: 101 ops = [ (item[0], json.loads(item[ 102 reply = ynl.do_multi(ops) 103 output(reply) 104 except NlError as e: 105 print(e) 106 exit(1) 107 108 if args.ntf: 109 ynl.check_ntf() 110 output(ynl.async_msg_queue) 111 112 113 if __name__ == "__main__": 114 main()
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.