UNPKG

vodafone-station-cli

Version:

Access your Vodafone Station from the comfort of the command line.

97 lines (96 loc) 3.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ModemDiscovery = void 0; exports.discoverModemLocation = discoverModemLocation; const tslib_1 = require("tslib"); const axios_1 = tslib_1.__importDefault(require("axios")); const html_parser_1 = require("./tools/html-parser"); // Default IP addresses - can be overridden via CLI flags or environment variables const DEFAULT_BRIDGED_MODEM_IP = '192.168.100.1'; const DEFAULT_ROUTER_IP = '192.168.0.1'; axios_1.default.defaults.timeout = 10_000; async function discoverModemLocation(options = {}) { let defaultIps = [DEFAULT_BRIDGED_MODEM_IP, DEFAULT_ROUTER_IP]; // If specific IP is provided, only try that IP if (options.ip) { defaultIps = [options.ip]; } try { const headRequests = []; for (const ip of defaultIps) { headRequests.push(axios_1.default.head(`http://${ip}`), axios_1.default.head(`https://${ip}`)); } const results = await Promise.allSettled(headRequests); const maybeResult = results.find(result => result.status === 'fulfilled'); if (maybeResult?.value.request?.host) { console.warn('maybeResult'); console.warn(maybeResult); return { ipAddress: maybeResult?.value.request?.host, protocol: maybeResult?.value.request?.protocol.replace(':', ''), }; } throw new Error('Could not find a router/modem under the known addresses.'); } catch (error) { console.error('Could not find a router/modem under the known addresses.'); throw error; } } class ModemDiscovery { modemLocation; logger; constructor(modemLocation, logger) { this.modemLocation = modemLocation; this.logger = logger; } async discover() { try { const maybeModem = await Promise.any([ this.tryArris(), this.tryTechnicolor(), ]); if (!maybeModem) { throw new Error('Modem discovery was unsuccessful'); } return maybeModem; } catch (error) { this.logger.warn('Could not find a router/modem under the known addresses'); throw error; } } async tryArris() { const { ipAddress, protocol } = this.modemLocation; const { data } = await axios_1.default.get(`${protocol}://${ipAddress}/index.php`, { headers: { Accept: 'text/html,application/xhtml+xml,application/xml', }, }); const firmwareVersion = (0, html_parser_1.extractFirmwareVersion)(data); if (!firmwareVersion) { throw new Error('Unable to parse firmware version.'); } return { deviceType: 'Arris', firmwareVersion, ipAddress, protocol, }; } async tryTechnicolor() { const { ipAddress, protocol } = this.modemLocation; const { data } = await axios_1.default.get(`${protocol}://${ipAddress}/api/v1/login_conf`); this.logger.debug(`Technicolor login configuration: ${JSON.stringify(data)}`); if (data.error === 'ok' && data.data?.firmwareversion) { return { deviceType: 'Technicolor', firmwareVersion: data.data.firmwareversion, ipAddress, protocol, }; } throw new Error('Could not determine modem type'); } } exports.ModemDiscovery = ModemDiscovery;