#!/usr/bin/env python3 """ Patch routes.ts and ServerRouter.tsx to inject addon routes (network tab nav link). This patcher understands Pterodactyl's actual routing structure. """ import sys import os PANEL = '/var/www/pterodactyl' ROUTES_FILE = f'{PANEL}/resources/scripts/routers/routes.ts' SERVER_ROUTER = f'{PANEL}/resources/scripts/routers/ServerRouter.tsx' # ─── 1. Patch routes.ts ─────────────────────────────────────────────────────── print("=== Patching routes.ts ===") content = open(ROUTES_FILE).read() ADDON_IMPORT = "import NetworkTab from '@/addons/advanced-admin/network/NetworkTab';" ADDON_ROUTE = """, { path: '/addon-network', permission: null, name: 'Live Network', component: NetworkTab, }""" patched = False # Add import near top if not present if ADDON_IMPORT not in content: # Insert after last existing import line lines = content.splitlines(keepends=True) last_import = 0 for i, line in enumerate(lines): if line.strip().startswith('import ') or line.strip().startswith('const ') and 'lazy' in line: last_import = i lines.insert(last_import + 1, ADDON_IMPORT + '\n') content = ''.join(lines) print(f" Added import at line {last_import + 2}") else: print(" Import already present") # Add route entry before closing of server array if '/addon-network' not in content: # Find the last route entry (before closing ], server array end) # Insert before the closing ` ],` that ends the server array # The server array ends with the activity route, then ` ],` insert_anchor = " {\n path: '/activity',\n permission: 'activity.*',\n name: 'Activity',\n component: ServerActivityLogContainer," closing = " },\n ],\n} as Routes;" if insert_anchor in content and closing in content: # Find and insert our route before the closing `] as Routes` content = content.replace( " },\n ],\n} as Routes;", f" }},{ADDON_ROUTE},\n ],\n}} as Routes;" ) patched = True print(" Added /addon-network route entry") else: print(" WARNING: Could not find anchor for route insertion") print(" Trying simpler approach...") # Simpler: insert before `] as Routes` if " ],\n} as Routes;" in content: content = content.replace( " ],\n} as Routes;", f"{ADDON_ROUTE},\n ],\n}} as Routes;" ) patched = True print(" Added route entry (simple method)") else: print(" Route already present") patched = True open(ROUTES_FILE, 'w').write(content) print(f" routes.ts saved. Patched={patched}") # ─── 2. Clean up ServerRouter.tsx (remove the broken import we added) ───────── print("\n=== Cleaning ServerRouter.tsx ===") sr_content = open(SERVER_ROUTER).read() bad_import = "import NetworkTab from '@/addons/advanced-admin/network/NetworkTab';\n" if bad_import in sr_content: sr_content = sr_content.replace(bad_import, '') open(SERVER_ROUTER, 'w').write(sr_content) print(" Removed stray NetworkTab import from ServerRouter.tsx") else: print(" ServerRouter.tsx is clean") print("\nDone. Now rebuild the frontend.")