vodafone-station-cli
Version:
Access your Vodafone Station from the comfort of the command line.
95 lines (94 loc) • 3.51 kB
JavaScript
;
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) {
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;