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,25 +243,24 @@ export default class ErpsController {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (
|
if (PBID?.length >= 8) {
|
||||||
PBID?.length >= 8
|
let fName = urls[index]
|
||||||
) {
|
?.split("/")
|
||||||
let fName = urls[index]
|
[urls[index]?.split("/")?.length - 1]?.trim();
|
||||||
?.split("/")
|
output.push({
|
||||||
[urls[index]?.split("/")?.length - 1]?.trim();
|
PID: "",
|
||||||
output.push({
|
VID: "",
|
||||||
PID: "",
|
SN: PBID?.search(" ") !== -1 ? PBID?.split(" ")[0] : PBID,
|
||||||
VID: "",
|
line: [i + 1],
|
||||||
SN: PBID?.search(" ") !== -1 ? PBID?.split(" ")[0] : PBID,
|
fileName: fName,
|
||||||
line: [i + 1],
|
warehouse:
|
||||||
fileName: fName,
|
(fName.search("-US") !== -1 ||
|
||||||
warehouse:
|
fName.search(".US") !== -1 ||
|
||||||
fName.search("-US") !== -1 ||
|
fName.search("US-") !== -1) &&
|
||||||
fName.search(".US") !== -1 ||
|
fName.search("AUS") === -1
|
||||||
fName.search("US-") !== -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,216 +99,325 @@ 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) => {
|
|
||||||
//check special item, extra RAM, error in log
|
watcher.setMaxListeners(200);
|
||||||
let lines = [];
|
|
||||||
let content = await fs
|
watcher.on("change", async (path) => {
|
||||||
.readFileSync(filePath)
|
// fs.watchFile(filePath,{ interval: 15000 },
|
||||||
.toString()
|
// async (eventType) => {
|
||||||
?.split("\n");
|
//check special item, extra RAM, error in log
|
||||||
let allValue = await KeyValue.all();
|
const fileName = path.split("/")[path.split("/").length - 1];
|
||||||
let listKeyValues = allValue.filter(
|
// const fileName = path.split("\\")[path.split("\\").length - 1];
|
||||||
(i) =>
|
const filePath = path;
|
||||||
i.$original.key === "MODEL_SPECIAL" ||
|
let lines = [];
|
||||||
i.$original.key === "CATCH_FAULTY"
|
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)
|
||||||
|
.toString()
|
||||||
|
?.split("\n");
|
||||||
|
|
||||||
|
//get index SN and send to ERP
|
||||||
|
|
||||||
|
checkIndexSN(contentFile, lastLine, fileName);
|
||||||
|
|
||||||
|
//get list item to check
|
||||||
|
let listKeyValues = allValue.filter(
|
||||||
|
(i) =>
|
||||||
|
i.$original.key === "MODEL_SPECIAL" ||
|
||||||
|
i.$original.key === "CATCH_FAULTY"
|
||||||
|
);
|
||||||
|
|
||||||
|
//get list exclude error
|
||||||
|
let listExcludeErr = allValue
|
||||||
|
.filter((i) => i.$original.key === "EXCLUDE_ERR")
|
||||||
|
.map((obj) => obj.$original.value);
|
||||||
|
|
||||||
|
//get list item special
|
||||||
|
let listExtraItem = allValue
|
||||||
|
.filter((i) => i.$original.key === "MODEL_SPECIAL")
|
||||||
|
.map((obj) => obj.$original.value);
|
||||||
|
|
||||||
|
//Process file content
|
||||||
|
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
|
||||||
|
.map((obj) => obj.$original.value)
|
||||||
|
.map(async (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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} 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
|
||||||
);
|
);
|
||||||
|
|
||||||
let listExcludeErr = allValue
|
if (checkLog?.length === 0) {
|
||||||
.filter((i) => i.$original.key === "EXCLUDE_ERR")
|
await LogReport.create({
|
||||||
.map((obj) => obj.$original.value);
|
detected_content: checkVersion,
|
||||||
|
line: index + 1,
|
||||||
let listExtraItem = allValue
|
id_file: log?.id_ldf,
|
||||||
.filter((i) => i.$original.key === "MODEL_SPECIAL")
|
});
|
||||||
.map((obj) => obj.$original.value);
|
lines.push(index + 1);
|
||||||
|
}
|
||||||
console.log(listExtraItem)
|
|
||||||
content.map((line, index) => {
|
|
||||||
listKeyValues
|
|
||||||
.map((obj) => obj.$original.value)
|
|
||||||
.map(async (value) => {
|
|
||||||
if (
|
|
||||||
line.search(value) !== -1 &&
|
|
||||||
listExcludeErr.filter((err) => line.includes(err))
|
|
||||||
.length === 0
|
|
||||||
) {
|
|
||||||
// let keyWord = "";
|
|
||||||
// line.split(" ").map((word) => {
|
|
||||||
// if (word.toLocaleLowerCase().includes(value)) {
|
|
||||||
// keyWord = keyWord + word;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// if (value.length === keyWord.length) {
|
|
||||||
const log = await LogDetectFile.findBy(
|
|
||||||
"file_name",
|
|
||||||
fileName
|
|
||||||
);
|
|
||||||
let checkLog = await Database.rawQuery(
|
|
||||||
"select * from log_reports where id_file = " +
|
|
||||||
log?.id_ldf +
|
|
||||||
" and line = " +
|
|
||||||
(index + 1) +
|
|
||||||
" and detected_content='" +
|
|
||||||
value +
|
|
||||||
"'"
|
|
||||||
);
|
|
||||||
if (checkLog[0].length === 0) {
|
|
||||||
await LogReport.create({
|
|
||||||
detected_content: value,
|
|
||||||
line: index + 1,
|
|
||||||
id_file: log?.id_ldf,
|
|
||||||
});
|
|
||||||
lines.push(index + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
// }, 5000);
|
|
||||||
//true: import log to log_report table, send report to Zulip
|
|
||||||
setTimeout(async () => {
|
|
||||||
if (lines.length === 0) {
|
|
||||||
console.log(`${fileName} has changed (${eventType})---Good`);
|
|
||||||
} else {
|
|
||||||
console.log(
|
|
||||||
`${fileName} has changed (${eventType})---SOS---${lines.length}`
|
|
||||||
);
|
|
||||||
|
|
||||||
let fileDetect = await LogDetectFile.findBy(
|
|
||||||
"file_name",
|
|
||||||
fileName
|
|
||||||
);
|
|
||||||
|
|
||||||
let logsDetect = await Database.rawQuery(
|
|
||||||
"select * from log_reports where id_file = " +
|
|
||||||
fileDetect?.id_ldf
|
|
||||||
);
|
|
||||||
|
|
||||||
let listReport = await getListLineByItem(logsDetect[0]);
|
|
||||||
let content =
|
|
||||||
"| |Last updated at | Item/error | Count | Report \n|---|:---:|:---|:---|:-----------:\n";
|
|
||||||
let spoiler = "";
|
|
||||||
// let file = await fs
|
|
||||||
// .readFileSync(filePath)
|
|
||||||
// .toString()
|
|
||||||
// ?.split("\n");
|
|
||||||
// if (logsDetect[0].length > 10) {
|
|
||||||
// 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) => {
|
|
||||||
let item = listExtraItem.includes(log.detected_content)
|
|
||||||
? ":medal: **" + log.detected_content+"**"
|
|
||||||
: ":small_orange_diamond: "+log.detected_content;
|
|
||||||
content =
|
|
||||||
content +
|
|
||||||
"|" +
|
|
||||||
(index + 1) +
|
|
||||||
"|**" +
|
|
||||||
moment(log.created_at).format("HH:mm - DD/MM") +
|
|
||||||
"**|" +
|
|
||||||
item +
|
|
||||||
"|" +
|
|
||||||
log.line.length +
|
|
||||||
// "|" +
|
|
||||||
// file[log.line - 1] +
|
|
||||||
"|[View](https://logs.danielvu.com/api/log/showLog/" +
|
|
||||||
fileName +
|
|
||||||
")\n";
|
|
||||||
});
|
|
||||||
// }
|
|
||||||
// setTimeout(() => {
|
|
||||||
sendMessToZulip(
|
|
||||||
"stream",
|
|
||||||
"Result test - auto.nswteam.net",
|
|
||||||
"Log Alert",
|
|
||||||
":warning: :warning: **" +
|
|
||||||
fileName +
|
|
||||||
"**\n\n" +
|
|
||||||
content +
|
|
||||||
"\n\n" +
|
|
||||||
spoiler
|
|
||||||
);
|
|
||||||
|
|
||||||
sendMessToZulip(
|
|
||||||
"stream",
|
|
||||||
"AUS_VN_Test",
|
|
||||||
"Test Log Alerts",
|
|
||||||
":warning: :warning: **" +
|
|
||||||
fileName +
|
|
||||||
"**\n\n" +
|
|
||||||
content +
|
|
||||||
"\n\n" +
|
|
||||||
spoiler
|
|
||||||
);
|
|
||||||
// }, 3000);
|
|
||||||
}
|
|
||||||
}, 3000);
|
|
||||||
//false: next
|
|
||||||
}
|
}
|
||||||
);
|
});
|
||||||
//setMaxListeners
|
}
|
||||||
scan.setMaxListeners(0);
|
|
||||||
// }
|
//true: import log to log_report table, send report to Zulip
|
||||||
});
|
setTimeout(async () => {
|
||||||
|
if (lines.length === 0) {
|
||||||
|
console.log(
|
||||||
|
fileName + "has changed(" + contentFile.length + ") ---Good"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
fileName +
|
||||||
|
"has changed(" +
|
||||||
|
contentFile.length +
|
||||||
|
") ---SOS---" +
|
||||||
|
lines.length
|
||||||
|
);
|
||||||
|
let allReport_new = await LogReport.query().whereRaw(
|
||||||
|
`DATE(created_at) = ?`,
|
||||||
|
[today]
|
||||||
|
);
|
||||||
|
|
||||||
|
let fileDetect = allFile?.filter(
|
||||||
|
(i) => i.$original.file_name === 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 content =
|
||||||
|
"| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n";
|
||||||
|
let spoiler = "";
|
||||||
|
let issueFound = "";
|
||||||
|
let important = [
|
||||||
|
"Vxx",
|
||||||
|
"V00",
|
||||||
|
"(CAT3K_CAA-UNIVERSALK9-M), Version",
|
||||||
|
];
|
||||||
|
listReport.map((log, index) => {
|
||||||
|
let item = listExtraItem.includes(log.detected_content)
|
||||||
|
? ":medal: **" + 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 +
|
||||||
|
"|" +
|
||||||
|
(index + 1) +
|
||||||
|
"|**" +
|
||||||
|
moment(Date.now()).format("HH:mm - DD/MM") +
|
||||||
|
"**|" +
|
||||||
|
item +
|
||||||
|
"|" +
|
||||||
|
log.line +
|
||||||
|
"|[View](https://logs.danielvu.com/logs/" +
|
||||||
|
fileName +
|
||||||
|
"#" +
|
||||||
|
log.line +
|
||||||
|
")\n";
|
||||||
|
});
|
||||||
|
|
||||||
|
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(
|
||||||
|
"stream",
|
||||||
|
Env.get("ZULIP_STREAM_ALERT"),
|
||||||
|
Env.get("ZULIP_TOPIC_ALERT"),
|
||||||
|
icon +
|
||||||
|
"\n\n" +
|
||||||
|
content +
|
||||||
|
"\n\n" +
|
||||||
|
spoiler +
|
||||||
|
"\n\n***Issue found:***\n" +
|
||||||
|
issueFound
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, 3000);
|
||||||
|
// console.log(path + " change")
|
||||||
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
let params = {
|
if(type === "private"){
|
||||||
type: type,
|
let params = {
|
||||||
to: to,
|
type: type,
|
||||||
topic: topic,
|
to: to,
|
||||||
content: content
|
content: content
|
||||||
};
|
};
|
||||||
|
await client.messages.send(params);
|
||||||
|
}else{
|
||||||
|
let params = {
|
||||||
|
type: type,
|
||||||
|
to: to,
|
||||||
|
topic: topic,
|
||||||
|
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",
|
||||||
getValues();
|
backgroundColor: "green",
|
||||||
}
|
color: "white",
|
||||||
}else{
|
}}
|
||||||
alert("Value is empty!")
|
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();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
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