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..ca36569 100644
--- a/app/utils/sendDeviceInfor.ts
+++ b/app/utils/sendDeviceInfor.ts
@@ -1,9 +1,10 @@
import Env from "@ioc:Adonis/Core/Env";
import fs from "fs";
import moment from "moment/moment";
-import dotenv from "dotenv";
import nodeMailer from "nodemailer";
-dotenv.config();
+import LogDetectFile from "App/Models/LogDetectFile";
+import InfoDevice from "App/Models/InfoDevice";
+import KeyValue from "App/Models/KeyValue";
export const sendDeviceInfora = async () => {
try {
@@ -13,12 +14,17 @@ 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();
+
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,
@@ -32,179 +38,212 @@ 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 !== "") {
+ listInformation.push({
+ PID: PID,
+ VID: VID,
+ SN: SN,
+ RAM: "",
+ flash: "",
+ extra_item: "yes",
+ });
- html += `
| ${PID} |
+ 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,100 +253,105 @@ 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:
- "\
- \
- \
- | PID | \
- VID | \
- SN | \
- RAM | \
- Flash | \
- Extra Item | \
-
\
- \
- " +
- html +
- "\
-
",
- };
- transporter.sendMail(options);
- }, 5000);
- // const match = "show inventory".match(regexInventory);
+ setTimeout(async () => {
+ if (listInformation.length > 0) {
+ console.log(listInformation);
+ const options = {
+ from: "admin@apactech.io",
+ to: "joseph@apactech.io",
+ subject: "SN AUTO REPORT",
+ html:
+ "\
+ \
+ \
+ | PID | \
+ VID | \
+ SN | \
+ RAM | \
+ Flash | \
+ Extra Item | \
+
\
+ \
+ " +
+ html +
+ "\
+
",
+ };
+ transporter.sendMail(options);
- // console.log(match)
+ await InfoDevice.createMany(listInformation);
+ }
+ }, 5000);
} catch (error) {
console.log(error);
}
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)
+ }
+}