CiscoTool_v1/netmiko_socket/index.js

1728 lines
61 KiB
JavaScript

import moment from "moment";
import { Server } from "socket.io";
import zulip from "zulip-js";
import { exec, spawn } from "child_process";
import nodeMailer from "nodemailer";
import net from "net";
import { log, timeStamp } from "console";
import fs from "fs";
import dotenv from "dotenv";
import EventEmitter from "events";
// Set the maximum number of listeners to a higher value
dotenv.config();
// Telnet connection options
// const host = '172.16.20.17';
// const port = 2023;
// Create a TCP socket
//
const emitter = new EventEmitter();
emitter.setMaxListeners(30);
const io = new Server({
cors: {
origin: "*",
},
});
const sendMail = (to, subject, htmlContent) => {
const adminEmail = process.env.ADMIN_EMAIL;
const adminPassword = process.env.ADMIN_EMAIL_PASSWORD;
const mailHost = process.env.EMAIL_HOST;
const mailPort = process.env.EMAIL_PORT;
const transporter = nodeMailer.createTransport({
pool: true,
host: mailHost,
port: mailPort,
secure: true,
auth: {
user: adminEmail,
pass: adminPassword,
},
});
const options = {
from: adminEmail,
to: to,
subject: subject,
html: htmlContent,
};
return transporter.sendMail(options);
};
let onlineUsers = [];
let listLineRun = [];
let listLineTimer = [];
let listProcess = [];
let listLineUpdate = [];
let listStationUpdate = [];
let listLineUse = [];
let listStationUse = [];
let listDeviceOn = [];
let listDeviceOff = [];
let listDeviceOn_old = [];
let listDeviceOff_old = [];
let listTesting = [];
let listCheckTime = [];
let listInterUP = [];
fs.readFile("./users", "utf8", (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
if (data !== "") {
let temp = JSON.parse(data);
(listLineRun = temp.listLineRun ? temp.listLineRun : []),
(listLineTimer = temp.listLineTimer ? temp.listLineTimer : []),
(listTesting = temp.listTesting ? temp.listTesting : []),
(listDeviceOff = temp.listDeviceOff ? temp.listDeviceOff : []),
(listProcess = temp.listProcess ? temp.listProcess : []),
(listLineUpdate = temp.listLineUpdate ? temp.listLineUpdate : []),
(listStationUpdate = temp.listStationUpdate
? temp.listStationUpdate
: []),
(listLineUse = temp.listLineUse ? temp.listLineUse : []),
(listStationUse = temp.listStationUse ? temp.listStationUse : []),
(listDeviceOn = temp.listDeviceOn ? temp.listDeviceOn : []),
(listDeviceOn_old = temp.listDeviceOn_old ? temp.listDeviceOn_old : []),
(listDeviceOff_old = temp.listDeviceOff_old
? temp.listDeviceOff_old
: []),
(listCheckTime = temp.listCheckTime ? temp.listCheckTime : []),
(listInterUP = temp.listInterUP ? temp.listInterUP : []);
}
});
const sendMessageToZulip = async (data, name, sta_name, items) => {
const config = {
username: "networktool-bot@zulip.ipsupply.com.au",
apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
realm: "https://zulip.ipsupply.com.au",
};
const client = await zulip(config);
let title = "**Line " + data.line + ": Equipment detected**\n";
switch (data.status) {
case "PASSWORD":
title =
title + "**(On-site tester) Please repower and hold mode button**";
break;
case "Fault":
title = title + "**(Remote tester) Please check**";
break;
case "Error":
title = title + "**(Remote tester) Please check**";
break;
case "DPEL":
title = title + "**(On-site tester) Please test LED/Ports**";
break;
case "DPELP":
title = title + "**(On-site tester) Please test LED/Ports**";
break;
case "ERROR":
title =
title +
"**(Remote tester) Error loading IOS. Please install IOS image**";
break;
case "Wait":
title = title + "**Wait for automatic test**";
break;
}
let extra_items =
data?.output?.split("\n")?.filter((i) => i.search("Extra items:") !== -1)
.length > 0
? ":check: " +
data?.output
?.split("\n")
?.filter((i) => i.search("Extra items:") !== -1)[0]
?.split(":")[1]
: "Not Found";
let status = data.status === "Faulty" ? "Issue found" : data.status;
let params0 = {
type: "stream",
to: "Result test - auto.nswteam.net",
topic:
"AU-dev",
content:
title +
"\n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---:|:---:|:---:|-----------:|------:\n|" +
data.line +
" | " +
data?.output
?.split("\n")
?.filter((i) => i.search("PID:") !== -1 && i.search("SN:") !== -1)[0]
?.replace(/\r/g, "") +
" | " +
extra_items +
"|" +
status +
"|" +
moment(Date.now()).format("DD/MM") +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
name?.split("filesTest/")[1] +
") \n|**Note:**|",
};
let params = {
type: "stream",
to: process.env.RESULT_STREAM_ZULIP,
topic:
sta_name.search("US") !== -1 && sta_name.search("A") === -1
? "US Station"
: sta_name.search("AU") !== -1
? "AU Station"
: sta_name,
content:
title +
"\n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---:|:---:|:---:|-----------:|------:\n|" +
data.line +
" | " +
data?.output
?.split("\n")
?.filter((i) => i.search("PID:") !== -1 && i.search("SN:") !== -1)[0]
?.replace(/\r/g, "") +
" | " +
extra_items +
"|" +
status +
"|" +
moment(Date.now()).format("DD/MM") +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
name?.split("filesTest/")[1] +
") \n|**Note:**|",
};
let params1 = {
type: "stream",
to: "AUS_VN_Test",
topic: "Status Line",
content:
title +
"\n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---:|:---:|:---:|-----------:|------:\n|" +
data.line +
" | " +
data?.output
?.split("\n")
?.filter((i) => i.search("PID:") !== -1 && i.search("SN:") !== -1)[0]
?.replace(/\r/g, "") +
" | " +
extra_items +
"|" +
status +
"|" +
moment(Date.now()).format("DD/MM") +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
name?.split("filesTest/")[1] +
") \n|**Note:**|",
};
let params2 = {
type: "stream",
to: "US Auto-test",
topic: "Notifications",
content:
title +
"\n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---:|:---:|:---:|-----------:|------:\n|" +
data.line +
" | " +
data?.output
?.split("\n")
?.filter((i) => i.search("PID:") !== -1 && i.search("SN:") !== -1)[0]
?.replace(/\r/g, "") +
" | " +
extra_items +
"|" +
status +
"|" +
moment(Date.now()).format("DD/MM") +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
name?.split("filesTest/")[1] +
") \n|**Note:**|",
};
// const result = await client.messages.send(params);
// await client.messages.send(params1);
// if (sta_name.search("US") !== -1 && sta_name.search("A") === -1) {
// await client.messages.send(params2);
// }
await client.messages.send(params0);
};
const addNewUser = (email, socketId, socketTerminal, time) => {
!onlineUsers.some((user) => user.email === email) &&
onlineUsers.push({ email, socketId, socketTerminal, time });
};
const removeUser = (socketId) => {
onlineUsers = onlineUsers.filter((user) => user.socketId !== socketId);
};
const getUser = (email) => {
return onlineUsers.find((user) => user.email === email);
};
const getUserByIdSocket = (socketId) => {
return onlineUsers.find((user) => user.socketId === socketId);
};
let respon = [];
setInterval(() => {
if (respon.length > 0) {
console.log(respon.toString());
respon = [];
}
// if(moment(Date.now()).format("HH:mm:ss")==="08:30:00"){
// sendMail("joseph@apactech.io", "REPORT "+moment(Date.now()).format("DD/MM/YYYY"), "<div>\
// <a href='"+process.env.DOMAIN_SERVER+"/api/dailyLog?name="+moment(Date.now()).format("YYYYMMDD") +"-AUTO-Session." +
// "US1 01-08.log"+"'><b>- US1 log </b></a><br></br>\
// <a href='"+process.env.DOMAIN_SERVER+"/api/dailyLog?name="+moment(Date.now()).format("YYYYMMDD") +"-AUTO-Session." +
// "US2 11-18.log"+"'><b>- US2 log </b></a><br></br>\
// <a href='"+process.env.DOMAIN_SERVER+"/api/dailyLog?name="+moment(Date.now()).format("YYYYMMDD") +"-AUTO-Session." +
// "AUS-1.log"+"'><b>- AUS-1 log </b></a><br></br>\
// <a href='"+process.env.DOMAIN_SERVER+"/api/dailyLog?name="+moment(Date.now()).format("YYYYMMDD") +"-AUTO-Session." +
// "AUS-2.log"+"'><b>- AUS-2 log </b></a><br></br>\
// <a href='"+process.env.DOMAIN_SERVER+"/api/dailyLog?name="+moment(Date.now()).format("YYYYMMDD") +"-AUTO-Session." +
// "AU-dev.log"+"'><b>- AUS-dev log </b></a><br></br>\
// </div>")
// }
let temp = {
listLineRun: listLineRun,
listLineTimer: listLineTimer,
listTesting: listTesting,
listDeviceOff: listDeviceOff,
listProcess: listProcess,
listLineUpdate: listLineUpdate,
listStationUpdate: listStationUpdate,
listLineUse: listLineUse,
listStationUse: listStationUse,
listDeviceOn: listDeviceOn,
listDeviceOn_old: listDeviceOn_old,
listDeviceOff_old: listDeviceOff_old,
listCheckTime: listCheckTime,
listInterUP: listInterUP,
};
fs.writeFile("./users", JSON.stringify(temp), function (err) {
if (err) {
return console.log(err);
}
});
}, 1000);
// console.log("heheh")
io.on("connection", (socket) => {
socket.on("newUser", (data) => {
const socket1 = new net.Socket();
socket1.setMaxListeners(200);
// console.log(getUser(data.email)?.time);
// console.log(data.time);
let user = getUser(data.email);
if (user?.time !== data.time) {
if (user?.email !== data.email) {
addNewUser(data.email, socket.id, socket1, data.time);
io.to([socket.id]).emit("updateListRun", listLineRun);
io.to([socket.id]).emit("updateListTimer", listLineTimer);
io.to([socket.id]).emit("sendListTesting", listTesting);
io.to([socket.id]).emit("sendListDeviceOff", listDeviceOff);
let temp = [];
onlineUsers.map((u) => {
temp.push(u.email);
});
console.log(temp);
console.log("----------list-------------");
} else {
io.to([socket.id]).emit("refuseNewUser", {});
}
} else {
io.to([socket.id]).emit("updateListRun", listLineRun);
io.to([socket.id]).emit("updateListTimer", listLineTimer);
io.to([socket.id]).emit("sendListTesting", listTesting);
io.to([socket.id]).emit("sendListDeviceOff", listDeviceOff);
let temp = [];
onlineUsers.map((u) => {
temp.push(u.email);
});
console.log(temp);
console.log("----------list-------------");
}
});
socket.on("disconnect", () => {
const user = onlineUsers.filter((i) => i.socketId === socket.id)[0];
if (user !== undefined) {
user.socketTerminal.end();
}
removeUser(socket.id);
let temp = [];
onlineUsers.map((u) => {
temp.push(u.email);
});
console.log(temp);
console.log("----------list-------------");
});
socket.on("createTelnet", (data) => {
try {
const user = getUser(data.email);
if (user !== undefined) {
const socket2 = new net.Socket();
socket2.connect(data.port, data.host, () => {
console.log(`Connected to ${data.host}:${data.port}`);
socket2.setEncoding("utf-8");
socket2.write("clear line " + data.clear_line + "\n");
socket2.write("\r\n");
socket2.write("\r\n");
socket2.write("clear line " + data.clear_line + "\n");
socket2.write("\r\n");
socket2.write("\r\n");
// user.socketTerminal.write("p" + data.line_number);
// user.socketTerminal.write("\n");
// user.socketTerminal.write("\n");
// user.socketTerminal.write("\n");
// user.socketTerminal.write("p" + data.line_number);
// user.socketTerminal.write("\n");
// user.socketTerminal.write("\n");
// user.socketTerminal.write("\n");
});
setTimeout(() => {
socket2.end();
user.socketTerminal.connect(data.line_port, data.host, () => {
console.log(`Connected to ${data.host}:${data.line_port}`);
user.socketTerminal.setEncoding("UTF-8");
// user.socketTerminal.write("p" + data.line_number);
user.socketTerminal.write("\r\n");
// user.socketTerminal.write("p" + data.line_number);
// user.socketTerminal.write("enable\n");
// setTimeout(() => {
// user.socketTerminal.write("\r\n");
// user.socketTerminal.write("\r\n");
// user.socketTerminal.write("\r\n");
// user.socketTerminal.write("p" + data.line_number);
// user.socketTerminal.write("enable\n");
// }, 3000);
// user.socketTerminal.write("\n");
// user.socketTerminal.write("\n");
});
user.socketTerminal.on("error", (error) => {
console.log("Connection error:", error);
setTimeout(() => {
io.to([user.socketId]).emit("sendLogs", {
data: "Connect error",
});
}, 500);
});
}, 2000);
socket2.on("error", (error) => {
console.log("Connection error:", error);
setTimeout(() => {
io.to([user.socketId]).emit("sendLogs", { data: "Connect error" });
}, 500);
});
}
} catch (error) {
console.log(error);
}
});
socket.on("closeTelnet", (data) => {
try {
const user = getUser(data.email);
if (user !== undefined) {
user.socketTerminal.removeAllListeners();
user.socketTerminal.end();
}
} catch (error) {
console.log(error);
}
});
socket.on("sendNoteToZulip", async (data) => {
try {
const config = {
username: "networktool-bot@zulip.ipsupply.com.au",
apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
realm: "https://zulip.ipsupply.com.au",
};
const client = await zulip(config);
let title = "**Line " + data.line + ": Equipment detected**\n";
switch (data.status) {
case "PASSWORD":
title =
title + "**(On-site tester) Please repower and hold mode button**";
break;
case "Fault":
title = title + "**(Remote tester) Please check**";
break;
case "Error":
title = title + "**(Remote tester) Please check**";
break;
case "DPEL":
title = title + "**(On-site tester) Please test LED/Ports**";
break;
case "DPELP":
title = title + "**(On-site tester) Please test LED/Ports**";
break;
case "ERROR":
title =
title +
"**(Remote tester) Error loading IOS. Please install IOS image**";
break;
case "Wait":
title = title + "**Wait for automatic test**";
break;
}
let status = data.status === "Faulty" ? "Issue found" : data.status;
let extra_items =
data.output?.split("\n")?.filter((i) => i.search("Extra items") !== -1)
.length > 0
? ":check: " +
data?.output
?.split("\n")
?.filter((i) => i.search("Extra items:") !== -1)[0]
?.split(":")[1]
: "Not Found";
let params = {
type: "stream",
to: process.env.RESULT_STREAM_ZULIP,
topic:
data.sta_name.search("US") !== -1 && data.sta_name.search("A") === -1
? "US Station"
: data.sta_name.search("AUS") !== -1
? "AU Station"
: data.sta_name,
content:
title +
"\n\nNote updated: \n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---|:---|:---:|:---:|:---:\n|" +
data.line +
" | " +
data.PID_SN +
"|" +
extra_items +
" | " +
status +
"|" +
data.time +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
data.file +
")\n|**Note:**|**" +
data.note +
"**|",
};
let params1 = {
type: "stream",
to: "AUS_VN_Test",
topic: "Status Line",
content:
title +
"\n\nNote updated: \n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---|:---|:---:|:---:|:---:\n|" +
data.line +
" | " +
data.PID_SN +
"|" +
extra_items +
" | " +
status +
"|" +
data.time +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
data.file +
")\n|**Note:**|**" +
data.note +
"**|",
};
let params2 = {
type: "stream",
to: "US Auto-test",
topic: "Notifications",
content:
title +
"\n\nNote updated: \n\n| Line | PID-SN | Extra items | Status | Date | Report\n|---|:---|:---|:---:|:---:|:---:\n|" +
data.line +
" | " +
data.PID_SN +
"|" +
extra_items +
" | " +
status +
"|" +
data.time +
"|[View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
data.file +
")\n|**Note:**|**" +
data.note +
"**|",
};
const result = await client.messages.send(params);
await client.messages.send(params1);
if (
data.sta_name.search("US") !== -1 &&
data.sta_name.search("A") === -1
) {
await client.messages.send(params2);
}
} catch (error) {
console.log(error);
}
});
socket.on("sendReportToZulip", (data) => {
// console.log(data)
try {
const config = {
username: "networktool-bot@zulip.ipsupply.com.au",
apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
realm: "https://zulip.ipsupply.com.au",
};
(async () => {
// console.log(data.content?.slice(data.content.search("Faulty:"),100))
const client = await zulip(config);
let status = data.status === "Faulty" ? "Issue found" : data.status;
const fail =
data.content?.search("Faulty:") !== -1
? data.content.slice(
data.content.search("Faulty:") + 7,
data.content.search(
"======================================================================"
)
)
: "not found";
const content =
"**Line " +
data.line +
":**\n" +
data.content
.split("\n")
.filter(
(i) =>
i.search("PID:") !== -1 &&
i.search("VID:") !== -1 &&
i.search("SN:") !== -1
)[0] +
"\n" +
data.content.split("\n").filter((i) => i.search("RAM: ") !== -1)[0] +
" - " +
data.content
.split("\n")
?.filter((i) => i.search("Flash: ") !== -1)[0] +
"\nExtra item: " +
data.extraItem +
"\nAuto detect issue: \n" +
fail +
"\nShorten log: - [View](" +
process.env.DOMAIN_SERVER +
"/api/log?name=" +
data.file +
")\n```\n" +
data.content.slice(
data.content.search("show inv"),
data.content.length
);
// console.log(content)
let params = {
type: "stream",
to: data.stream,
topic: data.topic,
content: content,
};
const result = await client.messages.send(params);
console.log(result);
})();
} catch (error) {
console.log(error);
}
});
socket.on("receiverCommand", (data) => {
try {
const user = getUser(data.email);
if (user !== undefined) {
let temp = data.command + "\r";
user.socketTerminal.write(temp);
user.socketTerminal.on("data", (data) => {
if (respon.includes(data) === false) {
respon.push(data);
console.log(data);
onlineUsers.map((u, index) => {
if (u.email === user.email) {
if (onlineUsers[index].log) {
onlineUsers[index].log = onlineUsers[index].log + data;
} else {
onlineUsers[index].log = data;
}
}
});
io.to([user.socketId]).emit("sendLogs", { data: user.log });
if (data.search("--More--") !== -1) {
user.socketTerminal.write(" \r");
}
}
});
// Handle connection error
user.socketTerminal.on("error", (error) => {
console.log("Connection error:", error);
setTimeout(() => {
io.to([user.socketId]).emit("sendLogs", { data: "Connect error" });
}, 500);
});
}
} catch (error) {
console.log(error);
}
});
socket.on("send-process", (data) => {
if (
listLineRun.filter((line) => line.id_line === data.id).length > 0 &&
data.result[0].status.search("boot") === -1 &&
data.result[0].status.search("PASSWORD_ROUTER") === -1
) {
listLineRun = listLineRun.filter((line) => line.id_line !== data.id);
listLineTimer = listLineTimer.filter((line) => line.id_line !== data.id);
listProcess = listProcess.filter((line) => line.id !== data.id);
listInterUP = listInterUP.filter((line) => line.id !== data.id);
io.emit("updateCommand", { type: "test" });
io.emit("sendListTesting", listTesting);
// listTesting = listTesting.filter((line) => line.id_line !== data.id)
// if (data.result[0].status.toLocaleLowerCase() === "error") {
// }
let nameFile = moment(Date.now()).format("YYYYMMDD") + "-AUTO-Session." + data.result[0].sta_name.replace(" ", "-") + ".log"
fs.access(
"../netmiko_Api/public/dailyLogs/" +
moment(Date.now()).format("YYYYMMDD") +
"-AUTO-Session." +
data.result[0].sta_name.replace(" ", "-") +
".log",
fs.constants.F_OK,
(err) => {
if (err) {
//chua co log
fs.writeFile(
"../netmiko_Api/public/dailyLogs/" +
moment(Date.now()).format("YYYYMMDD") +
"-AUTO-Session." +
data.result[0].sta_name.replace(" ", "-") +
".log",
"\n\n\n=============================================================" +
data.result[0].status +
"=============================================================\n" +
data.result[0].output,
function (err) {
if (err) {
return console.log(err);
}
console.log("Write log !");
}
);
} else {
//da co log
const old_data = fs.readFileSync(
"../netmiko_Api/public/dailyLogs/" +
moment(Date.now()).format("YYYYMMDD") +
"-AUTO-Session." +
data.result[0].sta_name.replace(" ", "-") +
".log",
"utf8"
);
fs.writeFile(
"../netmiko_Api/public/dailyLogs/" +
moment(Date.now()).format("YYYYMMDD") +
"-AUTO-Session." +
data.result[0].sta_name.replace(" ", "-") +
".log",
old_data +
"\n\n\n=============================================================" +
data.result[0].status +
"=============================================================\n" +
data.result[0].output,
function (err) {
if (err) {
return console.log(err);
}
console.log("Write log !");
}
);
}
}
);
let subject = "";
let items = "";
if (data.result[0].PID !== undefined) {
subject =
subject +
data.result[0].sta_name +
" - Line " +
data.result[0].line +
" - " +
data.result[0].status +
" - " +
data.result[0].PID +
" - " +
data.result[0].SN;
} else {
subject =
subject +
data.result[0].sta_name +
" - Line " +
data.result[0].line +
" - " +
data.result[0].status;
}
if (
data.result[0].output
.split("\n")
.filter((i) => i.search("PID: ") !== -1).length > 1
) {
let temp = [];
let listKeyValue = data.specialItem.filter(
(i) => i.key === "MODEL_SPECIAL"
);
let listItemSpecial = [];
listKeyValue.map((u) => {
listItemSpecial.push(u.value);
});
data.result[0].output.split("\n").map((u) => {
if (u.search("NAME: ") !== -1 || u.search("PID: ") !== -1) {
temp.push(u + "\n");
}
});
temp.slice(2).map((u, index) => {
if (
listItemSpecial.filter((i) => u.search(i) !== -1).length > 0 &&
u.search("PID:") !== -1
) {
items = items + temp.slice(2)[index - 1];
items = items + u;
}
});
if (items !== "") {
items =
"<h4 style='color:orange;'>Additional items found:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:30vh;border:solid 2px orange'>" +
items +
"</textarea>";
} else {
items = "";
}
}
sendMessageToZulip(
data.result[0],
data.nameFile,
data.result[0].sta_name,
items
);
if (
data.result[0].status.toLocaleLowerCase() !== "wait" &&
data.checkSendMail === "true"
) {
switch (data.result[0].status.toLocaleLowerCase()) {
case "dpel":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
items +
"<h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
sendMail(
"group2@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Tester] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
items +
"<h3>The device is GOOD. Please check ports + mode button + POE ,...</h3>"
);
break;
case "dpelp":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
items +
"<h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
sendMail(
"group2@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Tester] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
items +
"<h3>The device is GOOD. Please check ports + mode button + POE ,...</h3>"
);
break;
case "password":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4><h3 style='color:red;'>This line has password</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[0] +
"</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[1] +
"</h3><h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
// sendMail("group2@apactech.io", subject, "<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h3 style='color:red;'>This line has password. Please repower and hold mode button. Please email group1 once you are done.</h3>")
let noti =
data.result[0].output.split("\n")[1].search("Switche") !== -1
? "<h3 style='color:red;'>This line has password. Please repower and hold mode button.</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[0] +
"</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[1] +
"</h3>"
: "<h3 style='color:red;'>This line has password.</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[0] +
"</h3><h3 style='color:orange;'>" +
data.result[0].output.split("\n")[1] +
"</h3>";
sendMail(
"group2@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Tester] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
noti
);
break;
case "faulty":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4>" +
items +
"<h3 style='color:orange;'>This line is faulty, please check and email group 2 to check port + poe + button ... once you are done checking</h3><h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
break;
case "switch:":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4><h3 style='color:red;'>please check - " +
data.result[0].output.split("\n")[1].split("|||")[1] +
" can't boot</h3><h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
break;
case "rommon:":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h4>" +
subject +
"</h4><h3 style='color:red;'>please check - " +
data.result[0].output.split("\n")[1].split("|||")[1] +
" can't boot</h3><h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
break;
case "error":
sendMail(
"group1@apactech.io, frank@ipsupply.com.au, kay@ipsupply.com.au",
"[Admin] " + subject,
"<h4><i><b>----------This is an automated message please do not reply----------</b></i></h4><h3 style='color:red;'>This line is error(s), please check</h3><h4>Output:</h4><textarea style='wordWrap:break-word; display: block; width:100%; height:70vh;'>" +
data.result[0].output +
"</textarea>"
);
break;
}
}
listTesting.map((item, index) => {
if (item.id === data.id) {
listTesting[index].status = data.result[0].status.toLocaleLowerCase();
// if(listTesting[index].SN!==undefined){
listTesting[index].SN = data.result[0].SN;
// }
}
});
io.emit("send-response", data);
io.emit("updateListRun", listLineRun);
io.emit("updateListTimer", listLineTimer);
}
if (data.result[0].status === "PASSWORD_ROUTER") {
listTesting.map((item, index) => {
if (item.id === data.id) {
listTesting[index].status = "password";
// if(listTesting[index].SN!==undefined){
// listTesting[index].SN = data.result[0].SN;
// }
}
});
}
});
socket.on("cancelAction", (data) => {
listLineRun = listLineRun.filter((line) => line.id_line !== data.id);
listLineTimer = listLineTimer.filter((line) => line.id_line !== data.id);
// listTesting = listTesting.filter((line) => line.id_line !== data.id)
io.emit("updateListRun", listLineRun);
io.emit("updateListTimer", listLineTimer);
console.log("after delete: ", listLineRun);
});
socket.on("changeCommand", ({}) => {
io.emit("updateCommand", { type: "input" });
io.emit("updateListTimer", listLineTimer);
});
socket.on("sendListRun", (listRun) => {
listRun.map((u) => {
listLineRun.push(u);
});
io.emit("updateListRun", listLineRun);
// console.log(listLineRun);
});
socket.on("sendListTimer", (listTimer) => {
listTimer.map((u) => {
listLineTimer.push(u);
});
io.emit("updateListTimer", listLineTimer);
// console.log(listLineTimer);
});
socket.on("getListTimer", () => {
io.to([socket.id]).emit("updateListTimer", listLineTimer);
// console.log(listLineTimer);
});
socket.on("changeAction", (listTimer) => {
listLineTimer.map((t, index) => {
if (t.id_line === listTimer.id_line) {
listLineTimer.fill(
{
id_line: listTimer.id_line,
time: t.time,
action: listTimer.action,
},
index,
index + 1
);
}
});
io.emit("updateListTimer", listLineTimer);
});
socket.on("listenInfoStation", (data) => {
listStationUpdate = data;
// console.log("listStation", listStationUpdate);
});
socket.on("listenListLine", (data) => {
listLineUpdate = data;
// console.log("listLine", listLineUpdate);
});
socket.on("updateListTesting", (data) => {
if (data.status === undefined) {
if (listTesting.filter((i) => i.id === data.id_line).length > 0) {
if (
listTesting.filter((i) => i.id === data.id_line)[0].status === "edit"
) {
listTesting = listTesting.filter((t) => t.id !== data.id_line);
io.emit("sendListTesting", listTesting);
} else {
listTesting.map((t, index) => {
if (t.id === data.id_line) {
listTesting[index].status = "edit";
}
});
io.emit("sendListTesting", listTesting);
}
} else {
listTesting.push({ id: data.id_line, infoLine: data, status: "edit" });
io.emit("sendListTesting", listTesting);
}
} else {
if (data.status === "enable") {
data.allLine.map((u) => {
listTesting = listTesting.filter((t) => t.id !== u.id_line);
});
io.emit("sendListTesting", listTesting);
}
if (data.status === "disable") {
data.allLine.map((u) => {
if (listTesting.filter((i) => i.id === u.id_line).length > 0) {
listTesting = listTesting.filter((t) => t.id !== u.id_line);
listTesting.push({ id: u.id_line, infoLine: u, status: "edit" });
} else {
listTesting.push({ id: u.id_line, infoLine: u, status: "edit" });
}
});
io.emit("sendListTesting", listTesting);
}
}
});
socket.on("updateListTestingFromManualTest", (data) => {
if (listTesting.filter((i) => i.id === data.id_line).length > 0) {
listTesting.map((t, index) => {
if (t.id === data.id_line) {
listTesting[index].status = "edit";
}
});
listDeviceOn = listDeviceOn.filter((i) => i.id !== data.id_line);
io.emit("sendListTesting", listTesting);
} else {
listTesting.push({ id: data.id_line, infoLine: data, status: "edit" });
io.emit("sendListTesting", listTesting);
listDeviceOn = listDeviceOn.filter((i) => i.id !== data.id_line);
}
});
});
setInterval(() => {
listLineUse = listLineUpdate;
listStationUse = listStationUpdate;
// console.log("listline", listTesting);
if (
listDeviceOn.length > 0 &&
onlineUsers.filter((i) => i.email.search("api") === -1).length > 0
) {
console.log("Send list on");
// console.log(listTesting);
listTesting = listTesting.concat(listDeviceOn);
console.log(listDeviceOn);
io.to(onlineUsers.filter((i) => i.email !== "api")[0].socketId).emit(
"sendListDeviceOn",
listDeviceOn
);
io.emit("sendListTesting", listTesting);
}
io.emit("sendListDeviceOff", listDeviceOff);
listDeviceOff_old = listDeviceOff;
listDeviceOn_old = listDeviceOn;
console.log("LIST ON: ", listDeviceOn.length);
console.log("*****************LISTTESTING: ", listTesting.length);
// console.log("LIST OFF: ", listDeviceOff.filter((obj, index, self) =>
// index === self.findIndex((t) => t.id === obj.id)
// ));
listDeviceOff = [];
listDeviceOn = [];
console.log("===========================================");
for (let i = 0; i < listStationUse.length; i++) {
let listLineOfStation = [];
// console.log("STATION: ", listStationUse[i]);
for (let j = 0; j < listLineUse.length; j++) {
if (
listLineUse[j][0] !== undefined &&
listLineUse[j][0].station_id === listStationUse[i].id_station
) {
for (let k = 0; k < listLineUse[j].length; k++) {
// if (listTesting.length > 0) {
// console.log(listLineUse[j][k])
if (
listTesting.filter((obj) => obj.id === listLineUse[j][k].id_line)
.length === 0 ||
(listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait" &&
listTesting.filter((obj) => obj.id === listLineUse[j][k].id_line)
.length === 1)
) {
console.log("-------------------------", listLineUse[j][k].id_line);
const checkPort = spawn(
"python3",
[
"./checkPort.py",
"",
listStationUse[i].sta_ip,
listStationUse[i].sta_port_telnet,
listLineUse[j][k].line_clear,
listLineUse[j][k].line_number,
],
{ timeout: 25000 }
);
// console.log("listLineUse[j][k]", listLineUse[j][k])
checkPort.stdout.on("data", (data) => {
data = data.toString()?.split("===")[0];
console.log("data scan: ", data);
if (data.search("Open") !== -1) {
if (
data.search("show abc") !== -1 &&
data.search("switch:") === -1 &&
data.search("rommon") === -1
// &&
// data.search("foreign host") === -1 &&
// data.search("refuse") === -1
) {
if (data.search("show abc") + 10 < data.length) {
if (
data.search("Username:") !== -1 ||
data.search("Password:") !== -1
) {
if (
data
.slice(data.search("Password:"), data.length - 2)
.search("#") !== -1 &&
data.search("foreign host") === -1
) {
if (data.search("SRW")!==-1) {
console.log("----SRW----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "SRW",
});
} else {
console.log("----GOOD----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "good",
});
}
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
} else {
console.log("----PASSWORD----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "password",
});
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
}
} else {
if (
data
.slice(data.search("show abc"), data.length - 2)
.search("#") !== -1 &&
data.search("foreign host") === -1
) {
if (data.search("SRW")!==-1) {
console.log("----SRW----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "SRW",
});
} else {
console.log("----GOOD----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "good",
});
}
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
} else {
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
).length === 0
) {
listDeviceOff.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "off",
message: "Mode not found",
});
}
}
}
}
}
if (
data.search("show abc") !== -1 &&
data.search("switch:") !== -1
) {
console.log("----SWITCH:----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "switch:",
});
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
}
if (
data.search("show abc") !== -1 &&
data.search("rommon") !== -1
) {
console.log("----ROMMON----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "rommon",
});
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
}
if (
data.search("Password:") !== -1 ||
data.search("Username:") !== -1
) {
if (
listDeviceOn.filter(
(i) => i.id === listLineUse[j][k].id_line
).length === 0
) {
console.log("----PASSWORD----");
listDeviceOn.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "on",
infoLine: listLineUse[j][k],
mode: "password",
});
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
)[0]?.status === "wait"
) {
listTesting = listTesting.filter(
(i) => i.id !== listLineUse[j][k].id_line
);
}
}
} else {
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
).length === 0
) {
listDeviceOff.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "off",
message: "Device is booting",
});
}
}
} else {
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
).length === 0
) {
listDeviceOff.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "off",
message: "No connection to device",
});
}
}
});
checkPort.stderr.on("data", (data) => {
data = data.toString();
console.log("scan erro: ", data);
if (
listTesting.filter(
(obj) => obj.id === listLineUse[j][k].id_line
).length === 0
) {
listDeviceOff.push({
id: listLineUse[j][k].id_line,
line: listLineUse[j][k].line_number,
station: listStationUse[i],
status: "off",
message: "No connection to station",
});
}
});
}
}
}
}
}
// setTimeout(() => {
let listWaiting = listTesting.filter(
(i) =>
i.status.search("dpel") !== -1 ||
i.status === "faulty" ||
i.status === "password" ||
i.status === "wait"
// ||
// i.status === "loadingios"
);
// console.log("WAITING",listWaiting);
for (let i = 0; i < listWaiting.length; i++) {
if (
listWaiting[i].status === "wait" ||
listWaiting[i].status === "loadingios"
) {
// if(listTesting.filter((t) => t.id !== listWaiting[i].id && t.mode === "good").length>0){
// listTesting = listTesting.filter((t) => t.id !== listWaiting[i].id && t.status !== "wait");
// }
}
if (
listWaiting[i].status === "password" &&
listWaiting[i].station !== undefined
) {
const checkPort = spawn(
"python3",
[
"./checkPort.py",
"",
listWaiting[i].station.sta_ip,
listWaiting[i].station.sta_port_telnet,
listWaiting[i].infoLine.line_clear,
listWaiting[i].infoLine.line_number,
],
{ timeout: 30000 }
);
checkPort.stdout.on("data", (data) => {
data = data.toString();
if (data.search("switch:") !== -1) {
let temp = [];
temp.push({
id: listWaiting[i].id,
line: listWaiting[i].line,
station: listWaiting[i].station,
status: "on",
infoLine: listWaiting[i].infoLine,
mode: "switch:",
});
listTesting = listTesting.filter((t) => t.id !== listWaiting[i].id);
if (
temp.length > 0 &&
onlineUsers.filter((i) => i.email !== "api")[0] !== undefined
) {
listTesting = listTesting.concat(temp);
io.to(
onlineUsers.filter((i) => i.email !== "api")[0].socketId
).emit("sendListDeviceOn", temp);
io.emit("sendListTesting", listTesting);
}
}
if (data.search("rommon") !== -1) {
let temp = [];
temp.push({
id: listWaiting[i].id,
line: listWaiting[i].line,
station: listWaiting[i].station,
status: "on",
infoLine: listWaiting[i].infoLine,
mode: "rommon",
});
listTesting = listTesting.filter((t) => t.id !== listWaiting[i].id);
if (
temp.length > 0 &&
onlineUsers.filter((i) => i.email !== "api")[0] !== undefined
) {
listTesting = listTesting.concat(temp);
io.to(
onlineUsers.filter((i) => i.email !== "api")[0].socketId
).emit("sendListDeviceOn", temp);
io.emit("sendListTesting", listTesting);
}
}
});
} else {
if (
listWaiting[i].station !== undefined &&
listWaiting[i].status !== "wait"
) {
console.log(listWaiting[i])
const getSN = spawn(
"python3",
[
"./getSN.py",
"",
listWaiting[i].station.sta_ip,
listWaiting[i].station.sta_port_telnet,
listWaiting[i].infoLine.line_clear,
listWaiting[i].infoLine.line_number,
listWaiting[i].infoLine.line_port,
listWaiting[i].mode
],
{ timeout: 150000 }
);
getSN.stdout.on("data", (data) => {
data = data.toString();
//check interface
let interfaces = data
?.split("===")[1]
?.split("\n")
?.filter((i) => i.search("up") !== -1 || i.search("down") !== -1);
let listInterDetect = [];
let listInterDown = [];
let interFinal = [];
// console.log("**********************", listInterUP);
interfaces?.map((int) => {
let temp = int?.split(" ")[0];
interFinal.push(
temp?.slice(0, 4) +
".." +
temp?.slice(temp?.length - 6, temp?.length)
);
if (int?.split("up").length - 1 >= 2) {
listInterDetect.push(
temp?.slice(0, 4) +
".." +
temp?.slice(temp?.length - 6, temp?.length)
);
if (
listInterUP.filter(
(t) => t.id !== undefined && t.id === listWaiting[i].id
).length > 0
) {
// console.log("tontai");
listInterUP.map((u, index) => {
if (u.id === listWaiting[i].id) {
if (
listInterUP[index].inter.includes(
temp?.slice(0, 4) +
".." +
temp?.slice(temp?.length - 6, temp?.length)
) === false
) {
listInterUP[index].inter.push(
temp?.slice(0, 4) +
".." +
temp?.slice(temp?.length - 6, temp?.length)
);
}
}
});
} else {
// console.log("kotontai");/
listInterUP.push({
id: listWaiting[i].id,
inter: [
temp?.slice(0, 4) +
".." +
temp?.slice(temp?.length - 6, temp?.length),
],
});
}
}
});
listTesting.map((u, index) => {
if (u.id === listWaiting[i].id) {
listTesting[index].interfaceCheck = {
interUp: listInterDetect,
interDown:
interFinal.filter(
(x) =>
listInterUP
.filter((t) => t.id === listWaiting[i].id)[0]
?.inter?.includes(x) === false
).length > 0
? interFinal.filter(
(x) =>
listInterUP
.filter((t) => t.id === listWaiting[i].id)[0]
?.inter?.includes(x) === false
)
: interFinal,
interUpFinal:
listInterUP.filter((t) => t.id === listWaiting[i].id)[0]
?.inter !== undefined
? listInterUP.filter((t) => t.id === listWaiting[i].id)[0]
?.inter
: [],
};
}
});
io.emit("sendListTesting", listTesting);
let SN0 = data.split("\n").filter((i) => i.search("SN:") !== -1)[0];
if (SN0 !== undefined && listWaiting[i].mode === "fail") {
listWaiting[i].mode = "good";
console.log(
SN0.slice(SN0.search("SN:") + 3, SN0.length).trim() +
"--line--" +
listWaiting[i].infoLine.line_number +
"--station--" +
listWaiting[i].station.sta_name
);
if (
listWaiting.filter(
(item) =>
item.SN ===
SN0.slice(SN0.search("SN:") + 3, SN0.length).trim()
).length === 0
) {
listTesting = listTesting.filter(
(t) => t.id !== listWaiting[i].id
);
io.emit("sendListTesting", listTesting);
console.log("new deivce!\n", data);
} else {
console.log("old device");
}
} else {
if (
data.search("xxError") !== -1 &&
listWaiting[i].mode === "fail"
) {
console.log("===============\n", data + "\n=============");
console.log(
"undefine--line--" +
listWaiting[i].infoLine.line_number +
"--station--" +
listWaiting[i].station.sta_name
);
listTesting = listTesting.filter(
(t) => t.id !== listWaiting[i].id
);
io.emit("sendListTesting", listTesting);
console.log("new deivce!\n", data);
} else {
if (listWaiting[i].mode === "fail") {
listWaiting[i].mode = "good";
// listTesting = listTesting.filter(
// (t) => t.id !== listWaiting[i].id
// );
// io.emit("sendListTesting", listTesting);
// console.log("new deivce!\n", data);
}
// else {
// listWaiting[i].mode = "fail";
// console.log("======Fail=========", data + "=============")
// }
if (data.search("xxError") !== -1) {
listWaiting[i].mode = "fail";
console.log("======Fail=========");
}
}
}
});
getSN.stderr.on("data", (data) => {
data = data.toString();
console.log("error: ", data);
listTesting = listTesting.filter((t) => t.id !== listWaiting[i].id);
io.emit("sendListTesting", listTesting);
// console.log("======error=========", data + "=============")
});
}
}
}
}, 26000);
io.listen(5000);
console.log("Socket running....");