Log_service/app/utils/sendDeviceInfor.ts

378 lines
13 KiB
TypeScript

import Env from "@ioc:Adonis/Core/Env";
import fs from "fs";
import moment from "moment/moment";
import nodeMailer from "nodemailer";
import LogDetectFile from "App/Models/LogDetectFile";
import InfoDevice from "App/Models/InfoDevice";
import KeyValue from "App/Models/KeyValue";
import { addLogFunction } from "./addLogFunction";
export const sendDeviceInfora = async () => {
try {
//Regex check show inventory
const regexInventory = /sh.*? inv.*/;
//Regex check show version
const regexVersion = /sh.*? ver.*/;
const regexMemory = /(\d+)K/g;
const date = moment(Date.now()).format("YYYYMMDD");
const allKeyValue = await KeyValue.all();
const memDefault = allKeyValue
.filter((i) => i.$attributes.key === "MEMORY_DEFAULT")
.map((obj) => obj.$attributes.value);
console.log(memDefault);
let listInformation: any = [];
let dataFile = await LogDetectFile.all();
let html = "";
//List file today
const listFile = fs
.readdirSync(Env.get("FOLDER_LOGS"))
.filter((f) => f.includes(date) && f.split(".")[f.split(".").length - 1]);
//Configure mail
const transporter = nodeMailer.createTransport({
pool: true,
host: "mail.ipsupply.com.au",
port: 465,
secure: true,
auth: {
user: "admin@apactech.io",
pass: "BGK!dyt6upd2eax1bhz",
},
});
//Read file in listFile
const filePromises = listFile.map((file, index) => {
return new Promise((resolve, reject) => {
fs.readFile(
Env.get("FOLDER_LOGS") + "/" + file,
"utf8",
async (err, data) => {
if (err) {
console.log(`Error reading file: ${err}`);
} else {
//Array line
const lines = data?.split("\n");
const linesInventory = [];
let DBFileCheck = dataFile.filter(
(i) => i.$attributes.file_name === file
)[0];
if (DBFileCheck !== undefined) {
if (lines.length > DBFileCheck?.$extras.last_check_SN) {
const DBFile = await LogDetectFile.find(
DBFileCheck?.$attributes.id_ldf
);
// console.log(DBFile)
DBFile.last_check_SN = lines.length;
await DBFile.save();
}
} else {
await LogDetectFile.firstOrCreate(
{ file_name: file },
{ file_name: file }
);
dataFile = await LogDetectFile.all();
DBFileCheck = dataFile.filter(
(i) => i.$attributes.file_name === file
)[0];
}
//Get index of "lines" with show inv
lines
?.slice(DBFileCheck?.$extras.last_check_SN, lines.length - 1)
.map((line, index) => {
if (line.match(regexInventory) !== null) {
linesInventory.push(index);
}
});
//cut content with content1 = [linesInventory[index],linesInventory[index+1]] ...
linesInventory?.map((line, index) => {
const deviceContent = lines?.slice(
linesInventory[index],
linesInventory[index + 1]
);
let backgroundColor = "rgb(200 200 200 / 30%)";
const showInventory = [];
let check = true;
let begin = 0;
let end = 4;
//get showInventory content
while (check === true) {
if (
deviceContent
.slice(begin, end)
.filter(
(i) =>
i.includes("PID:") &&
i.includes("VID:") &&
i.includes("SN:")
).length > 0
) {
showInventory.push(
deviceContent.slice(begin, end).join("\n")
);
begin = end;
end = end + 4;
} else {
check = false;
}
}
const showInventoryContent = showInventory
.join("\n")
.split("\n")
.filter(
(i) =>
i.includes("PID:") &&
i.includes("VID:") &&
i.includes("SN:")
);
//show version exists
if (
deviceContent.filter(
(line) => line.match(regexVersion) !== null
).length > 0
) {
const lineShowver = deviceContent.indexOf(
deviceContent.filter(
(line) => line.match(regexVersion) !== null
)[0]
);
const showVersion = deviceContent.slice(
lineShowver,
deviceContent.indexOf(
deviceContent.filter(
(line) => line.search("Configuration register") !== -1
)[0]
) + 1
);
showInventoryContent.map((u, index) => {
let PID = u
?.split("VID:")[0]
?.split("PID:")[1]
?.replace(/,/g, "")
.trim();
let VID = u
?.split("VID:")[1]
?.split("SN:")[0]
?.replace(/,/g, "")
.trim();
let SN = u?.split("SN:")[1]?.replace(/,/g, "").trim();
if (index > 0) {
if (PID !== "" && SN !== "") {
listInformation.push({
PID: PID,
VID: VID,
SN: SN,
RAM: "",
flash: "",
extra_item: "yes",
});
}
} else {
if (PID !== "" && SN !== "") {
let memDefaultForPID =
memDefault.filter((i) =>
PID.includes(i.split(":")[0])
)[0] !== undefined
? memDefault.filter((i) =>
PID.includes(i.split(":")[0])
)[0]
: PID + ":N/A:N/A";
const regexSPE = /\S*-SPE\S*(?=\s)/;
const stringMem = showVersion.filter(
(line) =>
line.includes("bytes of memory") ||
line.includes("bytes of physical memory")
);
const mathches = stringMem[0]?.match(regexSPE);
if (mathches && stringMem[0]?.includes("CHASSIS")) {
console.log(mathches);
memDefaultForPID =
memDefault.filter((i) =>
mathches[0].trim().includes(i.split(":")[0])
)[0] !== undefined
? memDefault.filter((i) =>
mathches[0].trim().includes(i.split(":")[0])
)[0]
: mathches[0].trim() + ":N/A:N/A";
PID = mathches[0].trim();
SN = showInventoryContent
.filter((i) => i.includes(mathches[0].trim()))[0]
?.split("SN:")[1]
?.replace(/,/g, "")
.trim();
VID = showInventoryContent
.filter((i) => i.includes(mathches[0].trim()))[0]
?.split("VID:")[1]
?.split("SN:")[0]
?.replace(/,/g, "")
.trim();
}
let RAM =
stringMem.join("<br>").match(regexMemory) !== null
? (
parseInt(
stringMem.join("<br>").match(regexMemory)[0]
) /
1024 /
1024
).toFixed(2) +
"G (D: " +
memDefaultForPID.split(":")[1] +
")"
: "";
let flash = showVersion
.filter((line) =>
line.toLocaleLowerCase().includes("compactflash")
)
.join("<br>");
listInformation.push({
PID: PID,
VID: VID,
SN: SN,
RAM: RAM,
flash:
flash.match(regexMemory) !== null
? (
parseInt(flash.match(regexMemory)[0]) /
1024 /
1024
).toFixed(2) +
"G (D: " +
memDefaultForPID.split(":")[2] +
")"
: "",
extra_item: "no",
});
}
}
});
} else {
//show version not exists --> RAM = N/A, Flash = N/A
showInventoryContent.map((u, index) => {
const PID = u
?.split("VID:")[0]
?.split("PID:")[1]
?.replace(/,/g, "")
.trim();
const VID = u
?.split("VID:")[1]
?.split("SN:")[0]
?.replace(/,/g, "")
.trim();
const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim();
if (index > 0) {
if (PID !== "" && SN !== "") {
listInformation.push({
PID: PID,
VID: VID,
SN: SN,
RAM: "",
flash: "",
extra_item: "yes",
});
}
} else {
if (PID !== "" && SN !== "") {
listInformation.push({
PID: PID,
VID: VID,
SN: SN,
RAM: "",
flash: "",
extra_item: "no",
});
}
}
});
}
});
}
resolve(0);
}
);
});
});
await Promise.all(filePromises);
let specialModel = allKeyValue
.filter((i) => i.key === "MODEL_SPECIAL")
.map((obj) => obj.$attributes.value);
let pattern = /[\x00-\x20\x7F]/g;
listInformation = listInformation.filter(
(i) => i.PID.match(pattern) === null
);
listInformation = listInformation.filter(
(i) =>
i.RAM !== "" ||
i.flash !== "" ||
specialModel.filter((m) => i.PID.includes(m)).length > 0
);
if (listInformation.length > 0) {
console.log(listInformation);
listInformation.map((inf) => {
html += `<tr><td>${inf.PID}</td>
<td>${inf.VID}</td>
<td>${inf.SN}</td>
<td>${inf.RAM}</td>
<td>${inf.flash}</td>
<td>${inf.extra_item}</td></tr>`;
});
const options = {
from: "admin@apactech.io",
to: "joseph@apactech.io, ips@ipsupply.com.au",
// to: "joseph@apactech.io",
subject: "(AUTO-REPORT) SERIAL NUMBER",
html:
"<table border='1'>\
<thead>\
<tr>\
<th>PID</th>\
<th>VID</th>\
<th>SN</th>\
<th>RAM</th>\
<th>Flash</th>\
<th>Extra Item</th>\
</tr>\
</thead>\
<tbody>" +
html +
"</tbody>\
</table>",
};
transporter.sendMail(options);
await InfoDevice.createMany(listInformation);
const fileName =
"./app/store/logsAPI/" +
moment(Date.now()).format("DD_MM_YYYY").toString() +
".log";
addLogFunction(
fileName,
JSON.stringify(listInformation[0], null, 2),
"Get-Send devices info"
);
} else {
console.log("listInformation", listInformation);
}
} catch (error) {
console.log(error);
}
};