diff --git a/AppImage/components/network-metrics.tsx b/AppImage/components/network-metrics.tsx
index 6f04dd6..d800723 100644
--- a/AppImage/components/network-metrics.tsx
+++ b/AppImage/components/network-metrics.tsx
@@ -56,6 +56,7 @@ interface NetworkInterface {
bond_slaves?: string[]
bond_active_slave?: string | null
bridge_members?: string[]
+ bridge_physical_interface?: string
packet_loss_in?: number
packet_loss_out?: number
vmid?: number
@@ -358,21 +359,26 @@ export function NetworkMetrics() {
className="flex flex-col gap-3 p-4 rounded-lg border border-border bg-card/50 hover:bg-card/80 transition-colors cursor-pointer"
onClick={() => setSelectedInterface(interface_)}
>
- {/* First row: Icon, Name, Type Badge, Status */}
+ {/* First row: Icon, Name, Type Badge, Physical Interface, Status */}
-
+
{interface_.name}
{typeBadge.label}
+ {interface_.bridge_physical_interface && (
+
+ → {interface_.bridge_physical_interface}
+
+ )}
{interface_.status.toUpperCase()}
@@ -422,88 +428,6 @@ export function NetworkMetrics() {
)}
- {/* Network Interfaces */}
-
-
-
-
- Network Interfaces
-
-
-
-
- {networkData.interfaces.map((interface_, index) => {
- const typeBadge = getInterfaceTypeBadge(interface_.type)
-
- return (
-
setSelectedInterface(interface_)}
- >
- {/* First row: Icon, Name, Type Badge, Status */}
-
-
-
-
{interface_.name}
-
- {typeBadge.label}
-
-
-
- {interface_.status.toUpperCase()}
-
-
-
- {/* Second row: Details - Responsive layout */}
-
-
-
IP Address
-
- {interface_.addresses.length > 0 ? interface_.addresses[0].ip : "N/A"}
-
-
-
-
-
Speed
-
-
- {formatSpeed(interface_.speed)}
-
-
-
-
-
Traffic
-
- ↓ {formatBytes(interface_.bytes_recv)}
- {" / "}
- ↑ {formatBytes(interface_.bytes_sent)}
-
-
-
- {interface_.mac_address && (
-
-
MAC
-
- {interface_.mac_address}
-
-
- )}
-
-
- )
- })}
-
-
-
-
{networkData.vm_lxc_interfaces && networkData.vm_lxc_interfaces.length > 0 && (
@@ -554,7 +478,7 @@ export function NetworkMetrics() {
VMID
-
{interface_.vmid ?? "N/A"}
+
{interface_.vmid ?? "N/A"}
@@ -617,6 +541,27 @@ export function NetworkMetrics() {
{getInterfaceTypeBadge(selectedInterface.type).label}
+ {selectedInterface.type === "bridge" && selectedInterface.bridge_physical_interface && (
+
+
Physical Interface
+
+ {selectedInterface.bridge_physical_interface}
+
+
+ )}
+ {selectedInterface.type === "vm_lxc" && selectedInterface.vm_name && (
+
+
VM/LXC Name
+
+ {selectedInterface.vm_name}
+ {selectedInterface.vm_type && (
+
+ {getVMTypeBadge(selectedInterface.vm_type).label}
+
+ )}
+
+
+ )}
Status
Bridge Configuration
-
Member Interfaces
+
Virtual Member Interfaces
{selectedInterface.bridge_members.length > 0 ? (
- selectedInterface.bridge_members.map((member, idx) => (
-
- {member}
-
- ))
+ selectedInterface.bridge_members
+ .filter((member) => !member.startsWith(("enp", "eth", "eno", "ens", "wlan", "wlp")))
+ .map((member, idx) => (
+
+ {member}
+
+ ))
) : (
-
No members
+
No virtual members
)}
diff --git a/AppImage/scripts/flask_server.py b/AppImage/scripts/flask_server.py
index 0dec1e0..52eef08 100644
--- a/AppImage/scripts/flask_server.py
+++ b/AppImage/scripts/flask_server.py
@@ -985,7 +985,8 @@ def get_bond_info(bond_name):
def get_bridge_info(bridge_name):
"""Get detailed information about a bridge interface"""
bridge_info = {
- 'members': []
+ 'members': [],
+ 'physical_interface': None
}
try:
@@ -994,6 +995,13 @@ def get_bridge_info(bridge_name):
if os.path.exists(brif_path):
members = os.listdir(brif_path)
bridge_info['members'] = members
+
+ for member in members:
+ if member.startswith(('enp', 'eth', 'eno', 'ens', 'wlan', 'wlp')):
+ bridge_info['physical_interface'] = member
+ print(f"[v0] Bridge {bridge_name} physical interface: {member}")
+ break
+
print(f"[v0] Bridge {bridge_name} members: {members}")
except Exception as e:
print(f"[v0] Error reading bridge info for {bridge_name}: {e}")
@@ -1120,6 +1128,7 @@ def get_network_info():
if interface_type == 'bridge':
bridge_info = get_bridge_info(interface_name)
interface_info['bridge_members'] = bridge_info['members']
+ interface_info['bridge_physical_interface'] = bridge_info['physical_interface']
if interface_type == 'vm_lxc':
network_data['vm_lxc_interfaces'].append(interface_info)