Refactor Omada proxy for api v3

This commit is contained in:
Michael Shamoon 2022-12-21 12:51:20 -08:00
parent 4a3f836020
commit b01e6eaf56

View File

@ -15,9 +15,12 @@ async function login(loginUrl, username, password, controllerVersionMajor) {
password: password password: password
} }
if (controllerVersionMajor < 4) { if (controllerVersionMajor === 3) {
params.method = "login"; params["method"] = "login";
params.name = username; params["params"] = {
name: username,
password
};
} }
const [status, contentType, data] = await httpProxy(loginUrl, { const [status, contentType, data] = await httpProxy(loginUrl, {
@ -59,14 +62,14 @@ export default async function omadaProxyHandler(req, res) {
return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data: data}}); return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data: data}});
} }
const cId = JSON.parse(data).result.omadacId; let cId;
let controllerVersion; let controllerVersion;
try { try {
cId = JSON.parse(data).result.omadacId;
controllerVersion = JSON.parse(data).result.controllerVer; controllerVersion = JSON.parse(data).result.controllerVer;
} catch (e) { } catch (e) {
// fallback to this random version? controllerVersion = "3.2.x"
controllerVersion = "3.2.17"
} }
const controllerVersionMajor = parseInt(controllerVersion.split('.')[0], 10) const controllerVersionMajor = parseInt(controllerVersion.split('.')[0], 10)
@ -134,7 +137,20 @@ export default async function omadaProxyHandler(req, res) {
const sitesResponseData = JSON.parse(data); const sitesResponseData = JSON.parse(data);
let site; if (sitesResponseData.errorCode > 0) {
logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
}
const site = (controllerVersionMajor === 3) ?
sitesResponseData.result.siteList.find(site => site.name === widget.site):
sitesResponseData.result.data.find(site => site.name === widget.site);
if (!site) {
return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
}
let siteResponseData;
let connectedAp; let connectedAp;
let activeUser; let activeUser;
@ -142,73 +158,53 @@ export default async function omadaProxyHandler(req, res) {
let connectedGateways; let connectedGateways;
let alerts; let alerts;
if (sitesResponseData.errorCode > 0) {
logger.debug(`HTTTP ${status} getting sites list: ${requestresponse[2].msg}`);
return res.status(status).json({error: {message: "Error getting sites list", url, data: requestresponse[2]}});
}
// on modern controller, we need to call two different endpoints
// on older controller, we can call one endpoint
if (controllerVersionMajor === 3) { if (controllerVersionMajor === 3) {
// Omada 3.x.x controller requires switching site
// Switching site is really needed only for Omada 3.x.x controllers const switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
let switchUrl;
site = listresult.result.siteList.filter(site => site.name === widget.site);
siteName = site[0].siteName;
switchUrl = `${widget.url}/web/v1/controller?ajax=&token=${token}`;
method = "POST"; method = "POST";
body = JSON.stringify({ body = {
"method": "switchSite", "method": "switchSite",
"params": { "params": {
"siteName": siteName, "siteName": site.siteName,
"userName": widget.username "userName": widget.username
} }
}); };
headers = { "Content-Type": "application/json" }; headers = { "Content-Type": "application/json" };
params = { "token": token }; params = { "token": token };
requestresponse = await httpProxy(switchUrl, {
[status, contentType, data] = await httpProxy(switchUrl, {
method, method,
params, params,
body: body.toString(), body: JSON.stringify(body),
headers, headers,
}); });
const switchresult = JSON.parse(requestresponse[2]);
if (switchresult.errorCode !== 0) { const switchResponseData = JSON.parse(data);
logger.debug(`HTTTP ${requestresponse[0]} getting sites list: ${requestresponse[2]}`); if (status !== 200 || switchResponseData.errorCode > 0) {
return res.status(requestresponse[0]).json({error: {message: "Error switching site", url, data: requestresponse[2]}}); logger.error(`HTTP ${status} getting sites list: ${data}`);
return res.status(status).json({error: {message: "Error switching site", url: switchUrl, data}});
} }
const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`; const statsUrl = `${widget.url}/web/v1/controller?getGlobalStat=&token=${token}`;
const statResponse = await httpProxy(statsUrl, { [status, contentType, data] = await httpProxy(statsUrl, {
method: "POST", method,
params: { "token": token }, params,
body: JSON.stringify({ body: JSON.stringify({
"method": "getGlobalStat", "method": "getGlobalStat",
}), }),
headers: { headers
"Content-Type": "application/json",
},
}); });
const data = JSON.parse(statResponse[2]); siteResponseData = JSON.parse(data);
if (data.errorCode !== 0) { if (status !== 200 || siteResponseData.errorCode > 0) {
return res.status(statResponse[0]).json({error: {message: "Error getting stats", url, data: statResponse[2]}}); return res.status(status).json({error: {message: "Error getting stats", url: statsUrl, data}});
} }
connectedAp = data.result.connectedAp;
activeUser = data.result.activeUser;
alerts = data.result.alerts;
connectedAp = siteResponseData.result.connectedAp;
activeUser = siteResponseData.result.activeUser;
alerts = siteResponseData.result.alerts;
} else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) { } else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
site = sitesResponseData.result.data.find(site => site.name === widget.site);
if (site.length === 0) {
return res.status(requestresponse[0]).json({error: {message: `Site ${widget.site} is not found`, url, data}});
}
const siteName = (controllerVersionMajor === 5) ? site.id : site.key; const siteName = (controllerVersionMajor === 5) ? site.id : site.key;
const siteStatsUrl = (controllerVersionMajor === 4) ? const siteStatsUrl = (controllerVersionMajor === 4) ?
`${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` : `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` :
@ -220,7 +216,7 @@ export default async function omadaProxyHandler(req, res) {
}, },
}); });
const siteResponseData = JSON.parse(data); siteResponseData = JSON.parse(data);
if (status !== 200 || siteResponseData.errorCode > 0) { if (status !== 200 || siteResponseData.errorCode > 0) {
logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${listresult.msg}`); logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${listresult.msg}`);
@ -254,6 +250,6 @@ export default async function omadaProxyHandler(req, res) {
})); }));
} }
} }
return res.status(400).json({ error: "Invalid proxy service type" }); return res.status(400).json({ error: "Invalid proxy service type" });
} }