Merge branch 'main' into develop
This commit is contained in:
		
						commit
						2d87d391bb
					
				| 
						 | 
					@ -5,4 +5,5 @@ coverage
 | 
				
			||||||
.DS_STORE
 | 
					.DS_STORE
 | 
				
			||||||
.env
 | 
					.env
 | 
				
			||||||
app/utils/indexSN.txt
 | 
					app/utils/indexSN.txt
 | 
				
			||||||
 | 
					app/store
 | 
				
			||||||
tmp
 | 
					tmp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,10 +18,23 @@ export default class ErpsController {
 | 
				
			||||||
        // console.log("check!")
 | 
					        // console.log("check!")
 | 
				
			||||||
        const listLog: string[] = [];
 | 
					        const listLog: string[] = [];
 | 
				
			||||||
        const response = await axios.get("http://192.168.5.7:8080/");
 | 
					        const response = await axios.get("http://192.168.5.7:8080/");
 | 
				
			||||||
        const data = response.data;
 | 
					        const responseAUTO = await axios.get(
 | 
				
			||||||
        const arrayLine = data
 | 
					          "http://192.168.5.7:8080/AUTOlog/"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let data1 = response.data
 | 
				
			||||||
          .split("\n")
 | 
					          .split("\n")
 | 
				
			||||||
          .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
					          .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					        let data2 = responseAUTO.data
 | 
				
			||||||
 | 
					          .split("\n")
 | 
				
			||||||
 | 
					          .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const arrayLine = data1.concat(data2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // const arrayLineAUTO = data
 | 
				
			||||||
 | 
					        //   .split("\n")
 | 
				
			||||||
 | 
					        //   .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arrayLine.map((u) => {
 | 
					        arrayLine.map((u) => {
 | 
				
			||||||
          let temp = u
 | 
					          let temp = u
 | 
				
			||||||
            .slice(u.search("<a ") + 9, u.search("</a>"))
 | 
					            .slice(u.search("<a ") + 9, u.search("</a>"))
 | 
				
			||||||
| 
						 | 
					@ -32,7 +45,12 @@ export default class ErpsController {
 | 
				
			||||||
            parseInt(temp?.split("-")[0]) <= to
 | 
					            parseInt(temp?.split("-")[0]) <= to
 | 
				
			||||||
          ) {
 | 
					          ) {
 | 
				
			||||||
            listLog.push(
 | 
					            listLog.push(
 | 
				
			||||||
              "http://192.168.5.7:8080/" +
 | 
					              (u
 | 
				
			||||||
 | 
					                .slice(u.search("<a ") + 9, u.search("</a>"))
 | 
				
			||||||
 | 
					                .split(">")[1]
 | 
				
			||||||
 | 
					                .includes("AUTO")
 | 
				
			||||||
 | 
					                ? "http://192.168.5.7:8080/AUTOlog/"
 | 
				
			||||||
 | 
					                : "http://192.168.5.7:8080/") +
 | 
				
			||||||
                u.slice(u.search("<a ") + 9, u.search("</a>")).split(">")[1] +
 | 
					                u.slice(u.search("<a ") + 9, u.search("</a>")).split(">")[1] +
 | 
				
			||||||
                " "
 | 
					                " "
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
| 
						 | 
					@ -91,7 +109,7 @@ export default class ErpsController {
 | 
				
			||||||
                  ?.split(":")[1]
 | 
					                  ?.split(":")[1]
 | 
				
			||||||
                  ?.replace("\r", "")
 | 
					                  ?.replace("\r", "")
 | 
				
			||||||
                  .trim() !== "" &&
 | 
					                  .trim() !== "" &&
 | 
				
			||||||
                SN !== "N/A"
 | 
					                SN !== "N/A" && SN.length>4
 | 
				
			||||||
              ) {
 | 
					              ) {
 | 
				
			||||||
                if (output.some((u) => u.SN === SN)) {
 | 
					                if (output.some((u) => u.SN === SN)) {
 | 
				
			||||||
                  output.map((u, index) => {
 | 
					                  output.map((u, index) => {
 | 
				
			||||||
| 
						 | 
					@ -153,9 +171,10 @@ export default class ErpsController {
 | 
				
			||||||
                    line: [i + 1],
 | 
					                    line: [i + 1],
 | 
				
			||||||
                    fileName: fName,
 | 
					                    fileName: fName,
 | 
				
			||||||
                    warehouse:
 | 
					                    warehouse:
 | 
				
			||||||
                      fName.search("-US") !== -1 ||
 | 
					                      (fName.search("-US") !== -1 ||
 | 
				
			||||||
                        fName.search(".US") !== -1 ||
 | 
					                        fName.search(".US") !== -1 ||
 | 
				
			||||||
                      fName.search("US-") !== -1
 | 
					                        fName.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                      fName.search("AUS") === -1
 | 
				
			||||||
                        ? "US"
 | 
					                        ? "US"
 | 
				
			||||||
                        : "AU",
 | 
					                        : "AU",
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
| 
						 | 
					@ -164,7 +183,8 @@ export default class ErpsController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              if (arrayLine[i].search("Serial Number") !== -1) {
 | 
					              if (arrayLine[i].search("Serial Number") !== -1) {
 | 
				
			||||||
                let PCB_SN = arrayLine[i]
 | 
					                let PCB_SN = arrayLine[i]
 | 
				
			||||||
                  ?.split("Serial Number")[1].split(":")[1]
 | 
					                  ?.split("Serial Number")[1]
 | 
				
			||||||
 | 
					                  .split(":")[1]
 | 
				
			||||||
                  ?.replace("\r", "")
 | 
					                  ?.replace("\r", "")
 | 
				
			||||||
                  .trim()
 | 
					                  .trim()
 | 
				
			||||||
                  .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, "");
 | 
					                  .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, "");
 | 
				
			||||||
| 
						 | 
					@ -196,9 +216,10 @@ export default class ErpsController {
 | 
				
			||||||
                    line: [i + 1],
 | 
					                    line: [i + 1],
 | 
				
			||||||
                    fileName: fName,
 | 
					                    fileName: fName,
 | 
				
			||||||
                    warehouse:
 | 
					                    warehouse:
 | 
				
			||||||
                      fName.search("-US") !== -1 ||
 | 
					                      (fName.search("-US") !== -1 ||
 | 
				
			||||||
                        fName.search(".US") !== -1 ||
 | 
					                        fName.search(".US") !== -1 ||
 | 
				
			||||||
                      fName.search("US-") !== -1
 | 
					                        fName.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                      fName.search("AUS") === -1
 | 
				
			||||||
                        ? "US"
 | 
					                        ? "US"
 | 
				
			||||||
                        : "AU",
 | 
					                        : "AU",
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
| 
						 | 
					@ -222,9 +243,7 @@ export default class ErpsController {
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                  if (
 | 
					                  if (PBID?.length >= 8) {
 | 
				
			||||||
                    PBID?.length >= 8
 | 
					 | 
				
			||||||
                  ) {
 | 
					 | 
				
			||||||
                    let fName = urls[index]
 | 
					                    let fName = urls[index]
 | 
				
			||||||
                      ?.split("/")
 | 
					                      ?.split("/")
 | 
				
			||||||
                      [urls[index]?.split("/")?.length - 1]?.trim();
 | 
					                      [urls[index]?.split("/")?.length - 1]?.trim();
 | 
				
			||||||
| 
						 | 
					@ -235,9 +254,10 @@ export default class ErpsController {
 | 
				
			||||||
                      line: [i + 1],
 | 
					                      line: [i + 1],
 | 
				
			||||||
                      fileName: fName,
 | 
					                      fileName: fName,
 | 
				
			||||||
                      warehouse:
 | 
					                      warehouse:
 | 
				
			||||||
                      fName.search("-US") !== -1 ||
 | 
					                        (fName.search("-US") !== -1 ||
 | 
				
			||||||
                          fName.search(".US") !== -1 ||
 | 
					                          fName.search(".US") !== -1 ||
 | 
				
			||||||
                      fName.search("US-") !== -1
 | 
					                          fName.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                        fName.search("AUS") === -1
 | 
				
			||||||
                          ? "US"
 | 
					                          ? "US"
 | 
				
			||||||
                          : "AU",
 | 
					                          : "AU",
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
| 
						 | 
					@ -262,7 +282,9 @@ export default class ErpsController {
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        // console.log(report);
 | 
					        // console.log(report);
 | 
				
			||||||
        return report.filter((i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN)===true);
 | 
					        return report.filter(
 | 
				
			||||||
 | 
					          (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !==""
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        // }, 15000);
 | 
					        // }, 15000);
 | 
				
			||||||
      } catch (error) {
 | 
					      } catch (error) {
 | 
				
			||||||
        response
 | 
					        response
 | 
				
			||||||
| 
						 | 
					@ -285,9 +307,11 @@ export default class ErpsController {
 | 
				
			||||||
    const { fileName, line, range } = request.all();
 | 
					    const { fileName, line, range } = request.all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const res = await axios.get("http://192.168.5.7:8080/" + fileName);
 | 
					      let fName =
 | 
				
			||||||
 | 
					        fileName.search("AUTO") !== -1 ? "AUTOlog/" + fileName : fileName;
 | 
				
			||||||
 | 
					      const res = await axios.get("http://192.168.5.7:8080/" + fName);
 | 
				
			||||||
      const arrayLine = res?.data?.split("\n");
 | 
					      const arrayLine = res?.data?.split("\n");
 | 
				
			||||||
      // console.log(arrayLine)
 | 
					
 | 
				
			||||||
      if (range >= line) {
 | 
					      if (range >= line) {
 | 
				
			||||||
        response.status(200).json({
 | 
					        response.status(200).json({
 | 
				
			||||||
          content: arrayLine?.slice(0, line + range)?.join("\n"),
 | 
					          content: arrayLine?.slice(0, line + range)?.join("\n"),
 | 
				
			||||||
| 
						 | 
					@ -300,14 +324,12 @@ export default class ErpsController {
 | 
				
			||||||
    } catch (error) {
 | 
					    } catch (error) {
 | 
				
			||||||
      console.log(error);
 | 
					      console.log(error);
 | 
				
			||||||
      response
 | 
					      response
 | 
				
			||||||
        .status(500)
 | 
					        .status(202)
 | 
				
			||||||
        .send({ mess: "GET CONTENT FILE FAIL", error: error });
 | 
					        .send({ mess: "FILE NOT FOUND", error: error });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async store({request, response}: HttpContextContract) {
 | 
					  public async store({ request, response }: HttpContextContract) {}
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async show({}: HttpContextContract) {}
 | 
					  public async show({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,115 @@
 | 
				
			||||||
 | 
					import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
 | 
				
			||||||
 | 
					import Database from '@ioc:Adonis/Lucid/Database';
 | 
				
			||||||
 | 
					import KeyValue from 'App/Models/KeyValue';
 | 
				
			||||||
 | 
					import LogDetectFile from 'App/Models/LogDetectFile';
 | 
				
			||||||
 | 
					import axios from 'axios';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class LogsController {
 | 
				
			||||||
 | 
					  public async showLog({request, response}: HttpContextContract) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      // fghf
 | 
				
			||||||
 | 
					      console.log(request.params().name);
 | 
				
			||||||
 | 
					      let fileDetect = await LogDetectFile.findBy(
 | 
				
			||||||
 | 
					        "file_name",
 | 
				
			||||||
 | 
					        request.params().name
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      let logsDetect = await Database.rawQuery(
 | 
				
			||||||
 | 
					        "select * from log_reports where id_file = " + fileDetect?.id_ldf
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      let modelSpecialDetected = [];
 | 
				
			||||||
 | 
					      let issueSpecialDetected = [];
 | 
				
			||||||
 | 
					      let listLine = logsDetect[0]
 | 
				
			||||||
 | 
					        .map((obj) => obj.line)
 | 
				
			||||||
 | 
					        .filter((value, index, self) => {
 | 
				
			||||||
 | 
					          return self.indexOf(value) === index;
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .sort((a, b) => a - b);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      const content = await axios.get(
 | 
				
			||||||
 | 
					        request.params().name.search("AUTO") !== -1
 | 
				
			||||||
 | 
					          ? "http://192.168.5.7:8080/AUTOlog/" + request.params().name
 | 
				
			||||||
 | 
					          : "http://192.168.5.7:8080/" + request.params().name
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      let allValue = await KeyValue.all();
 | 
				
			||||||
 | 
					      let listKeyValues = allValue.filter(
 | 
				
			||||||
 | 
					        (i) =>
 | 
				
			||||||
 | 
					          i.$original.key === "MODEL_SPECIAL" ||
 | 
				
			||||||
 | 
					          i.$original.key === "CATCH_FAULTY"
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      let MODEL_SPECIAL = allValue
 | 
				
			||||||
 | 
					        .filter((i) => i.$original.key === "MODEL_SPECIAL")
 | 
				
			||||||
 | 
					        .map((obj) => obj.$original.value);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      let listExcludeErr = allValue
 | 
				
			||||||
 | 
					        .filter((i) => i.$original.key === "EXCLUDE_ERR")
 | 
				
			||||||
 | 
					        .map((obj) => obj.$original.value);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      let data = content.data.split("\n");
 | 
				
			||||||
 | 
					      data.map((line, index) => {
 | 
				
			||||||
 | 
					        data[index] = index + 1 + "|-|" + line;
 | 
				
			||||||
 | 
					        listKeyValues
 | 
				
			||||||
 | 
					          .map((obj) => obj.$original.value)
 | 
				
			||||||
 | 
					          .map(async (value) => {
 | 
				
			||||||
 | 
					            if (
 | 
				
			||||||
 | 
					              line.search(value) !== -1 &&
 | 
				
			||||||
 | 
					              listExcludeErr.filter((err) => line.includes(err)).length === 0
 | 
				
			||||||
 | 
					            ) {
 | 
				
			||||||
 | 
					              data[index] =
 | 
				
			||||||
 | 
					                data[index].slice(0, data[index].search(value)) +
 | 
				
			||||||
 | 
					                "|-|" +
 | 
				
			||||||
 | 
					                value +
 | 
				
			||||||
 | 
					                "|-|" +
 | 
				
			||||||
 | 
					                data[index].slice(data[index].search(value) + value.length);
 | 
				
			||||||
 | 
					              // }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      listLine.map((u) => {
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          if (MODEL_SPECIAL.filter((i) => data[u - 1].includes(i)).length > 0) {
 | 
				
			||||||
 | 
					            modelSpecialDetected.push(data[u - 1]);
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            issueSpecialDetected.push(data[u - 1]);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      let modelSpecial =
 | 
				
			||||||
 | 
					        modelSpecialDetected.length > 0 ? modelSpecialDetected.join("\n") : "";
 | 
				
			||||||
 | 
					      let issueItem =
 | 
				
			||||||
 | 
					        issueSpecialDetected.length > 0 ? issueSpecialDetected.join("\n") : "";
 | 
				
			||||||
 | 
					      response.status(200).send({
 | 
				
			||||||
 | 
					        modelSpecial: modelSpecial,
 | 
				
			||||||
 | 
					        issueItem: issueItem,
 | 
				
			||||||
 | 
					        contentFile: data.join("\n"),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      // console.error(error);
 | 
				
			||||||
 | 
					      response.status(203).send("FILE NOT FOUND");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async getAllLogDetect({request, response}: HttpContextContract) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      let fileDetect = await LogDetectFile.all();
 | 
				
			||||||
 | 
					      let listFiles = fileDetect.map((obj) => obj.file_name);
 | 
				
			||||||
 | 
					      response.status(200).send(listFiles);
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      response.status(203).send("NO FILE");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async store({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async show({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async edit({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async update({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async destroy({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					import type { HttpContextContract } from "@ioc:Adonis/Core/HttpContext";
 | 
				
			||||||
 | 
					import KeyValue from "App/Models/KeyValue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class ValuesController {
 | 
				
			||||||
 | 
					  public async getKeyValue({ request, response }: HttpContextContract) {
 | 
				
			||||||
 | 
					    let data = await KeyValue.all();
 | 
				
			||||||
 | 
					    response.status(200).send(data);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async create({ request, response }: HttpContextContract) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const value = await KeyValue.create({
 | 
				
			||||||
 | 
					        key: request.all().key,
 | 
				
			||||||
 | 
					        value: request.all().value,
 | 
				
			||||||
 | 
					        model: "All",
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      response.status(200).send("ADD VALUE SUCCESS!");
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      response.status(500).send("ADD VALUE FAIL!");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async store({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async show({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async edit({ request, response }: HttpContextContract) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const value = await KeyValue.findOrFail(request.all().id);
 | 
				
			||||||
 | 
					      value.value = request.all().value;
 | 
				
			||||||
 | 
					      await value.save();
 | 
				
			||||||
 | 
					      response.status(200).send("EDIT VALUE SUCCESS!");
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      response.status(500).send("EDIT VALUE FAIL!");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async update({}: HttpContextContract) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async destroy({ request, response }: HttpContextContract) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const value = await KeyValue.findOrFail(request.all().id);
 | 
				
			||||||
 | 
					      await value.delete();
 | 
				
			||||||
 | 
					      response.status(200).send("DELETE VALUE SUCCESS!");
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      response.status(500).send("DELETE VALUE FAIL!");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					import type { HttpContextContract } from "@ioc:Adonis/Core/HttpContext";
 | 
				
			||||||
 | 
					import { loggerAPI } from "App/utils/Logger";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class Logger {
 | 
				
			||||||
 | 
					  public async handle(
 | 
				
			||||||
 | 
					    { request, response }: HttpContextContract,
 | 
				
			||||||
 | 
					    next: () => Promise<void>
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    // code for middleware goes here. ABOVE THE NEXT CALL
 | 
				
			||||||
 | 
					    await next();
 | 
				
			||||||
 | 
					    loggerAPI(request, response, request.url())
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,9 @@ export default class LogDetectFile extends BaseModel {
 | 
				
			||||||
  @column()
 | 
					  @column()
 | 
				
			||||||
  public file_name: string
 | 
					  public file_name: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public last_check_SN: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @column.dateTime({ autoCreate: true })
 | 
					  @column.dateTime({ autoCreate: true })
 | 
				
			||||||
  public created_at: DateTime
 | 
					  public created_at: DateTime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					import { DateTime } from 'luxon'
 | 
				
			||||||
 | 
					import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class Product extends BaseModel {
 | 
				
			||||||
 | 
					  @column({ isPrimary: true })
 | 
				
			||||||
 | 
					  public id_pro: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public PID: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public SN: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public VID: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public line: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public file: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column()
 | 
				
			||||||
 | 
					  public warehouse: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @column.dateTime({ autoCreate: true })
 | 
				
			||||||
 | 
					  public created_at: DateTime
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					import { Server } from 'socket.io'
 | 
				
			||||||
 | 
					import AdonisServer from '@ioc:Adonis/Core/Server'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Ws {
 | 
				
			||||||
 | 
					  public io: Server
 | 
				
			||||||
 | 
					  private booted = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public boot() {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Ignore multiple calls to the boot method
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    if (this.booted) {
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.booted = true
 | 
				
			||||||
 | 
					    this.io = new Server(AdonisServer.instance!)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default new Ws()
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					<h1>fjshdkf</h1>
 | 
				
			||||||
| 
						 | 
					@ -1,26 +0,0 @@
 | 
				
			||||||
fdgdfg
 | 
					 | 
				
			||||||
fksdfk  trace ak
 | 
					 | 
				
			||||||
Power Failure
 | 
					 | 
				
			||||||
ERROR: % Incomplete command
 | 
					 | 
				
			||||||
ERROR: % Incomplete command
 | 
					 | 
				
			||||||
sdfhskd ERROR PVDM3- invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
sdfhskd ERROR PVDM3- invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
sdfhskd ERROR PVDM3- invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shjkg
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shj
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shj
 | 
					 | 
				
			||||||
invalid |IOSXE_RP_NV-3-NV_ACCESS_FAIL|IOSXE_RP_NV-3- shj pak_debug_init sdh
 | 
					 | 
				
			||||||
abc
 | 
					 | 
				
			||||||
123 PVDM3- hui 800G2-POE-2
 | 
					 | 
				
			||||||
anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl
 | 
					 | 
				
			||||||
anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl
 | 
					 | 
				
			||||||
anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl
 | 
					 | 
				
			||||||
123 PVDM3- hui 800G2-POE-2
 | 
					 | 
				
			||||||
123 PVDM3- hui 800G2-POE-2
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
SM-
 | 
					 | 
				
			||||||
SM-
 | 
					 | 
				
			||||||
SM-
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
yellow
 | 
					 | 
				
			||||||
SM-
 | 
					 | 
				
			||||||
WS-X68
 | 
					 | 
				
			||||||
fksdfk  trace ak
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,236 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
set_radius_extended_configsdf
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdf
 | 
					 | 
				
			||||||
fsdsdfsf
 | 
					 | 
				
			||||||
xe xich low
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg
 | 
					 | 
				
			||||||
fghgf
 | 
					 | 
				
			||||||
fghgfdfjgdfkjgerr
 | 
					 | 
				
			||||||
dfhkhjh
 | 
					 | 
				
			||||||
cong hoa xa hoi chu nghia
 | 
					 | 
				
			||||||
djgkdbsk
 | 
					 | 
				
			||||||
dfhjđhd 
 | 
					 | 
				
			||||||
error
 | 
					 | 
				
			||||||
con co be begkklg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dhmkfhd
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
dfkbdfnlkbndflbd
 | 
					 | 
				
			||||||
trace 
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
fault
 | 
					 | 
				
			||||||
err
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
trace
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_radius_extended_configsdfsdfdfhfg err
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,70 @@
 | 
				
			||||||
 | 
					import fs from 'fs';
 | 
				
			||||||
 | 
					import moment from "moment";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const shortenStringsInObject = (obj, maxLength) => {
 | 
				
			||||||
 | 
					    // Kiểm tra nếu obj không phải là một đối tượng hoặc maxLength không phải là một số
 | 
				
			||||||
 | 
					    if (typeof obj !== 'object' || typeof maxLength !== 'number') {
 | 
				
			||||||
 | 
					      return obj;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    // Duyệt qua các thuộc tính của đối tượng
 | 
				
			||||||
 | 
					    for (const key in obj) {
 | 
				
			||||||
 | 
					      if (obj.hasOwnProperty(key)) {
 | 
				
			||||||
 | 
					        // Kiểm tra nếu thuộc tính là một chuỗi và độ dài của chuỗi lớn hơn maxLength
 | 
				
			||||||
 | 
					        if (typeof obj[key] === 'string' && obj[key].length > maxLength) {
 | 
				
			||||||
 | 
					          // Rút ngắn chuỗi lại maxLength ký tự
 | 
				
			||||||
 | 
					          obj[key] = obj[key].substring(0, maxLength);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Array.isArray(obj) && obj.length > 10) {
 | 
				
			||||||
 | 
					        // Rút ngắn chuỗi lại maxLength ký tự
 | 
				
			||||||
 | 
					        obj = "[Array:"+obj.length+"]\n"+obj.slice(0,15)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return obj;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function loggerAPI(req, res, location) {
 | 
				
			||||||
 | 
					    let old_data = "";
 | 
				
			||||||
 | 
					    let resBody = res.getBody()
 | 
				
			||||||
 | 
					    // let body = shortenStringsInObject(resBody, 300)
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const fileName =
 | 
				
			||||||
 | 
					        "./app/store/logsAPI/" +
 | 
				
			||||||
 | 
					        moment(Date.now()).format("DD_MM_YYYY").toString() +
 | 
				
			||||||
 | 
					        ".log";
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      let logInfo =
 | 
				
			||||||
 | 
					        "\n\n[" +
 | 
				
			||||||
 | 
					        moment(Date.now()).format("D/M/YY-HH:mm:ss") +
 | 
				
			||||||
 | 
					        "] - " +
 | 
				
			||||||
 | 
					        res.getStatus() +
 | 
				
			||||||
 | 
					        " - " +
 | 
				
			||||||
 | 
					        location +
 | 
				
			||||||
 | 
					        "\n------PAYLOAD------\n" +
 | 
				
			||||||
 | 
					        JSON.stringify(req.all(), null, 2) +
 | 
				
			||||||
 | 
					        "\n------PARAMS-------\n" +
 | 
				
			||||||
 | 
					        JSON.stringify(req.params(), null, 2) +
 | 
				
			||||||
 | 
					        "\n-----RESPONSE------\n" +
 | 
				
			||||||
 | 
					        JSON.stringify(resBody, null, 2) +
 | 
				
			||||||
 | 
					        "\n------HEADERS------\n" +
 | 
				
			||||||
 | 
					        JSON.stringify(req.headers(), null, 2) +
 | 
				
			||||||
 | 
					        "\n\n======================================================================";
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      fs.exists(fileName, async (exists) => {
 | 
				
			||||||
 | 
					        if (exists) {
 | 
				
			||||||
 | 
					          old_data = await fs.readFileSync(fileName, "utf8");
 | 
				
			||||||
 | 
					          fs.writeFileSync(fileName, old_data + logInfo);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          fs.writeFileSync(fileName, old_data + logInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      res.status(500).send("CAN'T WRITE LOG");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,204 @@
 | 
				
			||||||
 | 
					import Env from "@ioc:Adonis/Core/Env";
 | 
				
			||||||
 | 
					// const axios = require("axios");
 | 
				
			||||||
 | 
					// import fs from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const checkIndexSN = async (content, beginLine, nameF) => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const arrayLine = content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let output = [];
 | 
				
			||||||
 | 
					    if (arrayLine !== undefined) {
 | 
				
			||||||
 | 
					      for (let i = 0; i < arrayLine.length; i++) {
 | 
				
			||||||
 | 
					        let SN = arrayLine[i]
 | 
				
			||||||
 | 
					          ?.split("SN:")[1]
 | 
				
			||||||
 | 
					          ?.trim()
 | 
				
			||||||
 | 
					          .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, "");
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          arrayLine[i].search("PID:") !== -1 &&
 | 
				
			||||||
 | 
					          arrayLine[i].search("SN:") !== -1 &&
 | 
				
			||||||
 | 
					          arrayLine[i].search("%") === -1 &&
 | 
				
			||||||
 | 
					          arrayLine[i]
 | 
				
			||||||
 | 
					            ?.split(",")[2]
 | 
				
			||||||
 | 
					            ?.split(":")[1]
 | 
				
			||||||
 | 
					            ?.replace("\r", "")
 | 
				
			||||||
 | 
					            .trim() !== "" &&
 | 
				
			||||||
 | 
					          SN !== "N/A" &&
 | 
				
			||||||
 | 
					          SN.length > 4 &&
 | 
				
			||||||
 | 
					          i >= beginLine
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          if (output.some((u) => u.SN === SN)) {
 | 
				
			||||||
 | 
					            output.map((u, index) => {
 | 
				
			||||||
 | 
					              if (u.SN === SN) {
 | 
				
			||||||
 | 
					                output[index].PID =
 | 
				
			||||||
 | 
					                  arrayLine[i]?.split("VID:")[0] !== undefined
 | 
				
			||||||
 | 
					                    ? arrayLine[i]
 | 
				
			||||||
 | 
					                        ?.split("VID:")[0]
 | 
				
			||||||
 | 
					                        ?.slice(arrayLine[i]?.split("VID:")[0]?.search("PID"))
 | 
				
			||||||
 | 
					                        ?.split(":")[1]
 | 
				
			||||||
 | 
					                        ?.split(",")[0]
 | 
				
			||||||
 | 
					                        ?.trim()
 | 
				
			||||||
 | 
					                    : "";
 | 
				
			||||||
 | 
					                (output[index].VID =
 | 
				
			||||||
 | 
					                  arrayLine[i]?.split("SN:")[0] !== undefined
 | 
				
			||||||
 | 
					                    ? arrayLine[i]
 | 
				
			||||||
 | 
					                        ?.split("SN:")[0]
 | 
				
			||||||
 | 
					                        ?.split("VID:")[1]
 | 
				
			||||||
 | 
					                        ?.split(",")[0]
 | 
				
			||||||
 | 
					                        ?.trim()
 | 
				
			||||||
 | 
					                    : ""),
 | 
				
			||||||
 | 
					                  (output[index].line = output[index].line.concat([i + 1]));
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            output.push({
 | 
				
			||||||
 | 
					              PID:
 | 
				
			||||||
 | 
					                arrayLine[i]?.split("VID:")[0] !== undefined
 | 
				
			||||||
 | 
					                  ? arrayLine[i]
 | 
				
			||||||
 | 
					                      ?.split("VID:")[0]
 | 
				
			||||||
 | 
					                      ?.slice(arrayLine[i]?.split("VID:")[0]?.search("PID"))
 | 
				
			||||||
 | 
					                      ?.split(":")[1]
 | 
				
			||||||
 | 
					                      ?.split(",")[0]
 | 
				
			||||||
 | 
					                      ?.trim()
 | 
				
			||||||
 | 
					                  : "",
 | 
				
			||||||
 | 
					              VID:
 | 
				
			||||||
 | 
					                arrayLine[i]?.split("SN:")[0] !== undefined
 | 
				
			||||||
 | 
					                  ? arrayLine[i]
 | 
				
			||||||
 | 
					                      ?.split("SN:")[0]
 | 
				
			||||||
 | 
					                      ?.split("VID:")[1]
 | 
				
			||||||
 | 
					                      ?.split(",")[0]
 | 
				
			||||||
 | 
					                      ?.trim()
 | 
				
			||||||
 | 
					                  : "",
 | 
				
			||||||
 | 
					              SN:
 | 
				
			||||||
 | 
					                arrayLine[i].split("SN:")[1] !== undefined
 | 
				
			||||||
 | 
					                  ? SN.search(" ") !== -1
 | 
				
			||||||
 | 
					                    ? SN?.split(" ")[0]
 | 
				
			||||||
 | 
					                    : SN
 | 
				
			||||||
 | 
					                  : "",
 | 
				
			||||||
 | 
					              line: [i + 1],
 | 
				
			||||||
 | 
					              fileName: nameF,
 | 
				
			||||||
 | 
					              warehouse:
 | 
				
			||||||
 | 
					                (nameF.search("-US") !== -1 ||
 | 
				
			||||||
 | 
					                  nameF.search(".US") !== -1 ||
 | 
				
			||||||
 | 
					                  nameF.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                nameF.search("AUS") === -1
 | 
				
			||||||
 | 
					                  ? "US"
 | 
				
			||||||
 | 
					                  : "AU",
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (arrayLine[i].search("Serial Number") !== -1 && i >= beginLine) {
 | 
				
			||||||
 | 
					          let PCB_SN = arrayLine[i]
 | 
				
			||||||
 | 
					            ?.split("Serial Number")[1]
 | 
				
			||||||
 | 
					            .split(":")[1]
 | 
				
			||||||
 | 
					            ?.replace("\r", "")
 | 
				
			||||||
 | 
					            .trim()
 | 
				
			||||||
 | 
					            .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, "");
 | 
				
			||||||
 | 
					          if (
 | 
				
			||||||
 | 
					            //Neu SN da nam trong output
 | 
				
			||||||
 | 
					            output.some((u) => u.SN === PCB_SN)
 | 
				
			||||||
 | 
					          ) {
 | 
				
			||||||
 | 
					            output.map((u, index) => {
 | 
				
			||||||
 | 
					              if (u.SN === PCB_SN) {
 | 
				
			||||||
 | 
					                output[index].line = output[index].line.concat([i + 1]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            // if (
 | 
				
			||||||
 | 
					            //   /^[A-Z0-9-]{5,}$/.test(
 | 
				
			||||||
 | 
					            //     PCB_SN
 | 
				
			||||||
 | 
					            //   )
 | 
				
			||||||
 | 
					            // ) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            output.push({
 | 
				
			||||||
 | 
					              PID: "",
 | 
				
			||||||
 | 
					              VID: "",
 | 
				
			||||||
 | 
					              SN: PCB_SN?.search(" ") !== -1 ? PCB_SN?.split(" ")[0] : PCB_SN,
 | 
				
			||||||
 | 
					              line: [i + 1],
 | 
				
			||||||
 | 
					              fileName: nameF,
 | 
				
			||||||
 | 
					              warehouse:
 | 
				
			||||||
 | 
					                (nameF.search("-US") !== -1 ||
 | 
				
			||||||
 | 
					                  nameF.search(".US") !== -1 ||
 | 
				
			||||||
 | 
					                  nameF.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                nameF.search("AUS") === -1
 | 
				
			||||||
 | 
					                  ? "US"
 | 
				
			||||||
 | 
					                  : "AU",
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          arrayLine[i].search("Processor board ID") !== -1 &&
 | 
				
			||||||
 | 
					          i >= beginLine
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          let PBID = arrayLine[i]
 | 
				
			||||||
 | 
					            ?.split(" ")
 | 
				
			||||||
 | 
					            [arrayLine[i]?.split(" ").length - 1]?.replace("\r", "")
 | 
				
			||||||
 | 
					            .trim()
 | 
				
			||||||
 | 
					            .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, "");
 | 
				
			||||||
 | 
					          if (
 | 
				
			||||||
 | 
					            //Neu SN da nam trong output
 | 
				
			||||||
 | 
					            output.some((u) => u.SN === PBID)
 | 
				
			||||||
 | 
					          ) {
 | 
				
			||||||
 | 
					            output.map((u, index) => {
 | 
				
			||||||
 | 
					              if (u.SN === PBID) {
 | 
				
			||||||
 | 
					                output[index].line = output[index].line.concat([i + 1]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            if (PBID?.length >= 8) {
 | 
				
			||||||
 | 
					              output.push({
 | 
				
			||||||
 | 
					                PID: "",
 | 
				
			||||||
 | 
					                VID: "",
 | 
				
			||||||
 | 
					                SN: PBID?.search(" ") !== -1 ? PBID?.split(" ")[0] : PBID,
 | 
				
			||||||
 | 
					                line: [i + 1],
 | 
				
			||||||
 | 
					                fileName: nameF,
 | 
				
			||||||
 | 
					                warehouse:
 | 
				
			||||||
 | 
					                  (nameF.search("-US") !== -1 ||
 | 
				
			||||||
 | 
					                    nameF.search(".US") !== -1 ||
 | 
				
			||||||
 | 
					                    nameF.search("US-") !== -1) &&
 | 
				
			||||||
 | 
					                  nameF.search("AUS") === -1
 | 
				
			||||||
 | 
					                    ? "US"
 | 
				
			||||||
 | 
					                    : "AU",
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      //   console.log(nameF+" output\n", output);
 | 
				
			||||||
 | 
					      if (output.filter((i) => i.PID !== "").length > 0) {
 | 
				
			||||||
 | 
					        let token =
 | 
				
			||||||
 | 
					          "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uc3d0ZWFtLm5ldC9hcGkvbG9naW4iLCJpYXQiOjE2ODkzOTEyMDMsImV4cCI6MTcyMDkyNzIwMywibmJmIjoxNjg5MzkxMjAzLCJqdGkiOiJreFA1MW9jck5rdEYzSzY3Iiwic3ViIjozNjkwLCJwcnYiOiJjOGVlMWZjODllNzc1ZWM0YzczODY2N2U1YmUxN2E1OTBiNmQ0MGZjIn0.p-aE0oWkKmdrcKWD94oSmMd_CMbY_4MoqADIwYIhIKw";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let token_int =
 | 
				
			||||||
 | 
					          "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2ludC5pcHN1cHBseS5jb20uYXUvYXBpL2xvZ2luIiwiaWF0IjoxNjg5ODYyNjAxLCJleHAiOjE3MjEzOTg2MDEsIm5iZiI6MTY4OTg2MjYwMSwianRpIjoiUElZVjNBM3ZPQVlMQ081SyIsInN1YiI6MSwicHJ2IjoiYzhlZTFmYzg5ZTc3NWVjNGM3Mzg2NjdlNWJlMTdhNTkwYjZkNDBmYyJ9.UcybIKMBjTAY9i0PfIDQMtqHyN72Ul0jC03ZDGLGpMI";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let data = {
 | 
				
			||||||
 | 
					          data: output.filter((i) => i.PID !== ""),
 | 
				
			||||||
 | 
					          urlAPI: "/api/test-log-serial-number/save-data",
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const response = await axios.post(
 | 
				
			||||||
 | 
					          "https://api.nswteam.net/api/transferPostData",
 | 
				
			||||||
 | 
					          data,
 | 
				
			||||||
 | 
					          { headers: { Authorization: "Bearer " + token } }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (Env.get("RUN_ENV") === "prod") {
 | 
				
			||||||
 | 
					          const response_int = await axios.post(
 | 
				
			||||||
 | 
					            "https://int.ipsupply.com.au/api/transferPostData",
 | 
				
			||||||
 | 
					            data,
 | 
				
			||||||
 | 
					            { headers: { Authorization: "Bearer " + token_int } }
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          console.log(nameF + " response\n", response_int.data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.log("Can't connect to log server", error);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function deleteMessagesZulip(streamName, topicName, numOfDay) {
 | 
				
			||||||
 | 
					  const config = {
 | 
				
			||||||
 | 
					    zuliprc: "./download",
 | 
				
			||||||
 | 
					    zulipVersion: "v2",
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const client = await zulip(config);
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const messages = await client.messages.retrieve({
 | 
				
			||||||
 | 
					      anchor: "oldest",
 | 
				
			||||||
 | 
					      num_before: 0,
 | 
				
			||||||
 | 
					      num_after: 5000,
 | 
				
			||||||
 | 
					      narrow: [
 | 
				
			||||||
 | 
					        { operator: "stream", operand: streamName },
 | 
				
			||||||
 | 
					        { operator: "topic", operand: topicName },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    // console.log(messages.messages.map(u=>u.reactions))
 | 
				
			||||||
 | 
					    const members = await client.users.retrieve();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // console.log(members.members)
 | 
				
			||||||
 | 
					    for (const message of messages.messages) {
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        message.reactions.filter(
 | 
				
			||||||
 | 
					          (i) =>
 | 
				
			||||||
 | 
					            i.emoji_name === "working_on_it" &&
 | 
				
			||||||
 | 
					            members.members.filter((u) => u.user_id === i.user_id)[0]
 | 
				
			||||||
 | 
					              .is_admin === true
 | 
				
			||||||
 | 
					        ).length === 0 &&
 | 
				
			||||||
 | 
					        message.timestamp <
 | 
				
			||||||
 | 
					          Math.floor((Date.now() - 60000 * 60 * 24 * numOfDay) / 1000)
 | 
				
			||||||
 | 
					      ) {
 | 
				
			||||||
 | 
					        const res = await client.messages.deleteById({
 | 
				
			||||||
 | 
					          message_id: message.id,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        console.log(`Deleted message ID ${message.id}`);
 | 
				
			||||||
 | 
					        // console.log(res)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.error("Error:", error);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,3 @@
 | 
				
			||||||
import LogReport from "App/Models/LogReport";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export async function getListLineByItem(listReport) {
 | 
					export async function getListLineByItem(listReport) {
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    // Mảng ban đầu
 | 
					    // Mảng ban đầu
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,75 @@
 | 
				
			||||||
 | 
					const puppeteer = require("puppeteer");
 | 
				
			||||||
 | 
					const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(async () => {
 | 
				
			||||||
 | 
					  // Launch a headless browser
 | 
				
			||||||
 | 
					  const browser = await puppeteer.launch({
 | 
				
			||||||
 | 
					    headless: true,
 | 
				
			||||||
 | 
					    args: ["--no-sandbox"],
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  const config = {
 | 
				
			||||||
 | 
					    username: "networktool-bot@zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					    apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
 | 
				
			||||||
 | 
					    realm: "https://zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const client = await zulip(config);
 | 
				
			||||||
 | 
					  const page = await browser.newPage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Điều hướng đến trang web chứa thẻ <a>
 | 
				
			||||||
 | 
					  await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Tìm thẻ <a> cần click dựa trên selector CSS hoặc XPath
 | 
				
			||||||
 | 
					  const selectBoxSelector1 = "select#idCongTyDienLuc";
 | 
				
			||||||
 | 
					  await page.waitForSelector(selectBoxSelector1);
 | 
				
			||||||
 | 
					  await page.select(selectBoxSelector1, "PB11");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Chờ cho trang mới mở
 | 
				
			||||||
 | 
					  // await page.waitForNavigation('select#idCongTyDienLuc');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // In ra nội dung của trang mới
 | 
				
			||||||
 | 
					  setTimeout(async () => {
 | 
				
			||||||
 | 
					    const tableData = await page.evaluate(() => {
 | 
				
			||||||
 | 
					      const tbody = document.querySelector("tbody"); // Lựa chọn thẻ <tbody> cần trích xuất
 | 
				
			||||||
 | 
					      const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ <tr>) bên trong thẻ <tbody>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Lặp qua từng hàng và lấy nội dung của các cột (thẻ <td>) trong hàng
 | 
				
			||||||
 | 
					      const data = [];
 | 
				
			||||||
 | 
					      rows.forEach((row) => {
 | 
				
			||||||
 | 
					        const columns = Array.from(row.querySelectorAll("td")); // Lựa chọn tất cả các cột (thẻ <td>) trong hàng
 | 
				
			||||||
 | 
					        const rowData = columns.map((column) => column.textContent.trim()); // Lấy nội dung của các cột và xóa khoảng trắng
 | 
				
			||||||
 | 
					        data.push(rowData); // Thêm dữ liệu của hàng vào mảng data
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return data.map((u) => u.join("\n\n"));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log("Table data:", tableData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await browser.close();
 | 
				
			||||||
 | 
					    let params = {
 | 
				
			||||||
 | 
					      type: "stream",
 | 
				
			||||||
 | 
					      to: "networkToolBot",
 | 
				
			||||||
 | 
					      topic: "powerSchedule",
 | 
				
			||||||
 | 
					      content:
 | 
				
			||||||
 | 
					        ":warning: :date: :warning:\n\n" + tableData.join("\n\n") + "\n-------",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    client.messages.send(params);
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					      tableData.filter((i) => i.includes("KDC 91B") || i.includes("KDC91B"))
 | 
				
			||||||
 | 
					        .length > 0
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					      let params = {
 | 
				
			||||||
 | 
					        type: "stream",
 | 
				
			||||||
 | 
					        to: "Result test - auto.nswteam.net",
 | 
				
			||||||
 | 
					        topic: "Lịch cúp điện",
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          ":warning: :date: :warning:\n\n" +
 | 
				
			||||||
 | 
					          tableData
 | 
				
			||||||
 | 
					            .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B"))[0]
 | 
				
			||||||
 | 
					            .replace(/KDC 91B/g, "**KDC 91B**") +
 | 
				
			||||||
 | 
					          "\n-------",
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      client.messages.send(params);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }, 5000);
 | 
				
			||||||
 | 
					})();
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					import Env from "@ioc:Adonis/Core/Env";
 | 
				
			||||||
import fs from "fs";
 | 
					import fs from "fs";
 | 
				
			||||||
import chokidar from "chokidar";
 | 
					import chokidar from "chokidar";
 | 
				
			||||||
import moment from "moment";
 | 
					import moment from "moment";
 | 
				
			||||||
| 
						 | 
					@ -7,14 +8,12 @@ import KeyValue from "App/Models/KeyValue";
 | 
				
			||||||
import Database from "@ioc:Adonis/Lucid/Database";
 | 
					import Database from "@ioc:Adonis/Lucid/Database";
 | 
				
			||||||
import { sendMessToZulip } from "./sendMessToZulip";
 | 
					import { sendMessToZulip } from "./sendMessToZulip";
 | 
				
			||||||
import { getListLineByItem } from "./getListLineByItem";
 | 
					import { getListLineByItem } from "./getListLineByItem";
 | 
				
			||||||
 | 
					import { checkIndexSN } from "./checkIndexSN";
 | 
				
			||||||
// export default class loggerAPI {
 | 
					import { DateTime } from "luxon";
 | 
				
			||||||
export async function runtimeCheckLogs(folderPath) {
 | 
					export async function runtimeCheckLogs(folderPath) {
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    let fileList = Array();
 | 
					    let fileList = Array();
 | 
				
			||||||
    let fileList_old = Array();
 | 
					    let fileList_old = Array();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // console.log(listKeyValues.map(obj=>obj.$original.value))
 | 
					 | 
				
			||||||
    // Function to update the list of files
 | 
					    // Function to update the list of files
 | 
				
			||||||
    async function updateFileList() {
 | 
					    async function updateFileList() {
 | 
				
			||||||
      //get date now
 | 
					      //get date now
 | 
				
			||||||
| 
						 | 
					@ -35,24 +34,57 @@ export async function runtimeCheckLogs(folderPath) {
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const checkSpecialVersion = (paragraph) => {
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        const regex = /\(CAT3K_CAA-UNIVERSALK9-M\), Version 16\.9\.[2-9]/;
 | 
				
			||||||
 | 
					        const regex1 =
 | 
				
			||||||
 | 
					          /\(CAT3K_CAA-UNIVERSALK9-M\), Version 1[7-9]\.[0-9]\.[0-9]/;
 | 
				
			||||||
 | 
					        const regex2 =
 | 
				
			||||||
 | 
					          /\(CAT3K_CAA-UNIVERSALK9-M\), Version [2-9][0-9]\.[0-9]\.[0-9]/;
 | 
				
			||||||
 | 
					        // Use the regular expression to find the match
 | 
				
			||||||
 | 
					        const match = paragraph.match(regex);
 | 
				
			||||||
 | 
					        const match1 = paragraph.match(regex1);
 | 
				
			||||||
 | 
					        const match2 = paragraph.match(regex2);
 | 
				
			||||||
 | 
					        if (match || match1 || match2) {
 | 
				
			||||||
 | 
					          if (match) {
 | 
				
			||||||
 | 
					            return match[0];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (match1) {
 | 
				
			||||||
 | 
					            return match1[0];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (match2) {
 | 
				
			||||||
 | 
					            return match2[0];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          return "";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } catch (error) {
 | 
				
			||||||
 | 
					        console.log(error);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    // Watch the folder for new files
 | 
					    // Watch the folder for new files
 | 
				
			||||||
    const folderWatcher = chokidar.watch(folderPath);
 | 
					    const folderWatcher = chokidar.watch(folderPath);
 | 
				
			||||||
    // folderWatcher.setMaxListeners(20);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    folderWatcher.on("add", async (filePath) => {
 | 
					    folderWatcher.on("add", async (filePath) => {
 | 
				
			||||||
      //import log new file
 | 
					      //import log new file
 | 
				
			||||||
      // console.log(filePath)
 | 
					      //check format file name
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        //Sua \\ --> /
 | 
					 | 
				
			||||||
        filePath?.split(".")[filePath.split(".").length - 1] === "log" &&
 | 
					        filePath?.split(".")[filePath.split(".").length - 1] === "log" &&
 | 
				
			||||||
        filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] ===
 | 
					        filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] ===
 | 
				
			||||||
 | 
					        //localhost
 | 
				
			||||||
 | 
					        // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] ===
 | 
				
			||||||
          moment(Date.now()).format("YYYYMMDD").toString()
 | 
					          moment(Date.now()).format("YYYYMMDD").toString()
 | 
				
			||||||
      ) {
 | 
					      ) {
 | 
				
			||||||
 | 
					        //add information file to database
 | 
				
			||||||
        console.log("New file added: ", filePath);
 | 
					        console.log("New file added: ", filePath);
 | 
				
			||||||
        await LogDetectFile.firstOrCreate(
 | 
					        await LogDetectFile.firstOrCreate(
 | 
				
			||||||
          { file_name: filePath.split("/")[filePath.split("/").length - 1] },
 | 
					          { file_name: filePath.split("/")[filePath.split("/").length - 1] },
 | 
				
			||||||
          { file_name: filePath.split("/")[filePath.split("/").length - 1] }
 | 
					          { file_name: filePath.split("/")[filePath.split("/").length - 1] }
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //localhost
 | 
				
			||||||
        // await LogDetectFile.firstOrCreate(
 | 
					        // await LogDetectFile.firstOrCreate(
 | 
				
			||||||
        //   { file_name: filePath.split("\\")[filePath.split("\\").length - 1] },
 | 
					        //   { file_name: filePath.split("\\")[filePath.split("\\").length - 1] },
 | 
				
			||||||
        //   { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }
 | 
					        //   { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }
 | 
				
			||||||
| 
						 | 
					@ -67,72 +99,103 @@ export async function runtimeCheckLogs(folderPath) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Watch for changes in the files listed
 | 
					    // Watch for changes in the files listed
 | 
				
			||||||
    async function watchFilesInList() {
 | 
					    async function watchFilesInList() {
 | 
				
			||||||
      // console.log("--------->", fileList);
 | 
					      //only check new file ---> fileList - fileList_old = new file
 | 
				
			||||||
      //get date now
 | 
					      let listFileWatch = fileList
 | 
				
			||||||
 | 
					 | 
				
			||||||
      //check new file
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await fileList
 | 
					 | 
				
			||||||
        ?.filter((i) => fileList_old.includes(i) === false)
 | 
					        ?.filter((i) => fileList_old.includes(i) === false)
 | 
				
			||||||
        ?.forEach((fileName) => {
 | 
					        .map((file) => folderPath + "/" + file);
 | 
				
			||||||
          //path file
 | 
					      const watcher = chokidar.watch(listFileWatch, {
 | 
				
			||||||
          const filePath = `${folderPath}/${fileName}`;
 | 
					        persistent: true,
 | 
				
			||||||
          const scan = fs.watchFile(
 | 
					        usePolling: true,
 | 
				
			||||||
            filePath,
 | 
					        interval: 300000,
 | 
				
			||||||
            { interval: 300000 },
 | 
					      });
 | 
				
			||||||
            async (eventType) => {
 | 
					
 | 
				
			||||||
 | 
					      watcher.setMaxListeners(200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      watcher.on("change", async (path) => {
 | 
				
			||||||
 | 
					        // fs.watchFile(filePath,{ interval: 15000 },
 | 
				
			||||||
 | 
					        // async (eventType) => {
 | 
				
			||||||
        //check special item, extra RAM, error in log
 | 
					        //check special item, extra RAM, error in log
 | 
				
			||||||
 | 
					        const fileName = path.split("/")[path.split("/").length - 1];
 | 
				
			||||||
 | 
					        // const fileName = path.split("\\")[path.split("\\").length - 1];
 | 
				
			||||||
 | 
					        const filePath = path;
 | 
				
			||||||
        let lines = [];
 | 
					        let lines = [];
 | 
				
			||||||
              let content = await fs
 | 
					        const today = DateTime.now().toFormat("yyyy-MM-dd");
 | 
				
			||||||
 | 
					        let allFile = await LogDetectFile.query().whereRaw(
 | 
				
			||||||
 | 
					          `DATE(created_at) = ?`,
 | 
				
			||||||
 | 
					          [today]
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        // let allReport = await LogReport.all();
 | 
				
			||||||
 | 
					        let allValue = await KeyValue.all();
 | 
				
			||||||
 | 
					        const allReport = await LogReport.query().whereRaw(
 | 
				
			||||||
 | 
					          `DATE(created_at) = ?`,
 | 
				
			||||||
 | 
					          [today]
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get information file
 | 
				
			||||||
 | 
					        let fileDetect = allFile?.filter(
 | 
				
			||||||
 | 
					          (i) => i.$original.file_name === fileName
 | 
				
			||||||
 | 
					        )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let logsDetect = allReport?.filter(
 | 
				
			||||||
 | 
					          (i) => i.$original.id_file === fileDetect?.id_ldf
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        //get the last line detected
 | 
				
			||||||
 | 
					        let lastLine = Math.max(...logsDetect.map((obj) => obj.line));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get content file in local
 | 
				
			||||||
 | 
					        let contentFile = await fs
 | 
				
			||||||
          .readFileSync(filePath)
 | 
					          .readFileSync(filePath)
 | 
				
			||||||
          .toString()
 | 
					          .toString()
 | 
				
			||||||
          ?.split("\n");
 | 
					          ?.split("\n");
 | 
				
			||||||
              let allValue = await KeyValue.all();
 | 
					
 | 
				
			||||||
 | 
					        //get index SN and send to ERP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        checkIndexSN(contentFile, lastLine, fileName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get list item to check
 | 
				
			||||||
        let listKeyValues = allValue.filter(
 | 
					        let listKeyValues = allValue.filter(
 | 
				
			||||||
          (i) =>
 | 
					          (i) =>
 | 
				
			||||||
            i.$original.key === "MODEL_SPECIAL" ||
 | 
					            i.$original.key === "MODEL_SPECIAL" ||
 | 
				
			||||||
            i.$original.key === "CATCH_FAULTY"
 | 
					            i.$original.key === "CATCH_FAULTY"
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get list exclude error
 | 
				
			||||||
        let listExcludeErr = allValue
 | 
					        let listExcludeErr = allValue
 | 
				
			||||||
          .filter((i) => i.$original.key === "EXCLUDE_ERR")
 | 
					          .filter((i) => i.$original.key === "EXCLUDE_ERR")
 | 
				
			||||||
          .map((obj) => obj.$original.value);
 | 
					          .map((obj) => obj.$original.value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //get list item special
 | 
				
			||||||
        let listExtraItem = allValue
 | 
					        let listExtraItem = allValue
 | 
				
			||||||
          .filter((i) => i.$original.key === "MODEL_SPECIAL")
 | 
					          .filter((i) => i.$original.key === "MODEL_SPECIAL")
 | 
				
			||||||
          .map((obj) => obj.$original.value);
 | 
					          .map((obj) => obj.$original.value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                console.log(listExtraItem)
 | 
					        //Process file content
 | 
				
			||||||
              content.map((line, index) => {
 | 
					        if (contentFile.length > 50000) {
 | 
				
			||||||
 | 
					          for (let i = 0; i < contentFile.length; i += 1000) {
 | 
				
			||||||
 | 
					            const chunk = contentFile.slice(i, i + 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            chunk.map(async (line, index) => {
 | 
				
			||||||
 | 
					              //check line the line with errors and exclude errors
 | 
				
			||||||
              listKeyValues
 | 
					              listKeyValues
 | 
				
			||||||
                .map((obj) => obj.$original.value)
 | 
					                .map((obj) => obj.$original.value)
 | 
				
			||||||
                .map(async (value) => {
 | 
					                .map(async (value) => {
 | 
				
			||||||
                  if (
 | 
					                  if (
 | 
				
			||||||
                      line.search(value) !== -1 &&
 | 
					                    line.includes(value) &&
 | 
				
			||||||
                    listExcludeErr.filter((err) => line.includes(err))
 | 
					                    listExcludeErr.filter((err) => line.includes(err))
 | 
				
			||||||
                      .length === 0
 | 
					                      .length === 0
 | 
				
			||||||
                  ) {
 | 
					                  ) {
 | 
				
			||||||
                      // let keyWord = "";
 | 
					                    let log = allFile?.filter(
 | 
				
			||||||
                      // line.split(" ").map((word) => {
 | 
					                      (i) => i.$original.file_name === fileName
 | 
				
			||||||
                      //   if (word.toLocaleLowerCase().includes(value)) {
 | 
					                    )[0];
 | 
				
			||||||
                      //     keyWord = keyWord + word;
 | 
					
 | 
				
			||||||
                      //   }
 | 
					                    let checkLog = allReport?.filter(
 | 
				
			||||||
                      // });
 | 
					                      (report) =>
 | 
				
			||||||
                      // if (value.length === keyWord.length) {
 | 
					                        report.$original.id_file === log?.id_ldf &&
 | 
				
			||||||
                      const log = await LogDetectFile.findBy(
 | 
					                        report.$original.line === index + 1 &&
 | 
				
			||||||
                        "file_name",
 | 
					                        report.$original.detected_content === value
 | 
				
			||||||
                        fileName
 | 
					 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                      let checkLog = await Database.rawQuery(
 | 
					
 | 
				
			||||||
                        "select * from log_reports where id_file = " +
 | 
					                    if (checkLog?.length === 0) {
 | 
				
			||||||
                          log?.id_ldf +
 | 
					 | 
				
			||||||
                          " and line = " +
 | 
					 | 
				
			||||||
                          (index + 1) +
 | 
					 | 
				
			||||||
                          " and detected_content='" +
 | 
					 | 
				
			||||||
                          value +
 | 
					 | 
				
			||||||
                          "'"
 | 
					 | 
				
			||||||
                      );
 | 
					 | 
				
			||||||
                      if (checkLog[0].length === 0) {
 | 
					 | 
				
			||||||
                      await LogReport.create({
 | 
					                      await LogReport.create({
 | 
				
			||||||
                        detected_content: value,
 | 
					                        detected_content: value,
 | 
				
			||||||
                        line: index + 1,
 | 
					                        line: index + 1,
 | 
				
			||||||
| 
						 | 
					@ -141,142 +204,220 @@ export async function runtimeCheckLogs(folderPath) {
 | 
				
			||||||
                      lines.push(index + 1);
 | 
					                      lines.push(index + 1);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  // if(checkSpecialVersion())
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (
 | 
				
			||||||
 | 
					                checkSpecialVersion(line) !== "" &&
 | 
				
			||||||
 | 
					                listExcludeErr.filter((err) => line.includes(err)).length === 0
 | 
				
			||||||
 | 
					              ) {
 | 
				
			||||||
 | 
					                let checkVersion = checkSpecialVersion(line);
 | 
				
			||||||
 | 
					                let log = allFile?.filter(
 | 
				
			||||||
 | 
					                  (i) => i.$original.file_name === fileName
 | 
				
			||||||
 | 
					                )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let checkLog = allReport?.filter(
 | 
				
			||||||
 | 
					                  (report) =>
 | 
				
			||||||
 | 
					                    report.$original.id_file === log?.id_ldf &&
 | 
				
			||||||
 | 
					                    report.$original.line === index + 1 &&
 | 
				
			||||||
 | 
					                    report.$original.detected_content === checkVersion
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (checkLog?.length === 0) {
 | 
				
			||||||
 | 
					                  await LogReport.create({
 | 
				
			||||||
 | 
					                    detected_content: checkVersion,
 | 
				
			||||||
 | 
					                    line: index + 1,
 | 
				
			||||||
 | 
					                    id_file: log?.id_ldf,
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
              // }, 5000);
 | 
					                  lines.push(index + 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          contentFile.map(async (line, index) => {
 | 
				
			||||||
 | 
					            //check line the line with errors and exclude errors
 | 
				
			||||||
 | 
					            listKeyValues
 | 
				
			||||||
 | 
					              .map((obj) => obj.$original.value)
 | 
				
			||||||
 | 
					              .map(async (value) => {
 | 
				
			||||||
 | 
					                // console.log({line:Array(line), value:Array(value)})
 | 
				
			||||||
 | 
					                if (
 | 
				
			||||||
 | 
					                  line.includes(value) &&
 | 
				
			||||||
 | 
					                  listExcludeErr.filter((err) => line.includes(err)).length ===
 | 
				
			||||||
 | 
					                    0
 | 
				
			||||||
 | 
					                ) {
 | 
				
			||||||
 | 
					                  let log = allFile?.filter(
 | 
				
			||||||
 | 
					                    (i) => i.$original.file_name === fileName
 | 
				
			||||||
 | 
					                  )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  let checkLog = allReport?.filter(
 | 
				
			||||||
 | 
					                    (report) =>
 | 
				
			||||||
 | 
					                      report.$original.id_file === log?.id_ldf &&
 | 
				
			||||||
 | 
					                      report.$original.line === index + 1 &&
 | 
				
			||||||
 | 
					                      report.$original.detected_content === value
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  if (checkLog?.length === 0) {
 | 
				
			||||||
 | 
					                    await LogReport.create({
 | 
				
			||||||
 | 
					                      detected_content: value,
 | 
				
			||||||
 | 
					                      line: index + 1,
 | 
				
			||||||
 | 
					                      id_file: log?.id_ldf,
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    lines.push(index + 1);
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // if(checkSpecialVersion())
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (
 | 
				
			||||||
 | 
					              checkSpecialVersion(line) !== "" &&
 | 
				
			||||||
 | 
					              listExcludeErr.filter((err) => line.includes(err)).length === 0
 | 
				
			||||||
 | 
					            ) {
 | 
				
			||||||
 | 
					              let checkVersion = checkSpecialVersion(line);
 | 
				
			||||||
 | 
					              let log = allFile?.filter(
 | 
				
			||||||
 | 
					                (i) => i.$original.file_name === fileName
 | 
				
			||||||
 | 
					              )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              let checkLog = allReport?.filter(
 | 
				
			||||||
 | 
					                (report) =>
 | 
				
			||||||
 | 
					                  report.$original.id_file === log?.id_ldf &&
 | 
				
			||||||
 | 
					                  report.$original.line === index + 1 &&
 | 
				
			||||||
 | 
					                  report.$original.detected_content === checkVersion
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (checkLog?.length === 0) {
 | 
				
			||||||
 | 
					                await LogReport.create({
 | 
				
			||||||
 | 
					                  detected_content: checkVersion,
 | 
				
			||||||
 | 
					                  line: index + 1,
 | 
				
			||||||
 | 
					                  id_file: log?.id_ldf,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                lines.push(index + 1);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //true: import log to log_report table, send report to Zulip
 | 
					        //true: import log to log_report table, send report to Zulip
 | 
				
			||||||
        setTimeout(async () => {
 | 
					        setTimeout(async () => {
 | 
				
			||||||
          if (lines.length === 0) {
 | 
					          if (lines.length === 0) {
 | 
				
			||||||
                  console.log(`${fileName} has changed (${eventType})---Good`);
 | 
					            console.log(
 | 
				
			||||||
 | 
					              fileName + "has changed(" + contentFile.length + ") ---Good"
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            console.log(
 | 
					            console.log(
 | 
				
			||||||
                    `${fileName} has changed (${eventType})---SOS---${lines.length}`
 | 
					              fileName +
 | 
				
			||||||
 | 
					                "has changed(" +
 | 
				
			||||||
 | 
					                contentFile.length +
 | 
				
			||||||
 | 
					                ") ---SOS---" +
 | 
				
			||||||
 | 
					                lines.length
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            let allReport_new = await LogReport.query().whereRaw(
 | 
				
			||||||
 | 
					              `DATE(created_at) = ?`,
 | 
				
			||||||
 | 
					              [today]
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  let fileDetect = await LogDetectFile.findBy(
 | 
					            let fileDetect = allFile?.filter(
 | 
				
			||||||
                    "file_name",
 | 
					              (i) => i.$original.file_name === fileName
 | 
				
			||||||
                    fileName
 | 
					            )[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let logsDetect = allReport_new?.filter(
 | 
				
			||||||
 | 
					              (i) => i.$original.id_file === fileDetect?.id_ldf
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            // console.log(logsDetect)
 | 
				
			||||||
 | 
					            // await Database.rawQuery(
 | 
				
			||||||
 | 
					            //   "select * from log_reports where id_file = " +
 | 
				
			||||||
 | 
					            //     fileDetect?.id_ldf
 | 
				
			||||||
 | 
					            // );
 | 
				
			||||||
 | 
					            //Get all report newest
 | 
				
			||||||
 | 
					            let listReport = await getListLineByItem(
 | 
				
			||||||
 | 
					              logsDetect
 | 
				
			||||||
 | 
					                .map((obj) => obj.$original)
 | 
				
			||||||
 | 
					                .filter((l) => l.line > lastLine)
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  let logsDetect = await Database.rawQuery(
 | 
					 | 
				
			||||||
                    "select * from log_reports where id_file = " +
 | 
					 | 
				
			||||||
                      fileDetect?.id_ldf
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                  let listReport = await getListLineByItem(logsDetect[0]);
 | 
					 | 
				
			||||||
            let content =
 | 
					            let content =
 | 
				
			||||||
                    "|  |Last updated at | Item/error | Count | Report \n|---|:---:|:---|:---|:-----------:\n";
 | 
					              "|  |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n";
 | 
				
			||||||
            let spoiler = "";
 | 
					            let spoiler = "";
 | 
				
			||||||
                  // let file = await fs
 | 
					            let issueFound = "";
 | 
				
			||||||
                  //   .readFileSync(filePath)
 | 
					            let important = [
 | 
				
			||||||
                  //   .toString()
 | 
					              "Vxx",
 | 
				
			||||||
                  //   ?.split("\n");
 | 
					              "V00",
 | 
				
			||||||
                  // if (logsDetect[0].length > 10) {
 | 
					              "(CAT3K_CAA-UNIVERSALK9-M), Version",
 | 
				
			||||||
                  //   spoiler =
 | 
					            ];
 | 
				
			||||||
                  //     spoiler +
 | 
					 | 
				
			||||||
                  //     "```spoiler ..." +
 | 
					 | 
				
			||||||
                  //     (logsDetect[0].length - 5) +
 | 
					 | 
				
			||||||
                  //     " more items\n" +
 | 
					 | 
				
			||||||
                  //     content;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                  //   logsDetect[0]
 | 
					 | 
				
			||||||
                  //     .reverse()
 | 
					 | 
				
			||||||
                  //     .slice(0, 5)
 | 
					 | 
				
			||||||
                  //     ?.map((log, index) => {
 | 
					 | 
				
			||||||
                  //       content =
 | 
					 | 
				
			||||||
                  //         content +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         (logsDetect[0].length - index) +
 | 
					 | 
				
			||||||
                  //         "|**" +
 | 
					 | 
				
			||||||
                  //         moment(log.created_at).format("HH:mm - DD/MM") +
 | 
					 | 
				
			||||||
                  //         "**|" +
 | 
					 | 
				
			||||||
                  //         log.line +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         log.detected_content +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         file[log.line - 1] +
 | 
					 | 
				
			||||||
                  //         "|[View](https://logs.danielvu.com/api/log/showLog/" +
 | 
					 | 
				
			||||||
                  //         fileName +
 | 
					 | 
				
			||||||
                  //         ")\n";
 | 
					 | 
				
			||||||
                  //     });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                  //   logsDetect[0]
 | 
					 | 
				
			||||||
                  //     .slice(5, logsDetect[0].length)
 | 
					 | 
				
			||||||
                  //     ?.map((log, index) => {
 | 
					 | 
				
			||||||
                  //       spoiler =
 | 
					 | 
				
			||||||
                  //         spoiler +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         (logsDetect[0].length - index - 5) +
 | 
					 | 
				
			||||||
                  //         "|**" +
 | 
					 | 
				
			||||||
                  //         moment(log.created_at).format("HH:mm - DD/MM") +
 | 
					 | 
				
			||||||
                  //         "**|" +
 | 
					 | 
				
			||||||
                  //         log.line +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         log.detected_content +
 | 
					 | 
				
			||||||
                  //         "|" +
 | 
					 | 
				
			||||||
                  //         file[log.line - 1] +
 | 
					 | 
				
			||||||
                  //         "|[View](https://logs.danielvu.com/api/log/showLog/" +
 | 
					 | 
				
			||||||
                  //         fileName +
 | 
					 | 
				
			||||||
                  //         ")\n";
 | 
					 | 
				
			||||||
                  //     });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                  //   spoiler = spoiler + "\n```\n\n";
 | 
					 | 
				
			||||||
                  // } else {
 | 
					 | 
				
			||||||
            listReport.map((log, index) => {
 | 
					            listReport.map((log, index) => {
 | 
				
			||||||
              let item = listExtraItem.includes(log.detected_content)
 | 
					              let item = listExtraItem.includes(log.detected_content)
 | 
				
			||||||
                      ? ":medal: **" + log.detected_content+"**"
 | 
					                ? ":medal: **" + log.detected_content + "**"
 | 
				
			||||||
                      : ":small_orange_diamond: "+log.detected_content;
 | 
					                : ":small_orange_diamond: " + log.detected_content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              log.line?.map((line) => {
 | 
				
			||||||
 | 
					                issueFound =
 | 
				
			||||||
 | 
					                  issueFound +
 | 
				
			||||||
 | 
					                  "\n`" +
 | 
				
			||||||
 | 
					                  line +
 | 
				
			||||||
 | 
					                  "` " +
 | 
				
			||||||
 | 
					                  contentFile[line - 1]?.replace(
 | 
				
			||||||
 | 
					                    log.detected_content,
 | 
				
			||||||
 | 
					                    "[" +
 | 
				
			||||||
 | 
					                      log.detected_content +
 | 
				
			||||||
 | 
					                      "](https://logs.danielvu.com/logs/" +
 | 
				
			||||||
 | 
					                      fileName +
 | 
				
			||||||
 | 
					                      "#" +
 | 
				
			||||||
 | 
					                      line +
 | 
				
			||||||
 | 
					                      ")"
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
              content =
 | 
					              content =
 | 
				
			||||||
                content +
 | 
					                content +
 | 
				
			||||||
                "|" +
 | 
					                "|" +
 | 
				
			||||||
                (index + 1) +
 | 
					                (index + 1) +
 | 
				
			||||||
                "|**" +
 | 
					                "|**" +
 | 
				
			||||||
                      moment(log.created_at).format("HH:mm - DD/MM") +
 | 
					                moment(Date.now()).format("HH:mm - DD/MM") +
 | 
				
			||||||
                "**|" +
 | 
					                "**|" +
 | 
				
			||||||
                item +
 | 
					                item +
 | 
				
			||||||
                "|" +
 | 
					                "|" +
 | 
				
			||||||
                      log.line.length +
 | 
					                log.line +
 | 
				
			||||||
                      // "|" +
 | 
					                "|[View](https://logs.danielvu.com/logs/" +
 | 
				
			||||||
                      // file[log.line - 1] +
 | 
					 | 
				
			||||||
                      "|[View](https://logs.danielvu.com/api/log/showLog/" +
 | 
					 | 
				
			||||||
                fileName +
 | 
					                fileName +
 | 
				
			||||||
 | 
					                "#" +
 | 
				
			||||||
 | 
					                log.line +
 | 
				
			||||||
                ")\n";
 | 
					                ")\n";
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
                  // }
 | 
					 | 
				
			||||||
                  // setTimeout(() => {
 | 
					 | 
				
			||||||
                  sendMessToZulip(
 | 
					 | 
				
			||||||
                    "stream",
 | 
					 | 
				
			||||||
                    "Result test - auto.nswteam.net",
 | 
					 | 
				
			||||||
                    "Log Alert",
 | 
					 | 
				
			||||||
                    ":warning: :warning: **" +
 | 
					 | 
				
			||||||
                      fileName +
 | 
					 | 
				
			||||||
                      "**\n\n" +
 | 
					 | 
				
			||||||
                      content +
 | 
					 | 
				
			||||||
                      "\n\n" +
 | 
					 | 
				
			||||||
                      spoiler
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let icon =
 | 
				
			||||||
 | 
					              important.filter((i) => content.includes(i)).length > 0
 | 
				
			||||||
 | 
					                ? "------------\n\n:no_entry: :no_entry:**" +
 | 
				
			||||||
 | 
					                  fileName +
 | 
				
			||||||
 | 
					                  "**:no_entry: :no_entry:"
 | 
				
			||||||
 | 
					                : "------------\n\n:warning: :warning: **" + fileName + "**";
 | 
				
			||||||
            sendMessToZulip(
 | 
					            sendMessToZulip(
 | 
				
			||||||
              "stream",
 | 
					              "stream",
 | 
				
			||||||
                    "AUS_VN_Test",
 | 
					              Env.get("ZULIP_STREAM_ALERT"),
 | 
				
			||||||
                    "Test Log Alerts",
 | 
					              Env.get("ZULIP_TOPIC_ALERT"),
 | 
				
			||||||
                    ":warning: :warning: **" +
 | 
					              icon +
 | 
				
			||||||
                      fileName +
 | 
					                "\n\n" +
 | 
				
			||||||
                      "**\n\n" +
 | 
					 | 
				
			||||||
                content +
 | 
					                content +
 | 
				
			||||||
                "\n\n" +
 | 
					                "\n\n" +
 | 
				
			||||||
                      spoiler
 | 
					                spoiler +
 | 
				
			||||||
 | 
					                "\n\n***Issue found:***\n" +
 | 
				
			||||||
 | 
					                issueFound
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
                  // }, 3000);
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }, 3000);
 | 
					        }, 3000);
 | 
				
			||||||
              //false: next
 | 
					        // console.log(path + " change")
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
          //setMaxListeners
 | 
					 | 
				
			||||||
          scan.setMaxListeners(0);
 | 
					 | 
				
			||||||
          // }
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      watcher.on("error", (error) => {
 | 
				
			||||||
 | 
					        console.error(`Watcher error: ${error}`);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      // await fileList.slice(0,40)
 | 
				
			||||||
 | 
					      //   ?.filter((i) => fileList_old.includes(i) === false)
 | 
				
			||||||
 | 
					      //   ?.forEach((fileName) => {
 | 
				
			||||||
 | 
					      //     //path file
 | 
				
			||||||
 | 
					      //     const filePath = `${folderPath}/${fileName}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //   });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } catch (error) {
 | 
					  } catch (error) {
 | 
				
			||||||
    console.log(error);
 | 
					    console.log(error);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					import puppeteer from 'puppeteer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const screenShot = async (filename, time) => {
 | 
				
			||||||
 | 
					  const browser = await puppeteer.launch({
 | 
				
			||||||
 | 
					    headless: true,
 | 
				
			||||||
 | 
					    args: ["--no-sandbox"],
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    // Open a new page
 | 
				
			||||||
 | 
					    const page = await browser.newPage();
 | 
				
			||||||
 | 
					    await page.goto("https://logs.danielvu.com/screenShot/" + filename);
 | 
				
			||||||
 | 
					    const bodyHandle = await page.$("body");
 | 
				
			||||||
 | 
					    const { height } = await bodyHandle.boundingBox();
 | 
				
			||||||
 | 
					    await bodyHandle.dispose();
 | 
				
			||||||
 | 
					    await page.setViewport({ width: 1920, height: 800 });
 | 
				
			||||||
 | 
					    setTimeout(async () => {
 | 
				
			||||||
 | 
					      await page.screenshot({ path: "/home/screenshot/"+time+".png" });
 | 
				
			||||||
 | 
					      browser.close();
 | 
				
			||||||
 | 
					    }, 5000);
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.log(error);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 304 KiB  | 
| 
						 | 
					@ -0,0 +1,358 @@
 | 
				
			||||||
 | 
					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";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 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,
 | 
				
			||||||
 | 
					      host: "mail.ipsupply.com.au",
 | 
				
			||||||
 | 
					      port: 465,
 | 
				
			||||||
 | 
					      secure: true,
 | 
				
			||||||
 | 
					      auth: {
 | 
				
			||||||
 | 
					        user: "admin@apactech.io",
 | 
				
			||||||
 | 
					        pass: "BGK!dyt6upd2eax1bhz",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Read file in listFile
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 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();
 | 
				
			||||||
 | 
					                  //   let memory =
 | 
				
			||||||
 | 
					                  if (index > 0) {
 | 
				
			||||||
 | 
					                    if (PID !== "" && SN !== "") {
 | 
				
			||||||
 | 
					                      listInformation.push({
 | 
				
			||||||
 | 
					                        PID: PID,
 | 
				
			||||||
 | 
					                        VID: VID,
 | 
				
			||||||
 | 
					                        SN: SN,
 | 
				
			||||||
 | 
					                        RAM: "",
 | 
				
			||||||
 | 
					                        flash: "",
 | 
				
			||||||
 | 
					                        extra_item: "yes",
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                      html += `<tr><td>${PID}</td>
 | 
				
			||||||
 | 
					                  <td>${VID}</td>
 | 
				
			||||||
 | 
					                  <td>${SN}</td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td>yes</td></tr>`;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  } 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",
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                      html += `<tr style='background-color:${backgroundColor}'><td>${PID}</td>
 | 
				
			||||||
 | 
					                  <td>${VID}</td>
 | 
				
			||||||
 | 
					                  <td>${SN}</td>
 | 
				
			||||||
 | 
					                  <td>${RAM}</td>
 | 
				
			||||||
 | 
					                  <td>${
 | 
				
			||||||
 | 
					                    flash.match(regexMemory) !== null
 | 
				
			||||||
 | 
					                      ? (
 | 
				
			||||||
 | 
					                          parseInt(flash.match(regexMemory)[0]) /
 | 
				
			||||||
 | 
					                          1024 /
 | 
				
			||||||
 | 
					                          1024
 | 
				
			||||||
 | 
					                        ).toFixed(2) +
 | 
				
			||||||
 | 
					                        "G (D: " +
 | 
				
			||||||
 | 
					                        memDefaultForPID.split(":")[2] +
 | 
				
			||||||
 | 
					                        ")"
 | 
				
			||||||
 | 
					                      : ""
 | 
				
			||||||
 | 
					                  }</td>
 | 
				
			||||||
 | 
					                  <td>no</td></tr>`;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					              } 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",
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                      html += `<tr><td>${PID}</td>
 | 
				
			||||||
 | 
					                  <td>${VID}</td>
 | 
				
			||||||
 | 
					                  <td>${SN}</td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td>yes</td></tr>`;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  } else {
 | 
				
			||||||
 | 
					                    if (PID !== "" && SN !== "") {
 | 
				
			||||||
 | 
					                      listInformation.push({
 | 
				
			||||||
 | 
					                        PID: PID,
 | 
				
			||||||
 | 
					                        VID: VID,
 | 
				
			||||||
 | 
					                        SN: SN,
 | 
				
			||||||
 | 
					                        RAM: "",
 | 
				
			||||||
 | 
					                        flash: "",
 | 
				
			||||||
 | 
					                        extra_item: "no",
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                      html += `<tr style='background-color:${backgroundColor}'><td>${PID}</td>
 | 
				
			||||||
 | 
					                  <td>${VID}</td>
 | 
				
			||||||
 | 
					                  <td>${SN}</td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td></td>
 | 
				
			||||||
 | 
					                  <td>no</td></tr>`;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setTimeout(async () => {
 | 
				
			||||||
 | 
					      if (listInformation.length > 0) {
 | 
				
			||||||
 | 
					        console.log(listInformation);
 | 
				
			||||||
 | 
					        const options = {
 | 
				
			||||||
 | 
					          from: "admin@apactech.io",
 | 
				
			||||||
 | 
					          to: "joseph@apactech.io, ips@ipsupply.com.au",
 | 
				
			||||||
 | 
					          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);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }, 5000);
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.log(error);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -8,14 +8,24 @@ export const sendMessToZulip = async (type, to, topic, content) => {
 | 
				
			||||||
      realm: "https://zulip.ipsupply.com.au",
 | 
					      realm: "https://zulip.ipsupply.com.au",
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const client = await zulip(config);
 | 
					    const client = await zulip(config);
 | 
				
			||||||
 | 
					    if(type === "private"){
 | 
				
			||||||
 | 
					      let params = {
 | 
				
			||||||
 | 
					        type: type,
 | 
				
			||||||
 | 
					        to: to,
 | 
				
			||||||
 | 
					        content: content
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      await client.messages.send(params);
 | 
				
			||||||
 | 
					    }else{
 | 
				
			||||||
      let params = {
 | 
					      let params = {
 | 
				
			||||||
        type: type,
 | 
					        type: type,
 | 
				
			||||||
        to: to,
 | 
					        to: to,
 | 
				
			||||||
        topic: topic,
 | 
					        topic: topic,
 | 
				
			||||||
        content: content
 | 
					        content: content
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					 | 
				
			||||||
      await client.messages.send(params);
 | 
					      await client.messages.send(params);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
  } catch (error) {
 | 
					  } catch (error) {
 | 
				
			||||||
    console.log(error);
 | 
					    console.log(error);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,119 @@
 | 
				
			||||||
 | 
					const moment = require("moment/moment");
 | 
				
			||||||
 | 
					const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					const { exec } = require("child_process");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const sendNotification = async () => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const config = {
 | 
				
			||||||
 | 
					      username: "networktool-bot@zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					      apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
 | 
				
			||||||
 | 
					      realm: "https://zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const client = await zulip(config);
 | 
				
			||||||
 | 
					    let auto1 = "";
 | 
				
			||||||
 | 
					    let auto2 = "";
 | 
				
			||||||
 | 
					    let log = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec("nc -zv 172.16.7.13 8002", (error, stdout, stderr) => {
 | 
				
			||||||
 | 
					      if (error) {
 | 
				
			||||||
 | 
					        //   console.error(`Error executing command: ${error.message}`);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (stdout !== "") {
 | 
				
			||||||
 | 
					        auto1 += stdout;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        auto1 += stderr;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec("nc -zv 172.16.7.13 5000", (error, stdout, stderr) => {
 | 
				
			||||||
 | 
					      if (error) {
 | 
				
			||||||
 | 
					        //   console.error(`Error executing command: ${error.message}`);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (stdout !== "") {
 | 
				
			||||||
 | 
					        auto2 += stdout;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        auto2 += stderr;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec("nc -zv 172.16.6.23 7777", (error, stdout, stderr) => {
 | 
				
			||||||
 | 
					      if (error) {
 | 
				
			||||||
 | 
					        exec("/root/.nvm/versions/node/v16.14.0/bin/pm2 restart all", (error, stdout, stderr) => {
 | 
				
			||||||
 | 
					          if (error) {
 | 
				
			||||||
 | 
					            console.log("RESTART: ", stdout);
 | 
				
			||||||
 | 
					            let params = {
 | 
				
			||||||
 | 
					              type: "stream",
 | 
				
			||||||
 | 
					              to: "networkToolBot",
 | 
				
			||||||
 | 
					              topic: "Log service",
 | 
				
			||||||
 | 
					              content: "Can't restart server. Please check!\n```\n"+error+"\n```",
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            client.messages.send(params);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          //   console.log("RESTART: ", stdout);
 | 
				
			||||||
 | 
					          let params = {
 | 
				
			||||||
 | 
					            type: "stream",
 | 
				
			||||||
 | 
					            to: "networkToolBot",
 | 
				
			||||||
 | 
					            topic: "Log service",
 | 
				
			||||||
 | 
					            content: "Restarting ...",
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          client.messages.send(params);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (stdout !== "") {
 | 
				
			||||||
 | 
					        log += stdout;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        log += stderr;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setTimeout(async () => {
 | 
				
			||||||
 | 
					      console.log({ auto1: auto1, auto2: auto2, log: log });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (process.argv[2] === "daily") {
 | 
				
			||||||
 | 
					        let autoStatus =
 | 
				
			||||||
 | 
					          auto1?.includes("succeeded") && auto2?.includes("succeeded")
 | 
				
			||||||
 | 
					            ? ":check:"
 | 
				
			||||||
 | 
					            : ":red_circle:";
 | 
				
			||||||
 | 
					        let logStatus = log?.includes("succeeded") ? ":check:" : ":red_circle:";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let time = moment(Date.now()).format("HH:mm - DD/MM");
 | 
				
			||||||
 | 
					        let content =
 | 
				
			||||||
 | 
					          "|  |Server| System time| Status \n|---|:---:|:---|:---:\n|1|auto.danielvu.com|**" +
 | 
				
			||||||
 | 
					          time +
 | 
				
			||||||
 | 
					          "**|" +
 | 
				
			||||||
 | 
					          autoStatus +
 | 
				
			||||||
 | 
					          "|\n|2|logs.danielvu.com|**" +
 | 
				
			||||||
 | 
					          time +
 | 
				
			||||||
 | 
					          "**|" +
 | 
				
			||||||
 | 
					          logStatus +
 | 
				
			||||||
 | 
					          "|";
 | 
				
			||||||
 | 
					        let params = {
 | 
				
			||||||
 | 
					          type: "stream",
 | 
				
			||||||
 | 
					          to: "System Logs",
 | 
				
			||||||
 | 
					          topic: "stream events",
 | 
				
			||||||
 | 
					          content: content,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // let params = {
 | 
				
			||||||
 | 
					        //   type: "stream",
 | 
				
			||||||
 | 
					        //   to: "Result test - auto.nswteam.net",
 | 
				
			||||||
 | 
					        //   topic: "AU-dev",
 | 
				
			||||||
 | 
					        //   content: content,
 | 
				
			||||||
 | 
					        // };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await client.messages.send(params);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }, 5000);
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.log(error);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sendNotification();
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					import { FormData } from "zulip-js/lib/helper";
 | 
				
			||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					import fs from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const uploadFileToZulip = async (filename) => {
 | 
				
			||||||
 | 
					  //   try {
 | 
				
			||||||
 | 
					  const ZULIP_API_URL = "https://zulip.ipsupply.com.au/api/v1";
 | 
				
			||||||
 | 
					  const ZULIP_API_KEY = "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM";
 | 
				
			||||||
 | 
					  const BOT_EMAIL = "networktool-bot@zulip.ipsupply.com.au";
 | 
				
			||||||
 | 
					  // const ZULIP_API_URL = "https://zulip.ipsupply.com.au/api/v1";
 | 
				
			||||||
 | 
					  // const ZULIP_API_KEY = "7XGrpwzFtQyUVDQzdwL3hjdVSbLx55yt";
 | 
				
			||||||
 | 
					  // const BOT_EMAIL = "joseph.le@apactech.io";
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      const fileStream = fs.createReadStream("/home/screenshot/"+filename+".png");
 | 
				
			||||||
 | 
					      const formData = new FormData();
 | 
				
			||||||
 | 
					      formData.append("file", fileStream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const response = await axios.post(
 | 
				
			||||||
 | 
					        `${ZULIP_API_URL}/user_uploads`,
 | 
				
			||||||
 | 
					        formData,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          headers: {
 | 
				
			||||||
 | 
					            "Content-Type": "application/octet-stream",
 | 
				
			||||||
 | 
					            Authorization: `Basic ${Buffer.from(
 | 
				
			||||||
 | 
					              `${BOT_EMAIL}:${ZULIP_API_KEY}`
 | 
				
			||||||
 | 
					            ).toString("base64")}`,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (response.status === 200) {
 | 
				
			||||||
 | 
					        const uploadedFile = response.data.uri;
 | 
				
			||||||
 | 
					        return uploadedFile;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        console.error("Failed to upload file:", response.statusText);
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.log("Error uploading file:", error.message);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					[api]
 | 
				
			||||||
 | 
					email=networktool-bot@zulip.ipsupply.com.au
 | 
				
			||||||
 | 
					key=0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM
 | 
				
			||||||
 | 
					site=https://zulip.ipsupply.com.au
 | 
				
			||||||
| 
						 | 
					@ -5,8 +5,8 @@
 | 
				
			||||||
 * file.
 | 
					 * file.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Env from '@ioc:Adonis/Core/Env'
 | 
					import Env from "@ioc:Adonis/Core/Env";
 | 
				
			||||||
import type { DatabaseConfig } from '@ioc:Adonis/Lucid/Database'
 | 
					import type { DatabaseConfig } from "@ioc:Adonis/Lucid/Database";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const databaseConfig: DatabaseConfig = {
 | 
					const databaseConfig: DatabaseConfig = {
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ const databaseConfig: DatabaseConfig = {
 | 
				
			||||||
  | file.
 | 
					  | file.
 | 
				
			||||||
  |
 | 
					  |
 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
  connection: Env.get('DB_CONNECTION'),
 | 
					  connection: Env.get("DB_CONNECTION"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  connections: {
 | 
					  connections: {
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
| 
						 | 
					@ -34,24 +34,28 @@ const databaseConfig: DatabaseConfig = {
 | 
				
			||||||
    |
 | 
					    |
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    mysql: {
 | 
					    mysql: {
 | 
				
			||||||
      client: 'mysql2',
 | 
					      client: "mysql2",
 | 
				
			||||||
      connection: {
 | 
					      connection: {
 | 
				
			||||||
        host: Env.get('MYSQL_HOST'),
 | 
					        host: Env.get("MYSQL_HOST"),
 | 
				
			||||||
        port: Env.get('MYSQL_PORT'),
 | 
					        port: Env.get("MYSQL_PORT"),
 | 
				
			||||||
        user: Env.get('MYSQL_USER'),
 | 
					        user: Env.get("MYSQL_USER"),
 | 
				
			||||||
        password: Env.get('MYSQL_PASSWORD', ''),
 | 
					        password: Env.get("MYSQL_PASSWORD", ""),
 | 
				
			||||||
        database: Env.get('MYSQL_DB_NAME'),
 | 
					        database: Env.get("MYSQL_DB_NAME"),
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      pool: {min:1, max:120},
 | 
					      pool: {
 | 
				
			||||||
      acquireConnectionTimeout: 60000,
 | 
					        min: 1,
 | 
				
			||||||
 | 
					        max: 2000,
 | 
				
			||||||
 | 
					        acquireTimeoutMillis: 60 * 1000
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      migrations: {
 | 
					      migrations: {
 | 
				
			||||||
        naturalSort: true,
 | 
					        naturalSort: true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
      healthCheck: false,
 | 
					      healthCheck: false,
 | 
				
			||||||
      debug: false,
 | 
					      debug: false,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					export default databaseConfig;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default databaseConfig
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					[api]
 | 
				
			||||||
 | 
					email=joseph.le@apactech.io
 | 
				
			||||||
 | 
					key=7XGrpwzFtQyUVDQzdwL3hjdVSbLx55yt
 | 
				
			||||||
 | 
					site=https://zulip.ipsupply.com.au
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,10 @@
 | 
				
			||||||
        "@testing-library/react": "^13.4.0",
 | 
					        "@testing-library/react": "^13.4.0",
 | 
				
			||||||
        "@testing-library/user-event": "^13.5.0",
 | 
					        "@testing-library/user-event": "^13.5.0",
 | 
				
			||||||
        "axios": "^1.5.0",
 | 
					        "axios": "^1.5.0",
 | 
				
			||||||
 | 
					        "dotenv": "^16.3.1",
 | 
				
			||||||
        "react": "^18.2.0",
 | 
					        "react": "^18.2.0",
 | 
				
			||||||
        "react-dom": "^18.2.0",
 | 
					        "react-dom": "^18.2.0",
 | 
				
			||||||
 | 
					        "react-router-dom": "^6.15.0",
 | 
				
			||||||
        "react-scripts": "5.0.1",
 | 
					        "react-scripts": "5.0.1",
 | 
				
			||||||
        "web-vitals": "^2.1.4"
 | 
					        "web-vitals": "^2.1.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -3237,6 +3239,14 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@remix-run/router": {
 | 
				
			||||||
 | 
					      "version": "1.8.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=14.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@rollup/plugin-babel": {
 | 
					    "node_modules/@rollup/plugin-babel": {
 | 
				
			||||||
      "version": "5.3.1",
 | 
					      "version": "5.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
 | 
				
			||||||
| 
						 | 
					@ -6999,11 +7009,14 @@
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/dotenv": {
 | 
					    "node_modules/dotenv": {
 | 
				
			||||||
      "version": "10.0.0",
 | 
					      "version": "16.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
 | 
					      "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=10"
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/motdotla/dotenv?sponsor=1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/dotenv-expand": {
 | 
					    "node_modules/dotenv-expand": {
 | 
				
			||||||
| 
						 | 
					@ -14672,6 +14685,36 @@
 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/react-router": {
 | 
				
			||||||
 | 
					      "version": "6.15.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@remix-run/router": "1.8.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=14.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "react": ">=16.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/react-router-dom": {
 | 
				
			||||||
 | 
					      "version": "6.15.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@remix-run/router": "1.8.0",
 | 
				
			||||||
 | 
					        "react-router": "6.15.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=14.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "react": ">=16.8",
 | 
				
			||||||
 | 
					        "react-dom": ">=16.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/react-scripts": {
 | 
					    "node_modules/react-scripts": {
 | 
				
			||||||
      "version": "5.0.1",
 | 
					      "version": "5.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
 | 
				
			||||||
| 
						 | 
					@ -14744,6 +14787,14 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/react-scripts/node_modules/dotenv": {
 | 
				
			||||||
 | 
					      "version": "10.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/read-cache": {
 | 
					    "node_modules/read-cache": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -19842,6 +19893,11 @@
 | 
				
			||||||
        "source-map": "^0.7.3"
 | 
					        "source-map": "^0.7.3"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@remix-run/router": {
 | 
				
			||||||
 | 
					      "version": "1.8.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@rollup/plugin-babel": {
 | 
					    "@rollup/plugin-babel": {
 | 
				
			||||||
      "version": "5.3.1",
 | 
					      "version": "5.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
 | 
				
			||||||
| 
						 | 
					@ -22635,9 +22691,9 @@
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "dotenv": {
 | 
					    "dotenv": {
 | 
				
			||||||
      "version": "10.0.0",
 | 
					      "version": "16.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
 | 
					      "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "dotenv-expand": {
 | 
					    "dotenv-expand": {
 | 
				
			||||||
      "version": "5.1.0",
 | 
					      "version": "5.1.0",
 | 
				
			||||||
| 
						 | 
					@ -28006,6 +28062,23 @@
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
 | 
					      "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "react-router": {
 | 
				
			||||||
 | 
					      "version": "6.15.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@remix-run/router": "1.8.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "react-router-dom": {
 | 
				
			||||||
 | 
					      "version": "6.15.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@remix-run/router": "1.8.0",
 | 
				
			||||||
 | 
					        "react-router": "6.15.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "react-scripts": {
 | 
					    "react-scripts": {
 | 
				
			||||||
      "version": "5.0.1",
 | 
					      "version": "5.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
 | 
				
			||||||
| 
						 | 
					@ -28059,6 +28132,13 @@
 | 
				
			||||||
        "webpack-dev-server": "^4.6.0",
 | 
					        "webpack-dev-server": "^4.6.0",
 | 
				
			||||||
        "webpack-manifest-plugin": "^4.0.2",
 | 
					        "webpack-manifest-plugin": "^4.0.2",
 | 
				
			||||||
        "workbox-webpack-plugin": "^6.4.1"
 | 
					        "workbox-webpack-plugin": "^6.4.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "dotenv": {
 | 
				
			||||||
 | 
					          "version": "10.0.0",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "read-cache": {
 | 
					    "read-cache": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,8 +7,10 @@
 | 
				
			||||||
    "@testing-library/react": "^13.4.0",
 | 
					    "@testing-library/react": "^13.4.0",
 | 
				
			||||||
    "@testing-library/user-event": "^13.5.0",
 | 
					    "@testing-library/user-event": "^13.5.0",
 | 
				
			||||||
    "axios": "^1.5.0",
 | 
					    "axios": "^1.5.0",
 | 
				
			||||||
 | 
					    "dotenv": "^16.3.1",
 | 
				
			||||||
    "react": "^18.2.0",
 | 
					    "react": "^18.2.0",
 | 
				
			||||||
    "react-dom": "^18.2.0",
 | 
					    "react-dom": "^18.2.0",
 | 
				
			||||||
 | 
					    "react-router-dom": "^6.15.0",
 | 
				
			||||||
    "react-scripts": "5.0.1",
 | 
					    "react-scripts": "5.0.1",
 | 
				
			||||||
    "web-vitals": "^2.1.4"
 | 
					    "web-vitals": "^2.1.4"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 15 KiB  | 
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
      work correctly both with client-side routing and a non-root public URL.
 | 
					      work correctly both with client-side routing and a non-root public URL.
 | 
				
			||||||
      Learn how to configure a non-root public URL by running `npm run build`.
 | 
					      Learn how to configure a non-root public URL by running `npm run build`.
 | 
				
			||||||
    -->
 | 
					    -->
 | 
				
			||||||
    <title>React App</title>
 | 
					    <title>Log View</title>
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
  <body>
 | 
					  <body>
 | 
				
			||||||
    <noscript>You need to enable JavaScript to run this app.</noscript>
 | 
					    <noscript>You need to enable JavaScript to run this app.</noscript>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,13 +2,22 @@ import axios from "axios";
 | 
				
			||||||
import React, { useEffect, useState } from "react";
 | 
					import React, { useEffect, useState } from "react";
 | 
				
			||||||
import { getKeyValues } from "./api/apiLog";
 | 
					import { getKeyValues } from "./api/apiLog";
 | 
				
			||||||
import ManageValues from "./pages/ManageValues";
 | 
					import ManageValues from "./pages/ManageValues";
 | 
				
			||||||
 | 
					import { Routes, Route, Switch, useParams } from "react-router-dom";
 | 
				
			||||||
 | 
					import ShowLog from "./components/ShowLog/ShowLog";
 | 
				
			||||||
 | 
					import ListLog from "./components/ListLog/ListLog";
 | 
				
			||||||
 | 
					import ScreenShot from "./components/ScreenShot/ScreenShot";
 | 
				
			||||||
function App() {
 | 
					function App() {
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className="App">
 | 
					    <div className="App">
 | 
				
			||||||
      <ManageValues/>
 | 
					      <Routes>
 | 
				
			||||||
 | 
					        {/* Define routes */}
 | 
				
			||||||
 | 
					        <Route path="/" element={<ManageValues />}>
 | 
				
			||||||
 | 
					          {/* Render the UserProfile component */}
 | 
				
			||||||
 | 
					        </Route>
 | 
				
			||||||
 | 
					        <Route path="/logs/:name" element={<ShowLog />}></Route>
 | 
				
			||||||
 | 
					        <Route path="/logs" element={<ListLog />}></Route>
 | 
				
			||||||
 | 
					        <Route path="/screenShot/:name" element={<ScreenShot />}></Route>
 | 
				
			||||||
 | 
					      </Routes>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,8 @@
 | 
				
			||||||
// const API = "https://logs.danielvu.com/api";
 | 
					const API = process.env.REACT_APP_API_SERVER_ADDRESS;
 | 
				
			||||||
const API = "http://localhost:3333/api";
 | 
					// const API = "http://localhost:3333/api";
 | 
				
			||||||
export const getKeyValues = API + "/getKeyValue";
 | 
					export const getKeyValues = API + "/getKeyValue";
 | 
				
			||||||
export const deleteValue = API + "/deleteValue";
 | 
					export const deleteValue = API + "/deleteValue";
 | 
				
			||||||
export const addKeyValue = API + "/addValue";
 | 
					export const addKeyValue = API + "/addValue";
 | 
				
			||||||
 | 
					export const editValue = API + "/editValue";
 | 
				
			||||||
 | 
					export const getLog = API + "/log/showLog";
 | 
				
			||||||
 | 
					export const getListLog = API + "/getAllLogDetect";
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,46 @@
 | 
				
			||||||
 | 
					.mainList{
 | 
				
			||||||
 | 
					    height: 100vh;
 | 
				
			||||||
 | 
					    scroll-behavior: smooth;
 | 
				
			||||||
 | 
					    border: solid gray 5px;
 | 
				
			||||||
 | 
					    width:100%;
 | 
				
			||||||
 | 
					    word-wrap:break-word;
 | 
				
			||||||
 | 
					    white-space:pre;
 | 
				
			||||||
 | 
					    overflow: auto;
 | 
				
			||||||
 | 
					    font-family: monospace;
 | 
				
			||||||
 | 
					    text-rendering: auto;
 | 
				
			||||||
 | 
					     color: fieldtext;
 | 
				
			||||||
 | 
					     letter-spacing: normal;
 | 
				
			||||||
 | 
					     word-spacing: normal;
 | 
				
			||||||
 | 
					     line-height: normal;
 | 
				
			||||||
 | 
					     text-transform: none;
 | 
				
			||||||
 | 
					     text-indent: 0px;
 | 
				
			||||||
 | 
					     text-shadow: none;
 | 
				
			||||||
 | 
					     display: inline-block;
 | 
				
			||||||
 | 
					     text-align: start;
 | 
				
			||||||
 | 
					     appearance: auto;
 | 
				
			||||||
 | 
					     -webkit-rtl-ordering: logical;
 | 
				
			||||||
 | 
					     resize: vertical;
 | 
				
			||||||
 | 
					     cursor: text;
 | 
				
			||||||
 | 
					     background-color: field;
 | 
				
			||||||
 | 
					     column-count: initial !important;
 | 
				
			||||||
 | 
					     writing-mode: horizontal-tb !important;
 | 
				
			||||||
 | 
					     box-sizing: border-box;
 | 
				
			||||||
 | 
					     margin: 0em;
 | 
				
			||||||
 | 
					     /* border-width: 1px; */
 | 
				
			||||||
 | 
					     /* border-style: solid; */
 | 
				
			||||||
 | 
					     /* border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); */
 | 
				
			||||||
 | 
					     /* border-image: initial; */
 | 
				
			||||||
 | 
					     padding: 5px;
 | 
				
			||||||
 | 
					     /* position: relative; */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.inputSearch{
 | 
				
			||||||
 | 
					    position: sticky;
 | 
				
			||||||
 | 
					    top:0;
 | 
				
			||||||
 | 
					    right: 0;
 | 
				
			||||||
 | 
					    text-align: right;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.inputSearch input{
 | 
				
			||||||
 | 
					    width: 30%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					import React, { useEffect, useState } from "react";
 | 
				
			||||||
 | 
					import { Link, Navigate, useParams } from "react-router-dom";
 | 
				
			||||||
 | 
					import { getListLog } from "../../api/apiLog";
 | 
				
			||||||
 | 
					import "./ListLog.css";
 | 
				
			||||||
 | 
					const ListLog = () => {
 | 
				
			||||||
 | 
					  const [listFile, setListFile] = useState([]);
 | 
				
			||||||
 | 
					  const [status, setStatus] = useState(200);
 | 
				
			||||||
 | 
					  const [nameSearch, setNameSearch] = useState("");
 | 
				
			||||||
 | 
					  const getListFile = async () => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const res = await axios.get(getListLog);
 | 
				
			||||||
 | 
					      setListFile(res.data);
 | 
				
			||||||
 | 
					      setStatus(res.status);
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      console.log(error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    getListFile();
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (status === 200) {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div className="mainList">
 | 
				
			||||||
 | 
					        <div className="inputSearch">
 | 
				
			||||||
 | 
					            <Link to={"/"}>
 | 
				
			||||||
 | 
					              <button
 | 
				
			||||||
 | 
					                style={{
 | 
				
			||||||
 | 
					                  color: "white",
 | 
				
			||||||
 | 
					                  backgroundColor: "blue",
 | 
				
			||||||
 | 
					                  cursor: "pointer",
 | 
				
			||||||
 | 
					                  float:"left"
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                Home
 | 
				
			||||||
 | 
					              </button></Link>
 | 
				
			||||||
 | 
					          <label>Search: </label>
 | 
				
			||||||
 | 
					          <input value={nameSearch} placeholder={"Enter a file name"} onChange={(e)=>{
 | 
				
			||||||
 | 
					            setNameSearch(e.target.value)
 | 
				
			||||||
 | 
					          }}></input>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        {listFile?.filter((f)=>f.toLocaleLowerCase().search(nameSearch.toLocaleLowerCase())!==-1).map((file) => (
 | 
				
			||||||
 | 
					          <div>
 | 
				
			||||||
 | 
					            <Link to={"/logs/" + file}>{file}</Link>
 | 
				
			||||||
 | 
					            <br></br>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        ))}
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <h1>
 | 
				
			||||||
 | 
					          <i>No files</i>
 | 
				
			||||||
 | 
					        </h1>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ListLog;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,34 @@
 | 
				
			||||||
 | 
					#bodyScreen {
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    padding: 5px;
 | 
				
			||||||
 | 
					    word-wrap: break-word;
 | 
				
			||||||
 | 
					    border: solid gray 5px;
 | 
				
			||||||
 | 
					    white-space: pre;
 | 
				
			||||||
 | 
					    overflow: auto;
 | 
				
			||||||
 | 
					    font-family: monospace;
 | 
				
			||||||
 | 
					    text-rendering: auto;
 | 
				
			||||||
 | 
					    color: fieldtext;
 | 
				
			||||||
 | 
					    letter-spacing: normal;
 | 
				
			||||||
 | 
					    word-spacing: normal;
 | 
				
			||||||
 | 
					    line-height: normal;
 | 
				
			||||||
 | 
					    text-transform: none;
 | 
				
			||||||
 | 
					    text-indent: 0px;
 | 
				
			||||||
 | 
					    text-shadow: none;
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					    text-align: start;
 | 
				
			||||||
 | 
					    appearance: auto;
 | 
				
			||||||
 | 
					    -webkit-rtl-ordering: logical;
 | 
				
			||||||
 | 
					    resize: vertical;
 | 
				
			||||||
 | 
					    cursor: text;
 | 
				
			||||||
 | 
					    background-color: field;
 | 
				
			||||||
 | 
					    column-count: initial !important;
 | 
				
			||||||
 | 
					    writing-mode: horizontal-tb !important;
 | 
				
			||||||
 | 
					    /* box-sizing: border-box; */
 | 
				
			||||||
 | 
					    margin: 0em;
 | 
				
			||||||
 | 
					    /* border-width: 1px; */
 | 
				
			||||||
 | 
					    /* border-style: solid;/ */
 | 
				
			||||||
 | 
					    /* border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); */
 | 
				
			||||||
 | 
					    /* border-image: initial; */
 | 
				
			||||||
 | 
					    padding: 5px;
 | 
				
			||||||
 | 
					    font-size: 1.2rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,99 @@
 | 
				
			||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					import React, { useEffect, useState } from "react";
 | 
				
			||||||
 | 
					import { Link, Navigate, useParams } from "react-router-dom";
 | 
				
			||||||
 | 
					import { getLog } from "../../api/apiLog";
 | 
				
			||||||
 | 
					import "./ScreenShot.css";
 | 
				
			||||||
 | 
					const ScreenShot = () => {
 | 
				
			||||||
 | 
					  let { name } = useParams();
 | 
				
			||||||
 | 
					  const [log, setLog] = useState({});
 | 
				
			||||||
 | 
					  const [status, setStatus] = useState(200);
 | 
				
			||||||
 | 
					  const getContentLog = async () => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const res = await axios.get(getLog + "/" + name);
 | 
				
			||||||
 | 
					      setLog(res.data);
 | 
				
			||||||
 | 
					      setStatus(res.status);
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      console.log(error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  function scrollToBottom() {
 | 
				
			||||||
 | 
					    const targetDiv = document.getElementById('bodyScreen');
 | 
				
			||||||
 | 
					    targetDiv.scrollTop = targetDiv.scrollHeight;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Call the function to scroll to the end of the page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    getContentLog();
 | 
				
			||||||
 | 
					    // setTimeout(() => {
 | 
				
			||||||
 | 
					    //   scrollToBottom();
 | 
				
			||||||
 | 
					    // }, 2000);
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					  // console.log(window.location.hash);
 | 
				
			||||||
 | 
					  if (status === 200) {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div className="main">
 | 
				
			||||||
 | 
					        <div id="bodyScreen">
 | 
				
			||||||
 | 
					          <h3
 | 
				
			||||||
 | 
					            style={{
 | 
				
			||||||
 | 
					              display:
 | 
				
			||||||
 | 
					                log?.modelSpecial === "" && log?.issueItem === ""
 | 
				
			||||||
 | 
					                  ? "block"
 | 
				
			||||||
 | 
					                  : "none",
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            No errors were found in the file
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          <h3 style={{ display: log?.modelSpecial !== "" ? "block" : "none" }}>
 | 
				
			||||||
 | 
					            Extra items:
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          {log?.modelSpecial?.split("\n")?.map((line) => (
 | 
				
			||||||
 | 
					            <span>
 | 
				
			||||||
 | 
					              <span className="lineNumberLog">{line.split("|-|")[0]}</span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[1]}</span>
 | 
				
			||||||
 | 
					              <span className="itemDetected">
 | 
				
			||||||
 | 
					                <a
 | 
				
			||||||
 | 
					                  href={"#" + line.split("|-|")[0]}
 | 
				
			||||||
 | 
					                  style={{ textDecoration: "none", color: "black" }}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  {line.split("|-|")[2]}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[3]}</span>
 | 
				
			||||||
 | 
					              <br></br>
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					          <h3 style={{ display: log?.issueItem !== "" ? "block" : "none" }}>
 | 
				
			||||||
 | 
					            Issue found:
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          {log?.issueItem?.split("\n")?.reverse().map((line) => (
 | 
				
			||||||
 | 
					            <span>
 | 
				
			||||||
 | 
					              <span className="lineNumberLog">{line.split("|-|")[0]}</span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[1]}</span>
 | 
				
			||||||
 | 
					              <span className="itemDetected">
 | 
				
			||||||
 | 
					                <a
 | 
				
			||||||
 | 
					                  href={"#" + line.split("|-|")[0]}
 | 
				
			||||||
 | 
					                  style={{ textDecoration: "none", color: "black" }}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  {line.split("|-|")[2]}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[3]}</span>
 | 
				
			||||||
 | 
					              <br></br>
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <h1>
 | 
				
			||||||
 | 
					          <i>The file was not found.</i>
 | 
				
			||||||
 | 
					        </h1>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ScreenShot;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,106 @@
 | 
				
			||||||
 | 
					.main {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  height: 100vh;
 | 
				
			||||||
 | 
					  flex-flow: column;
 | 
				
			||||||
 | 
					  background-color: gray;
 | 
				
			||||||
 | 
					  /* position: relative; */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.detectedDiv {
 | 
				
			||||||
 | 
					  height: 40%;
 | 
				
			||||||
 | 
					  padding: 5px;
 | 
				
			||||||
 | 
					  word-wrap: break-word;
 | 
				
			||||||
 | 
					  border: solid gray 5px;
 | 
				
			||||||
 | 
					  white-space: pre;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  font-family: monospace;
 | 
				
			||||||
 | 
					  text-rendering: auto;
 | 
				
			||||||
 | 
					  color: fieldtext;
 | 
				
			||||||
 | 
					  letter-spacing: normal;
 | 
				
			||||||
 | 
					  word-spacing: normal;
 | 
				
			||||||
 | 
					  line-height: normal;
 | 
				
			||||||
 | 
					  text-transform: none;
 | 
				
			||||||
 | 
					  text-indent: 0px;
 | 
				
			||||||
 | 
					  text-shadow: none;
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					  text-align: start;
 | 
				
			||||||
 | 
					  appearance: auto;
 | 
				
			||||||
 | 
					  -webkit-rtl-ordering: logical;
 | 
				
			||||||
 | 
					  resize: vertical;
 | 
				
			||||||
 | 
					  cursor: text;
 | 
				
			||||||
 | 
					  background-color: field;
 | 
				
			||||||
 | 
					  column-count: initial !important;
 | 
				
			||||||
 | 
					  writing-mode: horizontal-tb !important;
 | 
				
			||||||
 | 
					  /* box-sizing: border-box; */
 | 
				
			||||||
 | 
					  margin: 0em;
 | 
				
			||||||
 | 
					  /* border-width: 1px; */
 | 
				
			||||||
 | 
					  /* border-style: solid;/ */
 | 
				
			||||||
 | 
					  /* border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); */
 | 
				
			||||||
 | 
					  /* border-image: initial; */
 | 
				
			||||||
 | 
					  padding: 5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.logContent {
 | 
				
			||||||
 | 
					  scroll-behavior: smooth;
 | 
				
			||||||
 | 
					  border: solid gray 5px;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  height: 60%;
 | 
				
			||||||
 | 
					  word-wrap: break-word;
 | 
				
			||||||
 | 
					  white-space: pre;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  font-family: monospace;
 | 
				
			||||||
 | 
					  text-rendering: auto;
 | 
				
			||||||
 | 
					  color: fieldtext;
 | 
				
			||||||
 | 
					  letter-spacing: normal;
 | 
				
			||||||
 | 
					  word-spacing: normal;
 | 
				
			||||||
 | 
					  line-height: normal;
 | 
				
			||||||
 | 
					  text-transform: none;
 | 
				
			||||||
 | 
					  text-indent: 0px;
 | 
				
			||||||
 | 
					  text-shadow: none;
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					  text-align: start;
 | 
				
			||||||
 | 
					  appearance: auto;
 | 
				
			||||||
 | 
					  -webkit-rtl-ordering: logical;
 | 
				
			||||||
 | 
					  resize: vertical;
 | 
				
			||||||
 | 
					  cursor: text;
 | 
				
			||||||
 | 
					  background-color: field;
 | 
				
			||||||
 | 
					  column-count: initial !important;
 | 
				
			||||||
 | 
					  writing-mode: horizontal-tb !important;
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					  margin: 0em;
 | 
				
			||||||
 | 
					  /* border-width: 1px; */
 | 
				
			||||||
 | 
					  /* border-style: solid; */
 | 
				
			||||||
 | 
					  /* border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); */
 | 
				
			||||||
 | 
					  /* border-image: initial; */
 | 
				
			||||||
 | 
					  padding: 5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.itemDetected {
 | 
				
			||||||
 | 
					  background-color: rgb(240, 155, 155);
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.itemDetected:hover {
 | 
				
			||||||
 | 
					  background-color: rgba(240, 155, 155, 0.583);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.lineNumberLog {
 | 
				
			||||||
 | 
					  background-color: yellow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.buttonOption {
 | 
				
			||||||
 | 
					  /* position: "sticky"; */
 | 
				
			||||||
 | 
					  /* top: 0; */
 | 
				
			||||||
 | 
					  /* background-color: "white"; */
 | 
				
			||||||
 | 
					  text-align: "center";
 | 
				
			||||||
 | 
					  background-color: rgba(255, 0, 0, 0);
 | 
				
			||||||
 | 
					  display: "flex";
 | 
				
			||||||
 | 
					  padding: 0 10px 0 0;
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					  font-weight: 700;
 | 
				
			||||||
 | 
					  border-left: 5px solid gray;
 | 
				
			||||||
 | 
					  border-right: 5px solid gray;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.buttonOption span{
 | 
				
			||||||
 | 
					    float: right;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,142 @@
 | 
				
			||||||
 | 
					import axios from "axios";
 | 
				
			||||||
 | 
					import React, { useEffect, useState } from "react";
 | 
				
			||||||
 | 
					import { Link, Navigate, useParams } from "react-router-dom";
 | 
				
			||||||
 | 
					import { getLog } from "../../api/apiLog";
 | 
				
			||||||
 | 
					import "./ShowLog.css";
 | 
				
			||||||
 | 
					const ShowLog = () => {
 | 
				
			||||||
 | 
					  let { name } = useParams();
 | 
				
			||||||
 | 
					  const [log, setLog] = useState({});
 | 
				
			||||||
 | 
					  const [status, setStatus] = useState(200);
 | 
				
			||||||
 | 
					  const getContentLog = async () => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const res = await axios.get(getLog + "/" + name);
 | 
				
			||||||
 | 
					      setLog(res.data);
 | 
				
			||||||
 | 
					      setStatus(res.status);
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      console.log(error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const scrollToElement = () => {
 | 
				
			||||||
 | 
					    const hash = window.location.hash;
 | 
				
			||||||
 | 
					    if (hash) {
 | 
				
			||||||
 | 
					      const targetElement = document.getElementById(hash.slice(1));
 | 
				
			||||||
 | 
					      if (targetElement) {
 | 
				
			||||||
 | 
					        targetElement.scrollIntoView({ behavior: "smooth" });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    getContentLog();
 | 
				
			||||||
 | 
					    setTimeout(() => {
 | 
				
			||||||
 | 
					      scrollToElement();
 | 
				
			||||||
 | 
					    }, 3000);
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  if (status === 200) {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div className="main">
 | 
				
			||||||
 | 
					        <div className="buttonOption">
 | 
				
			||||||
 | 
					          <Link to={"/"}>
 | 
				
			||||||
 | 
					            <button
 | 
				
			||||||
 | 
					              style={{
 | 
				
			||||||
 | 
					                color: "white",
 | 
				
			||||||
 | 
					                backgroundColor: "blue",
 | 
				
			||||||
 | 
					                cursor: "pointer",
 | 
				
			||||||
 | 
					              }}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              Home
 | 
				
			||||||
 | 
					            </button>
 | 
				
			||||||
 | 
					          </Link>
 | 
				
			||||||
 | 
					          <Link to={"/logs"}>
 | 
				
			||||||
 | 
					            {" "}
 | 
				
			||||||
 | 
					            <button
 | 
				
			||||||
 | 
					              style={{
 | 
				
			||||||
 | 
					                color: "white",
 | 
				
			||||||
 | 
					                backgroundColor: "blue",
 | 
				
			||||||
 | 
					                cursor: "pointer",
 | 
				
			||||||
 | 
					              }}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              List of detected files
 | 
				
			||||||
 | 
					            </button>
 | 
				
			||||||
 | 
					          </Link>
 | 
				
			||||||
 | 
					          <span>{name}</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div className="detectedDiv">
 | 
				
			||||||
 | 
					          <h3
 | 
				
			||||||
 | 
					            style={{
 | 
				
			||||||
 | 
					              display:
 | 
				
			||||||
 | 
					                log?.modelSpecial === "" && log?.issueItem === ""
 | 
				
			||||||
 | 
					                  ? "block"
 | 
				
			||||||
 | 
					                  : "none",
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            No errors were found in the file
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          <h3 style={{ display: log?.modelSpecial !== "" ? "block" : "none" }}>
 | 
				
			||||||
 | 
					            Extra items:
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          {log?.modelSpecial?.split("\n")?.reverse().map((line) => (
 | 
				
			||||||
 | 
					            <span>
 | 
				
			||||||
 | 
					              <span className="lineNumberLog">{line.split("|-|")[0]}</span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[1]}</span>
 | 
				
			||||||
 | 
					              <span className="itemDetected">
 | 
				
			||||||
 | 
					                <a
 | 
				
			||||||
 | 
					                  href={"#" + line.split("|-|")[0]}
 | 
				
			||||||
 | 
					                  style={{ textDecoration: "none", color: "black" }}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  {line.split("|-|")[2]}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[3]}</span>
 | 
				
			||||||
 | 
					              <br></br>
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					          <h3 style={{ display: log?.issueItem !== "" ? "block" : "none" }}>
 | 
				
			||||||
 | 
					            Issue found:
 | 
				
			||||||
 | 
					          </h3>
 | 
				
			||||||
 | 
					          {log?.issueItem?.split("\n")?.reverse().map((line) => (
 | 
				
			||||||
 | 
					            <span>
 | 
				
			||||||
 | 
					              <span className="lineNumberLog">{line.split("|-|")[0]}</span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[1]}</span>
 | 
				
			||||||
 | 
					              <span className="itemDetected">
 | 
				
			||||||
 | 
					                <a
 | 
				
			||||||
 | 
					                  href={"#" + line.split("|-|")[0]}
 | 
				
			||||||
 | 
					                  style={{ textDecoration: "none", color: "black" }}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  {line.split("|-|")[2]}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[3]}</span>
 | 
				
			||||||
 | 
					              <br></br>
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div className="logContent">
 | 
				
			||||||
 | 
					          {log?.contentFile?.split("\n")?.map((line) => (
 | 
				
			||||||
 | 
					            <span>
 | 
				
			||||||
 | 
					              <span className="lineNumberLog">{line.split("|-|")[0]}</span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[1]}</span>
 | 
				
			||||||
 | 
					              <span className="itemDetected">
 | 
				
			||||||
 | 
					                <span id={line.split("|-|")[0]}>{line.split("|-|")[2]}</span>
 | 
				
			||||||
 | 
					              </span>
 | 
				
			||||||
 | 
					              <span>{line.split("|-|")[3]}</span>
 | 
				
			||||||
 | 
					              <br></br>
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <h1>
 | 
				
			||||||
 | 
					          <i>The file was not found.</i>
 | 
				
			||||||
 | 
					        </h1>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ShowLog;
 | 
				
			||||||
| 
						 | 
					@ -3,12 +3,17 @@ import ReactDOM from 'react-dom/client';
 | 
				
			||||||
import './index.css';
 | 
					import './index.css';
 | 
				
			||||||
import App from './App';
 | 
					import App from './App';
 | 
				
			||||||
import reportWebVitals from './reportWebVitals';
 | 
					import reportWebVitals from './reportWebVitals';
 | 
				
			||||||
 | 
					import { BrowserRouter, Route, Routes } from "react-router-dom";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const root = ReactDOM.createRoot(document.getElementById('root'));
 | 
					const root = ReactDOM.createRoot(document.getElementById('root'));
 | 
				
			||||||
root.render(
 | 
					root.render(
 | 
				
			||||||
  <React.StrictMode>
 | 
					  <React.StrictMode>
 | 
				
			||||||
    <App />
 | 
					  <BrowserRouter>
 | 
				
			||||||
  </React.StrictMode>
 | 
					      <Routes>
 | 
				
			||||||
 | 
					        <Route path="*" element={<App />} />
 | 
				
			||||||
 | 
					      </Routes>
 | 
				
			||||||
 | 
					    </BrowserRouter>
 | 
				
			||||||
 | 
					</React.StrictMode>
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// If you want to start measuring performance in your app, pass a function
 | 
					// If you want to start measuring performance in your app, pass a function
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,13 @@
 | 
				
			||||||
import axios from "axios";
 | 
					import axios from "axios";
 | 
				
			||||||
import React, { useEffect, useState } from "react";
 | 
					import React, { useEffect, useState } from "react";
 | 
				
			||||||
import { addKeyValue, deleteValue, getKeyValues } from "../api/apiLog";
 | 
					import { addKeyValue, deleteValue, editValue, getKeyValues } from "../api/apiLog";
 | 
				
			||||||
 | 
					import { Link } from "react-router-dom";
 | 
				
			||||||
const ManageValues = () => {
 | 
					const ManageValues = () => {
 | 
				
			||||||
  const [keyValue, setKeyValue] = useState([]);
 | 
					  const [keyValue, setKeyValue] = useState([]);
 | 
				
			||||||
  const [key, setKey] = useState([]);
 | 
					  const [key, setKey] = useState([]);
 | 
				
			||||||
  const [addValue, setAddValue] = useState({key: "CATCH_FAULTY", value:""});
 | 
					  const [addValue, setAddValue] = useState({ key: "CATCH_FAULTY", value: "" });
 | 
				
			||||||
 | 
					  const [inputSelect, setInpuSelect] = useState(0)
 | 
				
			||||||
 | 
					  const [inputValue, setInputValue] = useState("")
 | 
				
			||||||
  const getValues = async () => {
 | 
					  const getValues = async () => {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const res = await axios.post(getKeyValues);
 | 
					      const res = await axios.post(getKeyValues);
 | 
				
			||||||
| 
						 | 
					@ -14,21 +17,22 @@ const ManageValues = () => {
 | 
				
			||||||
      console.log(error);
 | 
					      console.log(error);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    getValues();
 | 
					    getValues();
 | 
				
			||||||
  }, []);
 | 
					  }, []);
 | 
				
			||||||
 | 
					  console.log(inputValue)
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      style={{
 | 
					      style={{
 | 
				
			||||||
        display: "flex",
 | 
					        display: "flex",
 | 
				
			||||||
        alignItems:"center",
 | 
					        alignItems: "center",
 | 
				
			||||||
        flexFlow: "column"
 | 
					        flexFlow: "column",
 | 
				
			||||||
      }}
 | 
					      }}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div style={{ height: "80vh", overflow: "auto" }}>
 | 
					      <div style={{ height: "80vh", overflow: "auto" }}>
 | 
				
			||||||
        <table>
 | 
					        <table>
 | 
				
			||||||
          <thead style={{width:"100%"}}>
 | 
					          <thead style={{ width: "100%" }}>
 | 
				
			||||||
            <tr>
 | 
					            <tr>
 | 
				
			||||||
              <th
 | 
					              <th
 | 
				
			||||||
                style={{ position: "sticky", top: 0, backgroundColor: "white" }}
 | 
					                style={{ position: "sticky", top: 0, backgroundColor: "white" }}
 | 
				
			||||||
| 
						 | 
					@ -36,7 +40,12 @@ const ManageValues = () => {
 | 
				
			||||||
                Key
 | 
					                Key
 | 
				
			||||||
              </th>
 | 
					              </th>
 | 
				
			||||||
              <th
 | 
					              <th
 | 
				
			||||||
                style={{ position: "sticky", top: 0, backgroundColor: "white", width:"400px" }}
 | 
					                style={{
 | 
				
			||||||
 | 
					                  position: "sticky",
 | 
				
			||||||
 | 
					                  top: 0,
 | 
				
			||||||
 | 
					                  backgroundColor: "white",
 | 
				
			||||||
 | 
					                  width: "400px",
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
                Value
 | 
					                Value
 | 
				
			||||||
              </th>
 | 
					              </th>
 | 
				
			||||||
| 
						 | 
					@ -49,31 +58,99 @@ const ManageValues = () => {
 | 
				
			||||||
          </thead>
 | 
					          </thead>
 | 
				
			||||||
          <tbody>
 | 
					          <tbody>
 | 
				
			||||||
            {keyValue?.map((value) => (
 | 
					            {keyValue?.map((value) => (
 | 
				
			||||||
              <tr style={{backgroundColor:value.key==="MODEL_SPECIAL"?"rgb(219 219 255 / 47%)":value.key==="CATCH_FAULTY"?"rgb(166 255 165 / 43%)":"rgb(253 189 152 / 41%)"}}>
 | 
					              <tr
 | 
				
			||||||
 | 
					                style={{
 | 
				
			||||||
 | 
					                  backgroundColor:
 | 
				
			||||||
 | 
					                    value.key === "MODEL_SPECIAL"
 | 
				
			||||||
 | 
					                      ? "rgb(219 219 255 / 47%)"
 | 
				
			||||||
 | 
					                      : value.key === "CATCH_FAULTY"
 | 
				
			||||||
 | 
					                      ? "rgb(166 255 165 / 43%)"
 | 
				
			||||||
 | 
					                      : value.key === "MEMORY_DEFAULT"
 | 
				
			||||||
 | 
					                      ? "rgb(253 244 52 / 41%)"
 | 
				
			||||||
 | 
					                      : "rgb(253 189 152 / 41%)",
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
                <td>{value.key}</td>
 | 
					                <td>{value.key}</td>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                  <input value={value.value} disabled style={{width:"100%"}}></input>
 | 
					                  <input
 | 
				
			||||||
 | 
					                    value={inputSelect===value.id_key?inputValue:value.value}
 | 
				
			||||||
 | 
					                    disabled={inputSelect===value.id_key?false:true}
 | 
				
			||||||
 | 
					                    style={{ width: "100%" }}
 | 
				
			||||||
 | 
					                    onChange={(e)=>{
 | 
				
			||||||
 | 
					                      setInputValue(e.target.value)
 | 
				
			||||||
 | 
					                      
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                  ></input>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                  <button style={{cursor:"pointer", backgroundColor:"red", color:"white"}} onClick={async()=>{
 | 
					                  <button
 | 
				
			||||||
                    const res = await axios.post(deleteValue, {id: value.id_key})
 | 
					                    style={{
 | 
				
			||||||
                    if(res.status !== 200){
 | 
					                      cursor: "pointer",
 | 
				
			||||||
                        alert(res.data)
 | 
					                      backgroundColor: "red",
 | 
				
			||||||
                    }else{
 | 
					                      color: "white",
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onClick={async () => {
 | 
				
			||||||
 | 
					                      const res = await axios.post(deleteValue, {
 | 
				
			||||||
 | 
					                        id: value.id_key,
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					                      if (res.status !== 200) {
 | 
				
			||||||
 | 
					                        alert(res.data);
 | 
				
			||||||
 | 
					                      } else {
 | 
				
			||||||
                        getValues();
 | 
					                        getValues();
 | 
				
			||||||
                      }
 | 
					                      }
 | 
				
			||||||
                  }}>Delete</button>
 | 
					                    }}
 | 
				
			||||||
                  {/* <button style={{cursor:"pointer", backgroundColor:"green", color:"white"}}>Save</button> */}
 | 
					                  >
 | 
				
			||||||
 | 
					                    Delete
 | 
				
			||||||
 | 
					                  </button>
 | 
				
			||||||
 | 
					                  <button
 | 
				
			||||||
 | 
					                    style={{
 | 
				
			||||||
 | 
					                      cursor: "pointer",
 | 
				
			||||||
 | 
					                      backgroundColor: "yellow",
 | 
				
			||||||
 | 
					                      color: "black",
 | 
				
			||||||
 | 
					                      display:inputSelect===value.id_key?"none":"inline"
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onClick={async () => {
 | 
				
			||||||
 | 
					                      setInpuSelect(value.id_key)
 | 
				
			||||||
 | 
					                      setInputValue(value.value)
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                  >
 | 
				
			||||||
 | 
					                    Edit
 | 
				
			||||||
 | 
					                  </button>
 | 
				
			||||||
 | 
					                  <button
 | 
				
			||||||
 | 
					                    style={{
 | 
				
			||||||
 | 
					                      cursor: "pointer",
 | 
				
			||||||
 | 
					                      backgroundColor: "green",
 | 
				
			||||||
 | 
					                      color: "white",
 | 
				
			||||||
 | 
					                      display:inputSelect===value.id_key?"inline":"none"
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onClick={async () => {
 | 
				
			||||||
 | 
					                      setInpuSelect(0)
 | 
				
			||||||
 | 
					                      const res = await axios.post(editValue, {
 | 
				
			||||||
 | 
					                        id: value.id_key,
 | 
				
			||||||
 | 
					                        value: inputValue
 | 
				
			||||||
 | 
					                      });
 | 
				
			||||||
 | 
					                      if (res.status !== 200) {
 | 
				
			||||||
 | 
					                        alert(res.data);
 | 
				
			||||||
 | 
					                      } else {
 | 
				
			||||||
 | 
					                        getValues();
 | 
				
			||||||
 | 
					                      }
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                  >
 | 
				
			||||||
 | 
					                    Done
 | 
				
			||||||
 | 
					                  </button>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
              </tr>
 | 
					              </tr>
 | 
				
			||||||
            ))}
 | 
					            ))}
 | 
				
			||||||
          </tbody>
 | 
					          </tbody>
 | 
				
			||||||
        </table>
 | 
					        </table>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div style={{ width: "50%", display:"flex", margin:10 }}>
 | 
					      <div style={{ width: "50%", display: "flex", margin: 10 }}>
 | 
				
			||||||
        <select style={{ width: "35%" }} onChange={(e)=>{
 | 
					        <select
 | 
				
			||||||
            setAddValue({...addValue, key:e.target.value})
 | 
					          style={{ width: "35%" }}
 | 
				
			||||||
        }}>
 | 
					          onChange={(e) => {
 | 
				
			||||||
 | 
					            setAddValue({ ...addValue, key: e.target.value });
 | 
				
			||||||
 | 
					          }}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
          {key
 | 
					          {key
 | 
				
			||||||
            .filter((value, index, self) => {
 | 
					            .filter((value, index, self) => {
 | 
				
			||||||
              return self.indexOf(value) === index;
 | 
					              return self.indexOf(value) === index;
 | 
				
			||||||
| 
						 | 
					@ -82,22 +159,51 @@ const ManageValues = () => {
 | 
				
			||||||
              <option value={u}>{u}</option>
 | 
					              <option value={u}>{u}</option>
 | 
				
			||||||
            ))}
 | 
					            ))}
 | 
				
			||||||
        </select>
 | 
					        </select>
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
        <input placeholder="value" style={{margin:"0 5px", width:"50%"}} onChange={(e)=>{
 | 
					          placeholder="value"
 | 
				
			||||||
            setAddValue({...addValue, value: e.target.value})
 | 
					          style={{ margin: "0 5px", width: "50%" }}
 | 
				
			||||||
        }}></input>
 | 
					          onChange={(e) => {
 | 
				
			||||||
        <button style={{cursor:"pointer", backgroundColor:"green", color:"white"}} onClick={async()=>{
 | 
					            setAddValue({ ...addValue, value: e.target.value });
 | 
				
			||||||
            if(addValue.key !=="" && addValue.value!==""){
 | 
					          }}
 | 
				
			||||||
                const res = await axios.post(addKeyValue,{key: addValue.key, value: addValue.value})
 | 
					        ></input>
 | 
				
			||||||
                if(res.status !== 200){
 | 
					        <button
 | 
				
			||||||
                    alert(res.data)
 | 
					          style={{
 | 
				
			||||||
                }else{
 | 
					            cursor: "pointer",
 | 
				
			||||||
 | 
					            backgroundColor: "green",
 | 
				
			||||||
 | 
					            color: "white",
 | 
				
			||||||
 | 
					          }}
 | 
				
			||||||
 | 
					          onClick={async () => {
 | 
				
			||||||
 | 
					            if (addValue.key !== "" && addValue.value !== "") {
 | 
				
			||||||
 | 
					              const res = await axios.post(addKeyValue, {
 | 
				
			||||||
 | 
					                key: addValue.key,
 | 
				
			||||||
 | 
					                value: addValue.value,
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					              if (res.status !== 200) {
 | 
				
			||||||
 | 
					                alert(res.data);
 | 
				
			||||||
 | 
					              } else {
 | 
				
			||||||
                getValues();
 | 
					                getValues();
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }else{
 | 
					            } else {
 | 
				
			||||||
                alert("Value is empty!")
 | 
					              alert("Value is empty!");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }}>Add</button>
 | 
					          }}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          Add
 | 
				
			||||||
 | 
					        </button>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <Link to={"/logs"}>
 | 
				
			||||||
 | 
					          {" "}
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            style={{
 | 
				
			||||||
 | 
					              color: "white",
 | 
				
			||||||
 | 
					              backgroundColor: "blue",
 | 
				
			||||||
 | 
					              cursor: "pointer",
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            List of detected files
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					        </Link>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -30,13 +30,20 @@
 | 
				
			||||||
    "axios": "^1.4.0",
 | 
					    "axios": "^1.4.0",
 | 
				
			||||||
    "child_process": "^1.0.2",
 | 
					    "child_process": "^1.0.2",
 | 
				
			||||||
    "chokidar": "^3.5.3",
 | 
					    "chokidar": "^3.5.3",
 | 
				
			||||||
 | 
					    "dotenv": "^16.3.1",
 | 
				
			||||||
    "fs": "^0.0.1-security",
 | 
					    "fs": "^0.0.1-security",
 | 
				
			||||||
 | 
					    "helpers": "^0.0.6",
 | 
				
			||||||
    "jsonwebtoken": "^9.0.1",
 | 
					    "jsonwebtoken": "^9.0.1",
 | 
				
			||||||
    "luxon": "^3.4.0",
 | 
					    "luxon": "^3.4.0",
 | 
				
			||||||
    "moment": "^2.29.4",
 | 
					    "moment": "^2.29.4",
 | 
				
			||||||
    "mysql2": "^3.6.0",
 | 
					    "mysql2": "^3.6.0",
 | 
				
			||||||
 | 
					    "nodemailer": "^6.9.5",
 | 
				
			||||||
 | 
					    "path": "^0.12.7",
 | 
				
			||||||
    "proxy-addr": "^2.0.7",
 | 
					    "proxy-addr": "^2.0.7",
 | 
				
			||||||
 | 
					    "puppeteer": "^21.2.1",
 | 
				
			||||||
    "reflect-metadata": "^0.1.13",
 | 
					    "reflect-metadata": "^0.1.13",
 | 
				
			||||||
 | 
					    "socket.io": "^4.7.2",
 | 
				
			||||||
 | 
					    "socket.io-client": "^4.7.2",
 | 
				
			||||||
    "source-map-support": "^0.5.21",
 | 
					    "source-map-support": "^0.5.21",
 | 
				
			||||||
    "zulip-js": "^2.0.9"
 | 
					    "zulip-js": "^2.0.9"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,28 @@
 | 
				
			||||||
import type { ApplicationContract } from '@ioc:Adonis/Core/Application'
 | 
					import type { ApplicationContract } from "@ioc:Adonis/Core/Application";
 | 
				
			||||||
 | 
					import io from "socket.io-client";
 | 
				
			||||||
export default class AppProvider {
 | 
					export default class AppProvider {
 | 
				
			||||||
  constructor (protected app: ApplicationContract) {
 | 
					  constructor(protected app: ApplicationContract) {}
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public register () {
 | 
					  public register() {
 | 
				
			||||||
    // Register your own bindings
 | 
					    // Register your own bindings
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async boot () {
 | 
					  public async boot() {
 | 
				
			||||||
    // IoC container is ready
 | 
					    // IoC container is ready
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async ready () {
 | 
					  public async ready() {
 | 
				
			||||||
    
 | 
					    // setInterval(() => {
 | 
				
			||||||
 | 
					    //   let socket = io("http://118.71.46.74:7777");
 | 
				
			||||||
 | 
					    //   socket?.emit("monitor", { name: "logs server", status: "I'm file" });
 | 
				
			||||||
 | 
					    // }, 20000);
 | 
				
			||||||
 | 
					    // if (this.app.environment === 'web') {
 | 
				
			||||||
 | 
					    //   await import('../start/socket')
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
    // App is ready
 | 
					    // App is ready
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async shutdown () {
 | 
					  public async shutdown() {
 | 
				
			||||||
    // Cleanup, since app is going down
 | 
					    // Cleanup, since app is going down
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,334 @@
 | 
				
			||||||
 | 
					const regex = /(\d+)K/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "1000944K bytes of ATA System CompactFlash 0 (Read/Write) 	"
 | 
				
			||||||
 | 
					    .match(regex)
 | 
				
			||||||
 | 
					    .map((obj) => (parseInt(obj.replace("K", ""))/1024/1024).toFixed(2)+"G")
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// let a = [1,2,3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// console.log(a.slice(0,4))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const checkSpecialVersion = (paragraph) => {
 | 
				
			||||||
 | 
					//   try {
 | 
				
			||||||
 | 
					//     const regex = /\(CAT3K_CAA-UNIVERSALK9-M\), Version 16\.9\.[2-9]/;
 | 
				
			||||||
 | 
					//     const regex1 = /\(CAT3K_CAA-UNIVERSALK9-M\), Version 1[7-9]\.[0-9]\.[2-9]/;
 | 
				
			||||||
 | 
					//     const regex2 =
 | 
				
			||||||
 | 
					//       /\(CAT3K_CAA-UNIVERSALK9-M\), Version [2-9][0-9]\.[0-9]\.[2-9]/;
 | 
				
			||||||
 | 
					//     // Use the regular expression to find the match
 | 
				
			||||||
 | 
					//     const match = paragraph.match(regex);
 | 
				
			||||||
 | 
					//     const match1 = paragraph.match(regex1);
 | 
				
			||||||
 | 
					//     const match2 = paragraph.match(regex2);
 | 
				
			||||||
 | 
					//     if (match || match1 || match2) {
 | 
				
			||||||
 | 
					//       if (match) {
 | 
				
			||||||
 | 
					//         console.log(match[0]);
 | 
				
			||||||
 | 
					//       }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//       if (match1) {
 | 
				
			||||||
 | 
					//         console.log(match1[0]);
 | 
				
			||||||
 | 
					//       }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//       if (match2) {
 | 
				
			||||||
 | 
					//         console.log(match2[0]);
 | 
				
			||||||
 | 
					//       }
 | 
				
			||||||
 | 
					//     } else {
 | 
				
			||||||
 | 
					//       return "";
 | 
				
			||||||
 | 
					//     }
 | 
				
			||||||
 | 
					//   } catch (error) {
 | 
				
			||||||
 | 
					//     console.log(error);
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// checkSpecialVersion(
 | 
				
			||||||
 | 
					//   "Cisco IOS Software [Fuji], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.9.1, RELEASE SOFTWARE (fc2)"
 | 
				
			||||||
 | 
					// );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const puppeteer = require("puppeteer");
 | 
				
			||||||
 | 
					// const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// (async () => {
 | 
				
			||||||
 | 
					//   const browser = await puppeteer.launch();
 | 
				
			||||||
 | 
					//   const page = await browser.newPage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // Điều hướng đến trang web chứa thẻ <a>
 | 
				
			||||||
 | 
					//   await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // Tìm thẻ <a> cần click dựa trên selector CSS hoặc XPath
 | 
				
			||||||
 | 
					//   const selectBoxSelector1 = "select#idCongTyDienLuc";
 | 
				
			||||||
 | 
					//   await page.waitForSelector(selectBoxSelector1);
 | 
				
			||||||
 | 
					//   await page.select(selectBoxSelector1, "PB11");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // Chờ cho trang mới mở
 | 
				
			||||||
 | 
					//   // await page.waitForNavigation('select#idCongTyDienLuc');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // In ra nội dung của trang mới
 | 
				
			||||||
 | 
					//   setTimeout(async () => {
 | 
				
			||||||
 | 
					//     const tableData = await page.evaluate(() => {
 | 
				
			||||||
 | 
					//       const tbody = document.querySelector("table"); // Lựa chọn thẻ <tbody> cần trích xuất
 | 
				
			||||||
 | 
					//       const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ <tr>) bên trong thẻ <tbody>
 | 
				
			||||||
 | 
					//       // const headerRow = document.querySelectorAll("thead"); // Lựa chọn tất cả các hàng (thẻ <tr>) bên trong thẻ <tbody>
 | 
				
			||||||
 | 
					//       // Lấy tên các cột từ hàng đầu (thẻ <th>)
 | 
				
			||||||
 | 
					//       // const headerColumns = headerRow.querySelectorAll("tr");
 | 
				
			||||||
 | 
					//       // const columnNames = headerColumns.map((headerColumn) =>
 | 
				
			||||||
 | 
					//         // headerColumn.textContent.trim()
 | 
				
			||||||
 | 
					//       // );
 | 
				
			||||||
 | 
					//       const data1 = [];
 | 
				
			||||||
 | 
					//       // headerColumns.forEach((clo) => {
 | 
				
			||||||
 | 
					//       //   const columns = Array.from(clo.querySelectorAll("th")); // Lựa chọn tất cả các cột (thẻ <td>) trong hàng
 | 
				
			||||||
 | 
					//       //   const rowData = columns.map((column) => column.textContent.trim()); // Lấy nội dung của các cột và xóa khoảng trắng
 | 
				
			||||||
 | 
					//       //   data1.push(rowData); // Thêm dữ liệu của hàng vào mảng data
 | 
				
			||||||
 | 
					//       // });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//       // Lặp qua từng hàng và lấy nội dung của các cột (thẻ <td>) trong hàng
 | 
				
			||||||
 | 
					//       const data = [];
 | 
				
			||||||
 | 
					//       rows.forEach((row) => {
 | 
				
			||||||
 | 
					//         const columns = Array.from(row.querySelectorAll("td")); // Lựa chọn tất cả các cột (thẻ <td>) trong hàng
 | 
				
			||||||
 | 
					//         const headers = Array.from(row.querySelectorAll("th"));
 | 
				
			||||||
 | 
					//         const rowHeader = headers.map((header) => header.textContent.trim());
 | 
				
			||||||
 | 
					//         const rowData = columns.map((column) => column.textContent.trim()); // Lấy nội dung của các cột và xóa khoảng trắng
 | 
				
			||||||
 | 
					//         data.push(rowData); // Thêm dữ liệu của hàng vào mảng data
 | 
				
			||||||
 | 
					//         data1.push(rowHeader)
 | 
				
			||||||
 | 
					//       });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//       return { data: data, columnNames: data1 };
 | 
				
			||||||
 | 
					//     });
 | 
				
			||||||
 | 
					//     const content = []
 | 
				
			||||||
 | 
					//     tableData.data?.map((u,index)=>{
 | 
				
			||||||
 | 
					//       for(let i=0; i<u.length;i++){
 | 
				
			||||||
 | 
					//         tableData.data[index] = tableData.columnNames[index]+": "+u[]
 | 
				
			||||||
 | 
					//       }
 | 
				
			||||||
 | 
					//     })
 | 
				
			||||||
 | 
					//     console.log("Table data:", );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     await browser.close();
 | 
				
			||||||
 | 
					//   }, 5000);
 | 
				
			||||||
 | 
					// })();
 | 
				
			||||||
 | 
					// console.log("data: ",
 | 
				
			||||||
 | 
					// data.paragraphText
 | 
				
			||||||
 | 
					//       .split("   ")
 | 
				
			||||||
 | 
					//       .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B")))
 | 
				
			||||||
 | 
					// if (
 | 
				
			||||||
 | 
					//   data.paragraphText
 | 
				
			||||||
 | 
					//     .split("   ")
 | 
				
			||||||
 | 
					//     .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B")).length > 0
 | 
				
			||||||
 | 
					// ) {
 | 
				
			||||||
 | 
					//   let params = {
 | 
				
			||||||
 | 
					//       type: "stream",
 | 
				
			||||||
 | 
					//       to: "Result test - auto.nswteam.net",
 | 
				
			||||||
 | 
					//       topic: "Lịch cúp điện",
 | 
				
			||||||
 | 
					//       content:
 | 
				
			||||||
 | 
					//         ":warning: :date: :warning:\n" +
 | 
				
			||||||
 | 
					//         data.paragraphText
 | 
				
			||||||
 | 
					//           .split("   ")
 | 
				
			||||||
 | 
					//           .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B"))[0]?.replace(/  /g,"\n\n")?.replace(/KDC 91B/g,"**KDC 91B**") +
 | 
				
			||||||
 | 
					//         "\n-------",
 | 
				
			||||||
 | 
					//     };
 | 
				
			||||||
 | 
					//   client.messages.send(params);
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const config = {
 | 
				
			||||||
 | 
					//   zuliprc: "./download",
 | 
				
			||||||
 | 
					//   zulipVersion: "v2",
 | 
				
			||||||
 | 
					// };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// async function deleteMessages() {
 | 
				
			||||||
 | 
					//   const client = await zulip(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // Thay thế "stream-name", "topic-name", và các mốc thời gian cụ thể
 | 
				
			||||||
 | 
					//   const streamName = "Result test - auto.nswteam.net";
 | 
				
			||||||
 | 
					//   const topicName = "test";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   try {
 | 
				
			||||||
 | 
					//     const messages = await client.messages.retrieve({
 | 
				
			||||||
 | 
					//       anchor: "oldest",
 | 
				
			||||||
 | 
					//       num_before: 0,
 | 
				
			||||||
 | 
					//       num_after: 5000, // Điều chỉnh theo nhu cầu của bạn
 | 
				
			||||||
 | 
					//       narrow: [
 | 
				
			||||||
 | 
					//         { operator: "stream", operand: streamName },
 | 
				
			||||||
 | 
					//         { operator: "topic", operand: topicName },
 | 
				
			||||||
 | 
					//         // {
 | 
				
			||||||
 | 
					//         //   operator: ,
 | 
				
			||||||
 | 
					//         //   operand: `169457100,1694571399`,
 | 
				
			||||||
 | 
					//         // },
 | 
				
			||||||
 | 
					//       ],
 | 
				
			||||||
 | 
					//     });
 | 
				
			||||||
 | 
					//     // console.log(messages.messages.map(u=>u.reactions))
 | 
				
			||||||
 | 
					//     const members = await client.users.retrieve();
 | 
				
			||||||
 | 
					//     // console.log(members.members)
 | 
				
			||||||
 | 
					//     console.log(messages.messages.length)
 | 
				
			||||||
 | 
					//     // await client.messages.deleteById([159454, 159455]);
 | 
				
			||||||
 | 
					//     for (const message of messages.messages) {
 | 
				
			||||||
 | 
					//       console.log(message.id)
 | 
				
			||||||
 | 
					//       if (
 | 
				
			||||||
 | 
					//         message.reactions.filter(
 | 
				
			||||||
 | 
					//           (i) =>
 | 
				
			||||||
 | 
					//             i.emoji_name === "working_on_it" &&
 | 
				
			||||||
 | 
					//             members.members.filter((u) => u.user_id === i.user_id)[0]
 | 
				
			||||||
 | 
					//               .is_admin === true
 | 
				
			||||||
 | 
					//         ).length === 0 &&
 | 
				
			||||||
 | 
					//         message.timestamp < Math.floor((Date.now() - 60000*60*24*10) / 1000)
 | 
				
			||||||
 | 
					//       ) {
 | 
				
			||||||
 | 
					//         const res = await client.messages.deleteById({
 | 
				
			||||||
 | 
					//           message_id: message.id,
 | 
				
			||||||
 | 
					//         });
 | 
				
			||||||
 | 
					//         console.log(`Deleted message ID ${message.id}`);
 | 
				
			||||||
 | 
					//         console.log(res)
 | 
				
			||||||
 | 
					//       }
 | 
				
			||||||
 | 
					//     }
 | 
				
			||||||
 | 
					//   } catch (error) {
 | 
				
			||||||
 | 
					//     console.error("Error:", error);
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// deleteMessages();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					// const fs = require("fs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const config = {
 | 
				
			||||||
 | 
					//   zuliprc: "./download",
 | 
				
			||||||
 | 
					//   zulipVersion: "v2", // Use the appropriate API version
 | 
				
			||||||
 | 
					// };
 | 
				
			||||||
 | 
					// const imageFilePath = "./screenshot.png";
 | 
				
			||||||
 | 
					// const imageBase64 = fs.readFileSync(imageFilePath, { encoding: "base64" });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// async function send() {
 | 
				
			||||||
 | 
					//   const client = await zulip(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   try {
 | 
				
			||||||
 | 
					//     const message = {
 | 
				
			||||||
 | 
					//         type: "stream",
 | 
				
			||||||
 | 
					//         to: "Result test - auto.nswteam.net", // Replace with the target stream name or recipient email
 | 
				
			||||||
 | 
					//         topic: "AU-dev", // Replace with the message topic
 | 
				
			||||||
 | 
					//         content: "Check out this image:",
 | 
				
			||||||
 | 
					//         filename: "asakfga",
 | 
				
			||||||
 | 
					//         file: imageBase64
 | 
				
			||||||
 | 
					//       };
 | 
				
			||||||
 | 
					//       client.messages.sendFile(message).then((response) => {
 | 
				
			||||||
 | 
					//         console.log("Message sent successfully:", response);
 | 
				
			||||||
 | 
					//       });
 | 
				
			||||||
 | 
					//   } catch (error) {
 | 
				
			||||||
 | 
					//     console.error("Error:", error);
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Usage example
 | 
				
			||||||
 | 
					// const filePath = __dirname+'\\screenshot.png';
 | 
				
			||||||
 | 
					// uploadFileToZulip(filePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const zulip = require('zulip-js');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// // Configure your Zulip API details
 | 
				
			||||||
 | 
					// const config = {
 | 
				
			||||||
 | 
					//   username: 'joseph.le@apactech.io',
 | 
				
			||||||
 | 
					//   apiKey: '7XGrpwzFtQyUVDQzdwL3hjdVSbLx55yt',
 | 
				
			||||||
 | 
					//   realm: 'https://zulip.ipsupply.com.au',
 | 
				
			||||||
 | 
					// };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// async function uploadFileToZulip(filePath) {
 | 
				
			||||||
 | 
					//   try {
 | 
				
			||||||
 | 
					//     const client = await zulip(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // Read the file as binary data
 | 
				
			||||||
 | 
					//     const fs = require('fs');
 | 
				
			||||||
 | 
					//     const fileData = fs.readFileSync(filePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // Create a FormData object
 | 
				
			||||||
 | 
					//     const formData = new FormData();
 | 
				
			||||||
 | 
					//     formData.append('file', fileData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // Upload the file
 | 
				
			||||||
 | 
					//     const response = await client.callEndpoint('POST', 'user_uploads', formData, {headers:{
 | 
				
			||||||
 | 
					//       'Content-Type': 'multipart/form-data',
 | 
				
			||||||
 | 
					//       // other headers if needed
 | 
				
			||||||
 | 
					//     }});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // if (response.result === 'success') {
 | 
				
			||||||
 | 
					//     //   const uploadedFileURL = response.uri;
 | 
				
			||||||
 | 
					//     //   console.log('File uploaded successfully. URL:', uploadedFileURL);
 | 
				
			||||||
 | 
					//     // } else {
 | 
				
			||||||
 | 
					//     //   console.error('Failed to upload file:', response.msg);
 | 
				
			||||||
 | 
					//     // }
 | 
				
			||||||
 | 
					//   } catch (error) {
 | 
				
			||||||
 | 
					//     console.error('Error uploading file:', error);
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					// const filePath = 'screenshot.png'; // Replace with your file path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// uploadFileToZulip(filePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// const puppeteer = require("puppeteer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// (async () => {
 | 
				
			||||||
 | 
					//   const browser = await puppeteer.launch();
 | 
				
			||||||
 | 
					//   // Store the endpoint to be able to reconnect to the browser.
 | 
				
			||||||
 | 
					//   const browserWSEndpoint = browser.wsEndpoint("https://pptr.dev/api/puppeteer.browser");
 | 
				
			||||||
 | 
					//   // Disconnect puppeteer from the browser.
 | 
				
			||||||
 | 
					//   browser.disconnect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   // Use the endpoint to reestablish a connection
 | 
				
			||||||
 | 
					//   const browser2 = await puppeteer.connect({browserWSEndpoint});
 | 
				
			||||||
 | 
					//   // Close the browser.
 | 
				
			||||||
 | 
					//   await browser2.close();
 | 
				
			||||||
 | 
					// })();
 | 
				
			||||||
 | 
					// const zulip = require("zulip-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// (async () => {
 | 
				
			||||||
 | 
					//     const config = {
 | 
				
			||||||
 | 
					//         username: "networktool-bot@zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					//         apiKey: "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM",
 | 
				
			||||||
 | 
					//         realm: "https://zulip.ipsupply.com.au",
 | 
				
			||||||
 | 
					//       };
 | 
				
			||||||
 | 
					//       const client = await zulip(config);
 | 
				
			||||||
 | 
					//       const user_id = 45;
 | 
				
			||||||
 | 
					//       let params = {
 | 
				
			||||||
 | 
					//         to: "joseph.le@apactech.io",
 | 
				
			||||||
 | 
					//         type: "private",
 | 
				
			||||||
 | 
					//         content: "With mirth and laughter let old wrinkles come.",
 | 
				
			||||||
 | 
					//     };
 | 
				
			||||||
 | 
					//       console.log(await client.messages.send(params))
 | 
				
			||||||
 | 
					// })()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// (async()=>{
 | 
				
			||||||
 | 
					//   let listLog = []
 | 
				
			||||||
 | 
					//   let from = 20230926
 | 
				
			||||||
 | 
					//   let to = 20230926
 | 
				
			||||||
 | 
					//   const response = await axios.get("http://192.168.5.7:8080/");
 | 
				
			||||||
 | 
					//   const responseAUTO = await axios.get(
 | 
				
			||||||
 | 
					//     "http://192.168.5.7:8080/AUTOlog/"
 | 
				
			||||||
 | 
					//   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   let data1 = response.data.split("\n")
 | 
				
			||||||
 | 
					//   .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					//   let data2 = responseAUTO.data.split("\n")
 | 
				
			||||||
 | 
					//   .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   const arrayLine = data1.concat(data2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// // const arrayLineAUTO = data
 | 
				
			||||||
 | 
					// //   .split("\n")
 | 
				
			||||||
 | 
					// //   .filter((i) => i.search("<a href") !== -1 && i.search(".log") !== -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// arrayLine.map((u) => {
 | 
				
			||||||
 | 
					//   let temp = u
 | 
				
			||||||
 | 
					//     .slice(u.search("<a ") + 9, u.search("</a>"))
 | 
				
			||||||
 | 
					//     .split(">")[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//   if (
 | 
				
			||||||
 | 
					//     parseInt(temp?.split("-")[0]) >= from &&
 | 
				
			||||||
 | 
					//     parseInt(temp?.split("-")[0]) <= to
 | 
				
			||||||
 | 
					//   ) {
 | 
				
			||||||
 | 
					//     listLog.push(
 | 
				
			||||||
 | 
					//       (u.slice(u.search("<a ") + 9, u.search("</a>")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") +
 | 
				
			||||||
 | 
					//         u.slice(u.search("<a ") + 9, u.search("</a>")).split(">")[1] +
 | 
				
			||||||
 | 
					//         " "
 | 
				
			||||||
 | 
					//     );
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// });
 | 
				
			||||||
 | 
					//   console.log(listLog)
 | 
				
			||||||
 | 
					// })()
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 102 KiB  | 
| 
						 | 
					@ -10,7 +10,6 @@
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Server from '@ioc:Adonis/Core/Server'
 | 
					import Server from '@ioc:Adonis/Core/Server'
 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
|--------------------------------------------------------------------------
 | 
					|--------------------------------------------------------------------------
 | 
				
			||||||
| Global middleware
 | 
					| Global middleware
 | 
				
			||||||
| 
						 | 
					@ -21,7 +20,7 @@ import Server from '@ioc:Adonis/Core/Server'
 | 
				
			||||||
|
 | 
					|
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
Server.middleware.register([
 | 
					Server.middleware.register([
 | 
				
			||||||
  () => import('@ioc:Adonis/Core/BodyParser'),
 | 
					  () => import('@ioc:Adonis/Core/BodyParser')
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -42,4 +41,5 @@ Server.middleware.register([
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
Server.middleware.registerNamed({
 | 
					Server.middleware.registerNamed({
 | 
				
			||||||
  checkToken: () => import('App/Middleware/CheckToken'),
 | 
					  checkToken: () => import('App/Middleware/CheckToken'),
 | 
				
			||||||
 | 
					  writeLog: () => import('App/Middleware/Logger')
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										203
									
								
								start/routes.ts
								
								
								
								
							
							
						
						
									
										203
									
								
								start/routes.ts
								
								
								
								
							| 
						 | 
					@ -1,203 +0,0 @@
 | 
				
			||||||
import axios from "axios";
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
|--------------------------------------------------------------------------
 | 
					 | 
				
			||||||
| Routes
 | 
					 | 
				
			||||||
|--------------------------------------------------------------------------
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
| This file is dedicated for defining HTTP routes. A single file is enough
 | 
					 | 
				
			||||||
| for majority of projects, however you can define routes in different
 | 
					 | 
				
			||||||
| files and just make sure to import them inside this file. For example
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
| Define routes in following two files
 | 
					 | 
				
			||||||
| ├── start/routes/cart.ts
 | 
					 | 
				
			||||||
| ├── start/routes/customer.ts
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
| and then import them inside `start/routes.ts` as follows
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
| import './routes/cart'
 | 
					 | 
				
			||||||
| import './routes/customer'
 | 
					 | 
				
			||||||
|
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import Route from "@ioc:Adonis/Core/Route";
 | 
					 | 
				
			||||||
import LogDetectFile from "App/Models/LogDetectFile";
 | 
					 | 
				
			||||||
import { runtimeCheckLogs } from "App/utils/runtimeCheckLogs";
 | 
					 | 
				
			||||||
import Env from "@ioc:Adonis/Core/Env";
 | 
					 | 
				
			||||||
import KeyValue from "App/Models/KeyValue";
 | 
					 | 
				
			||||||
import ErpsController from "App/Controllers/Http/ErpsController";
 | 
					 | 
				
			||||||
import LogReport from "App/Models/LogReport";
 | 
					 | 
				
			||||||
import Database from "@ioc:Adonis/Lucid/Database";
 | 
					 | 
				
			||||||
import { exec } from "child_process";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
runtimeCheckLogs(Env.get("FOLDER_LOGS"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Route.get("/api/list", async () => {
 | 
					 | 
				
			||||||
//   const a = await LogDetectFile.all();
 | 
					 | 
				
			||||||
//   return a;
 | 
					 | 
				
			||||||
// });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//ERP get index serial number
 | 
					 | 
				
			||||||
Route.post(
 | 
					 | 
				
			||||||
  "/api/getIndexSerialNumber",
 | 
					 | 
				
			||||||
  "ErpsController.getIndexSerialNumber"
 | 
					 | 
				
			||||||
).middleware("checkToken");
 | 
					 | 
				
			||||||
Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware(
 | 
					 | 
				
			||||||
  "checkToken"
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//Users
 | 
					 | 
				
			||||||
Route.post("/api/account/createUser", "UsersController.create");
 | 
					 | 
				
			||||||
Route.post("/api/account/checkLogin", "UsersController.checkLogin");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//Log
 | 
					 | 
				
			||||||
Route.get("/api/log/showLog/:name?", async ({ request, response }) => {
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    let fileDetect = await LogDetectFile.findBy(
 | 
					 | 
				
			||||||
      "file_name",
 | 
					 | 
				
			||||||
      request.params().name
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    let logsDetect = await Database.rawQuery(
 | 
					 | 
				
			||||||
      "select * from log_reports where id_file = " + fileDetect?.id_ldf
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let detectedLines = [];
 | 
					 | 
				
			||||||
    let listLine = logsDetect[0]
 | 
					 | 
				
			||||||
      .map((obj) => obj.line)
 | 
					 | 
				
			||||||
      .filter((value, index, self) => {
 | 
					 | 
				
			||||||
        return self.indexOf(value) === index;
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
      .sort((a, b) => a - b);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const content = await axios.get(
 | 
					 | 
				
			||||||
      "http://192.168.5.7:8080/" + request.params().name
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    let allValue = await KeyValue.all();
 | 
					 | 
				
			||||||
    let listKeyValues = allValue.filter(
 | 
					 | 
				
			||||||
      (i) =>
 | 
					 | 
				
			||||||
        i.$original.key === "MODEL_SPECIAL" ||
 | 
					 | 
				
			||||||
        i.$original.key === "CATCH_FAULTY"
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    let data = content.data.split("\n");
 | 
					 | 
				
			||||||
    data.map((line, index) => {
 | 
					 | 
				
			||||||
      data[index] =
 | 
					 | 
				
			||||||
        "<span style='background-color:pink;'>" +
 | 
					 | 
				
			||||||
        (index + 1) +
 | 
					 | 
				
			||||||
        "</span>" +
 | 
					 | 
				
			||||||
        line;
 | 
					 | 
				
			||||||
      listKeyValues
 | 
					 | 
				
			||||||
        .map((obj) => obj.$original.value)
 | 
					 | 
				
			||||||
        .map(async (value) => {
 | 
					 | 
				
			||||||
          if (line.search(value) !== -1) {
 | 
					 | 
				
			||||||
            data[index] =
 | 
					 | 
				
			||||||
              data[index].slice(0, data[index].search(value)) +
 | 
					 | 
				
			||||||
              "<span style='background-color:yellow;'>" +
 | 
					 | 
				
			||||||
              value +
 | 
					 | 
				
			||||||
              "</span>" +
 | 
					 | 
				
			||||||
              data[index].slice(data[index].search(value) + value.length);
 | 
					 | 
				
			||||||
            // }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    listLine.map((u) => {
 | 
					 | 
				
			||||||
      detectedLines.push(data[u - 1]);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    // console.log(data)
 | 
					 | 
				
			||||||
    response.send(
 | 
					 | 
				
			||||||
      "<html>\
 | 
					 | 
				
			||||||
    <body>\
 | 
					 | 
				
			||||||
    <div style='width:100%;height:100%;word-wrap:break-word;white-space:pre;overflow: auto;font-family: monospace;text-rendering: auto;\
 | 
					 | 
				
			||||||
    color: fieldtext;\
 | 
					 | 
				
			||||||
    letter-spacing: normal;\
 | 
					 | 
				
			||||||
    word-spacing: normal;\
 | 
					 | 
				
			||||||
    line-height: normal;\
 | 
					 | 
				
			||||||
    text-transform: none;\
 | 
					 | 
				
			||||||
    text-indent: 0px;\
 | 
					 | 
				
			||||||
    text-shadow: none;\
 | 
					 | 
				
			||||||
    display: inline-block;\
 | 
					 | 
				
			||||||
    text-align: start;\
 | 
					 | 
				
			||||||
    appearance: auto;\
 | 
					 | 
				
			||||||
    -webkit-rtl-ordering: logical;\
 | 
					 | 
				
			||||||
    resize: auto;\
 | 
					 | 
				
			||||||
    cursor: text;\
 | 
					 | 
				
			||||||
    background-color: field;\
 | 
					 | 
				
			||||||
    column-count: initial !important;\
 | 
					 | 
				
			||||||
    writing-mode: horizontal-tb !important;\
 | 
					 | 
				
			||||||
    box-sizing: border-box;\
 | 
					 | 
				
			||||||
    margin: 0em;\
 | 
					 | 
				
			||||||
    border-width: 1px;\
 | 
					 | 
				
			||||||
    border-style: solid;\
 | 
					 | 
				
			||||||
    border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133));\
 | 
					 | 
				
			||||||
    border-image: initial;\
 | 
					 | 
				
			||||||
    padding: 2px;'>" +
 | 
					 | 
				
			||||||
        "<b>Detected lines in file:</b>\n" +
 | 
					 | 
				
			||||||
        detectedLines.join("\n") +
 | 
					 | 
				
			||||||
        "\n\n" +
 | 
					 | 
				
			||||||
        data.join("\n") +
 | 
					 | 
				
			||||||
        "</div>\
 | 
					 | 
				
			||||||
    </body>\
 | 
					 | 
				
			||||||
    </html>"
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  } catch (error) {
 | 
					 | 
				
			||||||
    response.send("<h1>-------------- File not found --------------</h1>");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//Key-Value
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Route.post("/api/getKeyValue", async ({ request, response }) => {
 | 
					 | 
				
			||||||
  let data = await KeyValue.all();
 | 
					 | 
				
			||||||
  response.status(200).send(data);
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Route.post("/api/deleteValue", async ({ request, response }) => {
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    const value = await KeyValue.findOrFail(request.all().id);
 | 
					 | 
				
			||||||
    await value.delete();
 | 
					 | 
				
			||||||
    response.status(200).send("DELETE VALUE SUCCESS!");
 | 
					 | 
				
			||||||
  } catch (error) {
 | 
					 | 
				
			||||||
    response.status(500).send("DELETE VALUE FAIL!");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Route.post("/api/addValue", async ({ request, response }) => {
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    const value = await KeyValue.create({
 | 
					 | 
				
			||||||
      key: request.all().key,
 | 
					 | 
				
			||||||
      value: request.all().value,
 | 
					 | 
				
			||||||
      model: "All",
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    response.status(200).send("ADD VALUE SUCCESS!");
 | 
					 | 
				
			||||||
  } catch (error) {
 | 
					 | 
				
			||||||
    response.status(500).send("ADD VALUE FAIL!");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Route.post("/api/gitea-webhook", ({ request, response }) => {
 | 
					 | 
				
			||||||
  // Kiểm tra xem đó có phải sự kiện bạn muốn xử lý không
 | 
					 | 
				
			||||||
  // if (request.headers['x-gitlab-event'] === 'push') {
 | 
					 | 
				
			||||||
  //   // Lấy dữ liệu sự kiện từ req.body
 | 
					 | 
				
			||||||
  //   const eventData = req.body;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  //   // Xử lý dữ liệu sự kiện ở đây
 | 
					 | 
				
			||||||
  //   console.log('Received push event from GitLab:');
 | 
					 | 
				
			||||||
  //   console.log(JSON.stringify(eventData, null, 2));
 | 
					 | 
				
			||||||
  // }
 | 
					 | 
				
			||||||
  console.log(request.headers());
 | 
					 | 
				
			||||||
  console.log(request.all());
 | 
					 | 
				
			||||||
  console.log("first3215423")
 | 
					 | 
				
			||||||
  console.log("New event ---> ", request.header('x-gitea-event'));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // exec(
 | 
					 | 
				
			||||||
  //   "/home/joseph/adonis-gitlab-webhook/gitea.sh",
 | 
					 | 
				
			||||||
  //   (error, stdout, stderr) => {
 | 
					 | 
				
			||||||
  //     if (error) {
 | 
					 | 
				
			||||||
  //       console.error(`Error executing command: ${error}`);
 | 
					 | 
				
			||||||
  //       return;
 | 
					 | 
				
			||||||
  //     }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  //     console.log(`Command output:\n${stdout}`);
 | 
					 | 
				
			||||||
  //   }
 | 
					 | 
				
			||||||
  // );
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					import Ws from 'App/Services/Ws'
 | 
				
			||||||
 | 
					Ws.boot()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Listen for incoming socket connections
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					Ws.io.on('connection', (socket) => {
 | 
				
			||||||
 | 
					  socket.emit('news', { hello: 'world' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  socket.on('my other event', (data) => {
 | 
				
			||||||
 | 
					    console.log(data)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					sdfsdf
 | 
				
			||||||
 | 
					dfgdfg
 | 
				
			||||||
 | 
					dfgdf
 | 
				
			||||||
		Loading…
	
		Reference in New Issue