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); let listInformation = []; 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 !== "") { const 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) 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("
") .match(regexMemory) !== null ? ( parseInt( stringMem .join("
") .match(regexMemory)[0] ) / 1024 / 1024 ).toFixed(2) + "G (D: " + memDefaultForPID.split(":")[1] + ")" : ""; let flash = showVersion .filter((line) => line.toLocaleLowerCase().includes("compactflash") ) .join("
"); 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 += `${inf.PID} ${inf.VID} ${inf.SN} ${inf.RAM} ${inf.flash} ${inf.extra_item}`; }); const options = { from: "admin@apactech.io", to: "joseph@apactech.io, ips@ipsupply.com.au", // to: "joseph@apactech.io", subject: "(AUTO-REPORT) SERIAL NUMBER", html: "\ \ \ \ \ \ \ \ \ \ \ " + html + "\
PIDVIDSNRAMFlashExtra Item
", }; 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); } };