From f5ac194008490452f76c781f936fd399e20c6e81 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 5 Oct 2025 11:48:32 +0200 Subject: [PATCH] Update AppImage --- AppImage/components/network-metrics.tsx | 143 ++++++++---------------- AppImage/scripts/flask_server.py | 11 +- 2 files changed, 55 insertions(+), 99 deletions(-) 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)