router-toolkit
Version:
A npm module for managing routers and access points
307 lines (306 loc) • 13.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_js_1 = __importDefault(require("crypto-js"));
const axios_1 = __importDefault(require("axios"));
const Utils_1 = require("../Common/Utils");
const convert = __importStar(require("xml-js"));
const Router_1 = __importDefault(require("../Common/Router"));
const vendor_lookup_1 = require("@network-utils/vendor-lookup");
class ZTEv9 extends Router_1.default {
time;
constructor(host, port, username, password) {
super(host, port, username, password);
this.time = Date.now();
}
/**
* Get the authorization cookie.
*
* @returns The cookie in a string format.
*/
async login() {
const first = await axios_1.default.get(`http://${this.host}:${this.port}/?_type=loginData&_tag=login_token&_=${this.time}`);
const cookie = (first.headers['set-cookie'] || [''])[0].split(';')[0];
const loginToken = first.data.split('>')[1].split('<')[0];
const sessToken = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=loginData&_tag=login_entry&_=${this.time}`, {
headers: {
cookie,
},
})).data.sess_token;
const result = await axios_1.default.request({
method: 'POST',
url: `http://${this.host}:${this.port}`,
params: { _type: 'loginData', _tag: 'login_entry' },
headers: {
cookie,
Accept: 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
Connection: 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
Origin: `http://${this.host}:${this.port}`,
Pragma: 'no-cache',
Referer: `http://${this.host}:${this.port}`,
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
},
data: {
action: 'login',
Password: crypto_js_1.default.SHA256(this.password + loginToken),
Username: this.username,
_sessionTOKEN: sessToken,
},
});
const authCookie = (result.headers['set-cookie'] || [''])[1].split('=')[1].split(';')[0];
return authCookie;
}
/**
* Get the Router's SSIDs information.
*
* @returns An object conaining the JSON data.
*
* @example
* ```ts
* [
* {
* enabled: true,
* ssid: 'ZTE_2.4G_NKaehT',
* authMode: 'PSKAuthentication',
* encryption: 'TKIPandAESEncryption',
* hidden: false,
* passkey: 'HsojahudA',
* maxUser: 32
* },
* ]
* ```
*/
async getSSIDs() {
const authCookie = await this.login();
const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data
.split('_sessionTmpToken = "')[1]
.split('"')[0]
.replaceAll('\\x', ''));
const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_sssidconf_lua.lua&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data;
const ssids = [];
const instances = convert.xml2js(res, { compact: true }).ajax_response_xml_root.OBJ_WLANAP_ID.Instance;
for (let i = 0; i < instances.length; i++) {
const password = (await axios_1.default.post(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_sssidconf_lua.lua`, new URLSearchParams({
IF_ACTION: 'GetPassword',
_InstID_PASS: `DEV.WIFI.AP${i + 1}.PSK1`,
PASSTYPE: 'PSK',
_sessionTOKEN: sessToken,
}), {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
Check: crypto_js_1.default.SHA256((0, Utils_1.toQS)({
IF_ACTION: 'GetPassword',
_InstID_PASS: `DEV.WIFI.AP${i + 1}.PSK1`,
PASSTYPE: 'PSK',
_sessionTOKEN: sessToken,
})).toString(),
},
})).data
.split('KeyPassphrase</ParaName><ParaValue>')[1]
.split('</ParaValue>')[0];
ssids.push({
enabled: Number(instances[i].ParaValue[2]._text) === 1,
ssid: instances[i].ParaValue[10]._text,
authMode: instances[i].ParaValue[9]._text,
encryption: instances[i].ParaValue[7]._text,
hidden: Number(instances[i].ParaValue[1]._text) === 1,
passkey: (0, Utils_1.decodePassword)(password, sessToken),
maxUser: Number(instances[i].ParaValue[8]._text),
});
}
return ssids;
}
/**
* Get the Router's WLANs information.
*
* @returns An object conaining the JSON data.
*
* @example
* ```ts
* [
* {
* frequency: '2.4GHz',
* protocol: 'b,g,n',
* channel: 1,
* beaconInterval: 100,
* txPower: 100,
* band: 'Auto',
* enabled: true
* }
* ]
* ```
*/
async getWlans() {
const authCookie = await this.login();
const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data
.split('_sessionTmpToken = "')[1]
.split('"')[0]
.replaceAll('\\x', ''));
console.log(sessToken);
const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_wlanbasicadconf_lua.lua&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data;
const wlans = convert.xml2js(res, { compact: true }).ajax_response_xml_root.OBJ_WLANSETTING_ID.Instance.map((instance, i) => ({
frequency: instance.ParaValue[3]._text,
protocol: instance.ParaValue[4]._text,
channel: Number(instance.ParaValue[5]._text),
beaconInterval: Number(instance.ParaValue[10]._text),
txPower: Number(instance.ParaValue[11]._text.replace('%', '')),
band: instance.ParaValue[15]._text,
enabled: Number(instance.ParaValue[17]._text) === 1,
}));
return wlans;
}
async getHosts() {
const authCookie = await this.login();
const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=mmTopology&Menu3Location=0&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data
.split('_sessionTmpToken = "')[1]
.split('"')[0]
.replaceAll('\\x', ''));
const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=topo_lua.lua&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data;
delete res.ad.MGET_INST_NUM;
const hosts = Object.values(res.ad).map((host) => ({
time: new Date(host.AssocTime * 1000).toISOString().slice(11, 19),
hostname: host.HostName,
ip: host.IpAddr,
mac: host.MacAddr,
vendor: (0, vendor_lookup_1.toVendor)(host.MacAddr),
signal: Number(host.Rssi),
rxMbps: Number(host.RxRateMbps),
txMbps: Number(host.TxRateMbps),
protocol: host.WirelessMode,
}));
return hosts;
}
/**
* Change SSID and Passkey of an Wi-Fi.
*
* @param num - The SSID number from 1 to 7
* @param ssid - The name you want for you SSID
* @param ssid - The password you want for you SSID
* @returns True if successful and false if error
*/
async changeSSID(num, ssid, password) {
const authCookie = await this.login();
const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, {
headers: {
Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`,
},
})).data
.split('_sessionTmpToken = "')[1]
.split('"')[0]
.replaceAll('\\x', ''));
const cryptoKey = (0, Utils_1.randomNum)(16);
const cryptoIv = (0, Utils_1.randomNum)(16);
const data = {
IF_ACTION: 'Apply',
Enable: '1',
_InstID: `DEV.WIFI.AP${num}`,
_WEPCONIG: 'N',
_PSKCONIG: 'Y',
BeaconType: '11i',
WEPAuthMode: 'None',
WPAAuthMode: 'PSKAuthentication',
'11iAuthMode': 'PSKAuthentication',
WPAEncryptType: 'TKIPandAESEncryption',
'11iEncryptType': 'AESEncryption',
_InstID_WEP0: 'DEV.WIFI.AP5.WEP1',
_InstID_WEP1: 'DEV.WIFI.AP5.WEP2',
_InstID_WEP2: 'DEV.WIFI.AP5.WEP3',
_InstID_WEP3: 'DEV.WIFI.AP5.WEP4',
_InstID_PSK: 'DEV.WIFI.AP5.PSK1',
MasterAuthServerIp: '...',
_InstID_GUEST: '',
_GUEST: 'N',
GuestWifi: '',
ESSID: ssid,
ESSIDHideEnable: '0',
EncryptionType: 'WPA2-PSK-AES',
KeyPassphrase: (0, Utils_1.encodePassword)(password, cryptoKey, cryptoIv),
WEPKeyIndex: '1',
ShowWEPKey: '0',
WEPKey00: (0, Utils_1.encodePassword)('1111', cryptoKey, cryptoIv),
WEPKey01: (0, Utils_1.encodePassword)('2222', cryptoKey, cryptoIv),
WEPKey02: (0, Utils_1.encodePassword)('3333', cryptoKey, cryptoIv),
WEPKey03: (0, Utils_1.encodePassword)('4444', cryptoKey, cryptoIv),
VapIsolationEnable: '0',
MaxUserNum: '32',
Btn_cancel_WLANSSIDConf: '',
Btn_apply_WLANSSIDConf: '',
encode: (0, Utils_1.encodeKey)(cryptoKey, cryptoIv),
_sessionTOKEN: sessToken,
};
const encodedData = new URLSearchParams(data);
const options = {
headers: {
Accept: '*/*',
'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
Check: (0, Utils_1.asyEncode)(crypto_js_1.default.SHA256((0, Utils_1.toQS)(data)).toString()),
Connection: 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
Cookie: `_TESTCOOKIESUPPORT=1; SID=${authCookie}`,
Origin: `http://${this.host}:${this.port}`,
Pragma: 'no-cache',
Referer: `http://${this.host}:${this.port}`,
'Sec-GPC': '1',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
},
};
const res = await axios_1.default.post(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_wlansssidconf_lua.lua`, encodedData, options);
return String(res.data).includes('<IF_ERRORSTR>SUCC</IF_ERRORSTR>');
}
}
exports.default = ZTEv9;