|
|
@@ -7001,89 +7001,340 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <!-- ================= MODAL: BGP PEER ================= -->
|
|
|
+ <!-- ================= MODAL: BGP CONNECTION (RouterOS v7 Style) ================= -->
|
|
|
<div id="bgp-peer-modal" class="fixed inset-0 bg-slate-950/80 backdrop-blur-sm z-50 hidden flex items-center justify-center p-4">
|
|
|
- <div class="bg-slate-900 border border-slate-800 rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden animate-in">
|
|
|
- <div class="px-6 py-4 border-b border-slate-800 flex items-center justify-between bg-slate-950/40">
|
|
|
- <div>
|
|
|
- <h3 id="bgp-peer-modal-title" class="text-sm font-bold text-white">Add BGP Peer Connection</h3>
|
|
|
- <p class="text-[11px] text-slate-400">Establish eBGP / iBGP session with remote router</p>
|
|
|
- </div>
|
|
|
- <button onclick="closeBgpPeerModal()" class="text-slate-400 hover:text-white p-1 rounded-lg">✕</button>
|
|
|
+ <div class="bg-slate-900 border border-slate-800 rounded-2xl w-full max-w-4xl shadow-2xl overflow-hidden animate-in flex flex-col max-h-[90vh]">
|
|
|
+ <!-- Header -->
|
|
|
+ <div class="px-6 py-3.5 border-b border-slate-800 flex items-center justify-between bg-slate-950/60">
|
|
|
+ <div class="flex items-center gap-2.5">
|
|
|
+ <span class="text-cyan-400 text-sm">🔀</span>
|
|
|
+ <span class="text-xs font-semibold text-slate-400">BGP Connection ></span>
|
|
|
+ <span id="bgp-peer-modal-title" class="text-xs font-bold text-cyan-300 font-mono">New...</span>
|
|
|
+ </div>
|
|
|
+ <button type="button" onclick="closeBgpPeerModal()" class="text-slate-400 hover:text-white p-1 rounded-lg">✕</button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Tab Navigation -->
|
|
|
+ <div class="flex border-b border-slate-800 bg-slate-950/30 px-6 gap-2">
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-general" onclick="switchBgpPeerModalTab('general')" class="px-4 py-2 text-xs font-bold border-b-2 border-cyan-500 text-white transition">General</button>
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-extra" onclick="switchBgpPeerModalTab('extra')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Extra</button>
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-attributes" onclick="switchBgpPeerModalTab('attributes')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Attributes</button>
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-filter" onclick="switchBgpPeerModalTab('filter')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Filter</button>
|
|
|
</div>
|
|
|
- <form id="bgp-peer-form" onsubmit="submitBgpPeer(event)" class="p-6 space-y-4 text-xs">
|
|
|
+
|
|
|
+ <!-- Body Form -->
|
|
|
+ <form id="bgp-peer-form" onsubmit="submitBgpPeer(event)" class="flex-1 overflow-hidden flex flex-col">
|
|
|
<input type="hidden" id="modal-bgp-peer-id">
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Connection Name *</label>
|
|
|
- <input type="text" id="modal-bgp-peer-name" required placeholder="upstream-carrier-a" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
+
|
|
|
+ <div class="flex-1 overflow-y-auto p-6 flex gap-6">
|
|
|
+ <!-- Main Tabs Area -->
|
|
|
+ <div class="flex-1 space-y-4 text-xs">
|
|
|
+
|
|
|
+ <!-- TAB 1: GENERAL -->
|
|
|
+ <div id="bgp-peer-tab-general" class="space-y-3.5">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Enabled</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-enabled" checked class="w-4 h-4 rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="grid grid-cols-2 gap-4">
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Remote Address (IP) *</label>
|
|
|
- <input type="text" id="modal-bgp-peer-remote-addr" required placeholder="192.168.131.1" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Remote AS *</label>
|
|
|
- <input type="number" id="modal-bgp-peer-remote-as" required min="1" max="4294967295" placeholder="65000" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Local AS (Multi-Instance)</label>
|
|
|
- <input type="number" id="modal-bgp-peer-local-as" min="1" max="4294967295" placeholder="Optional (uses global AS if blank)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Comment</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-comment" placeholder="Optional notes" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="grid grid-cols-2 gap-4">
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Local Address (Update Source)</label>
|
|
|
- <input type="text" id="modal-bgp-peer-local-addr" placeholder="Optional source IP/iface" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">MD5 Password (BGP Auth)</label>
|
|
|
- <input type="password" id="modal-bgp-peer-password" placeholder="Optional secret" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Name *</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-name" required placeholder="ebgp-JB172-2" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="grid grid-cols-2 gap-4">
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">In Filter (Routing Filter Chain)</label>
|
|
|
- <input type="text" id="modal-bgp-peer-in-filter" placeholder="e.g. bgp-in" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Filter chain for inbound routes from peer</p>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Out Filter (Routing Filter Chain)</label>
|
|
|
- <input type="text" id="modal-bgp-peer-out-filter" placeholder="e.g. bgp-out" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Filter chain for outbound routes to peer</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">AS (Local AS)</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-local-as" min="1" max="4294967295" placeholder="e.g. 6610 (Multi-Instance Local AS)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Custom Local AS for this BGP session (Multi-Instance). Leave blank to use Global Router AS.</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="grid grid-cols-2 gap-3 p-3 rounded-xl bg-slate-800/40 border border-slate-700/50">
|
|
|
- <label class="flex items-center space-x-2 text-slate-300 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-multihop" class="rounded text-purple-600 bg-slate-800 border-slate-700">
|
|
|
- <span>eBGP Multi-hop</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center space-x-2 text-slate-300 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-nexthop-self" checked class="rounded text-purple-600 bg-slate-800 border-slate-700">
|
|
|
- <span>Next-hop Self</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center space-x-2 text-slate-300 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-passive" class="rounded text-purple-600 bg-slate-800 border-slate-700">
|
|
|
- <span>Passive Mode</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center space-x-2 text-slate-300 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-disabled" class="rounded text-purple-600 bg-slate-800 border-slate-700">
|
|
|
- <span>Disabled (X)</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">AFI</label>
|
|
|
+ <div class="col-span-2 flex items-center gap-4 text-slate-300">
|
|
|
+ <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-afi-ip" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>ip (IPv4)</span>
|
|
|
+ </label>
|
|
|
+ <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-afi-ipv6" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>ipv6</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div>
|
|
|
- <label class="block font-semibold text-slate-300 mb-1.5">Comment</label>
|
|
|
- <input type="text" id="modal-bgp-peer-comment" placeholder="Core transit uplink" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Router ID</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-router-id" placeholder="e.g. 10.42.62.254 (Optional override)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Remote Address *</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-remote-addr" required placeholder="10.2.51.249" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Remote Port</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-remote-port" placeholder="179 (default)" min="1" max="65535" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Remote AS *</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-remote-as" required min="1" max="4294967295" placeholder="17244" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Local Address</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-local-addr" placeholder="e.g. 10.2.51.250" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Local Port</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-local-port" placeholder="Optional bind port" min="1" max="65535" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Local Role</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <select id="modal-bgp-peer-local-role" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <option value="ebgp">ebgp</option>
|
|
|
+ <option value="ibgp">ibgp</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">TCP MD5 Key</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="password" id="modal-bgp-peer-password" placeholder="BGP authentication secret" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Multi-hop</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-multihop" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Enable eBGP Multi-hop</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Session Mode</label>
|
|
|
+ <div class="col-span-2 flex items-center gap-6 text-slate-300">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-connect" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Connect</span>
|
|
|
+ </label>
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-listen" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Listen</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- TAB 2: EXTRA -->
|
|
|
+ <div id="bgp-peer-tab-extra" class="space-y-3.5 hidden">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Hold Time</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-holdtime" placeholder="00:03:00 (180s)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Keepalive Time</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-keepalive" placeholder="00:01:00 (60s)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Routing Table</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <select id="modal-bgp-peer-routing-table" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <option value="main">main</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-start gap-3">
|
|
|
+ <label class="text-slate-400 font-medium pt-1">Output Redistribute</label>
|
|
|
+ <div class="col-span-2 grid grid-cols-2 gap-2 text-slate-300">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-conn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>connected</span>
|
|
|
+ </label>
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-static" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>static</span>
|
|
|
+ </label>
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-ospf" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>ospf</span>
|
|
|
+ </label>
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-bgp" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>bgp</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Default Originate</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-default-orig" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Announce Default Route (0.0.0.0/0)</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- TAB 3: ATTRIBUTES -->
|
|
|
+ <div id="bgp-peer-tab-attributes" class="space-y-3.5 hidden">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Nexthop Choice</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <select id="modal-bgp-peer-nexthop-choice" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <option value="force-self">force-self (Next-hop Self)</option>
|
|
|
+ <option value="default">default</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Default Prepend</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-default-prepend" min="0" max="16" placeholder="0 (none)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Repeat local ASN in AS-PATH to make path less preferred</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Allow AS In</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="number" id="modal-bgp-peer-allow-as-in" min="0" max="10" placeholder="0" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Remove Private AS</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-remove-priv-as" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Strip private AS numbers (64512-65534) from AS-PATH</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">AS Override</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-as-override" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Replace peer AS in AS-PATH</span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- TAB 4: FILTER -->
|
|
|
+ <div id="bgp-peer-tab-filter" class="space-y-4 hidden">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Input Filter</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-in-filter" placeholder="e.g. awmn or bgp-in" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Routing Filter chain applied to incoming routes</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Output Filter</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-out-filter" placeholder="e.g. awmn or bgp-out" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Routing Filter chain applied to outgoing routes</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <hr class="border-slate-800/80 my-3">
|
|
|
+
|
|
|
+ <!-- Output Networks section with [+] and [-] buttons as requested! -->
|
|
|
+ <div>
|
|
|
+ <div class="flex items-center justify-between mb-2">
|
|
|
+ <div>
|
|
|
+ <label class="text-slate-200 font-bold block">Output Networks</label>
|
|
|
+ <p class="text-[10px] text-slate-400">Prefixes/subnets announced to this peer connection</p>
|
|
|
+ </div>
|
|
|
+ <button type="button" onclick="addOutputNetworkRow('')" class="text-xs px-2.5 py-1 bg-cyan-600/30 hover:bg-cyan-600 text-cyan-300 hover:text-white rounded border border-cyan-500/40 font-semibold transition flex items-center gap-1">
|
|
|
+ <span>+</span>
|
|
|
+ <span>Add Network</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div id="modal-bgp-output-networks-container" class="space-y-2 p-3 bg-slate-950/40 border border-slate-800 rounded-xl min-h-[80px]">
|
|
|
+ <!-- Dynamic rows go here -->
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Right Sidebar (RouterOS Actions) -->
|
|
|
+ <div class="w-36 border-l border-slate-800 pl-4 space-y-2 font-sans">
|
|
|
+ <div class="text-[10px] uppercase font-bold text-slate-500 tracking-wider mb-2">Actions</div>
|
|
|
+ <button type="button" onclick="copyCurrentBgpPeer()" class="w-full text-left text-xs px-2.5 py-1.5 rounded-lg text-slate-300 hover:text-white hover:bg-slate-800 transition flex items-center gap-2">
|
|
|
+ <span>📋</span>
|
|
|
+ <span>Copy</span>
|
|
|
+ </button>
|
|
|
+ <button type="button" id="modal-btn-remove-peer" onclick="removeCurrentBgpPeer()" class="w-full text-left text-xs px-2.5 py-1.5 rounded-lg text-rose-400 hover:text-rose-300 hover:bg-rose-950/40 transition flex items-center gap-2">
|
|
|
+ <span>✕</span>
|
|
|
+ <span>Remove</span>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="pt-4 border-t border-slate-800 flex justify-end space-x-3">
|
|
|
- <button type="button" onclick="closeBgpPeerModal()" class="px-4 py-2 rounded-lg text-slate-400 hover:bg-slate-800">Cancel</button>
|
|
|
- <button type="submit" class="px-5 py-2 rounded-lg font-semibold bg-purple-600 hover:bg-purple-500 text-white shadow-lg shadow-purple-500/20">Save Peer</button>
|
|
|
+ <!-- Footer Buttons -->
|
|
|
+ <div class="px-6 py-3.5 border-t border-slate-800 bg-slate-950/60 flex items-center justify-end space-x-2.5">
|
|
|
+ <button type="button" onclick="closeBgpPeerModal()" class="px-4 py-1.5 rounded-lg text-xs font-semibold text-slate-400 hover:bg-slate-800 hover:text-white transition">Cancel</button>
|
|
|
+ <button type="button" onclick="applyBgpPeerModal(event)" class="px-4 py-1.5 rounded-lg text-xs font-semibold bg-slate-800 hover:bg-slate-700 text-cyan-300 border border-slate-700 transition">Apply</button>
|
|
|
+ <button type="submit" class="px-5 py-1.5 rounded-lg text-xs font-semibold bg-cyan-600 hover:bg-cyan-500 text-white shadow-lg shadow-cyan-500/20 transition">OK</button>
|
|
|
</div>
|
|
|
</form>
|
|
|
</div>
|