/* 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 };