/* jshint esversion: 2024, module: true */
import { Utils } from "./utils.js";
/**
* Static Interface Renderer for displaying network interfaces
* @class InterfaceRenderer
*/
class InterfaceRenderer {
/**
* Render interface tabs
* @static
* @param {Array} interfaces - Array of interface objects
* @param {Object} currentInterface - Current interface object
* @returns {string} HTML string
*/
static renderInterfaceTabs(interfaces, currentInterface) {
if (!interfaces.length) {
return '
No network interfaces found
';
}
const tabsHTML = interfaces
.map((iface) => {
const state = Utils.getInterfaceState(iface);
const stateClass = Utils.getStateClass(state);
const stateText = Utils.getStateText(iface);
const isActive = iface === currentInterface;
return `
`;
})
.join("");
return `${tabsHTML}
`;
}
/**
* Show detailed interface information
* @static
* @param {Object} iface - Interface object
* @returns {string} HTML string
*/
static showInterfaceDetails(iface) {
const details = [
InterfaceRenderer.renderDetailRow("Link File", iface.LinkFile),
InterfaceRenderer.renderDetailRow("Network File", iface.NetworkFile),
InterfaceRenderer.renderDetailRow(
"State",
iface.State,
Utils.getStateClass(Utils.getInterfaceState(iface)),
),
InterfaceRenderer.renderDetailRow("Online State", iface.OnlineState),
InterfaceRenderer.renderDetailRow("Type", iface.Type),
InterfaceRenderer.renderDetailRow("Path", iface.Path),
InterfaceRenderer.renderDetailRow("Driver", iface.Driver),
InterfaceRenderer.renderDetailRow("Vendor", iface.Vendor),
InterfaceRenderer.renderDetailRow("Model", iface.Model),
InterfaceRenderer.renderDetailRow(
"Hardware Address",
Utils.arrayToMac(iface.HardwareAddress),
),
InterfaceRenderer.renderDetailRow(
"MTU",
iface.MTU
? `${iface.MTU} (min: ${iface.MTUMin ?? "?"}, max: ${iface.MTUMax ?? "?"})`
: "",
),
InterfaceRenderer.renderDetailRow("QDisc", iface.QDisc),
InterfaceRenderer.renderDetailRow(
"IPv6 Address Generation Mode",
iface.IPv6AddressGenerationMode,
),
InterfaceRenderer.renderDetailRow(
"Number of Queues (Tx/Rx)",
iface.Queues
? `${iface.Queues.Tx ?? "?"}/${iface.Queues.Rx ?? "?"}`
: "",
),
InterfaceRenderer.renderDetailRow(
"Auto negotiation",
iface.AutoNegotiation ? "yes" : "no",
),
InterfaceRenderer.renderDetailRow("Speed", iface.Speed),
InterfaceRenderer.renderDetailRow("Duplex", iface.Duplex),
InterfaceRenderer.renderDetailRow("Port", iface.Port),
InterfaceRenderer.renderDetailRow(
"Address",
InterfaceRenderer.renderAddressList(iface.Addresses),
),
InterfaceRenderer.renderDetailRow(
"DNS",
InterfaceRenderer.renderDNSServerList(iface.DNS),
),
InterfaceRenderer.renderDetailRow("NTP", iface.NTP),
InterfaceRenderer.renderDetailRow(
"Activation Policy",
iface.ActivationPolicy,
),
InterfaceRenderer.renderDetailRow(
"Required For Online",
iface.RequiredForOnline ? "yes" : "no",
),
InterfaceRenderer.renderDetailRow("Connected To", iface.ConnectedTo),
InterfaceRenderer.renderDetailRow(
"Offered DHCP leases",
InterfaceRenderer.renderDHCPLeases(iface.DHCPLeases),
),
]
.filter(Boolean)
.join("");
return `${details}
`;
}
/**
* Render a detail row with abbreviations
* @static
* @param {string} label - Row label
* @param {string} value - Row value
* @param {string} [valueClass] - CSS class for value
* @returns {string} HTML string
*/
static renderDetailRow(label, value, valueClass = "") {
if (!value) return "";
const abbreviations = {
MTU: "Maximum Transmission Unit",
QDisc: "Queueing Discipline",
Tx: "Transmit",
Rx: "Receive",
DNS: "Domain Name System",
NTP: "Network Time Protocol",
DHCP: "Dynamic Host Configuration Protocol",
MAC: "Media Access Control",
IP: "Internet Protocol",
IPv6: "Internet Protocol version 6",
};
const abbrLabel = Object.keys(abbreviations).includes(label)
? `${label}`
: label;
return `
${abbrLabel}:
${Utils.sanitizeHTML(value)}
`;
}
/**
* Render address list
* @static
* @param {Array} addresses - Array of addresses
* @returns {string} Formatted addresses
*/
static renderAddressList(addresses) {
if (!addresses?.length) return "";
return addresses
.map((addr) => {
const ip = Utils.ipFromArray(addr);
return ip
? `${Utils.sanitizeHTML(ip)}
`
: "";
})
.join("");
}
/**
* Render DNS server list
* @static
* @param {Array} dnsServers - Array of DNS servers
* @returns {string} Formatted DNS servers
*/
static renderDNSServerList(dnsServers) {
if (!dnsServers?.length) return "";
return dnsServers
.map((dns) => {
const server = Utils.ipFromArray(dns.Address ?? dns);
return server
? `${Utils.sanitizeHTML(server)}
`
: "";
})
.join("");
}
/**
* Render DHCP leases
* @static
* @param {Array} leases - Array of DHCP leases
* @returns {string} Formatted leases
*/
static renderDHCPLeases(leases) {
if (!leases?.length) return "";
return leases
.map((lease) => {
const ip = lease.IP ?? lease;
const to = lease.To ?? lease.MAC ?? "";
return `${Utils.sanitizeHTML(ip)} (to ${Utils.sanitizeHTML(to)})
`;
})
.join("");
}
}
export { InterfaceRenderer };