/* jshint esversion: 2024, module: true */ import { Utils } from './utils.js'; import { InterfaceState } from './enums.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 };