Implement ping component
This commit is contained in:
1 parent
8b540c2a97
commit
722355ca57
7 files changed
+127
-1
No files matched your search
@@ -10,6 +10,7 @@ import deviceFaults from "./components/device-faults";
|
|||||||
import allParameters from "./components/all-parameters";
|
import allParameters from "./components/all-parameters";
|
||||||
import deviceActions from "./components/device-actions";
|
import deviceActions from "./components/device-actions";
|
||||||
import tags from "./components/tags";
|
import tags from "./components/tags";
|
||||||
|
import ping from "./components/ping";
|
||||||
|
|
||||||
function get(name) {
|
function get(name) {
|
||||||
if (name === "parameter") return parameter;
|
if (name === "parameter") return parameter;
|
||||||
@@ -22,6 +23,7 @@ function get(name) {
|
|||||||
else if (name === "all-parameters") return allParameters;
|
else if (name === "all-parameters") return allParameters;
|
||||||
else if (name === "device-actions") return deviceActions;
|
else if (name === "device-actions") return deviceActions;
|
||||||
else if (name === "tags") return tags;
|
else if (name === "tags") return tags;
|
||||||
|
else if (name === "ping") return ping;
|
||||||
else throw new Error(`No such component '${name}'`);
|
else throw new Error(`No such component '${name}'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
import m from "mithril";
|
||||||
|
import * as store from "../store";
|
||||||
|
|
||||||
|
const REFRESH_INTERVAL = 3000;
|
||||||
|
|
||||||
|
const component = {
|
||||||
|
oninit: vnode => {
|
||||||
|
vnode.state.timestamp = 0;
|
||||||
|
vnode.state.ping = null;
|
||||||
|
vnode.state.host = null;
|
||||||
|
vnode.state.timeout = null;
|
||||||
|
},
|
||||||
|
view: vnode => {
|
||||||
|
let refresh = () => {
|
||||||
|
const device = vnode.attrs.device;
|
||||||
|
let param =
|
||||||
|
device["InternetGatewayDevice.ManagementServer.ConnectionRequestURL"];
|
||||||
|
if (!param)
|
||||||
|
param = device["Device.ManagementServer.ConnectionRequestURL"];
|
||||||
|
if (!param || !param.value) return;
|
||||||
|
|
||||||
|
const url = new URL(param.value[0]);
|
||||||
|
vnode.state.host = url.hostname;
|
||||||
|
vnode.state.timestamp = Date.now();
|
||||||
|
store
|
||||||
|
.ping(vnode.state.host)
|
||||||
|
.then(res => {
|
||||||
|
vnode.state.ping = res;
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// Do nothing
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
let t = vnode.state.timestamp + REFRESH_INTERVAL - Date.now();
|
||||||
|
clearTimeout(vnode.state.timeout);
|
||||||
|
if (t <= 0) refresh();
|
||||||
|
else vnode.state.timeout = setTimeout(refresh, t);
|
||||||
|
|
||||||
|
if (vnode.state.host) {
|
||||||
|
let status = "";
|
||||||
|
if (vnode.state.ping)
|
||||||
|
if (vnode.state.ping.avg != null)
|
||||||
|
status = `${Math.trunc(vnode.state.ping.avg)} ms`;
|
||||||
|
else status = "Unreachable";
|
||||||
|
|
||||||
|
return m("div", `Pinging ${vnode.state.host}: ${status}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default component;
|
||||||
@@ -397,8 +397,10 @@ input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
table.parameter-list {
|
table.parameter-list {
|
||||||
|
border-spacing: 0;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
& th {
|
& th {
|
||||||
|
padding: 0;
|
||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -400,6 +400,12 @@ function logOut() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ping(host) {
|
||||||
|
return m.request({
|
||||||
|
url: `/api/ping/${encodeURIComponent(host)}`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
count,
|
count,
|
||||||
fetch,
|
fetch,
|
||||||
@@ -411,5 +417,6 @@ export {
|
|||||||
deleteResource,
|
deleteResource,
|
||||||
evaluateExpression,
|
evaluateExpression,
|
||||||
logIn,
|
logIn,
|
||||||
logOut
|
logOut,
|
||||||
|
ping
|
||||||
};
|
};
|
||||||
@@ -59,6 +59,7 @@
|
|||||||
"ui.overview.charts.online.slices.others.color": "#f7fcb9",
|
"ui.overview.charts.online.slices.others.color": "#f7fcb9",
|
||||||
"ui.overview.charts.online.slices.others.filter": "Events.Inform < (NOW() - 5 * 60 * 1000) - (24 * 60 * 60 * 1000)",
|
"ui.overview.charts.online.slices.others.filter": "Events.Inform < (NOW() - 5 * 60 * 1000) - (24 * 60 * 60 * 1000)",
|
||||||
"ui.device.10.type": "tags",
|
"ui.device.10.type": "tags",
|
||||||
|
"ui.device.25.type": "ping",
|
||||||
"ui.device.30.type": "parameter-list",
|
"ui.device.30.type": "parameter-list",
|
||||||
"ui.device.30.parameters.1.type": "container",
|
"ui.device.30.parameters.1.type": "container",
|
||||||
"ui.device.30.parameters.1.label": "Last inform",
|
"ui.device.30.parameters.1.label": "Last inform",
|
||||||
|
|||||||
@@ -367,9 +367,65 @@ function updateTags(deviceId, tags) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ping(host) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const options = url.parse(
|
||||||
|
`${config.get("server.nbi")}ping/${encodeURIComponent(host)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
let _http = options.protocol === "https:" ? https : http;
|
||||||
|
_http
|
||||||
|
.request(options, res => {
|
||||||
|
if (res.statusCode === 404) {
|
||||||
|
res.resume();
|
||||||
|
return resolve({});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.statusCode !== 200) {
|
||||||
|
res.resume();
|
||||||
|
return reject(new Error(`Unexpected status code ${res.statusCode}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
const chunks = [];
|
||||||
|
let bytes = 0;
|
||||||
|
res.on("data", chunk => {
|
||||||
|
chunks.push(chunk);
|
||||||
|
bytes += chunk.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
res.on("end", () => {
|
||||||
|
let buf = new Buffer(bytes);
|
||||||
|
let o = 0;
|
||||||
|
for (let c of chunks) {
|
||||||
|
c.copy(buf, o, 0, c.length);
|
||||||
|
o += c.length;
|
||||||
|
}
|
||||||
|
let m = buf
|
||||||
|
.toString()
|
||||||
|
.match(
|
||||||
|
/(\d) packets transmitted, (\d) received, ([\d.%]+) packet loss[^]*([\d.]+)\/([\d.]+)\/([\d.]+)\/([\d.]+)/
|
||||||
|
);
|
||||||
|
if (!m) return reject(new Error("Could not parse ping response"));
|
||||||
|
|
||||||
|
resolve({
|
||||||
|
packetsTransmitted: +m[1],
|
||||||
|
packetsReceived: +m[2],
|
||||||
|
packetLoss: m[3],
|
||||||
|
min: +m[4],
|
||||||
|
avg: +m[5],
|
||||||
|
max: +m[6],
|
||||||
|
mdev: +m[7]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
exports.query = query;
|
exports.query = query;
|
||||||
exports.count = count;
|
exports.count = count;
|
||||||
exports.postTasks = postTasks;
|
exports.postTasks = postTasks;
|
||||||
exports.deleteResource = deleteResource;
|
exports.deleteResource = deleteResource;
|
||||||
exports.updateTags = updateTags;
|
exports.updateTags = updateTags;
|
||||||
exports.filterToMongoQuery = filterToMongoQuery;
|
exports.filterToMongoQuery = filterToMongoQuery;
|
||||||
|
exports.ping = ping;
|
||||||
@@ -137,4 +137,8 @@ router.post("/devices/:id/tags", async (ctx, next) => {
|
|||||||
ctx.body = "";
|
ctx.body = "";
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.get("/ping/:host", async ctx => {
|
||||||
|
ctx.body = await apiFunctions.ping(ctx.params.host);
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
Reference in new issue
Block a user