354 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			354 lines
		
	
	
		
			12 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);
 | 
						|
    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) => {
 | 
						|
                    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 !== "") {
 | 
						|
                        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("<br>")
 | 
						|
                            .match(regexMemory) !== null
 | 
						|
                            ? (
 | 
						|
                                parseInt(
 | 
						|
                                  showVersion
 | 
						|
                                    .filter(
 | 
						|
                                      (line) =>
 | 
						|
                                        line.includes("bytes of memory") ||
 | 
						|
                                        line.includes(
 | 
						|
                                          "bytes of physical memory"
 | 
						|
                                        )
 | 
						|
                                    )
 | 
						|
                                    .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);
 | 
						|
    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);
 | 
						|
  }
 | 
						|
};
 |