diff --git a/app/Models/InfoDevice.ts b/app/Models/InfoDevice.ts new file mode 100644 index 0000000..b894a6d --- /dev/null +++ b/app/Models/InfoDevice.ts @@ -0,0 +1,34 @@ +import { DateTime } from 'luxon' +import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm' + +export default class InfoDevice extends BaseModel { + public static table = 'info_devices' + + @column({ isPrimary: true }) + public id_info: number + + @column() + public PID: string + + @column() + public SN: string + + @column() + public VID: string + + @column() + public RAM: string + + @column() + public flash: string + + @column() + public extraItem: string + + @column.dateTime({ autoCreate: true }) + public created_at: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + public updated_at: DateTime + +} diff --git a/app/Models/LogDetectFile.ts b/app/Models/LogDetectFile.ts index 84e7354..5a21f22 100644 --- a/app/Models/LogDetectFile.ts +++ b/app/Models/LogDetectFile.ts @@ -11,6 +11,9 @@ export default class LogDetectFile extends BaseModel { @column() public file_name: string + @column() + public last_check_SN: number + @column.dateTime({ autoCreate: true }) public created_at: DateTime diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index 162c7c8..5a27219 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -3,6 +3,9 @@ import fs from "fs"; import moment from "moment/moment"; import dotenv from "dotenv"; import nodeMailer from "nodemailer"; +import LogDetectFile from "App/Models/LogDetectFile"; +import InfoDevice from "App/Models/InfoDevice"; +import KeyValue from "App/Models/KeyValue"; dotenv.config(); export const sendDeviceInfora = async () => { @@ -13,11 +16,16 @@ export const sendDeviceInfora = async () => { const regexVersion = /sh.*? ver.*/; const regexMemory = /(\d+)K/g; const date = moment(Date.now()).format("YYYYMMDD"); + const memDefault = (await KeyValue.all()) + .filter((i) => i.$attributes.key === "MEMORY_DEFAULT") + .map((obj) => obj.$attributes.value); const listInformation = []; + let dataFile = await LogDetectFile.all(); + // console.log(dataFile) + // console.log(dataFile) let html = ""; //List file today - const listFile = fs - .readdirSync(Env.get("FOLDER_LOGS")) + const listFile = fs.readdirSync(Env.get("FOLDER_LOGS")); //Configure mail const transporter = nodeMailer.createTransport({ @@ -32,179 +40,236 @@ export const sendDeviceInfora = async () => { }); //Read file in listFile - await listFile.map((file) => { - fs.readFile(Env.get("FOLDER_LOGS") + "/" + file, "utf8", (err, data) => { - if (err) { - console.log(`Error reading file: ${err}`); - } else { - //Array line - const lines = data?.split("\n"); - const linesInventory = []; - //Get index of "lines" with show inv - lines?.map((line, index) => { - if (line.match(regexInventory) !== null) { - linesInventory.push(index); - } - }); - // console.log(linesInventory); - //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; + await listFile.map(async (file) => { + 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 + ); - //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; + // console.log(DBFile) + + DBFile.last_check_SN = lines.length; + await DBFile.save(); } - } - - const showInventoryContent = showInventory - .join("\n") - .split("\n") - .filter( - (i) => - i.includes("PID:") && i.includes("VID:") && i.includes("SN:") + } else { + await LogDetectFile.firstOrCreate( + { file_name: file }, + { file_name: file } ); - //show version exists - if ( - deviceContent.filter((line) => line.match(regexVersion) !== null) - .length > 0 - ) { - const lineShowver = deviceContent.indexOf( + 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 - )[0] - ); - - const showVersion = deviceContent.slice( - lineShowver, - deviceContent.indexOf( + ).length > 0 + ) { + const lineShowver = deviceContent.indexOf( deviceContent.filter( - (line) => line.search("Configuration register") !== -1 + (line) => line.match(regexVersion) !== null )[0] - ) + 1 - ); + ); - 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(); - // let memory = - if (index > 0) { - if (PID !== "" && SN !== "") { - // let RAM = - // showVersion - // .filter((line) => line.includes("bytes of memory")) - // .join("
") - // .match(regexMemory) !== null - // ? ( - // parseInt( - // showVersion - // .filter((line) => - // line.includes("bytes of memory") - // ) - // .join("
") - // .match(regexMemory)[0] - // ) / - // 1024 / - // 1024 - // ).toFixed(2) + "G" - // : ""; + const showVersion = deviceContent.slice( + lineShowver, + deviceContent.indexOf( + deviceContent.filter( + (line) => line.search("Configuration register") !== -1 + )[0] + ) + 1 + ); - // let flash = showVersion - // .filter((line) => - // line.toLocaleLowerCase().includes("compactflash") - // ) - // .join("
"); - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: "", - flash: "", - extraItem: "yes", - }); + 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(); + // let memory = + if (index > 0) { + if (PID !== "" && SN !== "") { + // let RAM = + // showVersion + // .filter((line) => line.includes("bytes of memory")) + // .join("
") + // .match(regexMemory) !== null + // ? ( + // parseInt( + // showVersion + // .filter((line) => + // line.includes("bytes of memory") + // ) + // .join("
") + // .match(regexMemory)[0] + // ) / + // 1024 / + // 1024 + // ).toFixed(2) + "G" + // : ""; - html += `${PID} + // let flash = showVersion + // .filter((line) => + // line.toLocaleLowerCase().includes("compactflash") + // ) + // .join("
"); + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "yes", + }); + + html += `${PID} ${VID} ${SN} yes`; - } - } else { - if (PID !== "" && SN !== "") { - let RAM = - showVersion - .filter((line) => line.includes("bytes of memory") || line.includes("bytes of physical memory")) - .join("
") - .match(regexMemory) !== null - ? ( - parseInt( - showVersion - .filter((line) => - line.includes("bytes of memory") || line.includes("bytes of physical memory") - ) - .join("
") - .match(regexMemory)[0] - ) / - 1024 / - 1024 - ).toFixed(2) + "G" - : ""; - - 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 + } + } 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"; + let RAM = + showVersion + .filter( + (line) => + line.includes("bytes of memory") || + line.includes("bytes of physical memory") + ) + .join("
") + .match(regexMemory) !== null ? ( - parseInt(flash.match(regexMemory)[0]) / + parseInt( + showVersion + .filter( + (line) => + line.includes("bytes of memory") || + line.includes("bytes of physical memory") + ) + .join("
") + .match(regexMemory)[0] + ) / 1024 / 1024 - ).toFixed(2) + "G" - : "", - extraItem: "no", - }); + ).toFixed(2) + + "G (D: " + + memDefaultForPID.split(":")[1] + + ")" + : ""; - html += `${PID} + 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", + }); + + html += `${PID} ${VID} ${SN} ${RAM} @@ -214,96 +279,104 @@ export const sendDeviceInfora = async () => { parseInt(flash.match(regexMemory)[0]) / 1024 / 1024 - ).toFixed(2) + "G" + ).toFixed(2) + + "G (D: " + + memDefaultForPID.split(":")[2] + + ")" : "" } 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(); + }); + } 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: "", - extraItem: "yes", - }); + if (index > 0) { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "yes", + }); - html += `${PID} + html += `${PID} ${VID} ${SN} yes`; - } - } else { - if (PID !== "" && SN !== "") { - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: "", - flash: "", - extraItem: "no", - }); + } + } else { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "no", + }); - html += `${PID} + html += `${PID} ${VID} ${SN} no`; + } } - } - }); - } - }); + }); + } + }); + } } - }); + ); }); - setTimeout(() => { - console.log(listInformation); - const options = { - from: "admin@apactech.io", - to: "joseph@apactech.io", - subject: "SN AUTO REPORT", - html: - "\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - " + - html + - "\ -
PIDVIDSNRAMFlashExtra Item
", - }; - transporter.sendMail(options); + setTimeout(async () => { + if (listInformation.length > 0) { + console.log(listInformation); + const options = { + from: "admin@apactech.io", + to: "joseph@apactech.io", + subject: "SN AUTO REPORT", + html: + "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + " + + html + + "\ +
PIDVIDSNRAMFlashExtra Item
", + }; + transporter.sendMail(options); + + await InfoDevice.createMany(listInformation); + } }, 5000); // const match = "show inventory".match(regexInventory); diff --git a/database/migrations/1696904362937_info_devices.ts b/database/migrations/1696904362937_info_devices.ts new file mode 100644 index 0000000..8d02fad --- /dev/null +++ b/database/migrations/1696904362937_info_devices.ts @@ -0,0 +1,21 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class extends BaseSchema { + protected tableName = 'info_devices' + + public async up () { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + + /** + * Uses timestamptz for PostgreSQL and DATETIME2 for MSSQL + */ + table.timestamp('created_at', { useTz: true }) + table.timestamp('updated_at', { useTz: true }) + }) + } + + public async down () { + this.schema.dropTable(this.tableName) + } +}