From 4dcd4d699dc296495121233dbce92c3973d4ae23 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Wed, 11 Sep 2024 15:28:21 +0800 Subject: [PATCH 1/3] feat: support -o/--oneline --- src/ip.py | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/ip.py b/src/ip.py index cf104dc..471c2c0 100755 --- a/src/ip.py +++ b/src/ip.py @@ -70,9 +70,9 @@ def parse_ifconfig(res, af, address): (local, peer, prefixlen) = re.findall( r"inet6 ([\da-f:]*:[\da-f:]+)%*\w*(?: --> ([\da-f:]*:[\da-f:]+)%*\w*)? prefixlen (\d+)", r)[0] addr = { - "family": "inet6", - "local": local, - "prefixlen": int(prefixlen) + "family": "inet6", + "local": local, + "prefixlen": int(prefixlen), } if peer: addr["address"] = peer @@ -90,7 +90,7 @@ def parse_ifconfig(res, af, address): return links -def link_addr_show(argv, af, json_print, pretty_json, address): +def link_addr_show(argv, af, json_print, pretty_json, address, oneline=False): if len(argv) > 0 and argv[0] == "dev": argv.pop(0) if len(argv) > 0: @@ -112,25 +112,26 @@ def link_addr_show(argv, af, json_print, pretty_json, address): if json_print: return json_dump(links, pretty_json) - + sep = "\\" if oneline else "\n" for l in links: - print("%d: %s: <%s> mtu %d status %s" % ( + mtu_status = "%d: %s: <%s> mtu %d status %s" % ( l["ifindex"], l["ifname"], ",".join(l["flags"]), l["mtu"], l["operstate"] - )) - print( + ) + link_info = ( " link/" + l["link_type"] + ((" " + l["address"]) if "address" in l else "") + ((" brd " + l["broadcast"]) if "broadcast" in l else "") ) + items = [mtu_status, link_info] for a in l.get("addr_info", []): - print( + items.append( " %s %s" % (a["family"], a["local"]) + ((" peer %s" % a["address"]) if "address" in a else "") + "/%d" % (a["prefixlen"]) + ((" brd " + a["broadcast"]) if "broadcast" in a else "") ) - + print(sep.join(items)) return True @@ -181,7 +182,7 @@ def do_help_neigh(): # Route Module @help_msg(do_help_route) -def do_route(argv, af, json_print, pretty_json): +def do_route(argv, af, json_print, pretty_json, oneline=False): if not argv or ( any_startswith(["show", "lst", "list"], argv[0]) and len(argv) == 1 ): @@ -392,13 +393,13 @@ def do_route_get(argv, af, json_print, pretty_json): # Addr Module @help_msg(do_help_addr) -def do_addr(argv, af, json_print, pretty_json): +def do_addr(argv, af, json_print, pretty_json, oneline=False): if not argv: argv.append("show") if any_startswith(["show", "lst", "list"], argv[0]): argv.pop(0) - return do_addr_show(argv, af, json_print, pretty_json) + return do_addr_show(argv, af, json_print, pretty_json, oneline) elif "add".startswith(argv[0]) and len(argv) >= 3: argv.pop(0) return do_addr_add(argv, af) @@ -410,8 +411,8 @@ def do_addr(argv, af, json_print, pretty_json): return True -def do_addr_show(argv, af, json_print, pretty_json): - return link_addr_show(argv, af, json_print, pretty_json, True) +def do_addr_show(argv, af, json_print, pretty_json, oneline=False): + return link_addr_show(argv, af, json_print, pretty_json, True, oneline) def do_addr_add(argv, af): @@ -464,13 +465,13 @@ def do_addr_del(argv, af): # Link module @help_msg(do_help_link) -def do_link(argv, af, json_print, pretty_json): +def do_link(argv, af, json_print, pretty_json, oneline=False): if not argv: argv.append("show") if any_startswith(["show", "lst", "list"], argv[0]): argv.pop(0) - return do_link_show(argv, af, json_print, pretty_json) + return do_link_show(argv, af, json_print, pretty_json, oneline) elif "set".startswith(argv[0]): argv.pop(0) return do_link_set(argv, af) @@ -479,8 +480,8 @@ def do_link(argv, af, json_print, pretty_json): return True -def do_link_show(argv, af, json_print, pretty_json): - return link_addr_show(argv, af, json_print, pretty_json, False) +def do_link_show(argv, af, json_print, pretty_json, oneline=False): + return link_addr_show(argv, af, json_print, pretty_json, False, oneline) def do_link_set(argv, af): @@ -533,7 +534,7 @@ def do_link_set(argv, af): # Neigh module @help_msg(do_help_neigh) -def do_neigh(argv, af, json_print, pretty_json): +def do_neigh(argv, af, json_print, pretty_json, oneline=False): if not argv: argv.append("show") @@ -673,10 +674,12 @@ def main(argv): af = -1 # default / both json_print = False pretty_json = False + oneline = False while argv and argv[0].startswith("-"): # Turn --opt into -opt - argv[0] = argv[0][1 if argv[0][1] == '-' else 0:] + if argv[0][1] == "-": + argv[0] = argv[0][1:] # Process options if argv[0] == "-6": af = 6 @@ -694,6 +697,9 @@ def main(argv): elif "-pretty".startswith(argv[0]): pretty_json = True argv.pop(0) + elif "-oneline".startswith(argv[0]): + oneline = True + argv.pop(0) elif "-Version".startswith(argv[0]): print("iproute2mac, v" + VERSION) exit(0) @@ -711,7 +717,7 @@ def main(argv): argv.pop(0) # Functions return true or terminate with exit(255) # See help_msg and do_help* - return cmd_func(argv, af, json_print, pretty_json) + return cmd_func(argv, af, json_print, pretty_json, oneline) perror('Object "{}" is unknown, try "ip help".'.format(argv[0])) exit(1) From 7fdf094b814b5323ce1edc880183d1534ef58da4 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 15 Sep 2025 22:50:42 +0800 Subject: [PATCH 2/3] Revert unnecessary refactor --- src/ip.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ip.py b/src/ip.py index 471c2c0..5ae1040 100755 --- a/src/ip.py +++ b/src/ip.py @@ -678,8 +678,7 @@ def main(argv): while argv and argv[0].startswith("-"): # Turn --opt into -opt - if argv[0][1] == "-": - argv[0] = argv[0][1:] + argv[0] = argv[0][1 if argv[0][1] == '-' else 0:] # Process options if argv[0] == "-6": af = 6 From 385071b038a0f407f0ef4fbd5eb45f8b6c8d9896 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 15 Sep 2025 23:24:16 +0800 Subject: [PATCH 3/3] Add oneline argument to bridge --- src/bridge.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/bridge.py b/src/bridge.py index 1aa66bb..63259e8 100755 --- a/src/bridge.py +++ b/src/bridge.py @@ -94,10 +94,10 @@ def parse_ifconfig(res): # Help -def do_help(argv=None, json_print=None, pretty_json=None, color=None): +def do_help(argv=None, json_print=None, pretty_json=None, color=None, oneline=None): perror("Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }") perror("where OBJECT := { link }") - perror(" OPTIONS := { -V[ersion] | -j[son] | -p[retty] | -c[olor] }") + perror(" OPTIONS := { -V[ersion] | -j[son] | -p[retty] | -c[olor] | -o[neline] }") perror(HELP_ADDENDUM) exit(255) @@ -109,13 +109,13 @@ def do_help_link(): # Link module @help_msg(do_help_link) -def do_link(argv, json_print, pretty_json, color): +def do_link(argv, json_print, pretty_json, color, oneline): if not argv: argv.append("show") if any_startswith(["show", "lst", "list"], argv[0]): argv.pop(0) - return do_link_show(argv, json_print, pretty_json, color) + return do_link_show(argv, json_print, pretty_json, color, oneline) elif "set".startswith(argv[0]): argv.pop(0) return do_link_set(argv) @@ -124,7 +124,7 @@ def do_link(argv, json_print, pretty_json, color): return True -def do_link_show(argv, json_print, pretty_json, color): +def do_link_show(argv, json_print, pretty_json, color, oneline): if len(argv) > 1: if argv[0] != "dev": return False @@ -166,9 +166,8 @@ def do_link_show(argv, json_print, pretty_json, color): if json_print: return json_dump(bridges, pretty_json) - - for b in bridges: - print("%d: %s: <%s> mtu %d master %s state %s priority %d cost %d" % ( + infos = [ + "%d: %s: <%s> mtu %d master %s state %s priority %d cost %d" % ( b["ifindex"], colorize_ifname(color, b["ifname"]), ",".join(b["flags"]), @@ -177,8 +176,14 @@ def do_link_show(argv, json_print, pretty_json, color): b["state"], b["priority"], b["cost"] - )) - + ) + for b in bridges + ] + if oneline: + print("\\".join(infos)) + else: + for info in infos: + print(info) return True