Network Namespace: list pbr tables/rules/routes
diff --git a/Network-Namespace/network-namespace-wrapper.sh b/Network-Namespace/network-namespace-wrapper.sh
index 3c2f152..8886bd7 100755
--- a/Network-Namespace/network-namespace-wrapper.sh
+++ b/Network-Namespace/network-namespace-wrapper.sh
@@ -2902,6 +2902,47 @@
     fi
 }
 
+_pbr_emit_custom_action_result() {
+    local action="$1"
+    shift
+    local raw_output
+    raw_output="$("$@")"
+
+    RAW_OUTPUT="${raw_output}" python3 - "${action}" << 'PYEOF'
+import json
+import os
+import sys
+
+action = sys.argv[1]
+raw = os.environ.get("RAW_OUTPUT", "")
+rows = [line.rstrip() for line in raw.splitlines() if line.strip()]
+
+if action == "pbr-list-tables":
+    message = []
+    for row in rows:
+        parts = row.split(None, 1)
+        if len(parts) == 2 and parts[0].isdigit():
+            message.append({"id": parts[0], "name": parts[1]})
+        else:
+            # Preserve raw rows that do not match the standard "<id> <name>" format.
+            message.append({"result": row})
+elif action == "pbr-list-routes":
+    message = [{"route": row} for row in rows]
+elif action == "pbr-list-rules":
+    message = [{"rule": row} for row in rows]
+elif rows:
+    message = [{"action": action, "result": row} for row in rows]
+else:
+    message = [{"action": action, "result": "OK"}]
+
+print(json.dumps({
+    "status": "success",
+    "printmessage": "true",
+    "message": message
+}))
+PYEOF
+}
+
 cmd_custom_action() {
     NETWORK_ID=""
     VPC_ID=""
@@ -2973,31 +3014,31 @@
             ls -la "$(_vpc_state_dir)/" 2>/dev/null || echo "(no vpc state)"
             ;;
         pbr-create-table)
-            _pbr_create_table
+            _pbr_emit_custom_action_result "pbr-create-table" _pbr_create_table
             ;;
         pbr-delete-table)
-            _pbr_delete_table
+            _pbr_emit_custom_action_result "pbr-delete-table" _pbr_delete_table
             ;;
         pbr-list-tables)
-            _pbr_list_tables
+            _pbr_emit_custom_action_result "pbr-list-tables" _pbr_list_tables
             ;;
         pbr-add-route)
-            _pbr_add_route
+            _pbr_emit_custom_action_result "pbr-add-route" _pbr_add_route
             ;;
         pbr-delete-route)
-            _pbr_delete_route
+            _pbr_emit_custom_action_result "pbr-delete-route" _pbr_delete_route
             ;;
         pbr-list-routes)
-            _pbr_list_routes
+            _pbr_emit_custom_action_result "pbr-list-routes" _pbr_list_routes
             ;;
         pbr-add-rule)
-            _pbr_add_rule
+            _pbr_emit_custom_action_result "pbr-add-rule" _pbr_add_rule
             ;;
         pbr-delete-rule)
-            _pbr_delete_rule
+            _pbr_emit_custom_action_result "pbr-delete-rule" _pbr_delete_rule
             ;;
         pbr-list-rules)
-            _pbr_list_rules
+            _pbr_emit_custom_action_result "pbr-list-rules" _pbr_list_rules
             ;;
         *)
             local hook="${STATE_DIR}/hooks/custom-action-${ACTION_NAME}.sh"