From 48a261b9d9c4b54b3bd7334c1d32f5cd3a3b766f Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 11 Sep 2023 09:35:41 +0700 Subject: [PATCH 001/298] change format file --- app/utils/runtimeCheckLogs.ts | 1 - start/routes.ts | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0015077..dbf64b6 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -102,7 +102,6 @@ export async function runtimeCheckLogs(folderPath) { .filter((i) => i.$original.key === "MODEL_SPECIAL") .map((obj) => obj.$original.value); - console.log(listExtraItem) content.map((line, index) => { listKeyValues .map((obj) => obj.$original.value) diff --git a/start/routes.ts b/start/routes.ts index 98547ff..549fcb0 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -77,6 +77,11 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { i.$original.key === "MODEL_SPECIAL" || i.$original.key === "CATCH_FAULTY" ); + + 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] = @@ -99,7 +104,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); }); listLine.map((u) => { - detectedLines.push(data[u - 1]); + if (listExcludeErr.filter((err) => u.includes(err)).length === 0) { + detectedLines.push(data[u - 1]); + } }); // console.log(data) response.send( @@ -138,6 +145,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { " ); } catch (error) { + console.log(error); response.send("

-------------- File not found --------------

"); } }); @@ -184,9 +192,9 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { // } console.log(request.headers()); console.log(request.all()); - console.log("first3215423") - console.log("New event ---> ", request.header('x-gitea-event')); - + console.log("first3215423"); + console.log("New event ---> ", request.header("x-gitea-event")); + // exec( // "/home/joseph/adonis-gitlab-webhook/gitea.sh", // (error, stdout, stderr) => { From c81cca57e50d0fab833ff8d5c170c179d50f9b8d Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 11 Sep 2023 09:37:39 +0700 Subject: [PATCH 002/298] change format file --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 549fcb0..2c5be22 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -104,7 +104,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); }); listLine.map((u) => { - if (listExcludeErr.filter((err) => u.includes(err)).length === 0) { + if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { detectedLines.push(data[u - 1]); } }); From 6d5fac300821f9f667568a668ad3fddcd04c1781 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 11 Sep 2023 09:45:30 +0700 Subject: [PATCH 003/298] change format file --- start/routes.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 2c5be22..fa7673c 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -92,7 +92,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { listKeyValues .map((obj) => obj.$original.value) .map(async (value) => { - if (line.search(value) !== -1) { + if (line.search(value) !== -1 && + listExcludeErr.filter((err) => line.includes(err)) + .length === 0) { data[index] = data[index].slice(0, data[index].search(value)) + "" + @@ -104,9 +106,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); }); listLine.map((u) => { - if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { + // if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { detectedLines.push(data[u - 1]); - } + // } }); // console.log(data) response.send( From 4ad84761ce15944bfc01f7dc58804669bb8459d4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 11 Sep 2023 09:52:01 +0700 Subject: [PATCH 004/298] change format file --- start/routes.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index fa7673c..36ccb63 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -106,9 +106,10 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); }); listLine.map((u) => { - // if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { + if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { + console.log(data[u - 1]) detectedLines.push(data[u - 1]); - // } + } }); // console.log(data) response.send( From 1257e2344eeb78355beaeed80e31a8664b17388f Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 11 Sep 2023 09:54:14 +0700 Subject: [PATCH 005/298] change format file --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 36ccb63..3385578 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -107,7 +107,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); listLine.map((u) => { if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { - console.log(data[u - 1]) + // console.log(data[u - 1]) detectedLines.push(data[u - 1]); } }); From 90028e1108f07fe55281ec29f95969cf4314e2ae Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 11:22:33 +0700 Subject: [PATCH 006/298] update format file log --- start/routes.ts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 3385578..0cdb476 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -60,7 +60,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { "select * from log_reports where id_file = " + fileDetect?.id_ldf ); - let detectedLines = []; + let modelSpecialDetected = []; + let issueSpecialDetected = []; let listLine = logsDetect[0] .map((obj) => obj.line) .filter((value, index, self) => { @@ -78,6 +79,11 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { i.$original.key === "CATCH_FAULTY" ); + let MODEL_SPECIAL = allValue.filter( + (i) => + i.$original.key === "MODEL_SPECIAL" + ); + let listExcludeErr = allValue .filter((i) => i.$original.key === "EXCLUDE_ERR") .map((obj) => obj.$original.value); @@ -105,10 +111,17 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); }); + listLine.map((u) => { if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { // console.log(data[u - 1]) - detectedLines.push(data[u - 1]); + if(MODEL_SPECIAL.filter((i)=>data[u - 1].includes(i)).length>0){ + modelSpecialDetected.push(data[u - 1]) + }else{ + issueSpecialDetected.push(data[u - 1]) + } + + } }); // console.log(data) @@ -139,9 +152,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133));\ border-image: initial;\ padding: 2px;'>" + - "Detected lines in file:\n" + - detectedLines.join("\n") + - "\n\n" + + ""+request.params().name+"\n\nDetected lines in file:\nExtra items:\n" + + modelSpecialDetected.join("\n") + + "\n\nExtra items:\n" + issueSpecialDetected.join("\n")+"\n\n"+ data.join("\n") + "\ \ From bf9b46ff9e8b40bc31d2cf49f0fb697e8a3da0e3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 13:06:03 +0700 Subject: [PATCH 007/298] update format file log --- start/routes.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 0cdb476..0613d63 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -114,7 +114,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { listLine.map((u) => { if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { - // console.log(data[u - 1]) + console.log(data[u - 1]) + console.log("length ", MODEL_SPECIAL.filter((i)=>data[u - 1].includes(i)).length) if(MODEL_SPECIAL.filter((i)=>data[u - 1].includes(i)).length>0){ modelSpecialDetected.push(data[u - 1]) }else{ @@ -124,7 +125,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); - // console.log(data) + console.log(modelSpecialDetected) + console.log(issueSpecialDetected) response.send( "\ \ From 756bdaf05a8c2227b92d23ba1e951d92c6951fdf Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 13:07:55 +0700 Subject: [PATCH 008/298] update format file log --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 0613d63..c28ff0c 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -82,7 +82,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { 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") From 7734b6ae037c1cf0e42f3fd9eb9afb3d841e6734 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 13:14:37 +0700 Subject: [PATCH 009/298] update format file log --- start/routes.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index c28ff0c..5ecb74b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -114,8 +114,6 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { listLine.map((u) => { if (listExcludeErr.filter((err) => data[u - 1].includes(err)).length === 0) { - console.log(data[u - 1]) - console.log("length ", MODEL_SPECIAL.filter((i)=>data[u - 1].includes(i)).length) if(MODEL_SPECIAL.filter((i)=>data[u - 1].includes(i)).length>0){ modelSpecialDetected.push(data[u - 1]) }else{ @@ -125,8 +123,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); - console.log(modelSpecialDetected) - console.log(issueSpecialDetected) + let modelSpecial = modelSpecialDetected.length>0?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n\n":"" + let issueItem = issueSpecialDetected.length>0?"\n\nIssue items:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; response.send( "\ \ @@ -153,10 +151,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { border-style: solid;\ border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133));\ border-image: initial;\ - padding: 2px;'>" + - ""+request.params().name+"\n\nDetected lines in file:\nExtra items:\n" + - modelSpecialDetected.join("\n") + - "\n\nExtra items:\n" + issueSpecialDetected.join("\n")+"\n\n"+ + padding: 2px;'>"+request.params().name+"" + modelSpecial + issueItem + + data.join("\n") + "\ \ From 6c9f4beb43fca580ecb59bea77b9e5a5f1b57817 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 13:15:26 +0700 Subject: [PATCH 010/298] update format file log --- start/routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 5ecb74b..0dbe636 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -123,8 +123,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); - let modelSpecial = modelSpecialDetected.length>0?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n\n":"" - let issueItem = issueSpecialDetected.length>0?"\n\nIssue items:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; + let modelSpecial = modelSpecialDetected.length>0?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n":"\n" + let issueItem = issueSpecialDetected.length>0?"\nIssue items:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; response.send( "\ \ From 82c0e811522d057856d0d0ecea272fe8ff64a764 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 13:17:22 +0700 Subject: [PATCH 011/298] update format file log --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 0dbe636..6a39f1d 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -124,7 +124,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); let modelSpecial = modelSpecialDetected.length>0?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n":"\n" - let issueItem = issueSpecialDetected.length>0?"\nIssue items:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; + let issueItem = issueSpecialDetected.length>0?"\nIssue found:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; response.send( "\ \ From 32cee3e3d1575429204c1a95c8ea5888b4d0fff7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 15:15:51 +0700 Subject: [PATCH 012/298] update routes --- start/routes.ts | 72 ++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 6a39f1d..612f378 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -52,6 +52,8 @@ Route.post("/api/account/checkLogin", "UsersController.checkLogin"); //Log Route.get("/api/log/showLog/:name?", async ({ request, response }) => { try { + // fghf + console.log(request.params().name) let fileDetect = await LogDetectFile.findBy( "file_name", request.params().name @@ -125,41 +127,43 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); let modelSpecial = modelSpecialDetected.length>0?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n":"\n" let issueItem = issueSpecialDetected.length>0?"\nIssue found:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; - response.send( - "\ - \ -
"+request.params().name+"" + modelSpecial + issueItem - + - data.join("\n") + - "
\ - \ - " - ); + // response.send( + // "\ + // \ + //
"+request.params().name+"" + modelSpecial + issueItem + // + + // data.join("\n") + + // "
\ + // \ + // " + // ); + + response.status(200).send({modelSpecial:modelSpecial, issueItem:issueItem, contentFile: data.join("\n")}) } catch (error) { - console.log(error); + console.error(error); response.send("

-------------- File not found --------------

"); } }); From c7512e2041f14fd37b50c4296e6982221536f87e Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 15:23:11 +0700 Subject: [PATCH 013/298] update routes --- start/routes.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 612f378..8b25ee1 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -93,9 +93,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { let data = content.data.split("\n"); data.map((line, index) => { data[index] = - "" + (index + 1) + - "" + + "|-|" + line; listKeyValues .map((obj) => obj.$original.value) @@ -105,9 +104,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { .length === 0) { data[index] = data[index].slice(0, data[index].search(value)) + - "" + value + - "" + + "|-|" + data[index].slice(data[index].search(value) + value.length); // } } From a51028f16b03387c155b2accc92646cc064aabd5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 15:38:15 +0700 Subject: [PATCH 014/298] update routes --- start/routes.ts | 57 +++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 8b25ee1..a921672 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -52,8 +52,8 @@ Route.post("/api/account/checkLogin", "UsersController.checkLogin"); //Log Route.get("/api/log/showLog/:name?", async ({ request, response }) => { try { - // fghf - console.log(request.params().name) + // fghf + console.log(request.params().name); let fileDetect = await LogDetectFile.findBy( "file_name", request.params().name @@ -81,10 +81,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { i.$original.key === "CATCH_FAULTY" ); - let MODEL_SPECIAL = allValue.filter( - (i) => - i.$original.key === "MODEL_SPECIAL" - ).map(obj => obj.$original.value); + 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") @@ -92,18 +91,16 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { let data = content.data.split("\n"); data.map((line, index) => { - data[index] = - (index + 1) + - "|-|" + - line; + 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) { + if ( + line.search(value) !== -1 && + listExcludeErr.filter((err) => line.includes(err)).length === 0 + ) { data[index] = - data[index].slice(0, data[index].search(value)) + + data[index].slice(0, data[index].search(value)) +"|-|" + value + "|-|" + data[index].slice(data[index].search(value) + value.length); @@ -111,20 +108,22 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); }); - + 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]) + 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?"\n\nExtra items:\n" + modelSpecialDetected.join("\n") + "\n":"\n" - let issueItem = issueSpecialDetected.length>0?"\nIssue found:\n" + issueSpecialDetected.join("\n")+"\n\n":"\n"; + let modelSpecial = + modelSpecialDetected.length > 0 ? modelSpecialDetected.join("\n") : ""; + let issueItem = + issueSpecialDetected.length > 0 ? issueSpecialDetected.join("\n") : ""; // response.send( // "\ // \ @@ -152,14 +151,20 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { // border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133));\ // border-image: initial;\ // padding: 2px;'>"+request.params().name+"" + modelSpecial + issueItem - // + + // + // data.join("\n") + // "\ // \ // " // ); - response.status(200).send({modelSpecial:modelSpecial, issueItem:issueItem, contentFile: data.join("\n")}) + response + .status(200) + .send({ + modelSpecial: modelSpecial, + issueItem: issueItem, + contentFile: data.join("\n"), + }); } catch (error) { console.error(error); response.send("

-------------- File not found --------------

"); From e62a4afe9a68d692297efdc34305a698ae390e86 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 16:13:46 +0700 Subject: [PATCH 015/298] add component ShowLog --- app/store/logs/20230912-fjghsk.log | 2 + ...7-test-code.log => 20230912-test-code.log} | 13 +- app/utils/runtimeCheckLogs.ts | 126 ++++++------------ manage-view/package-lock.json | 61 +++++++++ manage-view/package.json | 1 + manage-view/src/App.js | 20 ++- manage-view/src/api/apiLog.js | 7 +- .../src/components/ShowLog/ShowLog.css | 84 ++++++++++++ .../src/components/ShowLog/ShowLog.jsx | 87 ++++++++++++ manage-view/src/index.js | 9 +- 10 files changed, 316 insertions(+), 94 deletions(-) create mode 100644 app/store/logs/20230912-fjghsk.log rename app/store/logs/{20230907-test-code.log => 20230912-test-code.log} (79%) create mode 100644 manage-view/src/components/ShowLog/ShowLog.css create mode 100644 manage-view/src/components/ShowLog/ShowLog.jsx diff --git a/app/store/logs/20230912-fjghsk.log b/app/store/logs/20230912-fjghsk.log new file mode 100644 index 0000000..2c984d2 --- /dev/null +++ b/app/store/logs/20230912-fjghsk.log @@ -0,0 +1,2 @@ +sdfgsdfg +sdf \ No newline at end of file diff --git a/app/store/logs/20230907-test-code.log b/app/store/logs/20230912-test-code.log similarity index 79% rename from app/store/logs/20230907-test-code.log rename to app/store/logs/20230912-test-code.log index 5048521..8036394 100644 --- a/app/store/logs/20230907-test-code.log +++ b/app/store/logs/20230912-test-code.log @@ -23,4 +23,15 @@ 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 \ No newline at end of file +123 PVDM3- hui 800G2-POE-2 +dfgkfdjkhlfdhkhjjkhjgf +sdfsd DM3- hui 800G2-POE- +123 PVDM3- hui 800G2-POE-2 +800G2-POE-2 +anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl +800G2-POE-2 +anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl +800G2-POE-2 +anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl +800G2-POE-2 +800G2-POE-2 \ No newline at end of file diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index dbf64b6..4831f51 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -45,18 +45,18 @@ export async function runtimeCheckLogs(folderPath) { if ( //Sua \\ --> / filePath?.split(".")[filePath.split(".").length - 1] === "log" && - filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] === + filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === moment(Date.now()).format("YYYYMMDD").toString() ) { console.log("New file added: ", filePath); - await LogDetectFile.firstOrCreate( - { file_name: filePath.split("/")[filePath.split("/").length - 1] }, - { file_name: filePath.split("/")[filePath.split("/").length - 1] } - ); // 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] } // ); + await LogDetectFile.firstOrCreate( + { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }, + { file_name: filePath.split("\\")[filePath.split("\\").length - 1] } + ); fileList_old = fileList; updateFileList(); @@ -79,14 +79,27 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 300000 }, + { interval: 5000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; + let fileDetect = await LogDetectFile.findBy( + "file_name", + fileName + ); + + let logsDetect = await Database.rawQuery( + "select * from log_reports where id_file = " + + fileDetect?.id_ldf + ); + + let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); let content = await fs .readFileSync(filePath) .toString() - ?.split("\n"); + ?.split("\n") + .slice(); + let allValue = await KeyValue.all(); let listKeyValues = allValue.filter( (i) => @@ -122,6 +135,7 @@ export async function runtimeCheckLogs(folderPath) { "file_name", fileName ); + let checkLog = await Database.rawQuery( "select * from log_reports where id_file = " + log?.id_ldf + @@ -131,6 +145,7 @@ export async function runtimeCheckLogs(folderPath) { value + "'" ); + if (checkLog[0].length === 0) { await LogReport.create({ detected_content: value, @@ -162,69 +177,14 @@ export async function runtimeCheckLogs(folderPath) { fileDetect?.id_ldf ); - let listReport = await getListLineByItem(logsDetect[0]); + let listReport = await getListLineByItem(logsDetect[0].filter((l)=>l.line>lastLine)); let content = - "| |Last updated at | Item/error | Count | Report \n|---|:---:|:---|:---|:-----------:\n"; + "| |Last updated at | Item/error | Line | 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; + ? ":medal: **" + log.detected_content + "**" + : ":small_orange_diamond: " + log.detected_content; content = content + "|" + @@ -234,12 +194,10 @@ export async function runtimeCheckLogs(folderPath) { "**|" + item + "|" + - log.line.length + - // "|" + - // file[log.line - 1] + - "|[View](https://logs.danielvu.com/api/log/showLog/" + + log.line + + "|[View](https://logs.danielvu.com/logs/" + fileName + - ")\n"; + "#"+log.line+")\n"; }); // } // setTimeout(() => { @@ -255,17 +213,17 @@ export async function runtimeCheckLogs(folderPath) { spoiler ); - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - ":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); diff --git a/manage-view/package-lock.json b/manage-view/package-lock.json index dff140d..6ad2458 100644 --- a/manage-view/package-lock.json +++ b/manage-view/package-lock.json @@ -14,6 +14,7 @@ "axios": "^1.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.15.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" } @@ -3237,6 +3238,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": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -14672,6 +14681,36 @@ "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": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -19842,6 +19881,11 @@ "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": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -28006,6 +28050,23 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "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": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", diff --git a/manage-view/package.json b/manage-view/package.json index 0dd000e..a0ed4da 100644 --- a/manage-view/package.json +++ b/manage-view/package.json @@ -9,6 +9,7 @@ "axios": "^1.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.15.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, diff --git a/manage-view/src/App.js b/manage-view/src/App.js index 24bb05a..21195a5 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -2,13 +2,25 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; import { getKeyValues } from "./api/apiLog"; import ManageValues from "./pages/ManageValues"; - +import { + Routes, + Route, + Switch, + useParams, +} from "react-router-dom"; +import ShowLog from "./components/ShowLog/ShowLog"; function App() { - - return (
- + + {/* Define routes */} + }> + {/* Render the UserProfile component */} + + }> + + +
); } diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index fa3f208..056aefa 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,5 +1,6 @@ -// const API = "https://logs.danielvu.com/api"; -const API = "http://localhost:3333/api"; +const API = "https://logs.danielvu.com/api"; +// const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; -export const addKeyValue = API + "/addValue"; \ No newline at end of file +export const addKeyValue = API + "/addValue"; +export const getLog = API + "/log/showLog"; \ No newline at end of file diff --git a/manage-view/src/components/ShowLog/ShowLog.css b/manage-view/src/components/ShowLog/ShowLog.css new file mode 100644 index 0000000..eaccbf4 --- /dev/null +++ b/manage-view/src/components/ShowLog/ShowLog.css @@ -0,0 +1,84 @@ +.main{ + display: flex; + height: 100vh; + flex-flow: column; + +} + +.detectedDiv{ + height: 40%; + 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; +} + +.logContent{ + scroll-behavior: smooth; + 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: 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; +} + +.itemDetected{ + background-color: rgb(240, 155, 155); + cursor: pointer; +} + +.itemDetected:hover{ + background-color: rgba(240, 155, 155, 0.583);; +} +.lineNumberLog{ + background-color: yellow; +} \ No newline at end of file diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx new file mode 100644 index 0000000..6e26b92 --- /dev/null +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -0,0 +1,87 @@ +import axios from "axios"; +import React, { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import { getLog } from "../../api/apiLog"; +import "./ShowLog.css"; +const ShowLog = () => { + let { name } = useParams(); + const [log, setLog] = useState({}); + const [content, setContent] = useState(""); + const getContentLog = async () => { + try { + let tempContent = ""; + const res = await axios.get(getLog + "/" + name); + setLog(res.data); + } catch (error) { + console.log(error); + } + }; + useEffect(() => { + getContentLog(); + }, []); + return ( +
+
+

+ {name} +

+

Extra items:

+ {log?.modelSpecial?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + + {line.split("|-|")[2]} + + + {line.split("|-|")[3]} +

+
+ ))} +

Issue found:

+ {log?.issueItem?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + + {line.split("|-|")[2]}{" "} + + + {line.split("|-|")[3]} +

+
+ ))} +
+
+ {log?.contentFile?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + {line.split("|-|")[2]} + + {line.split("|-|")[3]} +

+
+ ))} +
+
+ ); +}; + +export default ShowLog; diff --git a/manage-view/src/index.js b/manage-view/src/index.js index d563c0f..4bb46da 100644 --- a/manage-view/src/index.js +++ b/manage-view/src/index.js @@ -3,12 +3,17 @@ import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import { BrowserRouter, Route, Routes } from "react-router-dom"; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - + + + } /> + + + ); // If you want to start measuring performance in your app, pass a function From b5d1d37d5e06d4419098ab96310bb08d43a76c75 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 16:19:00 +0700 Subject: [PATCH 016/298] add component ShowLog --- manage-view/src/components/ShowLog/ShowLog.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 6e26b92..1a0dcf1 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -12,6 +12,7 @@ const ShowLog = () => { let tempContent = ""; const res = await axios.get(getLog + "/" + name); setLog(res.data); + console.log(res.data) } catch (error) { console.log(error); } From 44647476f15fa03f4d5e81caf2e18fc85e7f3e7e Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 16:29:56 +0700 Subject: [PATCH 017/298] add component ShowLog --- manage-view/src/App.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/manage-view/src/App.js b/manage-view/src/App.js index 21195a5..df3d98b 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -17,7 +17,10 @@ function App() { }> {/* Render the UserProfile component */} - }> + +

abshjvsakjgvhaskj

+ }>
From e20aaec37251fa6d9749332101f0c410f65c4c38 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 16:31:47 +0700 Subject: [PATCH 018/298] add component ShowLog --- manage-view/src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage-view/src/App.js b/manage-view/src/App.js index df3d98b..28d4025 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -17,7 +17,7 @@ function App() { }> {/* Render the UserProfile component */} -

abshjvsakjgvhaskj

}> From 3d3e3862be1fde3590958b6fdf78a753049b9f9a Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 12 Sep 2023 16:57:58 +0700 Subject: [PATCH 019/298] add component ShowLog --- app/utils/runtimeCheckLogs.ts | 2 +- manage-view/src/App.js | 5 +---- manage-view/src/pages/ManageValues.jsx | 1 + 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 4831f51..a94cf04 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -79,7 +79,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 5000 }, + { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; diff --git a/manage-view/src/App.js b/manage-view/src/App.js index 28d4025..21195a5 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -17,10 +17,7 @@ function App() { }> {/* Render the UserProfile component */} - -

abshjvsakjgvhaskj

- }> + }> diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index f60ecde..2976f53 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -1,6 +1,7 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; import { addKeyValue, deleteValue, getKeyValues } from "../api/apiLog"; +import { Link } from "react-router-dom"; const ManageValues = () => { const [keyValue, setKeyValue] = useState([]); const [key, setKey] = useState([]); From 68123de87d21d83268a931b744d77c4dbe9aee55 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 07:26:45 +0700 Subject: [PATCH 020/298] add component ShowLog --- app/utils/runtimeCheckLogs.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index a94cf04..7169b1c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -213,17 +213,17 @@ export async function runtimeCheckLogs(folderPath) { spoiler ); - // sendMessToZulip( - // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", - // ":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); From 431745d22ea671a69f14c7928b0d44133f22269c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 08:14:48 +0700 Subject: [PATCH 021/298] update component ShowLog --- manage-view/src/components/ShowLog/ShowLog.jsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 1a0dcf1..7b9d891 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -1,6 +1,6 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; -import { useParams } from "react-router-dom"; +import { Navigate, useParams } from "react-router-dom"; import { getLog } from "../../api/apiLog"; import "./ShowLog.css"; const ShowLog = () => { @@ -12,14 +12,27 @@ const ShowLog = () => { let tempContent = ""; const res = await axios.get(getLog + "/" + name); setLog(res.data); - console.log(res.data) } catch (error) { console.log(error); } }; + + const scrollToElement = () => { + const hash = window.location.hash; + if (hash) { + const targetElement = document.getElementById(hash.slice(1)); // Replace "3" with the desired id + if (targetElement) { + targetElement.scrollIntoView({ behavior: "smooth" }); + } + } + }; useEffect(() => { getContentLog(); + setTimeout(() => { + scrollToElement() + }, 1000); }, []); + console.log(window.location.hash); return (
From 91761d30bce021efcb105069279afb3dc59938de Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 08:16:03 +0700 Subject: [PATCH 022/298] update component ShowLog --- manage-view/src/components/ShowLog/ShowLog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 7b9d891..f41a739 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -32,7 +32,7 @@ const ShowLog = () => { scrollToElement() }, 1000); }, []); - console.log(window.location.hash); + // console.log(window.location.hash); return (
From 421d35d1d1b0149d38c2ab75b4a1580f4a304b1f Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 08:19:34 +0700 Subject: [PATCH 023/298] update component ShowLog --- app/utils/runtimeCheckLogs.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7169b1c..15238b4 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -45,18 +45,18 @@ export async function runtimeCheckLogs(folderPath) { if ( //Sua \\ --> / filePath?.split(".")[filePath.split(".").length - 1] === "log" && - filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === + filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] === moment(Date.now()).format("YYYYMMDD").toString() ) { console.log("New file added: ", filePath); - // await LogDetectFile.firstOrCreate( - // { file_name: filePath.split("/")[filePath.split("/").length - 1] }, - // { file_name: filePath.split("/")[filePath.split("/").length - 1] } - // ); 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] } ); + // await LogDetectFile.firstOrCreate( + // { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }, + // { file_name: filePath.split("\\")[filePath.split("\\").length - 1] } + // ); fileList_old = fileList; updateFileList(); From 1db6f7688c21040b6d598d87424255b54579f6d5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 14:09:30 +0700 Subject: [PATCH 024/298] update routes.ts --- manage-view/src/App.js | 21 ++- manage-view/src/api/apiLog.js | 4 +- .../src/components/ListLog/ListLog.jsx | 9 ++ .../src/components/ShowLog/ShowLog.css | 29 ++-- .../src/components/ShowLog/ShowLog.jsx | 131 ++++++++++-------- manage-view/src/pages/ManageValues.jsx | 3 + start/routes.ts | 38 +---- 7 files changed, 111 insertions(+), 124 deletions(-) create mode 100644 manage-view/src/components/ListLog/ListLog.jsx diff --git a/manage-view/src/App.js b/manage-view/src/App.js index 21195a5..d1c8e7d 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -2,24 +2,19 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; import { getKeyValues } from "./api/apiLog"; import ManageValues from "./pages/ManageValues"; -import { - Routes, - Route, - Switch, - useParams, -} from "react-router-dom"; +import { Routes, Route, Switch, useParams } from "react-router-dom"; import ShowLog from "./components/ShowLog/ShowLog"; +import ListLog from "./components/ListLog/ListLog"; function App() { return (
- {/* Define routes */} - }> - {/* Render the UserProfile component */} - - }> - - + {/* Define routes */} + }> + {/* Render the UserProfile component */} + + }> + }>
); diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index 056aefa..a1e5d59 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,5 +1,5 @@ -const API = "https://logs.danielvu.com/api"; -// const API = "http://localhost:3333/api"; +// const API = "https://logs.danielvu.com/api"; +const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; export const addKeyValue = API + "/addValue"; diff --git a/manage-view/src/components/ListLog/ListLog.jsx b/manage-view/src/components/ListLog/ListLog.jsx new file mode 100644 index 0000000..a0c9c0e --- /dev/null +++ b/manage-view/src/components/ListLog/ListLog.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const ListLog = () => { + return ( +
ListLog
+ ) +} + +export default ListLog \ No newline at end of file diff --git a/manage-view/src/components/ShowLog/ShowLog.css b/manage-view/src/components/ShowLog/ShowLog.css index eaccbf4..f0c662b 100644 --- a/manage-view/src/components/ShowLog/ShowLog.css +++ b/manage-view/src/components/ShowLog/ShowLog.css @@ -7,7 +7,9 @@ .detectedDiv{ height: 40%; + padding: 5px; word-wrap:break-word; + border: solid gray 5px; white-space:pre; overflow: auto; font-family: monospace; @@ -23,22 +25,23 @@ text-align: start; appearance: auto; -webkit-rtl-ordering: logical; - resize: auto; + resize: vertical; cursor: text; background-color: field; column-count: initial !important; writing-mode: horizontal-tb !important; - box-sizing: border-box; + /* 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; + /* 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; @@ -57,18 +60,18 @@ text-align: start; appearance: auto; -webkit-rtl-ordering: logical; - resize: auto; + 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: 2px; + /* 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{ diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index f41a739..58d0191 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -6,12 +6,12 @@ import "./ShowLog.css"; const ShowLog = () => { let { name } = useParams(); const [log, setLog] = useState({}); - const [content, setContent] = useState(""); + const [status, setStatus] = useState(); const getContentLog = async () => { try { - let tempContent = ""; const res = await axios.get(getLog + "/" + name); setLog(res.data); + setStatus(res.status) } catch (error) { console.log(error); } @@ -33,69 +33,78 @@ const ShowLog = () => { }, 1000); }, []); // console.log(window.location.hash); - return ( -
-
-

- {name} -

-

Extra items:

- {log?.modelSpecial?.split("\n")?.map((line) => ( - - {line.split("|-|")[0]} - {line.split("|-|")[1]} - - - {line.split("|-|")[2]} - + if(status === 200){ + return ( +
+
+

+ {name} +

+

Extra items:

+ {log?.modelSpecial?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + + {line.split("|-|")[2]} + + + {line.split("|-|")[3]} +

- {line.split("|-|")[3]} -

- - ))} -

Issue found:

- {log?.issueItem?.split("\n")?.map((line) => ( - - {line.split("|-|")[0]} - {line.split("|-|")[1]} - - - {line.split("|-|")[2]}{" "} - + ))} +

Issue found:

+ {log?.issueItem?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + + {line.split("|-|")[2]} + + + {line.split("|-|")[3]} +

- {line.split("|-|")[3]} -

-
- ))} + ))} +
+
+ {log?.contentFile?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + {line.split("|-|")[2]} + + {line.split("|-|")[3]} +

+
+ ))} +
-
- {log?.contentFile?.split("\n")?.map((line) => ( - - {line.split("|-|")[0]} - {line.split("|-|")[1]} - - {line.split("|-|")[2]} - - {line.split("|-|")[3]} -

-
- ))} + ); + }else{ + return( +
+

The file was not found or no errors were found in the file.

-
- ); + ) + } + }; export default ShowLog; diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 2976f53..643a873 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -100,6 +100,9 @@ const ManageValues = () => { } }}>Add
+
+ +
); }; diff --git a/start/routes.ts b/start/routes.ts index a921672..e3cf794 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -124,40 +124,6 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { modelSpecialDetected.length > 0 ? modelSpecialDetected.join("\n") : ""; let issueItem = issueSpecialDetected.length > 0 ? issueSpecialDetected.join("\n") : ""; - // response.send( - // "\ - // \ - //
"+request.params().name+"" + modelSpecial + issueItem - // + - // data.join("\n") + - // "
\ - // \ - // " - // ); - response .status(200) .send({ @@ -167,7 +133,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { }); } catch (error) { console.error(error); - response.send("

-------------- File not found --------------

"); + response + .status(203) + .send("FILE NOT FOUND"); } }); From 7bcef420aba0c1ec77479fe2858ac27f2b633f76 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 14:11:15 +0700 Subject: [PATCH 025/298] update routes.ts --- manage-view/src/api/apiLog.js | 4 ++-- start/routes.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index a1e5d59..056aefa 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,5 +1,5 @@ -// const API = "https://logs.danielvu.com/api"; -const API = "http://localhost:3333/api"; +const API = "https://logs.danielvu.com/api"; +// const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; export const addKeyValue = API + "/addValue"; diff --git a/start/routes.ts b/start/routes.ts index e3cf794..bba7a7b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -132,7 +132,7 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { contentFile: data.join("\n"), }); } catch (error) { - console.error(error); + // console.error(error); response .status(203) .send("FILE NOT FOUND"); From 47bd1875f457cbba56933e6f4ee954cea2909d29 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 14:22:55 +0700 Subject: [PATCH 026/298] update routes.ts --- manage-view/src/api/apiLog.js | 3 +- .../src/components/ListLog/ListLog.jsx | 41 ++++++++++++++++--- start/routes.ts | 15 +++++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index 056aefa..b6c4df7 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -3,4 +3,5 @@ const API = "https://logs.danielvu.com/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; export const addKeyValue = API + "/addValue"; -export const getLog = API + "/log/showLog"; \ No newline at end of file +export const getLog = API + "/log/showLog"; +export const getListLog = API + "/getAllLogDetect"; \ No newline at end of file diff --git a/manage-view/src/components/ListLog/ListLog.jsx b/manage-view/src/components/ListLog/ListLog.jsx index a0c9c0e..34ec15f 100644 --- a/manage-view/src/components/ListLog/ListLog.jsx +++ b/manage-view/src/components/ListLog/ListLog.jsx @@ -1,9 +1,38 @@ -import React from 'react' +import axios from "axios"; +import React, { useEffect, useState } from "react"; +import { Navigate, useParams } from "react-router-dom"; +import { getListLog } from "../../api/apiLog"; const ListLog = () => { - return ( -
ListLog
- ) -} + const [listFile, setListFile] = useState({}); + const [status, setStatus] = useState(); + const getListFile = async () => { + try { + const res = await axios.get(getListLog); + setListFile(res.data); + setStatus(res.status); + } catch (error) { + console.log(error); + } + }; -export default ListLog \ No newline at end of file + if (status === 200) { + return ( +
+ {listFile?.map((file) => { + {file}; + })} +
+ ); + } else { + return ( +
+

+ No files +

+
+ ); + } +}; + +export default ListLog; diff --git a/start/routes.ts b/start/routes.ts index bba7a7b..b9c90b5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -139,6 +139,21 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { } }); +Route.get("/api/getAllLogDetect", async ({ request, response }) => { + try { + // fghf + console.log(request.params().name); + 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"); + } +}); //Key-Value Route.post("/api/getKeyValue", async ({ request, response }) => { From eaa86820cb0017bb355ea3a868863f917a40d538 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:14:03 +0700 Subject: [PATCH 027/298] update routes.ts --- .../src/components/ListLog/ListLog.css | 46 +++++ .../src/components/ListLog/ListLog.jsx | 39 +++- .../src/components/ShowLog/ShowLog.css | 173 ++++++++++-------- .../src/components/ShowLog/ShowLog.jsx | 63 +++++-- manage-view/src/pages/ManageValues.jsx | 2 +- start/routes.ts | 2 - 6 files changed, 222 insertions(+), 103 deletions(-) create mode 100644 manage-view/src/components/ListLog/ListLog.css diff --git a/manage-view/src/components/ListLog/ListLog.css b/manage-view/src/components/ListLog/ListLog.css new file mode 100644 index 0000000..f9071f2 --- /dev/null +++ b/manage-view/src/components/ListLog/ListLog.css @@ -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%; +} \ No newline at end of file diff --git a/manage-view/src/components/ListLog/ListLog.jsx b/manage-view/src/components/ListLog/ListLog.jsx index 34ec15f..914df9f 100644 --- a/manage-view/src/components/ListLog/ListLog.jsx +++ b/manage-view/src/components/ListLog/ListLog.jsx @@ -1,11 +1,12 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; -import { Navigate, useParams } from "react-router-dom"; +import { Link, Navigate, useParams } from "react-router-dom"; import { getListLog } from "../../api/apiLog"; - +import "./ListLog.css"; const ListLog = () => { - const [listFile, setListFile] = useState({}); + const [listFile, setListFile] = useState([]); const [status, setStatus] = useState(); + const [nameSearch, setNameSearch] = useState(""); const getListFile = async () => { try { const res = await axios.get(getListLog); @@ -16,12 +17,36 @@ const ListLog = () => { } }; + useEffect(() => { + getListFile(); + }, []); + if (status === 200) { return ( -
- {listFile?.map((file) => { - {file}; - })} +
+
+ + + + { + setNameSearch(e.target.value) + }}> +
+ {listFile?.filter((f)=>f.search(nameSearch)!==-1).map((file) => ( +
+ {file} +

+
+ ))}
); } else { diff --git a/manage-view/src/components/ShowLog/ShowLog.css b/manage-view/src/components/ShowLog/ShowLog.css index f0c662b..915d515 100644 --- a/manage-view/src/components/ShowLog/ShowLog.css +++ b/manage-view/src/components/ShowLog/ShowLog.css @@ -1,87 +1,106 @@ -.main{ - display: flex; - height: 100vh; - flex-flow: column; - +.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; +.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; +.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 { + background-color: rgb(240, 155, 155); + cursor: pointer; } -.itemDetected:hover{ - background-color: rgba(240, 155, 155, 0.583);; +.itemDetected:hover { + background-color: rgba(240, 155, 155, 0.583); } -.lineNumberLog{ - background-color: yellow; +.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; } \ No newline at end of file diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 58d0191..37f7ad5 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -1,6 +1,6 @@ import axios from "axios"; import React, { useEffect, useState } from "react"; -import { Navigate, useParams } from "react-router-dom"; +import { Link, Navigate, useParams } from "react-router-dom"; import { getLog } from "../../api/apiLog"; import "./ShowLog.css"; const ShowLog = () => { @@ -11,7 +11,7 @@ const ShowLog = () => { try { const res = await axios.get(getLog + "/" + name); setLog(res.data); - setStatus(res.status) + setStatus(res.status); } catch (error) { console.log(error); } @@ -29,25 +29,53 @@ const ShowLog = () => { useEffect(() => { getContentLog(); setTimeout(() => { - scrollToElement() + scrollToElement(); }, 1000); }, []); // console.log(window.location.hash); - if(status === 200){ + if (status === 200) { return (
+
+ + + + + {" "} + + + {name} +

- {name} + No errors were found in the file +

+

+ Extra items:

-

Extra items:

{log?.modelSpecial?.split("\n")?.map((line) => ( {line.split("|-|")[0]} @@ -64,7 +92,9 @@ const ShowLog = () => {

))} -

Issue found:

+

+ Issue found: +

{log?.issueItem?.split("\n")?.map((line) => ( {line.split("|-|")[0]} @@ -97,14 +127,15 @@ const ShowLog = () => {
); - }else{ - return( + } else { + return (
-

The file was not found or no errors were found in the file.

+

+ The file was not found or no errors were found in the file. +

- ) + ); } - }; export default ShowLog; diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 643a873..4edb9be 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -101,7 +101,7 @@ const ManageValues = () => { }}>Add
- +
); diff --git a/start/routes.ts b/start/routes.ts index b9c90b5..45ab3df 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -141,8 +141,6 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { Route.get("/api/getAllLogDetect", async ({ request, response }) => { try { - // fghf - console.log(request.params().name); let fileDetect = await LogDetectFile.all() let listFiles = fileDetect.map(obj=>obj.file_name) response From 527ac8ac54c5bf9ac090b3176c4ec9a0211a1677 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:30:35 +0700 Subject: [PATCH 028/298] update routes.ts --- manage-view/src/components/ListLog/ListLog.jsx | 4 ++-- manage-view/src/components/ShowLog/ShowLog.jsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manage-view/src/components/ListLog/ListLog.jsx b/manage-view/src/components/ListLog/ListLog.jsx index 914df9f..27f6582 100644 --- a/manage-view/src/components/ListLog/ListLog.jsx +++ b/manage-view/src/components/ListLog/ListLog.jsx @@ -5,7 +5,7 @@ import { getListLog } from "../../api/apiLog"; import "./ListLog.css"; const ListLog = () => { const [listFile, setListFile] = useState([]); - const [status, setStatus] = useState(); + const [status, setStatus] = useState(200); const [nameSearch, setNameSearch] = useState(""); const getListFile = async () => { try { @@ -41,7 +41,7 @@ const ListLog = () => { setNameSearch(e.target.value) }}>
- {listFile?.filter((f)=>f.search(nameSearch)!==-1).map((file) => ( + {listFile?.filter((f)=>f.toLocaleLowerCase().search(nameSearch.toLocaleLowerCase())!==-1).map((file) => (
{file}

diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 37f7ad5..6bef7f7 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -6,7 +6,7 @@ import "./ShowLog.css"; const ShowLog = () => { let { name } = useParams(); const [log, setLog] = useState({}); - const [status, setStatus] = useState(); + const [status, setStatus] = useState(200); const getContentLog = async () => { try { const res = await axios.get(getLog + "/" + name); @@ -131,7 +131,7 @@ const ShowLog = () => { return (

- The file was not found or no errors were found in the file. + The file was not found.

); From 377f8c1020b2925092ec93ba0e07846bec7fb2be Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:49:23 +0700 Subject: [PATCH 029/298] update routes.ts --- start/routes.ts | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 45ab3df..a9e013a 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -192,20 +192,17 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { // 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; - // } + exec( + Env.get("URL_FILE_SHELL"), + (error, stdout, stderr) => { + if (error) { + console.error(`Error executing command: ${error}`); + return; + } - // console.log(`Command output:\n${stdout}`); - // } - // ); + console.log(`Command output:\n${stdout}`); + } + ); }); From 83f1188cb882c1697cddb50931bee5d5f1caee04 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:51:33 +0700 Subject: [PATCH 030/298] update routes.ts --- manage-view/src/pages/ManageValues.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 4edb9be..e3d18cb 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -15,6 +15,7 @@ const ManageValues = () => { console.log(error); } }; + useEffect(() => { getValues(); }, []); From 706edd21d510f4a623d4e995fc6b1a31fd2bf8c4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:52:40 +0700 Subject: [PATCH 031/298] update routes.ts --- app/utils/runtimeCheckLogs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 15238b4..d5ae324 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -69,7 +69,6 @@ export async function runtimeCheckLogs(folderPath) { async function watchFilesInList() { // console.log("--------->", fileList); //get date now - //check new file await fileList From f4a2598c898dbcbbfc4b0b231c826a8a7dad85b4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 15:54:01 +0700 Subject: [PATCH 032/298] update routes.ts --- app/utils/runtimeCheckLogs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index d5ae324..9f4ec20 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -70,7 +70,6 @@ export async function runtimeCheckLogs(folderPath) { // console.log("--------->", fileList); //get date now //check new file - await fileList ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { From 025e9aa5df39c46b4a63f45177885d2400d96141 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 13 Sep 2023 16:17:14 +0700 Subject: [PATCH 033/298] update routes.ts --- start/routes.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index a9e013a..8aeb852 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -31,11 +31,6 @@ 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", From ad3f9a4e46d328ae3dd38f6d4c64d86c96f66a35 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 10:09:33 +0700 Subject: [PATCH 034/298] update image for message zulip --- app/public/uploads/a.html | 1 + app/utils/runtimeCheckLogs.ts | 26 +- app/utils/screenShot.ts | 21 + app/utils/screenshot.png | Bin 0 -> 109173 bytes app/utils/uploadFileZulip.ts | 44 + app/utils/zuliprc | 4 + download | 4 + manage-view/src/App.js | 2 + .../src/components/ScreenShot/ScreenShot.css | 33 + .../src/components/ScreenShot/ScreenShot.jsx | 99 + .../src/components/ShowLog/ShowLog.jsx | 4 +- package-lock.json | 1643 ++++++++++++++++- package.json | 3 + providers/AppProvider.ts | 1 + screenshot.js | 146 ++ start/kernel.ts | 3 +- start/routes.ts | 14 + uploads/abc.txt | 3 + 18 files changed, 2029 insertions(+), 22 deletions(-) create mode 100644 app/public/uploads/a.html create mode 100644 app/utils/screenShot.ts create mode 100644 app/utils/screenshot.png create mode 100644 app/utils/uploadFileZulip.ts create mode 100644 app/utils/zuliprc create mode 100644 download create mode 100644 manage-view/src/components/ScreenShot/ScreenShot.css create mode 100644 manage-view/src/components/ScreenShot/ScreenShot.jsx create mode 100644 screenshot.js create mode 100644 uploads/abc.txt diff --git a/app/public/uploads/a.html b/app/public/uploads/a.html new file mode 100644 index 0000000..c312dd8 --- /dev/null +++ b/app/public/uploads/a.html @@ -0,0 +1 @@ +

fjshdkf

\ No newline at end of file diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 9f4ec20..04d666e 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -7,6 +7,8 @@ import KeyValue from "App/Models/KeyValue"; import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; +import { screenShot } from "./screenShot"; +import { uploadFileToZulip } from "./uploadFileZulip"; // export default class loggerAPI { export async function runtimeCheckLogs(folderPath) { @@ -175,7 +177,11 @@ export async function runtimeCheckLogs(folderPath) { fileDetect?.id_ldf ); - let listReport = await getListLineByItem(logsDetect[0].filter((l)=>l.line>lastLine)); + await screenShot(fileName); + const uriImage = await uploadFileToZulip(); + let listReport = await getListLineByItem( + logsDetect[0].filter((l) => l.line > lastLine) + ); let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; @@ -195,7 +201,9 @@ export async function runtimeCheckLogs(folderPath) { log.line + "|[View](https://logs.danielvu.com/logs/" + fileName + - "#"+log.line+")\n"; + "#" + + log.line + + ")\n"; }); // } // setTimeout(() => { @@ -203,24 +211,30 @@ export async function runtimeCheckLogs(folderPath) { "stream", "Result test - auto.nswteam.net", "Log Alert", - ":warning: :warning: **" + + "------------\n\n:warning: :warning: **" + fileName + "**\n\n" + content + "\n\n" + - spoiler + spoiler + + "\n\n[image](" + + uriImage + + ")\n" ); sendMessToZulip( "stream", "AUS_VN_Test", "Test Log Alerts", - ":warning: :warning: **" + + "------------\n\n:warning: :warning: **" + fileName + "**\n\n" + content + "\n\n" + - spoiler + spoiler + + "\n\n[image](" + + uriImage + + ")\n" ); // }, 3000); } diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts new file mode 100644 index 0000000..fa4be5c --- /dev/null +++ b/app/utils/screenShot.ts @@ -0,0 +1,21 @@ +import puppeteer from 'puppeteer'; + +export const screenShot = async (filename) => { + const browser = await puppeteer.launch(); + + 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: 500 }); + setTimeout(async () => { + await page.screenshot({ path: "app/utils/screenshot.png" }); + browser.close(); + }, 5000); + } catch (error) { + console.log(error); + } +}; diff --git a/app/utils/screenshot.png b/app/utils/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a715f7b4aaceb8d1d3db3b4bce7714d4f4d74f75 GIT binary patch literal 109173 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,cv~rFUVV!&9+O<2_n?q75R9~Hdwi|N;IUl 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

|z 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 literal 0 HcmV?d00001 diff --git a/app/utils/uploadFileZulip.ts b/app/utils/uploadFileZulip.ts new file mode 100644 index 0000000..7e36f0d --- /dev/null +++ b/app/utils/uploadFileZulip.ts @@ -0,0 +1,44 @@ +import { FormData } from "zulip-js/lib/helper"; +import axios from "axios"; +import fs from "fs"; + +export const uploadFileToZulip = async () => { + // 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("app/utils/screenshot.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.error("Error uploading file:", error.message); + } +}; diff --git a/app/utils/zuliprc b/app/utils/zuliprc new file mode 100644 index 0000000..382d7b7 --- /dev/null +++ b/app/utils/zuliprc @@ -0,0 +1,4 @@ +[api] +email=networktool-bot@zulip.ipsupply.com.au +key=0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM +site=https://zulip.ipsupply.com.au diff --git a/download b/download new file mode 100644 index 0000000..e7eea02 --- /dev/null +++ b/download @@ -0,0 +1,4 @@ +[api] +email=joseph.le@apactech.io +key=7XGrpwzFtQyUVDQzdwL3hjdVSbLx55yt +site=https://zulip.ipsupply.com.au diff --git a/manage-view/src/App.js b/manage-view/src/App.js index d1c8e7d..8aa3945 100644 --- a/manage-view/src/App.js +++ b/manage-view/src/App.js @@ -5,6 +5,7 @@ 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() { return (

); diff --git a/manage-view/src/components/ScreenShot/ScreenShot.css b/manage-view/src/components/ScreenShot/ScreenShot.css new file mode 100644 index 0000000..8933a0f --- /dev/null +++ b/manage-view/src/components/ScreenShot/ScreenShot.css @@ -0,0 +1,33 @@ +#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; + } \ No newline at end of file diff --git a/manage-view/src/components/ScreenShot/ScreenShot.jsx b/manage-view/src/components/ScreenShot/ScreenShot.jsx new file mode 100644 index 0000000..bf89a87 --- /dev/null +++ b/manage-view/src/components/ScreenShot/ScreenShot.jsx @@ -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 ( +
+
+

+ No errors were found in the file +

+

+ Extra items: +

+ {log?.modelSpecial?.split("\n")?.map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + +
+ {line.split("|-|")[2]} + + + {line.split("|-|")[3]} +

+ + ))} +

+ Issue found: +

+ {log?.issueItem?.split("\n")?.reverse().map((line) => ( + + {line.split("|-|")[0]} + {line.split("|-|")[1]} + + + {line.split("|-|")[2]} + + + {line.split("|-|")[3]} +

+
+ ))} +
+
+ ); + } else { + return ( +
+

+ The file was not found. +

+
+ ); + } +}; + +export default ScreenShot; diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 6bef7f7..49288fa 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -76,7 +76,7 @@ const ShowLog = () => {

Extra items:

- {log?.modelSpecial?.split("\n")?.map((line) => ( + {log?.modelSpecial?.split("\n")?.reverse().map((line) => ( {line.split("|-|")[0]} {line.split("|-|")[1]} @@ -95,7 +95,7 @@ const ShowLog = () => {

Issue found:

- {log?.issueItem?.split("\n")?.map((line) => ( + {log?.issueItem?.split("\n")?.reverse().map((line) => ( {line.split("|-|")[0]} {line.split("|-|")[1]} diff --git a/package-lock.json b/package-lock.json index 5649f8b..95965d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,11 +18,14 @@ "child_process": "^1.0.2", "chokidar": "^3.5.3", "fs": "^0.0.1-security", + "helpers": "^0.0.6", "jsonwebtoken": "^9.0.1", "luxon": "^3.4.0", "moment": "^2.29.4", "mysql2": "^3.6.0", + "path": "^0.12.7", "proxy-addr": "^2.0.7", + "puppeteer": "^21.2.1", "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.21", "zulip-js": "^2.0.9" @@ -667,6 +670,156 @@ "node": ">=4" } }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/runtime": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", @@ -1154,6 +1307,26 @@ "truncatise": "0.0.8" } }, + "node_modules/@puppeteer/browsers": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.1.tgz", + "integrity": "sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1165,6 +1338,11 @@ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, "node_modules/@types/bytes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", @@ -1329,6 +1507,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1435,6 +1622,17 @@ "integrity": "sha512-cQH/NP250gOF9k3TTDhVsTOPSAvyH4MhKVZ4ryYiihA+vnP27sut1gVIrRas3Evl5d2wEgWVGI5DgdP/ZFSk0w==", "dev": true }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1752,6 +1950,17 @@ "node": ">=0.10.0" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1812,6 +2021,11 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1932,6 +2146,14 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1998,6 +2220,14 @@ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -2081,7 +2311,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -2227,6 +2456,17 @@ "node": ">= 6" } }, + "node_modules/chromium-bidi": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.26.tgz", + "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", + "dependencies": { + "mitt": "3.0.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2370,6 +2610,35 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -2618,6 +2887,14 @@ "node": ">=8" } }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2767,6 +3044,19 @@ "node": ">=0.10.0" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2809,6 +3099,11 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1159816", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", + "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==" + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -3030,6 +3325,14 @@ "node": ">=8.6" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-module-lexer": { "version": "0.3.26", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", @@ -3060,11 +3363,30 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -3077,7 +3399,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3086,11 +3407,18 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3350,6 +3678,39 @@ "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-copy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", @@ -3360,6 +3721,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -3427,6 +3793,14 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-type": { "version": "16.5.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", @@ -3640,6 +4014,14 @@ "is-property": "^1.0.2" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -3705,6 +4087,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -4014,6 +4447,11 @@ "node": ">= 6" } }, + "node_modules/helpers": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/helpers/-/helpers-0.0.6.tgz", + "integrity": "sha512-oi7CoWXnvnqmdiofPw5XG9ePBKr0w9TqBkS97a2/yvfRLInWb250XbKqvGJ5rQchn2fielYGY9cMAXGweWjCxg==" + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4038,6 +4476,30 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -4094,6 +4556,40 @@ "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/inclusion": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", @@ -4147,6 +4643,11 @@ "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4167,6 +4668,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4636,6 +5142,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema-deref-sync": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", @@ -4814,6 +5325,11 @@ "node": ">=6" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/listify": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", @@ -5291,6 +5807,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5304,6 +5825,11 @@ "node": ">=0.10.0" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -5498,6 +6024,14 @@ "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -5911,6 +6445,37 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -5944,6 +6509,23 @@ "node": ">= 10" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5970,6 +6552,15 @@ "node": ">=0.10.0" } }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, "node_modules/path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", @@ -6059,6 +6650,11 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, "node_modules/pg-connection-string": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", @@ -6252,6 +6848,14 @@ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-ini": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", @@ -6273,6 +6877,32 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6302,6 +6932,99 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.2.1.tgz", + "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "1.7.1", + "cosmiconfig": "8.3.5", + "puppeteer-core": "21.2.1" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/puppeteer-core": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.2.1.tgz", + "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", + "dependencies": { + "@puppeteer/browsers": "1.7.1", + "chromium-bidi": "0.4.26", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1159816", + "ws": "8.14.1" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/puppeteer/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", + "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/puppeteer/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -6336,6 +7059,11 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -6533,6 +7261,14 @@ "node": ">= 0.8" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -6910,6 +7646,15 @@ "node": ">=8.0.0" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/smpltmpl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", @@ -7128,6 +7873,37 @@ "node": ">=0.10.0" } }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/sonic-boom": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", @@ -7334,6 +8110,15 @@ "node": ">= 0.8" } }, + "node_modules/streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7547,6 +8332,26 @@ "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", "dev": true }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -7566,6 +8371,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "node_modules/tildify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", @@ -7767,6 +8577,38 @@ "node": ">= 0.8" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7896,11 +8738,24 @@ "node": ">=0.10.0" } }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -8008,6 +8863,34 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -8023,6 +8906,40 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/youch": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", @@ -8634,6 +9551,127 @@ "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==" }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==" + }, + "@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@babel/runtime": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", @@ -9048,6 +10086,20 @@ "truncatise": "0.0.8" } }, + "@puppeteer/browsers": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.1.tgz", + "integrity": "sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw==", + "requires": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + } + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -9059,6 +10111,11 @@ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, "@types/bytes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", @@ -9221,6 +10278,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -9289,6 +10355,14 @@ "integrity": "sha512-cQH/NP250gOF9k3TTDhVsTOPSAvyH4MhKVZ4ryYiihA+vnP27sut1gVIrRas3Evl5d2wEgWVGI5DgdP/ZFSk0w==", "dev": true }, + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -9529,6 +10603,14 @@ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -9574,6 +10656,11 @@ "proxy-from-env": "^1.1.0" } }, + "b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -9663,6 +10750,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -9709,6 +10801,11 @@ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -9776,8 +10873,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -9890,6 +10986,14 @@ } } }, + "chromium-bidi": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.26.tgz", + "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", + "requires": { + "mitt": "3.0.1" + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -9998,6 +11102,28 @@ "string-width": "^4.2.0" } }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -10197,6 +11323,14 @@ } } }, + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "requires": { + "node-fetch": "^2.6.12" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10311,6 +11445,16 @@ "isobject": "^3.0.1" } }, + "degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "requires": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -10337,6 +11481,11 @@ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, + "devtools-protocol": { + "version": "0.0.1159816", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", + "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==" + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -10538,6 +11687,14 @@ "strip-ansi": "^6.0.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-module-lexer": { "version": "0.3.26", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", @@ -10561,8 +11718,18 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } }, "esm": { "version": "3.2.25", @@ -10572,14 +11739,17 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -10784,6 +11954,27 @@ } } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, "fast-copy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", @@ -10794,6 +11985,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -10856,6 +12052,14 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "requires": { + "pend": "~1.2.0" + } + }, "file-type": { "version": "16.5.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", @@ -11006,6 +12210,11 @@ "is-property": "^1.0.2" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -11050,6 +12259,47 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "requires": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -11291,6 +12541,11 @@ } } }, + "helpers": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/helpers/-/helpers-0.0.6.tgz", + "integrity": "sha512-oi7CoWXnvnqmdiofPw5XG9ePBKr0w9TqBkS97a2/yvfRLInWb250XbKqvGJ5rQchn2fielYGY9cMAXGweWjCxg==" + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -11309,6 +12564,24 @@ "toidentifier": "1.0.1" } }, + "http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -11339,6 +12612,30 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, "inclusion": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", @@ -11383,6 +12680,11 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -11397,6 +12699,11 @@ "kind-of": "^6.0.0" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -11759,6 +13066,11 @@ "esprima": "^4.0.0" } }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json-schema-deref-sync": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", @@ -11883,6 +13195,11 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "listify": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", @@ -12250,6 +13567,11 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -12260,6 +13582,11 @@ "is-extendable": "^1.0.1" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -12418,6 +13745,11 @@ "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -12728,6 +14060,31 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "requires": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + } + }, + "pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "requires": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + } + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -12755,6 +14112,17 @@ "slashes": "2.0.2" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -12775,6 +14143,15 @@ "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, "path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", @@ -12841,6 +14218,11 @@ "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, "pg-connection-string": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", @@ -12998,6 +14380,11 @@ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "prop-ini": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", @@ -13016,6 +14403,28 @@ "ipaddr.js": "1.9.1" } }, + "proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + } + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -13042,6 +14451,67 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, + "puppeteer": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.2.1.tgz", + "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", + "requires": { + "@puppeteer/browsers": "1.7.1", + "cosmiconfig": "8.3.5", + "puppeteer-core": "21.2.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "cosmiconfig": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", + "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "optional": true, + "peer": true + } + } + }, + "puppeteer-core": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.2.1.tgz", + "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", + "requires": { + "@puppeteer/browsers": "1.7.1", + "chromium-bidi": "0.4.26", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1159816", + "ws": "8.14.1" + } + }, "qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -13056,6 +14526,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, "quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -13211,6 +14686,11 @@ "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz", "integrity": "sha512-jPGN876lc5exWYrMcgZSd7U42P0PmVQzxnQB13fCSzmyGnqQWW4WUz5DosZ/qe24hz+5o9lSvW2epBNZ1xa6Fw==" }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, "resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -13494,6 +14974,11 @@ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==" }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, "smpltmpl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", @@ -13674,6 +15159,32 @@ } } }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } + } + }, + "socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + } + }, "sonic-boom": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", @@ -13839,6 +15350,15 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "requires": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13997,6 +15517,26 @@ "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", "dev": true }, + "tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "requires": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "tarn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", @@ -14007,6 +15547,11 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "tildify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", @@ -14149,6 +15694,26 @@ "random-bytes": "~1.0.0" } }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -14256,6 +15821,21 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14353,6 +15933,17 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -14365,6 +15956,34 @@ "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "youch": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", diff --git a/package.json b/package.json index 0499792..34f6e18 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,14 @@ "child_process": "^1.0.2", "chokidar": "^3.5.3", "fs": "^0.0.1-security", + "helpers": "^0.0.6", "jsonwebtoken": "^9.0.1", "luxon": "^3.4.0", "moment": "^2.29.4", "mysql2": "^3.6.0", + "path": "^0.12.7", "proxy-addr": "^2.0.7", + "puppeteer": "^21.2.1", "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.21", "zulip-js": "^2.0.9" diff --git a/providers/AppProvider.ts b/providers/AppProvider.ts index 88869cf..b4aa103 100644 --- a/providers/AppProvider.ts +++ b/providers/AppProvider.ts @@ -10,6 +10,7 @@ export default class AppProvider { public async boot () { // IoC container is ready + } public async ready () { diff --git a/screenshot.js b/screenshot.js new file mode 100644 index 0000000..b8627c9 --- /dev/null +++ b/screenshot.js @@ -0,0 +1,146 @@ +// const puppeteer = require("puppeteer"); + +// (async () => { +// // Launch a headless browser +// const browser = await puppeteer.launch(); + +// // Open a new page +// const page = await browser.newPage(); +// await page.goto( +// "http://localhost:3000/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" +// ); +// const bodyHandle = await page.$('body'); +// const { height } = await bodyHandle.boundingBox(); +// await bodyHandle.dispose(); +// await page.setViewport({ width: 1920, height: 500 }); +// setTimeout(async () => { +// await page.screenshot({ path: "screenshot.png" }); +// await browser.close(); +// }, 5000); +// // } else { +// // console.error(`Element with class name '${className}' not found.`); +// // } +// // Close the browser +// })(); + +// 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 = "Log Alert"; +// const startTime = Date.parse("2023-09-11T00:00:00Z"); +// const endTime = Date.parse("2023-09-11T23:59:59Z"); + +// 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.length) +// // for (const message of messages.messages) { +// // 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); diff --git a/start/kernel.ts b/start/kernel.ts index 6c70c54..72bd5c2 100644 --- a/start/kernel.ts +++ b/start/kernel.ts @@ -10,7 +10,6 @@ */ import Server from '@ioc:Adonis/Core/Server' - /* |-------------------------------------------------------------------------- | Global middleware @@ -21,7 +20,7 @@ import Server from '@ioc:Adonis/Core/Server' | */ Server.middleware.register([ - () => import('@ioc:Adonis/Core/BodyParser'), + () => import('@ioc:Adonis/Core/BodyParser') ]) /* diff --git a/start/routes.ts b/start/routes.ts index 8aeb852..faadd55 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -1,3 +1,4 @@ +import fs from 'fs'; import axios from "axios"; /* |-------------------------------------------------------------------------- @@ -28,6 +29,9 @@ 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"; +import ImagesController from 'App/Controllers/Http/ImagesController'; +import { uploadFileToZulip } from 'App/utils/uploadFileZulip'; +import { screenShot } from 'App/utils/screenShot'; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -201,3 +205,13 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { } ); }); + +Route.get('/api/images/:filename', "ImagesController.getImage"); + +Route.get('/api/test', async ({ request, response }) => { + await screenShot("20230915-HELEN1-Session.US2-11-3-127.0.0.1.log") + const test = await uploadFileToZulip(); + // setTimeout(() => { + console.log(test) + // }, 10000); +}); \ No newline at end of file diff --git a/uploads/abc.txt b/uploads/abc.txt new file mode 100644 index 0000000..1bff6cd --- /dev/null +++ b/uploads/abc.txt @@ -0,0 +1,3 @@ +sdfsdf +dfgdfg +dfgdf \ No newline at end of file From 6fc1c90c7e0f8e549bbbe8c21c6d243dae6c66c8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 11:30:34 +0700 Subject: [PATCH 035/298] update code --- app/utils/runtimeCheckLogs.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 04d666e..dbf301b 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -177,8 +177,8 @@ export async function runtimeCheckLogs(folderPath) { fileDetect?.id_ldf ); - await screenShot(fileName); - const uriImage = await uploadFileToZulip(); + // await screenShot(fileName); + // const uriImage = await uploadFileToZulip(); let listReport = await getListLineByItem( logsDetect[0].filter((l) => l.line > lastLine) ); @@ -216,10 +216,11 @@ export async function runtimeCheckLogs(folderPath) { "**\n\n" + content + "\n\n" + - spoiler + - "\n\n[image](" + - uriImage + - ")\n" + spoiler + // + + // "\n\n[image](" + + // uriImage + + // ")\n" ); sendMessToZulip( @@ -231,10 +232,11 @@ export async function runtimeCheckLogs(folderPath) { "**\n\n" + content + "\n\n" + - spoiler + - "\n\n[image](" + - uriImage + - ")\n" + spoiler + // + + // "\n\n[image](" + + // uriImage + + // ")\n" ); // }, 3000); } From 13b4f6f7f6ea2ec390105062a3b437f692ad8816 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 13:22:27 +0700 Subject: [PATCH 036/298] test screenshot --- screenshot.js | 48 ++++++++++++++++++++++++------------------------ screenshot.png | Bin 0 -> 52000 bytes 2 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 screenshot.png diff --git a/screenshot.js b/screenshot.js index b8627c9..95a3dd3 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,27 +1,27 @@ -// const puppeteer = require("puppeteer"); +const puppeteer = require("puppeteer"); -// (async () => { -// // Launch a headless browser -// const browser = await puppeteer.launch(); +(async () => { + // Launch a headless browser + const browser = await puppeteer.launch(); -// // Open a new page -// const page = await browser.newPage(); -// await page.goto( -// "http://localhost:3000/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" -// ); -// const bodyHandle = await page.$('body'); -// const { height } = await bodyHandle.boundingBox(); -// await bodyHandle.dispose(); -// await page.setViewport({ width: 1920, height: 500 }); -// setTimeout(async () => { -// await page.screenshot({ path: "screenshot.png" }); -// await browser.close(); -// }, 5000); -// // } else { -// // console.error(`Element with class name '${className}' not found.`); -// // } -// // Close the browser -// })(); + // Open a new page + const page = await browser.newPage(); + await page.goto( + "https://logs.danielvu.com/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" + ); + const bodyHandle = await page.$('body'); + const { height } = await bodyHandle.boundingBox(); + await bodyHandle.dispose(); + await page.setViewport({ width: 1920, height: 500 }); + setTimeout(async () => { + await page.screenshot({ path: "screenshot.png" }); + await browser.close(); + }, 5000); + // } else { + // console.error(`Element with class name '${className}' not found.`); + // } + // Close the browser +})(); // const zulip = require("zulip-js"); @@ -101,8 +101,8 @@ // Usage example -const filePath = __dirname+'\\screenshot.png'; -uploadFileToZulip(filePath); +// const filePath = __dirname+'\\screenshot.png'; +// uploadFileToZulip(filePath); // const zulip = require('zulip-js'); diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..97aa9b20ea6e74d658349f06d7a7fcedda1fb1c4 GIT binary patch literal 52000 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%0Ah*obZSR3!yBD5SMC@3VWBaF?$5?#O9{X@d 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̓^I>; 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 Date: Fri, 15 Sep 2023 13:33:47 +0700 Subject: [PATCH 037/298] update screenshot --- screenshot.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/screenshot.js b/screenshot.js index 95a3dd3..058c840 100644 --- a/screenshot.js +++ b/screenshot.js @@ -2,14 +2,17 @@ const puppeteer = require("puppeteer"); (async () => { // Launch a headless browser - const browser = await puppeteer.launch(); + const browser = await puppeteer.launch({ + headless: true, + args: ["--no-sandbox"], + }); // Open a new page const page = await browser.newPage(); await page.goto( "https://logs.danielvu.com/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" ); - const bodyHandle = await page.$('body'); + const bodyHandle = await page.$("body"); const { height } = await bodyHandle.boundingBox(); await bodyHandle.dispose(); await page.setViewport({ width: 1920, height: 500 }); @@ -98,8 +101,6 @@ const puppeteer = require("puppeteer"); // send(); - - // Usage example // const filePath = __dirname+'\\screenshot.png'; // uploadFileToZulip(filePath); From feaf862e145acc2c1419e7b47f06aaae8b9ee5b5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 13:36:11 +0700 Subject: [PATCH 038/298] update screenshot --- app/utils/runtimeCheckLogs.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index dbf301b..708c25e 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -177,8 +177,8 @@ export async function runtimeCheckLogs(folderPath) { fileDetect?.id_ldf ); - // await screenShot(fileName); - // const uriImage = await uploadFileToZulip(); + await screenShot(fileName); + const uriImage = await uploadFileToZulip(); let listReport = await getListLineByItem( logsDetect[0].filter((l) => l.line > lastLine) ); @@ -217,10 +217,10 @@ export async function runtimeCheckLogs(folderPath) { content + "\n\n" + spoiler - // + - // "\n\n[image](" + - // uriImage + - // ")\n" + + + "\n\n[image](" + + uriImage + + ")\n" ); sendMessToZulip( @@ -233,10 +233,10 @@ export async function runtimeCheckLogs(folderPath) { content + "\n\n" + spoiler - // + - // "\n\n[image](" + - // uriImage + - // ")\n" + + + "\n\n[image](" + + uriImage + + ")\n" ); // }, 3000); } From f5afad33936d7bff7fac260d6dbf83d2e93828c0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 13:47:33 +0700 Subject: [PATCH 039/298] change time watcher --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 708c25e..afcbc93 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -79,7 +79,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 300000 }, + { interval: 10000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; From 591b050bb5f57b00dd8f39aab0743caae192e147 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 13:48:59 +0700 Subject: [PATCH 040/298] update screenshot --- app/utils/screenShot.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index fa4be5c..68be02b 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -1,7 +1,10 @@ import puppeteer from 'puppeteer'; export const screenShot = async (filename) => { - const browser = await puppeteer.launch(); + const browser = await puppeteer.launch({ + headless: true, + args: ["--no-sandbox"], + }); try { // Open a new page From 6e2308b0700a358914429a2db5044d66c872bcf7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 13:54:16 +0700 Subject: [PATCH 041/298] update screenshot --- app/utils/screenShot.ts | 2 +- app/utils/screenshot.png | Bin 109173 -> 0 bytes screenshot.png | Bin 52000 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 app/utils/screenshot.png delete mode 100644 screenshot.png diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index 68be02b..ac305a1 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -15,7 +15,7 @@ export const screenShot = async (filename) => { await bodyHandle.dispose(); await page.setViewport({ width: 1920, height: 500 }); setTimeout(async () => { - await page.screenshot({ path: "app/utils/screenshot.png" }); + await page.screenshot({ path: "app/store/screenshot/"+Date.now()+filename+".png" }); browser.close(); }, 5000); } catch (error) { diff --git a/app/utils/screenshot.png b/app/utils/screenshot.png deleted file mode 100644 index a715f7b4aaceb8d1d3db3b4bce7714d4f4d74f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109173 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,cv~rFUVV!&9+O<2_n?q75R9~Hdwi|N;IUl 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

|z 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 diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index 97aa9b20ea6e74d658349f06d7a7fcedda1fb1c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52000 zcmeFZXIN8P|1F9lU_;y%lp?5rbWjB8L=>fiv>=3{(tD9!5)_e5mlgzsh%}KBYC;WI zsG&#=5FjETB|xNxBn0kazuWD8&vXCJx%caN&isDCgA2%-3E;E^omHAxwD2u;% z@zFX{!Kh`0=3C)Y%q;l#4@-^)$GA zGC^PZTZ#3h4t?4Ahk^S1T^h-IcwO0FN5E$}?~$-W{~Ujdzszv*pCbnUBZnUSKC0z| z;x>N_7U~mx6@Q;)fCTLAQa%OSGBEygvgML0!^MA&7*>xSZux!WseYQ_AW;7)VT#Wg zuKzj!qW8!DkLn!#KlLZSMQgNG+6Lw%Wx5}9vcHR~(`N?HcVDY)&9GMY`$vjJX6e ziX%SRe=J8ti<0IAQZ~|}@;XwaA~puPG#5H6$CtG07iuzYM)BQ*5!6!Wx+`BMKbW$r zOmtas?f%(=uA5Br$+5zIsP>qCI`Z8QM{{ty=3B=GcDJsWm_%LrSB=W=GSnhb!-k}* zG{j6oO2IP=&3nu%wy$(!zH4~#By#KgNUuSG3^VkkUkzQ-a~S)wF{k0pn7?TJxhxL~ zS%GE;Dse2l^Ur2daI?-eyycxyka3dgOuGIO$yI`N?5%t|*m>K~^s|#wlWPBxMw_$n zCKfL}{6M*;@j;XY6UEQvdivJ0`n$S=MK32Yw)v7cMu%YoZX}}e8%gYbee$zw_dG{gQwlbOH5ZCZ)N)VAo)gr)lZ)Zs zGOuJ;5FCIpJ8afW=3_dnpLc7e&-ipx)Y@FC4M)7He zKjL{97duWj+2Fo&Yp?9WwMzPJM$7m9hLbN{L#7SCp}4M(m9b6NrXmmR%JX?f@>bfV=Bx{=KaDY$Iv=`i32ez2aL&@-MGds1 zlasGyC>Y+F@~%O$B>Pmk{SNTYj}_Um9pvrUR`w)_i{$Xdn{yrI& zdHerPT)XZY3FeV55d(}8G{0clOoHs>i>yf+m6+-NJFsDAr2cE&sEs)EO)ckG>V(hD z-{JhGT;? zy0Ri8Jn2+vZL3=3>8(_#oXUuLD((b*6Fh)Vqkae=wQAEpw37Gw>_Vq(LbujS`4@3% zlAHZ&70_B|b3(pV&s6=JKA0Kh=l!IwkSWPTr)8swF#Z(NJ{nRp@`KI8^-* z$|J2wbfPbh5ENg{F0Sk;G%p*ll`s?lFU1iyhZJdwXSI-O*Zr4_B zw66Ry{#^RN+O1TZu0tQcb4m?+!Y(Al-7CnK6WWTQ2I4K426O6{<_}FT2PJQjG%%r) zGWd0MBi4ptdXgS9Wm7E&XSkp*N^@nO)wvT`I#46adJa9l)Q8q-lglVL%gSylQB*(W z)U?6JH>0DyQdDG-W@Ms*TIWo%#<3(1+|phd_&9n=&!ydaanzGBKlxex=iFU$4=m`C z^Yu5*KJ=_#9lRxOOoCxqiw{Pzh2?2o&o!dCp3(9uf5K75SGa>-agk0q#T!-}&m}tL zyZY$ru$IXMGj|-@Nzm7MwyA{+KscfA3PH`;4n!^L)?9uzZ0$h;yqmtDX!OOPvvhK)<=?v_<>j;{PsK+Q_r~aw9-}t@woR#Cp42L6JZ^e(KW81uWvzMnYF3+ zpan;qWfk)2<7Cu58z(8nDObuf>Fl0ISY9SYk9JI*syQqFscXl-Z=|Mo(rRDw=cM(J zn8&EOPa~i*?-!YkD33?rw%k|*oF)#tY(LUh_Iy3i!hp1)HuKe_u<>lPpY#Vw#R0kX zVd1IKZO-pJPVeOu*|~5K7bI5-k9m}>d4<9e*e|e1s{0&w=#7S;m&|4E_N23YSdb}J z1HZ1gmaPp!o^j$%J=_aOjU`o^;QasrI?jO&+zqov zqzHlngqko(WqU;k5~w>3vJD0`b!goNg>0z7%xf0zZy1)e$y;XhzkVSYt%yCW86a!n z%Y5(JhZLseyy<@5Q$IqpPBherM|-I2)p6;}y*_UT7pPO$tEpbM+8RcQ)dXEg^-q>d zB8oBJQN)}Rr1%C}3))G67gqPKKYLekwYh4OvtpGq>4o6&tho(YukhPm*p7>Q4ne^@ zmw%1qN2Za-7zC4WNzdO>{kS!o9%Qi3A!f{@9A!mU6nxh!ILMcT>N?uld)q^O^vGPX zVp{X7DYd(#o62wEW`c|K_vV#E$^8!P1I0MA`=nveR`aF?f`GT5X4`D1A-9I}H&6fQ0%%!LS0LH%6bvNek?7vCQ;RgxgpsO6+3oYmPR`;{xM z4-W?N-D-W&fp=JD0@Q} z);+jkvrrs#@x6yq`rbFrLk-=~zKCJBr;2koU}q!lr`y=f_J*S|+*hhGr5U~23WnGUgqYK2| zmjXlRX2%wS!ror|jLNryt=$9w=&Hkv3tT&HwJ_9_IvwzKzUs`^w4mY53Kq7lO~U@j z{@(Y;0x{&_xr)7+dBhfP{+XUuIn11s*(+HtB6)hOc`M}S9Z*v$k21vyVbMEJXWQDs zwMq5sMu%aQ9C@jOX3hLF4=yB8S16l2iRpBWC-(+c#~R$#!(&cZo@8hAyLY;Bm{^Sa zz|7AUEK%Z-IgvXc*C5`i8rVHD5Ex=m-H#XHlLnwIBU3{P%R+Dar(Ug5#jcl<@wVp5 zmYeu0V)P24ivW2oWw1~>ZV%aW6al&RjN89)Dl)DtezYW39jc(1csCF(;4&xU6G)lo z->kGl(SW=M4kvqv>^D*mRu65uNSy-bedi1NeT>u%o50Q**a&JR{=%DHaR`v!xe@XkC&7_djANFECLR>@!TH3=D7irLyl}-fW8{t+}r%B0_hL3_n^ep+h5DR}aHJwTvr2aM^30Bhm0~U<+28l!cAY2A3QJY(L%=I9l@UKo zrgY8)wL0)|U`2YY8@s=6TNcyrC$9Sr@4pSC8CqZBCFai9g!=5>0a;ir6`}`_z-R={ z&^=A|e*Om{wx{;kQ=WmnzEXyR`B$LYLbF#>)a3zTcEzh zrKxol8H2St<(i81&;d{0K_A|VpY-w{G}Lz1`D+GKBwgGVebN+;Z>}ax4U-oo=zgWa z*zwTu0hdQ8T}W0TOCx%sga8k`K!z71uW-q?G}%$)2xB?D5mcE1FTBUnR3&B4vucY# z55~F>3cE8Zu%Q}tE4m1?rwDHi7d&QMl_X9WR;KAL51P0s4k@1jnt6%~&lJYjDQBqQ zl+7KKbTf58I#~XGDp&VUwd3nfi^fs~O8)PD@`GO$Xbl=K`n+Eq$sFuvE#UOahi02C zGmovad@j0=5wCkTAU%8l2)~Q+2+pO;TsoEaGX#1wJNA5W@j+&{BBCM4dGeZB!=SNK zMyUs~KAv0NyFSUHaFeAc6}qz;hfzL&xenBo<*3c4>}&L$HCZa{0%FM;X}yFSYqus^ zBcLA&>4HJk_Nl;XMYYZ7MY~D854k2K-uf{l=q|A zAN;@tXYT&iN9uvUT$TsqG|`p~_J`Ym2Nt1&noGDg?(KrA^hUUKZOd>D@0Iro z1JP4jG#^TW+k6gE3ti@duZK4D(0uf1yQh=BVz-^9P(^2ptTWtcxw|S(E5qKDb$?ci z62&QgO-uRsSzB36?+nZvlpT$8jvQS@T3-*@^;NoATMp^&R)g@LRA^wj_l*9#1O`H9UTl_0}8r*^%S zstW$Xodof^#1AmnIz6X)WdEI4a|+BEM=E;L_HLYARPq_}QuO}5_KEiy^qb=wg0A{} zg@X1tJ4dbtYS)0ywlAK26zTQGooBOVuGSFe1rDJ;+w<9u!!*k7@1xlW3m&FPn*eCV zAU$yRpqc!S;i1#aW?w^&$!g3G5<#=0mne{BLs<=zReN;R4$I?hmO*AvrEB%4_zAf( z@%;?_3E3@(t*x2cmgKq)S)jdjR1D_blw@a+iQe7ZT-IDX56bQ)kL@nbP^dphb|0Gt z&UT%^b{7E1b_rdYuYc9_rrMndD>r<5zF3+IeH0i*>iI57#cz!)7|%r5sDF$mj`_J# za@Xr!eNpnGo>sUKIKfBBC&A-zp{L893xFy;Zqb&Yacu*(sKJAb#9eNd z^QQDjwVP%0LXCp&AoQh|(*Ge{2z5+AhRAD!$_H*c;SL0;T(UaTf9W6pNLR&+-9+$e%I9Zy| zA?oC1*>ZgxYQ=Jj4_JP`ffXh$wnX`yF=hOudbvhR;BA&ss(Y^+B`W}#kGN2)jzzG? zwMFm7yN)f%v4U3R10Ts9vl}vNj3S}!%;4h?&?+W-#TfSk%!3bk3krogT z4zclQA(45-u%&q#+g2yoC1J?LtkS%x4f-^^=uMF3ia^p&H7^I;+q>J&)Ns|d0Q`#UB`V!OKsn$?7z0|K7DMs;k|2Z(DbhG zkEm{T)svYd(W(7TiMCCh*Fu4%Hy%=;ZikimjURZ)SS zI7GG!dfk0%%FOMfJ(lXW{kbghX;56t9P_(zwk^ZK!Cgg3ix_R|rqzb4(HA~}Svfcx zB!Ybpx=#I?iggFOxP$cE*gLwFaQGL~+TAEL6F?K6M*9Wt*xTVpV3HP@E5^+rQ4_;$ zBvc>Hls_If7GJ!Y`28WoZkm5O>P}%*vm0d0BXVD5vWBo!=I@d2K!qcj0^ws*@%>Fx zkg^3dBLUJ2hxHq|_+ePQ*R@C2T{@;o;+d77J}>p;Q=2F<&f`0$+odKTaL%`04=vEO z=!rH}(%o}T)9l6d>#1a6Qq|ol$f`HYAF}O~??&3;IR;Ea=)T8?TcT!bD#JX?&S?+& zSY0)r84tN9Y~Q|og@)AJu67&@DC~cDe7*VPN}IY?6~k7i=0u1MB5e_3HPw|xe^|MN zV9Ixm2m+VzFHYIeYm5(5(@0CI-&m+KbR2cbkh;CrG(hv%8jQK>X%W;Ulo|`qOcltK z5Dhoob-XD#II(%x@=Opw*W|DC*v#FsJF6yj0`^9bGx7qE5P)vg(3a4|xhBpw#D_~p zRTOb;xR;MP&9|ioHae=((O5i zo2F>XTegJWZMc#}J&qO`M6)HfB_ey>s5N;hZe~5v;~N)qBBg^DmhOY0wCzRCn6Y=L z-9dAB``b6F-#g;itL~Y4xqxOpg4j?7_)}db4?+@#suT&&#DoC4dDWh*p*_cT!5m&A zEfknVOG%~s#gPVeS4rFb9=HZ{Hzqjlsrj*!_h$AQ2@vJ2;L=uC8dn3_0_WkfJUwMN znNv_jyJhMwpB~gHGh0rE$8dPIRzOw>-kSD6YI;~*G^B$JUn*8s9MLvOI~C+nheX8$ zW8FMG0w+@mm{5_$0#YK-T|76od4Mt0>1=01AMucEulOK4>s55b=S-I7^HyaEZD_=?o zAFFk&Npd}bwGu0R$WgeWAYhO-R!%?-mc~m?40%A_FW*Gxs=`WyI7GJv$Jpe(N@7&+ zj?hZyou@rhfW(xt*KdUq{9tlU2QyPUfxsEC1 zZ`=(Xz+^IB&I_J4)wP_xh zko8~S*}buka0AaKJt`Hpo1^i)El7xq$-aw#j?W$DP#IXB{v@5{e9_J54;uoCrZTy( zCt|`n|a_j zcI5i5=O6LPwi6P{284RBCfa0z&pPMWyoZ{NlOe6&W-NQ68@Y zm%kwn4U6uUY178{Y_&UOiWd!e7%FdEJ=PRgRXUNoq7^JrZ8NNr%vZ?e6vBgDtX-0; z(9?nS)DD^qcLNe*M%rQDq2km@QT^ru#~U`{@s_^qdS<43Q{n6Rytx~^T1%jBlNTHK z1eK7h8@43@Cc^z4t_Zt|WEndA#d_Dg?wO@LwB^{4$#T3=r(taGUHMdXGSWb+w=7N& zk@m9MAsJUnqnj9i?zRPWnDl;Lu$Ybqr67rDe4{?Hs&6H}%5ze`Z7n-KT`kA7;gn!S z^<(y)Yi^Lerk@h$W{g*7_FN{{l2h7htm&aH2Xx0vFEAI0sq)5=3o6LaslpQX_Q%co zvLrNd3ew9fCiYyD5>QY2y0>jsN65VemH7CJV66QFM8fwg z?R4Feaa&|5t8UE?mAO#Aj$ka2P(_$fX~M$vfzkL#|1a6dx+g_1QY(Ml<+`?>M#Gkq zp*i#@MrB{DBIilcDduDWx6vNk2UZT-Q$C}*4WFG9F8MhO)_-1fHD8;8?ZfukKW#3p zUt4_pxB*MdP#cag_~iv~OH0uT_pyeM@ndFG$bQTw8v<%>M&gZc)`ux7YVYs0?lu+D zt2WV9q``e^bpUB_vl#=z!YgJ?RwKKL6?F<*Z}|eGxJoAcR-bhS#{6mXtxKF6^nTsQ zOmQV$!SHdfiAK|CJCCOtWhC^=zMcZz!N=%{f`NV0ZMTXQT{?I*ZJ6eYS>Bb)IyLAX zxEIu1sx*>WkcuiCK~Zkm5wrJUpXmx5d6Vun)){?cL5jB??j^01Z4Z8c5{CFMxrW52 z{BUwM8oNV_?i(VvKOwkH#eUr0a2@bS#SqH$x%yhiJ1tahEv+CPAr&{goS3>#RIU+yC? zbj~!>OZszLt`le=Beo!T#H>san(Ur7_w*I{;$Gb)KqOF2iXH*J5G~^P`+c@R327@E zt&ORLrnz<6*4zrHrD;yW4fL~V&X;6V7RqaA21H~igO<{B%PTS%t2>Ud&niat;A+uI zKk1XYq`}Z#WdIh2HRK47xF`p2i<$HQRtchqW+mqoKF#~=RgPT7lv@qKQ+qozs%bD1 z5y@5`!cg0El|yo*U$x60+H#doQf0jI$lMgTSA~B1-hD76W8%9MoFRGw8De$+I3R5vN*q(pTG)IEz4*7O;uKPtVYh+Hk>y}f@dT38g#xa>>7quP z{gr~>J^==XQMLm{=n7WO=o1HU`G3kz`Kx~^z6}0f#7{B^9@l+8TafvSb^SI~AbFh4TlB7SV3SM&1CJ-04EB_SCKl;e z%|_5p8Z-~yf)(t_8A)<>~AZ~!?xgfdavN+g`2}ulHox@*3HPpMEz&ph1 zIHqS|*2Qo!~-=2jd}7CHH{F zOZVS>72S%tA@%qjrNX?rFl2dk=5=WqI*>3l4z_lxLyGG^K4XGpyw@xtua2eVEd~h1 zXa2CUYn3Ue1YJmoh@f!ACqK!WyJdb&#O*1D&7SyO;TN|S(Cl`BA)bFmV=*t#dqK0; zSZi>3?xG1)BOx|VQzcY{LqDH){cMC_#dB$si~_B~yT1OTZ|%#T`@B>2fA3VWEBzqE z@W_dYkR~HmmR5(ub*&Ts68FYcF4li3#*#L%$v5eK@FvV~A2p4C@!8%cy&`)lbGw?BsvSST3z|0s7HHQ(R*D8ZjM zX7YHjoJog&e>)_(H1GEGyiVlO2L#KDDx&U4GaqH!7w3xQ)s;`^iPV*^E!aoBziT%yq~ep}`^D*C8^rGJob#mLIgnewMp_`KFc zJg#2n%o6|V@|#O(2SVN4ZA1RSXj7Inl=oyP^@`^($GP*n8gA20JTcU7OmB2Gl{Murkcdkl`{Q1YYVoLFf3Dr{)xfTDW8=untfze!Qd^e-qJ<4Tp_Aj5A`bv0)#RN?m(` zRNS^N*|{ARlAxjppK2^>qTPmt0MaC`ogVtrmR(Mwd2i^Iz%nyd8+747h=w<%y~r*B zms~FGBf;BP#hXM9y%Bqbj}9NFWiahJ*qmj1nE~$7mlbQs7H`CbQlI^om>2#dSm}bF zBSfabw{>khzE1tKcT_lqrg{s!m7|r4-+O=NHtG`kinao_%x`&_vyne4sMxo+52jx6 zrZm224);1Kh%#?C@lu2Vg*0kkcAN0~yNMaxtD2a@?&>?Ynt2|`dR7XXPwqx7yfdyy zb$Efnu9xDq?(hviH)@C@1m^R`OKyGG9m$lX(m%HzJxG*Ht6=`pTztk+clwG~bNS)+ zs&K>W;%wdg)9cHvFVA;YnMa3T6?!975_dkva&8Q_6}u2Ox*qBsK7MMoJ1Tqy!cu1zeN%qMh*WSB_);YQ=kFB$+A9jnR!*s+kr z*kLdXEK$pIL`aKc-tJEqL{x0PU$c;jMT-2SP2iY5a&zAM*gTd-onh4UuwE)A^=|Gi zD~4`<&xfY2C-pHZ?~~JctgK4SJTa50EkSOv4@{3k^3PyPA7)(@LBwu^j!X131n%&2 zM0VLDShlzv`WXF(&wM48;0ygN&WI-Y^-cLIa#~m{Jo#$YQ7iWRRjHMA6IkYQ;LoRz zb@8)2scmC!!V-2h9wCjTuf8PaJ$r6x*x68%w9sb2&Jy>xo;NeJ4bXfmf9jqK65o=D zrW*#ozYDm^jG=P8M7*3)oIQR)oQ zjm~Zx?zP<{SY<@K^t2V$`X~n0g$ZQ!+v&1%U;!Au?uT(DQ57r&69ft zC{RpZ;vHO?ZasyH_fx;=1YBjJRQrf<7+D4VmlWlTa)c;EaXqHW1TOW(-C z^_9{K?=NRLmaombQF4u)6o$V}`dMZIDvkY(i_NTfoa3wuv1})-seV_lSxFucoyLd| zdI?N(AY3pgbT?vi2@zxxva{ksf2Y3{IkR6RNh&of=Mu^~DgAnO-r#fHIRGC$Qc-@; zT)kg4^D&)$u+SUePDeW4pJxHgp%vz=f6R7Vluyn(NmuhQCy4cOoJC%_1^kzJF3Odjbbq7yD+qAClXLP#Vq8k-BCcECHC( z`j<7C0ae{NsQe?io$y`BhcUkxuij1`qZWSz!BU(RmOl_s zwr`36@v++I$f~KG;9st?VWZc5X$5DClrT>PAU-1P)x)GyGEMiM?caAV0=Xb{Gxruc z$<*0OfOxelMQzX{sk1#Ubn15gUP)w7wcS~on>O4;rMIgG(RG7M#q-q*g(yWu+j@tq zHnS;`XDBMXEA=g{GLGD-Jly{zPCG3t+zhu)9J0_XlQwWV`A9u=xmgHau-K?p-S(l2 z(Z#4;Iu;T%Sb4w(i|xPXoQr82$TK`VW^x_iJS)BXp>@X9#cwT=WI04jY`>X1lk;N& ztmWg%6rB62jPZ#t2OnVv8U`Lo^_{7)^xyFATYXSi73V+em|e;d$H(dr>VyR~3D`B` z#abU7l3z0sndj`%s**i8@M8+sL;1E}9kL)VRM{-{WG-d0sSI97;E{->(bi@> z?4Qk0h?y_fo=rOc^c(xZ&6+>X$O2f|om-C&jDJ3?jcTgT5PRkFX7Nse$K1m=r(`bb zX>Zi0>g?pt-?2OSt$(ji{a1y<$fMvx-#Rqlos|Kh5W~Dwj)du`p*8eF)#j8U=bCf= z?ht!~c=KZ=V>Dm7IkTNKT%nBrFShK6Meas+v`BYlD3eso%wdwY?MO;8YOXf%yX_vO zbuEPL^GfaU_6-?<949fe5VFN$E%E_S(Za~Jo3n}Fi`V%so zRNHHSSwZa@6&j9@$lYb7u9!JNWRIRh!&92FQYYMsaELU_F5rCtt99puRwdu0o=o8&8bB4V8iY1Wm2(<14lg@=hKg^qJp7?8aepg%=6s6Z$ ze4?yl_I56dl6HSCJJ6A&A2WxW>y<{-!x3A}eV9QuQx`ZFhuI3$2{uQYf47r20?O?OfY&)({5Ma6#{RWj z0Gy!&6~8iwWP zCm%i1j-CF;eG`U{KKbaM=P=arxj$x*GjO~kAUpZnch3;e=gJEZ4%jYh`%Z^5omKp2 zWty$Ktq~>sDGoJ5MDkFjnAwRFqq??YW^fr7{WTc2ayBCBT>99)IM(R3v3)kItollh zX~?alijsldR;-vip=R9UoUnD8>4{f@IgRH=WRHm5HCZO#F_*(>(M zCUCP!T19BHal)cqq&A8TCEuHg?lJb?S#EMA;84FqEb4ZiLGP2;f}(D|bZUX#-B+fD zz;d1}K$_nuFzPfu+!6ID`Jrlth^|pS;1I^UVGZ4{50{H>ZFE18?SO+W>dCCTbpksx ziV8kIdwJG+O-{J4WYP0-#Qer>Qz>vsS^Z}t3aS`b@2|hMT>;z%PAE*%l7jba$D)?^ zrLn4G_nJ%13W*&D+coOrtJ1Fh@>(|-F?orCt^wLP;KI%+$X`rWbvgv}ak-5}BXt9q zio6s&_GVU(qHnBuldI(Do)F%8Fc3kT?%WHH(59{&c+=-;1R}Z$AaeW)aAf4BMbhSN z7fgi4ES|ot>xrg9j>Qb+E82@1=I0ZlV$ZQ8;jfFsrBCFH zC23Uyv(R1Z5U7k*TL9EJJ8b`5yvrkWn5NlZX7G0e z_$52Yfy#2(U&hOF5_KR;%WLV+O#bs;E14v~1%PyZO2EyN2@AX)gr!35#SND6-ZDC> z_A8A>?L%c3**5$G{T^jy9d6kZ5}i>ps5!DJ zmm(1q7={+#!hcAKkNX}-S&&YZE)%a6YF&Ok_8LjE!?N)YJ`j}S)K=x01Ge*U;&53^ z@AdVbP;~pN8;@+RC)K)JO$9}^q;m=N z?E!NPBnFiRp02(j0uL#0fY%Ko*{>PtC)`l)Doy8;12PpJR}yeI}wharOF}0z-vF=CdZx?PqGiDhhxzLhnwXy$Z%9 zLr=!I(Qa(2hx5`G!Q-O&&-vnLb8n3y^u2%^Z-4M~k`+Z6-@BJ1yF17xCABx4WFGPc zphB6#g+y6g70pZLE#`aM8M14a#F3;>&%bQ?ru(v@6s3*-@E(!?int9^$Ye=yKnlh< zeS(l7SEK?TH1gE?&Cj@|S=ZclITKWAzNT~$Vvc(+b!+W*vZ1H4qCXLf1ei+q&B)MC zzut#odH4W67~h2Q@!g||3BE})$hKqlL-mbMya=8Zm7d;>19(7Z)nd)NXUbhECuVYP zY2VQw&g+_NXHcmX!q#qcO68(cU)(Gs_suw z%z^TAp?1vo3-YJ#!KYo`xmp%t&I$MVxRQrGAgK(HwW<9b7~=h3xI#Z6R-kwicMmCW z_TGWBSnKDwVX=P&q76x?S1MN`w6!KR6bpFqJ6#uj*0h$PYjwD`ankD*34O5514$5# zGs)b-zY&cn%~yrtd4>OU84MSDpZ;R%6SRVU+Z|bxc6-~LEf3Kwn(DE)staGFZRcaC zt2%uEZcvxBvgi0{nnqm!49oi}gP$WRo)gRP9*J$CniujZXpYwk9HNa6<{rnkdHuOD zQ)YEIDAx_YCilw+&(IR|{{|O~FZrKiNnx711ItM8kMTXwaz4UC540SV>+d*<_aQ*m z0VIFfukkV#Odoa8(|6B^VlE0@{A2f@=QB+CA80uKSd&*tZmhrWWrD>0TYRZ)>R`Y; zjuoWsl?Ps$);)yEYU!ZfE)R5sgDV^SvDe@--&vG{{z?YH*4fHM`^j6}~RI~jge&w$S z3~0otX@F1`t=~Khn$m#nY(Ctl>`d9?m0x#{XB8N+YG2BHkqzJkU4%j+b))FGGM|G2 z0(S#)#0=OX;PoR^#n(3Dd1GRt*EP<1-4kY2ZrWsF_EC&pq@~k!1BG?Fc~aa!6f>t| zQu91BrQ$lb<7*P_GC?*{<-%&2MuAB^CjZ$`pJLCp%z;Fb-J1(YB>jCG#ILIvy{X27 z-|rlxZ8^J6i%QO^y&D}J9}w-OQ%XlU)0a7=IHZv($9&IFt0=^F?K9azr?ggzdKy+a zrCxWVou-3x0rdsZjlyoLch%D^4EFY`Yps~eW|=ci)^qArg+8M3=|%!(SK6rHuO{H` z1!xO=+CXAuOaGa~#P7G`K(E@9;-inDe3rCl)+H&x4yx)(1J4e`n5FN;!?m)fEN6?r zAL=`vH@IJ4?gtdF8t#eEO*KSgZ&es_ugIE5rJv;g(A_rn>e#wEmhmEB>wV5Uwm+M2 zf89ZG0$?1TAVx9w@4YohT8?M8?_-oM#N-kirT__b6#7;bW`TWoAigNF)SL>Gn6NB+ zULE4DIXSJ?8!*gx^4>MlmehmX-7BYn`NcDTK`8|!j&3!%zI8s^!6m9KLz(-s6Z>19 z^EYch?h0+3K_~lU0rhe z#^Q&RPvys0skC`Ome3{?gGpBYnt2-r#n0o;|Cf0Mocx#K^nJDvZYxnLh;=ect$%d*|po z)(yd&LNK>6?HXq>63~_eiZ9XvRfHB@ExvXYTiv0y&^9H!6J8q1^-^yf2r~-7tJRZz z5sG4cZ`{PHEIbotBLRC_NQ~i@BK&f%_HD_AQ{1r!PF06_C(&)R7&+Ui@ujiKbzn~! zymOVO=Vo?seU;QgYUS9kVKMPUktyti`(-Dkeb^rt^^AnGG{U3UEANH-?4`%^7ix%W z-w6!-DajS%^&!U(dj|4Bius4*yv~TufjZOmzfot1jOr*}#|PM606>66!R4m|ytQpI z;8v+eb=f=IT2)sT0WdSSWphc8pRQyXTl^Dw2=`ObvMZ_A zOtB!z83k5K_kk?)ppyIVm-Z9{=!ke7nHgCr!)h0|uWAZWE{DE1{w2ytNNxpgBz@JW zX&G~$0XA#=ivjVx@f=`s+J~13mjrUs&^HVghAU4eKU`O&_@y3}4E!m3tS8B^C{8rV z0l<;>9ss#AIL<4&=YQ2@M&R9+4uCGRlJ;WC9e-Zjex!XZ$-5PWysi7OgC2XxVxEU` zTy(4>QAacdk;deoz@0ws1%Hv`XEQKp8(i@)FfQMdA zr*HqW$x8MykaBTp#HXiux@&V%Vh}MpPme9Umqrc)8wI5YOO%$>!W(VZ_PW~tv$d-3 z8#Q6~-Xj6YyB0JZTd^A2y`t~$Vi%(g^YGM7Eto`_C#DezQhBxcUr1)jR9KRt^mPM< zSe%|4&S09yTOKRHwN?1!mrJ+h4@VCRzgzEoI2|GKi~{!9_^BavDz!(2ZArE_nDx{MrK=qAXsa)uIrgQhB0?DfF zfp^^M56RV**@rILH3pySl`!*Ub8FP&{4BBnjeFYd#d#yX+LNCpOapg;AL1vbtsC$?$`$c-# zi!=_iPr&!roOesp$RS3h4_I2WsNCb9Tjq~z6B{KscIMcNoZF#enR9bnUBi_kHiX?Cwco`*a^rhz%sYBJ@V^1br9m;R z*JIvZ5ioz+Gi6O`-rpP9rhg+MJ=_SJUUSY->BnEyM1CoN7&99tdb-78T3l029yK z$1|!gg~!N>MVc#kzFDs_mak4JkAEd9mgXd2_0T^k~i%0Ah*obZSR3!yBD5SMC@3VWBaF?$5?#O9{X@d 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̓^I>; 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 Date: Fri, 15 Sep 2023 14:01:05 +0700 Subject: [PATCH 042/298] update screenshot --- app/utils/runtimeCheckLogs.ts | 6 +++--- app/utils/screenShot.ts | 4 ++-- app/utils/uploadFileZulip.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index afcbc93..e749312 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -176,9 +176,9 @@ export async function runtimeCheckLogs(folderPath) { "select * from log_reports where id_file = " + fileDetect?.id_ldf ); - - await screenShot(fileName); - const uriImage = await uploadFileToZulip(); + const timeImage = Date.now() + await screenShot(fileName, timeImage); + const uriImage = await uploadFileToZulip(fileName, timeImage); let listReport = await getListLineByItem( logsDetect[0].filter((l) => l.line > lastLine) ); diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index ac305a1..6beb9fb 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -1,6 +1,6 @@ import puppeteer from 'puppeteer'; -export const screenShot = async (filename) => { +export const screenShot = async (filename, time) => { const browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox"], @@ -15,7 +15,7 @@ export const screenShot = async (filename) => { await bodyHandle.dispose(); await page.setViewport({ width: 1920, height: 500 }); setTimeout(async () => { - await page.screenshot({ path: "app/store/screenshot/"+Date.now()+filename+".png" }); + await page.screenshot({ path: "/home/screenshot/"+time+"_"+filename+".png" }); browser.close(); }, 5000); } catch (error) { diff --git a/app/utils/uploadFileZulip.ts b/app/utils/uploadFileZulip.ts index 7e36f0d..1b96026 100644 --- a/app/utils/uploadFileZulip.ts +++ b/app/utils/uploadFileZulip.ts @@ -2,7 +2,7 @@ import { FormData } from "zulip-js/lib/helper"; import axios from "axios"; import fs from "fs"; -export const uploadFileToZulip = async () => { +export const uploadFileToZulip = async (filename, time) => { // try { const ZULIP_API_URL = "https://zulip.ipsupply.com.au/api/v1"; const ZULIP_API_KEY = "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM"; @@ -13,7 +13,7 @@ export const uploadFileToZulip = async () => { try { - const fileStream = fs.createReadStream("app/utils/screenshot.png"); + const fileStream = fs.createReadStream("/home/screenshot/"+time+"_"+filename+".png"); const formData = new FormData(); formData.append("file", fileStream); From 5eac095a515673ad8b5294e629ea81c422d25ba5 Mon Sep 17 00:00:00 2001 From: Joseph Le Date: Fri, 15 Sep 2023 17:02:46 +1000 Subject: [PATCH 043/298] merge --- app/utils/screenshot.png | Bin 109173 -> 311637 bytes screenshot.png | Bin 52000 -> 104176 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/utils/screenshot.png b/app/utils/screenshot.png index a715f7b4aaceb8d1d3db3b4bce7714d4f4d74f75..e567c3a6991ac0b006fb3092bf7629a6fce125af 100644 GIT binary patch literal 311637 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 K*8<7A#wy~igSNO+sTuC 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

$^rOIiwDyu2 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

OA^wT8i(F> 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,cv~rFUVV!&9+O<2_n?q75R9~Hdwi|N;IUl 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

|z zS*4+qXizb(mzkN5B^09L{Aiiuaejn_acY$|lchsEnkWggZWHC+CD5H><9N1BPw;wB zBDJ*@S@Nu_Q1yq_fw6wt9iOtrgZ;!#Sj7m?(|}+@PtDjW(_||i@?s4SpwuU z&xM71CXDMozX1>hTGVu%Q}a=8v0koB+djjG(H>`8!K)ytXs6dFMM<`CroB%Fi%HN! zBIh>M_M@vQ^s@mRx0SimRz2|&#ww36Cr6XPWrXA^C4Svn%;H6wb0^p#C*y%TgQ8S&e-Nc&2dDcgS=8%QsC=xF}aF)B=$XJjUK=zNh0azgx< zlGZZ(a{dQ^EOqnEB*p#MRLY3I0NE|h-j2l|`rj{lFFfBczaxD8gPS4KBT&WYHaCAW z&Q0cyI`7?i&<5P=aRRc)yG9IMrh&Lmr5ECZCOUb*CuYNy{bms|!KX`0_ZP0*o9bQwu8O=fVM7w zOpiN}0omq0vqFMr85r!c+p$vR1J=W=9}jQ*))IKfr(|*|rX#Z7A|})pJI*rPBG+9k z*LCBKe?~30qHkIxU0t~WZLzpR$M||;#7qNIYM%RwhlJ2Lgec1L1b5Ey56v5&ZDQK~ zqZRNhUI!Z`M83dJl9xI2q;VA&0vgUeQA-k+~!xzP2j32<3&BO;e2z3Zbs zSj}{HQiggVoxsR!{g&>E9}b=rwl<0YqAg8}lIgG#En6G1OHvj+bc|O9+&1dHX5+6) z{YZaQw6^VfdCGJZLE?f(%h^W|*7q!&prDND@wvGUHPwn=^3j4iVlpnoR(z$*2OgZ(Y@ zZ*IYa{PMmMR@-+@%0h0|8tKz338ur{CaweJM)`a~r0G*dQUiyY6x&(rz5;_oXn1z660)=c|TC1Z+3>Xp&3_8FYol3eW0k9{#UZ7 zEo)CWX7;j0WdoUdz^dDeH|9ss8h|*39mSmCNDyU*{>=K;?L1^{ww+Mu*dmlKgP7V+ z9i7I>&Dnc)^v)gdk%X_ZO`t)TiEmw(;1+j9MQ@0(ubq>CT@1X|fllVigWJ8X>-N(~ zGrkN~osQxpdc_v`9jZ%`LsG7htm@9$yh)?Sp)DQX+*AjRE;U*{>OV&^tE0SfDk?Sy zT?rPqrD|)1GDeMzd?&WPdIvBa$U+G;z$)W_qr!LO$5XnKMA_rD?tRFH9`qP-cFz%R zz0?~=`6MJx_c&Chm9~bF!dPlYqbvEA(URNMU*lE&1(N*B>0ZnK!C%d8M0haGli|7< zrGYv1pu!8^hyNa%t!`ZSL`r(aSF=b99~HXY`mu7(s3puxHv&{hx*L@$V+cR_k97V# zJ$*2TO@Z`Y(Mi+GJ#)~h$R|~|zOj95#Qc=-+(q-iIJkq%+w8ToWowOt50G>(9PfaO z_>0Wne&(@_bzwii<+qsEPUe!2O0KFHGXL>%2{f0Y+!#zEdq zx2nk5s3x+k=CdGSZvo9QtjY5un2vQL(1i-w&`?wWd ze|}e35o>AdLLMgFNHw=LUP3BA@c$uD8z6I)yRq)*B8-0c+lb*0cuF?KNUmoO!~1gD zoVB^|ez}9@m4HLjxevL_A$_~BWywzF3H{x6$q@^xy35JeW;-pE-7|Q-$&W6N`1|^;F#4CKWVqVJg>07y9 zXTO6Y0jh%)`?C&O0n02Sfz@HPt=+C>+-bWd&2*K6cB!E_)A?&D^t!1+!UFeHE5$`X zmJdnw3xye1GVLmM-5pfVF=ql~dkZ*tZ>Ns?MaMb=>N^r+(xx-)S)puy|$lMjRTVohRQ;6 zk&B5)YYZNXy7qE|rg1l#*n|%?P`%L^SIs?!`mM>IGYr=`!Jh9Y>gB2cg3w&Iixd7* z2I*id#D_nX!MBC!dU`*lL6-o{&0C+mBRPPhmtP4e%!Ur8B#yQ~Pxj~5Pkx}QFcluZ z#;FdMDzkD9$0&w}j*M{A-{`+vy+x{((?M%i9ch#Ds^~w6y$; zzlm|+xMZ)_e0+Ic3vy#u!Y=SJ{QWA@U$Ex#2xwx5B&W?8Xyz)9sb#V-f&rLW?^G_Y`An#I|QNE@Xy8Mw!{B@mVMWnc<$UGar!{LqUf%jz9 z0|OV-gl(wOFGg=CIiIhP-t$n#)iEq--LLQIdDAXf;u`YsLr2v`@2m6tf$+}DX)CnG z6rDOW4NdZDZX4zT+pg@LD*2&-4Vx>K>!eZV#;Y&haPgce@*Di(uQduho>8q3W{P+@ zeNL|~4lv*OG91S7T`aVj0B92$c+T=n#c?v5m`c6d@0}nH;T*>eg9=&b?J93$6k}TB znPv6?dT@jdWyOWNm}lapQgPoIVZk2qzI9E3LX%0<`YgyoHNHlNb{<3R6edH4HD zswot7lv%Y7sG*xH0oVVDt!BLfigpjO)$?Xz>V&I#U%qf$pmcbdOm9KmKGFJOBiI2E z77)v}uH4o6wKfr$mM+IY<>+AkU1V{-^j!Io9#a>5cM(4Vl5sq3rjy}V0*X3zJbMQY z@@(RMyzAt*tpkX(G~s^#(;1a_#~L0I-7I1wt@amK8}R+F8rtG>y!iy?sQvAln|X5r zvqehBwbKU?0dC<(!rMIgpQ%Fus*m`WEM9p(*j+SXCz`^@s_aAQpE97_@smn0L^aJCbF@(G@M%B<+bM>Vu-zs)BuW*9Ijq}BEvJ8!+m!7<>tt7w z>XM5`sTUENIeJ}o!mtNh;9Q%)md-KGs)X1=5yE7S&axocA+n-*P~w|1TP=()uUx_| zzWBKAJx|5%bZmStw_~mmSQ_nSmXKG~+J-C*HOz5K_tpESlVUQXa>#|*rdfuPFDG=g z*|Iw=kdGfAyq}2fShSU_lQ&A7_|;J@HXfuU3gk2v^DB@rGu1av6D{Tyv}L%Oardhh zq(1V~RW(JzTy<&vh%bvZvNID+%iiK}}izF2= zuVBff*aC4o3}`t24FZg*Q;5Ob*w4FWQ%TVH{)nTeDhxNF3GGc@Kz);~+D@~Ew!_ir zjs3;RgE(fYlf@nBxk^ZvY9+MW392+ahdn@UkLKP6(5&LQcFR8%F=+dCU~Xrsz~r!_98O2UwvP}MSk|Wg7#r|7&={H#+R!<6%P9T6 zxSgofKhjK_(_em@j1{i+I~HVgSpFPJ7cufpn&n-X8D&oO0FkM^{v1>AyEde4)3A8X zY$&e@LXGB3CvSTSn2RV3Cug-O+qHR|`P5e8HM7w*e}aRqVye2wuuTK0cq)~%`3z0o zIjesUdFe>CuGA3EY8Gq>RFRxus^{TwGud{dxkbN>p{q{KovsQe(}T2Fr-*mHa)!(- zLhyiul$*Wx1*xCz*`FTHX3#b<&gfO|C1gs}jyV*F)t)H3B!TUeeBG&F&>;`U2mF@; zi=3KM8l{b;$sz)y?NxI^4vI}26%p!Y8AU&Funf0fTtA~~SYo(ExVhtMSa3r4{Q0ob zE}QW19SR_iYX8a3Dl?=#V%J}Fu~^J%UX?oqLm0xGSce=ABx=4CCkuH^s&^5k8bU#q zJ0GW&Yf>1-J)#)U5NV`xZ7FLtaOL5H2=xddyO6_$t@mrY&TSohKLL8C-0Xb6Rp8=H z@U{lwWlR}w4~}8@f@_N)Opl}&)OLwnEXC&y7JRa}*MWCKwfF3H5J5d2JW2iw1pkH^ zx_^GZZ!Vk{$wUvXMgW2XJ*m66mh19Pz$0`_up~=QTCx&J9f6i9Xq2jWgcnPXcbCUV z+5`G_{QQ1v_ZU9D_jf1`Ph}E$bB_eXZ#(4~9$N9U0i5B(Om{EOiG|LjO>8mdFdA&i z)@{v~LUgfA8t@g2z>`!Wm@x!1VS+hI3=W3(?pEkNCE@RM|91y^OwTf^sPa7Ps3@?N zudb27-?!l-4(p_i%u_^QZ3Az8Igz%ZFTAAtf}CbI9`6xHnpJy|R`1!Hr_1Pi!hV#J z9~&6RCUqq9!2q%8X~;JGWALFnu5!cqpSk3ktBfF7d35$p8C70e4# z^~3f}N<$4jOjgo7r9`#N$Od}c)V6jmr}eWEDll&9c&SWtogpLuir6w{dVG=iZiCgcN*8!mU#Vxd9Dz; zCEL*BxbFL>zV*5dX_5m2m!q9Ax3=H9DYaR?WZ1d^x;`NR?tfW7w2@{8Z}uf=PR&Dj z>HRxSPHVXqTMp((`Gg91nbNJYs3JhOcdWhJ3h*zM_}COGL5W_%=JERbgGeBvTHU2>IMl^{f*77X2Om zr_aFbG+-yN@C3Gxw6Z{hCxwXhGK_JxSC=P`Hsk1t!DYuJL&8MR$DL(uXd48iifDE# z_v1`?>7)A%<6tVoPDiM!TfEkyL-p4=BzrE%n|*fEn&+?d$(QFXIf=5z)E!$5)c z13gLO5KvRzzDL`Hej!Pdmj+v+El=bJ@y`=`J@%KLWYK?s)D2?qS_k?=_d|^@{4*jb z-+fqP^;7x1!b&0(6(?sRMz_H&wznlxnBb;9Mq}Te+^^{_x4X46YQPkCSx-~h;CbUy zQO_m7@V2||QDe4$<;?|~H;7jbZ`L^HNHxash-jnS5aK>jW_}iV@2AzkE)Ap_&q6_m zDgKRaTtOXTQ4LV8{d4od3p7s6^En1Ox(aCsWoe#;j2BR{`M+dg9Rs~;r7waN-A^E+ ztP$g&&?cvR!h2FGOQ$^bf}C9%Gf&q&Phf{N?dbSfgI@Ml_g_;Lv$F6nV&aJ$;tgt_ zwV@0xdaxLKML`J$dHty8e6{@K^+umo|;A@2%z8LM?2HkMLUl8xTRM!7VBj#Wt)WBi6%9H!n>iuTZwMOEJN;= zBQGf9G-udlfQ$VeW({gEXIH$QMq*$&IDkxAPZ-em^im#W+a&gOj78Q?4@4B>3;jFB zzDbbWcm^5Np%>0OpTEvsKA*(Weto#Vo~HBi1hrV;ndmF8R)z>-{S7qFDd>dS%Xy*qR@bJ=YjWe_cMOpR<3K%kM3YoE9l;_~W0e zL#A;b0RU1N5-Yjq67&o$@2wa`ojNi`4w6;t_@rIwH*i2t=IC}mp7R@SnTe0#1Rj$6 zj|Qic6DlKfVc@)sQOjsWv})NFv~RD}NtR?JAd#T?w;d;)TZZ%dP;h?L76dfP<(5TD z%GNW_`!c)xwclG3wplWb@e8jKP*4Sq)wu4YC*d8j| z!2DcW;a|05xU8(&+7BYE@3(lXlHPN&W9trHcObE&felP}m|ZJooMXu@Gh>M&e}N`r zv2nciIB|oGkZyDoYJDRw-hFyKLCXO?;D@REYK}u1TLI0Lg=)Rxjq3N!F~G=^w{@r) z2!)R!ts)jWrz(=$vN{@bw;2<41ftKFFbb@e`Z&;Bx3YX{b^m_B$#9DH71Ww#LNE2F z+d#oJc_`O6AP(gLxie%1u-9*4FDu)s!*l%IBibf^EzP)1gTD)juGf? z?xDQ0r*=S>Oy<2vaz|`uioV&<4a{(WgUhMrV;oGS%Oq0h-QZoxCUbsc@-QRQJ`Z)0 zJJT-O%-oj^6+qJ1gKtXaHB`>E=6TxL*P)qAe8-g|-q7YWA=`SwPj)W@tE#Y*cE@`a z%v51}q`yc)J96@118%)te5?#5@(cY3s?;6EeaaEmFMCSjzbCtBw&fF^(-$xt`JCQ% zEUK0OGx8r3>puKiVy>I&P!0QQxyV_A;=a^};$Kwq zX?iU-HAsF6(`xa78^%m&DMS>i5wZ)}ajXiSA(#vu zcUnlviLYU|(pp7K)VI(`@=g*&>J2pGN>sSpS}&k6dAOM#M)`(S>bcL2KtV4TTpVdB zM?4u&4-tEL?w>xt2T}YpkKpiU9--W%M?UFt!)(@@f#t#mn(BsuIC__7N=*c{>gLFE zEYWu&gn+>>9rpe*c`&8@W%77l{9jBSePXt*tJfnq>!|i_t@}~B*T3|jOJ!ICyPulh z51&ZVU&Dy?abMyP1?e&MG3!W`iWr$ZTbJ|9I+I$)e`DhAUIke!!;E^aCa+1RP+mzA3BMdJ`xD^xl4BP!4Hiu z@34mq+RSc<8@~F(71299>Zp2pKzXu5oarO8T9QBEP$fPITtcxO>>Noz$jFpB*%CJv zk=Cv4@ZLin9_4-{p60ak?CE}sUcanLP<;5J*74(M;^_GPNhmaMj}A&s)|ej1lALdS zL+7C7h^0P^+g-^~;>8E|Gm*7b2(ru`>GsK~wfu*oAxIHf@bIL{#zFwSYCS%jwd>{u z4#oc9p3JtRJJQ>x3Odk2^RCEH>`M-d6!xyIbL6Rw(*o2;o7c|aUs7j`B$owrX4OCX zVTM&+og-5TftqE#mo+^&*_L0@>IrO*qLtcKw$GXS7BC2-U3nO?iIV-oek4L#Q1C(4 zP2Ql~Gj3+Bs(7nz@7HL6Cy{ElW2Oe)id&5oi*I*J0T!lK3Non?GC7nPmK!r2&;eZ< zJ9Z=4)qzjc^TC(vJh%r5IeBXN{NmWTowr?AHFeGwENb-O?qy5xbNf~PKB;+hQl8*s@GgU zaE#(AS^~b6NSmzMJo?_RJw~ex+rJdX^b9gHLAo1Qjxpl>GJN!T9Y7Pb`Y{A}kU>~m zC;f!OR;N29;VmuV2Q+DsJ$nOzL*EeZb4W{$;Ld#E^z}Z>(Qf6tgJunu&j3WnbaPle z%nH9fJADZ+uh){ba_rZ*Ul}ww%+VJrhy6z>9wucMOwK4S8J|&OpZw!T=kP&FTKntD z5Q>Ow#NscK7BZasTYd$*R$EB@TYhCC_g8);E2Qb69s2{UX@is$R*+Ofc#r4hvXFfe!LcE7OX>K7km>#4YkR!bodxk=O&E$J) zN2#R$m|ytF(q&CG5e~8CO3MI8BU_Nf-A(xvx4{==(*(Qk2BP;>V>FNFi-rvGp|n^I8RrOl1We z@zbs&2osvSCIiOj@^-SwK2a~9mXHlEuY_jkb;FB^uqpL6(Satcf9_%)^GNbks z^7OOCMsC$?XqcjyES-?gvbfWl?BBdP=u|lvr)z9IRQn^^nc@78DqrPyjtR9P+zn~0 zV%TqQAK0g*yjFO5{X6=mi_20C3s(hS=*XNux^~kinCHRms!)$|f1{=yn0E3t<*I%7 ze{{#YDc$fhXF;c%J7~-};&dti2nCXt6R|@0aFkbvjK|k=XXT$xG@rbE8&(GrS-C<(n+=~xd22x* z0GGq5Xm5hDRjJP{jyTicAum%<#e$N3u5&pNwwaC3rBpzDMifmnP0VlZH-xnu)%v{+ zYHpq&&1(Cq(DGb!lJ0X2z7kAE&Xe%iX;${P=zr1y;3glONmSj z6s=g`qVkk5Hm5ZTjC_k^$KJ=_h)e$Z$Dt+4XLfOV``JR_Q z!hht~bTa4sW?$ha-7X0@+H=|0Bg=XTMX(mU{v16u%#`C``Q_phcL}t~o5Q_}UDtY& zUpkHDs0*?+?#P75aAr@14zeo5)#VtdTKu&45Ioe&^dKikkW5b*Z8~0e>s@G7)<0}$ zRRjBb1_?_eIL4ApnTk-(f?7B4bIwL|SSwVxyR4r{^>27|BU|sMo4dyB(fn8{;6{+i zdrxu83US{oA`8T>|Ceb)<4-j8dUieAoT7UZxb~`5y|A~|7^Zi!? z(7FF~%)jAn|0Aw8uAa0K7B@*zy_l!n?p0(`QRK-<8<(v0fV6&bv<66BljK}!ct>s; z^yo|Q`_-AMX{s}kOp)+fVDBC2u+08$NO{%&-mq=9BFB*Rj`cY{(=u$;#33T~Jh=5u;u0EFzB@IZNC@p)+5Y0J!&eZlcbdJ+t!M}(*$nXYz`CZ} zIFd~ZOvbf3wUeIsMFR@MF!ugKV!8gkOUP0#B~7g)(s{1+H1MfMnRGQsoAsXr6rwfR z?vRK6akZXx!*wO<}?i}sBT@KxgX;uhpYORcT|v)N048yrp$ zp?{OIeC1h)yb9X<3>`4G4|vlY(+@&3K^jc;5Xu1msPpxYKA;Onu^Ow0nJbBky4b+= zYg5->twj7ArWQc5<^OM(+L<0ZQu60A60Z=#qj~+ecJm-5!q1bnk(+hKZEL8-Zo+9f z>aD48kq>Q-&B+Bz#+HMZq5tQu?~P6e<;E;(r$KbyNjZxjlA?vkVL^4Z8lgo=m|5W) z!<}fYZGa<*Pwa{DgIQit3FBMOg%)6?1TjgU_2~ozF?FAy&z6U!Uo?)C4H|_s6J{Ra zVc{&~UK05v#>pi<YUQ^)LRi`!1eW*Ph4**8)K zmFj*`wL#_ozp2_r&wr(Anf3n-RU`jj?7eqXQ~%cPOOv7?f{4;p1Vwu9O%xkNMCrXs z2?3E#LRF-LNRz54MS2S*NGQ^)(g_fXfDj<`781?^^{0FP_TKM%&UweUcieIL2X*KG z*IInnoX>oo&m1Tzc_B)j``>BSs+!FQ-Htt(jkZ^0abKbMj>zCMvwKZr+I#iVElDHd z(EZl6l$hBz>dVpxNGTOuC6H> zDfzbzo6~=9xIvUa1f(8teXK(`g%ciUxyop{X#g)b2r~Mvlj}vFR zPbOl=?GEPoBiFX~rF>+Y)lrO!ledB2c|OlNgoO9h;!gOqqc)JnCDZ(@#xu){_YY?F z^}V&0=GPEYS>79LMuwC82&l%&;Tr$0J=-LX#AkPoQQpWqVjjH?k%zvJxs!auA^e;$ zEw!!7ZQR4;w6N+X3tdv|7y(nt#W#flE+I?JB*IJV(T<%1a?f76zdCWM)c)xSC*2Vr zXat%Y!vx-5Bx4M|Dxk~ivC}b$BI5eiU=+>17P909TntmW$f)mUYWI>X;!)&}^Ab#< z4#MP1LA{Nu^{Z6px5AHM=}ujh8Qn@-^)u@`Q2B5W0R&zS3zbikXDrflAu;QPNy zqJ0S#I)c+;z*tl|UGNG0+gMCw6ELaQoH!l$36ZSipe$#y*;Uau3xT{ z1IS^S1;&0?`@(N{|B|?M(dbsFIZ+ueh&amFWT5vhfut41cg_A~(%~mm<7aqS{)(b! zd_@`a$nl67*r#2LVvj3(q@P#R(C;(}kU6yPtKzt=hY;x8ItrFDkt0tt^gF5?! zx6lt*j!p*RB0g|l5}7d8t+{SPe@*|}idOkA^WVG3dSLacKO507ES^kTVN7GnY;lF|hL4u(hnGXp}y;enIPf5gFFa@8Gx2R{m8hggnwTF~R9k=%*Z{v{T&+El2DMd1kyX_)Y zGB;ndNlqv;?dhkdgkCf-kL`i{?%@h8t0zja$yqHD`v-1|Ypx}0zog5XY}J5v$*~k> z%t2sj5d7*C(8U=M1sUXg79^6MHOy;T0aPq~`v!Ha_lA-0A1W;K$L$P_kGod80ZEtGffRn>H`c2Arv3_QQgI^S zqK};{<>PFd5-(^TbTr?uvOAxe7@Gj1oO%=x{>QtMK`HS#AV<+9cxgbcVpil4QB1eX1UG3{pKy2!y9+=ypp-S!hl(-Gml!ylAaTD-Z`D+F0XNLX7O$JobC_yJXX%1nd2>yjNMAx!Of$G zV-p^SlIhN=qafQ9J0N~#jIPM#x0}z-$~{W|>K$%$>{o5=oaZlDF3{e$Sw7gR!Xrb` zH8l&e%6q_I4m-MSyy!EB6iZ=CYQC{H0&j2LzF%8xSRrV&UrU|qqK!u74@rGoY8X7b^FjT;^3-&*b{K0vg~>0|O{Ug-ec;lbdBp--p#uXoD3NM+5uArIiLDL3_H zspt9-O^O^W7hF(P;rQ(OVwDHY_)qx^nT&0^hgEgq6;)~0i(kl=UWxWUSIosei!j2Wz zZWRBx=jk6lK$yWSNr!WR*gZFP;H?#>!+X`ywnOZ!EYCfOgaWMuAg=X-qX7Fq-p3tH z+gKLl(#Wuv9%n^U}EkFdf>F*KTLVg zHF3CG=L*bU2gdVrQ6DWMX6hJp>z#0e`QPKamoJoUPd&KX*DwhUmWtzJDpf@PbO;b@r5tjn*Gl4s9%Wzw&H&qz;8{cAe~{e`Sl#D98L z7eWFG9UYjE(4f{7N4 z1Na}|eYRI7Zauxy!?dei1f}k5;7U;{D|KKR3SFEEd)EDAu+^elL&&;J@Wcsg-ZFrb z*Yfbf3E^%9#T5m~(1sC?jtip_SMxhe=J=mv(ahXARq+6K{7eG^R%M2Xy$djn*sq*vjKI zm`v;_@0}q^!liGP^ZK;9t_l|bp4DM~IAvTk!wH8X*k}sq%7G1UyPidKKO3HP2;4II ziH8Pe1ooIjRMo(jTiQy;+IjGvq-vtn$POSaX~5%Dk-(f>J}#OGfqHla^Bd)_ zE-wzq>F=P^mJXSgc}A0mEQF6%=^d8Wt1EFBfVK1{fIPtWv-;fac3U6z1uc7*O(IMa67IrKnPW z`km7YzxB%Jwu^mup0YvMa*~O~diROX(e+PI&f(_B0bL`^zQZz ze5w+fo3%`=(0w_Maob`R-UtY_A-FPoqA!KTpvxkbSFtD#Yk^MKNd=oTyHeXQZA4D7 znpLPOXc=FT8j^j#yVCTPIo@x`lta48gZ@oBCEq)!9Ox!;5BNE%!6tD^TXhR!4Hd#$ zGgM^q{sDq-8pR2D3Rm2uoajT~VkcE|UPH%IOrVVyAhNpOb}JJ`@9- z6Xo;@V|11@0ZRCFJMT-+FY!F%1s(Q>wHsA%OK{j3PGZe1dhI#7pF zwMzG;nrDwpYRi||XGa?KZ$?KG+KaqTjjk;cil}bKJs2v@VHIec+Y3FnQpmryU(!i{ zN3*59W;!s{wIVh43C83rU^EXr${TRD!9!&I`GJWV1<{^!o3Bnbbbh-h`?Ae!G5{&V zeKp)#OS#75P_v;;cxwleY9cgU|B-EuVLMvTq0wk%jpj|_9#p62`@@RuJ%5gs>t4Ei z?X`D_gOSlafg3>!Gr}{~`(0_u3bU9nHd}l4i;Rx!_h{?T3pe=7(6t{`{J=2Ytt<4g z5kPp(%$3mjg};T+0cP7_j%>qwe7rFvtZlG*oWRboi@w|#Hj>iQ5n6KC#}!his7|k^ zja;X4gr~_WDh1V*cs95I=pu2OSAosD5zVdiqn)v+zB0lv32)&Mw#oR*PBAr!cRVOeXoFuxLp>;(*22rElX1 zZk5EbVd2W`_SSLUi#zk3^k=Lb;lKjj)*55Jb~|3Gi{bM323-<7&z!&CIc<8F%Crf7 zUjW;gI3(@&=|y=yn=qeLr@7QHm|SieKfg}L#^Y$7jZU?jg8|0H8dkq=A#q!;;a?} zteaOU;zCapiL!oWU~pja(6;h5;3=+g&lYvZe$!OaXIOYE2_*Zo9Q_4B8+_M=eU0;1 z``TRdigYJN{4$zY(qA3ub!b+1%s3I}sf#^_%5e@V8OVR8PwG?Y@#OJ2c_Fdm{B>o$ zs=><{V1phuT!|810J7AdD2to(NH{l>^_lPfebdt9`VHmB{nu%f>4%>))U_7fB^tW` z>cGTqi+&jekC1+CfBDR@m}KRZY2nQrRSqRkNgWGar>UfC=Q`wdJ=xF>*|^d^a?bpu zxog0w=MpT={KfGccVxdr=`xtYsfDUnanmc6ek=rjk&bpf6TMP%1G*|7`L#F4ywD@> z`23lK>zFQ$Eqf1cV3M`wBp;{Lo0-SzIyEoi3M*T*iPi6QhFYFoB3OyqSknm_SMqE= z(7;@3k~GD8mF!j|c$`i_vp#iL=?_T0FrQ>x72jhvgI}m`Y(0O2eMZk&b{CGAeK4F| z>3z44%F%f-r%ZYje`e@L(u!9Y8Ca`KDHwM@(zf)oy;}+OZUw;)gT|Nn@96}q5p0*! zDynWd5?^7NRaz206Xue;J~>2>SCXR?%KSwV2omfW7UJ?Pl8uUO8*gl@4Qf;Equ?HE zPnRvNa5tI$&?uyRa8IxG2;}DAPeOJTCvt3&%`!c*$T~YBwlEBRi!n2adr^)d1a~OPdZO(ve#CH z&z@6VV=Yma8}xFP3^h`=uNoklVO7%z(H@(Ejpi zdsWIBccHJKMlV;GsE@Ehossac=f)V#>i*ny=(QEP)G8ny_k0uBV)4!8#FJ1_i5SN; zzu3DP+s>SVg=&gbMOiE8lYH}umsr1!D=~BA32tXuk!p}~nW#LMNe9J>5*5}Jn0x`}lFjOFZ35+0Au&iCSaz1HBzW`@4c-kW;SPkh&V$pI_r zvHIu(Tb|P*_wBWQ&+~k3SdTH`+QuP*mG#I&uSg#(M3QBbAI$FURq_ezJ|gN;ET6BU zn5Y=y6cawG8+X!7ez`J|>*IVu1F0&*hIL6#MEk}00UJB{xTWonwNU4&J-0g!;&uH! zL96$syV+b>;Pqv!?vG~6ChrolpArbD5y~QQn=;jqOzRZHy;2;Le@nTrwVZDg2ABrYg~+5R6NfQND4B zDiNmW5z48Aq`ijkwQp?LkzJVeP^H_>E={?Qpx*P;BdgEf<=J}NYPS|xH(F|f2mnIc zbzJ7>x<6y9s)SFs8$bg9IOT79X&j0ZO)c%X^HYVh`1O zU=dWav2&Pt=zhqn@Z$u1W(A(8`7)qhdhlVvos^0$EgSC-4J`4duZUlkn|t_3>Uk=I ziCrv{yw)2!eaI^xD=9T33=kFa zBdkCzWgzCWaNZozIjxZ>SR(GBoqh#S-#x6TGCanl6|15rm-hL;Zt+F{A@W^oRjShc z@*JqMeNrTdsXW%LY`k?i?*M>w%u2#mWmHrhYJ$kG`@+{H}|-9YVq-NC%9*^ltDLnUapTRYhs-iPc==wWS#Ox{<(A)RI^nMxQ% zmU**2ryetw+p;sZCF`NZE-rE7yYt$Gq4pMZqcMK{iHrQ+T+;2_B;a&mB|8lN6+n_kLG{y| zH?u{3*`6~cbM5LsIHmF?b6hs*Y#~-_iqu=+W>&1as%*V~N7m7yE*s@NIye4QBIe3B z#M;mCa`pg*6;8-@{(QY2yZe&W8OY}`6RNJzBf`XY!nH%LpS6L=SXTT$r4et2ALSFD zT`6e9uCh9h&&tWL{XG1R{;l9qwDHf6@4{;oq`v0@A4HD7EPZHpIx)p&KJoK`Fh>4e zkmDe_>^A58q~)J^N7ZIB-*b}^O}G0)g>~b4EI%1^cdTdbK6jLAkM*4~FsZ8XosmdL zli7cz*qssq;eJ_l(>ecSLmL7uVxMty2-?MYhdhvcEDj>A#=9ERws$;X=BBCH>;hvV ztCrz&c(h{H3Ty<+#wLJXsi>`nyKL!~cRDdkuyackpsIm=)f?Ev&owj2W3l3pieo>p z-IRFxnpAnmymi%WLf?jbN)y9oj}L?8OA_zaSiMFwUj}p=dlEDa%M4fjJQI$tA6qye z5~$26q8#vC$qJpvF3+ByL5FNs#2I>kkb&~>^qu>>Ww1Tf`2W@X>I0DdCp2tNVN zP>QHXV`Cp+wBs(xNWZS$6Dty6%<#>i?tUojIYq&BGQOH;50a9I%bIIlP8P;_d}p7C z*G4+5d}J+qXy$)~2f@U7RyrYrg!Ar`eh?|`{?A0?tK2^ljl83AmQvw@Or_|Ieb7sC zeNdRb=!I;OK|w)WiToX=NW*>};KBGt(f z?EZ2qkxoH}MV(-T^lnt#eBSAvhlnQX=;n-qu#kgWd< zHueKXF_cZldh!SohQl(YQ$DIvAeZhCCv49XJ6}oR8@~5>^fxVxcIw+mi`%IqT3BBR zFYx6YH33>!Jozity&}jFmg1x#3A%hu`h4GHQIVQvZ#(t!#taH zmy_zusT%kWz&O~M!M?2IDgl_d2+&m(R%7F zB&7d_nar1Mf-%NoKjew1EATY$n$6FNnb4J)%Q{&vtrh565^f>!z6JN9o`E$E?-^@d zBCw#YhC-J*O1 zMZe8B4o-=yd~%YLNFk1Z&=E=7+wqOL;r{ItbNWcRSF~!W1Nj~Hd%+Kejm>L6$0k-) z@{?`rc8qrG^kB%Ec8Yz+Fg~YVIw>~EMCtW^`Ks78l;bZTT%bv9R&ot18&f%I{TNtF z9%D8(Mt}y9+(cfUTw?FnznO4JZTTWZf4h)vPIplwSfu|loA`ThIeU=qJH zgw7On?;KR`Qv(}*?=otx3A2VyU#H$hQWvhGLkFOTm|E}9LLYpT&t4nb+R%U~)O*|Q zpk-G70KIi`C)e&kT5hufN&U7$Lmg3W$US4ZezI*-Wyk1`yY(H&shu9&6Y0`FnxfKc zDv;4;WR`C!5uBf8tTVEYpV#b}Q%obHCdt)ry?E;a31C>t7%E|TKqz*-t_)29;S@}} zLeA}%V~BXBdUfnirZ?+SFQXLI#TJz#s`oenx|u5~XiLBLkm|iWs5NdYbh3*^bJ?~0 zQvjG`W8LH(%{NtAp7WTt#6Y`R$qaFW;EJXl457RB?(aBRNkcOpV*e44XeR(450x zo*6dm5jVQ*mi)olJN>hT}lZU1I;DhS>$e zHN5~teyCj`G1>f8U{KHJKMwY^WT0b~hQ9PRny0U)ihA~%*jJn4{gQtR06if{)uy{v zOuai-U&wo4VIQ$f6SnYjJe@y=-WOAk9{Jo~T`*tkZDhf@eS#?|^Q=Rv7>tMB!_}dh z_4V^bZBmdUa*RM+(M%l;c|QgCejto<_{lv1vK{@yRKa|{S?SR5h5jt^qEnUUM&g?F zM!&#(#&SXOYzSBNqMOQ@i*my2B+@5NbYt}LGHWu#sURWRkeWr=&>9Af+&`J6=ub5ajjI6=eu)v)dsgd-Pd`bja_7Y^*pQ0;|1}VgC1JT6T7jMMVUdapA1bHo5hr@O;*=R zgvy=R*@?Y6M^}0dQO*ZApCF!UFW;*^bqM@AV(?AF?&@g-bdT(y!^2jDvPw(Jg4Q`J zVOx4LI!)d>0pj=jy2`2jY$RlyxKkC0o34JmI&ao~+kQJhTbTGdZ^`al-Fw{?$g0r&klaherL!UuH*|A*`cwNoLJSgZR ziWyKhxC<+6J#HhrK&PvS0fq{A_;Mp=5=%_LGG z8%`6E#vf{Oz;5P7xz8 zg&+p89@)n&h}Qo2Y-xM3e4o5g;U>;D$9Slq)NmwfJ+>B6+wW7-j`(`mr^hc+tG9?9 z_=s2=fZ8rq6xe;xpZTqI0F5tN$Ck$eqY4)@88ErxDbm)9+Cs&6X*tz^^FI@#inr z(`P9OxXItL!fC8Od}bDs?&}r~-m{+Y`Pl>f_=I@;V^lcJzSxw=(=lIS#5ZqQb?$}8 z4jkJ_$bI@F3G+Nr$LtA!3wHo;;V7T39C6_~IgYt-c*87HroVCFte(~$bK&lh@Iy9` zSaSz#LDiw>QY9R;jc*}?!H)=p4#0vOUT0>q?$(nL=n4lobm0KXDF~Ll+64<|*?{Px z%LQOKYwxN0g7T$}(oZC7gg)3QT4RG1Iq+IXLLtH@lz*ZYjE5BWU>HMgb9IOIq2$%m z^Fcrh@^T~pF7))tXDJl3E{==N{k0geiJ;dKyLiWwgQC~zgt*jt$(o$f+UvI$y530FJ-z;8mGr%4`3RNyU-lP~WPc+khA1{h!FJv?zq=DnU0 zfJ!gFuihLPZ5v*G4EZHnz4wN?NVv7iH=Z7J>a4-z(+2Jf>0;u*;wuQ6&WKlO_;w9{ zA#8l?v211DXOg=*P;nJb*CIsI8^Ra__#k7u`6b<8IXo8j6R>9Fs8cuE3@e~jl(Cp=Fejbn_(;PO@-_AG6 zSboidu=_$Yycvogo>p2;$LLF)C?qWcbQdsPL|tk9B*WrljGTQa4E=4hk&pn07BkRruZ z#18%PJz2lDX}YVvp(c=KbmZ?xo*<0!2pv511VWBEO8g-ZgzXBkrve2^d?6+*7nrye zPQ+Gw7aojIBZ*V4&R?QYONDq>)O~ikD8P$+1&SgOw>;C~6MS*xwO{vf?9YWJuZtit z)W%Uq;2o<$cfduf)!sC%hLxk4ncnftY^$7?x^m#po}g30IiP%C#h!gi-A)6Lj>}SS zxf>u@>~>0S4qy1Tp+q$+c|$1l;=1 z>|L#`kzs2NBZaZ~^5@Suo3jnp>X)QauOuz15C&OOV2GD8@CA=cUb>mr%BN;RFMMr2 zI6+m);&E}T(t2y#4&_2=ALg9tSv@LD5{97v{oq2;r}c>4#lttQD4IK}(`ibaqW+W! zx!ckBq@2({XOD@EU)CuzCk?w)Qto>#LNFADqh5IIZ(+f!N;vvPW%_#JVCG9BmHjN@ z09a(mW--nTih^O+Mr5x5yqm>wEFTB}vEc$*; zEswD8;eN~2SyCUJxWxJ)<7qGMUM!uDQNANWZ+eT+h1=BX^*lq8h&D2ReHfEWV-b)dmL655rbB_l56Jeba>)TXwn{IT|KJWd+< zK2HdwV=9HvgO^^l4PSJGvH)XDT+(Q)Qungmr7gf(=@w!lrj*Rc?@O0BP^#-|gMx70 zC+Ixg504k|SgaZap58g2Qa zZTj?syU_euu5nj^Rg1opL#4NlN_}A-6SrqbZxvIE7~^ZwtHC4<-{V6qx3F6Z3#w5j z!jqn@Vzh2noN#A9j+Lk|&yA~TL{j0mRRxSYrK0tQ{F%n+gw-oo58kl=@`}6S6`%=7 zEPcZKA=jA9AglC(IM%rt*pcy^t31bIO`X0nz!st#_WN{L1g<4!_tLsYiav?B!dH#c z1V(**-!m7|!pmhhj%E{;SC?A^Gv}WDz#IqFGGEu^JW7g{2ubn}K3hJeBC2{d&yo9> za=gAY_H0-$4{F&K0Xqo-@TD!T^%1Lr!g^uu5Tpc`gl2hTU@U;P0-yIBU8q42R z?nm9R2@(zM*!sdW2*D?pBPgR4jTlBgS?hER>0PY>$*vH7)a+*KNK@8vpes@JH%T%^ z-F+JLq!rS+)yvW(=Z5IcD<4s>Rg?JZZTtmX_Yd%62LOJ|T^HuBW}3H`L`d|6(t9Aw zr(0K7@n4kG-U}yt>Fpdjr{uT=W8N*ztC%^cM&>xei-^&`Fdfxibp?T<&G>$UL(u>_ zfz0Fhm(+mDwCxw#O}6|jhm7uKQD3r6WI^ioLK<=?RQ4lkTQynSx|-XRO`Y@7pHqZ- zz776>!dkA~F>=9&6@xnJVSX5=!nQ{g9>L@Ybg-h!G#6}W2KmN7!wwt|V6H_a5QRFzS|an*b~X(owI8)2w(s5${R z?!qb?BTiSU!EJpQ6kw^Hzl$7^)+BN8v#mZJ_0Pf9y$Wl=wr%QCH+1Dfxo5dHJFkK7 zq_*z}2EfkxQrhHYNPvJ$*F%=u#Q>KBnY|RB2r#l!V=b|@NWIzS$XL!Mt+d&+#E3o^ z2-tX%o1u#o1m&-dLY83f2mco8a#e)@y=Jpmen2T2ac8JPq68H-lO`(Kxj2-$-&G8f zxSEG98?;#liC0KY>WwIGZFChNJk_)!^9#ou;8mFBjhu4uoBgtJ+@jv$ZXVRWFrFKN z&;!)`hX^s~VOB@S!91YqL(9Kn_|innmJ{)7o&(ij8F)WNE4O*3U_2;q;{;H&I~T2u z*;?$tA!?6WEXG_WMqu}J^YMCBh841N(GfEv(4+%{uua$&>wve92xeS$+3u5}&c~U@ z%cU>Y@*-@O<;+q`n|4B*->>EEu?|b}EVm2{6m~%>?2?=e05yH&i7`%(#Y63{=bZ-k zLIha$Ar78+@~8$nE+U!Jw+ase@Eb8_lDHa5JIR1?6ICXQreIpCf5KIFkIV%xqaDIuqB*!?vmLr^>U{Ggw*@lW4 zK5>Wbi;@J|Wt2U}c~$6-ukeoZUsT>6`Uf|HpE7Z`zWuZA{u2LR*4?&#X)4`2M^r!k z;K>hQsFzPC2nCq*sHI$vO?tk%|H7mP8sbku^<0_boqs<9D>esM%%A9?#EgZSaBpaw z7ahU1v37z%%Vcd^!;T1cJxpYJq=u_+PvWY*96`2|5qGI4|Ob}{wSYrvX}ful7UAQAkNpjGqtdgh>8u5^!P z7pjidWCSFia<};c6R3YYTlYNv^e@xg)PN8*$lw$8f_} zx?#i)MK1=qru7KcH(s@Q*hRsiDO#0;gEnE#&oqE{PTY(xy?qpkjYs$5D$kbw!5JHw z#rEu0<3JOFz0X3yReL)^TT(`UNPh2nfXyLAOaz|co|A7Uf7HHyG`%i{?o9JR7IksyySje(B6F@L1lkZ?exG1m>6pre?nSlcZ$?5cYH*-A#Lzo z-Yt5tEPSOBDm}Pj89Yaj&Sv{PLUF+XOQC0N#gA$E&}x)&-@h2=nHG;S&;mCQ4=X^|D=ZbA6qKwGj zRoO!c_Jkwpkyci^+GuH4?#PNO=cmXAS*xF?7-kVQpFW?Dhxh0oe0{LJ)x)+LndZ}4 zu{ULXU~VG03Uqq)!-vS7*>3rRu)-ae+7`DaF%&~m*{G#jM*-9h{@+oJW@MVHN6-{>+Sjh{wh9 z>)~`tmIl1 zQHmh~=k^X_?`-qR$u=A`*%A>0IE1gRxvu9q;ha zjva*GW){^*8I-0*((L1S0nBYR+{B1gMZ~}6uK%nVp}jtlrxsF^WPOox-udivs_Xpf zyO&_YuR+=hCaD2d9x%TeVPe#2zPLI=vl`o}mdX(fDj>*@-)u=p=u?@sjDA6%45<2G zf-hVDs9bIuo!y%!x<6)$dgc@Igll^y>aL&VBZ%ot?|GVaXoV22v0b!Sa8yjUjuK;) z^qDng`i;=ed4`r1&)T&H-v%oW>rYPvb;k&==b*?!us5MTY+@Yy{1|*hnpR;u<+wKY zLEz4AIc)&0Z&noO;JbX>_vv~B(+__1_dZZPhaG;O1AgzV9=Bse-}6IVoH%}if{r1MXjA>x=Od;-G)YMvp?i6^==^h!yvpxKUPYS=?Ic+_#m^^9UjIBmg-_T1i1`uXe$n z`G~6bkCq{!w$e&wuv-WL6=6lqnR-><_tp6)qu>bKYYXe?oS^$>eG0_9%*P7kSVTK+j5`H;-2($#)E8EU4Y$sju zwe~*j) zSXM7kK71X+16LfDW+`V1^q?=QX(Afnnek?B2pE*znasI|V3_xbyT)Bt`1!f0Y#Dl) zs80aKAVnMy86TSy&cwhlY(D7fgFj52!5m6kd>JQ}*(1hp#UGXr(lsB=U^?U{jk`57 zOk2ypUW!SOZYo2)jXXGzY+U-YUU2fCI#RZDC%U<`#NNkVA6P+H{Pq3tV(Ec!pVKHz^@9r7MZ``z zGhfsQ9yuP@&*=P58wke=a;T-SUBj6!j;^@#3;Xo9x09R>N;6;R;zl1KBwZ}}H7w3=Bbq2@ix^E~KM%drcb)56Z=(_xyt6#+tpXBFY7yz~15&{3$sO`y0C>n;2 z@5WfuZZtcWAXW-sm=3+d=f%tNGpDFs^JksXmN{M?O{L>^r=RY4gc>({<8b=kYuk_w zOeh381O#WCjFR#Ay|qPY)awgARC0V+#sbu-FzgD=(8AQBkM`>`<%qouAW4IJ^_K|q zz2XRw5aZD+J^(CIS*-UwlS?9Scl`*`?YEU~_|wutMfgpE7lAn4N&A=n9p22c@BkY2 z$SyCRJkS55jHA|9@9b2??h`d-PxKQeKR%soxKH+z(Vcb7=$`(A(S4_39d0UA%vQkd zcbAsYC5d|N7o!_+wA8=+#pwRKqb13hON*%ciee?wilvT4&+RDdqN9YSb2`ephz-X< za)+KsTee{Io{@;*-pRux`o@Wmrgd_NW}NL~Z==b*1dKey4|`rc$p@ha4E_h!K+lNt z`YxEi;E&l*m-s&DQ@dx{D7vY!L9@vFPS*gh+RtcH1HTW*ko&FZ%?AwMYVdBeW*+{A z*tbq$zuzAHz;!%ACXkMriT*Occ(<+)U0T$wOYttuL;ib-`$7FbOWeNC0f~F~Eba*J zy}O#_`a}ifn=kl8k=%YeU~mW~GwJGRa?G{s;5+4NL7&W&m+xxLMB$?sT0*buzSRkv z*7CMcIXD#3Cej{(iXb7u8a}r53k4 zOr=z>E|wn_1n!+ufE$l6j8M&I42TixLI^L}B#jeDSR#Hdrvy58$j85=@0ms`4V5V# znN6#0j@Uc(W)IZ}LGl$_|DoLfhjaz5k8tRBwqigLZO;@Iv_~|d+PhEmYqQIGiaGo7 zW|#1l3bp$NWvVtwM*{e1ie0Ka`0r>%w9VMfMTUh_3Bdt|v(SVdN`cV6W=I-x<2?76 zvGMelWg_9hkh~n1_-{8OvHAzwQti|`vr*A2Bt zD!-JV@lLL^v1$7B7uWDQU|bTe@>IM|Z{CM}2?C}W=M@-XQzGXdVR0Kupn6mjB_aja zqL7#iW0bln)P^~W7a_XtGjs639B4G6l1yF^81+zD+J@a;R7_||`4MOMHr>6y|5PLO ztj$FyyQWR`-ooEM18J2%atH4`LT#hO&eLlGv;e^8;u7$5-#VXAeHhilHaFjQSI!+E z2HYU!0x;U)6_Sl_KAdDaXEM4q=6#+rhot=P2?Wb1j^7R!JG+w>rP+v|5d@v1NI zMYd2C$&JwM?^I*R zhQ17_2GKK(?8rKt@GRF?rsgDR8RkpTd(Ee=UtQGxHGIDOPJQg3%5lGyn{RWfNQ;VL)~pAk z4eHHv!>siQ5yMpbLNTtt7Xr^YSRSvLNli&Qtsgp2 zNICk`zMphfE|~3awYV+86Z-g>Wi^_*)4pN(@KIOB1>h}n_@PQ{)ikj-|GHiMVq84y zcZpQDhAnG#2`i|3gG<>s7ttO25*Z0Z6Y2H)=~lA**OuLlAhy(f4xk+zFmP3MF#4kg zocTvXeKB_-f$&MG=f!hiQu1_4Im^1S;vte+!(l=*JCOSAI&@O*?%PUD_qjKSMf$Hv z5$=;?=hArxCsi6CT4tQU-kHSDV{fLl2ln&1E0e9=J?^;BC_HFjH21MBIDDgc@`C0i z>L>b^ygj+M4wup!H;=Z?RFbaxLXiV~ayVzKXYqe9n+)ftjT^hUA$!^avaaJy!ZnR0 zLnixHnxYPLTDtI_yNq>)_%$EQ8W_Q!6@Z@w1%lOKZfyMAeUqb2nhK8wHRxyNC=0A~ zPi7^*@CaF~$}LjVZ1#>>5p>A{Hn9swS-0ZvyVcN zTVW%KvspJSXUDo$q<}^0fct*Kcvn-w;O^MoL=nQq!PiD8$G~lm^6W{4xNGR=v>beS zHWP-_I*+83gWn26WgPxIGDRk8JTh|AtUNBO$^?*xs9Rhec|yhVmM5(#cAd`C>NVKK z&7p>nnWC+qT+B5Bqj-(XPjIUCt)zxWu7;t{R{!>=NOWC?Y`bdu&$CU93+&$i zeQ2|N`qvUUj&qm1TzMA|&Hp-(E;CO33#t5X@G;H{|0JjHt9bhpnw+@QZ!SKa_c}qz z%6im;Q}D18`-fEkaGF=xdK2gnMreB9{3H=$xo0rgFt--BL6yfYQyG|4_ zV**{jWycP{ensy(6twcE zf+;kI1_ZRw3QUrZ@zMtT#k5Aq#`NY+&)Fw-`kaFD)82Nk(gNOXVICMQAIQvS(~=qP zq=l4jA=@mXHX_SGzwbZ`)1MN05vvI|p~|ZoV3(naiLA+EqB{-mWKP^vA~>?(5g@bm z(gC9Mqa&g;nko6k4@>#cN<->Jz*0{0?=9t*mj1Go8)*GyDZlpir=?uwPfL07|5F8c z5QP@3yo;)6BCRoNDyVu2qf$N!gzWE7%a0(h-)4-g&hUQNJqQl?wo|#%2dsXUn}P)W z?q%48kHg?b8C#cXj>6!Fc+zXckNM8LOP%HBR2YU)qyCfPz9%s9XC0m|m+dM@b=oT% zAWY9Io)LEcuD<;8aUs5){%0Z1@L|iO(Fy08 zH{L;OsuWd-SXqIwUG1UdDcwbnR1Sna(`~B;^J_QwITwE(H+$+h=sJ|Jy*IneQR`mb zP?4*RwI2su$0qR=R-}j)H+V@VXj#yE5T+VfCpW?kyDU0wOw-Z!;?0ZjsLSM{71rBIbE?1E(xMH{;?*f z*4h63@tT}3xWOFRI=>^e-Sy4`JCpHz5F1wy<=EwrFiMjd&WAmBj7@A{85v{L8;OKg z|J(Kx7rXbV0{%~dfHSH3QNY$Og!a%{X>Ka-Nh&)f%;cQ4A z;k%cF;xgWfzsqq7|G*k3$q7_2$r|ii7tgyXuZ=PG^~VT=cy(8>LU40Id$Q9Ger-_u z8}3;7Y!>rHQXMqiT4(a5`tHr;PPOhUb8~wpT~U)q_V|ul9@O`UTaiI`!ms{yW;4#G z6F3%iXE{v}g)5d8B@jtPUBC;-5PxGSO88bk6UyNz7_@Z}x-%)J!b#2chv?oNwUu!k z4fd-XZ(O+dz;1}&u#e(Tkk;atX1VwXMX;Kn7juHyR_!=P0j#ftY2^_7Al&nPU?}XWiT8V{rtO2Q76Ed#mK|_#q_$HpW z_VB9#({7OpN~^T8b1p9*d*ET`!*Cf0aF$A{BRKQR)!dPuV?mBTvbY4;<1Fr*t(q%k zrTX#^RKeLoFUYq&S9e5;kIL`4jvU!hPBy(n`C@w5-wfmm$Y(uWdF8S!04J+pI%ryL zD$x%AQU4BD>hkW_U&TDB7T_J1z3ByNMn0#}x$WjC*~7OHwUXKP=%0%DB*_$8PN&B< z$f@I1GzP@(3W()Jn>2hCr68+u;uD;WqZE)OX_v<=t%yubs88338Q2 zzzf)t#Zr(D^tD~>xxZt(jZ@Zt?PQrqznIGu82i7dd+(?w+pf(UL;>kwL8OaGN>-DVW~_R3-7}oe#0V@;GkH)H3GnZ7)BkeW@B9Ur&$0go z%zd32tZZ1;R`=qMbqW1Qci7ujM|7@~;9`+>!u!)6Qjhfk^ZCgQAJ;-(FAZtf zSa)o_Vc{QSIDNzU(1O_+R`bOL^5PzkxIMY2eC`3ao)%8iUvbY@M>~ye$c`RfV*Ggs z?)R{NTzWh$#qq<0e?x53R`*+hhHv3i5t0e3*uHJspyI?9YJHQ*I$x~LhJ)_9 z)GG?b!)Z(8mcZZW$N>6c81cpB|L$>GWA*NJ?wmX2Ps_LLtU_vmvWpLyxB{-zD~sp6 zm6E(5(RY-GD$FlHbnhf9r4M^d=>L1%C6^wE;Qwd{m9bk?|9h(k9(cMmK-LJo^z<&< zM9h{X%j{A+2Rs(!q4}5Re2p6X|4av{wgG7oUaf-!xOZtbvy#`F6t6qkS<+gO*r;>q0NNTGqmJhxe7H=YQrwx z#}aU{^S}0U+y-{J#GZiqJi>Cq*Oa3HzW4l;KF3>;2Yz5|{VP*oLs2xc&-#+u5>f6+Uf6o*CYNwqubgPW77N{BqhZc{tRjCK~1M{Ko61yV{2&!aP zH*Cdc32iJ>?-X5Ok>*KEsU)mk9kU9eH%e_2QJ^(@jW=g6(fb|{V!067jA`F|!kF(w zDCpDOIP4}SV@cOy=Mz3R$T4W|{+H}=x0>z-o*Tgv=qpNz>nBwG#>e}@Pw2kC`-5}& z{)*C6`-TT#Z8^@gBq2)q!Et8|U3-N+lEB|;BF;A8Zq);V{6A(Qd5uez7e;6Yalgk+ z9;9CI-CDU1EEhuD0K9v$NuvTE)|PRFwRnP3=fc}krKvL$n4WIbuvTiMKqx(BWLF`M zR6H2c`BKr5U1%}J_!IgF)?h!NuVsLkPNwV{F)(6 z+isLk=_#9|eY~*wxsF|a`ZYI=YHAm#nRPPViF(&QXDD88`I4Hj6uEq zC){4ja{F_Vkdkww#vj1if9}SYw}CfKQp1n&jA~C%%ebfOdZYFB+g` zwR`2-Jbk3^*GFBM_c_;n5>EPX(SP`BWSlT<5>)MqvAJF@Q>*E#JqXYOhWNo+&| zsv3V3NgN83Yn)K{UKz?On=&bL0$Vc#IPzft&g`*-S{(5d3%c`8-=5e=gZFvL3gzid zY2$ck7fN#dTMHix1SUEG^NGIFTy~=_2rFTN`1)Rq905lhk32lr1I8IeuxwqZ@jMO9 zpnT1P7HPwIWZi+J596D&ix!g`KHepho9EL2%L0H&J3P{dY-cq!ZBdA`$nz?%FkiUA zoR4dSZ+pm@+cE2|(8_Wp%*L!v*?=`MZ5j11cLa0lUn2OQ!*?)GgbL8ecAnhOxY6tV zwRslU3`D@c4&m8uA2Iwt?)3aGI=JCwhsXqLpu3&Xi!C9Z=voAe!=FO9AL^4Uv#N1G zSNAoaP%a@eOon!v9m{4s~f>KyRd?;Y>Y8qbE^sts4>S*Jt9tqOvY zxf?1;S8kR@wCb0*fzPTNY23$!r_=A~d^|mj|Nk@BVv{~cD~wOPcGk&6_;&EQS%EXnq zkm)c#i-YZ&p8j6xTB9`weW~^RyH`QZ5mdi}lYw)K&2?>4g~7Vb2K&)Xz!~_PK&aEG z9Xe4Sr?p(pSMaHmP5~UHR_vXTky;(k_hnSn?m>94er{$)O=dXVbyZ<)4SIC8tA*p@ z;iYxKw+vQB^nHhyJ;{{vh~a_RUU^+Vu;((j6F+^da`~BjT~kk!>M1cRB3Oyg=$>*E zFeCSyw&=p(?m?`upZ%3oS#hi|!R43q0{lkR!xBCMv*u>ELz&C5T#O2h^dHqvw5psv zjuIPImIV|;>m%ncIXOqZ|ZIZj16?t0ibJ0ec z0cMGeR*|mck0}(BOz|(R;1@^WF=bZ%Nb!Mop9%Oy4I&L%%_?(iX%nHB(m`76O>8ur`uc`3pKT_{0$o@!zAe!6J>Lj{pzS%1lhgEb@^jBLn#XOsH%Jp( z2OqTfgh+kda}Hi24ZOIffBnH7Q|U0X*b5R4LTl7Lq4<*ieLb8uQ`N9FV)y#t(-#h+ zt?T7={&iA)uh}B7_f;XL5^;i2St8Q+_x0a&*Yjc((LqjzK^t!JHG37TuWgqK4j%1@ ztRI8exMmgxzHX+u$$P6atHlj}cV@E-w*^%9(utB4JLQR^^BNbUk>tH}R9D_E?ZUb* zL!R*Z8Lj?%I?wfohEQFu%~xi+reo*MFAc3=qVTml2$9mx(E;?sL1qp$+n$@%H&*4zXonHAoq!SW#~G#p&T>l(}1klQ?(1aNGS`=T;~+ zZP29TXuNwz<(Q2w!UXK=9^cSV+wJRlYK2Bg_ck0Kar^pK_RW+}dd3Q|pK|-2<5o{* zB6c+o4I$lfk(#R~r_xp;^<=d*o>SyMSN%Wnqz+ z?aF6`ysIRDBR$YcDhRZaMl{TqU(d|5&>|1QrN(j2zY88YDmey>QIVkaDq_o%dw(s4 zKbA#@;@NWEm8wU2my;Qq)WT#suAm9&=Q%d-u0j6odBm)_vxi{3YybA)FP^a+$kYh@ z-SNz$kLT}o2E26ii=aRLGbUjh;mse#5OB~Habt%Vx{I)>7 zM?>Tn6KHqXCOhA0XXEHZ@?F~TYtG)PTxj?~xFZrk!+!v>TkK(pR|TP5lhC0|6AU5& zZJI$4y4gvGdG2^KlxoPvN@)mLJ1~soR%0qlvH=V{L(=TDXZ6$KLyq-YDP?Btz&*oz z$No4;4QQ&X*!>z6AvO0H+-IdnsXh~5cvrtA`ue8AhIC8UyY0s+Qg_lQC#PSI{v1fA z-4#oHC>?3*fIhYY&F$4Y&L!BD7DDb(jC2$GoKZJ;o_d}iw$xI_aGxWipxcJhmA>cg zwGLep4Ndz)rM9n@Fn&%s0bkFV`s+z$A}zC0>6ivK5poZPl#U1Pp*ZNG-iyebi*FLv z52;0Tdt(!&?A;|5Byu7D^6jz5kO2{8c)bd^5YVE+awztsbZAyGP9LTNh>bZlbmP%IgBwldqtqX?{jg7IB4#w z^C$ioVZ~+!tGZhq@a`%J7F~8Hwg9+6i>W#H0oN}b3^+1wlE}0&Mur<;bb6$f9kX~| zo721~>}#1fPiiuGA_PgL_+TGX=wt{c0V(s1nnnv>ZJuJ+4NTSG$uz*ox{AHAu=i6* zV~e1#y-v7Iox>NbVT}~Z*-9yf?$$OjUM-%ZLz(3Lr-0!NkQi``B z2%G|X=fH<^A21;1xzOrOr|nrTyaT2wjmgYc{E>7s9ZuKL=pp2t8ylKZix#)rRU>Jr z3?^r0VjD+%rtGD2t7M2nF_m;5{<#gWEAs>WsL>AnB^f%o$eRb1{e$`}fy)cxU+f<( z9vOElLZnF0@?5%pRJtlc%yaBZBVlQv_c=QNUOd>RwLG~H>u#kWk#+I*_fjRBPnQvuM=+hN6{Vv?nOZCCr(gOFPiYdGb> zI>%h_7BK6kZR;un64kahl-6A6otd#iCDlsx6(TRL_1x-q6Iqlq9Ij~)RXSEyvn5~1 zCLp51qf{tWyRVgyhOqwVz6wB^EvsV(Cn3yRhbV#rg_FWhs8zZGFoio9k1`W7xDS?O zzSd+EUAWW_Zb|krtn76&fqk$_^YIJ}D5~Md+I#j=EcYrJl7zyy9jYX6R&9A1&4CvY z>eoMo+%S(LCUx^{t1LPmJ<{TQ7_joaR$e+~)cmNMX;fD|9p?Z6hqOc*X?I!MZ62Kp z;c^rnSjlH}+>Pra%MW>6z6?=~ykttZOp3@r}>8Ksme|9R0*$e@{eBR!&R{JeRS^i>q&D`Uvz1G8< zgB)3eW)6dP8S9&Yn!-Xtg2_e@S0`Lw=%pYW(TyTHX^UqT_Fpty)e;KPD4Rzz5$>G@_~y_lTw zK_8a!t0ER}l!H*Z{F$94M9Q#`iE4e4sWsJWhwkj1dq_jQ=Ql9kIYqycXc#eS##PhWi;Ah=6-iGd6rB5()MrtpgDgvFBLD^fbBc$S+5)y9 z*bY|$+nwtw?Yp>G6noCI2bS_8#GiVKR`vqP-dVvahlj}C5qJ_@-@xrsX-U7aYFRI7 z#)^5lo)%l?%bSK##pLw*m%@2ROres8oX~YkP5E1S5+$^JgZ&DeJF*kzITD+@v62PC z%vfTrRvi0v;VQX0Ela{?rYXE+!C)Q-opo<%7fyTy<}oZ)r?NnuCT^#=*;e{y&=!s5 zx@MH8aU^BpR1&rD8<2voC4D}{6T7i3xVg(MIL~!ExX>lQky7qWC@!{a3?!z&$Go{| z7r~j^#qsmxlb1apqFSwMPD6|Bd%$NBV(VD^f6g?pAO$}jQSu#SEXAqCX<9&Y|I0^@ z3?f-Q9?`*e!ZQgJZd>S9;oB2b3k&sq&JZSpPCmShZQrS3QlcvoVP5c;WRzYbE|Cc8 zsuJQOh)oDvu=MzPl;rfSB0(xs74bA1q5;}9kPl2Xi1!KA53zv7cFiUbMhj0fc?fOF za$49sxSha_P2bw^!>3=t(s!6j?cTGDVAr-Ti~msNGSyX-9+pUNi3w8TK43oCPq(I= zMfi&7_f2U0lG*okD=KayAUReFwxgNVD0_Wqj3kCIkhV?|5+Mk3)-<(R^G4Zg>drka zJ@bWS*(`ML%2<~R3s+4;%8@vYdEt;apKnyT5kk^mC2N`%C0;!x>{4x2j+qvGc7!Ef zJzY#8dtE@Sp4?o@l|8qxGHXpPq5S=g?u2aV@fcrm4YXayH7XV*O!U$cwlB65IN8iF zHkU=6@YRT#Z92+9>f{qas`x&OMJ&o(>##PmW`CCPF{QcU@TDBJ>Sni7zmbBXvWXS^ zCCeyCi!|QYK0Q_;a2oY}y?MX=!ReA{FJ;NlQPS40zLy(nlPv#yU)2o2_oaEj`mw54 zVV1nWd3{KIUFOZL2DhzrmsefPU#6c-%M$kX`^Qajn5AVpa!c8k)bbb58ptxyxTGhK zlbuhs3r^_L>Pottm@6VWCy=JeTDgUFDii$GfdVh6nBEq@*cIFI(-1MrGVP(yhoM*A z#Gf{k9p^TZJJR2UAgeR4b!%6MwZkg2ZY`1W#Hu2C0}lK)&re9tzNeCVeJt~G{iJ-CVngFre$|xf!jpeh}8^Tquazs z=W}zVs{PTPY)i<3mTBeJK(Gos>zjs>V(nao%1XA0keHskaa=qVkBeN)K+86Xt)-dq z$s=3rF&|BkND=Dz=>by0qo;>xe+xXw)|;$TGn#IGX7`PX=5cdmw)ZBcF_rCQO-N<) z=}ObPrt3aUGuwy*R~!y#VZlt}6P@nO60))!P5OsbbM%%8j7aKK=Ja_KG|4hP)%&2G zzZNnQF~BZ{gwSptSO+S{xkE~F9tiW8zZa{;{7u#l3?m}1u&n&*->bF*JG+jo1Y?I(=I&DQ zL=!A<@H0}neTviYxmmK8evzcvh~ndNY_gr0ep*F^w|`!Ax{gV$&Mjfr{j%vfBz9I7 zwiBejINWbjE}&M6OR^plnoqo=%LWJa>6drZ#sD#IX_$5OO}pvUebfWpd%o=z0i_cw z<*$6kym4KldBEPLZ3+U?JnwujeFuW|lEO+S*SNM#$oszy*?)#g)^G++H=u}W)zXHQ- zU1WxA&K)fA0v#+12P)jb%G`W0_=69O!x2Y%Zc6uwEy51xO&HTSN!}*T9x3(J{Y!qO zcCeBU)oEaKCESXcCB*2PzTxaqz5RJe&XF6O;pO$*;vz~;yD0E;$P80sw*)B5C;Qv11l=-*cc=4mO?WP39dY1rHEUq-Q=vgYNbjZAM zFmI@~r^@q;-^OA?L{ke2ofV;oE0kuCVJ~rE5Q!vc*M3Soz%3o4#eGjzYvpG~;7}1% zl5W0qFoK|+I@Q&kSNc5E5bgs%Kbe~jxk~HXxIg0+uqn=c_(%FzJCvKz%C}$0lBQkT zIseXZrq?H~^V_$=fBPiBHOe*pjIRZ>P54XjNEr|E?mV0&ajoG{W-F@0Z|3I$;j{Lf z1eq+RPdyPxdI0o7_d3smBfV%D9c$t4gnTckG{6|v;*Da*YJ8z&yp5|b>aU;hDlF~a zH3v?1ot2z^(2ODF+`s2gjyR5k(|E&Q`;74?s}_d8PNx}tJWrFe%ywHCLWHW7NxmDM z*-l2#Pykyxbd$H5@2G@6(9gqw(C+VV_>T_}9Tfx|GSY#@cXu)7ot?rp%u6s#Dwox3p8+;GGymw>}c^Yfb zO%XUO5zgTea5F7ey?#0^@yH>vOi(hudnfhVGuZyS(KEGg;?qoxK>M&cumsCs3QJNA zlLD~M?qA&Z{%2_lhR&-X1gh@9>*`xo2@WpYr4~Z|m~%pP%=Ft##O)rHjO1yg_ad~Q z`qDk0km7e1&q(%nFa5{DtQLtBBhVtA)hWAH%>;xu4fznG)Zv*Hsst<647hGN{EoU| zO_U8NMQYbM(LKQvBCCtMwRC5Ez5{#RDPCXsYOe`@5Jyq5L93!H^Oo#Jd+ik7=ia~6}*NUIuMmT#34%`pc&nVB| zOZ(_U2+z0UrRjrFSrT4EyK$ZO0^_X>iUsrvb7=!?Nv}dt2QN>E!C87l&3)UJ3H>Y@8_jg|(fMiaB*6ieS@rV+KUTQeI6J=m<9rL_Q0a_}yG;Qb)dtro z4vX7j7gHe>giJcIH;pUzpSjN+lXKc?rc!v~2_u|0u+R5jw7mQH1m&_91graxEowe5 z(H@Um(gl8<3;HC3_?kYQhp_V#ckd~7@&KpzXD>Ur9qI9Ox!yRLZQ)uN!1V#XLIhu; zR&Uv{t!U|OW?RhH$b?#Qbx}3w7G(AJdzXukBC*6LHm%>A@oC$ZjeI`#Pcd(uru#NA zSCsjKoZ_H;F)Lh?6>t~OtAh+8$AwpresEn4%~|dY|522?JIMB?P70cOZ2DVvvgG1lekz5^qItD z?+3DoD`E0WdUICB;rmts1*4oj;n6igw(45e01WWrL~OT$#<6Hr%P{twr$M^FTmub` zX(sguy74x_&4JlCVa@E_?a~LYf`xs)FBHjI*v$F8pzC#PG&`~lsxbF*=+yVbH?+#k zQ`p8vnOS0(x4?9Zhnh2WKq`XQ&~$#bKC|U8vgvzt1!_QWzMbpPg3!<#r@mUbY=I~J*xvC|+f1`f*=|zGJz{AZH1r|d6grAGinKzNFkiK& zYK}*8kPUh30ImLoH$_Qq9sq?W(VeZlZ&fZ{fywb@tc~PC zMzQ}PEbFl&5Cs2zykCUKiX6Lm?4V|o^p@XCz2n}_g;ZW(D;4wi3-Da?{I4=~2k9K$ z?TcaKAg)&JS8uN-0)++Tw};I*g^qiUqds0uX3X7cU1^>7L?k{BNT3hD*qx#ST>p`T zcAWSo@Cq)^iZs4<%k4J%v>{^2C1_Tvy4o$WC98Jd zZN&pT)xK6r(w)6gCph$1W&HQF6XhgIGi;X%MSsgn@ zFr&N^9Jh(Q&U=Lq>Rmg52P%me;mxfmHn}zW{!G<@ z{e`|-ZZL~3SDm?Rp5)lG8bfc%qfheGLlMgWPGg&qivi}TGXq{awq&ax-dj(Fem){K zCak``HTW7B026U`GY{}hi~L-Te3HMAn!BaL^bUYxJk{JJ^I^t{ALu?8*9$3|FTSX! zNw}A(0js|+a5wqA6PGUb@3dD4%){a~CPL z8&^SCy@J*t2Pu}{+mr-H4xQgAY(RrU2@jFq068nKSl|uumKob$iRYE}YNd4sARdxU zG$8i^5KlGCu|$q$YLpaq_V~T2E{|S#Y=yH-b@i>aw@eIsU#HD(S=SFAJ3Bv+vGbok zqvQs-`3>6MU{lVU9Fzvxl`D4H2G4mam&ND30|R(YWA{};+>_KDdh0Ia^pn6|(U=#+ zn>YQ(l<7v3_1*Xt(~ZAdhpB)n;h41Lhz1biFX=c~q74%9S_R~r$5mu)C3)Jq6$ePv z!F-cjinOI>1ww0t(mt^}y4yOo0nSjZy+gl-{c$#I z$%FHK3}v3S$#rs&PfZ;!d>!8~#F?+ThYxqn-j_FD+PTT7jxjH%7{MG0WCx^0+?4fh zYReFg%^bUzy{3Iv=xpp!LslVZBpLlARDObdQ_`vHa6kU+!p7DQwJrNR#aw+*~Lj# z^hwpVFdH1MA4Tk%=U_(ut)5Fr~G0KQO$2W$SUuNojwnR-o z+7>3$dvK4oS9v2X?fu-^7G}Py-D42Zw2>$z<+&9(?ZPYX054_s-<%-Pzm=@Sp35Vl#WN-xlakQqlLBP6O3Q^KTXo!$`(LUC z>J}vw>w z>MEM4*$1YZk3fxvi3u#OOTjaz)0$0#^DAC?G*m7brB-IS>RnU>*gdEAdU9pGjfrc8 zW8d?(MN@TJPj5GTl%t!wBUra2jywvj|J+$fC;D{R%pzKM2m+dTmaJ@Oc)wdJM^#*c z@|&n%)4&j*y%z{ZlP&jBhLv=N9%PQR``8+yyYe< zQsOKPQ0LTWBnwP5KVfsw!{2fYvu$bRAnTf>G__=gVf{RDxn+zaeU8W7{a`g;Gl^(x za|?OOe0Ih6q-Kxo49(*!LODNWECNJ)EUb}O8_}T{1{>(xI#zPkFyN8LMt6N7X z5+Ht#h-?9+gc+fy9!jxrCab&-L*e4dmGT;>T!FN(%~P@pg?wA7Me5?vRh3nH$1snQ zCp}pF-%&TXBxM+n?23m@D29sH;OTURYIir)Kq0M6gE9yoJXGgXX6WMKB3oP&LiRdP z#!uG)5?mH3@8Pe(<4qnv`J4w9^ud;M4q?aR{VIaiK-o<1PZ+1hBXP0(!J1> z!dcMcAG#&GL2RpnNOp7Shv{@b%nM<>He>{)+8sdpX;Wx>k$ukkc?(INP@WxwDu}i)(kTyT zSSLUNLQ$V(x%pl+2Ye+`N3?}Vj^3npc!riU>cJxY-YAr}Q=hs}+u(jRwd|62U}neb zdEHJ{y(s8n_7g0!S#R%Ahd>IMyA-&zl zOq{;IoNoR;YojfGDv>u@lP;-xGvOhRx2I@SZv$DU<(Lg-?mEwb_(87jD>`{npc{nE z;L8a&;fD$pWwSbiU=fM( zJ*^r^0}%CD_4ok%JcmA{+qowx%vcR)zCS97H&b6FJlwvv%zbH9JLIfM-T{zJbcFmE zocn$?Z|q2Ph$1}7?LhetzJhf~@7T7@`oUUDCQYIb$_ z>uu6WgK|6QOJ)W4Zsn&&?z@MbTz7h%iYh>S9--$000!|6F#$*8*b?5 zbKZ-rg>|4WymfM?)%8fRfb0DdO7b0}BDAI2xgi2CVH)Nbx<N8uBASlb!%xtq4xiyNkoKOll^I7YY?2uoZvrTRsdUQ^C6nUaiLyFMEC9d=e88OOA zc>EX;)>)r%)0M=8YrHcaAqC z4Q}>^t8UaMRweSRIpeUju$4En6P)dOxQ5KGH0i?Ip6UN}3CMcIfh*hv5T8 z=0l`&8a)a*An~Ml0$;QDot>R`Xpc{v6MKmSl8%JHd#*#wRnlnWR&wlj%(RB#(~=3N z6Dm{BdDjtb=Jxp0H)!3ttEbUZv?j0l8fB#3$WNo&DrE|sZ|?1kq)mECGqULdZ$5~0 zd6{h*5AWaWMhK4XY3}31_C@8l%U_J0WSQlVsYUHA2)v?gD1jpD{!F_>13B^Iai-P# zH)vk8ESz*;DmmuI>m5%HgjpTB1qSh}(KVQ=Pw%OL9q_yUx3GQK4;AKVrc5w?KBR!k za4lHq&o%SG*NeX2 zN7>~~J5tKiBQfYPkXf1fsmR+d^m?+`m3Ky;+O1}MZ(AL5N8R+^FYnIMKv{NtUfll5 z@n0dlAzh2JSN0le-x?M-2|NXchoCVl0Ep+yyE~~~pV#1hn6)b;zsGj;Jofx$?b`Zv zg5_`aN1sXI$~Iw(xL25pQJ)m|a*I<$?fs}<^3#F>Wy6OrC)VqW^d07ruQm%^AdqE- zfJbBdT?VibxjF%?LwKs)MEA+#>MZ^C{T-Cp@z^c+1Z0D%L@_~-M;RzFQ(<}=8v{D%5G$Mv7i4~@wpuP3DTp)O zyT|3N46#|9ff!DseHq^PSh z#Os0_G;FXQTh4`I(>FGD_JL{@2r4}?Xs|E?KNBR9`UfU-iC~3}o`MMulX26E6Luz8 zkD9bhG2}apmW}UT!BO{@Gw6QF(G3&hO`9Q-Tb5Cty5T$et8_4Ex;2h^y=QY2+{K>k zvre~Iz_!xHaNZ^nqTE?KfFMc>OMX{@iJ+LKbA3w>L5>NxJLy6g;(AYJz8w9Tcj-y# z!wfJ$0a5feFf!mjVMK#RzhT6z;5+J6-IvEKNXTP5?`^<)+o|7$N!$SqXmVe^H>+1j zy}tX>O<~XE9*g66qC193w(mk4k>TE)vr~1Ew~5JGaS6S)+o1ebG=^9{_{=x&e#x_U zlBz@qcPU9{-3H#A;pOfHHs+Z$R_6NCz0R()`7j=)!UAOyTTDor=#dkQ{Hdx6dwfDC z-g23j`=4)pcY8$Bu)+u8LpWRZS%%v}OA;?kWIFxu1#w>IJWbix7{|HU>t6^L-V@hm zAO-%nR2lo?jv!ZyRhe%@I#|r1`S6(c$T}@RPa`d6qVVuYTbU2p zpZvb*3~melr4Dsm*)F;Dk7E6fsfMiaeD&)5?>EH50Awqw=L+Akv8kQkD%QUB^l6HS zk`}1_ejOm@i{3sNQX_rxNAzdF1jz7|={dH-<1CbEIkxYZxZ$eHKmQhFqhGxLUl*sG z`V#zU{b*jKaDCKgFY%f?VwlldUVRmYI&2v_L(@ZRhn1*|@oQBA_?@>I4QfVG_d_AqpX zp)~UR4Q7_SD@EzT5-+VzysyV5?Snbz|B)n>gn8&T19_#Y>+YJmyWFFJIW8x_yAq8#L&Ixjwu7QP;a~0D&CBRL z((hwZVk#>i&a51o8LIA2IlWT8UCDK8e~OQ3S87IuPL?}yM@nbkan|ek@3@|oC-lE6 zQXgQ{!m6vgDrg3td*!QYPl(GL0Y?vTqy*yA=2xY!QGln%qNq?X?wQPE`)5k0a$*5` zBpy}|fQe@EzQ{M10E@HEDZ7l3ojx@WE=p16Z7KMJ+B9_}Z}tV4X-Lm5;LQ5;YR~7F zoVtd}be{oJ56?5!&&gK_+4E6tOJ>B$s2_W<78$PIAHsNHRrcNB$mL$qX4P7$HLVWK zr;W&;mh5Ibgh~l)5wt{|8vxJ?{&?^@oG3~e0130{^Zi{*jV-I*bSzW_^#pXg5!edh zr!|}F8+U9Fj%Tm$AwMwR*<87NtpgYWlnXz1o+G5s?xoOOq3tw-h94R4A1ndd6e`Q9 zL!MNcVf*CQo$>MZcvPK&>RsBgQHAA&>bFP{k4I9?5(-kkM8DV)%_H;}H0DnOhG zY~84VybS)MdqR%d4J@)j_bYF!<;-IH>UG4oiVaMF)(KO5k370E)F2;iyLzReq|}Z3zObQzeosJ4oInkkY_FV)uYJ8#K3DP3!+XU3 z>-DcM^r)K@f9g?5Y4~VT1rbZKe78P#k6dlsXpgRO{-qw!c#1%E;FdkL$GV{KxYlYb zHvj-2c!#(8$9cjxB%dg6CVG1Ug=TXt$pWXx^L&86skP^#V(Upg(oTeUyh$Z#A;OOOS^NN`W44^7zcH4ROEQs+m5uK z)n9&-u4!gC5hK!rhI~)oTd}iLrGMaT2vGy(R8+LJSdR*{B`ze{RVyYJG8Na~=7TCT zNdsjQxKD&{?J+)3N9iIsp!Yh@e17h?*)Sjx&;SncbU5*X$GJIf`X__7@94 z1_y;_e%_=)pWQ(5%cZ7$y=}sk+9YyaNC@Xd5(-DPdTZJ~ z%wcNz4wFF}3uH&jo(l;6(H_$OyK=H2a3%HRqveuRAr9Mp;ctKPRS+Y)9Tz0n{w+9*Xw~S2Quba_zDeglKh!ts2hPqvo4D?(a%B<%NoMuy#xn-glYFe>zVEFTE zxTCRWqbm$Y?R_ssSKwFhV0Rx&rH-z$IctLqjk8P3;80VI z+wQ@;iy=S9O`o0gub4=~piT>K_M_h#BwE>;fo6@O99~FQ{INvuIr~EL+tTF<5S-@e z+fSYQ^0IcWWA$(IP_5UnHQvuuh=0(A*bauy%$`q8&*hFmx26FC`o+mv%n@_L+4NYF z#TL&2!kt-Xtf4^{-P=K9L)eD8if!Hwhop;eF}(+~T~fQ(+kuI;w?!w18D&ZOt{s>A z95&t}2=`Q7&ha38j#dn_G_{Ycke-S~e(DjNuyYkV=mCPWUW@MGA)z%S=;JrR; z#hNDD=n>%@AjZWb`wUdFpuyv8%n$MUH(^R2##Z+vKYqFGspdCY=p)AdH!o^ zIDoudvK0S2?b;CDyXVA9YG3q&-*^8Orc}+m#JF2i0P6J`aLd`vWmMlUfZ1e7a3B*4 ziw%0YH}vGj%4~YXA5I56p1@HQ@!VtRDWE5>Id-B>137STzenPA!t5O>eZGScyIGoIxJGJajN6KV218xrQHuVWknh#6F>nFfM2-Y8z^H ze_G|8Qj}W-N*}Q~-V<%i>0KVuPVI@b_Dn47FUR3V^DxGlG^Y3ApGhi3ZO4w&chNMeJ3}Dl3g?GQmWZgdlnnBrc#t)Dh;1*R_3g{p7S= zdW5NQfRdx@Mu5rY5_ry%!Z-bUS~n%CamkP^dVd`g_6orYf6e%~K4O`(J&F}GTUF1y zSY4R`Iic^E3a`7uY<%0qlXrciw5+hTMTh=8g|lGWZ-viXId#$u6meeD1W3a@cj%|^ zjLU=jvzm#64xHR||2%Ees5u_v<#T0-USM3%jo)O{wwhC$mlMCW*jZvg|% z)U{2a`mi%UqPGF8lo84rVKuU0o%)&4M9t?9UU^_BQfzbvcBdG)lIdrK6btO$K1AdA zTjw$>+6ULSJwI+Cq;?e{!A>F()IXO8EX*e1u9Tg;m>IaX(PbbYudu}v zU9{~DnqB}$JEyH$Asrn_(sq?!yHe8WftaO#2z2dxT0vO%NAtuL@IKgSJW}2)4(g)$ zF8BCmxn%XE!6T{2jkv_X#*HOxjPA1}jM0#+Lm-Oj8X~#I)Jscby8TxZB^A%;w0yHH zQtYKe&dQEf^8=wbIKCX71ZC(DZ4X_0C2M5T5aDEUgfi+D%Jp!(Y@U-WYJEq*v*k-F zP;wDCI}=~GorM~r&qZbGA+{!)CcN9;zjlEsk@TpQ+zy;A8X4r=R`0mHM15(G2}jGn zd4W_v6c+mqDR7)L3H&QY4IA>rLw5LmGf7*9H1LzRIa@B%vEZ2uw25qXQ*UvbT^UVn z8FJqMcwL9*iiXJd@4yDyG#ip1_#gD}zG>4|`|(XP+3DMs6gFC;HazwZ>1o66vkZx4 z+FdqNn-o&;Q1rSZVb^HangoGIAS!rSnqa(0STgKv3jw#td@vy9p!OYTjkFDqOBGz& zYzNl5ZR>6~?5c#_&qZT1&%%UdZVAH?*6n1wMzLTIfaP^4pKMr%*^+K@OBCFmBe~Hk z^{6^ZH0kuUaagqwjPlm-sAh!ogz5xK*dC)>(HkT#?q1jUt;|3=AFAS!JW_=3lXneQ z7Nt%^S?upJ?PYdeyW4-{!tOLgGLi@J!>chk740cke!45tbf{o2VL1nMWV#l8csrsy zXJuB-;VS(gyi^}1da1%L{CJ3eGaVEH+=L!XUzS8L)y7Mqi}>$*DXLaPoQo?9DL+jh z`1|h0S&$0w_0vWcsErY5M3iWM@I=|+?p;r2Y^RiAk{DKa@A8NA5rNxGXRhydW3O@n+aZy^yb>t?EZS8bGh&!CY6;PWL%2%rC{JpBb3lkW)1 zQwU0ZDtRDgxckjDd$rx&_1jpo!{b4bs9)s@Z6-=sk&oDbcQbN0@BgR5lQjH9f4IoG zES#^Dc|h~WNywy`L+&j_9@n9Gy(KdpT|sD+7_?#!U6&=99Q#?pDXaJKe@aigIU7BD zgQA4mMVqnkwSX`Wi^Z8+;>gnYLz{OBwUL_(aMwL3pQlYW*ROHgcv;t)FhTw6;N{Lm zxE$EF9QpP9=c@*TULRCl{pj}YVYv;?A97rj^4OMnHlQYh-WFpV?0#uz87Ez#ibN}_ zfqF%q)1`9YkFlF@=!R26~?lw_VlJlTb+AJE~hDkJ9rw7 zOP6UKc|ypR!S!gw=H+m7)W5g({IhhFDem&-sBas5>5| zFH__FXtjg~VyxP+8FZ?zZ;F^%BD= z9`nLx;zeRA)NwH2eev)IG;vCa(mxQF*PH&o392+=Ps+amsrg$=|3P10{18uqh2{TX z@4chp{`Y@hqIXjCE+R!wj1rv?1Q9(LMDIi$qen{^C5TQ)^xj4tHG1^u%;=(yHb$R2 z`F{7_zrD}ztaI17_x^R)S!>pqHH*)D%)38c&*$rfqes0N&ESLkukWAmj+pHPG9klFn<2hBA9jPHvqjk?2z~`S^0TGisK)#A+y<|=85&{m)^`C z{Li+wOrox)JpRR@0*wA}D2jr=IF$Wnn&(x41d+?@jaTyQic6s(RZzq<@~OJ035b3$%;ZmwU@`E^oR7d*bO(?kI3`KAB1 z%VNjL?7m46kw4z=+|HOeKUcomM(td0QX!>ZHJstKVm6rk5KU{?7x_Pr)4k7n<2g?u zLkcI-3ihkA`mF^%r@OhnBZW`}grkV0=;rsLGMNz~Ql61s-f@AbJTIasx zwY$(iydli}SdMWklxVGaf9=&R72-9};URuBozHU0RzF2_@?&sQ2sP`tq;l3~pZD1P zG3C`>tU!vX%QyEcqd=?bwm>Mu+M9MYwb@R5(F>#RSc|KK>V`93*%$AuP6trmc_eyE zeHK+Z7tX)e|c+4l8{ab`^)*uzetJ2N`Db3E|ZtTP?8W23z13< z069f6X(My}sITj+bI{OtFCSm>*+s0sucz?&p~Bj-+r{vIr%wV-7v?eL<^xpj%!cc| z|BXLM)0zB#u8Xpjtlub_9zSf%lDZbe9_puZAC6GDuh~UE)VM?x@ZX~A*l71oB(x{n zJ-R{nwVp!@6I!nQ4uAgkQ+j+mYopQNBN@W)Z$?ZE(s=b0=d%65Z%u4HspD;AmPs`I7$&E%uDR36M*v7+|Qga54 zJajVC$L{E4Z;r%K`U2jPqX?Kjz;(ib$#K;-@iS+pHCHiEY)bYRJPt-H(H8WNM+%Kp zwFTdHYB`!68Hpesdca_4lP)`t0K97HpL)i706~KtsLW`a57@} z;s$GDnbMbX8kmBIZ`T^0{*t&npbYf6X3WMM;7KFEIGD&bk?~8(517OKbm6i=Jf9Sf z*^v#F`De9_?#xHU6DJ!inxQ5sORdPJ*3J6(6KJo}TKImU@@W7mj*;6}$8~>`GSudv zm#NG%i7qYw9Ib%ki;m5>N7Z#*&t|iuP(scKKpNB6Ot*8;_ryWTKD^Z<4$|set(ovwoEg=6aL2Fm6IsSZ>}_spIBC~Wyxsv!YP^_ z%L!K{YGr{_f2a$)ghc{}2!S`speOf$6$+e%(y>(V34t3b0 z`N8XxpJjXM+@AIilCg6{zaYYBQ+Wvt9eDdcCr?;))IZ77ztmBjLki#K6)F)ACr?gH z&0(6JG>-41Y#^Q2a4tz@)>}J7*HfQPb@B?beyFPHcM6Rk3wD%#gP{jn(-@}HwMcnc zUGsp`C2x^-?9b_ZE?ZW2eenblljtO0)cFaX=k^HKSD{!PxXxJ1cyNT^JNZ{=ai4i<2sI-T(t12kF1HQ898>9>J2L+dot4FHgd~z@!Nb+VtOU^G~xWQDGdra2?W4dIkCWC7!*Q$Fx?VWbWTIZH%zHQ{hGtF6W0ZY}F(O zU*w~IgH92fInRg$#e99SR*fXW&m6FGb0GlVyVVPS|J~kGk@Adf);B+&xPK_yC6PQm zBMgiortxZ$t2lZcyRm-FCe%vtF1_Z{IX{Fh(#xMU_RA?iry%tQ1n7mmoVuW&|Nqj% z-8Fhyk?sEx8jEiOCT&ujuI8HVR?qMscY8$bsbX5-1oBcJ`{De(BLwnd znScT=@NI-EW$>w5p=o|WP)q6;AYV*)|L!40$2P0*OBzC4XV@OYu*930VjTB*du7!4 zbmfAsZx!DwOCyp%XK>?_VRfk)*?BIeAYWV#3ig7~An6yg>nlq7k?TUfHLFO|Ql2(| z{(HM9yx57Xr;h6iu$n7-2x@XQdvV>@3j$Kk16Mw1hM!zK*6Qr|*);aGnT^i;8_H{i zvq40vhVAP0(}DVbqfXad|DaCWL!|nohc`fB#{``EH2F^fx_NX~Oi?@kyVU9P+`K|z zZcANj6-V$Wps<#9?jE^jpvgao6SjnX5Vby$i>%=fJDA|sWmp!LEG?G-`)cZ^$LSr|mpGo$R)0o#+ z2+*}6WB9=-JoJdA4x>WOTXDC+vGR2$7FBFZlx&Fbsv$!Q`nVx^Xp)bCgVl3=gH>Fj z-I}fCzym~Ju~d)@W?AQ)vOgfL3Y5tF{-fb-*1J-D0ucL%7p#vt;gLOfhbf!&xJ5Cx zv0N8hoKxG~A0oDx;zl~E{LOdIrq7v$A0UNBUMl=C^@zhGka*oS3m>XFeEz^Kn^ueL ze&zaJjaeLw1fd=}Eg3DPck^SF_a6*o=7l5<4B3m-K)rf7J>2yOc;J1Y zS)VH$O^dB?q15v59FH}UB7E3p(6X-Zd9Cf}J<>*jE7K%n-cbe>L5IE!D+i-<7FD2@rsE~CbE3KQHdBu>ue!}klWPmfyj^$`(b7B}I{YFL&EyrbH^EfOJ4{KV`6F|`IVQCa%3K?o(ocLRrbn}1TM z_`fOC`kUk5LqX|D)`G06L_d#RnQ@VC^vo8;C9i*)dQxo-@wEJ&{agLim-=7or?AU# zxMNRJ=jBg@x1j8Y=ArVZn-|VI6!%yZLiBA;t{IY8W_dW z+9n^B(xDIzR>{fVOl7Ao&3x(JO=MIhN(NR0RWhbOdzpsD{NDSy%BNCo$ZF1TJ$#6<>(s8ZQFDSY_vy@c+;~> zyJ)IJ#>Gd->UM5#)R4^kRXOZeH&g7cezycps`=)dRMDl1dE#F65KWN!o1Dmcwq{o_j8&p4; z{MylrSq49q6=dQ$)q7|qGkK=xBQJ9w-JPOC?ixpxq=jxcbfVtL2!r|66+q#dy?s-r z1^=;t2*4Rt5{B%41#yJBJ5PgB-4Q zaNhJ?qlHFX@Z>3=y%MTnKgM0fWsc7GNW`H6%rZCXee*}r9skx8?n6JLTP>lDIo0$2Ce84^`fqTft<(QCg+ifX<^Equpy=`bcO+1)%>PFM^d%&qR9mRj5QLTPc=p4_GG8o>ovq%l^aF3 zMgIQLQeK{;c?i?BlQs#l01LN!eX!mjHve3mAWx;-&Kg`jpcD(VjOjzUpD>)k-1=2a1lug+Jy^>36Q>D+n;G zsfSdm)#Ft+cMyWII9utY<9MkWi=b5Y4o>K+n{fel z(U@!)+B=E4|ERU?yfT1lxASqPTy2dr(+H)iK&DWdi13zMVzhRpwySx@q7`}Gi0e;A7m_+$TH`i|;a zAj-|O<_^9b^#~enY~u05m4x>pq_{cQg}}?&TIMwcPP7%B%fVk;op3 zO#NQv9=#;=;dv0so*>+bN6k%+7VgcK((xp8HgEpGJ;~Em!4Ttvs-)O-vLR;(KT$t1 zD+!Q}B8yXn+*WGObGn=EIN8&=tL|$76Q7FOXIKJ?ah3>`ii^uEWm=ckhZ$TLx%E@S zy{m~TScgHT}5cvpLAv6rLg~%Wi@!=Gq?8bsnjHdDUkgq4h0s zKedbdTWBIcSmUnCxfI?60LrL&JrEU&2DB!gR8`pu7WR*nq~8!Clk$O$I>>Nh$}ZOU zeBTMU+7#Xw0Lv%G(T&NgmpcNBE<2KF=CC#KqPFyLYkjCk-w~A(K7G>S8yCE-Z}AM_ zE%_O9#*i#_Yu^qCOKl~D;ErDGt2`ij$?pfT^+^!Z?;Y(Or@C7fZ)e||8VglAgukyp zDd=`8?jQDC{rZ`I-JzuZfxSA+dACma5=j2;XUY50U6r55XHdw*m~YLHU5s!nO0+}I zz$r$IZHh}mgHL~NP?$XHhOLzRP)y@fdyrjtTHvi>kZ^%s=;UJ!k9b zUGKWDZ|%xV$9(Cj2YzeIx>L8AW#;`E9i6xzCYB`r*(AEwKVasY`NG3I@CLK1qqbCN z!T8c7-@%M;X!1j@C7&;*W!swSzWeUX-#t3?RDBt&45&`fTC-FR>!8V!z9rb3>7B#T zNigftfWk|QpIqa{E;vv-G_Vn|sOe%iVa9|vhqVDT^~~o}`YARVd#(1Hjws{yW-{MX zDA(_fYE#^QT1wR=p)^HNj<2;|29hpqe$Ux9CFki8T&*+rDz(0Mo8tQBu9bshjOy|# zJa-C!RMwnf9*&&&$STiuT;#+%BM7!66?_q)*hkqLj1bw~CZ^k#%kF617t|vS(Bg6? zZrr_f#fj=(h!Fe;NUf@RoecY~UKhz=wf~`nl>CV}EIO{tVKt@<9#S~2-mC~}b&A!i zXR9(4LB?6kr`Wx+!fL~M>&-J5cZL83;{B3v1mks0!nZeo8k9 zW?Usf@upXKGKbW31Q zr_{^w;KxypaKI1BDv#Hqg}LJ0BOZI?|Csuy1+q#QgE(+xkn)nsvY4m*zvU&5n}a>@ zhI)+?%d+9rysRBv%v$s-@V14e#Ip7mp)+aH@U&Pvr*9=ibQ2GZ+?I)<`4yOL_^(;Q zIht7<52jNPu{1aSiO4{?LI*{dfme~}Q^=v6Qe>l2c}^@Q{moM6Nap6xjmXuFElmix zwXx^w#g=q*f0oSi`(MqTltPFo!h7BBWohp7uy%qcpI$O6e%5Nu-e+Hoq@-zJ*OhY5 zT^1606~qTvG!KKwj<>1>tI@6ii{tE#MYeQj2ZB@CC>hf_oX4=S?rWin+!obG{ zKz8mvMeee1m7rwyTu-Nbu~O1e@dn$qV44}Ybc!LjLxI!6AJ+LyuceF%e%dQS87#>! z<>(IwHI`Em=QB=1=zBUl0h3(T&)nT7%DM?&-ZNp4)tB>PvEWjggC<9?A7l(dEu7uC z2(PV6M9pS1toL2Kgdea}?mW`Gb1Qk(P@K6zIwSb4sp*F{KTPv5p4iPq()%!7w8RKm zR4PVltaQ*u*@qO!u@-xc3Y(Cy)G2;(F=SQBJIzsVHf!K&h}I+Dkx|>QzkeS;@(6$8 zgB?|}iLuzQvI?dQAhr^1&9FM2Z#_Gy&;azQP@;U=M<}3pm#t&1Q1BHyXl{b`pG#_s zvhgGiFMrVPuT4Dq#ht^T%h5Ra+SnS;BKn?UQm?*Xm%AO{jo3Q@4>2ny14(KTM^;7x z7l5ZzdcQ(W9N#hqzof;T51j`1os~XZ4dU4E`Z>3u?OH*{bgbae{O-sH1zi?C=ey>! zEmMVv%FgH+2iqvOfg<=myyc{kx+u{ zzHN3`$ty-b-i_u#M{!Uz_V^6vYV_V1v2)v-6-YnH?LO4yE>Z^l}3E|!dA%G zWyM?g%4LEog=t%qDQcsZAYzR)pulH3soc9?^daj!D*HJ2(bK@|<=C^q&GE%{)3zQ= zt9&cpgT>3cudcEhq_G2F$mp7}5&o(T=ISg)3zT>t8Z`CoChX^BM+v^zFCvy7T$Gi} z>^#IF?0+6B-!__9+aHjcwIxdikS*E*_5_@McZvKn z&&LmrbFety^pV~-P@Rn>mUc>%wapc!S+Z}!jv@J7X`ifJA$I6FtpDY(#v< zIXDhTPO{1{X?_C!8P%r6cdws2*MeuuXE{o4SSa>&(s#=GLf;F@3yNH^o7rnq1-L4m z`rtxwL-^YF#fF`1kH{ImE3gpsnh59=?Bd?)Loqt$z)D*BuaWD=7DBObT*@G^;uLw1cnj7?ncwRCO%P#a z?7HjX6%k^^%j>8;LPVM7Ok0}n4YnYeG*|Y%x7MZX{i5r2I;5&)_uR>O!UgJ!=jfjH z!g+piwl#K&Mbk*zisAc9Qi8L^oaE$ftD<4UiU(m!nLVaAgjZL{bPPBGd2<$oY1P}H zU3_i@O!=?}?hNDh#;N~>VmG~KZW=)!R=rd2F4{w2^u+zkpaCeAmx+vj2R`d#be2|7 z@3X6Ho|@@TkLxJ;E(xYi;c$vOt7ROgJ}YVq3nCDE&KXdSm-w$i%J#>C^$Qa&m&)@H zcTYf%@7*^~<;S-LvLw3$_t`EXU-a^=TA08Ewb5XZLISry!s5%cD987(6U(O-rJ~8z>j;X; z;37ETajaThYTCsF=C3_vbMPlSc;LgKUx;E$clfr;iEm9m5M#Y>V0ToH8XS`|SE<;s z=4~vVw)5BWmuB^w5{nrOzTw4)K?cRfE;6!Gg}?lgwt3PlGnKcQ-HN^8r1epx+zuJ*ons~t0q1OTKd$0e5}? z54di+N(RCLv~JFqbNnt3M%6G!o+u3F=wjz+uS?;4b!UWd?xf~uzJhI_p2{>C5davq z&W7;^`uWiN3BdL@e-T+QCi9Tnv6SHxP?Xt^P| z1*}3rX^QWuWqNgM&2}7tg}Gqh{Do86iXPl#Qp@^!L+4a>5mGTmcu{IT1b3fmGU4GHdGrky`HQ1|R}0%^>W9b9u= zO(gBxP8$Bo2b2rmkj7l6arr@CXA0nTob~}5Cp#{mXTuvRutq;@mYTt*_2=p+#NhfO z+s%QaRp3!NLQ+fRRk(8+pe{)2x`rswC_ER?>O(;J2$ z7ggNW3VH9n&n>XyWcJ9I5M)(3A;}SX{P$UBA;rKwA?&hXcxPl-eZDrm04J>^U)w1S zP^N%FbI3Yfg+RQzvm} z6{#&SA9Zs7wU}6h=6?NiS3d^BB!fu)USa<8S(+NIfLDprZ1uC9F31eLz$0lJ-TI&eYwhvUE2>K5)qYhO9}s+GGWcWEPPh_R+MGt`*FCvx4=8+gzRl z2J<&$7Au{~MU7?wmb2menF+_)AOVw(DzO&4u<-*kWkt+Rse zJ_VIBbrkh36b-s%;on{gu6X_U>;`Z>3=rsBt;D2at@4=qleLFJP70>jqFI;X&)JaRfH^>gaSqDI&bF?xvXq zaBag}@a1OX_1UfK0_b_&w2Rjm1AOFp<0fLJ@f*3?fpeWW%0c>j`YvE`r>-I?fS96LhSOq+DlThm`S z%#wggG3#<~cvjI;;V=raSm&;NB-dh$&5%UU?)UYT^0>Dw@Rrqea?f@4eNb}1XQcI$ zAgP3`5nO1*Gg|`s;Ws12md$KxCs+Os0dy*;LWp%_7z6~{w(UAP0^ zN&Ix+(V6l#6XFDXD7No2GYl$r1{Pz|&YyMvj=N1>;u&5z_OyUHE7AIw5UrOA+R^T_ zxgx*zpV?Z?1L*{kX1T4n?sxsxb$1b@*J>+67P@8%*@?78*hwL*?3hVDT`+V;A6Yd&O zpz700qk=ax=(dkcT4`X^1(KWg)PveRbJ|2bX3(T%Qc}SHm zGJ^cZx1w>QX`k}cUB=}(2T>8DL;k8?KwD&n_@)-e)LO>J!dEkVP-GN)I@-;pR_<(Tzo}06ajPU>_+NFa=~=MzH@pKixTs9rT_w#3?YS=f>gOWjFD=aVL0)J-`Zx0 znI=rFSuFV9f?eE#iR<^7sK5N-WojN3G;}P&+8B{6Wc1!nz=K2~)3#LKkOqC|M*NSN z-=5SxLZYFqAJ?2Nck0vKu#r7x$LqcP1p`bGYeMexZltilOl7pis+h?F;>%VWZ;1zx zE1iwlGA7B{sLc>G?vfqzKpw{e0=M%ploF+7zMN!?IHpMt7D-`*eWM>W1volc=Qmgq zBlFHrl8VtT&HDt7@Zf=q7`Mr|auCs63u~(7-8Y8 zBMHlj7xpE+kJvE7!l-(C>8u72pTcz+|8~>PO8VGwIBR5v^|8EmD{g^upwRw0uTm6$ z*Y~bxl!&QfblSdbRp%crXfdZRIF#Uw3`{H0O zBD@!=0xp0@UFX29p~cTuJ!g?|NGSW zSL2#bsam5U_mX|nVVm1Qo~1KW-5Tej$f5Scu99#VW5^j!!y-%jEou(msOhdIvO`Bk zO#-6ovMawJed%;j4*nhmpJI)g9+eQ2j5)eF&JQ~QK9_w#!BFK6w`3^!cI)@^!^2#!ybOsFtvK6C7mDD#^$#k7wj=5c3kJ! zr+sWTBsVdXjEWt}=DRHAXSV{hiJv5vnahvaDkpvbwomHwf8?k_ty_@gt>PWhjLz}z z3HIh`(H2}kL7VJ!Xn`{-^1780Fy}#@;E?Ab**U0jG1jJpMNr?Eh?aY?iPRWko0A7y z)^L#am5fxm^GZK!vQ?t_BIU{UccZLb*9DKZ!Fo^puou|V7MIdvmru`F`3|82UGF;u zBa3T~%@;v4iUDP8e5hidb)9P~|4QB;*1zFGN}BV40;BWH4U&2EQ3?d9Ab8%DwEVDo znJTK}w~TljIdO1rd~A%kgf+Pv4RNOCC-q^NXn~0)+TOsk&+l3v)QYF9_;8S!1M#bg zQ@8YP!1rxpk=y;>w&O#&hV#*OYbj%u1Z@h?$;}J%uGh)D{%d@PAz5`w)qNX34;WSH zAp(>;^(vgkDj1aH15vSzoyK-6pg~`vo5TWw)@&?L?k-2d{Li-RA~1G@IhgIc92aup zGjm+Ej6Y9*o4j6!+e7B|*!}+VS+e@)DLG26TT{H#R&!#sw6MT3PXQce(Va1r$uVqn zh>V%&g}6(e1WV)(4=osLcNMtWFz^vPOy7g&Qmkid+;e~|h3@T1Bm+$~icme-Zi?|6 z!tl$DmqTIO&?fEiEo?O8SvhAzhP+Ri@;RjntGFK*so?B433SI)L|AwcNw_x|L0jRN zmCm|71`1b&JACqfFG@5(BbNw!fo&L>fp*+|g|Q`$%}O5g)og4*&v`6qADqr4ItaX3 zxwA!w36-hO>M&j1L<}zH$aGW$7+qi1XG^rbj!ahU*oVo3S+`9FbJOekOt380WQcfIFlL140D5)TER8FO z78X1m_0@jwQTu-F6-(Ql4-b{A=Q;XI6bvVs>+y_Fj~tZR%2--2_l}Yt9^+TlDrv7V zPIAbu+KPz3Q-s)+8tgdrXO-ZcR=s;mXM|vmt=^?^O`KZj`FrT4;u;tSxt83d(|Ijt z58ggtAmo9D;O&sZDAui?N)JqFx)9UGE}6$XBzHraI#Ub3S>lwh>GiMg=(Imn3hg4%1*y;?H{lc>OyE7+=fukC>_WcC>R|}a92xhkh zTc_KKFRS9E?y!-nM6mYoo-zfF0C9Qc;c^#Zl5HZSj)`^U{g3kJ+xtKG`4@C~>Y}#unyCeT`1j2xtnctLQ(9S!2fFtQGgA?3ve~)B7C2M7qq^5p(opw#?cZW_ZPg#d~v;(hpwk_78k&}XO$nY z*qV#=03tr5ZF5yjctYgP!y@w~s$;4E?OsgzP}C?qG0N@i<~1nQG-O1AR2 zQ3U)DFrr#QESqAGN!6Y+0whqOn6kqv92?~yLvN=+6+B9Ftggq@_|wHGa>ueSdohNh zQBkxcmj2-gG2VY_0ou>sMsOSV9P-CciA(!=MChW3`5>*^7YGKq?;C+^)~-7-tk4`k z*OyC&?8=`jEv}&9Tg@2K1%rs_*n93U6N?c~hJ4Q|2#%2*OVwQDe*3uYX)(!)mHSh? zO0~1iJy|ik){5vhtMA+|z3B<+Hq~5TtVZ2?)DlA{!Rv^}rVZ^N9S*YfTh=@9_eVw# zxw|~P%4z4K>XicTP)N#nUq&V<1ZsSC8V}tI2g4eu+u6Vvnh*1WL;VBQQZNQ8KlZ_N z-2%R~8LeS*hSMl)-t1#gfOVb9mXn0YBE$N3$7}CyD%y2t*ap|t+bD|ln1P%L+rfsp zo^#zI+Mug9Iy;wl8zOI|&X^!QF6wqXbN5X`{rEa4UITEs*cg5tm6u?id8vrn_!x!$ zrfqZg_{px_wIIIfkTp@B1GaHfxGsRp=x08h;`ehEtj?kdCGqMN=Q!Dp^P255QB33Q ziA?G6s@4jaWwZ-%RCr~e0Gc0VN8IbwN4&zE9~eF9xbu^&5;F1V+KG_xnukBNTJJ>2 z#pJp8)iL?c>pg`Y=@`5yc-vf)H;wwttTXTL%iXaOn}|B z)2-=Dx?3%(j0$qWWZBlnjnd(;j3Qp4j2+fweVD`L>4LN73eVNeWm|7-8PNgW%~dz# z6C@_< zSx<8l!LU*ZQNAm@vbas?$~&hNO%fQss@!`Xqt{XN03#yfi^ z3EHG}BX((Vcun<<$jv#pMg3&p_O&~~StetEnwZmg&rCRn#-qyA+u@C^n5R)`kk7X= z?9lh^9B>~D6@(P|*DjIgqU&S;2!3NOL(3hYd4o*ar4e^}bz&Tuw?SL#Kx^L3F_h!S z3mRi_bN>lYP6R;1>AH*tluy|heq+=Wkj~Sb*QV0e*cyQ6iw166sGU+$mrCdc^6{?D z%wKG0w#BvpO?79cVT0Ryey$Qx{tf-RXPwsZ_;3w(8?IapKXIxBEUt&~J37$}KzWKLE9%QDj1O4xrIvpVdx zo)rB;6suowHF8{OyyPb9tzw;PyZz$JYH1!_gXK-=Ly{qmdq9vMwy<24zY*d#_Uyuz zTqO*25nXhzGdH4}r_TQ%$qyF6Kg>Gb7)pPGVIs83`ifuM))4smF+^)%nnEQaejxLt z^eVlh#rt7Nm+EcMn;sQu&eb+Rd|_LptM^E3zhswH`B1&YMq&KoXnGf7>u zXd4?JsEzivKqh{16L7JuUbCuZQgM%0FHg>Lw2nq?yn$Xd=SaLhid2J<{5rbaGP$P6 z6RAMH5%A3{Sx5Ff=F=QlH0vFkt3&UH13XnL0-rjR7J`g=qY|gC!Mcb=jGAZ3WC?HJ zH0`3PQT@2Po5TS|0aXmKNZ8dIZ-~BAruhW4W2J_a6r<(627Pk$oK-i;tKyxP1wTHg z+DgG?u`1NB!-8lPuT>}M1K=b$HdbpMobK^D3oQ^R!>>Z!eiJr z-jR#)^aBg5&VnQlez~d@KO$CPH^L9(nzc$;*M5=S8ZI2$y(}_5WAM8_K=--;-Q5uF z{a!jBWd07Wu;)x)pmAOH?AQF8>jD{>1NiZ@i}h?7%6iA;DauGxnj2Q5HXx~wigx4e zM?uvFbg~E48)|3qStbGl=bOA|v3u0w^4G^>n*?9$M67(|fg)`5ba+)bSbf-4osp{P?ETQ}bQM-)wwp zg%`^}YcVl?IH%-Nb68;{zhAafG zNAIi5^rn{0T_U;B?*0g^MPwyXWoGJ@|M_H-;So$wItJ5LF3@XNbh6hW)fxc%?xsz* zirio~t9KUZTO353IPIM*y1etrh~0a>En!(H19g&6j)<-hAw<95*l(0D1H&8my+&Q~ z-Il8L6{wM93Q+iDx~Pk)t>5{2@`Vhp0maq4HpfQ;*UCX?bHsM>-KE`-GLE~)C>pa% z@(Sm>Z@(^qB`*qiNc&~|B(XUCJcx#zT)(yAldNY5n1Xdwefp{t-GF)Y4Cza)!Bw$0*~PPoq+u_?jP#NP8*sVAEV zQP~tL?LUPcgr?KW9GR*e6}*M|&NX2r9a?~nCTRM>E!Ff`l*&14N)Cd408j@?2lT(3 zsc>kFF89B@)~d|kkJz7RD6gvAa?ze&{d7xGv+*{8jqKgd8q5i87}al?J8!ZZ3}Hq7 zN1%Nt8lN?eyOZiI^;gsAio=@eA%y7J{$gkZ;yTDQ@EGrAPVJ1O&E@ForXcM0)T+JN zD-wWB`ClQ5e>LYyQK~f#EzWVUFbhVdD#7|JAeq z)u|=vCdk`yT}dgn2wanK*GWDwO=^*(I5Pd0V3Hrf&M4{uWMN}4(uMbK;!Ty@qlael zb`u!-AQ<#M{9(B^iSPfg+#v-Y2^GwSIn(e{8FB{wkV2ig`!mHxtt+>_zxftQ<7&s$ z{lLg7Bh_g{cq-ij_6%4l<)Rx*_NJ&UEYfxBBAsqUCyO^L5`xZgmVF;rw$w0~n`J&l zviOqTu?}*vQTZb>XW$LAacFb(@_9xLIYimY#*$wTFH@V6S#s%@M9KnL;W-Z_c5nun{MK#pEawEFc$nQm8niq-||diJ*)aJf(9 zJ6~Hpe5^1p4Iw`g)7tK~;++|=rdEZaDb7CeV1P2ElSxH`eAufG(byEh)W>M_z=YP% zW!Vp>*;+eBfW2qinr@r8yx^Ui6WAKV6=Rz|GYEkV8*SIhQJFngg`I4xv(DcQ&-{;B z2JT%BCUPajm#%c_ltBtndqK$#cM()fpOSc=KY0v1-&M-VcKT0EBkAPB^^gR#(Z6Wr zpmmeB?c{)~?HxHwE|kneru!B+9|8lp1fW&bJRD!!-Zsy+4O0)*SyJ_Xu_C_u$(%c@ zYu~ffsc?HSYv|mn>xv5&PYwY0RL2Q;NRp9g+{)&xPaPLot42 zQiO8e5n~nWtg2j&(dmh~%yK*T5yRPXJ==Cjk|K-Gp{9!zl#e7g{9+z*{XO@zlkK_A zXzlDI7d|n2;vgyKcgVDl8?L^jivA3<7FbfWP16-Iu-4UEtH9|thk80fCGpMA4VUVB z7mHk|A%`387PCuh}WP)E8i?TFI z#SAZrPO@9Q=N#>{>BCW8T;D%XPcJE7RikijSZ+`lAfH8K)W&R!^wI*e@A$VAcG*Op z8H%;l%W1IDe>R_UucuTHE_=9TBu+?`i3wE$)!4DuxE;%_Jn(sOW#yw==*9i@m&=i` z(G3+c_LPkz+ve4(rOOKq{dw!-*AFcRVOb%%;k64x7J{QK&oZsF0oxTH{xGBH=U-#! zX=wW&FpY)m{kSm>+p!FgcKp4-Z2|@xh4$%mUH+&>0kXr87T&|I{rIR9qGhYP0E!U6VGo<+=_2X%CpNXu0K^&u|#bBgu%>Icy zSLD7Z$M0s}Y)^Lc#7&ee1t%z4xo>KpC?XJpKC43E1hi+jHK_K8Jip(VpKbkH zvj9c)w~peU&m+US6zxFb`|?fo^*C>z*y8T4$Bh!WdcWpsbcA+;9#>(2eblg+cg9fxp^xfQcwBW(+o4QYCg6Q@gCC@q-W-TTuJ7~?knKyf0n_5y=j{z%7 ze1UkI7lQH%!D<`R{=)50QOZ2G?U48M-^bU>-o{bpnq+!oK45N6*bZWcFqjjmfb)VK zE4CI=@O54HeCKBDr>uLi5nE#n{}A~6V*vPw|ECIWidpr2;`2vRNfU2ShUaNg$2I>A zFD$_3HHNq}z3@<99&e3f>^ZqrGj#%+h5LI0zU3v^F(7;3kNEzt-o87miLLLJBA`!?Kq(gvElpZ<+2!tjzbO?a};Res~yyv|4 zz4w0KbMJHW2h1e1XP%iod+*S$3lHdD^Gq6DFL#O=G^FTuQ;ToQ^wT z_O%HYq{w>gV7%*T{AO+=?TCPV^VFePI-5Pyh(3;3p;JruM5zb$3H=@GwU)$ppCW3s zNaLCN%>v*Fn63N(IqhFU>A9>68NV<~0jA`RgE!;%FTU-ApIKIJ%d0Ovi1G#Uz#{gy z!LMe%S#R)DZ$1HRiRR}VO0(CXKRJmYW%8sGTLgjXzNfp-u_qA$S;r|bvlI|B6J{Mp zOM{#f+~0k2vKk(~zqJ<;+!DRtXNlU3DVL#Fz9>06LWXZceU_}7oIIfQ+FSs}W57TA ztjshPqn!1fOnEkPQZ*Azjkofeuc3{ z-c9kb@9(+*}_&Z`k{kY>aE&xGt9`~YVUkHT(YJn`n}_?k)u9y3&A(n)*V zz|W?q4a9FH?KxI4PT~5tPnW=Y-comK{#2Nvt6+j$+qOMUFR<2`SKSoI6_=ScCjZ zforB^G`zNKI^>l*=a@oDE5w+-8kCMvo&Pf!r+U+Vx{9y*GdSO4lKq*-{_TjF-zhr? zKU{`&@901I#G^0nIIVkfe<<9%-Myajk7(~|dlbai3IAvF@VbUeGHwpLCNU*(WEJny z%bV6;k^S(A1OIPlHm2Xl`^A>~N6j2R_M#+jCD^E7YO2>?59`K_-Ru%f z4{HNo`N(O)U!qIT5JO+0%e`6dbf2RY%`J~0a2ymcE^_l+Yz3u)$x8)k7|3qOf!KC} zeW^%W^tPW0C9yDxwd)0+xt$JJ4)&g)0hG|n!b{7p4@jtPExAGMXYj-2vjT+wI!Bth z30%!Pc%>l@%TZ?l*=|HLagU6x0H@dVE3|i;8?ppleN#t?J`^_Nh=&AIIBWpu@BNxV z=7wvZsUaWiadPwgBzVKSEk7!2L3OuVo?~N=@H1VNVOA*;ja$*MNbHkLCQy8lb8WDo zmgGZ+pH9$@4MWJ61CQbanh99OM%Wr_>7$a{==SM!{)18U@e~raHCGMTOzQSxsR}1(>}8t>BPnz z2zt^F?$6x>38x5-6V^)FJwv|yRcr6UaGFWdpp(ZRqc3vjlZF9&!IcW0S!TFVEbx-$ zwXb>qPLLaqNf2&gz#yAPCDBgushds66>o#ZTz!ozZ;lqY>(6BMgLY`onvx&(zGe@6 za-Dc(Rb7yh-ZrnPk0D@Cp7-%cKC-gU07WhzQX2PUwhE`8lG!Kf5Rb^MTvnq^b0l!Q zzsk%4PTOSx;<&;-U#cO}%yC40-yRjP4gkxKJ} zl$2gZ7w4;dxb*sv{dgP{7-5EDI>Ck3TR2jcUld5jgm>wKlZRI&=2aYwo~X;zlyWto zJQ`GUM3&9aLm^sO)O43ibLHA18}mh`&kbCvb@X*7q#n;s49h4cGN%jFI)c&c(1tqX zaxHjId=F{f?I8KpLYp*jl}ggeDU?goYC@dIekhYHInQkr=5GkP3qu;5>3LEj|z!K5*YRL_6}kcfhsQyMidGSCW= ztuv$AbZ4JY(cFz{RJ_JIKjM@+WmPP~ZUY*jM?$}v+Vj<6uXzWPj;M>^q6HNj^8>l` zXYdDpOa3|ZD-2fLqT7|qvv{r#9$WeF_E9O*H_ImWMiKK#(!#&Zth`AQ=y*O#|UMaebu&hvzcO1+T z(ox}=UWlkh$D@Ms)WYx4S9=S~j9^sIMmIUnq3t)Sf_WN(#JZg*Qu~B_z>~n zOOMf5A#~i9@n!!(mo5n_$wNoWwm0Kx&kA8uqRdllx&Z|#GB}Fo1l*pev$|4vN6G{G zd^;IiU9ToQ)!@YNVkFNGh?-C+ErdliAKA`D$SUv5zc^yc)P;~Ma@ft~4A^`Qs1lI2 z(K#unv|#|S`uC2_IRcAPq-vlD9P|YVh%&>jYaCnSbYxOk6&2!X%2ORh3H0{cRE397&Ngopd6}cYIf9x znOP%?=nT$j1#b(+tkiC0$tnlv0jklyOE0 zQ0na>;(?0=Ju^o}I&#jQa#2!RYg-MB;r zdW3&G;0*o=}{b{~;+jFI6a8SW>y({aR~Cnq>afPi3bOkd)-W!+8%GZ4P# ze8S(8M9a`c)D@61jxbEs^V(`)pUn92kS`CHK3Ydx(Wo%db%g)c8Ku=&fWrwy#^t@Z z$TNirVoH^~-U|{$+nkIaB^3l@WS%mRaGF#k#hWV9P7pq`e{s}d=xvI!1$ecNqkJUY zP?_O=uR}fiB?kVKJh~*}siYCZ?+mTPb*6D4MBL|DdzUMBHpsy~($__|6R#3zHFKGs z-FL~d@V|qY`E6?KW6@FUGs|?!0}8C#FD?MGEWNvYwTa+NeH*Eh#(8k0-~4$lE88&& zs>$g$V>C9sa&F6*)Agprm_t7(now6Q~< z^Y}@WJq{3Lb564c;LaB-PTkqJ3KwNO@De%% z7^R7XpC*c=nIB_*&>RnjlboGI@Ucaz`I0SN$5?8 z0jHZ_ym2sSJXI~$Ht}Jr2(iagPup42ow!X8<+T93f4$U2`1RdEOZZn0c+U=ITTR-C zNG51~Oy9{~F&~}9-(TJxO_ zax>A8()FdXMu2;5u!n*O-Yl`)FNP2j8s(i?t2LY7nqPNvrpM_A&XQQS2KN`?jf z$=&;2EZg!3pMsLA-S1%zM}Ae0vDt3SomPXMq}-B0|I$T@7+&fkPpLlMTAarzBh@zx zB$NT!@mn{y7kds;5>q_7Rlkepk6L>UqA4_;AX%$z85TkLZ*Iubh6rcU5TxYzRj?2yP#hhK zOcPNdiiwl+O?CLNMQX%oP&3sHkt!(}kEaNrDzU82;CCY9J>7CEnZCCx!#+rK!2`+F zTZ-_e`XG|{1(A2J!uT08HGq~DEIK*Qymby@0`90)_`93i?Z$TNo0aoN-3B2;>&~5{ zFzA%%+WtZ%XR((suKE)UG}>;!rR`o?@M62O^fT-7OARCKs-xmD^O+0; zDH#-aQsA)ckZ>;EIQ5jGrAs{G)f39=_Bqo{2dO&W=<`dzn@oVH3#kv4!krscay|AI zEHU^$j4IrC>Ng;5?(b9(ybf&i;49t|T_jftJ{k69B!x~PJ7{ew7kP~mB+y;5Q$h1O z1Pn~~`F4~TLf*p+enIGarp_jm=6LT|fZyGfIdx3BUBKO6$SRY5Pj zU_RyyL2iASjBCH)`?(`r%Y5(gSjFt1?(QpXSgjrZt?S-AXJ!e;z@d|5Up0ESK{Xp3 z42iaQ`&8s1={9OnE=aRr>}gs|bmjN`eAH3Vxq;X%s*~=D{-yEFQVDkXgOyBR?2CH<20R0o!Nq~ieaGcwPf6nVf_7s*q2C65Wb(YOP@1X1n4yfzz~;l| zSS9!v{N9zWye}dIKVg)Yusdz1rq%xC&qG^W^5)HzY38zKSd%45+$pKUeSDw!1r`x? z2xdt?TD_}KDM3MhZS~0glZ5JhZ=s&>U1N%D=wE8d)gjPs1v!2ICzrg+bz_BK)lDiV zDao*aG#MMU9gujXjWcq=^S1vU#oYNG=oql>G;fgELhQs2CUy7P=4r&H|9D2F!!)Od zZE8Z%ZRG7Yov+hs-n%juIOv?ROJ(|wLwbUQ5vM;&yf^q)ZLqlL5LVC-ybp4N&<+{O zMsNwa{p8Mc$}0fS*ZLHhmZj5ghhAuTm^VN4I~g$hLp{0nQ6w>sJZ?Hx|Mdj0gqp#3 z87mOnMVJ`%D8V^zU-}>pfM5^dWXTOJ^_yoo{G{l0{EeAWv*y=IWw9E89wr}uLmylDt1|Q0e#&KF-piWF+;8^si zR=S?rx4zzL_kIej%I_W|WxI_smumTMdP=Eg3!ly*9dIlvY$}FsrS7sVo zy7K+S>xvtEwdMqGk1+b+vi6Ds(Jr+@9yIw=d9FLsA zsU=Nbh-GP`dVl=(RE!%fl#EdMH$=%__x}=6k`es?Ic!QUlPQm>!h*ff23 z52>4BRyu90K@eN%NjQMiUCOnMnkPF$OtE7kTgV&m^r?LCAwcS47)>{EnqwU!#Ruzi z-KfKy)zM*0cvhXjML2E|A`ygPt z(ZqLcNDc=0a-{iu)m_SIBgSKDY);LN@>gPRD*eBqet6{5L_`s!n^gFZJkKR?%vu==^5pUS{m-9d5oWZMca3Mu7_lIBZFupT8e`ustFEqgJwDljs1kXv~(>kH2Xs4Gb>T zldA~adWlEmA@w3ebCyu~A3Mu+gujp+OFz`OUUQ)D1z9T~4{xsAS(FgW2HH8he>FP? zM=2?mm7^zteG=i&`=(s(k|n%XGE=Pv_P+iJ=TcALI38A&hdHJCB;v2744His(}gDq zB7f?j5u&dy5sil@!Nz>T^7vN>H*}Yf|JPN&kuF*a{9QHaOpnu4ULa|I{E2o+N8jDwSPVKO9;#pyWK$atAu387X?}=jVYYf5v{bw)Hk5l zI`Elk)2~z;*ZiB}1S{p4+PsFW2U#BRH-s@M2W&IieM|LBgwqyG~gCL%J#ynGfu5)}{b zd7uyT&^G<#?UXCi3lwQqgRcMo#=>Br1ENj(4v5TuyvsVZcz9Nh_z9%=c8EqG5F5_C~ z{pIokdgp{vT-*5}&DgNr39w}OZXUyRDOg;QC{^29$Gx8hE6S$7@6EsG*MS{TWE^VQzaouxp|jMCDGCW z|NUo?@|FF{a(V>G6(hH+hZBgQz{?nI5sBlH;KYR&Zid8J0n%sv1zCD0j1YaErTM1$ zXX&~~m33z%`V9`7i@>ggiRKBsmY&yiTh4Wktd5+Spc;Ha#iHR6QB^pRXEKYPkk3I% zcrxx+UZWy!>F7Uk6WDg}_|TkDOTFJoQ~csTAw0xlxF_&z2RdstctuD*mg^UMusOEz^(qftJO4 zW93cCUZ5qFr_7Ju-XXK!KiJ5JwE5=!g?1_B{wK5xE-zCg93v#_SahP!3C)HM1fm8EHtrM1S(%&t0Mdh|pZP~A1r zy99Erw%y+K+ern}u(N%Gy;<4FMEIj<`fzXSO6=J+NZ>i$#o;dd8FGh?avroh3x05p zQ~D_GlU>T0-RDmXOgnIjx)~SK3V)6Ip>9A|Jw!$8IAyPcS{)fHpomHnV%Fok8@0Z- z>MQ=h)u4dvI&rO`1&+p4!8G#Q5h_CkTXot$*{JvQ(VC3Slp@7c^txJj<@lN*p?73W z;b^MKsAe-^_flnzi#ziT6sUXjhC%1p5h5ebb)0BV>Qkk|jzYM%lF)e=>j8 zw?~tJ2T12=`8Z99P6Orz9}B*eceNA)&>JTl^Yz;It}5fSe0wR~{%=thUV1uK+BQYc zCIq8!5aXrYSLVU>U5SQrJz#!6+!FORAn^A}VG*UgU1yM{LmE2A-I2oP+qwef=eUzG z5o*T|Qi4PuvgPktg)g=4(0RC9QH>KiRg_CaCWV-deW8})1>-@K{RPl0f5W>%EC*jq zH59duDKlEXaWtX#bVN}rBsopr?>zweRyUr%Q=@lg>#F@&s`el4zEpmAKVf_nkUJn| z@*>l|r7wYT(M{AP+T7(z%Co>m`WET$5E;q&E|}Roe1h<}?s%MimM;K%0*klVo!e!W zX+la}94)-#V^rC!Si4+h(PgHEy(}W;b@3B(`&?(^a5Bpg5Ux+H#@cpOpVdFWdG?KC&r$V)%P(DWDhAFPb&o>qN26)usZ>bZ2^H+fzWq;LUlC-YOhNoR?J{%ZGq;Ujn`eAprA@sy z-wNg*)+DyB`f~Ciq7pSqAM%~m>jUd``I*xc`t-`%_3x;RM!Sp-1WI*`wfQ<y$7VU3;d~aD{p^n-D?HM z0)761x)@6T9qP(ry!pK1_C#kWamP~q^+9&@Z0wjPQ>1^WlU;##yTm4+ak8V z0ERNU6mSk;83pZ%ckSl#TJMuO^XVuHze+tUa$IgzrD92H-ioTUY<-@pj$3STvhlOsEnXuF#3`39~ElGGcDpig92d@HY0D z#LT8w;S_7C!bS7~mszl(v7kG{xWn6gBb;$0SEFE1S;(e%r($F^kdIP!UMvOJHM62f zhJosWS}Vn%Gjp3(s{0h%zYM@$G)Sl8_pvl`o-LowxihuyWtAmzmo&n>P4)ZFcHX~& zN=dY9?_OsK+$`rypJ2(+dN=~&wX|-aXdvqA4C!mEd#Qh6AgIR*V!@GxJ}{~J)^Gj< z&oCgI8qr3m?@o${a9<`j1l8^5mk4k>} z9U%d<;oT1R637=&f%O{mCL%GaW;WXQHe#<{2Phlc2(V)A}7@z70vd6 zx)ekT(t;nPOrePSqr)B!`VN0b%l`Cj79k%AqN?VG&@T#3qIi`*oS+#~%Tv7%cTi+( z8et8lwhuB<>RNkOnOaiIWKt!1;XdoWEHSl(f6#=0ss;6rZ_$1$69_>|HDFA6i2awJ zwYA0aw#YOn@pw~gF!@lRjuMZtV-J_S7u>Rbccr>F#TXv-#`RQuh%ujTUq1vcTkTyR zNtCn>#NfNipTDvkPRCh)Jou*>*j&H-8}a|QW?)6c=6qLf;;#oh`cxA_tz)~!vk?hN zFJ#H?INf;TbLvHWA7{Qf2m8G(kW-=pLEYl#a!E^qUt{jhCtt?2RPxwMy}v#%#{Z(% zM4KRngySv#FI=l2l1N)lnZ#%cp8J2owXTIxuc-1nzHu631`|&5rqLi+Z@8Qo+H_Td zhi-9x6xZzs+H0_P-eK;-@sD6HF}G95TB35j?7^+`~5tKAX@U&86>TlI|TS8y`_g%vNM77*|neGM|m$y;d8@9D6rq73j zkx=^J-fPn|mFzpn(*0^JOoCVXEyXDwIQ8cePnKO#frGuvA&ELW?5Nyo3f)w<^wT9Q zEm(pChf+kf`=vOyeT7uE<#h;BQ`Z)*5|XF^NGG7+=C5z;Gd9XX{EpYkuF%?72_&aT zL7>3Pwj2ahuj&SZCE)11-?GP3iwh@I4b*SXdxo2u7Nz8g+cc-%3h|^1JfYt`fPk<& zxVUJE5PNF)(a3El(c6OJ(&@CUa=R2M+rrh}LLqS78U|W*iX^SoUExXjx-V!TLTxcMKqTiJseNq|P;lAhk=K)?%9esv2-3@!w3saDdkS#T??iN;E##o8e+zA40M{ z&$g;OVc?lArInd394-8;U(^7g-ljTCv_#f*hqD;`Fl@MDRcP!JEr+G-x@u14w7ybj zNPMOqzj{J?j&XhPwqC45Zf@jRc}aXxQ89#>BZvD!!Aij@zld4th8@_0KH_AlAgN0P z(e?DZSFNY1TEcqMQ2FVVPkPTtn{+P;{SUYq9~do}KJkxL0D zT!Gm3sw!hN^rX~BL+|zl!r15pJ6Sb*9j?A|a8~b#933CCk2o|wT3I}>$)vAaKL=z@ z)FJJQ-Y!*%Y-6QMeL&Ty2LG*xTe=Jy>~LiIgW?f=?j~3C`a%1ti#QPMc^#&6I#cw; zx6H(F!}LI!H|FCC@H?`$%W_K}1g!hLah1ejJ)=4>t+qx5-u#>g;*gb`#roZ&cTQ#E z$iLHQ@2m!99>!7CU6%RT50c5!{R*E!FL*9%DW|llp2mn>zS>y*72QS#1+LAfFL z^KD933C$pvZIq#_$@F8TeXHOJo9>6(VZ8@+{sG9NdET>9OPQS1ERb)K$*>11YnZFk zvBT!b1!4_HJEi19K=^ogcz%^dFPocJ2ea6@aLe5p?CHh(+=hU;b#E^{ekImuL9LRe zA8cUnRxp=KZrvF-5G|Ca%Mj_l%)``Qt>eYBy=3ZrS1t$fI(xl0lVUp=?QCl`Ci&2# zqfN>GEd$JdLQ0pvCB8~@h_3WW-NvX0N&Us*<0aX3{@Mp5^?(x&K{RV9C{lreL_*&d=dU>^$be4)i*>9&+7wAgAZHf_nth(|8>5%JtmD!s7q z@(yMoG<>Fs0q8xVpcpP)e)WQF@sH)64p@TjZ*BUahYyA^Ib`C}{Aoch_C@2e6IGqf z;`Ujub~xXA>UgdPraJkCANi84jgl$m;YazXDQ;{x!l5&RM5en4{Qkc!EMjSk*aAlo1Vv9i_!C7 zh@|ghBH7!!t`zk=|FedVR1Pb}wVy?TG%L# zbE3Irp1NtsFRppn5L_M}6#jtX^w)A*O2@&wu zA*}^Pu6UwCTIK9fp>H!@+RbP$Pdl}VO0~eWtz)a4eQn2(Wqx0fSZj;u#CPM2OtEHJ}cf*t09+=G`v9YJCZAzqGrH|OM*hE7B*8{Uz;yI z2L#Ke-A$^sK%Xw809G-Zey0b|WCGV*OvXiY@$jxCJXMf=aY%B0R7d)`FSyTTw!>&P7U zc#fwx?-$z@6zxDW95UDpf84A1+%6}{O13$#S7Pq?qXgi7z-lrXmod~WifrC6X8cq$ zkWsRnDEP(%>Isi;0=HEse3RQl_M)XPeVt3Z;lI2kytzaFmZiq6@A;p?JAu} zEnIqQ#KWi9$$>q~AQQY@twF*_Sbek?;HFt*#1J`N)m6Qtn^iLMqWIfJ-AwE?q1pi> zomvSq8(8gb;zf(Bb{1$tM|C3Avyj&XgOEcGkRPiD!W4FFs-S~)nEj_IOId4upyFun zY(7ZF`uS#F0LH(IE2(}zAu0OMjrdos`>s*rdE|w`npA8@?mFq%c4*}0-_e76G^kU5 zaXH64UTqWmU6l_i-6B2y36?O-QLNJR;)ltrU>&roX>~tA#_2?j;AtHn=xap)4Au=c z_)*GWoNO$^Ea|3nGNe|Ys0(Jq?EBd@L=e}GLzB$N)IEkLoqTKiMBp`vrF8a%I=Xc& z>}GvDL+hB6pc09qtMqAe@b(1bJwIl^qz-O9M8`w|&?lu1 zDTAVb&eV8G_$xW?J~0}vL1xHoE%b}85eLRRfP*J&?=`hQNf9g{{0P+STuSPBx3o&X~)_ z`SVke5?Y4OKw|gywPh<`f4-LouMS1PxRa;*$_G}p^O=0y1DH5dNF7)e|5!Fn*l3aa z#gbD8e>z@t=!p=Q+6{kk+mF{91nZ59f+L;Bbi??I>@Ip6d#*>)ilu~8dWj^@KK;_D zLK+n}I>CQ?6;9k4>H4wU=vI$=HqWO?Z}H{#Zy7_JEE1Wc7S=y$^H>uX4aazOlG@}NwFqOPt7i)&-7CaxfH!6`}b#kmY*{B%lTu%$vU z=%P;@b`J1IyVSyuWn1~nP$3y68EmVwGT z-0yI&!ue^6Mzm16GOVE$GcqkbWJf*4Yo$|w-n6j!dJ%ZOgEk=E%`#=)?q6`pb~q&^ z4AnLPL3lLN&mWhap^VwXxtV@FA~&}oyo$Q+i5)fF5w|={WPgj>`qP?6qttcb2C==f zR!0q*Fb23$MLz4cFYse^ys?sc_-I#f+!^MsHLjbWSJ-z5jWW{FW(jY+-h}B#4CPKW zAitZ^R+lBr+3hr z%l!{);;5XjGW&+`vdLAz>Pn?8xUAH#JfE9;&D6NAp+eC+o?Gdo!fmD{AeTAdHU8THJGGYL5x~xy0dwuhdt>{f!H%lT#-B-&@?%XAx4L3*A95~@zRX*hAdaSrpipCCekiOXtS%j;OJ!Ssj zg>Yv3I?wBPU9uw02Tnyc+6X?O+uD!Od0~9yBFNJt;`lmU>emkNmNZ4LvUR`nR>2|6 zzG56PSXhVA#4rg?yze9Lz@@`Y0Q+!G&v)BcC6&yxZD(fsv%f|}O_h;@2)W_(RE1jG z^7Fp;xyaFy?GCvYy;2F5m3BbZIdQbK`$4G(?UntBQ=1KuTHL7Y`+Bg%gIkq_F`wMB zv~P5v*d0Kvy3vE43u5! zLVB^0cGldqyHoQlD2h)f>2+ypKr=?8soVWgG)8rqGb}2-kJwju~(QKcE2OSbJ`9WM~E|_&uQN+D(XWmDnm8gF!iZ zWnMw0inE84l-FID>Nc&Rz*{6`vSyVUX5 znPc^CpZV`CKCy#<(+DunF^ISj2)#urxlyVI+IGh8XeAgW6#@}05qjkNDf$}hS24W$ z&o6iD?8xWmW}k#fGx>W*C?Ndx2)$Zyqy9C(U$ISV#+U0@CP#AfzsljY&aTm&C0)fM z{OhaMP}hX{a)m!b(4Sv3rN6B3%$hG}LuJYYW-{c+{dF*25cml(|G#!6Z(a$y44?n_ s%*WluBm1?3hZl1N-~3;DUToNFXBRf!zP&H{F28;HL|vgw&OGFQ09I33L;wH) diff --git a/screenshot.png b/screenshot.png index 97aa9b20ea6e74d658349f06d7a7fcedda1fb1c4..450987785ea8b7f14bf5cf351a3dddd693cb2561 100644 GIT binary patch literal 104176 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�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 L{2n%Q&CdS=((rl9 literal 52000 zcmeFZXIN8P|1F9lU_;y%lp?5rbWjB8L=>fiv>=3{(tD9!5)_e5mlgzsh%}KBYC;WI zsG&#=5FjETB|xNxBn0kazuWD8&vXCJx%caN&isDCgA2%-3E;E^omHAxwD2u;% z@zFX{!Kh`0=3C)Y%q;l#4@-^)$GA zGC^PZTZ#3h4t?4Ahk^S1T^h-IcwO0FN5E$}?~$-W{~Ujdzszv*pCbnUBZnUSKC0z| z;x>N_7U~mx6@Q;)fCTLAQa%OSGBEygvgML0!^MA&7*>xSZux!WseYQ_AW;7)VT#Wg zuKzj!qW8!DkLn!#KlLZSMQgNG+6Lw%Wx5}9vcHR~(`N?HcVDY)&9GMY`$vjJX6e ziX%SRe=J8ti<0IAQZ~|}@;XwaA~puPG#5H6$CtG07iuzYM)BQ*5!6!Wx+`BMKbW$r zOmtas?f%(=uA5Br$+5zIsP>qCI`Z8QM{{ty=3B=GcDJsWm_%LrSB=W=GSnhb!-k}* zG{j6oO2IP=&3nu%wy$(!zH4~#By#KgNUuSG3^VkkUkzQ-a~S)wF{k0pn7?TJxhxL~ zS%GE;Dse2l^Ur2daI?-eyycxyka3dgOuGIO$yI`N?5%t|*m>K~^s|#wlWPBxMw_$n zCKfL}{6M*;@j;XY6UEQvdivJ0`n$S=MK32Yw)v7cMu%YoZX}}e8%gYbee$zw_dG{gQwlbOH5ZCZ)N)VAo)gr)lZ)Zs zGOuJ;5FCIpJ8afW=3_dnpLc7e&-ipx)Y@FC4M)7He zKjL{97duWj+2Fo&Yp?9WwMzPJM$7m9hLbN{L#7SCp}4M(m9b6NrXmmR%JX?f@>bfV=Bx{=KaDY$Iv=`i32ez2aL&@-MGds1 zlasGyC>Y+F@~%O$B>Pmk{SNTYj}_Um9pvrUR`w)_i{$Xdn{yrI& zdHerPT)XZY3FeV55d(}8G{0clOoHs>i>yf+m6+-NJFsDAr2cE&sEs)EO)ckG>V(hD z-{JhGT;? zy0Ri8Jn2+vZL3=3>8(_#oXUuLD((b*6Fh)Vqkae=wQAEpw37Gw>_Vq(LbujS`4@3% zlAHZ&70_B|b3(pV&s6=JKA0Kh=l!IwkSWPTr)8swF#Z(NJ{nRp@`KI8^-* z$|J2wbfPbh5ENg{F0Sk;G%p*ll`s?lFU1iyhZJdwXSI-O*Zr4_B zw66Ry{#^RN+O1TZu0tQcb4m?+!Y(Al-7CnK6WWTQ2I4K426O6{<_}FT2PJQjG%%r) zGWd0MBi4ptdXgS9Wm7E&XSkp*N^@nO)wvT`I#46adJa9l)Q8q-lglVL%gSylQB*(W z)U?6JH>0DyQdDG-W@Ms*TIWo%#<3(1+|phd_&9n=&!ydaanzGBKlxex=iFU$4=m`C z^Yu5*KJ=_#9lRxOOoCxqiw{Pzh2?2o&o!dCp3(9uf5K75SGa>-agk0q#T!-}&m}tL zyZY$ru$IXMGj|-@Nzm7MwyA{+KscfA3PH`;4n!^L)?9uzZ0$h;yqmtDX!OOPvvhK)<=?v_<>j;{PsK+Q_r~aw9-}t@woR#Cp42L6JZ^e(KW81uWvzMnYF3+ zpan;qWfk)2<7Cu58z(8nDObuf>Fl0ISY9SYk9JI*syQqFscXl-Z=|Mo(rRDw=cM(J zn8&EOPa~i*?-!YkD33?rw%k|*oF)#tY(LUh_Iy3i!hp1)HuKe_u<>lPpY#Vw#R0kX zVd1IKZO-pJPVeOu*|~5K7bI5-k9m}>d4<9e*e|e1s{0&w=#7S;m&|4E_N23YSdb}J z1HZ1gmaPp!o^j$%J=_aOjU`o^;QasrI?jO&+zqov zqzHlngqko(WqU;k5~w>3vJD0`b!goNg>0z7%xf0zZy1)e$y;XhzkVSYt%yCW86a!n z%Y5(JhZLseyy<@5Q$IqpPBherM|-I2)p6;}y*_UT7pPO$tEpbM+8RcQ)dXEg^-q>d zB8oBJQN)}Rr1%C}3))G67gqPKKYLekwYh4OvtpGq>4o6&tho(YukhPm*p7>Q4ne^@ zmw%1qN2Za-7zC4WNzdO>{kS!o9%Qi3A!f{@9A!mU6nxh!ILMcT>N?uld)q^O^vGPX zVp{X7DYd(#o62wEW`c|K_vV#E$^8!P1I0MA`=nveR`aF?f`GT5X4`D1A-9I}H&6fQ0%%!LS0LH%6bvNek?7vCQ;RgxgpsO6+3oYmPR`;{xM z4-W?N-D-W&fp=JD0@Q} z);+jkvrrs#@x6yq`rbFrLk-=~zKCJBr;2koU}q!lr`y=f_J*S|+*hhGr5U~23WnGUgqYK2| zmjXlRX2%wS!ror|jLNryt=$9w=&Hkv3tT&HwJ_9_IvwzKzUs`^w4mY53Kq7lO~U@j z{@(Y;0x{&_xr)7+dBhfP{+XUuIn11s*(+HtB6)hOc`M}S9Z*v$k21vyVbMEJXWQDs zwMq5sMu%aQ9C@jOX3hLF4=yB8S16l2iRpBWC-(+c#~R$#!(&cZo@8hAyLY;Bm{^Sa zz|7AUEK%Z-IgvXc*C5`i8rVHD5Ex=m-H#XHlLnwIBU3{P%R+Dar(Ug5#jcl<@wVp5 zmYeu0V)P24ivW2oWw1~>ZV%aW6al&RjN89)Dl)DtezYW39jc(1csCF(;4&xU6G)lo z->kGl(SW=M4kvqv>^D*mRu65uNSy-bedi1NeT>u%o50Q**a&JR{=%DHaR`v!xe@XkC&7_djANFECLR>@!TH3=D7irLyl}-fW8{t+}r%B0_hL3_n^ep+h5DR}aHJwTvr2aM^30Bhm0~U<+28l!cAY2A3QJY(L%=I9l@UKo zrgY8)wL0)|U`2YY8@s=6TNcyrC$9Sr@4pSC8CqZBCFai9g!=5>0a;ir6`}`_z-R={ z&^=A|e*Om{wx{;kQ=WmnzEXyR`B$LYLbF#>)a3zTcEzh zrKxol8H2St<(i81&;d{0K_A|VpY-w{G}Lz1`D+GKBwgGVebN+;Z>}ax4U-oo=zgWa z*zwTu0hdQ8T}W0TOCx%sga8k`K!z71uW-q?G}%$)2xB?D5mcE1FTBUnR3&B4vucY# z55~F>3cE8Zu%Q}tE4m1?rwDHi7d&QMl_X9WR;KAL51P0s4k@1jnt6%~&lJYjDQBqQ zl+7KKbTf58I#~XGDp&VUwd3nfi^fs~O8)PD@`GO$Xbl=K`n+Eq$sFuvE#UOahi02C zGmovad@j0=5wCkTAU%8l2)~Q+2+pO;TsoEaGX#1wJNA5W@j+&{BBCM4dGeZB!=SNK zMyUs~KAv0NyFSUHaFeAc6}qz;hfzL&xenBo<*3c4>}&L$HCZa{0%FM;X}yFSYqus^ zBcLA&>4HJk_Nl;XMYYZ7MY~D854k2K-uf{l=q|A zAN;@tXYT&iN9uvUT$TsqG|`p~_J`Ym2Nt1&noGDg?(KrA^hUUKZOd>D@0Iro z1JP4jG#^TW+k6gE3ti@duZK4D(0uf1yQh=BVz-^9P(^2ptTWtcxw|S(E5qKDb$?ci z62&QgO-uRsSzB36?+nZvlpT$8jvQS@T3-*@^;NoATMp^&R)g@LRA^wj_l*9#1O`H9UTl_0}8r*^%S zstW$Xodof^#1AmnIz6X)WdEI4a|+BEM=E;L_HLYARPq_}QuO}5_KEiy^qb=wg0A{} zg@X1tJ4dbtYS)0ywlAK26zTQGooBOVuGSFe1rDJ;+w<9u!!*k7@1xlW3m&FPn*eCV zAU$yRpqc!S;i1#aW?w^&$!g3G5<#=0mne{BLs<=zReN;R4$I?hmO*AvrEB%4_zAf( z@%;?_3E3@(t*x2cmgKq)S)jdjR1D_blw@a+iQe7ZT-IDX56bQ)kL@nbP^dphb|0Gt z&UT%^b{7E1b_rdYuYc9_rrMndD>r<5zF3+IeH0i*>iI57#cz!)7|%r5sDF$mj`_J# za@Xr!eNpnGo>sUKIKfBBC&A-zp{L893xFy;Zqb&Yacu*(sKJAb#9eNd z^QQDjwVP%0LXCp&AoQh|(*Ge{2z5+AhRAD!$_H*c;SL0;T(UaTf9W6pNLR&+-9+$e%I9Zy| zA?oC1*>ZgxYQ=Jj4_JP`ffXh$wnX`yF=hOudbvhR;BA&ss(Y^+B`W}#kGN2)jzzG? zwMFm7yN)f%v4U3R10Ts9vl}vNj3S}!%;4h?&?+W-#TfSk%!3bk3krogT z4zclQA(45-u%&q#+g2yoC1J?LtkS%x4f-^^=uMF3ia^p&H7^I;+q>J&)Ns|d0Q`#UB`V!OKsn$?7z0|K7DMs;k|2Z(DbhG zkEm{T)svYd(W(7TiMCCh*Fu4%Hy%=;ZikimjURZ)SS zI7GG!dfk0%%FOMfJ(lXW{kbghX;56t9P_(zwk^ZK!Cgg3ix_R|rqzb4(HA~}Svfcx zB!Ybpx=#I?iggFOxP$cE*gLwFaQGL~+TAEL6F?K6M*9Wt*xTVpV3HP@E5^+rQ4_;$ zBvc>Hls_If7GJ!Y`28WoZkm5O>P}%*vm0d0BXVD5vWBo!=I@d2K!qcj0^ws*@%>Fx zkg^3dBLUJ2hxHq|_+ePQ*R@C2T{@;o;+d77J}>p;Q=2F<&f`0$+odKTaL%`04=vEO z=!rH}(%o}T)9l6d>#1a6Qq|ol$f`HYAF}O~??&3;IR;Ea=)T8?TcT!bD#JX?&S?+& zSY0)r84tN9Y~Q|og@)AJu67&@DC~cDe7*VPN}IY?6~k7i=0u1MB5e_3HPw|xe^|MN zV9Ixm2m+VzFHYIeYm5(5(@0CI-&m+KbR2cbkh;CrG(hv%8jQK>X%W;Ulo|`qOcltK z5Dhoob-XD#II(%x@=Opw*W|DC*v#FsJF6yj0`^9bGx7qE5P)vg(3a4|xhBpw#D_~p zRTOb;xR;MP&9|ioHae=((O5i zo2F>XTegJWZMc#}J&qO`M6)HfB_ey>s5N;hZe~5v;~N)qBBg^DmhOY0wCzRCn6Y=L z-9dAB``b6F-#g;itL~Y4xqxOpg4j?7_)}db4?+@#suT&&#DoC4dDWh*p*_cT!5m&A zEfknVOG%~s#gPVeS4rFb9=HZ{Hzqjlsrj*!_h$AQ2@vJ2;L=uC8dn3_0_WkfJUwMN znNv_jyJhMwpB~gHGh0rE$8dPIRzOw>-kSD6YI;~*G^B$JUn*8s9MLvOI~C+nheX8$ zW8FMG0w+@mm{5_$0#YK-T|76od4Mt0>1=01AMucEulOK4>s55b=S-I7^HyaEZD_=?o zAFFk&Npd}bwGu0R$WgeWAYhO-R!%?-mc~m?40%A_FW*Gxs=`WyI7GJv$Jpe(N@7&+ zj?hZyou@rhfW(xt*KdUq{9tlU2QyPUfxsEC1 zZ`=(Xz+^IB&I_J4)wP_xh zko8~S*}buka0AaKJt`Hpo1^i)El7xq$-aw#j?W$DP#IXB{v@5{e9_J54;uoCrZTy( zCt|`n|a_j zcI5i5=O6LPwi6P{284RBCfa0z&pPMWyoZ{NlOe6&W-NQ68@Y zm%kwn4U6uUY178{Y_&UOiWd!e7%FdEJ=PRgRXUNoq7^JrZ8NNr%vZ?e6vBgDtX-0; z(9?nS)DD^qcLNe*M%rQDq2km@QT^ru#~U`{@s_^qdS<43Q{n6Rytx~^T1%jBlNTHK z1eK7h8@43@Cc^z4t_Zt|WEndA#d_Dg?wO@LwB^{4$#T3=r(taGUHMdXGSWb+w=7N& zk@m9MAsJUnqnj9i?zRPWnDl;Lu$Ybqr67rDe4{?Hs&6H}%5ze`Z7n-KT`kA7;gn!S z^<(y)Yi^Lerk@h$W{g*7_FN{{l2h7htm&aH2Xx0vFEAI0sq)5=3o6LaslpQX_Q%co zvLrNd3ew9fCiYyD5>QY2y0>jsN65VemH7CJV66QFM8fwg z?R4Feaa&|5t8UE?mAO#Aj$ka2P(_$fX~M$vfzkL#|1a6dx+g_1QY(Ml<+`?>M#Gkq zp*i#@MrB{DBIilcDduDWx6vNk2UZT-Q$C}*4WFG9F8MhO)_-1fHD8;8?ZfukKW#3p zUt4_pxB*MdP#cag_~iv~OH0uT_pyeM@ndFG$bQTw8v<%>M&gZc)`ux7YVYs0?lu+D zt2WV9q``e^bpUB_vl#=z!YgJ?RwKKL6?F<*Z}|eGxJoAcR-bhS#{6mXtxKF6^nTsQ zOmQV$!SHdfiAK|CJCCOtWhC^=zMcZz!N=%{f`NV0ZMTXQT{?I*ZJ6eYS>Bb)IyLAX zxEIu1sx*>WkcuiCK~Zkm5wrJUpXmx5d6Vun)){?cL5jB??j^01Z4Z8c5{CFMxrW52 z{BUwM8oNV_?i(VvKOwkH#eUr0a2@bS#SqH$x%yhiJ1tahEv+CPAr&{goS3>#RIU+yC? zbj~!>OZszLt`le=Beo!T#H>san(Ur7_w*I{;$Gb)KqOF2iXH*J5G~^P`+c@R327@E zt&ORLrnz<6*4zrHrD;yW4fL~V&X;6V7RqaA21H~igO<{B%PTS%t2>Ud&niat;A+uI zKk1XYq`}Z#WdIh2HRK47xF`p2i<$HQRtchqW+mqoKF#~=RgPT7lv@qKQ+qozs%bD1 z5y@5`!cg0El|yo*U$x60+H#doQf0jI$lMgTSA~B1-hD76W8%9MoFRGw8De$+I3R5vN*q(pTG)IEz4*7O;uKPtVYh+Hk>y}f@dT38g#xa>>7quP z{gr~>J^==XQMLm{=n7WO=o1HU`G3kz`Kx~^z6}0f#7{B^9@l+8TafvSb^SI~AbFh4TlB7SV3SM&1CJ-04EB_SCKl;e z%|_5p8Z-~yf)(t_8A)<>~AZ~!?xgfdavN+g`2}ulHox@*3HPpMEz&ph1 zIHqS|*2Qo!~-=2jd}7CHH{F zOZVS>72S%tA@%qjrNX?rFl2dk=5=WqI*>3l4z_lxLyGG^K4XGpyw@xtua2eVEd~h1 zXa2CUYn3Ue1YJmoh@f!ACqK!WyJdb&#O*1D&7SyO;TN|S(Cl`BA)bFmV=*t#dqK0; zSZi>3?xG1)BOx|VQzcY{LqDH){cMC_#dB$si~_B~yT1OTZ|%#T`@B>2fA3VWEBzqE z@W_dYkR~HmmR5(ub*&Ts68FYcF4li3#*#L%$v5eK@FvV~A2p4C@!8%cy&`)lbGw?BsvSST3z|0s7HHQ(R*D8ZjM zX7YHjoJog&e>)_(H1GEGyiVlO2L#KDDx&U4GaqH!7w3xQ)s;`^iPV*^E!aoBziT%yq~ep}`^D*C8^rGJob#mLIgnewMp_`KFc zJg#2n%o6|V@|#O(2SVN4ZA1RSXj7Inl=oyP^@`^($GP*n8gA20JTcU7OmB2Gl{Murkcdkl`{Q1YYVoLFf3Dr{)xfTDW8=untfze!Qd^e-qJ<4Tp_Aj5A`bv0)#RN?m(` zRNS^N*|{ARlAxjppK2^>qTPmt0MaC`ogVtrmR(Mwd2i^Iz%nyd8+747h=w<%y~r*B zms~FGBf;BP#hXM9y%Bqbj}9NFWiahJ*qmj1nE~$7mlbQs7H`CbQlI^om>2#dSm}bF zBSfabw{>khzE1tKcT_lqrg{s!m7|r4-+O=NHtG`kinao_%x`&_vyne4sMxo+52jx6 zrZm224);1Kh%#?C@lu2Vg*0kkcAN0~yNMaxtD2a@?&>?Ynt2|`dR7XXPwqx7yfdyy zb$Efnu9xDq?(hviH)@C@1m^R`OKyGG9m$lX(m%HzJxG*Ht6=`pTztk+clwG~bNS)+ zs&K>W;%wdg)9cHvFVA;YnMa3T6?!975_dkva&8Q_6}u2Ox*qBsK7MMoJ1Tqy!cu1zeN%qMh*WSB_);YQ=kFB$+A9jnR!*s+kr z*kLdXEK$pIL`aKc-tJEqL{x0PU$c;jMT-2SP2iY5a&zAM*gTd-onh4UuwE)A^=|Gi zD~4`<&xfY2C-pHZ?~~JctgK4SJTa50EkSOv4@{3k^3PyPA7)(@LBwu^j!X131n%&2 zM0VLDShlzv`WXF(&wM48;0ygN&WI-Y^-cLIa#~m{Jo#$YQ7iWRRjHMA6IkYQ;LoRz zb@8)2scmC!!V-2h9wCjTuf8PaJ$r6x*x68%w9sb2&Jy>xo;NeJ4bXfmf9jqK65o=D zrW*#ozYDm^jG=P8M7*3)oIQR)oQ zjm~Zx?zP<{SY<@K^t2V$`X~n0g$ZQ!+v&1%U;!Au?uT(DQ57r&69ft zC{RpZ;vHO?ZasyH_fx;=1YBjJRQrf<7+D4VmlWlTa)c;EaXqHW1TOW(-C z^_9{K?=NRLmaombQF4u)6o$V}`dMZIDvkY(i_NTfoa3wuv1})-seV_lSxFucoyLd| zdI?N(AY3pgbT?vi2@zxxva{ksf2Y3{IkR6RNh&of=Mu^~DgAnO-r#fHIRGC$Qc-@; zT)kg4^D&)$u+SUePDeW4pJxHgp%vz=f6R7Vluyn(NmuhQCy4cOoJC%_1^kzJF3Odjbbq7yD+qAClXLP#Vq8k-BCcECHC( z`j<7C0ae{NsQe?io$y`BhcUkxuij1`qZWSz!BU(RmOl_s zwr`36@v++I$f~KG;9st?VWZc5X$5DClrT>PAU-1P)x)GyGEMiM?caAV0=Xb{Gxruc z$<*0OfOxelMQzX{sk1#Ubn15gUP)w7wcS~on>O4;rMIgG(RG7M#q-q*g(yWu+j@tq zHnS;`XDBMXEA=g{GLGD-Jly{zPCG3t+zhu)9J0_XlQwWV`A9u=xmgHau-K?p-S(l2 z(Z#4;Iu;T%Sb4w(i|xPXoQr82$TK`VW^x_iJS)BXp>@X9#cwT=WI04jY`>X1lk;N& ztmWg%6rB62jPZ#t2OnVv8U`Lo^_{7)^xyFATYXSi73V+em|e;d$H(dr>VyR~3D`B` z#abU7l3z0sndj`%s**i8@M8+sL;1E}9kL)VRM{-{WG-d0sSI97;E{->(bi@> z?4Qk0h?y_fo=rOc^c(xZ&6+>X$O2f|om-C&jDJ3?jcTgT5PRkFX7Nse$K1m=r(`bb zX>Zi0>g?pt-?2OSt$(ji{a1y<$fMvx-#Rqlos|Kh5W~Dwj)du`p*8eF)#j8U=bCf= z?ht!~c=KZ=V>Dm7IkTNKT%nBrFShK6Meas+v`BYlD3eso%wdwY?MO;8YOXf%yX_vO zbuEPL^GfaU_6-?<949fe5VFN$E%E_S(Za~Jo3n}Fi`V%so zRNHHSSwZa@6&j9@$lYb7u9!JNWRIRh!&92FQYYMsaELU_F5rCtt99puRwdu0o=o8&8bB4V8iY1Wm2(<14lg@=hKg^qJp7?8aepg%=6s6Z$ ze4?yl_I56dl6HSCJJ6A&A2WxW>y<{-!x3A}eV9QuQx`ZFhuI3$2{uQYf47r20?O?OfY&)({5Ma6#{RWj z0Gy!&6~8iwWP zCm%i1j-CF;eG`U{KKbaM=P=arxj$x*GjO~kAUpZnch3;e=gJEZ4%jYh`%Z^5omKp2 zWty$Ktq~>sDGoJ5MDkFjnAwRFqq??YW^fr7{WTc2ayBCBT>99)IM(R3v3)kItollh zX~?alijsldR;-vip=R9UoUnD8>4{f@IgRH=WRHm5HCZO#F_*(>(M zCUCP!T19BHal)cqq&A8TCEuHg?lJb?S#EMA;84FqEb4ZiLGP2;f}(D|bZUX#-B+fD zz;d1}K$_nuFzPfu+!6ID`Jrlth^|pS;1I^UVGZ4{50{H>ZFE18?SO+W>dCCTbpksx ziV8kIdwJG+O-{J4WYP0-#Qer>Qz>vsS^Z}t3aS`b@2|hMT>;z%PAE*%l7jba$D)?^ zrLn4G_nJ%13W*&D+coOrtJ1Fh@>(|-F?orCt^wLP;KI%+$X`rWbvgv}ak-5}BXt9q zio6s&_GVU(qHnBuldI(Do)F%8Fc3kT?%WHH(59{&c+=-;1R}Z$AaeW)aAf4BMbhSN z7fgi4ES|ot>xrg9j>Qb+E82@1=I0ZlV$ZQ8;jfFsrBCFH zC23Uyv(R1Z5U7k*TL9EJJ8b`5yvrkWn5NlZX7G0e z_$52Yfy#2(U&hOF5_KR;%WLV+O#bs;E14v~1%PyZO2EyN2@AX)gr!35#SND6-ZDC> z_A8A>?L%c3**5$G{T^jy9d6kZ5}i>ps5!DJ zmm(1q7={+#!hcAKkNX}-S&&YZE)%a6YF&Ok_8LjE!?N)YJ`j}S)K=x01Ge*U;&53^ z@AdVbP;~pN8;@+RC)K)JO$9}^q;m=N z?E!NPBnFiRp02(j0uL#0fY%Ko*{>PtC)`l)Doy8;12PpJR}yeI}wharOF}0z-vF=CdZx?PqGiDhhxzLhnwXy$Z%9 zLr=!I(Qa(2hx5`G!Q-O&&-vnLb8n3y^u2%^Z-4M~k`+Z6-@BJ1yF17xCABx4WFGPc zphB6#g+y6g70pZLE#`aM8M14a#F3;>&%bQ?ru(v@6s3*-@E(!?int9^$Ye=yKnlh< zeS(l7SEK?TH1gE?&Cj@|S=ZclITKWAzNT~$Vvc(+b!+W*vZ1H4qCXLf1ei+q&B)MC zzut#odH4W67~h2Q@!g||3BE})$hKqlL-mbMya=8Zm7d;>19(7Z)nd)NXUbhECuVYP zY2VQw&g+_NXHcmX!q#qcO68(cU)(Gs_suw z%z^TAp?1vo3-YJ#!KYo`xmp%t&I$MVxRQrGAgK(HwW<9b7~=h3xI#Z6R-kwicMmCW z_TGWBSnKDwVX=P&q76x?S1MN`w6!KR6bpFqJ6#uj*0h$PYjwD`ankD*34O5514$5# zGs)b-zY&cn%~yrtd4>OU84MSDpZ;R%6SRVU+Z|bxc6-~LEf3Kwn(DE)staGFZRcaC zt2%uEZcvxBvgi0{nnqm!49oi}gP$WRo)gRP9*J$CniujZXpYwk9HNa6<{rnkdHuOD zQ)YEIDAx_YCilw+&(IR|{{|O~FZrKiNnx711ItM8kMTXwaz4UC540SV>+d*<_aQ*m z0VIFfukkV#Odoa8(|6B^VlE0@{A2f@=QB+CA80uKSd&*tZmhrWWrD>0TYRZ)>R`Y; zjuoWsl?Ps$);)yEYU!ZfE)R5sgDV^SvDe@--&vG{{z?YH*4fHM`^j6}~RI~jge&w$S z3~0otX@F1`t=~Khn$m#nY(Ctl>`d9?m0x#{XB8N+YG2BHkqzJkU4%j+b))FGGM|G2 z0(S#)#0=OX;PoR^#n(3Dd1GRt*EP<1-4kY2ZrWsF_EC&pq@~k!1BG?Fc~aa!6f>t| zQu91BrQ$lb<7*P_GC?*{<-%&2MuAB^CjZ$`pJLCp%z;Fb-J1(YB>jCG#ILIvy{X27 z-|rlxZ8^J6i%QO^y&D}J9}w-OQ%XlU)0a7=IHZv($9&IFt0=^F?K9azr?ggzdKy+a zrCxWVou-3x0rdsZjlyoLch%D^4EFY`Yps~eW|=ci)^qArg+8M3=|%!(SK6rHuO{H` z1!xO=+CXAuOaGa~#P7G`K(E@9;-inDe3rCl)+H&x4yx)(1J4e`n5FN;!?m)fEN6?r zAL=`vH@IJ4?gtdF8t#eEO*KSgZ&es_ugIE5rJv;g(A_rn>e#wEmhmEB>wV5Uwm+M2 zf89ZG0$?1TAVx9w@4YohT8?M8?_-oM#N-kirT__b6#7;bW`TWoAigNF)SL>Gn6NB+ zULE4DIXSJ?8!*gx^4>MlmehmX-7BYn`NcDTK`8|!j&3!%zI8s^!6m9KLz(-s6Z>19 z^EYch?h0+3K_~lU0rhe z#^Q&RPvys0skC`Ome3{?gGpBYnt2-r#n0o;|Cf0Mocx#K^nJDvZYxnLh;=ect$%d*|po z)(yd&LNK>6?HXq>63~_eiZ9XvRfHB@ExvXYTiv0y&^9H!6J8q1^-^yf2r~-7tJRZz z5sG4cZ`{PHEIbotBLRC_NQ~i@BK&f%_HD_AQ{1r!PF06_C(&)R7&+Ui@ujiKbzn~! zymOVO=Vo?seU;QgYUS9kVKMPUktyti`(-Dkeb^rt^^AnGG{U3UEANH-?4`%^7ix%W z-w6!-DajS%^&!U(dj|4Bius4*yv~TufjZOmzfot1jOr*}#|PM606>66!R4m|ytQpI z;8v+eb=f=IT2)sT0WdSSWphc8pRQyXTl^Dw2=`ObvMZ_A zOtB!z83k5K_kk?)ppyIVm-Z9{=!ke7nHgCr!)h0|uWAZWE{DE1{w2ytNNxpgBz@JW zX&G~$0XA#=ivjVx@f=`s+J~13mjrUs&^HVghAU4eKU`O&_@y3}4E!m3tS8B^C{8rV z0l<;>9ss#AIL<4&=YQ2@M&R9+4uCGRlJ;WC9e-Zjex!XZ$-5PWysi7OgC2XxVxEU` zTy(4>QAacdk;deoz@0ws1%Hv`XEQKp8(i@)FfQMdA zr*HqW$x8MykaBTp#HXiux@&V%Vh}MpPme9Umqrc)8wI5YOO%$>!W(VZ_PW~tv$d-3 z8#Q6~-Xj6YyB0JZTd^A2y`t~$Vi%(g^YGM7Eto`_C#DezQhBxcUr1)jR9KRt^mPM< zSe%|4&S09yTOKRHwN?1!mrJ+h4@VCRzgzEoI2|GKi~{!9_^BavDz!(2ZArE_nDx{MrK=qAXsa)uIrgQhB0?DfF zfp^^M56RV**@rILH3pySl`!*Ub8FP&{4BBnjeFYd#d#yX+LNCpOapg;AL1vbtsC$?$`$c-# zi!=_iPr&!roOesp$RS3h4_I2WsNCb9Tjq~z6B{KscIMcNoZF#enR9bnUBi_kHiX?Cwco`*a^rhz%sYBJ@V^1br9m;R z*JIvZ5ioz+Gi6O`-rpP9rhg+MJ=_SJUUSY->BnEyM1CoN7&99tdb-78T3l029yK z$1|!gg~!N>MVc#kzFDs_mak4JkAEd9mgXd2_0T^k~i%0Ah*obZSR3!yBD5SMC@3VWBaF?$5?#O9{X@d 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̓^I>; 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 Date: Fri, 15 Sep 2023 14:12:49 +0700 Subject: [PATCH 044/298] pdate screenshot --- app/utils/runtimeCheckLogs.ts | 2 +- app/utils/screenShot.ts | 2 +- app/utils/uploadFileZulip.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e749312..abd8ddd 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -178,7 +178,7 @@ export async function runtimeCheckLogs(folderPath) { ); const timeImage = Date.now() await screenShot(fileName, timeImage); - const uriImage = await uploadFileToZulip(fileName, timeImage); + const uriImage = await uploadFileToZulip(timeImage); let listReport = await getListLineByItem( logsDetect[0].filter((l) => l.line > lastLine) ); diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index 6beb9fb..778f90e 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -15,7 +15,7 @@ export const screenShot = async (filename, time) => { await bodyHandle.dispose(); await page.setViewport({ width: 1920, height: 500 }); setTimeout(async () => { - await page.screenshot({ path: "/home/screenshot/"+time+"_"+filename+".png" }); + await page.screenshot({ path: "/home/screenshot/"+time+".png" }); browser.close(); }, 5000); } catch (error) { diff --git a/app/utils/uploadFileZulip.ts b/app/utils/uploadFileZulip.ts index 1b96026..6bed904 100644 --- a/app/utils/uploadFileZulip.ts +++ b/app/utils/uploadFileZulip.ts @@ -2,7 +2,7 @@ import { FormData } from "zulip-js/lib/helper"; import axios from "axios"; import fs from "fs"; -export const uploadFileToZulip = async (filename, time) => { +export const uploadFileToZulip = async (filename) => { // try { const ZULIP_API_URL = "https://zulip.ipsupply.com.au/api/v1"; const ZULIP_API_KEY = "0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM"; @@ -13,7 +13,7 @@ export const uploadFileToZulip = async (filename, time) => { try { - const fileStream = fs.createReadStream("/home/screenshot/"+time+"_"+filename+".png"); + const fileStream = fs.createReadStream("/home/screenshot/"+filename+".png"); const formData = new FormData(); formData.append("file", fileStream); From 84bed17d82d0ea81e985cc31dfa2ad3ba693fc08 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 14:15:13 +0700 Subject: [PATCH 045/298] update screenshot --- app/utils/runtimeCheckLogs.ts | 124 ++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 60 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index abd8ddd..20e8aa7 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -178,66 +178,70 @@ export async function runtimeCheckLogs(folderPath) { ); const timeImage = Date.now() await screenShot(fileName, timeImage); - const uriImage = await uploadFileToZulip(timeImage); - let listReport = await getListLineByItem( - logsDetect[0].filter((l) => l.line > lastLine) - ); - let content = - "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - let spoiler = ""; - 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 + - "|[View](https://logs.danielvu.com/logs/" + - fileName + - "#" + - log.line + - ")\n"; - }); - // } - // setTimeout(() => { - sendMessToZulip( - "stream", - "Result test - auto.nswteam.net", - "Log Alert", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler - + - "\n\n[image](" + - uriImage + - ")\n" - ); - - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler - + - "\n\n[image](" + - uriImage + - ")\n" - ); + + setTimeout(async() => { + const uriImage = await uploadFileToZulip(timeImage); + let listReport = await getListLineByItem( + logsDetect[0].filter((l) => l.line > lastLine) + ); + let content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + 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 + + "|[View](https://logs.danielvu.com/logs/" + + fileName + + "#" + + log.line + + ")\n"; + }); + // } + // setTimeout(() => { + sendMessToZulip( + "stream", + "Result test - auto.nswteam.net", + "Log Alert", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + + "\n\n[image](" + + uriImage + + ")\n" + ); + + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + + "\n\n[image](" + + uriImage + + ")\n" + ); + }, 2000); + // }, 3000); } }, 3000); From b16ce519fe43a0a114c6c901719c7d60cf518aec Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 14:19:24 +0700 Subject: [PATCH 046/298] update screenshot --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 20e8aa7..c88bf5b 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -240,7 +240,7 @@ export async function runtimeCheckLogs(folderPath) { uriImage + ")\n" ); - }, 2000); + }, 5000); // }, 3000); } From 01965a974544d5904933a394970d1e7c3a122f0b Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 14:22:19 +0700 Subject: [PATCH 047/298] update screenshot --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index c88bf5b..615aea9 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -240,7 +240,7 @@ export async function runtimeCheckLogs(folderPath) { uriImage + ")\n" ); - }, 5000); + }, 10000); // }, 3000); } From 613eb22614d445fafa5ae33e4e8d748526639f88 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 15 Sep 2023 14:44:37 +0700 Subject: [PATCH 048/298] update screenshot --- app/utils/screenShot.ts | 2 +- manage-view/src/components/ScreenShot/ScreenShot.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index 778f90e..f9c9b80 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -13,7 +13,7 @@ export const screenShot = async (filename, time) => { const bodyHandle = await page.$("body"); const { height } = await bodyHandle.boundingBox(); await bodyHandle.dispose(); - await page.setViewport({ width: 1920, height: 500 }); + await page.setViewport({ width: 1920, height: 800 }); setTimeout(async () => { await page.screenshot({ path: "/home/screenshot/"+time+".png" }); browser.close(); diff --git a/manage-view/src/components/ScreenShot/ScreenShot.css b/manage-view/src/components/ScreenShot/ScreenShot.css index 8933a0f..18be2ac 100644 --- a/manage-view/src/components/ScreenShot/ScreenShot.css +++ b/manage-view/src/components/ScreenShot/ScreenShot.css @@ -30,4 +30,5 @@ /* border-color: -internal-light-dark(rgb(118, 118, 118), rgb(133, 133, 133)); */ /* border-image: initial; */ padding: 5px; + font-size: 1.2rem; } \ No newline at end of file From 425ca911725d91d8c8fda856e9140ac6a680887f Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 18 Sep 2023 10:38:12 +0700 Subject: [PATCH 049/298] update format message zulip --- app/store/logs/20230912-fjghsk.log | 2 - app/store/logs/20230918-TESTLOG.log | 7 + app/store/logs/abc.log | 15 - app/store/logs/sdsdfjk.log | 236 ---- app/store/logs/test.log | 1753 --------------------------- app/utils/runtimeCheckLogs.ts | 147 +-- screenshot.js | 124 +- zuliprc | 4 + 8 files changed, 149 insertions(+), 2139 deletions(-) delete mode 100644 app/store/logs/20230912-fjghsk.log create mode 100644 app/store/logs/20230918-TESTLOG.log delete mode 100644 app/store/logs/abc.log delete mode 100644 app/store/logs/sdsdfjk.log delete mode 100644 app/store/logs/test.log create mode 100644 zuliprc diff --git a/app/store/logs/20230912-fjghsk.log b/app/store/logs/20230912-fjghsk.log deleted file mode 100644 index 2c984d2..0000000 --- a/app/store/logs/20230912-fjghsk.log +++ /dev/null @@ -1,2 +0,0 @@ -sdfgsdfg -sdf \ No newline at end of file diff --git a/app/store/logs/20230918-TESTLOG.log b/app/store/logs/20230918-TESTLOG.log new file mode 100644 index 0000000..7b38ffb --- /dev/null +++ b/app/store/logs/20230918-TESTLOG.log @@ -0,0 +1,7 @@ +adfasf +anfasll ak shflks as klhfalk la EHWIC- fsjl +123 PVDM3- hui 800G2-POE-2 +sdhgksd sjk hk error +abc 123 fail +abc 123 fail +sdhgksd sjk hk error \ No newline at end of file diff --git a/app/store/logs/abc.log b/app/store/logs/abc.log deleted file mode 100644 index ab492a8..0000000 --- a/app/store/logs/abc.log +++ /dev/null @@ -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 \ No newline at end of file diff --git a/app/store/logs/sdsdfjk.log b/app/store/logs/sdsdfjk.log deleted file mode 100644 index e4d234c..0000000 --- a/app/store/logs/sdsdfjk.log +++ /dev/null @@ -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 \ No newline at end of file diff --git a/app/store/logs/test.log b/app/store/logs/test.log deleted file mode 100644 index 3fe0537..0000000 --- a/app/store/logs/test.log +++ /dev/null @@ -1,1753 +0,0 @@ -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:18:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:08 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 03:31:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 04:01:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 04:02:02 ========= -$ [01/01/1970 00:00:34.9899] Linux version 3.14.43 (aut@cheetah-build4) (gcc version 4.7.1 (OpenWrt GCC 4.7.1 r48430) ) #1 SMP PREEMPT Tue Jul 28 23:53:37 PDT 2020 -$ [01/01/1970 00:00:35.1499] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d -$ [01/01/1970 00:00:35.2499] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache -$ [01/01/1970 00:00:35.3499] Machine model: Cisco 11ac Wave2 Wifi Access Point -$ [01/01/1970 00:00:35.4299] Memory policy: Data cache writealloc -$ [01/01/1970 00:00:35.4999] Kernel command line: console=ttyMSM0,9600n8 ubi.mtd=0 root=/dev/ram activepart=part2 activeboot=0 wdgtriggered=0 board_sku=2 clk_ignore_unused -$ [01/01/1970 00:00:35.6799] CPU1: Booted secondary processor -$ [01/01/1970 00:00:35.7399] CPU2: Booted secondary processor -$ [01/01/1970 00:00:35.8099] CPU3: Booted secondary processor -$ [01/01/1970 00:00:35.8699] buginf tty flushing thread started, ttyport=9d52c400 -$ [*01/01/1970 00:00:39.0263] buginf() enabled. -$ [*01/01/1970 00:00:39.0593] Made it into bootsh: Jul 29 2020 00:16:46 T-cbfc6f1f9918f53aa2f774f4ee9f9aefab116a16-gcbfc6f1f-aut -$ [01/01/1970 00:00:58.7799] audit_printk_skb: 105 callbacks suppressed -$ [01/01/1970 00:01:17.8799] audit_printk_skb: 36 callbacks suppressed -$ -$ Welcome to Cisco. -$ -$ Usage of this device is governed by Cisco's End User License Agreement, -$ available at: -$ http://www.cisco.com/c/en/us/td/docs/general/warranty/English/EU1KEN_.html. -$ -$ -$ Restricted Rights Legend -$ -$ Use, duplication, or disclosure by the Government is subject to -$ restrictions as set forth in subparagraph (c) of the Commercial -$ Computer Software - Restricted Rights clause at FAR sec. 52.227-19 and -$ subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer -$ Software clause at DFARS sec. 252.227-7013. -$ -$ Cisco Systems, Inc. -$ 170 West Tasman Drive -$ San Jose, California 95134-1706 -$ -$ This product contains cryptographic features and is subject to United -$ States and local country laws governing import, export, transfer and -$ use. Delivery of Cisco cryptographic products does not imply -$ third-party authority to import, export, distribute or use encryption. -$ Importers, exporters, distributors and users are responsible for -$ compliance with U.S. and local country laws. By using this product you -$ agree to comply with applicable laws and regulations. If you are unable -$ to comply with U.S. and local laws, return this product immediately. -$ -$ A summary of U.S. laws governing Cisco cryptographic products may be found at: -$ http://www.cisco.com/wwl/export/crypto/tool/stqrg.html -$ -$ If you require further assistance please contact us by sending email to -$ export@cisco.com. -$ -$ -$ This product contains some software licensed under the -$ "GNU General Public License, version 2" provided with -$ ABSOLUTELY NO WARRANTY under the terms of -$ "GNU General Public License, version 2", available here: -$ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html -$ -$ -$ This product contains some software licensed under the -$ "GNU Library General Public License, version 2" provided -$ with ABSOLUTELY NO WARRANTY under the terms of "GNU Library -$ General Public License, version 2", available here: -$ http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html -$ -$ -$ This product contains some software licensed under the -$ "GNU Lesser General Public License, version 2.1" provided -$ with ABSOLUTELY NO WARRANTY under the terms of "GNU Lesser -$ General Public License, version 2.1", available here: -$ http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html -$ -$ -$ This product contains some software licensed under the -$ "GNU General Public License, version 3" provided with -$ ABSOLUTELY NO WARRANTY under the terms of -$ "GNU General Public License, Version 3", available here: -$ http://www.gnu.org/licenses/gpl.html. -$ -$ -$ This product contains some software licensed under the -$ "GNU Affero General Public License, version 3" provided -$ with ABSOLUTELY NO WARRANTY under the terms of -$ "GNU Affero General Public License, version 3", available here: -$ http://www.gnu.org/licenses/agpl-3.0.html. -$ -$ [ OK ] Reached target Timers. -$ [ OK ] Reached target Cisco File Systems (Pre). -$ [ OK ] Created slice -.slice. -$ [ OK ] Created slice system.slice. -$ Starting Cisco UBIFS reformat/mount... -$ [ OK ] Created slice system-serial\x2dgetty.slice. -$ [ OK ] Listening on Delayed Shutdown Socket. -$ [ OK ] Reached target Sockets. -$ [ OK ] Reached target Slices. -$ [ OK ] Started Cisco UBIFS reformat/mount. -$ Starting Cisco early mount... -$ [ OK ] Started Cisco early mount. -$ [ OK ] Reached target Local File Systems (Pre). -$ Starting Cisco platform file generation... -$ Starting Cisco fips check... -$ [*01/01/1970 00:01:27.8816] /etc/init.d/generate_platforms: line 1: plat_get_usb_admin_state: not found -$ Starting Cisco seed generation... -$ Starting Cisco system time setup... -$ [*01/01/1970 00:01:28.0838] GCM-128 POST passed -$ [*01/01/1970 00:01:28.0839] GCM-256 POST passed -$ [*09/07/2021 23:59:59.0374] Last reload time: Sep 7 23:59:59 2021 -$ [*09/07/2021 23:59:59.0009] Setting system time Tue Sep 7 23:59:59 UTC 2021 -$ [ OK ] Started Cisco platform file generation. -$ [ OK ] Started Cisco fips check. -$ [ OK ] Started Cisco seed generation. -$ [ OK ] Started Cisco system time setup. -$ [ OK ] Reached target Local File Systems. -$ Starting Cisco S10 boot service... -$ Starting Security Auditing Service... -$ [*09/07/2021 23:59:59.5934] parameter passed without an option given -$ Starting Cisco act2 check... -$ [ OK ] Started Cisco system time saving. -$ Starting Cisco system time saving... -$ Starting Cisco pkg install service... -$ [*09/07/2021 23:59:59.9121] === 5G radio domain is 12, COPY 5G BDF files from ETSI_BDF folder === -$ [*09/07/2021 23:59:59.9732] 2 -$ [ OK ] Started Security Auditing Service. -$ [*09/08/2021 00:00:00.2465] Active version: 8.10.130.0 -$ [*09/08/2021 00:00:00.2546] Backup version: 0.0.0.0 -$ [ OK ] Started Cisco act2 check. -$ [09/07/2021 23:59:59.7699] ramoops: Unknown symbol encode_rs8 (err 0) -$ [09/07/2021 23:59:59.8299] ramoops: Unknown symbol decode_rs8 (err 0) -$ [09/07/2021 23:59:59.9099] ramoops: Unknown symbol init_rs (err 0) -$ [* ] (1 of 2) A start job is running for...o pkg install service (9s /[ OK ] Started Cisco S10 boot service. -$ Starting Cisco nss service... -$ Starting Cisco nolan service... -$ Starting Cisco watchdog... -$ [ OK ] Started Cisco watchdog. -$ [ OK ] Started Cisco nss service. -$ [ OK ] Started Cisco nolan service. -$ [ OK ] Started Cisco pkg install service. -$ Starting Cisco S15platform... -$ Starting Cisco Kclick... -$ Starting Cisco nolan USB service... -$ [ OK ] Started Cisco S15platform. -$ [ OK ] Started Cisco nolan USB service. -$ [ OK ] Started Cisco Kclick. -$ Starting Cisco ME service... -$ Starting Cisco certificate create service... -$ Starting Cisco Kclick... -$ [ OK ] Started Cisco ME service. -$ [ OK ] Started Cisco Kclick. -$ Starting Cisco syslog service... -$ [*09/08/2021 00:00:00.6064] -$ [*09/08/2021 00:00:00.6064] led pattern module start -$ [*09/08/2021 00:00:00.6646] Loading caldata from mtd2 -$ [*09/08/2021 00:00:01.3399] ess-switch DT exist! -$ [*09/08/2021 00:00:01.3399] switchreg_base_addr: 0xc000000 -$ [*09/08/2021 00:00:01.3399] switchreg_size: 0x80000 -$ [*09/08/2021 00:00:01.3400] switch_access_mode: local bus -$ [*09/08/2021 00:00:01.3400] wan bmp:0x20 -$ [*09/08/2021 00:00:01.3400] ess-psgmii DT exist! -$ [*09/08/2021 00:00:01.3400] mac mode=3 -$ [*09/08/2021 00:00:01.3400] current mac mode = 0 -$ [*09/08/2021 00:00:01.3401] current dts led_source_num is 5 -$ [*09/08/2021 00:00:01.3401] mdio DT exist! -$ [*09/08/2021 00:00:01.3402] ssdk_plat_init start -$ [*09/08/2021 00:00:01.3404] enable ess clk -$ [*09/08/2021 00:00:01.4509] reset ok in probe! -$ [*09/08/2021 00:00:01.4523] PHY ID is 0x4dd0b1 -$ [*09/08/2021 00:00:01.5249] qca probe malibu phy driver succeeded! -$ [*09/08/2021 00:00:03.3290] Dakota Chip version 0x1401 -$ [*09/08/2021 00:00:03.3293] -$ [*09/08/2021 00:00:03.3294] QCA Switch config done - default in CPU switching. -$ [*09/08/2021 00:00:03.3306] qca-ssdk module init succeeded! -$ [*09/08/2021 00:00:03.3309] -$ [*09/08/2021 00:00:03.3309] QCA Switch config done - default in CPU switching. -$ [*09/08/2021 00:00:04.0489] crypto worker thread started -$ [*09/08/2021 00:00:04.0503] crypto worker thread started -$ [*09/08/2021 00:00:04.1929] pid 3243's current affinity mask: f -$ [*09/08/2021 00:00:04.1929] pid 3243's new affinity mask: e -$ [*09/08/2021 00:00:04.2011] pid 3242's current affinity mask: f -$ [*09/08/2021 00:00:04.2011] pid 3242's new affinity mask: e -$ [*09/08/2021 00:00:04.4540] Current value of FACTORY_RESET=0 -$ [*09/07/2021 23:59:59.0419] Last reload time: Sep 7 23:59:59 2021 -$ [*09/07/2021 23:59:59.0009] Setting system time Tue Sep 7 23:59:59 UTC 2021 -$ [*09/07/2021 23:59:59.1345] device wired0 entered promiscuous mode -$ [*09/08/2021 00:00:00.5038] Last reload reason : 0: unknown -$ [*09/08/2021 00:00:04.7936] stile module dp init successfully -$ [*09/08/2021 00:00:04.7937] NBAR Label:BLD_POLARIS_DEV_LATEST_20200414_053707 Module timestamp: Jul 29 2020 at 00:06:05 User: ttaichol -$ [*09/08/2021 00:00:13.7575] Loading sha2... -$ [*09/08/2021 00:00:13.7676] Dumpping sha1... -$ [*09/08/2021 00:00:14.3658] -$ [*09/08/2021 00:00:14.3658] Click sched monitor: schedulers = 3 -$ [*09/08/2021 00:00:14.6186] Loading MIC cert and key -$ [*09/08/2021 00:00:14.6287] Dumpping sha2... -$ [*09/08/2021 00:00:15.4034] Loading MIC cert and key -$ Starting Cisco S16platfomm... -$ Starting rsyslog client... -$ [ OK ] Started Cisco certificate create service. -$ [ OK ] Started Cisco syslog service. -$ [ OK ] Started Cisco S16platfomm. -$ [ OK ] Started rsyslog client. -$ Starting Cisco synclogd... -$ [ OK ] Started Cisco Tam service. -$ Starting Cisco Tam service... -$ Starting Cisco certtime service... -$ [ OK ] Started Cisco synclogd. -$ [ *** ] A start job is running for Cisco certtime service (32s / 1min 26s[ *** ] A start job is running for Cisco certtime service (32s / 1min 26s[*** ] A start job is running for Cisco certtime service (33s / 1min 26s[** ] A start job is running for Cisco certtime service (33s / 1min 26s[* ] A start job is running for Cisco certtime service (34s / 1min 26s[** ] A start job is running for Cisco certtime service (34s / 1min 26s[*** ] A start job is running for Cisco certtime service (35s / 1min 26s[ *** ] A start job is running for Cisco certtime service (35s / 1min 26s[ *** ] A start job is running for Cisco certtime service (36s / 1min 26s[ ***] A start job is running for Cisco certtime service (36s / 1min 26s[ **] A start job is running for Cisco certtime service (37s / 1min 26s[ *] A start job is running for Cisco certtime service (37s / 1min 26s[ **] A start job is running for Cisco certtime service (38s / 1min 26s[ ***] A start job is running for Cisco certtime service (38s / 1min 26s[ *** ] A start job is running for Cisco certtime service (39s / 1min 26s[ *** ] A start job is running for Cisco certtime service (39s / 1min 26s[*** ] A start job is running for Cisco certtime service (40s / 1min 26s[** ] A start job is running for Cisco certtime service (40s / 1min 26s[* ] A start job is running for Cisco certtime service (41s / 1min 26s[** ] A start job is running for Cisco certtime service (41s / 1min 26s[*** ] A start job is running for Cisco certtime service (42s / 1min 26s[ *** ] A start job is running for Cisco certtime service (42s / 1min 26s[ *** ] A start job is running for Cisco certtime service (43s / 1min 26s[ ***] A start job is running for Cisco certtime service (43s / 1min 26s[ **] A start job is running for Cisco certtime service (44s / 1min 26s[ *] A start job is running for Cisco certtime service (44s / 1min 26s[ **] A start job is running for Cisco certtime service (45s / 1min 26s[ ***] A start job is running for Cisco certtime service (45s / 1min 26s[ *** ] A start job is running for Cisco certtime service (46s / 1min 26s[ *** ] A start job is running for Cisco certtime service (46s / 1min 26s[*** ] A start job is running for Cisco certtime service (47s / 1min 26s[** ] A start job is running for Cisco certtime service (47s / 1min 26s[* ] A start job is running for Cisco certtime service (48s / 1min 26s[** ] A start job is running for Cisco certtime service (48s / 1min 26s[*** ] A start job is running for Cisco certtime service (49s / 1min 26s[ *** ] A start job is running for Cisco certtime service (49s / 1min 26s[ *** ] A start job is running for Cisco certtime service (50s / 1min 26s[ ***] A start job is running for Cisco certtime service (50s / 1min 26s[ **] A start job is running for Cisco certtime service (51s / 1min 26s[ *] A start job is running for Cisco certtime service (51s / 1min 26s[ **] A start job is running for Cisco certtime service (52s / 1min 26s[ ***] A start job is running for Cisco certtime service (52s / 1min 26s[ *** ] A start job is running for Cisco certtime service (53s / 1min 26s[ *** ] A start job is running for Cisco certtime service (53s / 1min 26s[*** ] A start job is running for Cisco certtime service (54s / 1min 26s[** ] A start job is running for Cisco certtime service (54s / 1min 26s[* ] A start job is running for Cisco certtime service (55s / 1min 26s[** ] A start job is running for Cisco certtime service (55s / 1min 26s[*** ] A start job is running for Cisco certtime service (56s / 1min 26s[ *** ] A start job is running for Cisco certtime service (56s / 1min 26s[ *** ] A start job is running for Cisco certtime service (57s / 1min 26s[ ***] A start job is running for Cisco certtime service (57s / 1min 26s[ **] A start job is running for Cisco certtime service (58s / 1min 26s[ OK ] Started Cisco certtime service. -$ [ OK ] Reached target System Initialization. -$ [ OK ] Reached target Paths. -$ [ OK ] Reached target Basic System. -$ Starting Fast CGI daemon... -$ Starting Hostapd process... -$ [ OK ] Started Serial Getty on ttyS0. -$ Starting Serial Getty on ttyS0... -$ [ OK ] Reached target Login Prompts. -$ [ OK ] Started System Monitor service. -$ Starting System Monitor service... -$ Starting Cisco kexec... -$ Starting capwapd... -$ Starting gRPC server daemon... -$ Starting Clean Air daemon... -$ [ OK ] Started NTP_PROC daemon. -$ Starting NTP_PROC daemon... -$ Starting Cisco led service... -$ Starting Cisco rtd service... -$ Starting OpenSSH server daemon... -$ Starting Cisco printkd... -$ Starting AP Trace daemon... -$ Starting Cisco brain service... -$ Starting Cisco klogd... -$ Starting WCPD process... -$ [ OK ] Started Cisco kexec. -$ [ OK ] Started Cisco led service. -$ [ OK ] Started Cisco printkd. -$ [ OK ] Started Cisco klogd. -$ [ OK ] Started AP Trace daemon. -$ [ OK ] Started Fast CGI daemon. -$ [ OK ] Started Cisco rtd service. -$ [ OK ] Started Hostapd process. -$ [ OK ] Started Cisco brain service. -$ [*09/08/2021 00:00:52.2299] pid 4227's current affinity mask: f -$ [*09/08/2021 00:00:52.2299] pid 4227's new affinity mask: e -$ [*09/08/2021 00:00:52.9372] __mm_init_module -$ [*09/08/2021 00:00:54.7632] ol_ath_ahb_probe -$ [*09/08/2021 00:00:54.7634] ol_ath_ahb_probe: io resource start: 0xa000000, mem=0xa3c00000 -$ [*09/08/2021 00:00:54.7637] -$ [*09/08/2021 00:00:54.7637] __ol_ath_attach() Allocated scn 929804c0 -$ [*09/08/2021 00:00:54.7638] ol_ath_ahb_configure: MSI addr: 0b006040, MSI base: 00000040 -$ [*09/08/2021 00:00:54.7741] -$ [*09/08/2021 00:00:54.7741] ol_ath_ahb_configure : num_desired MSI set to 0 -$ [*09/08/2021 00:00:54.7742] -$ [*09/08/2021 00:00:54.7742] Using Legacy Interrupt -$ [*09/08/2021 00:00:54.7742] -$ [*09/08/2021 00:00:54.7742] Waiting for target init -$ [*09/08/2021 00:00:54.7742] -$ [*09/08/2021 00:00:54.7743] Done waiting -$ [*09/08/2021 00:00:54.7785] ol_ath_attach interface_id 0 -$ [*09/08/2021 00:00:54.7789] Chip id: 0xb, chip version: 0x1000000 -$ [*09/08/2021 00:00:54.7794] -$ [*09/08/2021 00:00:54.7794] Target Version is 1000000 -$ [*09/08/2021 00:00:54.7794] -$ [*09/08/2021 00:00:54.7794] Flash Download Address c0000 -$ [*09/08/2021 00:00:54.7794] ol_transfer_bin_file: flash data file defined -$ [*09/08/2021 00:00:54.7794] ol_transfer_bin_file[3800] Get Caldata for wifi0. -$ [*09/08/2021 00:00:54.7795] __adf_os_fs_read[42], Open File /tmp/wifi0.caldata SUCCESS!! -$ [*09/08/2021 00:00:54.7795] file system magic:16914836 -$ [*09/08/2021 00:00:54.7795] super blocksize:4096 -$ [*09/08/2021 00:00:54.7796] inode 5844 -$ [*09/08/2021 00:00:54.7796] file size:12064 -$ [*09/08/2021 00:00:54.7797] qc98xx_verify_checksum: flash checksum passed: 0xc35d -$ [*09/08/2021 00:00:54.7797] ol_transfer_bin_file 3861: Download Flash data len 12064 -$ [*09/08/2021 00:00:54.8023] -$ [*09/08/2021 00:00:54.8023] Board data initialized -$ [*09/08/2021 00:00:54.8027] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:54.8231] ol_ath_download_firmware :First OTP download and Execute is good address:0x5800 return param 4660 -$ [*09/08/2021 00:00:54.8231] ol_ath_download_firmware:##Board Id 22 , CHIP Id 0 -$ [*09/08/2021 00:00:54.8232] -$ [*09/08/2021 00:00:54.8232] wifi0: Selecting board data file name boardData_Mallorca_TW_2G_neg_pwr.bin -$ [*09/08/2021 00:00:54.8233] ol_transfer_bin_file: Board Data File download to address=0xc0000 file name=IPQ4019/hw.1/boardData_Mallorca_TW_2G_neg_pwr.bin -$ [*09/08/2021 00:00:54.8235] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:54.8449] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:54.8605] -$ [*09/08/2021 00:00:54.8605] [Flash] : Ignore Module param -$ [*09/08/2021 00:00:54.8606] ol_ath_download_firmware : Second OTP download and Execute is good, param=0x0 -$ [*09/08/2021 00:00:54.8612] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:54.8620] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:54.8710] ol_transfer_bin_file: Downloading firmware file: IPQ4019/hw.1/athwlan.bin -$ [*09/08/2021 00:00:54.8720] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.1034] HTC Rx: insufficient length, got:4 expected =8 -$ [*09/08/2021 00:00:56.1056] Startup Mode-0 set -$ [*09/08/2021 00:00:56.1083] HTC Service:0x0300 ep:1 TX flow control disabled -$ [*09/08/2021 00:00:56.1134] HTC Service:0x0100 ep:2 TX flow control disabled -$ [*09/08/2021 00:00:56.1146] Firmware_Build_Number:70 -$ [*09/08/2021 00:00:56.1147] num_rf_chain:0x00000002 ht_cap_info:0x0000085b vht_cap_info:0x339959b2 vht_supp_mcs:0x0000fffa -$ [*09/08/2021 00:00:56.1147] -$ [*09/08/2021 00:00:56.1147] RES CFG Support wmi_service_bitmap 9778 -$ [*09/08/2021 00:00:56.1147] -$ [*09/08/2021 00:00:56.1147] Sending Ext resource cfg: HOST PLATFORM as 0 and fw_feature_bitmap as 50 to TGT -$ [*09/08/2021 00:00:56.1149] ol_ath_service_ready_event: sw_cal_support_check_flag: 1 -$ [*09/08/2021 00:00:56.1163] ol_ath_service_ready_event[4276] WAPI MBSSID 0 -$ [*09/08/2021 00:00:56.1566] wmi_ready_event_rx: WMI UNIFIED READY event -$ [*09/08/2021 00:00:56.1567] htt_h2t_frag_desc_bank_cfg_msg - HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG sent to FW for radio ID = 0 -$ [*09/08/2021 00:00:56.1625] spectral_init_netlink 81 NULL SKB -$ [*09/08/2021 00:00:56.1645] ACS not enabled -$ [*09/08/2021 00:00:56.1787] ol_ath_thermal_mitigation_attach: -- -$ [*09/08/2021 00:00:56.1789] ol_ath_ahb_probe -$ [*09/08/2021 00:00:56.1790] ol_ath_ahb_probe: io resource start: 0xa800000, mem=0xa4000000 -$ [*09/08/2021 00:00:56.1794] -$ [*09/08/2021 00:00:56.1794] __ol_ath_attach() Allocated scn 921404c0 -$ [*09/08/2021 00:00:56.1795] ol_ath_ahb_configure: MSI addr: 0b006040, MSI base: 00000050 -$ [*09/08/2021 00:00:56.1998] -$ [*09/08/2021 00:00:56.1998] ol_ath_ahb_configure : num_desired MSI set to 0 -$ [*09/08/2021 00:00:56.1999] -$ [*09/08/2021 00:00:56.1999] Using Legacy Interrupt -$ [*09/08/2021 00:00:56.1999] -$ [*09/08/2021 00:00:56.1999] Waiting for target init -$ [*09/08/2021 00:00:56.1999] -$ [*09/08/2021 00:00:56.2000] Done waiting -$ [*09/08/2021 00:00:56.2159] ol_ath_attach interface_id 1 -$ [*09/08/2021 00:00:56.2163] Chip id: 0xb, chip version: 0x1000000 -$ [*09/08/2021 00:00:56.2168] -$ [*09/08/2021 00:00:56.2168] Target Version is 1000000 -$ [*09/08/2021 00:00:56.2168] -$ -$ [*09/08/2021 00:00:56.2168] Flash Download Address c0000 -$ [*09/08/2021 00:00:56.2168] ol_transfer_bin_file: flash data file defined -$ [*09/08/2021 00:00:56.2168] ol_transfer_bin_file[3800] Get Caldata for wifi1. -$ [*09/08/2021 00:00:56.2169] __adf_os_fs_read[42], Open File /tmp/wifi1.caldata SUCCESS!! -$ [*09/08/2021 00:00:56.2169] file system magic:16914836 -$ [*09/08/2021 00:00:56.2170] super blocksize:4096 -$ [*09/08/2021 00:00:56.2170] inode 7427 -$ [*09/08/2021 00:00:56.2170] file size:12064 -$ [*09/08/2021 00:00:56.2171] qc98xx_verify_checksum: flash checksum passed: 0x2c15 -$ [*09/08/2021 00:00:56.2171] ol_transfer_bin_file 3861: Download Flash data len 12064 -$ [*09/08/2021 00:00:56.2371] -$ [*09/08/2021 00:00:56.2371] Board data initialized -$ [*09/08/2021 00:00:56.2375] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.2579] ol_ath_download_firmware :First OTP download and Execute is good address:0x5c00 return param 4660 -$ [*09/08/2021 00:00:56.2579] ol_ath_download_firmware:##Board Id 23 , CHIP Id 0 -$ [*09/08/2021 00:00:56.2581] -$ [*09/08/2021 00:00:56.2581] wifi1: Selecting board data file name boardData_Mallorca_TW_5G_neg_pwr.bin -$ [*09/08/2021 00:00:56.2581] ol_transfer_bin_file: Board Data File download to address=0xc0000 file name=IPQ4019/hw.1/boardData_Mallorca_TW_5G_neg_pwr.bin -$ [*09/08/2021 00:00:56.2584] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.2788] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.2944] -$ [*09/08/2021 00:00:56.2945] [Flash] : Ignore Module param -$ [*09/08/2021 00:00:56.2946] ol_ath_download_firmware : Second OTP download and Execute is good, param=0x0 -$ [*09/08/2021 00:00:56.2952] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.2961] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:56.3053] ol_transfer_bin_file: Downloading firmware file: IPQ4019/hw.1/athwlan.bin -$ [*09/08/2021 00:00:56.3064] Firmware loaded from user helper succesfully -$ [*09/08/2021 00:00:57.1048] FWLOG: [196147] WAL_DBGID_TX_AC_BUFFER_SET ( 0x3, 0xdeb001, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:57.1049] FWLOG: [196147] WAL_DBGID_TX_AC_BUFFER_SET ( 0x12, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:57.1049] FWLOG: [196147] WAL_DBGID_TX_AC_BUFFER_SET ( 0x45, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:57.1050] FWLOG: [196147] WAL_DBGID_TX_AC_BUFFER_SET ( 0x67, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:57.5311] HTC Rx: insufficient length, got:4 expected =8 -$ [*09/08/2021 00:00:57.5333] Startup Mode-0 set -$ [*09/08/2021 00:00:57.5337] HTC Service:0x0300 ep:1 TX flow control disabled -$ [*09/08/2021 00:00:57.5390] HTC Service:0x0100 ep:2 TX flow control disabled -$ [*09/08/2021 00:00:57.5402] Firmware_Build_Number:70 -$ [*09/08/2021 00:00:57.5402] num_rf_chain:0x00000002 ht_cap_info:0x0000085b vht_cap_info:0x339959b2 vht_supp_mcs:0x0000fffa -$ [*09/08/2021 00:00:57.5403] -$ [*09/08/2021 00:00:57.5403] RES CFG Support wmi_service_bitmap 9778 -$ [*09/08/2021 00:00:57.5403] -$ [*09/08/2021 00:00:57.5403] Sending Ext resource cfg: HOST PLATFORM as 0 and fw_feature_bitmap as 50 to TGT -$ [*09/08/2021 00:00:57.5405] ol_ath_service_ready_event: sw_cal_support_check_flag: 1 -$ [*09/08/2021 00:00:57.5417] ol_ath_service_ready_event[4276] WAPI MBSSID 0 -$ [*09/08/2021 00:00:57.5820] wmi_ready_event_rx: WMI UNIFIED READY event -$ [*09/08/2021 00:00:57.5821] htt_h2t_frag_desc_bank_cfg_msg - HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG sent to FW for radio ID = 1 -$ [*09/08/2021 00:00:57.5888] acfg_attach: Offload using existing sock 9f0b9400 -$ [*09/08/2021 00:00:57.5892] spectral_init_netlink 81 NULL SKB -$ [*09/08/2021 00:00:57.5919] ACS not enabled -$ [*09/08/2021 00:00:57.5963] ol_ath_thermal_mitigation_attach: -- -$ [*09/08/2021 00:00:57.7316] pktlog_init: Initializing Pktlog for AR900B, pktlog_hdr_size = 16 -$ [*09/08/2021 00:00:57.7317] pktlog_init: Initializing Pktlog for AR900B, pktlog_hdr_size = 16 -$ [*09/08/2021 00:00:58.5327] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x3, 0xdeb001, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x12, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x45, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x67, 0x1e, 0x94c, 0x94c, 0x0 ) -$ [*09/08/2021 00:00:58.5329] FWLOG: [197617] WAL_DBGID_PDEV_INFO_PRINT ( 0x3a, 0x10, 0x0, 0x10, 0x0 ) -$ -$ -$ User Access Verification -$ Username: [*09/08/2021 00:01:03.3539] wmi_dbg_cfg_send: mod[0]00000000 dbgcfg40000000 cfgvalid[0] 00000000 cfgvalid[1] 00000000 -$ [*09/08/2021 00:01:03.3595] wmi_dbg_cfg_send: mod[0]00000000 dbgcfg40000000 cfgvalid[0] 00000000 cfgvalid[1] 00000000 -$ [*09/08/2021 00:01:04.2375] ip6_port srcr2, ip6local fe80::1ed1:e0ff:fefd:4cf0, ip6 ::, plen 0, gw6 ::, gw6_mac 00:00:00:00:00:00, mtu 1500, vid 0, mode6 2(slaac) -$ [*09/08/2021 00:01:04.3160] pid 5323's current affinity mask: f -$ [*09/08/2021 00:01:04.3160] pid 5323's new affinity mask: e -$ [*09/08/2021 00:01:05.3968] device aptrace0 entered promiscuous mode -$ [*09/08/2021 00:01:05.5261] device to_container entered promiscuous mode -$ [*09/08/2021 00:01:06.9688] chpasswd: password for user changed -$ [*09/08/2021 00:01:06.9940] ---- set led 1 -$ [*09/08/2021 00:01:09.2087] DOT11_TXP[0]:Domain configured: 1 class:E -$ [*09/08/2021 00:01:09.5204] DOT11_TXP[1]:Domain configured: 12 class:E -$ [*09/08/2021 00:01:11.3347] DOT11_DRV[0]: Init Radio0 -$ [*09/08/2021 00:01:11.3994] DOT11_DRV[0]: set_channel Channel set to 6 -$ [*09/08/2021 00:01:11.4094] DOT11_DRV[1]: Init Radio1 -$ [*09/08/2021 00:01:11.5055] DOT11_DRV[1]: set_channel Channel set to 36 -$ [*09/08/2021 00:01:12.1854] DOT11_CFG[0] Radio Mode is changed from Local to FlexConnect -$ [*09/08/2021 00:01:12.1879] DOT11_CFG[0]: Starting radio 0 -$ [*09/08/2021 00:01:12.1898] DOT11_DRV[0]: Start Radio0 - Begin -$ [*09/08/2021 00:01:12.1919] DOT11_DRV[0]: Start Radio0 - End -$ [*09/08/2021 00:01:12.1936] DOT11_CFG[1] Radio Mode is changed from Local to FlexConnect -$ [*09/08/2021 00:01:12.1959] DOT11_CFG[1]: Starting radio 1 -$ [*09/08/2021 00:01:12.1978] DOT11_DRV[1]: Start Radio1 - Begin -$ [*09/08/2021 00:01:12.1999] DOT11_DRV[1]: Start Radio1 - End -$ [*09/08/2021 00:01:12.2515] DOT11_DRV[0]: Stop Radio0 - Begin -$ [*09/08/2021 00:01:12.4081] DOT11_DRV[0]: Stop Radio0 - End -$ [*09/08/2021 00:01:12.4176] DOT11_DRV[0]: set_channel Channel set to 1 -$ [*09/08/2021 00:01:12.4204] DOT11_DRV[0]: Start Radio0 - Begin -$ [*09/08/2021 00:01:12.4221] DOT11_DRV[0]: Start Radio0 - End -$ [*09/08/2021 00:01:12.4229] DOT11_DRV[0]: Channel set to 1, width 20 -$ [*09/08/2021 00:01:12.4272] DOT11_DRV[0]: Stop Radio0 - Begin -$ [*09/08/2021 00:01:12.6482] DOT11_DRV[0]: Stop Radio0 - End -$ [*09/08/2021 00:01:12.6496] DOT11_DRV[0]: Channel set to 1, width 20 -$ [*09/08/2021 00:01:12.6880] DOT11_DRV[1]: Stop Radio1 - Begin -$ [*09/08/2021 00:01:12.6911] DOT11_DRV[1]: Stop Radio1 - End -$ [*09/08/2021 00:01:12.6997] DOT11_DRV[1]: set_channel Channel set to 36 -$ [*09/08/2021 00:01:12.7025] DOT11_DRV[1]: Start Radio1 - Begin -$ [*09/08/2021 00:01:12.7041] DOT11_DRV[1]: Start Radio1 - End -$ [*09/08/2021 00:01:12.7046] DOT11_DRV[1]: Stop Radio1 - Begin -$ [*09/08/2021 00:01:12.9381] DOT11_DRV[1]: Stop Radio1 - End -$ [*09/08/2021 00:01:12.9383] DOT11_DRV[1]: Start Radio1 - Begin -$ [*09/08/2021 00:01:12.9400] DOT11_DRV[1]: Start Radio1 - End -$ [*09/08/2021 00:01:12.9407] DOT11_DRV[1]: Channel set to 36, width 20 -$ [*09/08/2021 00:01:12.9475] DOT11_DRV[1]: Stop Radio1 - Begin -$ [*09/08/2021 00:01:12.9506] DOT11_DRV[1]: Stop Radio1 - End -$ [*09/08/2021 00:01:12.9520] DOT11_DRV[1]: Channel set to 36, width 20 -$ [*09/08/2021 00:01:12.9548] Failed to load flex AP config from file. Default config will be used. -$ [*09/08/2021 00:01:12.9579] Socket Valid Element wcp/wcp_db Handler set_vlan_name_map Data Length 10 -$ [*09/08/2021 00:01:12.9902] Failed to send msg to wcp/Radio2.set_radius_extended_config -$ [*09/08/2021 00:01:12.9902] -$ [*09/08/2021 00:01:12.9978] Failed to load flex vap config from file. Default config will be used. -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 04:54:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 04:54:43 ========= -$ -$ Username: -$ Username: cisco -$ Password: -$ AP1CD1.E0FD.4CF0>en -$ Password: -$ AP1CD1.E0FD.4CF0#sh inv -$ NAME: AP1815, DESCR: Cisco Aironet 1815 Series (IEEE 802.11ac) Access Point -$ PID: AIR-AP1815T-E-K9 , VID: V01, SN: FGL2537L0UY -$ -$ AP1CD1.E0FD.4CF0#sh ver -$ Restricted Rights Legend -$ -$ Use, duplication, or disclosure by the Government is subject to -$ restrictions as set forth in subparagraph (c) of the Commercial -$ Computer Software - Restricted Rights clause at FAR sec. 52.227-19 and -$ subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer -$ Software clause at DFARS sec. 252.227-7013. -$ -$ Cisco Systems, Inc. -$ 170 West Tasman Drive -$ San Jose, California 95134-1706 -$ -$ This product contains cryptographic features and is subject to United -$ States and local country laws governing import, export, transfer and -$ use. Delivery of Cisco cryptographic products does not imply -$ third-party authority to import, export, distribute or use encryption. -$ Importers, exporters, distributors and users are responsible for -$ compliance with U.S. and local country laws. By using this product you -$ agree to comply with applicable laws and regulations. If you are unable -$ to comply with U.S. and local laws, return this product immediately. -$ -$ A summary of U.S. laws governing Cisco cryptographic products may be found at: -$ http://www.cisco.com/wwl/export/crypto/tool/stqrg.html -$ -$ If you require further assistance please contact us by sending email to -$ export@cisco.com. -$ -$ This product contains some software licensed under the -$ "GNU General Public License, version 2" provided with -$ ABSOLUTELY NO WARRANTY under the terms of -$ "GNU General Public License, version 2", available here: -$ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html -$ -$ This product contains some software licensed under the -$ "GNU Library General Public License, version 2" provided -$ with ABSOLUTELY NO WARRANTY under the terms of "GNU Library -$ General Public License, version 2", available here: -$ http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html -$ -$ This product contains some software licensed under the -$ "GNU Lesser General Public License, version 2.1" provided -$ with ABSOLUTELY NO WARRANTY under the terms of "GNU Lesser -$ General Public License, version 2.1", available here: -$ http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html -$ -$ This product contains some software licensed under the -$ "GNU General Public License, version 3" provided with -$ ABSOLUTELY NO WARRANTY under the terms of -$ "GNU General Public License, Version 3", available here: -$ http://www.gnu.org/licenses/gpl.html. -$ -$ This product contains some software licensed under the -$ "GNU Affero General Public License, version 3" provided -$ with ABSOLUTELY NO WARRANTY under the terms of -$ "GNU Affero General Public License, version 3", available here: -$ http://www.gnu.org/licenses/agpl-3.0.html. -$ -$ Cisco AP Software, (ap1g5), C1815, RELEASE SOFTWARE -$ Technical Support: http://www.cisco.com/techsupport -$ Copyright (c) 1986-2021 by Cisco Systems, Inc. -$ Compiled Wed Jul 29 00:18:43 PDT 2020 -$ -$ ROM: Bootstrap program is U-Boot boot loader -$ BOOTLDR: U-Boot boot loader Version 52 -$ -$ AP1CD1.E0FD.4CF0 uptime is 0 days, 0 hours, 56 minutes -$ Last reload time : Tue Sep 7 23:59:59 UTC 2021 -$ Last reload reason : unknown -$ -$ cisco AIR-AP1815T-E-K9 ARMv7 Processor rev 5 (v7l) with 495824/215352K bytes of memory. -$ Processor board ID FGL2537L0UY -$ AP Running Image : 8.10.130.0 -$ Primary Boot Image : 8.10.130.0 -$ Backup Boot Image : 0.0.0.0 -$ Primary Boot Image Hash: -$ Backup Boot Image Hash: -$ 4 Gigabit Ethernet interfaces -$ 2 802.11 Radios -$ Radio FW version : 7e809a6b82648b605ad4ce1fd1a98fd0 -$ NSS FW version : not available -$ -$ Base ethernet MAC Address : 1C:D1:E0:FD:4C:F0 -$ Part Number : 0-0000-00 -$ PCA Assembly Number : 074-105849-01 -$ PCA Revision Number : 0 -$ PCB Serial Number : FOC253510HH -$ Top Assembly Part Number : 068-101112-01 -$ Top Assembly Serial Number : FGL2537L0UY -$ Top Revision Number : A0 -$ Product/Model Number : AIR-AP1815T-E-K9 -$ -$ -$ AP1CD1.E0FD.4CF0# -$ AP1CD1.E0FD.4CF0#sh log -$ Console logging : Level - notification, Status - enabled -$ -$ Syslog logging : Level - error, Status - active, IP - 255.255.255.255 -$ -$ System logging : -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5875] bypasswmi : 0 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5881] target uses HTT version 2.2; host uses 2.2 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5886] ol_ath_phyerr_attach: called -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5888] OL Resmgr Init-ed -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5888] acfg_attach: Offload using existing sock 9f0b9400 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5889] ol_if_spectral_setup -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5889] SPECTRAL : get_capability not registered -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5889] HAL_CAP_PHYDIAG : Capable -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5890] SPECTRAL : Need to fix the capablity check for RADAR (spectral_attach : 257) -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5890] SPECTRAL : get_capability not registered -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5890] HAL_CAP_RADAR : Capable -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5890] SPECTRAL : Need to fix the capablity check for SPECTRAL -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5891] (spectral_attach : 262) -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5891] SPECTRAL : get_capability not registered -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5891] HAL_CAP_SPECTRAL_SCAN : Capable -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5891] SPECTRAL : get_tsf64 not registered -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5892] spectral_init_netlink 81 NULL SKB -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5892] Green-AP : Green-AP : Attached -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5892] -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5892] Green-AP : Attached -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5892] rate power table overXide is only supported for AR98X -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5893] ol_if_dfs_setup: called -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5894] ol_if_dfs_attach: called; ptr=91a59984, radar_info=94b4fb48 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5917] ol_ath_attach() UMAC attach . -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5918] -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5918] BURSTING enabled by default -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5919] ACS not enabled -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5919] __ol_ath_attach: needed_headroom reservation 60 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5963] ol_ath_thermal_mitigation_attach: -- -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.5997] ath_ol_pci: (Atheros/multi-bss) -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.6669] ath_hal: 0.9.17.1 (AR5416, AR9380, WRITE_EEPROM, TX_DATA_SWAP, RX_DATA_SWAP, 11D) -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.6777] ath_rate_atheros: Copyright (c) 2001-2005 Atheros Communications, Inc, All Rights Reserved -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.7218] ath_dev: Copyright (c) 2001-2007 Atheros Communications, Inc, All Rights Reserved -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.7316] pktlog_init: Initializing Pktlog for AR900B, pktlog_hdr_size = 16 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.7317] pktlog_init: Initializing Pktlog for AR900B, pktlog_hdr_size = 16 -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.9142] systemd[1]: Starting dnsmasq watcher... -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.9243] brain: unloading click config -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.9244] brain: spring cleaning pages -$ Sep 8 00:00:57 kernel: [*09/08/2021 00:00:57.9748] systemd[1]: Starting DNSmasq... -$ Sep 8 00:00:58 dnsmasq[4475]: started, version 2.78 cachesize 150 -$ Sep 8 00:00:58 dnsmasq[4475]: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP no-DHCPv6 no-Lua TFTP no-conntrack no-ipset no-auth no-DNSSEC loop-detect inotify -$ Sep 8 00:00:58 dnsmasq-dhcp[4475]: DHCP, IP range 10.0.0.10 -- 10.0.0.250, lease time 1d -$ Sep 8 00:00:58 dnsmasq[4475]: read /etc/hosts - 3 addresses -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.1656] systemd[1]: Started DNSmasq. -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.2615] systemd[1]: Started dnsmasq watcher. -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.5327] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x3, 0xdeb001, 0x94c, 0x94c, 0x0 ) -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x12, 0x1e, 0x94c, 0x94c, 0x0 ) -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x45, 0x1e, 0x94c, 0x94c, 0x0 ) -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.5328] FWLOG: [197607] WAL_DBGID_TX_AC_BUFFER_SET ( 0x67, 0x1e, 0x94c, 0x94c, 0x0 ) -$ Sep 8 00:00:58 kernel: [*09/08/2021 00:00:58.5329] FWLOG: [197617] WAL_DBGID_PDEV_INFO_PRINT ( 0x3a, 0x10, 0x0, 0x10, 0x0 ) -$ Sep 8 00:00:59 kernel: [*09/08/2021 00:00:59.4840] brain: loading click config -$ Sep 8 00:01:03 kernel: [*09/08/2021 00:01:03.0147] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:01:03 kernel: [09/08/2021 00:01:03.1099] SELinux: initialized (dev mtd_inodefs, type mtd_inodefs), not configured for labeling -$ Sep 8 00:01:03 kernel: [*09/08/2021 00:01:03.3539] wmi_dbg_cfg_send: mod[0]00000000 dbgcfg40000000 cfgvalid[0] 00000000 cfgvalid[1] 00000000 -$ Sep 8 00:01:03 kernel: [*09/08/2021 00:01:03.3595] wmi_dbg_cfg_send: mod[0]00000000 dbgcfg40000000 cfgvalid[0] 00000000 cfgvalid[1] 00000000 -$ Sep 8 00:01:03 brain: do_state:4246: assigning brain state: scan1; reason: initial_scan -$ Sep 8 00:01:03 kernel: [*09/08/2021 00:01:03.6745] systemd[1]: Starting Lighttpd Watcher... -$ Sep 8 00:01:03 kernel: [*09/08/2021 00:01:03.7348] systemd[1]: Starting Lighttpd Daemon... -$ Sep 8 00:01:03 kernel: [09/08/2021 00:01:03.7399] SELinux: initialized (dev mtd_inodefs, type mtd_inodefs), not configured for labeling -$ Sep 8 00:01:04 kernel: [09/08/2021 00:01:04.0499] SELinux: initialized (dev mtd_inodefs, type mtd_inodefs), not configured for labeling -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.0896] systemd[1]: Starting dnsmasq watcher... -$ Sep 8 00:01:04 GRPC: Turning off firewall ... -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.2375] ip6_port srcr2, ip6local fe80::1ed1:e0ff:fefd:4cf0, ip6 ::, plen 0, gw6 ::, gw6_mac 00:00:00:00:00:00, mtu 1500, vid 0, mode6 2(slaac) -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.3160] pid 5323's current affmask: f ore-- -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.3160] pid 5323's new affinity mask: e -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.3262] systemd[1]: Started Clean Air daemon. -$ Sep 8 00:01:04 dnsmasq[4475]: exiting on receipt of SIGTERM -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.3843] systemd[1]: Stopping DNSmasq... -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.3888] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.4380] systemd[1]: Started Lighttpd Daemon. -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.4486] systemd[1]: Started capwapd. -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.4815] systemd[1]: Starting DNSmasq... -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.5419] systemd[1]: Started gRPC server daemon. -$ Sep 8 00:01:04 kernel: [09/08/2021 00:01:04.5899] SELinux: initialized (dev mtd_inodefs, type mtd_inodefs), not configured for labeling -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.6174] systemd[1]: Started Lighttpd Watcher. -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.6429] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:01:04 dnsmasq[5432]: started, version 2.78 cachesize 150 -$ Sep 8 00:01:04 dnsmasq[5432]: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP no-DHCPv6 no-Lua TFTP no-conntrack no-ipset no-auth no-DNSSEC loop-detect inotify -$ Sep 8 00:01:04 dnsmasq-dhcp[5432]: DHCP, IP range 10.0.0.10 -- 10.0.0.250, lease time 1d -$ Sep 8 00:01:04 kernel: [*09/08/2021 00:01:04.8841] systemd[1]: Started DNSmasq. -$ Sep 8 00:01:04 dnsmasq[5432]: read /etc/hosts - 3 addresses -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.0814] systemd[1]: Reached target Multi-User System. -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.0929] systemd[1]: Starting Multi-User System. -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.1034] systemd[1]: Started dnsmasq watcher. -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.1176] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:01:05 FIPS[5385]: *** lighttpd: FIPS Mode = disabled *** -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.3008] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.3968] device aptrace0 entered promiscuous mode -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.5261] device to_container entered promiscuous mode -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.6437] systemd[1]: Started WCPD process. -$ Sep 8 00:01:05 kernel: [*09/08/2021 00:01:05.6464] systemd[1]: Startup finished in 1min 18.760s (kernel) + 0 (initrd) + 1min 21.669s (userspace) = 2min 40.430s. -$ Sep 8 00:01:05 brain: transitioning from init to scan1 -$ Sep 8 00:01:05 brain: Power mode: Full-Power, power_detection: DC_adapter(TRUE), 802.3AF_POE(FALSE) -$ Sep 8 00:01:05 FIPS[5491]: *** /opt/cisco/bin/wcpd: FIPS Mode = disabled *** -$ Sep 8 00:01:06 syslog: password for user changed -$ Sep 8 00:01:06 kernel: [*09/08/2021 00:01:06.9688] chpasswd: password for user changed -$ Sep 8 00:01:06 syslog: read LAG cfg, ap lag 0, global lag 0, lag capable 0 -$ Sep 8 00:01:06 kernel: [*09/08/2021 00:01:06.9940] ---- set led 1 -$ Sep 8 00:01:07 syslog: Check lagloadbalance setting flex mode 1 cfg 0 linkstate 0 ap_type 65 -$ Sep 8 00:01:09 kernel: [*09/08/2021 00:01:09.2087] DOT11_TXP[0]:Domain configured: 1 class:E -$ Sep 8 00:01:09 kernel: [*09/08/2021 00:01:09.5204] DOT11_TXP[1]:Domain configured: 12 class:E -$ Sep 8 00:01:11 kernel: [*09/08/2021 00:01:11.3347] DOT11_DRV[0]: Init Radio0 -$ Sep 8 00:01:11 kernel: [*09/08/2021 00:01:11.3994] DOT11_DRV[0]: set_channel Channel set to 6 -$ Sep 8 00:01:11 kernel: [*09/08/2021 00:01:11.4094] DOT11_DRV[1]: Init Radio1 -$ Sep 8 00:01:11 kernel: [*09/08/2021 00:01:11.5055] DOT11_DRV[1]: set_channel Channel set to 36 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1854] DOT11_CFG[0] Radio Mode is changed from Local to FlexConnect -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1879] DOT11_CFG[0]: Starting radio 0 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1898] DOT11_DRV[0]: Start Radio0 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1919] DOT11_DRV[0]: Start Radio0 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1936] DOT11_CFG[1] Radio Mode is changed from Local to FlexConnect -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1959] DOT11_CFG[1]: Starting radio 1 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1978] DOT11_DRV[1]: Start Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.1999] DOT11_DRV[1]: Start Radio1 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.2515] DOT11_DRV[0]: Stop Radio0 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4081] DOT11_DRV[0]: Stop Radio0 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4176] DOT11_DRV[0]: set_channel Channel set to 1 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4204] DOT11_DRV[0]: Start Radio0 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4221] DOT11_DRV[0]: Start Radio0 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4229] DOT11_DRV[0]: Channel set to 1, width 20 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.4272] DOT11_DRV[0]: Stop Radio0 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.6482] DOT11_DRV[0]: Stop Radio0 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.6496] DOT11_DRV[0]: Channel set to 1, width 20 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.6880] DOT11_DRV[1]: Stop Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.6911] DOT11_DRV[1]: Stop Radio1 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.6997] DOT11_DRV[1]: set_channel Channel set to 36 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.7025] DOT11_DRV[1]: Start Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.7041] DOT11_DRV[1]: Start Ra End ore-- -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.7046] DOT11_DRV[1]: Stop Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9381] DOT11_DRV[1]: Stop Radio1 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9383] DOT11_DRV[1]: Start Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9400] DOT11_DRV[1]: Start Radio1 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9407] DOT11_DRV[1]: Channel set to 36, width 20 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9475] DOT11_DRV[1]: Stop Radio1 - Begin -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9506] DOT11_DRV[1]: Stop Radio1 - End -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9520] DOT11_DRV[1]: Channel set to 36, width 20 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9548] Failed to load flex AP config from file. Default config will be used. -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9579] Socket Valid Element wcp/wcp_db Handler set_vlan_name_map Data Length 10 -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9902] Failed to send msg to wcp/Radio2.set_radius_extended_config -$ Sep 8 00:01:12 kernel: [*09/08/2021 00:01:12.9902] -$ Sep 8 00:01:13 kernel: [*09/08/2021 00:01:12.9978] Failed to load flex vap config from file. Default config will be used. -$ Sep 8 00:01:13 kernel: [09/08/2021 00:01:13.0799] SELinux: initialized (dev mtd_inodefs, type mtd_inodefs), not configured for labeling -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.3854] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.3956] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.4505] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.4629] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.5989] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:02:05 kernel: [*09/08/2021 00:02:05.6929] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.6687] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.6769] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.7313] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.7421] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.8756] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:02:57 kernel: [*09/08/2021 00:02:57.9653] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:03:49 kernel: [*09/08/2021 00:03:49.9396] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:03:49 kernel: [*09/08/2021 00:03:49.9477] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:03:50 kernel: [*09/08/2021 00:03:49.9979] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:03:50 kernel: [*09/08/2021 00:03:50.0102] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:03:50 kernel: [*09/08/2021 00:03:50.1480] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:03:50 kernel: [*09/08/2021 00:03:50.2444] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.2093] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.2176] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.2687] systemd[1]: Stopping Dclient...ore-- -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.2793] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.4176] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:04:42 kernel: [*09/08/2021 00:04:42.5073] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.4773] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.4855] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.5358] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.5476] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.6808] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:05:34 kernel: [*09/08/2021 00:05:34.7722] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:06:26 kernel: [*09/08/2021 00:06:26.7498] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:06:26 kernel: [*09/08/2021 00:06:26.7579] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:06:26 kernel: [*09/08/2021 00:06:26.8131] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:06:26 kernel: [*09/08/2021 00:06:26.8241] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:06:26 kernel: [*09/08/2021 00:06:26.9645] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:06:27 kernel: [*09/08/2021 00:06:27.0548] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.0165] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.0248] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.0760] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.0876] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.2232] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:07:19 kernel: [*09/08/2021 00:07:19.3119] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.2865] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.2948] systemd[1]: Starting dclient watcher... -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.3481] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.3602] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.4994] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:08:11 kernel: [*09/08/2021 00:08:11.5933] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.5532] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.5697] systemd[1]: Starting dhcpv6 client watcher... -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.6226] systemd[1]: Stopping DHCPv6 client... -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.6352] systemd[1]: Starting DHCPv6 client... -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.7675] systemd[1]: Started DHCPv6 client. -$ Sep 8 00:09:03 kernel: [*09/08/2021 00:09:03.8504] systemd[1]: Started dhcpv6 client watcher. -$ Sep 8 00:09:55 kernel: [*09/08/2021 00:09:55.8255] IPv6: ADDRCONF(NETDEV_UP): wired0: link is not ready -$ Sep 8 00:09:55 kernel: [*09/08/2021 00:09:55.8397] systemd[1]: Starting dclient watcher... -$ Sep 8 00:09:55 kernel: [*09/08/2021 00:09:55.8917] systemd[1]: Stopping Dclient...ore-- -$ AP1CD1.E0FD.4CF0# -$ Read timed out -$ -$ -$ -$ User Access Verification -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 05:59:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 05:59:33 ========= -$ -$ Username: -$ Username: -$ % Authentication failed -$ -$ -$ -$ User Access Verification -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 06:51:26 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 06:51:31 ========= -$ -$ Username: -$ Username: -$ % Authentication failed -$ -$ -$ -$ User Access Verification -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 07:45:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 07:45:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 08:15:47 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 08:15:52 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 08:45:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 08:45:59 ========= -$ -$ Username: -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 09:58:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 09:58:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 10:28:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 10:28:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 10:58:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 10:58:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:06:47 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:06:52 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:06:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:06:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:06:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:08 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:13 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:13 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:18 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:23 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:29 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:34 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:34 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:39 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:07:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:08:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:09:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:10:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:11:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:12:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:13:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:14:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:30:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:10 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:31 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:36 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:31:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:23 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:28 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:44 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:49 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:32:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:00 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:05 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:05 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:10 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:26 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:31 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:31 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:36 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:33:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:13 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:18 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:23 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:28 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:39 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:34:55 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:00 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:00 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:05 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:05 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:10 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:16 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:21 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:21 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:26 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:26 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:31 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:42 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:47 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:47 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:52 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:35:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:08 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:13 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:13 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:18 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:29 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:34 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:34 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:39 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:39 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:36:55 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:00 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:00 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:05 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:16 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:21 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:21 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:26 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:26 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:42 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:47 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:47 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:52 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:37:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:08 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:29 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:34 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:38:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:16 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:21 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:39:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:40:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:41:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:42:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:43:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:44:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:45:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:46:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:47:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:48:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:49:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:31 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:36 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:50:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:13 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:18 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:23 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:28 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:34 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:39 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:39 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:51:55 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:00 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:00 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:05 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:16 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:52:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:31 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:36 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:47 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:52 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:53:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:08 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:13 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:13 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:18 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:29 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:34 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:34 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:39 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:39 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:50 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:50 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:55 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:54:55 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:00 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:00 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:05 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:11 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:16 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:16 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:21 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:21 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:26 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:32 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:37 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:37 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:42 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:42 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:47 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:53 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:58 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:55:58 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:03 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:03 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:08 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:14 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:19 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:19 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:24 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:24 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:29 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:40 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:40 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:45 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:45 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:56:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:01 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:06 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:06 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:11 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:27 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:32 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:48 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:53 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:57:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:58:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:27 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 11:59:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:14 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:35 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:51 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:56 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:00:56 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:01 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:17 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:22 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:22 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:28 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:43 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:43 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:48 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:01:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:04 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:09 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:09 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:30 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:35 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:41 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:46 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:46 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:51 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:52 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:57 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:02:57 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:02 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:02 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:07 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:07 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:12 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:12 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:17 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:18 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:23 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:23 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:28 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:28 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:33 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:33 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:38 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:38 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:44 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:44 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:49 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:49 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:54 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:54 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:59 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:03:59 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:04 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:05 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:10 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:10 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:15 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:15 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:20 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:20 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:25 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:25 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:30 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:31 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:36 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:36 ========= -$ ========= 20230823 - HELEN1 - Start recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:41 ========= -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:41 ======= -$ ========= 20230823 - HELEN1 - Start fault recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:44 -$ ========= 20230823 - HELEN1 - Start fault recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:4 -$ ========= 20230823 - HELEN1 - Start fault recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:04:4 -$ ========= 20230823 - HELEN1 - End recording -- Session US2-18-10 (Host 127.0.0.1) -- 23/08/2023 - 12:07:37 diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 615aea9..cae0462 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -79,7 +79,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 10000 }, + { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; @@ -94,11 +94,10 @@ export async function runtimeCheckLogs(folderPath) { ); let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); - let content = await fs + let contentFile = await fs .readFileSync(filePath) .toString() - ?.split("\n") - .slice(); + ?.split("\n"); let allValue = await KeyValue.all(); let listKeyValues = allValue.filter( @@ -115,7 +114,7 @@ export async function runtimeCheckLogs(folderPath) { .filter((i) => i.$original.key === "MODEL_SPECIAL") .map((obj) => obj.$original.value); - content.map((line, index) => { + contentFile.map((line, index) => { listKeyValues .map((obj) => obj.$original.value) .map(async (value) => { @@ -176,72 +175,78 @@ export async function runtimeCheckLogs(folderPath) { "select * from log_reports where id_file = " + fileDetect?.id_ldf ); - const timeImage = Date.now() - await screenShot(fileName, timeImage); - - setTimeout(async() => { - const uriImage = await uploadFileToZulip(timeImage); - let listReport = await getListLineByItem( - logsDetect[0].filter((l) => l.line > lastLine) - ); - let content = - "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - let spoiler = ""; - 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 + - "|[View](https://logs.danielvu.com/logs/" + - fileName + - "#" + - log.line + - ")\n"; - }); - // } - // setTimeout(() => { - sendMessToZulip( - "stream", - "Result test - auto.nswteam.net", - "Log Alert", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler - + - "\n\n[image](" + - uriImage + - ")\n" - ); - - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler - + - "\n\n[image](" + - uriImage + - ")\n" - ); - }, 10000); - + // const timeImage = Date.now() + // await screenShot(fileName, timeImage); + + // setTimeout(async() => { + // const uriImage = await uploadFileToZulip(timeImage); + let listReport = await getListLineByItem( + logsDetect[0].filter((l) => l.line > lastLine) + ); + let content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + let issueFound = ""; + 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 + "`") + }) + content = + content + + "|" + + (index + 1) + + "|**" + + moment(log.created_at).format("HH:mm - DD/MM") + + "**|" + + item + + "|" + + log.line + + "|[View](https://logs.danielvu.com/logs/" + + fileName + + "#" + + log.line + + ")\n"; + }); + // } + // setTimeout(() => { + sendMessToZulip( + "stream", + "Result test - auto.nswteam.net", + "Log Alert", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + issueFound + // uriImage + + // ")\n" + ); + + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + issueFound + ); + // }, 10000); + // }, 3000); } }, 3000); diff --git a/screenshot.js b/screenshot.js index 058c840..a773459 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,73 +1,73 @@ -const puppeteer = require("puppeteer"); +// const puppeteer = require("puppeteer"); -(async () => { - // Launch a headless browser - const browser = await puppeteer.launch({ - headless: true, - args: ["--no-sandbox"], - }); +// (async () => { +// // Launch a headless browser +// const browser = await puppeteer.launch({ +// headless: true, +// args: ["--no-sandbox"], +// }); - // Open a new page - const page = await browser.newPage(); - await page.goto( - "https://logs.danielvu.com/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" - ); - const bodyHandle = await page.$("body"); - const { height } = await bodyHandle.boundingBox(); - await bodyHandle.dispose(); - await page.setViewport({ width: 1920, height: 500 }); - setTimeout(async () => { - await page.screenshot({ path: "screenshot.png" }); - await browser.close(); - }, 5000); - // } else { - // console.error(`Element with class name '${className}' not found.`); - // } - // Close the browser -})(); +// // Open a new page +// const page = await browser.newPage(); +// await page.goto( +// "https://logs.danielvu.com/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" +// ); +// const bodyHandle = await page.$("body"); +// const { height } = await bodyHandle.boundingBox(); +// await bodyHandle.dispose(); +// await page.setViewport({ width: 1920, height: 500 }); +// setTimeout(async () => { +// await page.screenshot({ path: "screenshot.png" }); +// await browser.close(); +// }, 5000); +// // } else { +// // console.error(`Element with class name '${className}' not found.`); +// // } +// // Close the browser +// })(); -// const zulip = require("zulip-js"); +const zulip = require("zulip-js"); -// const config = { -// zuliprc: "./download", -// zulipVersion: "v2", -// }; +const config = { + zuliprc: "./zuliprc", + zulipVersion: "v2", +}; -// async function deleteMessages() { -// const client = await zulip(config); +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 = "Log Alert"; -// const startTime = Date.parse("2023-09-11T00:00:00Z"); -// const endTime = Date.parse("2023-09-11T23:59:59Z"); + // 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 = "AU-dev"; + const startTime = Date.parse("2023-09-11T00:00:00Z"); + const endTime = Date.parse("2023-09-11T23:59:59Z"); -// 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.length) -// // for (const message of messages.messages) { -// // 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); -// } -// } + try { + const messages = await client.messages.retrieve({ + anchor: "oldest", + num_before: 0, + num_after: 3, // Đ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(obj=>obj.reactions)) + // for (const message of messages.messages) { + // 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(); +deleteMessages(); // const zulip = require("zulip-js"); // const fs = require("fs"); diff --git a/zuliprc b/zuliprc new file mode 100644 index 0000000..382d7b7 --- /dev/null +++ b/zuliprc @@ -0,0 +1,4 @@ +[api] +email=networktool-bot@zulip.ipsupply.com.au +key=0jMAmOuhfLvBqKJikv5oAkyNM4RIEoAM +site=https://zulip.ipsupply.com.au From 382b74ad83e27e28ca582358ac57dfe12da1b66d Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 19 Sep 2023 08:34:02 +0700 Subject: [PATCH 050/298] update format message, update favion icon and title --- app/store/logs/20230919-TEST.log | 8 +++ app/utils/deleteMessageZulip.ts | 44 +++++++++++++ app/utils/runtimeCheckLogs.ts | 59 ++++++++++------- app/utils/screenShot.ts | 1 + manage-view/public/favicon.ico | Bin 3870 -> 15406 bytes manage-view/public/index.html | 2 +- screenshot.js | 106 ++++++++++++++++++++----------- 7 files changed, 158 insertions(+), 62 deletions(-) create mode 100644 app/store/logs/20230919-TEST.log create mode 100644 app/utils/deleteMessageZulip.ts diff --git a/app/store/logs/20230919-TEST.log b/app/store/logs/20230919-TEST.log new file mode 100644 index 0000000..8483dc6 --- /dev/null +++ b/app/store/logs/20230919-TEST.log @@ -0,0 +1,8 @@ +adfasf +anfasll ak shflks as klhfalk la EHWIC- fsjl +123 PVDM3- hui 800G2-POE-2 +sdhgksd sjk hk error +abc 123 fail +abc 123 fail +sdhgksd sjk hk error +123 PVDM3- hui 800G2-POE-2 \ No newline at end of file diff --git a/app/utils/deleteMessageZulip.ts b/app/utils/deleteMessageZulip.ts new file mode 100644 index 0000000..dfe3555 --- /dev/null +++ b/app/utils/deleteMessageZulip.ts @@ -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); + } +} diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index cae0462..2266c70 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -7,8 +7,6 @@ import KeyValue from "App/Models/KeyValue"; import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; -import { screenShot } from "./screenShot"; -import { uploadFileToZulip } from "./uploadFileZulip"; // export default class loggerAPI { export async function runtimeCheckLogs(folderPath) { @@ -45,9 +43,11 @@ export async function runtimeCheckLogs(folderPath) { //import log new file // console.log(filePath) if ( - //Sua \\ --> / + filePath?.split(".")[filePath.split(".").length - 1] === "log" && filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] === + //localhost + // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === moment(Date.now()).format("YYYYMMDD").toString() ) { console.log("New file added: ", filePath); @@ -55,6 +55,7 @@ export async function runtimeCheckLogs(folderPath) { { file_name: filePath.split("/")[filePath.split("/").length - 1] }, { file_name: filePath.split("/")[filePath.split("/").length - 1] } ); + //localhost // await LogDetectFile.firstOrCreate( // { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }, // { file_name: filePath.split("\\")[filePath.split("\\").length - 1] } @@ -191,15 +192,24 @@ export async function runtimeCheckLogs(folderPath) { let item = listExtraItem.includes(log.detected_content) ? ":medal: **" + log.detected_content + "**" : ":small_orange_diamond: " + log.detected_content; - - log.line?.map((line)=>{ + + log.line?.map((line) => { issueFound = - issueFound + - "\n" + - line + - "$" + - contentFile[line-1]?.replace(log.detected_content, "`" + log.detected_content + "`") - }) + issueFound + + "\n`" + + line + + "` " + + contentFile[line - 1]?.replace( + log.detected_content, + "[" + + log.detected_content + + "](https://logs.danielvu.com/logs/" + + fileName + + "#" + + line + + ")" + ); + }); content = content + "|" + @@ -228,23 +238,24 @@ export async function runtimeCheckLogs(folderPath) { content + "\n\n" + spoiler + - "\n\n*Issue found:*\n" + issueFound + "\n\n***Issue found:***\n" + + issueFound // uriImage + // ")\n" ); - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n*Issue found:*\n" + issueFound - ); + // sendMessToZulip( + // "stream", + // "AUS_VN_Test", + // "Test Log Alerts", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n*Issue found:*\n" + issueFound + // ); // }, 10000); // }, 3000); diff --git a/app/utils/screenShot.ts b/app/utils/screenShot.ts index f9c9b80..cc0a212 100644 --- a/app/utils/screenShot.ts +++ b/app/utils/screenShot.ts @@ -6,6 +6,7 @@ export const screenShot = async (filename, time) => { args: ["--no-sandbox"], }); + try { // Open a new page const page = await browser.newPage(); diff --git a/manage-view/public/favicon.ico b/manage-view/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..b636d9a81b5a7a0aa800a161114d027c5e7d06fe 100644 GIT binary patch literal 15406 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/manage-view/public/index.html b/manage-view/public/index.html index aa069f2..b6a27e0 100644 --- a/manage-view/public/index.html +++ b/manage-view/public/index.html @@ -24,7 +24,7 @@ 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`. --> - React App + Log View diff --git a/screenshot.js b/screenshot.js index a773459..6397d4b 100644 --- a/screenshot.js +++ b/screenshot.js @@ -26,48 +26,63 @@ // // Close the browser // })(); -const zulip = require("zulip-js"); +// const zulip = require("zulip-js"); -const config = { - zuliprc: "./zuliprc", - zulipVersion: "v2", -}; +// const config = { +// zuliprc: "./download", +// zulipVersion: "v2", +// }; -async function deleteMessages() { - const client = await zulip(config); +// 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 = "AU-dev"; - const startTime = Date.parse("2023-09-11T00:00:00Z"); - const endTime = Date.parse("2023-09-11T23:59:59Z"); +// // 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: 3, // Đ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(obj=>obj.reactions)) - // for (const message of messages.messages) { - // 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); - } -} +// 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(); +// deleteMessages(); // const zulip = require("zulip-js"); // const fs = require("fs"); @@ -145,3 +160,20 @@ deleteMessages(); // 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(); +// })(); + From d67a64f32a1d8620adf0650ba1c57ffaec3599f2 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 19 Sep 2023 08:42:48 +0700 Subject: [PATCH 051/298] update format message, update favion icon and title --- app/utils/runtimeCheckLogs.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 2266c70..4bca81f 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -244,18 +244,18 @@ export async function runtimeCheckLogs(folderPath) { // ")\n" ); - // sendMessToZulip( - // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n*Issue found:*\n" + issueFound - // ); + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + issueFound + ); // }, 10000); // }, 3000); From 72f48ed58e3be4237c8e85356db1a880eb742c30 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 19 Sep 2023 13:15:54 +0700 Subject: [PATCH 052/298] update log of AUTO --- app/utils/runtimeCheckLogs.ts | 80 +++++++++++-------- .../src/components/ShowLog/ShowLog.jsx | 2 +- start/routes.ts | 3 +- 3 files changed, 50 insertions(+), 35 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 4bca81f..c4e0246 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -8,13 +8,10 @@ import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; -// export default class loggerAPI { export async function runtimeCheckLogs(folderPath) { try { let fileList = Array(); let fileList_old = Array(); - - // console.log(listKeyValues.map(obj=>obj.$original.value)) // Function to update the list of files async function updateFileList() { //get date now @@ -35,26 +32,43 @@ export async function runtimeCheckLogs(folderPath) { }); } + const checkSpecialVersion = (paragraph) => { + try { + const regex = /\(CAT3K_CAA-UNIVERSALK9-M\), Version 16\.9\.[2-9]/; + const regex1 = /Version (\d+\.\d+\.\d+)/; + // Use the regular expression to find the match + const match = paragraph.match(regex); + if (match) { + const desiredSubstring = match[0]; + const match2 = desiredSubstring.match(regex1); + return match2[0] + } else { + return "" + } + } catch (error) { + console.log(error) + } + } // Watch the folder for new files const folderWatcher = chokidar.watch(folderPath); - // folderWatcher.setMaxListeners(20); folderWatcher.on("add", async (filePath) => { //import log new file - // console.log(filePath) + //check format file name if ( - filePath?.split(".")[filePath.split(".").length - 1] === "log" && filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] === - //localhost - // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === + //localhost + // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === moment(Date.now()).format("YYYYMMDD").toString() ) { + //add information file to database console.log("New file added: ", filePath); await LogDetectFile.firstOrCreate( { file_name: filePath.split("/")[filePath.split("/").length - 1] }, { file_name: filePath.split("/")[filePath.split("/").length - 1] } ); + //localhost // await LogDetectFile.firstOrCreate( // { file_name: filePath.split("\\")[filePath.split("\\").length - 1] }, @@ -70,9 +84,7 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { - // console.log("--------->", fileList); - //get date now - //check new file + //only check new file ---> fileList - fileList_old = new file await fileList ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { @@ -84,38 +96,52 @@ export async function runtimeCheckLogs(folderPath) { async (eventType) => { //check special item, extra RAM, error in log let lines = []; + + //get information file let fileDetect = await LogDetectFile.findBy( "file_name", fileName ); + //get all log of file let logsDetect = await Database.rawQuery( "select * from log_reports where id_file = " + fileDetect?.id_ldf ); + //get the last line detected let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); + + //get content file in local let contentFile = await fs .readFileSync(filePath) .toString() ?.split("\n"); + //get all values to check let allValue = await KeyValue.all(); + + //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 contentFile.map((line, index) => { + + //check line the line with errors and exclude errors listKeyValues .map((obj) => obj.$original.value) .map(async (value) => { @@ -124,18 +150,11 @@ export async function runtimeCheckLogs(folderPath) { 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 ); - + //check report of line not exist let checkLog = await Database.rawQuery( "select * from log_reports where id_file = " + log?.id_ldf + @@ -155,9 +174,11 @@ export async function runtimeCheckLogs(folderPath) { lines.push(index + 1); } } + + // if(checkSpecialVersion()) }); }); - // }, 5000); + //true: import log to log_report table, send report to Zulip setTimeout(async () => { if (lines.length === 0) { @@ -176,18 +197,17 @@ export async function runtimeCheckLogs(folderPath) { "select * from log_reports where id_file = " + fileDetect?.id_ldf ); - // const timeImage = Date.now() - // await screenShot(fileName, timeImage); - // setTimeout(async() => { - // const uriImage = await uploadFileToZulip(timeImage); + //Get all report newest let listReport = await getListLineByItem( logsDetect[0].filter((l) => l.line > lastLine) ); + let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; let issueFound = ""; + listReport.map((log, index) => { let item = listExtraItem.includes(log.detected_content) ? ":medal: **" + log.detected_content + "**" @@ -226,8 +246,7 @@ export async function runtimeCheckLogs(folderPath) { log.line + ")\n"; }); - // } - // setTimeout(() => { + sendMessToZulip( "stream", "Result test - auto.nswteam.net", @@ -240,8 +259,6 @@ export async function runtimeCheckLogs(folderPath) { spoiler + "\n\n***Issue found:***\n" + issueFound - // uriImage + - // ")\n" ); sendMessToZulip( @@ -254,11 +271,9 @@ export async function runtimeCheckLogs(folderPath) { content + "\n\n" + spoiler + - "\n\n*Issue found:*\n" + issueFound + "\n\n*Issue found:*\n" + + issueFound ); - // }, 10000); - - // }, 3000); } }, 3000); //false: next @@ -266,7 +281,6 @@ export async function runtimeCheckLogs(folderPath) { ); //setMaxListeners scan.setMaxListeners(0); - // } }); } } catch (error) { diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 49288fa..13276ac 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -30,7 +30,7 @@ const ShowLog = () => { getContentLog(); setTimeout(() => { scrollToElement(); - }, 1000); + }, 3000); }, []); // console.log(window.location.hash); if (status === 200) { diff --git a/start/routes.ts b/start/routes.ts index faadd55..cf0de74 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -71,7 +71,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { .sort((a, b) => a - b); const content = await axios.get( - "http://192.168.5.7:8080/" + request.params().name + 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( From 1b60d0e5720131ba5acb0f93c375c3b61a0d9487 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 08:38:59 +0700 Subject: [PATCH 053/298] update config database --- config/database.ts | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/config/database.ts b/config/database.ts index bc4f14e..395f5ae 100644 --- a/config/database.ts +++ b/config/database.ts @@ -5,8 +5,8 @@ * file. */ -import Env from '@ioc:Adonis/Core/Env' -import type { DatabaseConfig } from '@ioc:Adonis/Lucid/Database' +import Env from "@ioc:Adonis/Core/Env"; +import type { DatabaseConfig } from "@ioc:Adonis/Lucid/Database"; const databaseConfig: DatabaseConfig = { /* @@ -19,7 +19,7 @@ const databaseConfig: DatabaseConfig = { | file. | */ - connection: Env.get('DB_CONNECTION'), + connection: Env.get("DB_CONNECTION"), connections: { /* @@ -34,24 +34,32 @@ const databaseConfig: DatabaseConfig = { | */ mysql: { - client: 'mysql2', + client: "mysql2", connection: { - host: Env.get('MYSQL_HOST'), - port: Env.get('MYSQL_PORT'), - user: Env.get('MYSQL_USER'), - password: Env.get('MYSQL_PASSWORD', ''), - database: Env.get('MYSQL_DB_NAME'), + host: Env.get("MYSQL_HOST"), + port: Env.get("MYSQL_PORT"), + user: Env.get("MYSQL_USER"), + password: Env.get("MYSQL_PASSWORD", ""), + database: Env.get("MYSQL_DB_NAME"), }, - pool: {min:1, max:120}, - acquireConnectionTimeout: 60000, + pool: { + min: 1, + max: 2000, + createTimeoutMillis: 150000, + acquireTimeoutMillis: 150000, + idleTimeoutMillis: 600000, + reapIntervalMillis: 30000, + createRetryIntervalMillis: 30000, + propagateCreateError: false, + }, + migrations: { naturalSort: true, }, healthCheck: false, debug: false, }, + }, +}; - } -} - -export default databaseConfig +export default databaseConfig; From eb8a859ff619b5c3d223379cb908a667b4ac0aeb Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:07:32 +0700 Subject: [PATCH 054/298] test --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index c4e0246..7679496 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -92,7 +92,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 300000 }, + { interval: 5000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; From a366ec4182630b7349d1a4adb732dc2279cc7a88 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:09:45 +0700 Subject: [PATCH 055/298] update config database --- config/database.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/database.ts b/config/database.ts index 395f5ae..0c20747 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,11 +44,11 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 2000, - createTimeoutMillis: 150000, - acquireTimeoutMillis: 150000, - idleTimeoutMillis: 600000, - reapIntervalMillis: 30000, + max: 200, + createTimeoutMillis: 60000, + acquireTimeoutMillis: 60000, + idleTimeoutMillis: 60000, + reapIntervalMillis: 60000, createRetryIntervalMillis: 30000, propagateCreateError: false, }, From 38a85fb8969404973b625b198ab779b7537b15ef Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:15:21 +0700 Subject: [PATCH 056/298] update config database --- config/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/database.ts b/config/database.ts index 0c20747..81e64dc 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,12 +44,12 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 200, + max: 500, createTimeoutMillis: 60000, acquireTimeoutMillis: 60000, idleTimeoutMillis: 60000, reapIntervalMillis: 60000, - createRetryIntervalMillis: 30000, + createRetryIntervalMillis: 60000, propagateCreateError: false, }, From a12be2fd5e23fb16909c5c3c4d726002c77fb1b8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:34:27 +0700 Subject: [PATCH 057/298] update config database --- config/database.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/config/database.ts b/config/database.ts index 81e64dc..83700ec 100644 --- a/config/database.ts +++ b/config/database.ts @@ -45,12 +45,6 @@ const databaseConfig: DatabaseConfig = { pool: { min: 1, max: 500, - createTimeoutMillis: 60000, - acquireTimeoutMillis: 60000, - idleTimeoutMillis: 60000, - reapIntervalMillis: 60000, - createRetryIntervalMillis: 60000, - propagateCreateError: false, }, migrations: { From e28299c5c588afff68fddda995c4ecaf94486db7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:36:04 +0700 Subject: [PATCH 058/298] update config database --- config/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index 83700ec..7462939 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 500, + max: 10000, }, migrations: { From e246e6169c5030336092ca3e4bd9c018ab5bae35 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:40:40 +0700 Subject: [PATCH 059/298] update config database --- config/database.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index 7462939..dab2f5a 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,8 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 10000, + max: 300, + acquireTimeoutMillis: 60 * 1000, }, migrations: { From bac085e9ced8f828ee14a18b8830813708e98289 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:46:41 +0700 Subject: [PATCH 060/298] update config database --- app/utils/runtimeCheckLogs.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7679496..a167fa5 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -10,6 +10,7 @@ import { getListLineByItem } from "./getListLineByItem"; export async function runtimeCheckLogs(folderPath) { try { + const { connection } = Database.manager.get('mysql') let fileList = Array(); let fileList_old = Array(); // Function to update the list of files @@ -275,10 +276,12 @@ export async function runtimeCheckLogs(folderPath) { issueFound ); } + await connection.disconnect() }, 3000); //false: next } ); + //setMaxListeners scan.setMaxListeners(0); }); From eba9d8d4f9f0a8380f7c3742371df8f4a8585c55 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:47:54 +0700 Subject: [PATCH 061/298] update config database --- config/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index dab2f5a..e2b3978 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 300, + max: 500, acquireTimeoutMillis: 60 * 1000, }, From fa4d620db6b989d28326276c446ee004ae51d8d6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 10:48:46 +0700 Subject: [PATCH 062/298] update config database --- config/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index e2b3978..3625db1 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 500, + max: 1000, acquireTimeoutMillis: 60 * 1000, }, From aa7f1c2cd81bf41ca27ec01dae755556c3e25cbf Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 11:01:00 +0700 Subject: [PATCH 063/298] update config database --- app/utils/runtimeCheckLogs.ts | 318 +++++++++++++++++----------------- 1 file changed, 159 insertions(+), 159 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index a167fa5..0c2251f 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -10,7 +10,7 @@ import { getListLineByItem } from "./getListLineByItem"; export async function runtimeCheckLogs(folderPath) { try { - const { connection } = Database.manager.get('mysql') + const connection = Database.connection('mysql'); let fileList = Array(); let fileList_old = Array(); // Function to update the list of files @@ -99,185 +99,184 @@ export async function runtimeCheckLogs(folderPath) { let lines = []; //get information file - let fileDetect = await LogDetectFile.findBy( - "file_name", - fileName - ); + // let fileDetect = await LogDetectFile.findBy( + // "file_name", + // fileName + // ); - //get all log of file - let logsDetect = await Database.rawQuery( - "select * from log_reports where id_file = " + - fileDetect?.id_ldf - ); + // //get all log of file + // let logsDetect = await Database.rawQuery( + // "select * from log_reports where id_file = " + + // fileDetect?.id_ldf + // ); - //get the last line detected - let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); + // //get the last line detected + // let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); - //get content file in local - let contentFile = await fs - .readFileSync(filePath) - .toString() - ?.split("\n"); + // //get content file in local + // let contentFile = await fs + // .readFileSync(filePath) + // .toString() + // ?.split("\n"); - //get all values to check - let allValue = await KeyValue.all(); + // //get all values to check + // let allValue = await KeyValue.all(); - //get list item to check - let listKeyValues = allValue.filter( - (i) => - i.$original.key === "MODEL_SPECIAL" || - i.$original.key === "CATCH_FAULTY" - ); + // //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 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); + // //get list item special + // let listExtraItem = allValue + // .filter((i) => i.$original.key === "MODEL_SPECIAL") + // .map((obj) => obj.$original.value); - //Process file content - contentFile.map((line, index) => { + // //Process file content + // contentFile.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - listExcludeErr.filter((err) => line.includes(err)) - .length === 0 - ) { - const log = await LogDetectFile.findBy( - "file_name", - fileName - ); - //check report of line not exist - let checkLog = await Database.rawQuery( - "select * from log_reports where id_file = " + - log?.id_ldf + - " and line = " + - (index + 1) + - " and detected_content='" + - value + - "'" - ); + // //check line the line with errors and exclude errors + // listKeyValues + // .map((obj) => obj.$original.value) + // .map(async (value) => { + // if ( + // line.search(value) !== -1 && + // listExcludeErr.filter((err) => line.includes(err)) + // .length === 0 + // ) { + // const log = await LogDetectFile.findBy( + // "file_name", + // fileName + // ); + // //check report of line not exist + // 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); - } - } + // if (checkLog[0].length === 0) { + // await LogReport.create({ + // detected_content: value, + // line: index + 1, + // id_file: log?.id_ldf, + // }); + // lines.push(index + 1); + // } + // } - // if(checkSpecialVersion()) - }); - }); + // // if(checkSpecialVersion()) + // }); + // }); //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}` - ); + // 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 fileDetect = await LogDetectFile.findBy( + // "file_name", + // fileName + // ); - let logsDetect = await Database.rawQuery( - "select * from log_reports where id_file = " + - fileDetect?.id_ldf - ); + // let logsDetect = await Database.rawQuery( + // "select * from log_reports where id_file = " + + // fileDetect?.id_ldf + // ); - //Get all report newest - let listReport = await getListLineByItem( - logsDetect[0].filter((l) => l.line > lastLine) - ); + // //Get all report newest + // let listReport = await getListLineByItem( + // logsDetect[0].filter((l) => l.line > lastLine) + // ); - let content = - "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - let spoiler = ""; - let issueFound = ""; + // let content = + // "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + // let spoiler = ""; + // let issueFound = ""; - listReport.map((log, index) => { - let item = listExtraItem.includes(log.detected_content) - ? ":medal: **" + log.detected_content + "**" - : ":small_orange_diamond: " + log.detected_content; + // 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(log.created_at).format("HH:mm - DD/MM") + - "**|" + - item + - "|" + - log.line + - "|[View](https://logs.danielvu.com/logs/" + - fileName + - "#" + - log.line + - ")\n"; - }); + // 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(log.created_at).format("HH:mm - DD/MM") + + // "**|" + + // item + + // "|" + + // log.line + + // "|[View](https://logs.danielvu.com/logs/" + + // fileName + + // "#" + + // log.line + + // ")\n"; + // }); - sendMessToZulip( - "stream", - "Result test - auto.nswteam.net", - "Log Alert", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); + // sendMessToZulip( + // "stream", + // "Result test - auto.nswteam.net", + // "Log Alert", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n*Issue found:*\n" + - issueFound - ); - } - await connection.disconnect() - }, 3000); + // sendMessToZulip( + // "stream", + // "AUS_VN_Test", + // "Test Log Alerts", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n*Issue found:*\n" + + // issueFound + // ); + // } + // }, 3000); //false: next } ); @@ -286,6 +285,7 @@ export async function runtimeCheckLogs(folderPath) { scan.setMaxListeners(0); }); } + } catch (error) { console.log(error); } From 01f4b733de02265f777d216fa6295455ab1b2e2e Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 11:21:18 +0700 Subject: [PATCH 064/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 333 ++++++++++++++++++---------------- 1 file changed, 174 insertions(+), 159 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0c2251f..131f1f7 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -10,7 +10,7 @@ import { getListLineByItem } from "./getListLineByItem"; export async function runtimeCheckLogs(folderPath) { try { - const connection = Database.connection('mysql'); + const connection = Database.connection("mysql"); let fileList = Array(); let fileList_old = Array(); // Function to update the list of files @@ -42,14 +42,14 @@ export async function runtimeCheckLogs(folderPath) { if (match) { const desiredSubstring = match[0]; const match2 = desiredSubstring.match(regex1); - return match2[0] + return match2[0]; } else { - return "" + return ""; } } catch (error) { - console.log(error) + console.log(error); } - } + }; // Watch the folder for new files const folderWatcher = chokidar.watch(folderPath); @@ -97,195 +97,210 @@ export async function runtimeCheckLogs(folderPath) { async (eventType) => { //check special item, extra RAM, error in log let lines = []; - + let allFile = await LogDetectFile.all(); + let allReport = await LogReport.all(); + let allValue = await KeyValue.all(); //get information file - // let fileDetect = await LogDetectFile.findBy( + let fileDetect = allFile?.filter( + (i) => i.$original.file_name === fileName + )[0]; + + // await LogDetectFile.findBy( // "file_name", // fileName // ); - // //get all log of file + //get all log of file // let logsDetect = await Database.rawQuery( // "select * from log_reports where id_file = " + // fileDetect?.id_ldf // ); + 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 the last line detected - // let lastLine = Math.max(...logsDetect[0].map((obj) => obj.line)); + //get content file in local + let contentFile = await fs + .readFileSync(filePath) + .toString() + ?.split("\n"); - // //get content file in local - // let contentFile = await fs - // .readFileSync(filePath) - // .toString() - // ?.split("\n"); + //get all values to check + - // //get all values to check - // let allValue = await KeyValue.all(); + //get list item to check + let listKeyValues = allValue.filter( + (i) => + i.$original.key === "MODEL_SPECIAL" || + i.$original.key === "CATCH_FAULTY" + ); - // //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 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); - // //get list item special - // let listExtraItem = allValue - // .filter((i) => i.$original.key === "MODEL_SPECIAL") - // .map((obj) => obj.$original.value); + //Process file content + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + listExcludeErr.filter((err) => line.includes(err)) + .length === 0 + ) { + let log = allFile?.filter( + (i) => i.$original.file_name === fileName + )[0]; - // //Process file content - // contentFile.map((line, index) => { + // const log = await LogDetectFile.findBy( + // "file_name", + // fileName + // ); + //check report of line not exist + let checkLog = allReport?.filter((report)=>report.id_file === log?.id_ldf && report.line === (index + 1) && report.detected_content === value) + + // await Database.rawQuery( + // "select * from log_reports where id_file = " + + // log?.id_ldf + + // " and line = " + + // (index + 1) + + // " and detected_content='" + + // value + + // "'" + // ); - // //check line the line with errors and exclude errors - // listKeyValues - // .map((obj) => obj.$original.value) - // .map(async (value) => { - // if ( - // line.search(value) !== -1 && - // listExcludeErr.filter((err) => line.includes(err)) - // .length === 0 - // ) { - // const log = await LogDetectFile.findBy( - // "file_name", - // fileName - // ); - // //check report of line not exist - // 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); + } + } - // if (checkLog[0].length === 0) { - // await LogReport.create({ - // detected_content: value, - // line: index + 1, - // id_file: log?.id_ldf, - // }); - // lines.push(index + 1); - // } - // } - - // // if(checkSpecialVersion()) - // }); - // }); + // if(checkSpecialVersion()) + }); + }); //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}` - // ); + 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 fileDetect = allFile?.filter( + (i) => i.$original.file_name === fileName + )[0]; - // let logsDetect = await Database.rawQuery( - // "select * from log_reports where id_file = " + - // fileDetect?.id_ldf - // ); + let logsDetect = allReport?.filter( + (i) => i.$original.id_file === fileDetect?.id_ldf + ); + + // await Database.rawQuery( + // "select * from log_reports where id_file = " + + // fileDetect?.id_ldf + // ); - // //Get all report newest - // let listReport = await getListLineByItem( - // logsDetect[0].filter((l) => l.line > lastLine) - // ); + //Get all report newest + let listReport = await getListLineByItem( + logsDetect[0].filter((l) => l.line > lastLine) + ); - // let content = - // "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - // let spoiler = ""; - // let issueFound = ""; + let content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + let issueFound = ""; - // listReport.map((log, index) => { - // let item = listExtraItem.includes(log.detected_content) - // ? ":medal: **" + log.detected_content + "**" - // : ":small_orange_diamond: " + log.detected_content; + 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(log.created_at).format("HH:mm - DD/MM") + - // "**|" + - // item + - // "|" + - // log.line + - // "|[View](https://logs.danielvu.com/logs/" + - // fileName + - // "#" + - // log.line + - // ")\n"; - // }); + 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(log.created_at).format("HH:mm - DD/MM") + + "**|" + + item + + "|" + + log.line + + "|[View](https://logs.danielvu.com/logs/" + + fileName + + "#" + + log.line + + ")\n"; + }); - // sendMessToZulip( - // "stream", - // "Result test - auto.nswteam.net", - // "Log Alert", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); + sendMessToZulip( + "stream", + "Result test - auto.nswteam.net", + "Log Alert", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n***Issue found:***\n" + + issueFound + ); - // sendMessToZulip( - // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n*Issue found:*\n" + - // issueFound - // ); - // } - // }, 3000); + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + + issueFound + ); + } + }, 3000); //false: next } ); - + //setMaxListeners scan.setMaxListeners(0); }); } - } catch (error) { console.log(error); } From 50863bc7128e4e50a05e5828f5d1faa43e186b2a Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 11:21:39 +0700 Subject: [PATCH 065/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 131f1f7..8c3ccdb 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -278,19 +278,19 @@ export async function runtimeCheckLogs(folderPath) { issueFound ); - sendMessToZulip( - "stream", - "AUS_VN_Test", - "Test Log Alerts", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n*Issue found:*\n" + - issueFound - ); + // sendMessToZulip( + // "stream", + // "AUS_VN_Test", + // "Test Log Alerts", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n*Issue found:*\n" + + // issueFound + // ); } }, 3000); //false: next From 3669242ae384313fa66f4046f0dfcd30e12e8ae3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 11:26:52 +0700 Subject: [PATCH 066/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 8c3ccdb..e5196d3 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -167,7 +167,7 @@ export async function runtimeCheckLogs(folderPath) { // fileName // ); //check report of line not exist - let checkLog = allReport?.filter((report)=>report.id_file === log?.id_ldf && report.line === (index + 1) && report.detected_content === value) + let checkLog = allReport?.filter((report)=>report.$original.id_file === log?.id_ldf && report.$original.line === (index + 1) && report.$original.detected_content === value) // await Database.rawQuery( // "select * from log_reports where id_file = " + @@ -179,7 +179,7 @@ export async function runtimeCheckLogs(folderPath) { // "'" // ); - if (checkLog[0].length === 0) { + if (checkLog[0]?.length === 0) { await LogReport.create({ detected_content: value, line: index + 1, From 567fa61759ca06205b9d9590c54bbb3aec887346 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 12:10:21 +0700 Subject: [PATCH 067/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e5196d3..632dfc8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -179,7 +179,7 @@ export async function runtimeCheckLogs(folderPath) { // "'" // ); - if (checkLog[0]?.length === 0) { + if (checkLog?.length === 0) { await LogReport.create({ detected_content: value, line: index + 1, From fb3d1aa74d705c740808561757fcf4b6b4731148 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 12:15:34 +0700 Subject: [PATCH 068/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 632dfc8..4a697b8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -217,7 +217,7 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect[0].filter((l) => l.line > lastLine) + logsDetect.filter((l) => l.line > lastLine) ); let content = From 2a8a3524deddc5585370f0d806023fb998f67045 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 12:27:36 +0700 Subject: [PATCH 069/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 4a697b8..e1f1876 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -217,7 +217,7 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect.filter((l) => l.line > lastLine) + logsDetect.filter((l) => l.$original.line > lastLine) ); let content = From 4aa41c7b0d5b8a6262648ea11b3ebaed5d358991 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 12:29:39 +0700 Subject: [PATCH 070/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e1f1876..a69fbe8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -209,7 +209,7 @@ export async function runtimeCheckLogs(folderPath) { let logsDetect = allReport?.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 @@ -219,7 +219,7 @@ export async function runtimeCheckLogs(folderPath) { let listReport = await getListLineByItem( logsDetect.filter((l) => l.$original.line > lastLine) ); - + console.log(listReport) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; From e7013d73582fa4ab63194fd704c5a99d037ebb11 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 12:56:49 +0700 Subject: [PATCH 071/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index a69fbe8..580748f 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -209,7 +209,7 @@ export async function runtimeCheckLogs(folderPath) { let logsDetect = allReport?.filter( (i) => i.$original.id_file === fileDetect?.id_ldf ); - console.log(logsDetect) + // console.log(logsDetect) // await Database.rawQuery( // "select * from log_reports where id_file = " + // fileDetect?.id_ldf @@ -217,7 +217,7 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect.filter((l) => l.$original.line > lastLine) + logsDetect[0].filter((l) => l.$original.line > lastLine) ); console.log(listReport) let content = From a70c1f24ef36dc6feffb6002c8b586e08a8d2c80 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:04:00 +0700 Subject: [PATCH 072/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 580748f..be10890 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -217,7 +217,7 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect[0].filter((l) => l.$original.line > lastLine) + logsDetect.filter((l) => l.$original.line > lastLine) ); console.log(listReport) let content = From 401f31399a5f7ddbbb83e62a588416d42e17c344 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:08:06 +0700 Subject: [PATCH 073/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index be10890..26d0f07 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -217,9 +217,9 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect.filter((l) => l.$original.line > lastLine) + logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original) ); - console.log(listReport) + console.log(logsDetect) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; From 5f5a72da0c58665ac8398e6ff0461dcdeabbc5d8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:09:51 +0700 Subject: [PATCH 074/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 26d0f07..2f50028 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -219,7 +219,8 @@ export async function runtimeCheckLogs(folderPath) { let listReport = await getListLineByItem( logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original) ); - console.log(logsDetect) + console.log(logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original)) + console.log(listReport) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; From 0e1f1e9ad19e934579ed58b58209d9099dbe020f Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:11:11 +0700 Subject: [PATCH 075/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 2f50028..2b64670 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -219,7 +219,7 @@ export async function runtimeCheckLogs(folderPath) { let listReport = await getListLineByItem( logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original) ); - console.log(logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original)) + console.log(logsDetect.filter((l) => l.$original.line > lastLine)) console.log(listReport) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; From d04d9383c28ac96e0f649be4df3085b9e3fe5738 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:13:56 +0700 Subject: [PATCH 076/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 2b64670..50bb2d3 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -219,8 +219,10 @@ export async function runtimeCheckLogs(folderPath) { let listReport = await getListLineByItem( logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original) ); - console.log(logsDetect.filter((l) => l.$original.line > lastLine)) - console.log(listReport) + console.log("last line: ", lastLine) + console.log("1",logsDetect.map((obj) => obj.$original)) + console.log("2",logsDetect.filter((l) => l.$original.line > lastLine)) + console.log("3",listReport) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; From 63ee8deb39ac736236d8d9234900899607e0ba71 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:15:37 +0700 Subject: [PATCH 077/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 50bb2d3..07afbed 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -217,11 +217,11 @@ export async function runtimeCheckLogs(folderPath) { //Get all report newest let listReport = await getListLineByItem( - logsDetect.filter((l) => l.$original.line > lastLine).map((obj) => obj.$original) + logsDetect.map((obj) => obj.$original).filter((l) => l.line > lastLine) ); console.log("last line: ", lastLine) console.log("1",logsDetect.map((obj) => obj.$original)) - console.log("2",logsDetect.filter((l) => l.$original.line > lastLine)) + console.log("2",logsDetect.map((obj) => obj.$original).filter((l) => l.line > lastLine)) console.log("3",listReport) let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; From 9f266a2e8349192ac580a84312b26e3fbfc01299 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:19:30 +0700 Subject: [PATCH 078/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 07afbed..33f9170 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -201,12 +201,12 @@ export async function runtimeCheckLogs(folderPath) { console.log( `${fileName} has changed (${eventType})---SOS---${lines.length}` ); - + let allReport_new = await LogReport.all(); let fileDetect = allFile?.filter( (i) => i.$original.file_name === fileName )[0]; - let logsDetect = allReport?.filter( + let logsDetect = allReport_new?.filter( (i) => i.$original.id_file === fileDetect?.id_ldf ); // console.log(logsDetect) From c310e5713a7288a510ea939899c6e69eb2d3d9ae Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:24:33 +0700 Subject: [PATCH 079/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 33f9170..0817835 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -219,10 +219,7 @@ export async function runtimeCheckLogs(folderPath) { let listReport = await getListLineByItem( logsDetect.map((obj) => obj.$original).filter((l) => l.line > lastLine) ); - console.log("last line: ", lastLine) - console.log("1",logsDetect.map((obj) => obj.$original)) - console.log("2",logsDetect.map((obj) => obj.$original).filter((l) => l.line > lastLine)) - console.log("3",listReport) + let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; @@ -255,7 +252,7 @@ export async function runtimeCheckLogs(folderPath) { "|" + (index + 1) + "|**" + - moment(log.created_at).format("HH:mm - DD/MM") + + moment(Date.now()).format("HH:mm - DD/MM") + "**|" + item + "|" + @@ -281,19 +278,19 @@ export async function runtimeCheckLogs(folderPath) { issueFound ); - // sendMessToZulip( - // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n*Issue found:*\n" + - // issueFound - // ); + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + + issueFound + ); } }, 3000); //false: next From fb9288f33ad385931ed602e76af8da8b1fe710ed Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 13:26:06 +0700 Subject: [PATCH 080/298] update runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0817835..b2709ca 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -93,7 +93,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 5000 }, + { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; From 3098d054c5ec6b583231fb1bc139f4d1b2acc721 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 15:16:53 +0700 Subject: [PATCH 081/298] add API monitor --- start/routes.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index cf0de74..af2e12b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -209,10 +209,11 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { Route.get('/api/images/:filename', "ImagesController.getImage"); -Route.get('/api/test', async ({ request, response }) => { - await screenShot("20230915-HELEN1-Session.US2-11-3-127.0.0.1.log") - const test = await uploadFileToZulip(); - // setTimeout(() => { - console.log(test) - // }, 10000); +Route.get('/api/monitor', async ({ request, response }) => { + try { + await Database.raw("SELECT 1") + response.status(200).send("I'm fine!") + } catch (error) { + response.status(203).send("Can't connect to database!") + } }); \ No newline at end of file From 9e030e764c76cfb4908747d0721f82255f164670 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 15:34:44 +0700 Subject: [PATCH 082/298] add API monitor --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index af2e12b..3b368b7 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -211,7 +211,7 @@ Route.get('/api/images/:filename', "ImagesController.getImage"); Route.get('/api/monitor', async ({ request, response }) => { try { - await Database.raw("SELECT 1") + console.log(await Database.raw("SELECT 1")) response.status(200).send("I'm fine!") } catch (error) { response.status(203).send("Can't connect to database!") From fb441069265769de3864ddf3c9ff6c1d407afa5a Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 16:16:38 +0700 Subject: [PATCH 083/298] test monitor --- app/Services/Ws.ts | 21 +++ package-lock.json | 362 +++++++++++++++++++++++++++++++++++++++ package.json | 2 + providers/AppProvider.ts | 24 +-- start/routes.ts | 16 +- start/socket.ts | 13 ++ 6 files changed, 420 insertions(+), 18 deletions(-) create mode 100644 app/Services/Ws.ts create mode 100644 start/socket.ts diff --git a/app/Services/Ws.ts b/app/Services/Ws.ts new file mode 100644 index 0000000..339eda5 --- /dev/null +++ b/app/Services/Ws.ts @@ -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() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 95965d8..5f5b313 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,8 @@ "proxy-addr": "^2.0.7", "puppeteer": "^21.2.1", "reflect-metadata": "^0.1.13", + "socket.io": "^4.7.2", + "socket.io-client": "^4.7.2", "source-map-support": "^0.5.21", "zulip-js": "^2.0.9" }, @@ -1333,6 +1335,11 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -1354,12 +1361,25 @@ "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "node_modules/@types/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "node_modules/@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", @@ -2146,6 +2166,14 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-ftp": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", @@ -2831,6 +2859,18 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cp-file": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", @@ -3313,6 +3353,94 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -6112,6 +6240,14 @@ "node": ">=8" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -7873,6 +8009,77 @@ "node": ">=0.10.0" } }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -8883,6 +9090,14 @@ } } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10106,6 +10321,11 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -10127,12 +10347,25 @@ "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "@types/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "requires": { + "@types/node": "*" + } + }, "@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", @@ -10750,6 +10983,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "basic-ftp": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", @@ -11280,6 +11518,15 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cp-file": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", @@ -11678,6 +11925,61 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==" + }, "enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -13807,6 +14109,11 @@ "path-key": "^3.0.0" } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -15159,6 +15466,56 @@ } } }, + "socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, "socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -15939,6 +16296,11 @@ "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "requires": {} }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 34f6e18..32c734b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "proxy-addr": "^2.0.7", "puppeteer": "^21.2.1", "reflect-metadata": "^0.1.13", + "socket.io": "^4.7.2", + "socket.io-client": "^4.7.2", "source-map-support": "^0.5.21", "zulip-js": "^2.0.9" } diff --git a/providers/AppProvider.ts b/providers/AppProvider.ts index b4aa103..ce8abad 100644 --- a/providers/AppProvider.ts +++ b/providers/AppProvider.ts @@ -1,24 +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 { - constructor (protected app: ApplicationContract) { - } + constructor(protected app: ApplicationContract) {} - public register () { + public register() { // Register your own bindings } - public async boot () { + public async boot() { // IoC container is ready - } - public async ready () { - + public async ready() { + setTimeout(() => { + 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 } - public async shutdown () { + public async shutdown() { // Cleanup, since app is going down } } diff --git a/start/routes.ts b/start/routes.ts index 3b368b7..ce92907 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -209,11 +209,11 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { Route.get('/api/images/:filename', "ImagesController.getImage"); -Route.get('/api/monitor', async ({ request, response }) => { - try { - console.log(await Database.raw("SELECT 1")) - response.status(200).send("I'm fine!") - } catch (error) { - response.status(203).send("Can't connect to database!") - } -}); \ No newline at end of file +// Route.get('/api/monitor', async ({ request, response }) => { +// try { +// console.log(await Database.raw("SELECT 1")) +// response.status(200).send("I'm fine!") +// } catch (error) { +// response.status(203).send("Can't connect to database!") +// } +// }); \ No newline at end of file diff --git a/start/socket.ts b/start/socket.ts new file mode 100644 index 0000000..cdfbc5b --- /dev/null +++ b/start/socket.ts @@ -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) + }) +}) \ No newline at end of file From 956da2defb1cc841b09795a5159b91db64c67d41 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 21 Sep 2023 16:30:37 +0700 Subject: [PATCH 084/298] test monitor (end) --- providers/AppProvider.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/providers/AppProvider.ts b/providers/AppProvider.ts index ce8abad..710d64a 100644 --- a/providers/AppProvider.ts +++ b/providers/AppProvider.ts @@ -12,10 +12,10 @@ export default class AppProvider { } public async ready() { - setTimeout(() => { - let socket = io("http://118.71.46.74:7777"); - socket?.emit("monitor", { name: "logs server", status: "I'm file" }); - }, 20000); + // 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') // } From ba5f91f6bb9290264f3ee7b0b9653bd51b2f7ffc Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 09:01:29 +0700 Subject: [PATCH 085/298] update code --- app/utils/runtimeCheckLogs.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index b2709ca..e7c775c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -264,19 +264,19 @@ export async function runtimeCheckLogs(folderPath) { ")\n"; }); - sendMessToZulip( - "stream", - "Result test - auto.nswteam.net", - "Log Alert", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); + // sendMessToZulip( + // "stream", + // "Result test - auto.nswteam.net", + // "Log Alert", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); sendMessToZulip( "stream", From d82c4bbc9f960fa5db1a92ed26567b1333a3fc04 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 09:02:52 +0700 Subject: [PATCH 086/298] update code to test server --- app/utils/runtimeCheckLogs.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e7c775c..0c68360 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -264,33 +264,33 @@ export async function runtimeCheckLogs(folderPath) { ")\n"; }); - // sendMessToZulip( - // "stream", - // "Result test - auto.nswteam.net", - // "Log Alert", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - sendMessToZulip( "stream", - "AUS_VN_Test", - "Test Log Alerts", + "Result test - auto.nswteam.net", + "Log Alert", "------------\n\n:warning: :warning: **" + fileName + "**\n\n" + content + "\n\n" + spoiler + - "\n\n*Issue found:*\n" + + "\n\n***Issue found:***\n" + issueFound ); + + // sendMessToZulip( + // "stream", + // "AUS_VN_Test", + // "Test Log Alerts", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n*Issue found:*\n" + + // issueFound + // ); } }, 3000); //false: next From 1e82ced924f32095d909fadc95294b470939a2c6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 10:49:21 +0700 Subject: [PATCH 087/298] add env --- manage-view/package-lock.json | 33 ++++++++++++++++++++++++++------- manage-view/package.json | 1 + 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/manage-view/package-lock.json b/manage-view/package-lock.json index 6ad2458..4b6e665 100644 --- a/manage-view/package-lock.json +++ b/manage-view/package-lock.json @@ -12,6 +12,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "axios": "^1.5.0", + "dotenv": "^16.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0", @@ -7008,11 +7009,14 @@ } }, "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { @@ -14783,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": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -22679,9 +22691,9 @@ } }, "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, "dotenv-expand": { "version": "5.1.0", @@ -28120,6 +28132,13 @@ "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", "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": { diff --git a/manage-view/package.json b/manage-view/package.json index a0ed4da..3e9021b 100644 --- a/manage-view/package.json +++ b/manage-view/package.json @@ -7,6 +7,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "axios": "^1.5.0", + "dotenv": "^16.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0", From dd8d973ab4c57e4fccd964048a0b50377186b62b Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 10:59:26 +0700 Subject: [PATCH 088/298] check webhook --- start/routes.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index ce92907..020a0bf 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -209,11 +209,3 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { Route.get('/api/images/:filename', "ImagesController.getImage"); -// Route.get('/api/monitor', async ({ request, response }) => { -// try { -// console.log(await Database.raw("SELECT 1")) -// response.status(200).send("I'm fine!") -// } catch (error) { -// response.status(203).send("Can't connect to database!") -// } -// }); \ No newline at end of file From 753f2888a7fd2767ae4e6dbf8f465ba4d9565a31 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 13:18:21 +0700 Subject: [PATCH 089/298] check auto shell --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 020a0bf..a4c3b4c 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -207,5 +207,5 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { ); }); -Route.get('/api/images/:filename', "ImagesController.getImage"); +// Route.get('/api/images/:filename', "ImagesController.getImage"); From be87baf5fa9b202b420e5e8fa9ba56b6efad5d36 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 13:29:23 +0700 Subject: [PATCH 090/298] test shell script --- manage-view/src/components/ShowLog/ShowLog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 13276ac..4c70d71 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -32,7 +32,7 @@ const ShowLog = () => { scrollToElement(); }, 3000); }, []); - // console.log(window.location.hash); + if (status === 200) { return (

From 1800c1239bb4a27b9995b4b099604585bbd4905b Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 13:38:42 +0700 Subject: [PATCH 091/298] test shell script --- manage-view/src/components/ShowLog/ShowLog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index 4c70d71..ac6d65c 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -20,7 +20,7 @@ const ShowLog = () => { const scrollToElement = () => { const hash = window.location.hash; if (hash) { - const targetElement = document.getElementById(hash.slice(1)); // Replace "3" with the desired id + const targetElement = document.getElementById(hash.slice(1)); if (targetElement) { targetElement.scrollIntoView({ behavior: "smooth" }); } From a0c6383da246e06311c299d544a5693a8c1c72cd Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 13:47:25 +0700 Subject: [PATCH 092/298] test shell script --- manage-view/src/api/apiLog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index b6c4df7..86e8497 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,4 +1,4 @@ -const API = "https://logs.danielvu.com/api"; +const API = process.env.REACT_APP_API_SERVER_ADDRESS; // const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; From 6bfe7b5983a34b18aa7396e78487b245b1c9a117 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:02:11 +0700 Subject: [PATCH 093/298] test shell script --- app/utils/runtimeCheckLogs.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0c68360..e7c775c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -264,33 +264,33 @@ export async function runtimeCheckLogs(folderPath) { ")\n"; }); - sendMessToZulip( - "stream", - "Result test - auto.nswteam.net", - "Log Alert", - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); - // sendMessToZulip( // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", + // "Result test - auto.nswteam.net", + // "Log Alert", // "------------\n\n:warning: :warning: **" + // fileName + // "**\n\n" + // content + // "\n\n" + // spoiler + - // "\n\n*Issue found:*\n" + + // "\n\n***Issue found:***\n" + // issueFound // ); + + sendMessToZulip( + "stream", + "AUS_VN_Test", + "Test Log Alerts", + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n*Issue found:*\n" + + issueFound + ); } }, 3000); //false: next From 760a17208ba30044c07f1443441935377aab57c0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:04:17 +0700 Subject: [PATCH 094/298] test shell script --- app/utils/runtimeCheckLogs.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e7c775c..0c68360 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -264,33 +264,33 @@ export async function runtimeCheckLogs(folderPath) { ")\n"; }); - // sendMessToZulip( - // "stream", - // "Result test - auto.nswteam.net", - // "Log Alert", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - sendMessToZulip( "stream", - "AUS_VN_Test", - "Test Log Alerts", + "Result test - auto.nswteam.net", + "Log Alert", "------------\n\n:warning: :warning: **" + fileName + "**\n\n" + content + "\n\n" + spoiler + - "\n\n*Issue found:*\n" + + "\n\n***Issue found:***\n" + issueFound ); + + // sendMessToZulip( + // "stream", + // "AUS_VN_Test", + // "Test Log Alerts", + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n*Issue found:*\n" + + // issueFound + // ); } }, 3000); //false: next From 5c3f80c3e2da4f2eaa77f92faad72a717bc515e3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:10:34 +0700 Subject: [PATCH 095/298] update env info message --- app/utils/runtimeCheckLogs.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0c68360..986684b 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -1,3 +1,4 @@ +import Env from '@ioc:Adonis/Core/Env'; import fs from "fs"; import chokidar from "chokidar"; import moment from "moment"; @@ -266,8 +267,8 @@ export async function runtimeCheckLogs(folderPath) { sendMessToZulip( "stream", - "Result test - auto.nswteam.net", - "Log Alert", + Env.get("ZULIP_STREAM_ALERT"), + Env.get("ZULIP_TOPIC_ALERT"), "------------\n\n:warning: :warning: **" + fileName + "**\n\n" + From 765c091ef3c1fd0a0ea99067091d4dc362ecbc2a Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:23:43 +0700 Subject: [PATCH 096/298] update message push --- app/utils/sendMessToZulip.ts | 24 +++++++++++++++++------- start/routes.ts | 2 ++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/utils/sendMessToZulip.ts b/app/utils/sendMessToZulip.ts index d1c3406..d02ba37 100644 --- a/app/utils/sendMessToZulip.ts +++ b/app/utils/sendMessToZulip.ts @@ -8,14 +8,24 @@ export const sendMessToZulip = async (type, to, topic, content) => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - let params = { - type: type, - to: to, - topic: topic, - content: content - }; + if(type === "direct"){ + let params = { + type: type, + to: to, + 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) { console.log(error); } diff --git a/start/routes.ts b/start/routes.ts index a4c3b4c..5345ad0 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -32,6 +32,7 @@ import { exec } from "child_process"; import ImagesController from 'App/Controllers/Http/ImagesController'; import { uploadFileToZulip } from 'App/utils/uploadFileZulip'; import { screenShot } from 'App/utils/screenShot'; +import { sendMessToZulip } from 'App/utils/sendMessToZulip'; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -202,6 +203,7 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { return; } + sendMessToZulip("direct", [45], "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) console.log(`Command output:\n${stdout}`); } ); From 670046e3a30fef7e4df94c64a12ba316802cfea9 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:24:27 +0700 Subject: [PATCH 097/298] test shell script --- start/routes.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 5345ad0..d4905bf 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -184,15 +184,7 @@ Route.post("/api/addValue", async ({ request, response }) => { }); 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("New event ---> ", request.header("x-gitea-event")); exec( From 26fb0240ca12d566a9ac3c1f4c1040cb8c47f446 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:26:21 +0700 Subject: [PATCH 098/298] test shell script --- start/routes.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index d4905bf..e7661f7 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -189,13 +189,14 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { exec( Env.get("URL_FILE_SHELL"), - (error, stdout, stderr) => { + async(error, stdout, stderr) => { if (error) { console.error(`Error executing command: ${error}`); return; } - sendMessToZulip("direct", [45], "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) + const res = await sendMessToZulip("direct", [45], "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) + console.log(res) console.log(`Command output:\n${stdout}`); } ); From 4c6f63364ebfb1eabd9ba332cc70d409016a3048 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:36:17 +0700 Subject: [PATCH 099/298] test shell script --- app/utils/sendMessToZulip.ts | 2 +- screenshot.js | 18 ++++++++++++++++++ start/routes.ts | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/utils/sendMessToZulip.ts b/app/utils/sendMessToZulip.ts index d02ba37..656f6ae 100644 --- a/app/utils/sendMessToZulip.ts +++ b/app/utils/sendMessToZulip.ts @@ -8,7 +8,7 @@ export const sendMessToZulip = async (type, to, topic, content) => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - if(type === "direct"){ + if(type === "private"){ let params = { type: type, to: to, diff --git a/screenshot.js b/screenshot.js index 6397d4b..99c0cb1 100644 --- a/screenshot.js +++ b/screenshot.js @@ -176,4 +176,22 @@ // // 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)) +})() \ No newline at end of file diff --git a/start/routes.ts b/start/routes.ts index e7661f7..6698d23 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -195,7 +195,7 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { return; } - const res = await sendMessToZulip("direct", [45], "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) + const res = await sendMessToZulip("private", "joseph.le@apactech.io", "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) console.log(res) console.log(`Command output:\n${stdout}`); } From 76394629e1fac06a9277aecaa2fa9b52b9a6fe5b Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:37:50 +0700 Subject: [PATCH 100/298] test shell script --- start/routes.ts | 78 ++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 6698d23..cd1dd24 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -1,4 +1,4 @@ -import fs from 'fs'; +import fs from "fs"; import axios from "axios"; /* |-------------------------------------------------------------------------- @@ -29,10 +29,10 @@ 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"; -import ImagesController from 'App/Controllers/Http/ImagesController'; -import { uploadFileToZulip } from 'App/utils/uploadFileZulip'; -import { screenShot } from 'App/utils/screenShot'; -import { sendMessToZulip } from 'App/utils/sendMessToZulip'; +import ImagesController from "App/Controllers/Http/ImagesController"; +import { uploadFileToZulip } from "App/utils/uploadFileZulip"; +import { screenShot } from "App/utils/screenShot"; +import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -72,8 +72,9 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { .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 + 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( @@ -101,7 +102,8 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { listExcludeErr.filter((err) => line.includes(err)).length === 0 ) { data[index] = - data[index].slice(0, data[index].search(value)) +"|-|" + + data[index].slice(0, data[index].search(value)) + + "|-|" + value + "|-|" + data[index].slice(data[index].search(value) + value.length); @@ -125,32 +127,24 @@ Route.get("/api/log/showLog/:name?", async ({ request, response }) => { 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"), - }); + response.status(200).send({ + modelSpecial: modelSpecial, + issueItem: issueItem, + contentFile: data.join("\n"), + }); } catch (error) { // console.error(error); - response - .status(203) - .send("FILE NOT FOUND"); + response.status(203).send("FILE NOT FOUND"); } }); Route.get("/api/getAllLogDetect", async ({ request, response }) => { try { - let fileDetect = await LogDetectFile.all() - let listFiles = fileDetect.map(obj=>obj.file_name) - response - .status(200) - .send(listFiles); + 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"); + response.status(203).send("NO FILE"); } }); //Key-Value @@ -184,23 +178,27 @@ Route.post("/api/addValue", async ({ request, response }) => { }); Route.post("/api/gitea-webhook", ({ request, response }) => { - console.log("New event ---> ", request.header("x-gitea-event")); - exec( - Env.get("URL_FILE_SHELL"), - async(error, stdout, stderr) => { - if (error) { - console.error(`Error executing command: ${error}`); - return; - } - - const res = await sendMessToZulip("private", "joseph.le@apactech.io", "none", "** NEW EVENT -> "+request.header("x-gitea-event")+" **"+stdout ) - console.log(res) - console.log(`Command output:\n${stdout}`); + exec(Env.get("URL_FILE_SHELL"), async (error, stdout, stderr) => { + if (error) { + console.error(`Error executing command: ${error}`); + return; } - ); + + const res = await sendMessToZulip( + "private", + "joseph.le@apactech.io", + "none", + "** NEW EVENT -> " + + request.header("x-gitea-event") + + " **\n```" + + stdout + + "```" + ); + console.log(res); + console.log(`Command output:\n${stdout}`); + }); }); // Route.get('/api/images/:filename', "ImagesController.getImage"); - From dffc47d6ce2b45c7e648d7bca5597747503f465a Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:39:00 +0700 Subject: [PATCH 101/298] test shell script --- manage-view/src/components/ShowLog/ShowLog.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/manage-view/src/components/ShowLog/ShowLog.jsx b/manage-view/src/components/ShowLog/ShowLog.jsx index ac6d65c..3646c02 100644 --- a/manage-view/src/components/ShowLog/ShowLog.jsx +++ b/manage-view/src/components/ShowLog/ShowLog.jsx @@ -26,6 +26,7 @@ const ShowLog = () => { } } }; + useEffect(() => { getContentLog(); setTimeout(() => { From 1c5633ce7c705ae5a0218d4c62f71da1769d02fd Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 14:42:36 +0700 Subject: [PATCH 102/298] test shell script --- start/routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index cd1dd24..c62045b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -192,9 +192,9 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { "none", "** NEW EVENT -> " + request.header("x-gitea-event") + - " **\n```" + + " **\n```\n" + stdout + - "```" + "\n```" ); console.log(res); console.log(`Command output:\n${stdout}`); From a579f60e3e818f4a9f16c1a52f46d0b15ca5f449 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 16:14:29 +0700 Subject: [PATCH 103/298] test shell script --- manage-view/src/pages/ManageValues.jsx | 2 ++ start/routes.ts | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index e3d18cb..4953504 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -3,9 +3,11 @@ import React, { useEffect, useState } from "react"; import { addKeyValue, deleteValue, getKeyValues } from "../api/apiLog"; import { Link } from "react-router-dom"; const ManageValues = () => { + const [keyValue, setKeyValue] = useState([]); const [key, setKey] = useState([]); const [addValue, setAddValue] = useState({key: "CATCH_FAULTY", value:""}); + const getValues = async () => { try { const res = await axios.post(getKeyValues); diff --git a/start/routes.ts b/start/routes.ts index c62045b..1cc37d5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -201,4 +201,3 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); }); -// Route.get('/api/images/:filename', "ImagesController.getImage"); From 09874993882a7fbcacde03d52e5c07bed3f66983 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 16:15:43 +0700 Subject: [PATCH 104/298] test shell script --- app/utils/runtimeCheckLogs.ts | 14 -------------- manage-view/src/pages/ManageValues.jsx | 3 +-- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 986684b..94b9d1e 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -278,20 +278,6 @@ export async function runtimeCheckLogs(folderPath) { "\n\n***Issue found:***\n" + issueFound ); - - // sendMessToZulip( - // "stream", - // "AUS_VN_Test", - // "Test Log Alerts", - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n*Issue found:*\n" + - // issueFound - // ); } }, 3000); //false: next diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 4953504..c6ff9ed 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react"; import { addKeyValue, deleteValue, getKeyValues } from "../api/apiLog"; import { Link } from "react-router-dom"; const ManageValues = () => { - + const [keyValue, setKeyValue] = useState([]); const [key, setKey] = useState([]); const [addValue, setAddValue] = useState({key: "CATCH_FAULTY", value:""}); @@ -67,7 +67,6 @@ const ManageValues = () => { getValues(); } }}>Delete - {/* */} ))} From 168e2bd4e09d7c428009f0aa4301b0c172d0eb8a Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 16:16:50 +0700 Subject: [PATCH 105/298] test shell script --- app/utils/runtimeCheckLogs.ts | 1 - manage-view/src/pages/ManageValues.jsx | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 94b9d1e..846cb6c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -284,7 +284,6 @@ export async function runtimeCheckLogs(folderPath) { } ); - //setMaxListeners scan.setMaxListeners(0); }); } diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index c6ff9ed..145895e 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -89,6 +89,7 @@ const ManageValues = () => { { setAddValue({...addValue, value: e.target.value}) }}> + +
diff --git a/start/routes.ts b/start/routes.ts index 1cc37d5..118bc22 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -177,6 +177,7 @@ Route.post("/api/addValue", async ({ request, response }) => { } }); + Route.post("/api/gitea-webhook", ({ request, response }) => { console.log("New event ---> ", request.header("x-gitea-event")); From f6dae33028a29e5fd1827d7e052c75d54d9cada7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 16:42:21 +0700 Subject: [PATCH 107/298] test shell script --- app/utils/runtimeCheckLogs.ts | 1 - manage-view/src/pages/ManageValues.jsx | 3 +-- start/routes.ts | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 846cb6c..0a6163e 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -280,7 +280,6 @@ export async function runtimeCheckLogs(folderPath) { ); } }, 3000); - //false: next } ); diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 6c2a5c0..a71e19c 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -17,7 +17,6 @@ const ManageValues = () => { console.log(error); } }; - useEffect(() => { getValues(); }, []); @@ -102,7 +101,7 @@ const ManageValues = () => { alert("Value is empty!") } }}>Add - +
diff --git a/start/routes.ts b/start/routes.ts index 118bc22..1cc37d5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -177,7 +177,6 @@ Route.post("/api/addValue", async ({ request, response }) => { } }); - Route.post("/api/gitea-webhook", ({ request, response }) => { console.log("New event ---> ", request.header("x-gitea-event")); From be223ce3d87769a3b85d05cc3af7cb7497d1af73 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 22 Sep 2023 17:09:30 +0700 Subject: [PATCH 108/298] test shell script --- app/utils/runtimeCheckLogs.ts | 1 - manage-view/src/pages/ManageValues.jsx | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0a6163e..3d2eac1 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -215,7 +215,6 @@ export async function runtimeCheckLogs(folderPath) { // "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) diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index a71e19c..4a2467f 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -17,6 +17,7 @@ const ManageValues = () => { console.log(error); } }; + useEffect(() => { getValues(); }, []); From 764ed69bd08fb7ab4b4bad83e27120d2b84a805c Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 25 Sep 2023 13:56:27 +0700 Subject: [PATCH 109/298] update test code --- app/Controllers/Http/ErpsController.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 8a2fd06..51aded0 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -288,6 +288,8 @@ export default class ErpsController { const res = await axios.get("http://192.168.5.7:8080/" + fileName); const arrayLine = res?.data?.split("\n"); // console.log(arrayLine) + + console.log(res.data) if (range >= line) { response.status(200).json({ content: arrayLine?.slice(0, line + range)?.join("\n"), From 121ebf38c60c0f92928f997069bee264b28b731c Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 25 Sep 2023 13:59:00 +0700 Subject: [PATCH 110/298] update test code --- app/Controllers/Http/ErpsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 51aded0..5446ac2 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -289,7 +289,7 @@ export default class ErpsController { const arrayLine = res?.data?.split("\n"); // console.log(arrayLine) - console.log(res.data) + if (range >= line) { response.status(200).json({ content: arrayLine?.slice(0, line + range)?.join("\n"), From 607a90107256110898ff3a2258f4586991610ac1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 25 Sep 2023 19:47:38 +0700 Subject: [PATCH 111/298] test git service --- app/Controllers/Http/ErpsController.ts | 2 -- manage-view/src/pages/ManageValues.jsx | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 5446ac2..8a2fd06 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -288,8 +288,6 @@ export default class ErpsController { const res = await axios.get("http://192.168.5.7:8080/" + fileName); const arrayLine = res?.data?.split("\n"); // console.log(arrayLine) - - if (range >= line) { response.status(200).json({ content: arrayLine?.slice(0, line + range)?.join("\n"), diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 4a2467f..2a02907 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -107,6 +107,7 @@ const ManageValues = () => {
+
); }; From 2069222261efe19f86ceaeb47d07d4eb6cc7e5dc Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 25 Sep 2023 19:54:31 +0700 Subject: [PATCH 112/298] test git service --- app/utils/runtimeCheckLogs.ts | 1 - manage-view/src/pages/ManageValues.jsx | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 3d2eac1..7a5a9fa 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -110,7 +110,6 @@ export async function runtimeCheckLogs(folderPath) { // "file_name", // fileName // ); - //get all log of file // let logsDetect = await Database.rawQuery( // "select * from log_reports where id_file = " + diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 2a02907..514c3b1 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -85,11 +85,9 @@ const ManageValues = () => { ))} - { setAddValue({...addValue, value: e.target.value}) }}> -
- +
); }; From 7fc9ce5ae0576ed1bcafba26a06cee6665835b65 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 26 Sep 2023 10:04:47 +0700 Subject: [PATCH 113/298] create checkIndexSN auto --- app/Controllers/Http/ErpsController.ts | 53 ++++---- app/utils/checkIndexSN.ts | 168 +++++++++++++++++++++++++ app/utils/runtimeCheckLogs.ts | 6 +- app/utils/uploadFileZulip.ts | 2 +- 4 files changed, 200 insertions(+), 29 deletions(-) create mode 100644 app/utils/checkIndexSN.ts diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 8a2fd06..d05f201 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -164,7 +164,8 @@ export default class ErpsController { if (arrayLine[i].search("Serial Number") !== -1) { let PCB_SN = arrayLine[i] - ?.split("Serial Number")[1].split(":")[1] + ?.split("Serial Number")[1] + .split(":")[1] ?.replace("\r", "") .trim() .replace(/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/]/g, ""); @@ -222,25 +223,23 @@ export default class ErpsController { } }); } else { - if ( - PBID?.length >= 8 - ) { - let fName = urls[index] - ?.split("/") - [urls[index]?.split("/")?.length - 1]?.trim(); - output.push({ - PID: "", - VID: "", - SN: PBID?.search(" ") !== -1 ? PBID?.split(" ")[0] : PBID, - line: [i + 1], - fileName: fName, - warehouse: - fName.search("-US") !== -1 || - fName.search(".US") !== -1 || - fName.search("US-") !== -1 - ? "US" - : "AU", - }); + if (PBID?.length >= 8) { + let fName = urls[index] + ?.split("/") + [urls[index]?.split("/")?.length - 1]?.trim(); + output.push({ + PID: "", + VID: "", + SN: PBID?.search(" ") !== -1 ? PBID?.split(" ")[0] : PBID, + line: [i + 1], + fileName: fName, + warehouse: + fName.search("-US") !== -1 || + fName.search(".US") !== -1 || + fName.search("US-") !== -1 + ? "US" + : "AU", + }); } } } @@ -262,7 +261,9 @@ export default class ErpsController { } ); // 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 + ); // }, 15000); } catch (error) { response @@ -285,9 +286,11 @@ export default class ErpsController { const { fileName, line, range } = request.all(); 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"); - // console.log(arrayLine) + if (range >= line) { response.status(200).json({ content: arrayLine?.slice(0, line + range)?.join("\n"), @@ -305,9 +308,7 @@ export default class ErpsController { } } - public async store({request, response}: HttpContextContract) { - - } + public async store({ request, response }: HttpContextContract) {} public async show({}: HttpContextContract) {} diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts new file mode 100644 index 0000000..ff65e95 --- /dev/null +++ b/app/utils/checkIndexSN.ts @@ -0,0 +1,168 @@ +// const axios = require("axios"); +// import fs from "fs"; + +export const checkIndexSN = async (content, beginLine, nameF) => { + try { + const arrayLine = content.slice(beginLine); + + 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" + ) { + 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) { + 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) { + 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(output); + } + } catch (error) { + console.log("Can't connect to log server", error); + } +}; diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7a5a9fa..fba2ed9 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -8,6 +8,7 @@ import KeyValue from "App/Models/KeyValue"; import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; +import { checkIndexSN } from './checkIndexSN'; export async function runtimeCheckLogs(folderPath) { try { @@ -127,8 +128,9 @@ export async function runtimeCheckLogs(folderPath) { .toString() ?.split("\n"); - //get all values to check - + //get index SN and send to ERP + + checkIndexSN(contentFile, lastLine, fileName) //get list item to check let listKeyValues = allValue.filter( diff --git a/app/utils/uploadFileZulip.ts b/app/utils/uploadFileZulip.ts index 6bed904..274f804 100644 --- a/app/utils/uploadFileZulip.ts +++ b/app/utils/uploadFileZulip.ts @@ -39,6 +39,6 @@ export const uploadFileToZulip = async (filename) => { } } catch (error) { - console.error("Error uploading file:", error.message); + console.log("Error uploading file:", error.message); } }; From e0c6ad1bfc6ab954d2e60edd4f2df656d718a46a Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 26 Sep 2023 10:44:18 +0700 Subject: [PATCH 114/298] create checkIndexSN auto --- app/utils/checkIndexSN.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index ff65e95..a82ff72 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -3,7 +3,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { try { - const arrayLine = content.slice(beginLine); + const arrayLine = content let output = []; if (arrayLine !== undefined) { @@ -21,7 +21,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" + SN !== "N/A" && i >= beginLine ) { if (output.some((u) => u.SN === SN)) { output.map((u, index) => { @@ -84,7 +84,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } - if (arrayLine[i].search("Serial Number") !== -1) { + if (arrayLine[i].search("Serial Number") !== -1 && i >= beginLine) { let PCB_SN = arrayLine[i] ?.split("Serial Number")[1] .split(":")[1] @@ -125,7 +125,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } - if (arrayLine[i].search("Processor board ID") !== -1) { + if (arrayLine[i].search("Processor board ID") !== -1 && i >= beginLine) { let PBID = arrayLine[i] ?.split(" ") [arrayLine[i]?.split(" ").length - 1]?.replace("\r", "") From e88666aa98157f4d88add0f96d72bba24d838083 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 26 Sep 2023 15:56:05 +0700 Subject: [PATCH 115/298] update function sync SN to ERP --- app/utils/checkIndexSN.ts | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index a82ff72..7c6518a 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -1,9 +1,11 @@ // const axios = require("axios"); // import fs from "fs"; +import axios from "axios"; + export const checkIndexSN = async (content, beginLine, nameF) => { try { - const arrayLine = content + const arrayLine = content; let output = []; if (arrayLine !== undefined) { @@ -21,7 +23,8 @@ export const checkIndexSN = async (content, beginLine, nameF) => { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" && i >= beginLine + SN !== "N/A" && + i >= beginLine ) { if (output.some((u) => u.SN === SN)) { output.map((u, index) => { @@ -125,7 +128,10 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } - if (arrayLine[i].search("Processor board ID") !== -1 && i >= beginLine) { + if ( + arrayLine[i].search("Processor board ID") !== -1 && + i >= beginLine + ) { let PBID = arrayLine[i] ?.split(" ") [arrayLine[i]?.split(" ").length - 1]?.replace("\r", "") @@ -160,7 +166,22 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } } - console.log(output); + // console.log(nameF+" output\n", output); + if (output.length > 0) { + let token = + "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uc3d0ZWFtLm5ldC9hcGkvbG9naW4iLCJpYXQiOjE2ODkzOTEyMDMsImV4cCI6MTcyMDkyNzIwMywibmJmIjoxNjg5MzkxMjAzLCJqdGkiOiJreFA1MW9jck5rdEYzSzY3Iiwic3ViIjozNjkwLCJwcnYiOiJjOGVlMWZjODllNzc1ZWM0YzczODY2N2U1YmUxN2E1OTBiNmQ0MGZjIn0.p-aE0oWkKmdrcKWD94oSmMd_CMbY_4MoqADIwYIhIKw"; + let data = { + data: output, + urlAPI: "/api/test-log-serial-number/save-data", + }; + const response = await axios.post( + "https://api.nswteam.net/api/transferPostData", + data, + { headers: { Authorization: "Bearer " + token } } + ); + + console.log(nameF+" response\n",response.data) + } } } catch (error) { console.log("Can't connect to log server", error); From 3c51af86311e995b55edacaf5e9d6fda00dd9072 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 26 Sep 2023 16:50:19 +0700 Subject: [PATCH 116/298] update function sync SN to ERP --- app/Controllers/Http/ErpsController.ts | 21 ++++++-- screenshot.js | 71 ++++++++++++++++++++------ 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index d05f201..3b6c02e 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -18,10 +18,23 @@ export default class ErpsController { // console.log("check!") const listLog: string[] = []; const response = await axios.get("http://192.168.5.7:8080/"); - const data = response.data; - const arrayLine = data + const responseAUTO = await axios.get( + "http://192.168.5.7:8080/AUTOlog/" + ); + + let data1 = response.data .split("\n") .filter((i) => i.search(" i.search(" i.search(" { let temp = u .slice(u.search("")) @@ -32,7 +45,7 @@ export default class ErpsController { parseInt(temp?.split("-")[0]) <= to ) { listLog.push( - "http://192.168.5.7:8080/" + + (u.slice(u.search("")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") + u.slice(u.search("")).split(">")[1] + " " ); @@ -290,7 +303,7 @@ export default class ErpsController { 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"); - + if (range >= line) { response.status(200).json({ content: arrayLine?.slice(0, line + range)?.join("\n"), diff --git a/screenshot.js b/screenshot.js index 99c0cb1..37c1124 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,5 +1,7 @@ // const puppeteer = require("puppeteer"); +const axios = require("axios"); + // (async () => { // // Launch a headless browser // const browser = await puppeteer.launch({ @@ -176,22 +178,61 @@ // // Close the browser. // await browser2.close(); // })(); -const zulip = require("zulip-js"); +// 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 () => { +// 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(" i.search(" i.search(" { + let temp = u + .slice(u.search("")) + .split(">")[1]; + + if ( + parseInt(temp?.split("-")[0]) >= from && + parseInt(temp?.split("-")[0]) <= to + ) { + listLog.push( + (u.slice(u.search("")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") + + u.slice(u.search("")).split(">")[1] + + " " + ); + } +}); + console.log(listLog) })() \ No newline at end of file From e355b0ad519f19ed6da890d0688e0d47158acc63 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 26 Sep 2023 16:57:30 +0700 Subject: [PATCH 117/298] update function sync SN to ERP --- app/Controllers/Http/ErpsController.ts | 28 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 3b6c02e..0efc38c 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -45,7 +45,12 @@ export default class ErpsController { parseInt(temp?.split("-")[0]) <= to ) { listLog.push( - (u.slice(u.search("")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") + + (u + .slice(u.search("")) + .split(">")[1] + .includes("AUTO") + ? "http://192.168.5.7:8080/AUTOlog/" + : "http://192.168.5.7:8080/") + u.slice(u.search("")).split(">")[1] + " " ); @@ -166,9 +171,10 @@ export default class ErpsController { line: [i + 1], fileName: fName, 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" : "AU", }); @@ -210,9 +216,10 @@ export default class ErpsController { line: [i + 1], fileName: fName, 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" : "AU", }); @@ -247,9 +254,10 @@ export default class ErpsController { line: [i + 1], fileName: fName, 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" : "AU", }); From 980697f7ca37f54663008fc34c3a131272941447 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 06:51:41 +0700 Subject: [PATCH 118/298] update function sync SN to ERP --- app/utils/runtimeCheckLogs.ts | 2 +- config/database.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index fba2ed9..2efd10b 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -95,7 +95,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 300000 }, + { interval: 120000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; diff --git a/config/database.ts b/config/database.ts index 3625db1..5247a95 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 1000, + max: 10000, acquireTimeoutMillis: 60 * 1000, }, From 09f172d72b8dc4f6a84146f73285127a09055843 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 07:34:19 +0700 Subject: [PATCH 119/298] update function sync SN to ERP --- config/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index 5247a95..6b059e8 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 10000, + max: 50000, acquireTimeoutMillis: 60 * 1000, }, From 6dc9118f684e4961d3b86a3985b4c8ebfb8bfa0f Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 07:38:22 +0700 Subject: [PATCH 120/298] update function sync SN to ERP --- config/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/database.ts b/config/database.ts index 6b059e8..23926d1 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,8 +44,8 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 50000, - acquireTimeoutMillis: 60 * 1000, + max: 1000, + acquireTimeoutMillis: 20 * 1000, }, migrations: { From b75b484450ef141d5aa62071f832843bf38641a6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 07:50:42 +0700 Subject: [PATCH 121/298] update interval time --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 2efd10b..fba2ed9 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -95,7 +95,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 120000 }, + { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log let lines = []; From 022d613b280bcbe0853442e5ef4bb7e239518de8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 08:57:08 +0700 Subject: [PATCH 122/298] update interval time --- config/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/database.ts b/config/database.ts index 23926d1..3625db1 100644 --- a/config/database.ts +++ b/config/database.ts @@ -45,7 +45,7 @@ const databaseConfig: DatabaseConfig = { pool: { min: 1, max: 1000, - acquireTimeoutMillis: 20 * 1000, + acquireTimeoutMillis: 60 * 1000, }, migrations: { From d75f6aeba2483b770882749bb92959d6d31c74d2 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:00:55 +0700 Subject: [PATCH 123/298] test DB --- start/routes.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 1cc37d5..d5b1692 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,7 +35,11 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - +while(true) { + setTimeout(() => { + console.log("first") + }, 2000); +} //ERP get index serial number Route.post( "/api/getIndexSerialNumber", From 3712f5e716239849d729b9be5781c4d72656d229 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:02:26 +0700 Subject: [PATCH 124/298] test DB --- start/routes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index d5b1692..d1e64ff 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,11 +35,11 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); -while(true) { - setTimeout(() => { + + setInterval(() => { console.log("first") }, 2000); -} + //ERP get index serial number Route.post( "/api/getIndexSerialNumber", From 3357b6ad6b17b091b71222d1a94f3a77a886ac43 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:03:28 +0700 Subject: [PATCH 125/298] test DB --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index d1e64ff..5b9bf62 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,8 +37,9 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setInterval(() => { + LogDetectFile.all() console.log("first") - }, 2000); + }, 200); //ERP get index serial number Route.post( From 50c8ab255575acc0ee59f738ad22c74221792e34 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:05:12 +0700 Subject: [PATCH 126/298] test DB --- start/routes.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 5b9bf62..5876aa2 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,8 +36,67 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setInterval(() => { - LogDetectFile.all() + setInterval(async() => { + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() console.log("first") }, 200); From 3f37891c13cac7acfcc7ac85d3c7bf77dc2c5628 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:07:00 +0700 Subject: [PATCH 127/298] test DB --- start/routes.ts | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index 5876aa2..c1086aa 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,6 +37,66 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setInterval(async() => { + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() + await LogDetectFile.all() await LogDetectFile.all() await LogDetectFile.all() await LogDetectFile.all() From 57a806a4cf31a0c866a888af34cf793ae3433ab7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:07:55 +0700 Subject: [PATCH 128/298] test DB --- start/routes.ts | 240 ++++++++++++++++++++++++------------------------ 1 file changed, 120 insertions(+), 120 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index c1086aa..8ac0504 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,126 +37,126 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setInterval(async() => { - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() - await LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 200); From 3f1cebd4c4f9f05f78ab6f77a7acac137a1054f4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 09:59:06 +0700 Subject: [PATCH 129/298] test DB --- app/utils/runtimeCheckLogs.ts | 2 + start/routes.ts | 120 +--------------------------------- 2 files changed, 3 insertions(+), 119 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index fba2ed9..664ee39 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -98,10 +98,12 @@ export async function runtimeCheckLogs(folderPath) { { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log + let lines = []; let allFile = await LogDetectFile.all(); let allReport = await LogReport.all(); let allValue = await KeyValue.all(); + //get information file let fileDetect = allFile?.filter( (i) => i.$original.file_name === fileName diff --git a/start/routes.ts b/start/routes.ts index 8ac0504..36d1c5e 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,125 +37,7 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setInterval(async() => { - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 200); From f7b8a2f373c9a58b7e6c39d055b4f3397df2a9f3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:03:14 +0700 Subject: [PATCH 130/298] test DB --- app/Controllers/Http/ErpsController.ts | 4 +- start/routes.ts | 105 ++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 6 deletions(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 0efc38c..02c281c 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -324,8 +324,8 @@ export default class ErpsController { } catch (error) { console.log(error); response - .status(500) - .send({ mess: "GET CONTENT FILE FAIL", error: error }); + .status(202) + .send({ mess: "FILE NOT FOUND", error: error }); } } diff --git a/start/routes.ts b/start/routes.ts index 36d1c5e..03ee119 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,11 +36,108 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setInterval(async() => { - + LogDetectFile.all() - console.log("first") - }, 200); + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + //ERP get index serial number Route.post( From fb72895c8646381a2866d9f823ce5734ebeabbf4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:03:52 +0700 Subject: [PATCH 131/298] test DB --- start/routes.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 03ee119..fae3ba9 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,6 +37,8 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); + setTimeout(() => { + LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() @@ -136,7 +138,8 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() - LogDetectFile.all() + console.log("first") + }, 2000); //ERP get index serial number From 62211e39784a614cf1468b6a04821977e20ef689 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:04:18 +0700 Subject: [PATCH 132/298] test DB --- start/routes.ts | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index fae3ba9..a498080 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -138,6 +138,106 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From 2fec0998851317a9169d9ef2d3ae1e83a3672985 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:05:11 +0700 Subject: [PATCH 133/298] test DB --- start/routes.ts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index a498080..22165a6 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -218,26 +218,6 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() console.log("first") }, 2000); From 69c416a98dcdddfbaa78cd3053c09ee680f8842a Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:06:17 +0700 Subject: [PATCH 134/298] test DB --- start/routes.ts | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 22165a6..380af59 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -188,36 +188,6 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() console.log("first") }, 2000); From e3f98ef724ff53a180fae83df94a857d4d930af6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:06:39 +0700 Subject: [PATCH 135/298] test DB --- start/routes.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index 380af59..42b4bfa 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -188,6 +188,8 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From 7f17b9273807f7c42c346fa7755bf7faf93228bf Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:07:36 +0700 Subject: [PATCH 136/298] test DB --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 42b4bfa..d2c5b8a 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,7 +36,6 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setTimeout(() => { LogDetectFile.all() LogDetectFile.all() @@ -190,6 +189,8 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From 39260c716a18c15a51810d5fbe55886d17e83f1a Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:09:37 +0700 Subject: [PATCH 137/298] test DB --- start/routes.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index d2c5b8a..db00c18 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -191,6 +191,8 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From d25854f05d6fe98b83a72adc644f94d3ad84dce0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:10:06 +0700 Subject: [PATCH 138/298] test DB --- start/routes.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index db00c18..babc2ca 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -193,6 +193,14 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From 5a4c6719247480a2a45e109f1322c14f80f4677b Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:13:03 +0700 Subject: [PATCH 139/298] test DB --- start/routes.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index babc2ca..3544fb3 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,13 +37,8 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setTimeout(() => { - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() + const connection = Database.manager.get('mysql') + console.log(connection) LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() From ca1f78fc0acecd43ad80d3d84f2e5c07f7471689 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:16:04 +0700 Subject: [PATCH 140/298] test DB --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 3544fb3..c5eeddf 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,7 +36,7 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setTimeout(() => { + setTimeout(async() => { const connection = Database.manager.get('mysql') console.log(connection) LogDetectFile.all() @@ -186,6 +186,7 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + await connection.disconnect() LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() From a61b624e1bea47fb7fa735977cd77ef1e1e058f1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:16:49 +0700 Subject: [PATCH 141/298] test DB --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index c5eeddf..49f0243 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,7 +37,7 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setTimeout(async() => { - const connection = Database.manager.get('mysql') + const {connection} = Database.manager.get('mysql') console.log(connection) LogDetectFile.all() LogDetectFile.all() From 46184669acccf6766f636866a98be330a72101dd Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:18:06 +0700 Subject: [PATCH 142/298] test DB --- start/routes.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 49f0243..7db0a23 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -187,16 +187,7 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() await connection.disconnect() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() + console.log("first") }, 2000); From 092182b11aec861b00a4e52972fc95d9a38642a4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:29:37 +0700 Subject: [PATCH 143/298] test DB --- app/utils/runtimeCheckLogs.ts | 2 +- start/routes.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 664ee39..7a7c649 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -98,7 +98,7 @@ export async function runtimeCheckLogs(folderPath) { { interval: 300000 }, async (eventType) => { //check special item, extra RAM, error in log - + let lines = []; let allFile = await LogDetectFile.all(); let allReport = await LogReport.all(); diff --git a/start/routes.ts b/start/routes.ts index 7db0a23..8f48fbf 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -186,8 +186,8 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() - await connection.disconnect() - + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From c85257dd674c83f5a625ecd72551871f51da48c6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:30:14 +0700 Subject: [PATCH 144/298] test DB --- start/routes.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 8f48fbf..0f623bb 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,8 +37,12 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); setTimeout(async() => { - const {connection} = Database.manager.get('mysql') - console.log(connection) + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() From 9c7a23dce8bc31c5d87363ccec375892cc9991d8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:30:51 +0700 Subject: [PATCH 145/298] test DB --- start/routes.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index 0f623bb..7ad4089 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -192,6 +192,16 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); LogDetectFile.all() LogDetectFile.all() LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() console.log("first") }, 2000); From f79ab952d936e8fec4c55050fe93340de4bf1759 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:36:09 +0700 Subject: [PATCH 146/298] test DB --- start/routes.ts | 333 ++++++++++++++++++++++++------------------------ 1 file changed, 167 insertions(+), 166 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 7ad4089..3241ae8 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,173 +35,174 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - +const {connection} = Database.connection("mysql"); setTimeout(async() => { - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() + await connection.disconnect() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() console.log("first") }, 2000); From 00a1b4942b863e0f89d13ead28681f7f6e6e9c00 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:37:39 +0700 Subject: [PATCH 147/298] test DB --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 3241ae8..b3563f7 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,8 +35,9 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); -const {connection} = Database.connection("mysql"); +const {connection} = Database.manager.get("mysql"); setTimeout(async() => { + await connection.disconnect() // LogDetectFile.all() // LogDetectFile.all() From f881f1693ca92de4f27b1b08a5d843336b17ff6d Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:39:09 +0700 Subject: [PATCH 148/298] test DB --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index b3563f7..a6ef5ca 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,7 +37,7 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); const {connection} = Database.manager.get("mysql"); setTimeout(async() => { - + console.log(await connection.rawQuery("Select * from users;")) await connection.disconnect() // LogDetectFile.all() // LogDetectFile.all() From 9373a372b4355d11e2297c49ae8d19074882a305 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:39:54 +0700 Subject: [PATCH 149/298] test DB --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index a6ef5ca..1efa59f 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -37,7 +37,7 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); const {connection} = Database.manager.get("mysql"); setTimeout(async() => { - console.log(await connection.rawQuery("Select * from users;")) + console.log(await Database.rawQuery("SELECT * FROM users;")) await connection.disconnect() // LogDetectFile.all() // LogDetectFile.all() From b9b744e89b821fdb725020454c80e46fe8e255f9 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:40:30 +0700 Subject: [PATCH 150/298] test DB --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 1efa59f..a7c9f11 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -38,7 +38,7 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); const {connection} = Database.manager.get("mysql"); setTimeout(async() => { console.log(await Database.rawQuery("SELECT * FROM users;")) - await connection.disconnect() + console.log(await connection.disconnect()) // LogDetectFile.all() // LogDetectFile.all() // LogDetectFile.all() From 03d5899f09091af6b906159a53e100eed1f3b7c0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 10:55:56 +0700 Subject: [PATCH 151/298] test DB --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index a7c9f11..938fce1 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -38,7 +38,7 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); const {connection} = Database.manager.get("mysql"); setTimeout(async() => { console.log(await Database.rawQuery("SELECT * FROM users;")) - console.log(await connection.disconnect()) + console.log(await Database.manager.close("mysql")) // LogDetectFile.all() // LogDetectFile.all() // LogDetectFile.all() From 11ac102eeac915a14e3be908760db47bbc3568b3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 13:16:56 +0700 Subject: [PATCH 152/298] fix error too many connections --- config/database.ts | 2 +- start/routes.ts | 171 --------------------------------------------- 2 files changed, 1 insertion(+), 172 deletions(-) diff --git a/config/database.ts b/config/database.ts index 3625db1..8108419 100644 --- a/config/database.ts +++ b/config/database.ts @@ -44,7 +44,7 @@ const databaseConfig: DatabaseConfig = { }, pool: { min: 1, - max: 1000, + max: 2000, acquireTimeoutMillis: 60 * 1000, }, diff --git a/start/routes.ts b/start/routes.ts index 938fce1..e81d6f0 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,177 +35,6 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); -const {connection} = Database.manager.get("mysql"); - setTimeout(async() => { - console.log(await Database.rawQuery("SELECT * FROM users;")) - console.log(await Database.manager.close("mysql")) - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - console.log("first") - }, 2000); //ERP get index serial number From 9daea89069a3d831e7ee182e48da20432ed3cb2e Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 13:33:24 +0700 Subject: [PATCH 153/298] test DB --- start/routes.ts | 171 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/start/routes.ts b/start/routes.ts index e81d6f0..5075eb3 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,6 +35,177 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); + + setTimeout(async() => { + // let temp = await Database.rawQuery("SELECT * FROM users;") + // console.log(await Database.) + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + console.log("first") + }, 2000); //ERP get index serial number From add90e62b94991abf47f61399229e52c153bcc32 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 13:40:18 +0700 Subject: [PATCH 154/298] test DB --- start/routes.ts | 340 ++++++++++++++++++++++++------------------------ 1 file changed, 170 insertions(+), 170 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 5075eb3..fbe5895 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,176 +36,176 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setTimeout(async() => { - // let temp = await Database.rawQuery("SELECT * FROM users;") - // console.log(await Database.) - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - console.log("first") - }, 2000); + // setTimeout(async() => { + // // let temp = await Database.rawQuery("SELECT * FROM users;") + // // console.log(await Database.) + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // console.log("first") + // }, 2000); //ERP get index serial number From 02d7a121f160951a5485f4107214bc30795b4f38 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 13:47:01 +0700 Subject: [PATCH 155/298] test DB --- config/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/database.ts b/config/database.ts index 8108419..42c87ea 100644 --- a/config/database.ts +++ b/config/database.ts @@ -51,8 +51,8 @@ const databaseConfig: DatabaseConfig = { migrations: { naturalSort: true, }, - healthCheck: false, - debug: false, + healthCheck: true, + debug: true, }, }, }; From fec2f1af5082850b2e5b78050c91eeef3e92feec Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 13:47:31 +0700 Subject: [PATCH 156/298] test DB --- start/routes.ts | 336 ++++++++++++++++++++++++------------------------ 1 file changed, 168 insertions(+), 168 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index fbe5895..28041e5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,176 +36,176 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - // setTimeout(async() => { + setTimeout(async() => { // // let temp = await Database.rawQuery("SELECT * FROM users;") // // console.log(await Database.) - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // console.log("first") - // }, 2000); + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + console.log("first") + }, 2000); //ERP get index serial number From ad977085e68f00e13bb127cd8ac206dcd2b986d1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 14:50:50 +0700 Subject: [PATCH 157/298] create function sendNotification --- app/utils/sendNotification.js | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 app/utils/sendNotification.js diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js new file mode 100644 index 0000000..cdd4058 --- /dev/null +++ b/app/utils/sendNotification.js @@ -0,0 +1,39 @@ +const moment = require("moment/moment"); +const zulip = require("zulip-js"); + +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 autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") + ? ":check:" + : ":red_circle:"; + let logStatus = process.argv[4].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: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; + + await client.messages.send(params); + } catch (error) { + console.log(error); + } +}; + +sendNotification(); From f7816b868e05ec79a660985b734fbb4b14ec5711 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 15:12:53 +0700 Subject: [PATCH 158/298] test DB --- start/routes.ts | 340 ++++++++++++++++++++++++------------------------ 1 file changed, 170 insertions(+), 170 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 28041e5..a468e8d 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,176 +36,176 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setTimeout(async() => { - // // let temp = await Database.rawQuery("SELECT * FROM users;") - // // console.log(await Database.) - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - console.log("first") - }, 2000); + // setTimeout(async() => { + // // // let temp = await Database.rawQuery("SELECT * FROM users;") + // // // console.log(await Database.) + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // console.log("first") + // }, 2000); //ERP get index serial number From 6ee0a2c9178c1e682c189d22a70d9892671301bd Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 15:20:08 +0700 Subject: [PATCH 159/298] create function sendNotification --- app/utils/sendNotification.js | 39 +++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index cdd4058..3f7dfc0 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -1,5 +1,6 @@ const moment = require("moment/moment"); const zulip = require("zulip-js"); +const { exec } = require('child_process'); const sendNotification = async () => { @@ -10,7 +11,8 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - + const command = ["nc -zv 172.16.7.13 8002", "nc -zv 172.16.7.13 5000", "nc -zv 172.16.6.23 3333"] + let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") ? ":check:" : ":red_circle:"; @@ -18,19 +20,30 @@ const sendNotification = async () => { ? ":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: "Result test - auto.nswteam.net", - topic: "test", - content: content, - }; + exec(command, (error, stdout, stderr) => { + if (error) { + console.error(`Error executing command: ${error.message}`); + return; + } + + console.log(`Command output:\n${stdout}`); - await client.messages.send(params); + }); + + + // 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: "Result test - auto.nswteam.net", + // topic: "test", + // content: content, + // }; + + // await client.messages.send(params); } catch (error) { console.log(error); } From 3eb97a4b8e7a07fe03ea8d777ebe09c1bd030e5e Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 15:21:30 +0700 Subject: [PATCH 160/298] create function sendNotification --- app/utils/sendNotification.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 3f7dfc0..3da82cf 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -12,13 +12,13 @@ const sendNotification = async () => { }; const client = await zulip(config); const command = ["nc -zv 172.16.7.13 8002", "nc -zv 172.16.7.13 5000", "nc -zv 172.16.6.23 3333"] - - let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") - ? ":check:" - : ":red_circle:"; - let logStatus = process.argv[4].includes("succeeded") - ? ":check:" - : ":red_circle:"; + + // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") + // ? ":check:" + // : ":red_circle:"; + // let logStatus = process.argv[4].includes("succeeded") + // ? ":check:" + // : ":red_circle:"; exec(command, (error, stdout, stderr) => { if (error) { From 983ecdfa162d0e0d78d1aafd163fdc5c2bf9f968 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 15:23:48 +0700 Subject: [PATCH 161/298] create function sendNotification --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 3da82cf..30bdca2 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -11,7 +11,7 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - const command = ["nc -zv 172.16.7.13 8002", "nc -zv 172.16.7.13 5000", "nc -zv 172.16.6.23 3333"] + const command = "nc -zv 172.16.7.13 8002" // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") // ? ":check:" From e46d46ee23296a7ec147a1a8427f577bae29df85 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 15:25:19 +0700 Subject: [PATCH 162/298] create function sendNotification --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 30bdca2..40888d5 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -11,7 +11,7 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - const command = "nc -zv 172.16.7.13 8002" + const command = "ls" // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") // ? ":check:" From 6e2ccd96a7a56af43157d439ee1dcbbe1c7e03ab Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:01:02 +0700 Subject: [PATCH 163/298] create function sendNotification --- app/utils/sendNotification.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 40888d5..167e866 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -11,7 +11,7 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - const command = "ls" + const command = "nc -zv 172.16.7.13 8002" // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") // ? ":check:" @@ -27,6 +27,7 @@ const sendNotification = async () => { } console.log(`Command output:\n${stdout}`); + console.log(`Command output:\n${stderr}`); }); From 8318b0598f126ea336b90f9e7267469a5b069f34 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:14:51 +0700 Subject: [PATCH 164/298] create function sendNotification --- app/utils/sendNotification.js | 48 ++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 167e866..3b49c4b 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -11,8 +11,9 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - const command = "nc -zv 172.16.7.13 8002" - + let auto1 = "" + let auto2 = "" + let log = "" // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") // ? ":check:" // : ":red_circle:"; @@ -20,17 +21,52 @@ const sendNotification = async () => { // ? ":check:" // : ":red_circle:"; - exec(command, (error, stdout, stderr) => { + exec("nc -zv 172.16.7.13 8002", (error, stdout, stderr) => { if (error) { - console.error(`Error executing command: ${error.message}`); + // console.error(`Error executing command: ${error.message}`); return; } - console.log(`Command output:\n${stdout}`); - console.log(`Command output:\n${stderr}`); + 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 3333", (error, stdout, stderr) => { + if (error) { + // console.error(`Error executing command: ${error.message}`); + return; + } + + if(stdout !== ""){ + log += stdout + }else{ + log += stderr + } + + }); + + + setTimeout(() => { + console.log({auto1:auto1, auto2: auto2, log:log}) + }, 3000); // let time = moment(Date.now()).format("HH:mm - DD/MM") // let content = From d2843a0013229f30f4c4278f19e53d7486d7af16 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:16:30 +0700 Subject: [PATCH 165/298] create function sendNotification --- app/utils/sendNotification.js | 120 +++++++++++++++++----------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 3b49c4b..5a123ec 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -1,9 +1,8 @@ const moment = require("moment/moment"); const zulip = require("zulip-js"); -const { exec } = require('child_process'); +const { exec } = require("child_process"); const sendNotification = async () => { - try { const config = { username: "networktool-bot@zulip.ipsupply.com.au", @@ -11,76 +10,77 @@ const sendNotification = async () => { realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - let auto1 = "" - let auto2 = "" - let log = "" - // let autoStatus = process.argv[2].includes("succeeded") && process.argv[3].includes("succeeded") - // ? ":check:" - // : ":red_circle:"; - // let logStatus = process.argv[4].includes("succeeded") - // ? ":check:" - // : ":red_circle:"; + let auto1 = ""; + let auto2 = ""; + let log = ""; - exec("nc -zv 172.16.7.13 8002", (error, stdout, stderr) => { - if (error) { + 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 - } + return; + } - }); + if (stdout !== "") { + auto1 += stdout; + } else { + auto1 += stderr; + } + }); - exec("nc -zv 172.16.7.13 5000", (error, stdout, stderr) => { - if (error) { + 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 - } + return; + } - }); + if (stdout !== "") { + auto2 += stdout; + } else { + auto2 += stderr; + } + }); - exec("nc -zv 172.16.6.23 3333", (error, stdout, stderr) => { - if (error) { + exec("nc -zv 172.16.6.23 3333", (error, stdout, stderr) => { + if (error) { // console.error(`Error executing command: ${error.message}`); - return; - } - - if(stdout !== ""){ - log += stdout - }else{ - log += stderr - } + return; + } - }); + if (stdout !== "") { + log += stdout; + } else { + log += stderr; + } + }); + setTimeout(async () => { + console.log({ auto1: auto1, auto2: auto2, log: log }); + let autoStatus = + auto1?.includes("succeeded") && auto2?.includes("succeeded") + ? ":check:" + : ":red_circle:"; + let logStatus = log?.includes("succeeded") ? ":check:" : ":red_circle:"; - setTimeout(() => { - console.log({auto1:auto1, auto2: auto2, log:log}) - }, 3000); + 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: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; - // 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: "Result test - auto.nswteam.net", - // topic: "test", - // content: content, - // }; - - // await client.messages.send(params); + await client.messages.send(params); + }, 3000); } catch (error) { console.log(error); } From 8714c5b65acc7761b55a65607490cc30a6f263b1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:21:24 +0700 Subject: [PATCH 166/298] create function sendNotification --- app/utils/sendNotification.js | 60 +++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 5a123ec..06f59c5 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -54,32 +54,44 @@ const sendNotification = async () => { }); setTimeout(async () => { - console.log({ auto1: auto1, auto2: auto2, log: log }); - let autoStatus = - auto1?.includes("succeeded") && auto2?.includes("succeeded") - ? ":check:" - : ":red_circle:"; - let logStatus = log?.includes("succeeded") ? ":check:" : ":red_circle:"; + if (process.argv[2] === "interval") { + if (log.includes("succeeded") === false) { + exec("pm2 restart all", (error, stdout, stderr) => { + if (error) { + return; + } - 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: "Result test - auto.nswteam.net", - topic: "test", - content: content, - }; + console.log("RESTART: ", stdout) + }); + } + } else { + console.log({ auto1: auto1, auto2: auto2, log: log }); + let autoStatus = + auto1?.includes("succeeded") && auto2?.includes("succeeded") + ? ":check:" + : ":red_circle:"; + let logStatus = log?.includes("succeeded") ? ":check:" : ":red_circle:"; - await client.messages.send(params); + 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: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; + + await client.messages.send(params); + } }, 3000); } catch (error) { console.log(error); From d8b3ea0f0c7ac4134d00272e7eaf6e48a0f46f44 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:23:19 +0700 Subject: [PATCH 167/298] create function sendNotification --- app/utils/sendNotification.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 06f59c5..4aef32c 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -63,6 +63,8 @@ const sendNotification = async () => { console.log("RESTART: ", stdout) }); + }else{ + console.log(" /\n\/") } } else { console.log({ auto1: auto1, auto2: auto2, log: log }); From 7d5a6a0c22efc95e6cdcd1fe4579bb44e87fa4c5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:24:42 +0700 Subject: [PATCH 168/298] create function sendNotification --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 4aef32c..1e1a7ca 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -64,7 +64,7 @@ const sendNotification = async () => { console.log("RESTART: ", stdout) }); }else{ - console.log(" /\n\/") + console.log("server good") } } else { console.log({ auto1: auto1, auto2: auto2, log: log }); From 2936bbc562d450a870df4c645cb81f7528d11cfa Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:32:29 +0700 Subject: [PATCH 169/298] create function sendNotification --- app/utils/sendNotification.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 1e1a7ca..d54f466 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -60,11 +60,20 @@ const sendNotification = async () => { if (error) { return; } + console.log("RESTART: ", stdout); - console.log("RESTART: ", stdout) + let content = "Server die! Restart ..."; + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; + + client.messages.send(params); }); - }else{ - console.log("server good") + } else { + console.log("server good"); } } else { console.log({ auto1: auto1, auto2: auto2, log: log }); @@ -87,8 +96,8 @@ const sendNotification = async () => { "|"; let params = { type: "stream", - to: "Result test - auto.nswteam.net", - topic: "test", + to: "System Logs", + topic: "stream events", content: content, }; From 6dd4c82247f8c8fdc9c884f05bf185d1c94aa1dd Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:34:21 +0700 Subject: [PATCH 170/298] create function sendNotification --- app/utils/sendNotification.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index d54f466..97778f7 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -74,6 +74,15 @@ const sendNotification = async () => { }); } else { console.log("server good"); + let content = "Server good!"; + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; + + client.messages.send(params); } } else { console.log({ auto1: auto1, auto2: auto2, log: log }); From 83575796a571957b379a3341076d63a0605202af Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:38:14 +0700 Subject: [PATCH 171/298] create function sendNotification --- app/utils/sendNotification.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 97778f7..6fe7092 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -85,7 +85,6 @@ const sendNotification = async () => { client.messages.send(params); } } else { - console.log({ auto1: auto1, auto2: auto2, log: log }); let autoStatus = auto1?.includes("succeeded") && auto2?.includes("succeeded") ? ":check:" @@ -103,12 +102,19 @@ const sendNotification = async () => { "**|" + logStatus + "|"; + // let params = { + // type: "stream", + // to: "System Logs", + // topic: "stream events", + // content: content, + // }; + let params = { - type: "stream", - to: "System Logs", - topic: "stream events", - content: content, - }; + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; await client.messages.send(params); } From 7b0be9250e9a9de3cc1dbd8d71d4a70e7f908bd5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 27 Sep 2023 16:44:26 +0700 Subject: [PATCH 172/298] create function sendNotification --- app/utils/sendNotification.js | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 6fe7092..c8a4ed2 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -75,14 +75,14 @@ const sendNotification = async () => { } else { console.log("server good"); let content = "Server good!"; - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "test", - content: content, - }; + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "test", + content: content, + }; - client.messages.send(params); + client.messages.send(params); } } else { let autoStatus = @@ -102,19 +102,19 @@ const sendNotification = async () => { "**|" + logStatus + "|"; - // let params = { - // type: "stream", - // to: "System Logs", - // topic: "stream events", - // content: content, - // }; - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "test", - content: content, - }; + type: "stream", + to: "System Logs", + topic: "stream events", + content: content, + }; + + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "test", + // content: content, + // }; await client.messages.send(params); } From a74961769dfeb3739a1abab2fe61dd3cb4684341 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:35:24 +0700 Subject: [PATCH 173/298] create function sendNotification --- app/utils/sendNotification.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index c8a4ed2..17cb429 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -63,10 +63,11 @@ const sendNotification = async () => { console.log("RESTART: ", stdout); let content = "Server die! Restart ..."; + let params = { type: "stream", to: "Result test - auto.nswteam.net", - topic: "test", + topic: "AU-dev", content: content, }; From 7995175787920f7e71028d98b67cf2df2de80cac Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:36:02 +0700 Subject: [PATCH 174/298] create function sendNotification --- app/utils/sendNotification.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 17cb429..e23f600 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -63,7 +63,7 @@ const sendNotification = async () => { console.log("RESTART: ", stdout); let content = "Server die! Restart ..."; - + let params = { type: "stream", to: "Result test - auto.nswteam.net", @@ -79,7 +79,7 @@ const sendNotification = async () => { let params = { type: "stream", to: "Result test - auto.nswteam.net", - topic: "test", + topic: "AU-dev", content: content, }; From a33389e3521aa8799908d7cda1287986cd72233d Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:38:42 +0700 Subject: [PATCH 175/298] test DB --- start/routes.ts | 338 ++++++++++++++++++++++++------------------------ 1 file changed, 168 insertions(+), 170 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index a468e8d..7ad4089 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,176 +36,174 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - // setTimeout(async() => { - // // // let temp = await Database.rawQuery("SELECT * FROM users;") - // // // console.log(await Database.) - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // console.log("first") - // }, 2000); + setTimeout(async() => { + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + LogDetectFile.all() + console.log("first") + }, 2000); //ERP get index serial number From f926678676a53ac10d13f340581bddf60385a25e Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:40:38 +0700 Subject: [PATCH 176/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index e23f600..de28a8c 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -40,7 +40,7 @@ const sendNotification = async () => { } }); - exec("nc -zv 172.16.6.23 3333", (error, stdout, stderr) => { + exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { if (error) { // console.error(`Error executing command: ${error.message}`); return; From ad7ca63ca233eeefc95233db2e92585c60e9b50d Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:43:36 +0700 Subject: [PATCH 177/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index de28a8c..cbe962b 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -52,7 +52,7 @@ const sendNotification = async () => { log += stderr; } }); - +console.log({auto1: auto1, auto2:auto2, log: log}) setTimeout(async () => { if (process.argv[2] === "interval") { if (log.includes("succeeded") === false) { From fc5bc7cc5f86c015b1233f23d397e3ef9393e796 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:45:56 +0700 Subject: [PATCH 178/298] test DB --- app/utils/sendNotification.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index cbe962b..59df577 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -103,19 +103,19 @@ console.log({auto1: auto1, auto2:auto2, log: log}) "**|" + logStatus + "|"; - let params = { - type: "stream", - to: "System Logs", - topic: "stream events", - content: content, - }; - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "test", - // content: content, - // }; + // 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); } From 9b7310beeb9446e1806dd108a6195a8c2cce5189 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 07:47:13 +0700 Subject: [PATCH 179/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 59df577..dd8f17e 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -52,8 +52,8 @@ const sendNotification = async () => { log += stderr; } }); -console.log({auto1: auto1, auto2:auto2, log: log}) setTimeout(async () => { + console.log({auto1: auto1, auto2:auto2, log: log}) if (process.argv[2] === "interval") { if (log.includes("succeeded") === false) { exec("pm2 restart all", (error, stdout, stderr) => { From 867f2d04720f022dee59e9baf38681562322e1a7 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:05:01 +0700 Subject: [PATCH 180/298] test DB --- app/utils/sendNotification.js | 21 +++++++++++++++------ config/database.ts | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index dd8f17e..cca9e4f 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -52,8 +52,17 @@ const sendNotification = async () => { log += stderr; } }); + + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: "Test", + }; + + client.messages.send(params); setTimeout(async () => { - console.log({auto1: auto1, auto2:auto2, log: log}) + console.log({ auto1: auto1, auto2: auto2, log: log }); if (process.argv[2] === "interval") { if (log.includes("succeeded") === false) { exec("pm2 restart all", (error, stdout, stderr) => { @@ -111,11 +120,11 @@ const sendNotification = async () => { // }; let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: content, - }; + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: content, + }; await client.messages.send(params); } diff --git a/config/database.ts b/config/database.ts index 42c87ea..8108419 100644 --- a/config/database.ts +++ b/config/database.ts @@ -51,8 +51,8 @@ const databaseConfig: DatabaseConfig = { migrations: { naturalSort: true, }, - healthCheck: true, - debug: true, + healthCheck: false, + debug: false, }, }, }; From 10b4acaf1801bcfff8402591d34de510d936d032 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:06:53 +0700 Subject: [PATCH 181/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index cca9e4f..f4ecd96 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -57,7 +57,7 @@ const sendNotification = async () => { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: "Test", + content: JSON.stringify({ auto1: auto1, auto2: auto2, log: log }), }; client.messages.send(params); From 72e66009263370acb1fa9091d0a2b867c5c1d043 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:08:29 +0700 Subject: [PATCH 182/298] test DB --- app/utils/sendNotification.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index f4ecd96..056e43e 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -53,16 +53,17 @@ const sendNotification = async () => { } }); - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: JSON.stringify({ auto1: auto1, auto2: auto2, log: log }), - }; - - client.messages.send(params); + setTimeout(async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: JSON.stringify({ auto1: auto1, auto2: auto2, log: log }), + }; + + client.messages.send(params); if (process.argv[2] === "interval") { if (log.includes("succeeded") === false) { exec("pm2 restart all", (error, stdout, stderr) => { From 44400ca2c104fdffe47ad5883da01059022881bd Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:09:49 +0700 Subject: [PATCH 183/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 056e43e..e76c7d1 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -65,7 +65,7 @@ const sendNotification = async () => { client.messages.send(params); if (process.argv[2] === "interval") { - if (log.includes("succeeded") === false) { + if (log.includes("succeeded") === false || log === "") { exec("pm2 restart all", (error, stdout, stderr) => { if (error) { return; From 18e8545acdd8d8f9ffcb93e022c658aa3d737304 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:11:45 +0700 Subject: [PATCH 184/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index e76c7d1..b2a01b1 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -60,7 +60,7 @@ const sendNotification = async () => { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: JSON.stringify({ auto1: auto1, auto2: auto2, log: log }), + content: process.argv[2], }; client.messages.send(params); From a93bb0a26c71fd247819d474e6b89aadf8c65d36 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:12:53 +0700 Subject: [PATCH 185/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index b2a01b1..2705d9b 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -65,7 +65,7 @@ const sendNotification = async () => { client.messages.send(params); if (process.argv[2] === "interval") { - if (log.includes("succeeded") === false || log === "") { + if (log === "") { exec("pm2 restart all", (error, stdout, stderr) => { if (error) { return; From cf247b8d47e056f35b8f4ab8062e8494180b3d81 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:14:43 +0700 Subject: [PATCH 186/298] test DB --- app/utils/sendNotification.js | 36 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 2705d9b..8d26e21 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -56,32 +56,34 @@ const sendNotification = async () => { setTimeout(async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: process.argv[2], - }; - - client.messages.send(params); + if (process.argv[2] === "interval") { if (log === "") { exec("pm2 restart all", (error, stdout, stderr) => { if (error) { return; } - console.log("RESTART: ", stdout); + // console.log("RESTART: ", stdout); - let content = "Server die! Restart ..."; + // let content = "Server die! Restart ..."; + + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: content, + // }; + + // client.messages.send(params); let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: content, - }; - - client.messages.send(params); + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: process.argv[2], + }; + + client.messages.send(params); }); } else { console.log("server good"); From 8e7fd3400e32c8fee419c966bf668680e892f985 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:16:38 +0700 Subject: [PATCH 187/298] test DB --- app/utils/sendNotification.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 8d26e21..4f80fc8 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -61,7 +61,15 @@ const sendNotification = async () => { if (log === "") { exec("pm2 restart all", (error, stdout, stderr) => { if (error) { - return; + // return; + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: error, + }; + + client.messages.send(params); } // console.log("RESTART: ", stdout); From dd19b2f32ac6b709cc9787c95a2d3a7c8abb79d4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:19:25 +0700 Subject: [PATCH 188/298] test DB --- app/utils/sendNotification.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 4f80fc8..043bf31 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -59,6 +59,14 @@ const sendNotification = async () => { if (process.argv[2] === "interval") { if (log === "") { + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: "log = null", + }; + + client.messages.send(params); exec("pm2 restart all", (error, stdout, stderr) => { if (error) { // return; From 6b17a06d731b4e167d172d1068d04562434f0689 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:21:48 +0700 Subject: [PATCH 189/298] test DB --- app/utils/sendNotification.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 043bf31..fae0f36 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -58,6 +58,14 @@ const sendNotification = async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); if (process.argv[2] === "interval") { + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: 'process.argv[2] === "interval"', + }; + + client.messages.send(params); if (log === "") { let params = { type: "stream", From 3f46edd5a858f2dd90159ab5db06833a59713a7b Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:24:31 +0700 Subject: [PATCH 190/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index fae0f36..2218ef3 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -57,7 +57,7 @@ const sendNotification = async () => { setTimeout(async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); - if (process.argv[2] === "interval") { + if (true) { let params = { type: "stream", to: "Result test - auto.nswteam.net", From 7e8d79b1514a682f80e9d7ddeb4bbb5323a93ce4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:26:39 +0700 Subject: [PATCH 191/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 2218ef3..2b21c79 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -57,7 +57,7 @@ const sendNotification = async () => { setTimeout(async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); - if (true) { + if (2>1) { let params = { type: "stream", to: "Result test - auto.nswteam.net", From 683d79139a5e40c0e00679a5c0277645506da5e1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:28:04 +0700 Subject: [PATCH 192/298] test DB --- app/utils/sendNotification.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 2b21c79..c626aee 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -158,6 +158,14 @@ const sendNotification = async () => { }, 3000); } catch (error) { console.log(error); + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: 'catch: '+error, + }; + + client.messages.send(params); } }; From 2e88eb46971539f1d39d1abecf5ceb871b6aa08c Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:30:31 +0700 Subject: [PATCH 193/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index c626aee..63d7219 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -155,7 +155,7 @@ const sendNotification = async () => { await client.messages.send(params); } - }, 3000); + }, 5000); } catch (error) { console.log(error); let params = { From 45a0bc6413c73480c46a5305e3793f9a280e442f Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:34:15 +0700 Subject: [PATCH 194/298] test DB --- app/utils/sendNotification.js | 179 +++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 67 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 63d7219..27b1632 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -51,76 +51,121 @@ const sendNotification = async () => { } else { log += stderr; } - }); - - - setTimeout(async () => { - console.log({ auto1: auto1, auto2: auto2, log: log }); - - if (2>1) { + if (stdout.includes("succeeded")===false && stderr.includes("succeeded")===false) { let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: 'process.argv[2] === "interval"', - }; - - client.messages.send(params); - if (log === "") { - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: "log = null", - }; - - client.messages.send(params); - exec("pm2 restart all", (error, stdout, stderr) => { - if (error) { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: "log = null", + }; + + client.messages.send(params); + exec("pm2 restart all", (error, stdout, stderr) => { + if (error) { // return; - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: error, - }; - - client.messages.send(params); - } - // console.log("RESTART: ", stdout); - - // let content = "Server die! Restart ..."; - - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: content, - // }; - - // client.messages.send(params); - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: process.argv[2], - }; - - client.messages.send(params); - }); - } else { - console.log("server good"); - let content = "Server good!"; + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: error, + }; + + client.messages.send(params); + } + // console.log("RESTART: ", stdout); + + // let content = "Server die! Restart ..."; + + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: content, + // }; + + // client.messages.send(params); + let params = { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: content, + content: process.argv[2], }; client.messages.send(params); - } + }); + } else { + console.log("server good"); + let content = "Server good!"; + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: content, + }; + + client.messages.send(params); + } + }); + + setTimeout(async () => { + console.log({ auto1: auto1, auto2: auto2, log: log }); + + if (2 > 1) { + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: 'process.argv[2] === "interval"', + // }; + // client.messages.send(params); + // if (log === "") { + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: "log = null", + // }; + // client.messages.send(params); + // exec("pm2 restart all", (error, stdout, stderr) => { + // if (error) { + // // return; + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: error, + // }; + // client.messages.send(params); + // } + // // console.log("RESTART: ", stdout); + // // let content = "Server die! Restart ..."; + // // let params = { + // // type: "stream", + // // to: "Result test - auto.nswteam.net", + // // topic: "AU-dev", + // // content: content, + // // }; + // // client.messages.send(params); + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: process.argv[2], + // }; + // client.messages.send(params); + // }); + // } else { + // console.log("server good"); + // let content = "Server good!"; + // let params = { + // type: "stream", + // to: "Result test - auto.nswteam.net", + // topic: "AU-dev", + // content: content, + // }; + // client.messages.send(params); + // } } else { let autoStatus = auto1?.includes("succeeded") && auto2?.includes("succeeded") @@ -159,13 +204,13 @@ const sendNotification = async () => { } catch (error) { console.log(error); let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: 'catch: '+error, - }; - - client.messages.send(params); + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: "catch: " + error, + }; + + client.messages.send(params); } }; From ec436370f9faae4a807478b546eb4536ddf77d44 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:36:11 +0700 Subject: [PATCH 195/298] test DB --- app/utils/sendNotification.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 27b1632..e4ee031 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -42,7 +42,14 @@ const sendNotification = async () => { exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { if (error) { - // console.error(`Error executing command: ${error.message}`); + let params = { + type: "stream", + to: "Result test - auto.nswteam.net", + topic: "AU-dev", + content: error+"123", + }; + + client.messages.send(params); return; } From 88b58e118917ccf8b26e2f71dc8e66d67bf3acfc Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:43:02 +0700 Subject: [PATCH 196/298] test DB --- app/utils/sendNotification.js | 125 +++------------------------------- 1 file changed, 10 insertions(+), 115 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index e4ee031..04fed4d 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -42,138 +42,41 @@ const sendNotification = async () => { exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { if (error) { - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: error+"123", - }; - - client.messages.send(params); - return; - } - - if (stdout !== "") { - log += stdout; - } else { - log += stderr; - } - if (stdout.includes("succeeded")===false && stderr.includes("succeeded")===false) { - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: "log = null", - }; - - client.messages.send(params); exec("pm2 restart all", (error, stdout, stderr) => { if (error) { - // return; + console.log("RESTART: ", stdout); let params = { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: error, + content: "Can't restart server. Please check!", }; client.messages.send(params); } - // console.log("RESTART: ", stdout); - - // let content = "Server die! Restart ..."; - - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: content, - // }; - - // client.messages.send(params); - + // console.log("RESTART: ", stdout); let params = { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: process.argv[2], + content: "Restarting ...", }; client.messages.send(params); }); + return; + } + if (stdout !== "") { + log += stdout; } else { - console.log("server good"); - let content = "Server good!"; - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: content, - }; - - client.messages.send(params); + log += stderr; } }); setTimeout(async () => { console.log({ auto1: auto1, auto2: auto2, log: log }); - if (2 > 1) { - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: 'process.argv[2] === "interval"', - // }; - // client.messages.send(params); - // if (log === "") { - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: "log = null", - // }; - // client.messages.send(params); - // exec("pm2 restart all", (error, stdout, stderr) => { - // if (error) { - // // return; - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: error, - // }; - // client.messages.send(params); - // } - // // console.log("RESTART: ", stdout); - // // let content = "Server die! Restart ..."; - // // let params = { - // // type: "stream", - // // to: "Result test - auto.nswteam.net", - // // topic: "AU-dev", - // // content: content, - // // }; - // // client.messages.send(params); - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: process.argv[2], - // }; - // client.messages.send(params); - // }); - // } else { - // console.log("server good"); - // let content = "Server good!"; - // let params = { - // type: "stream", - // to: "Result test - auto.nswteam.net", - // topic: "AU-dev", - // content: content, - // }; - // client.messages.send(params); - // } - } else { + if (process.argv[2] === "daily") { let autoStatus = auto1?.includes("succeeded") && auto2?.includes("succeeded") ? ":check:" @@ -210,14 +113,6 @@ const sendNotification = async () => { }, 5000); } catch (error) { console.log(error); - let params = { - type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", - content: "catch: " + error, - }; - - client.messages.send(params); } }; From c22695ca3b7883e0f569771aac9e2a4e69f08698 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:44:43 +0700 Subject: [PATCH 197/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 04fed4d..0852a29 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -49,7 +49,7 @@ const sendNotification = async () => { type: "stream", to: "Result test - auto.nswteam.net", topic: "AU-dev", - content: "Can't restart server. Please check!", + content: "Can't restart server. Please check!\n```\n"+error+"\n```", }; client.messages.send(params); From 5ce387040c269a3e615ef4e66d89166913953360 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:47:48 +0700 Subject: [PATCH 198/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 0852a29..e86ea93 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -42,7 +42,7 @@ const sendNotification = async () => { exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { if (error) { - exec("pm2 restart all", (error, stdout, stderr) => { + exec("/home/test.sh", (error, stdout, stderr) => { if (error) { console.log("RESTART: ", stdout); let params = { From da6b7de08bb93b801a530db255d517dc6ed1c90b Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:50:58 +0700 Subject: [PATCH 199/298] test DB --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index e86ea93..5b2f0f6 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -42,7 +42,7 @@ const sendNotification = async () => { exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { if (error) { - exec("/home/test.sh", (error, stdout, stderr) => { + exec("/root/.nvm/versions/node/v16.14.0/bin/pm2 restart all", (error, stdout, stderr) => { if (error) { console.log("RESTART: ", stdout); let params = { From bf0b91542373cc1095c5092eaf49874f6728c873 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 08:54:17 +0700 Subject: [PATCH 200/298] test DB --- start/routes.ts | 336 ++++++++++++++++++++++++------------------------ 1 file changed, 168 insertions(+), 168 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 7ad4089..30052b6 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -36,174 +36,174 @@ import { sendMessToZulip } from "App/utils/sendMessToZulip"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - setTimeout(async() => { - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - LogDetectFile.all() - console.log("first") - }, 2000); + // setTimeout(async() => { + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // LogDetectFile.all() + // console.log("first") + // }, 2000); //ERP get index serial number From f7015c0b43d33243243df2ca8c2374b82ed9d16f Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 09:00:02 +0700 Subject: [PATCH 201/298] create function sendNotification --- app/utils/sendNotification.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 5b2f0f6..29ab533 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -40,15 +40,15 @@ const sendNotification = async () => { } }); - exec("nc -zv 172.16.6.26 3333", (error, stdout, stderr) => { + exec("nc -zv 172.16.6.23 3333", (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: "Result test - auto.nswteam.net", - topic: "AU-dev", + to: "networkToolBot", + topic: "Log service", content: "Can't restart server. Please check!\n```\n"+error+"\n```", }; @@ -57,8 +57,8 @@ const sendNotification = async () => { // console.log("RESTART: ", stdout); let params = { type: "stream", - to: "Result test - auto.nswteam.net", - topic: "AU-dev", + to: "networkToolBot", + topic: "Log service", content: "Restarting ...", }; @@ -94,20 +94,20 @@ const sendNotification = async () => { "**|" + 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", + 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); From 0af36f5c2c4a49633c55718102da52b920b69827 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 09:38:41 +0700 Subject: [PATCH 202/298] update function checkIndexSN --- app/utils/checkIndexSN.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index 7c6518a..02b0711 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -171,7 +171,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uc3d0ZWFtLm5ldC9hcGkvbG9naW4iLCJpYXQiOjE2ODkzOTEyMDMsImV4cCI6MTcyMDkyNzIwMywibmJmIjoxNjg5MzkxMjAzLCJqdGkiOiJreFA1MW9jck5rdEYzSzY3Iiwic3ViIjozNjkwLCJwcnYiOiJjOGVlMWZjODllNzc1ZWM0YzczODY2N2U1YmUxN2E1OTBiNmQ0MGZjIn0.p-aE0oWkKmdrcKWD94oSmMd_CMbY_4MoqADIwYIhIKw"; let data = { - data: output, + data: output.filter((i)=>i.PID!==""), urlAPI: "/api/test-log-serial-number/save-data", }; const response = await axios.post( From dbcf92544fcdfb89fce07e78ff2323ee8f15f5a0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 09:51:14 +0700 Subject: [PATCH 203/298] update Erp getIndex --- app/Controllers/Http/ErpsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 02c281c..5686c1a 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -283,7 +283,7 @@ export default class ErpsController { ); // console.log(report); return report.filter( - (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true + (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !=="" ); // }, 15000); } catch (error) { From 0bb2557cd6c73e29a2d09b057a73fce112405fca Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 10:50:17 +0700 Subject: [PATCH 204/298] update function checkIndexSN --- app/utils/checkIndexSN.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index 02b0711..f04246f 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -167,13 +167,15 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } // console.log(nameF+" output\n", output); - if (output.length > 0) { + if (output.filter((i)=>i.PID!=="").length > 0) { let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uc3d0ZWFtLm5ldC9hcGkvbG9naW4iLCJpYXQiOjE2ODkzOTEyMDMsImV4cCI6MTcyMDkyNzIwMywibmJmIjoxNjg5MzkxMjAzLCJqdGkiOiJreFA1MW9jck5rdEYzSzY3Iiwic3ViIjozNjkwLCJwcnYiOiJjOGVlMWZjODllNzc1ZWM0YzczODY2N2U1YmUxN2E1OTBiNmQ0MGZjIn0.p-aE0oWkKmdrcKWD94oSmMd_CMbY_4MoqADIwYIhIKw"; - let data = { + + 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, From f686c7b9ed0809388491307e931697ca63c97851 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:07:15 +0700 Subject: [PATCH 205/298] update function checkIndexSN --- app/utils/checkIndexSN.ts | 19 ++++++++++++++----- config/database.ts | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index f04246f..a4b677c 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -166,13 +166,16 @@ export const checkIndexSN = async (content, beginLine, nameF) => { } } } - // console.log(nameF+" output\n", output); - if (output.filter((i)=>i.PID!=="").length > 0) { + // console.log(nameF+" output\n", output); + if (output.filter((i) => i.PID !== "").length > 0) { let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5uc3d0ZWFtLm5ldC9hcGkvbG9naW4iLCJpYXQiOjE2ODkzOTEyMDMsImV4cCI6MTcyMDkyNzIwMywibmJmIjoxNjg5MzkxMjAzLCJqdGkiOiJreFA1MW9jck5rdEYzSzY3Iiwic3ViIjozNjkwLCJwcnYiOiJjOGVlMWZjODllNzc1ZWM0YzczODY2N2U1YmUxN2E1OTBiNmQ0MGZjIn0.p-aE0oWkKmdrcKWD94oSmMd_CMbY_4MoqADIwYIhIKw"; - let data = { - data: output.filter((i)=>i.PID!==""), + let token_int = + "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2ludC5pcHN1cHBseS5jb20uYXUvYXBpL2xvZ2luIiwiaWF0IjoxNjg5ODYyNjAxLCJleHAiOjE3MjEzOTg2MDEsIm5iZiI6MTY4OTg2MjYwMSwianRpIjoiUElZVjNBM3ZPQVlMQ081SyIsInN1YiI6MSwicHJ2IjoiYzhlZTFmYzg5ZTc3NWVjNGM3Mzg2NjdlNWJlMTdhNTkwYjZkNDBmYyJ9.UcybIKMBjTAY9i0PfIDQMtqHyN72Ul0jC03ZDGLGpMI"; + + let data = { + data: output.filter((i) => i.PID !== ""), urlAPI: "/api/test-log-serial-number/save-data", }; @@ -182,7 +185,13 @@ export const checkIndexSN = async (content, beginLine, nameF) => { { headers: { Authorization: "Bearer " + token } } ); - console.log(nameF+" response\n",response.data) + // const response_int = await axios.post( + // "https://int.ipsupply.com.au/api/transferPostData", + // data, + // { headers: { Authorization: "Bearer " + token } } + // ); + + console.log(nameF + " response\n", response.data); } } } catch (error) { diff --git a/config/database.ts b/config/database.ts index 8108419..133905f 100644 --- a/config/database.ts +++ b/config/database.ts @@ -45,7 +45,7 @@ const databaseConfig: DatabaseConfig = { pool: { min: 1, max: 2000, - acquireTimeoutMillis: 60 * 1000, + acquireTimeoutMillis: 60 * 1000 }, migrations: { From c746c0cd7ca0bcf525a9082e9cb7313c314ae7dd Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:46:18 +0700 Subject: [PATCH 206/298] /api/backupProduct --- app/Models/Product.ts | 28 ++++ start/routes.ts | 359 ++++++++++++++++++++++-------------------- 2 files changed, 218 insertions(+), 169 deletions(-) create mode 100644 app/Models/Product.ts diff --git a/app/Models/Product.ts b/app/Models/Product.ts new file mode 100644 index 0000000..986e1e6 --- /dev/null +++ b/app/Models/Product.ts @@ -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 pro_PID: string + + @column() + public pro_SN: string + + @column() + public pro_VID: string + + @column() + public pro_line: string + + @column() + public pro_file: string + + @column() + public pro_warehouse: string + + @column.dateTime({ autoCreate: true }) + public created_at: DateTime +} diff --git a/start/routes.ts b/start/routes.ts index 30052b6..e158595 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -33,178 +33,179 @@ import ImagesController from "App/Controllers/Http/ImagesController"; import { uploadFileToZulip } from "App/utils/uploadFileZulip"; import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; +import moment from "moment"; +import Product from "App/Models/Product"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); - // setTimeout(async() => { - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // LogDetectFile.all() - // console.log("first") - // }, 2000); - +// setTimeout(async() => { +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// LogDetectFile.all() +// console.log("first") +// }, 2000); //ERP get index serial number Route.post( @@ -371,3 +372,23 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); }); +Route.post("/api/backupProduct", async ({ request, response }) => { + try { + const date = moment(Date.now()).format("YYYYMMDD"); + const token = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; + const res = await axios.post( + "https://logs.danielvu.com/api/getIndexSerialNumber", + { from: date, to: date }, + { headers: { Authorization: token } } + ); + + res.data.map((obj, index)=>{ + res.data[index].line = res.data[index].line.join(",") + }) + + await Product.createMany(res.data) + } catch (error) { + response.status(500).send("ADD VALUE FAIL!"); + } +}); From c71aa2f9c95c54cf100e288d506285076599cf4a Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:49:58 +0700 Subject: [PATCH 207/298] /api/backupProduct --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index e158595..eba0878 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -389,6 +389,6 @@ Route.post("/api/backupProduct", async ({ request, response }) => { await Product.createMany(res.data) } catch (error) { - response.status(500).send("ADD VALUE FAIL!"); + response.status(500).send(error); } }); From d3aeb5477a8f774953a2c93f481220990c38244c Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:51:27 +0700 Subject: [PATCH 208/298] /api/backupProduct --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index eba0878..947c161 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -387,7 +387,8 @@ Route.post("/api/backupProduct", async ({ request, response }) => { res.data[index].line = res.data[index].line.join(",") }) - await Product.createMany(res.data) + const addProduct = await Product.createMany(res.data) + console.log(addProduct) } catch (error) { response.status(500).send(error); } From 9d8ca653411e2596179a891183dbb0b097d2536c Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:52:33 +0700 Subject: [PATCH 209/298] /api/backupProduct --- start/routes.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 947c161..0968150 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -373,7 +373,7 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); Route.post("/api/backupProduct", async ({ request, response }) => { - try { + // try { const date = moment(Date.now()).format("YYYYMMDD"); const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; @@ -389,7 +389,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const addProduct = await Product.createMany(res.data) console.log(addProduct) - } catch (error) { - response.status(500).send(error); - } + // } catch (error) { + // response.status(500).send(error); + // } }); From ea0ac0ba9473c0943fbc3080a827ac16545d4201 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:53:37 +0700 Subject: [PATCH 210/298] /api/backupProduct --- app/Models/Product.ts | 12 ++++++------ start/routes.ts | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Models/Product.ts b/app/Models/Product.ts index 986e1e6..038ec7a 100644 --- a/app/Models/Product.ts +++ b/app/Models/Product.ts @@ -6,22 +6,22 @@ export default class Product extends BaseModel { public id_pro: number @column() - public pro_PID: string + public PID: string @column() - public pro_SN: string + public SN: string @column() - public pro_VID: string + public VID: string @column() - public pro_line: string + public line: string @column() - public pro_file: string + public fileName: string @column() - public pro_warehouse: string + public warehouse: string @column.dateTime({ autoCreate: true }) public created_at: DateTime diff --git a/start/routes.ts b/start/routes.ts index 0968150..947c161 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -373,7 +373,7 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); Route.post("/api/backupProduct", async ({ request, response }) => { - // try { + try { const date = moment(Date.now()).format("YYYYMMDD"); const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; @@ -389,7 +389,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const addProduct = await Product.createMany(res.data) console.log(addProduct) - // } catch (error) { - // response.status(500).send(error); - // } + } catch (error) { + response.status(500).send(error); + } }); From 059af5b0dd10931d1630bd174c3ebcc1b177180f Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:55:11 +0700 Subject: [PATCH 211/298] /api/backupProduct --- start/routes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/start/routes.ts b/start/routes.ts index 947c161..ee242dd 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -389,6 +389,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const addProduct = await Product.createMany(res.data) console.log(addProduct) + response.status(200).send("Add "+res.data.length+" success!"); } catch (error) { response.status(500).send(error); } From be6240d0d51273df09093d39af764f1728b1ede4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 15:59:33 +0700 Subject: [PATCH 212/298] /api/backupProduct --- app/Models/Product.ts | 2 +- start/routes.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Models/Product.ts b/app/Models/Product.ts index 038ec7a..b323460 100644 --- a/app/Models/Product.ts +++ b/app/Models/Product.ts @@ -18,7 +18,7 @@ export default class Product extends BaseModel { public line: string @column() - public fileName: string + public file: string @column() public warehouse: string diff --git a/start/routes.ts b/start/routes.ts index ee242dd..da9e7a9 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -384,7 +384,15 @@ Route.post("/api/backupProduct", async ({ request, response }) => { ); res.data.map((obj, index)=>{ - res.data[index].line = res.data[index].line.join(",") + res.data[index] = { + PID:res.data[index].PID, + SN:res.data[index].SN, + VID:res.data[index].VID, + line:res.data[index].line.join(","), + file:res.data[index].fileName, + warehouse:res.data[index].warehouse, + created_at: Date.now() + } }) const addProduct = await Product.createMany(res.data) From 3ec0bd90ecf5a7393694cd3bca47a1b81d276a09 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:00:02 +0700 Subject: [PATCH 213/298] /api/backupProduct --- start/routes.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index da9e7a9..cb1cfaa 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -373,7 +373,7 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); Route.post("/api/backupProduct", async ({ request, response }) => { - try { + // try { const date = moment(Date.now()).format("YYYYMMDD"); const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; @@ -398,7 +398,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const addProduct = await Product.createMany(res.data) console.log(addProduct) response.status(200).send("Add "+res.data.length+" success!"); - } catch (error) { - response.status(500).send(error); - } + // } catch (error) { + // response.status(500).send(error); + // } }); From 6de088e969a364f8d3511452ee0da4244d466c8f Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:01:10 +0700 Subject: [PATCH 214/298] /api/backupProduct --- start/routes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index cb1cfaa..1e0a9a7 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,6 +35,7 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; import moment from "moment"; import Product from "App/Models/Product"; +import { DateTime } from "luxon"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -391,7 +392,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { line:res.data[index].line.join(","), file:res.data[index].fileName, warehouse:res.data[index].warehouse, - created_at: Date.now() + created_at: DateTime } }) From f0f9c5816762dec49c3e5a88544112739b3b7eef Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:02:00 +0700 Subject: [PATCH 215/298] /api/backupProduct --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 1e0a9a7..0dddc8b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,7 +35,7 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; import moment from "moment"; import Product from "App/Models/Product"; -import { DateTime } from "luxon"; +import DateTime from "luxon"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); From a5a4c1fc4c13893e365b275cba863ab3e7e6d8f4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:05:00 +0700 Subject: [PATCH 216/298] /api/backupProduct --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index 0dddc8b..d27407a 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -392,7 +392,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { line:res.data[index].line.join(","), file:res.data[index].fileName, warehouse:res.data[index].warehouse, - created_at: DateTime + created_at: new Date() } }) From 76b1b9ba933c70b0cb3f1678b4534dd63b4f8b4a Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:05:50 +0700 Subject: [PATCH 217/298] /api/backupProduct --- start/routes.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index d27407a..a47f3a6 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -35,7 +35,6 @@ import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; import moment from "moment"; import Product from "App/Models/Product"; -import DateTime from "luxon"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -391,8 +390,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { VID:res.data[index].VID, line:res.data[index].line.join(","), file:res.data[index].fileName, - warehouse:res.data[index].warehouse, - created_at: new Date() + warehouse:res.data[index].warehouse } }) From 6e17757640448904c3c7d58a4b8a9009e465da53 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:14:17 +0700 Subject: [PATCH 218/298] /api/backupProduct --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index a47f3a6..57b3793 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -379,7 +379,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; const res = await axios.post( "https://logs.danielvu.com/api/getIndexSerialNumber", - { from: date, to: date }, + { from: "20230901", to: "20230927" }, { headers: { Authorization: token } } ); From 8d43f2ce06b92e7092dfac3a55004b7c15cee4bd Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:20:32 +0700 Subject: [PATCH 219/298] /api/backupProduct --- start/routes.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 57b3793..28dc34d 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -373,13 +373,13 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { }); Route.post("/api/backupProduct", async ({ request, response }) => { - // try { + try { const date = moment(Date.now()).format("YYYYMMDD"); const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; const res = await axios.post( "https://logs.danielvu.com/api/getIndexSerialNumber", - { from: "20230901", to: "20230927" }, + { from: date, to: date }, { headers: { Authorization: token } } ); @@ -395,9 +395,9 @@ Route.post("/api/backupProduct", async ({ request, response }) => { }) const addProduct = await Product.createMany(res.data) - console.log(addProduct) + // console.log(addProduct) response.status(200).send("Add "+res.data.length+" success!"); - // } catch (error) { - // response.status(500).send(error); - // } + } catch (error) { + response.status(500).send(error); + } }); From 088c252872468179320bd68a38dea26d295d9fd0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:37:31 +0700 Subject: [PATCH 220/298] /api/backupProduct --- start/routes.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 28dc34d..bfa72c8 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -375,12 +375,10 @@ Route.post("/api/gitea-webhook", ({ request, response }) => { Route.post("/api/backupProduct", async ({ request, response }) => { try { const date = moment(Date.now()).format("YYYYMMDD"); - const token = - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MjY0NTQwLCJleHAiOjE3MjY4MDA1NDB9.vBlZAc7TGKbOrsP7UjQzVY2hIoJCGXQDe3KUxYyv294"; const res = await axios.post( "https://logs.danielvu.com/api/getIndexSerialNumber", { from: date, to: date }, - { headers: { Authorization: token } } + { headers: { Authorization: request.headers().authorization?.replace(/"/g, "") } } ); res.data.map((obj, index)=>{ @@ -393,11 +391,12 @@ Route.post("/api/backupProduct", async ({ request, response }) => { warehouse:res.data[index].warehouse } }) - const addProduct = await Product.createMany(res.data) // console.log(addProduct) response.status(200).send("Add "+res.data.length+" success!"); + await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product "+date+" success with "+res.data.length+"products") } catch (error) { response.status(500).send(error); + await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product fail. Please check!") } }); From aba12b380cbc523ce4a6e1fbd0b44d227de03122 Mon Sep 17 00:00:00 2001 From: joseph le Date: Thu, 28 Sep 2023 16:40:37 +0700 Subject: [PATCH 221/298] /api/backupProduct --- start/routes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start/routes.ts b/start/routes.ts index bfa72c8..5bd265a 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -394,7 +394,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const addProduct = await Product.createMany(res.data) // console.log(addProduct) response.status(200).send("Add "+res.data.length+" success!"); - await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product "+date+" success with "+res.data.length+"products") + await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product "+date+" success with "+res.data.length+" products") } catch (error) { response.status(500).send(error); await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product fail. Please check!") From ce1b146ecaaf349410f446a470972e07373c9c0c Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 08:55:02 +0700 Subject: [PATCH 222/298] update routes --- app/Controllers/Http/LogsController.ts | 115 ++++++++++++++++ app/Controllers/Http/ValuesController.ts | 40 ++++++ config/database.ts | 1 + start/routes.ts | 160 +---------------------- 4 files changed, 161 insertions(+), 155 deletions(-) create mode 100644 app/Controllers/Http/LogsController.ts create mode 100644 app/Controllers/Http/ValuesController.ts diff --git a/app/Controllers/Http/LogsController.ts b/app/Controllers/Http/LogsController.ts new file mode 100644 index 0000000..3679852 --- /dev/null +++ b/app/Controllers/Http/LogsController.ts @@ -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) {} +} diff --git a/app/Controllers/Http/ValuesController.ts b/app/Controllers/Http/ValuesController.ts new file mode 100644 index 0000000..b25372a --- /dev/null +++ b/app/Controllers/Http/ValuesController.ts @@ -0,0 +1,40 @@ +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({}: HttpContextContract) {} + + 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!"); + } + } +} diff --git a/config/database.ts b/config/database.ts index 133905f..72af843 100644 --- a/config/database.ts +++ b/config/database.ts @@ -51,6 +51,7 @@ const databaseConfig: DatabaseConfig = { migrations: { naturalSort: true, }, + healthCheck: false, debug: false, }, diff --git a/start/routes.ts b/start/routes.ts index 5bd265a..cd99fe5 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -1,4 +1,3 @@ -import fs from "fs"; import axios from "axios"; /* |-------------------------------------------------------------------------- @@ -21,17 +20,8 @@ import axios from "axios"; */ 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"; -import ImagesController from "App/Controllers/Http/ImagesController"; -import { uploadFileToZulip } from "App/utils/uploadFileZulip"; -import { screenShot } from "App/utils/screenShot"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; import moment from "moment"; import Product from "App/Models/Product"; @@ -221,156 +211,16 @@ 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 { - // 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 - ); +Route.get("/api/log/showLog/:name?", "LogsController.showLog"); - 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); +Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect"); - 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"); - } -}); - -Route.get("/api/getAllLogDetect", async ({ request, response }) => { - 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"); - } -}); //Key-Value +Route.post("/api/getKeyValue", "ValuesController.getKeyValue"); -Route.post("/api/getKeyValue", async ({ request, response }) => { - let data = await KeyValue.all(); - response.status(200).send(data); -}); +Route.post("/api/deleteValue", "ValuesController.destroy"); -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 }) => { - console.log("New event ---> ", request.header("x-gitea-event")); - - exec(Env.get("URL_FILE_SHELL"), async (error, stdout, stderr) => { - if (error) { - console.error(`Error executing command: ${error}`); - return; - } - - const res = await sendMessToZulip( - "private", - "joseph.le@apactech.io", - "none", - "** NEW EVENT -> " + - request.header("x-gitea-event") + - " **\n```\n" + - stdout + - "\n```" - ); - console.log(res); - console.log(`Command output:\n${stdout}`); - }); -}); +Route.post("/api/addValue", "ValuesController.create"); Route.post("/api/backupProduct", async ({ request, response }) => { try { From 9e5a7b1dd1c6fc4152e4c892dc50fce6f0f043da Mon Sep 17 00:00:00 2001 From: Joseph Le Date: Fri, 29 Sep 2023 12:41:11 +1000 Subject: [PATCH 223/298] re-install node-module --- package-lock.json | 2117 ++++++++++++++++++++++----------------------- 1 file changed, 1054 insertions(+), 1063 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f5b313..cab53c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -161,19 +161,6 @@ } } }, - "node_modules/@adonisjs/auth/node_modules/@poppinss/hooks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", - "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", - "peerDependencies": { - "@adonisjs/application": ">=4.0.0" - }, - "peerDependenciesMeta": { - "@adonisjs/application": { - "optional": true - } - } - }, "node_modules/@adonisjs/bodyparser": { "version": "8.1.9", "resolved": "https://registry.npmjs.org/@adonisjs/bodyparser/-/bodyparser-8.1.9.tgz", @@ -429,9 +416,9 @@ } }, "node_modules/@adonisjs/lucid": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.0.tgz", - "integrity": "sha512-pSBhKFzqr6mWoeIiGdcW2OQIWAyCoLn+G7VmXXLqxHvGm+9SaioKJaSMmaJa0xgS5v64r/MVLeH/nw87Q4KpyQ==", + "version": "18.4.2", + "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.2.tgz", + "integrity": "sha512-4k8GOat/YQtobNqwBIU8VAuY19p+V3ucBRoZ+iwxd/qy/KE1XupPzuMZVWYt1vyBboCrBmEYYmvC851tNqoP0A==", "dependencies": { "@faker-js/faker": "^8.0.1", "@poppinss/hooks": "^5.0.3", @@ -447,23 +434,13 @@ "slash": "^3.0.0", "tarn": "^3.0.2" }, + "engines": { + "node": ">=14.15.4" + }, "peerDependencies": { "@adonisjs/core": "^5.1.0" } }, - "node_modules/@adonisjs/lucid/node_modules/@poppinss/hooks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", - "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", - "peerDependencies": { - "@adonisjs/application": ">=4.0.0" - }, - "peerDependenciesMeta": { - "@adonisjs/application": { - "optional": true - } - } - }, "node_modules/@adonisjs/profiler": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/@adonisjs/profiler/-/profiler-6.0.9.tgz", @@ -588,17 +565,17 @@ } }, "node_modules/@adonisjs/validator": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.4.2.tgz", - "integrity": "sha512-rEbZ2WUWywjffb8Aes6eKpoTb27+Nz3+Fy4wKg3/xSnAsGBKwVrKPOJADwcEFCcGjsNtEzk4llp8oviaQoaWTQ==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.5.0.tgz", + "integrity": "sha512-88Lu+8OyS92A4mg0hE8AEjr8q9KmgZeR5obPGoAnCxBrptrsHHtKTQq242c+DbzuAWZzw5ZEX2dvv34PW/FmFw==", "dependencies": { "@poppinss/utils": "^5.0.0", - "@types/luxon": "^3.0.1", - "@types/validator": "^13.7.10", - "luxon": "^3.0.3", + "@types/luxon": "^3.3.1", + "@types/validator": "^13.11.1", + "luxon": "^3.4.1", "normalize-url": "^6.1.0", "tmp-cache": "^1.1.0", - "validator": "^13.7.0" + "validator": "^13.11.0" }, "peerDependencies": { "@adonisjs/application": "^5.0.0", @@ -741,19 +718,19 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -823,9 +800,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -843,9 +820,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", - "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.1.0.tgz", + "integrity": "sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ==", "funding": [ { "type": "opencollective", @@ -874,6 +851,12 @@ "@japa/runner": "^2.2.3" } }, + "node_modules/@japa/api-client/node_modules/@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + }, "node_modules/@japa/assert": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-1.4.1.tgz", @@ -913,6 +896,12 @@ "time-span": "^4.0.0" } }, + "node_modules/@japa/core/node_modules/@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + }, "node_modules/@japa/errors-printer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-2.1.0.tgz", @@ -984,55 +973,11 @@ "inclusion": "^1.0.1" } }, - "node_modules/@japa/runner/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@japa/runner/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@japa/runner/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@japa/runner/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "node_modules/@japa/runner/node_modules/@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true }, "node_modules/@japa/spec-reporter": { "version": "1.3.3", @@ -1047,9 +992,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -1073,31 +1018,6 @@ "node": ">= 8.3" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -1130,7 +1050,7 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", @@ -1139,15 +1059,6 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", @@ -1240,10 +1151,17 @@ } }, "node_modules/@poppinss/hooks": { - "version": "6.0.2-0", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", - "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", - "dev": true + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", + "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", + "peerDependencies": { + "@adonisjs/application": ">=4.0.0" + }, + "peerDependenciesMeta": { + "@adonisjs/application": { + "optional": true + } + } }, "node_modules/@poppinss/inspect": { "version": "1.0.1", @@ -1351,14 +1269,14 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" }, "node_modules/@types/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-92b6q7CSYBMVZDtMZh5PuKm3LjZwcU7s6H8e9sU20Z1tOrTuXN+Hz3VuP9E8axiQRaCoiEOMN1duqPCEIhamrQ==" }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "node_modules/@types/cookie": { @@ -1399,9 +1317,9 @@ } }, "node_modules/@types/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.0.tgz", - "integrity": "sha512-uH2smqTN4uGReAiKedIVzoLUAXIYLBTbSofhx3hbNqj74Ua6KqFsLYszduTrLCMEAEAozF73DbGi/SC1bzQq4g==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.1.tgz", + "integrity": "sha512-CdNmJMcSqX1BiP3iSsWt+VgixndRIDGzWyaGpBnW3i5heATSk5bJu2j3buutsoBQNjyryqxaNpr8M7fRsGL15w==" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", @@ -1410,9 +1328,9 @@ "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -1429,15 +1347,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", + "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -1446,9 +1364,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + "version": "20.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz", + "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==" }, "node_modules/@types/pino": { "version": "6.3.12", @@ -1480,27 +1398,27 @@ } }, "node_modules/@types/proxy-addr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.0.tgz", - "integrity": "sha512-JEm0kSrO3CjbFSLpYeYhCscS0vpW1mIWedhWuurJnYbMzY1vcm9fzJ6TL6SWq3m/m3g4KUV5JBT69mQSwUHZHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.1.tgz", + "integrity": "sha512-fLqXRu+ihH+/V7AB12siUu84uloauJ7SdBMrHARcHQN/yYIa0d9uQSYxSWnMRF0892N2/CJzPVYP3ltgtkkgsQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.8.tgz", + "integrity": "sha512-u5nwLcaENciDwebPwwZb2AM1LvdlgFQfqCKxWQxcgNsQhUQciGuUnJ2LjGFAkInY2APXQzIypiUSa9zB6Epddg==", "dev": true, "dependencies": { "source-map": "^0.6.0" } }, "node_modules/@types/superagent": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", - "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.19.tgz", + "integrity": "sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -1508,29 +1426,29 @@ } }, "node_modules/@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.1.tgz", + "integrity": "sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==", "optional": true, "dependencies": { "@types/node": "*" @@ -1764,19 +1682,6 @@ "node": ">=8" } }, - "node_modules/api-contract-validator/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/api-contract-validator/node_modules/diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -1831,18 +1736,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/api-contract-validator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/api-schema-builder": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", @@ -2032,9 +1925,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -2376,33 +2269,34 @@ } }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/change-case": { @@ -2434,10 +2328,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -2485,11 +2382,12 @@ } }, "node_modules/chromium-bidi": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.26.tgz", - "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", + "version": "0.4.28", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.28.tgz", + "integrity": "sha512-2HZ74QlAApJrEwcGlU/sUu0s4VS+FI3CJ09Toc9aE9VemMyhHZXeaROQgJKNRaYMUTUx6qIv1cLBs3F+vfgjSw==", "dependencies": { - "mitt": "3.0.1" + "mitt": "3.0.1", + "urlpattern-polyfill": "9.0.0" }, "peerDependencies": { "devtools-protocol": "*" @@ -2733,9 +2631,9 @@ } }, "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/columnify": { "version": "1.6.0", @@ -2762,10 +2660,12 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } }, "node_modules/comment-json": { "version": "2.4.2", @@ -2971,10 +2871,12 @@ "dev": true }, "node_modules/data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "engines": { + "node": ">= 14" + } }, "node_modules/dateformat": { "version": "4.6.3", @@ -3140,9 +3042,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1159816", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", - "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==" + "version": "0.0.1179426", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1179426.tgz", + "integrity": "sha512-KKC7IGwdOr7u9kTGgjUvGTov/z1s2H7oHi3zKCdR9eSDyCPia5CBi4aRhtp7d8uR7l0GS5UTDw3TjKGu5CqINg==" }, "node_modules/dezalgo": { "version": "1.0.4", @@ -3155,9 +3057,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3306,6 +3208,12 @@ "editorconfig": "bin/editorconfig" } }, + "node_modules/editorconfig/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/editorconfig/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -3855,42 +3763,31 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, "node_modules/fast-json-stable-stringify": { @@ -4000,9 +3897,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -4102,9 +3999,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", @@ -4117,9 +4014,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -4151,9 +4048,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -4203,6 +4100,12 @@ "source-map": "^0.6.1" } }, + "node_modules/get-source/node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4229,14 +4132,6 @@ "node": ">= 14" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", - "engines": { - "node": ">= 14" - } - }, "node_modules/get-uri/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -4337,6 +4232,171 @@ "node": ">=6" } }, + "node_modules/globby/node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/globby/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/globby/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/globby/node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -4346,6 +4406,19 @@ "node": ">=6" } }, + "node_modules/globby/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4473,6 +4546,30 @@ "node": ">=0.10.0" } }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -4638,11 +4735,11 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -4943,27 +5040,11 @@ } }, "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, "node_modules/is-plain-object": { @@ -5080,15 +5161,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5110,22 +5191,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5146,19 +5215,6 @@ "node": ">= 8.3" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-matcher-utils/node_modules/diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -5213,18 +5269,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -5238,6 +5282,20 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -5312,14 +5370,20 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -5432,19 +5496,6 @@ "node": ">=14.0.0" } }, - "node_modules/knex/node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "node_modules/knex/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5499,18 +5550,53 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -5567,9 +5653,9 @@ } }, "node_modules/luxon": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", - "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", "engines": { "node": ">=12" } @@ -5683,6 +5769,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/marked-terminal/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", @@ -5771,109 +5869,16 @@ } }, "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, "node_modules/mime": { @@ -6061,9 +6066,9 @@ } }, "node_modules/mysql2": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", - "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", + "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -6078,17 +6083,6 @@ "node": ">= 8.0" } }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mysql2/node_modules/lru-cache": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", @@ -6834,9 +6828,9 @@ } }, "node_modules/pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -6867,9 +6861,9 @@ } }, "node_modules/pino-pretty/node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.4.0.tgz", + "integrity": "sha512-zSe9QQW30nPzjkSJ0glFQO5T9lHsk39tz+2bAAwCj8CNgEG8ItZiX7Wb2ZgA8I04dwRGCcf1m3ABJa8AYm12Fw==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -6932,12 +6926,12 @@ } }, "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7069,30 +7063,30 @@ } }, "node_modules/puppeteer": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.2.1.tgz", - "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", + "version": "21.3.6", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.3.6.tgz", + "integrity": "sha512-ulK9+KLvdaVsG0EKbKyw/DCXCz88rsnrvIJg9tY8AmkGR01AxI4ZJTH9BJl1OE7cLfh2vxjBvY+xfvJod6rfgw==", "hasInstallScript": true, "dependencies": { "@puppeteer/browsers": "1.7.1", - "cosmiconfig": "8.3.5", - "puppeteer-core": "21.2.1" + "cosmiconfig": "8.3.6", + "puppeteer-core": "21.3.6" }, "engines": { "node": ">=16.3.0" } }, "node_modules/puppeteer-core": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.2.1.tgz", - "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", + "version": "21.3.6", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.3.6.tgz", + "integrity": "sha512-ZH6tjTdRXwW2fx5W3jBbG+yUVQdDfZW1kjfwvWwMzsnKEli5ZwV70Zp97GOebHQHrK8zM3vX5VqI9sd48c9PnQ==", "dependencies": { "@puppeteer/browsers": "1.7.1", - "chromium-bidi": "0.4.26", + "chromium-bidi": "0.4.28", "cross-fetch": "4.0.0", "debug": "4.3.4", - "devtools-protocol": "0.0.1159816", - "ws": "8.14.1" + "devtools-protocol": "0.0.1179426", + "ws": "8.14.2" }, "engines": { "node": ">=16.3.0" @@ -7104,9 +7098,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -7235,6 +7229,17 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -7406,9 +7411,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -8448,17 +8453,15 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/supports-hyperlinks": { @@ -8474,18 +8477,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -8664,14 +8655,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -8936,6 +8919,11 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, + "node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==" + }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -9018,9 +9006,9 @@ } }, "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -9071,9 +9059,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { "node": ">=10.0.0" }, @@ -9113,9 +9101,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" @@ -9156,9 +9144,9 @@ } }, "node_modules/youch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", - "integrity": "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.2.tgz", + "integrity": "sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==", "dev": true, "dependencies": { "cookie": "^0.5.0", @@ -9167,9 +9155,9 @@ } }, "node_modules/youch-terminal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.2.tgz", - "integrity": "sha512-JfVAsD0r88+vWVz+Im6bMk+c7gErDp1lq6Z1Na5LAyPZTwhB3VgO6HUQsm83I217mRFSuwVwEpnvwkK/TDTNhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.3.tgz", + "integrity": "sha512-/PE77ZwG072tXBvF47S9RL9/G80u86icZ5QwyjblyM67L4n/T5qQeM3Xrecbu8kkDDr/9T/PTj/X+6G/OSRQug==", "dev": true, "dependencies": { "kleur": "^4.1.5", @@ -9309,14 +9297,6 @@ "@poppinss/hooks": "^5.0.3", "@poppinss/utils": "^5.0.0", "luxon": "^3.0.4" - }, - "dependencies": { - "@poppinss/hooks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", - "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", - "requires": {} - } } }, "@adonisjs/bodyparser": { @@ -9554,9 +9534,9 @@ } }, "@adonisjs/lucid": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.0.tgz", - "integrity": "sha512-pSBhKFzqr6mWoeIiGdcW2OQIWAyCoLn+G7VmXXLqxHvGm+9SaioKJaSMmaJa0xgS5v64r/MVLeH/nw87Q4KpyQ==", + "version": "18.4.2", + "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.2.tgz", + "integrity": "sha512-4k8GOat/YQtobNqwBIU8VAuY19p+V3ucBRoZ+iwxd/qy/KE1XupPzuMZVWYt1vyBboCrBmEYYmvC851tNqoP0A==", "requires": { "@faker-js/faker": "^8.0.1", "@poppinss/hooks": "^5.0.3", @@ -9571,14 +9551,6 @@ "qs": "^6.11.2", "slash": "^3.0.0", "tarn": "^3.0.2" - }, - "dependencies": { - "@poppinss/hooks": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", - "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", - "requires": {} - } } }, "@adonisjs/profiler": { @@ -9697,17 +9669,17 @@ } }, "@adonisjs/validator": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.4.2.tgz", - "integrity": "sha512-rEbZ2WUWywjffb8Aes6eKpoTb27+Nz3+Fy4wKg3/xSnAsGBKwVrKPOJADwcEFCcGjsNtEzk4llp8oviaQoaWTQ==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.5.0.tgz", + "integrity": "sha512-88Lu+8OyS92A4mg0hE8AEjr8q9KmgZeR5obPGoAnCxBrptrsHHtKTQq242c+DbzuAWZzw5ZEX2dvv34PW/FmFw==", "requires": { "@poppinss/utils": "^5.0.0", - "@types/luxon": "^3.0.1", - "@types/validator": "^13.7.10", - "luxon": "^3.0.3", + "@types/luxon": "^3.3.1", + "@types/validator": "^13.11.1", + "luxon": "^3.4.1", "normalize-url": "^6.1.0", "tmp-cache": "^1.1.0", - "validator": "^13.7.0" + "validator": "^13.11.0" } }, "@adonisjs/view": { @@ -9822,16 +9794,16 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "requires": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -9888,9 +9860,9 @@ } }, "@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -9902,9 +9874,9 @@ "optional": true }, "@faker-js/faker": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", - "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==" + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.1.0.tgz", + "integrity": "sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ==" }, "@japa/api-client": { "version": "1.4.4", @@ -9918,6 +9890,14 @@ "macroable": "^7.0.2", "set-cookie-parser": "^2.5.1", "superagent": "^8.0.9" + }, + "dependencies": { + "@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + } } }, "@japa/assert": { @@ -9954,6 +9934,14 @@ "emittery": "^0.13.1", "macroable": "^7.0.2", "time-span": "^4.0.0" + }, + "dependencies": { + "@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + } } }, "@japa/errors-printer": { @@ -10019,43 +10007,11 @@ "inclusion": "^1.0.1" }, "dependencies": { - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } } } }, @@ -10072,9 +10028,9 @@ } }, "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { "@sinclair/typebox": "^0.27.8" @@ -10090,27 +10046,6 @@ "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^15.0.0", "chalk": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "@jsdevtools/ono": { @@ -10137,20 +10072,12 @@ "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - } } }, "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { @@ -10235,10 +10162,10 @@ } }, "@poppinss/hooks": { - "version": "6.0.2-0", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", - "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", - "dev": true + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-5.0.3.tgz", + "integrity": "sha512-M5a151VUl+RslVP5qwDW+u+0VmzKt5Nfplzdx2nrtXol3yVlLN3u2Jp6UADESid3DDI7IRHmFrA3sQusey3eUA==", + "requires": {} }, "@poppinss/inspect": { "version": "1.0.1", @@ -10337,14 +10264,14 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" }, "@types/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-92b6q7CSYBMVZDtMZh5PuKm3LjZwcU7s6H8e9sU20Z1tOrTuXN+Hz3VuP9E8axiQRaCoiEOMN1duqPCEIhamrQ==" }, "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "@types/cookie": { @@ -10385,9 +10312,9 @@ } }, "@types/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.0.tgz", - "integrity": "sha512-uH2smqTN4uGReAiKedIVzoLUAXIYLBTbSofhx3hbNqj74Ua6KqFsLYszduTrLCMEAEAozF73DbGi/SC1bzQq4g==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.1.tgz", + "integrity": "sha512-CdNmJMcSqX1BiP3iSsWt+VgixndRIDGzWyaGpBnW3i5heATSk5bJu2j3buutsoBQNjyryqxaNpr8M7fRsGL15w==" }, "@types/istanbul-lib-coverage": { "version": "2.0.4", @@ -10396,9 +10323,9 @@ "dev": true }, "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" @@ -10415,15 +10342,15 @@ } }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", + "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==" }, "@types/minimatch": { "version": "5.1.2", @@ -10432,9 +10359,9 @@ "dev": true }, "@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + "version": "20.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz", + "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==" }, "@types/pino": { "version": "6.3.12", @@ -10464,27 +10391,27 @@ } }, "@types/proxy-addr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.0.tgz", - "integrity": "sha512-JEm0kSrO3CjbFSLpYeYhCscS0vpW1mIWedhWuurJnYbMzY1vcm9fzJ6TL6SWq3m/m3g4KUV5JBT69mQSwUHZHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.1.tgz", + "integrity": "sha512-fLqXRu+ihH+/V7AB12siUu84uloauJ7SdBMrHARcHQN/yYIa0d9uQSYxSWnMRF0892N2/CJzPVYP3ltgtkkgsQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.8.tgz", + "integrity": "sha512-u5nwLcaENciDwebPwwZb2AM1LvdlgFQfqCKxWQxcgNsQhUQciGuUnJ2LjGFAkInY2APXQzIypiUSa9zB6Epddg==", "dev": true, "requires": { "source-map": "^0.6.0" } }, "@types/superagent": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", - "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.19.tgz", + "integrity": "sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==", "dev": true, "requires": { "@types/cookiejar": "*", @@ -10492,29 +10419,29 @@ } }, "@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.1.tgz", + "integrity": "sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==", "optional": true, "requires": { "@types/node": "*" @@ -10676,16 +10603,6 @@ "uri-js": "^4.4.1" }, "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -10727,15 +10644,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -10880,9 +10788,9 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -11143,25 +11051,29 @@ } }, "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "requires": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" } }, "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, "change-case": { "version": "4.1.2", @@ -11189,10 +11101,13 @@ "dev": true }, "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } }, "child_process": { "version": "1.0.2", @@ -11225,11 +11140,12 @@ } }, "chromium-bidi": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.26.tgz", - "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", + "version": "0.4.28", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.28.tgz", + "integrity": "sha512-2HZ74QlAApJrEwcGlU/sUu0s4VS+FI3CJ09Toc9aE9VemMyhHZXeaROQgJKNRaYMUTUx6qIv1cLBs3F+vfgjSw==", "requires": { - "mitt": "3.0.1" + "mitt": "3.0.1", + "urlpattern-polyfill": "9.0.0" } }, "class-utils": { @@ -11413,9 +11329,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "columnify": { "version": "1.6.0", @@ -11436,10 +11352,9 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" }, "comment-json": { "version": "2.4.2", @@ -11607,10 +11522,9 @@ "dev": true }, "data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==" }, "dateformat": { "version": "4.6.3", @@ -11729,9 +11643,9 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.1159816", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", - "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==" + "version": "0.0.1179426", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1179426.tgz", + "integrity": "sha512-KKC7IGwdOr7u9kTGgjUvGTov/z1s2H7oHi3zKCdR9eSDyCPia5CBi4aRhtp7d8uR7l0GS5UTDw3TjKGu5CqINg==" }, "dezalgo": { "version": "1.0.4", @@ -11744,9 +11658,9 @@ } }, "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "dir-glob": { @@ -11888,6 +11802,12 @@ "sigmund": "^1.0.1" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -12293,38 +12213,25 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "dependencies": { "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } } } @@ -12412,9 +12319,9 @@ "integrity": "sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==" }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" }, "for-in": { "version": "1.0.2", @@ -12479,9 +12386,9 @@ } }, "fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "fs-readdir-recursive": { "version": "1.1.0", @@ -12494,9 +12401,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "optional": true }, "function-bind": { @@ -12518,9 +12425,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true }, "get-intrinsic": { @@ -12553,6 +12460,14 @@ "requires": { "data-uri-to-buffer": "^2.0.0", "source-map": "^0.6.1" + }, + "dependencies": { + "data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + } } }, "get-stream": { @@ -12572,11 +12487,6 @@ "fs-extra": "^8.1.0" }, "dependencies": { - "data-uri-to-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==" - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -12658,11 +12568,161 @@ "slash": "^2.0.0" }, "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -12758,6 +12818,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -12891,11 +12971,11 @@ "dev": true }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ieee754": { @@ -13108,24 +13188,9 @@ } }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-plain-object": { "version": "2.0.4", @@ -13219,15 +13284,15 @@ } }, "jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "dependencies": { "chalk": { @@ -13239,22 +13304,13 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-matcher-utils": { @@ -13269,16 +13325,6 @@ "pretty-format": "^25.5.0" }, "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -13320,15 +13366,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -13340,6 +13377,16 @@ "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "joycon": { @@ -13405,14 +13452,20 @@ } }, "jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "requires": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" } }, "junk": { @@ -13469,18 +13522,6 @@ "resolve-from": "^5.0.0", "tarn": "^3.0.2", "tildify": "2.0.0" - }, - "dependencies": { - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" - } } }, "knex-dynamic-connection": { @@ -13534,18 +13575,53 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -13596,9 +13672,9 @@ } }, "luxon": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", - "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==" }, "macroable": { "version": "7.0.2", @@ -13675,6 +13751,12 @@ "type-fest": "^3.0.0" } }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, "type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", @@ -13741,94 +13823,13 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -13973,9 +13974,9 @@ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, "mysql2": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", - "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", + "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -13987,14 +13988,6 @@ "sqlstring": "^2.3.2" }, "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, "lru-cache": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", @@ -14577,9 +14570,9 @@ } }, "pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", "requires": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -14607,9 +14600,9 @@ }, "dependencies": { "sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.4.0.tgz", + "integrity": "sha512-zSe9QQW30nPzjkSJ0glFQO5T9lHsk39tz+2bAAwCj8CNgEG8ItZiX7Wb2ZgA8I04dwRGCcf1m3ABJa8AYm12Fw==", "requires": { "atomic-sleep": "^1.0.0" } @@ -14648,12 +14641,12 @@ "dev": true }, "pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -14759,13 +14752,13 @@ "dev": true }, "puppeteer": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.2.1.tgz", - "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", + "version": "21.3.6", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.3.6.tgz", + "integrity": "sha512-ulK9+KLvdaVsG0EKbKyw/DCXCz88rsnrvIJg9tY8AmkGR01AxI4ZJTH9BJl1OE7cLfh2vxjBvY+xfvJod6rfgw==", "requires": { "@puppeteer/browsers": "1.7.1", - "cosmiconfig": "8.3.5", - "puppeteer-core": "21.2.1" + "cosmiconfig": "8.3.6", + "puppeteer-core": "21.3.6" }, "dependencies": { "argparse": { @@ -14774,9 +14767,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "requires": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -14807,16 +14800,16 @@ } }, "puppeteer-core": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.2.1.tgz", - "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", + "version": "21.3.6", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.3.6.tgz", + "integrity": "sha512-ZH6tjTdRXwW2fx5W3jBbG+yUVQdDfZW1kjfwvWwMzsnKEli5ZwV70Zp97GOebHQHrK8zM3vX5VqI9sd48c9PnQ==", "requires": { "@puppeteer/browsers": "1.7.1", - "chromium-bidi": "0.4.26", + "chromium-bidi": "0.4.28", "cross-fetch": "4.0.0", "debug": "4.3.4", - "devtools-protocol": "0.0.1159816", - "ws": "8.14.1" + "devtools-protocol": "0.0.1179426", + "ws": "8.14.2" } }, "qs": { @@ -14862,6 +14855,16 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "rc": { @@ -14999,9 +15002,9 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -15803,9 +15806,10 @@ } }, "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -15818,17 +15822,6 @@ "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "supports-preserve-symlinks-flag": { @@ -15966,13 +15959,6 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - } } }, "toidentifier": { @@ -16172,6 +16158,11 @@ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "dev": true }, + "urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -16247,9 +16238,9 @@ } }, "whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "whatwg-url": { "version": "5.0.0", @@ -16291,9 +16282,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "requires": {} }, "xmlhttprequest-ssl": { @@ -16313,9 +16304,9 @@ "dev": true }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true }, "yargs": { @@ -16347,9 +16338,9 @@ } }, "youch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", - "integrity": "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.2.tgz", + "integrity": "sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==", "dev": true, "requires": { "cookie": "^0.5.0", @@ -16358,9 +16349,9 @@ } }, "youch-terminal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.2.tgz", - "integrity": "sha512-JfVAsD0r88+vWVz+Im6bMk+c7gErDp1lq6Z1Na5LAyPZTwhB3VgO6HUQsm83I217mRFSuwVwEpnvwkK/TDTNhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.3.tgz", + "integrity": "sha512-/PE77ZwG072tXBvF47S9RL9/G80u86icZ5QwyjblyM67L4n/T5qQeM3Xrecbu8kkDDr/9T/PTj/X+6G/OSRQug==", "dev": true, "requires": { "kleur": "^4.1.5", From a90dfeee13d199435c96ccdb6fea02010de3edeb Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 10:50:16 +0700 Subject: [PATCH 224/298] add middleware writeLog --- app/Middleware/Logger.ts | 14 ++++++ app/store/logs/20230912-test-code.log | 37 -------------- app/store/logs/20230918-TESTLOG.log | 7 --- app/store/logs/20230919-TEST.log | 8 ---- app/utils/Logger.ts | 59 +++++++++++++++++++++++ start/kernel.ts | 1 + start/routes.ts | 69 +++++++++++++++++---------- 7 files changed, 119 insertions(+), 76 deletions(-) create mode 100644 app/Middleware/Logger.ts delete mode 100644 app/store/logs/20230912-test-code.log delete mode 100644 app/store/logs/20230918-TESTLOG.log delete mode 100644 app/store/logs/20230919-TEST.log create mode 100644 app/utils/Logger.ts diff --git a/app/Middleware/Logger.ts b/app/Middleware/Logger.ts new file mode 100644 index 0000000..e9cfd2d --- /dev/null +++ b/app/Middleware/Logger.ts @@ -0,0 +1,14 @@ +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 + ) { + // code for middleware goes here. ABOVE THE NEXT CALL + await next(); + + loggerAPI(request, response, request.url()); + } +} diff --git a/app/store/logs/20230912-test-code.log b/app/store/logs/20230912-test-code.log deleted file mode 100644 index 8036394..0000000 --- a/app/store/logs/20230912-test-code.log +++ /dev/null @@ -1,37 +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 -dfgkfdjkhlfdhkhjjkhjgf -sdfsd DM3- hui 800G2-POE- -123 PVDM3- hui 800G2-POE-2 -800G2-POE-2 -anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl -800G2-POE-2 -anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl -800G2-POE-2 -anfasll ak shflks as klhfalk la EHWIC- fsjklfjkl -800G2-POE-2 -800G2-POE-2 \ No newline at end of file diff --git a/app/store/logs/20230918-TESTLOG.log b/app/store/logs/20230918-TESTLOG.log deleted file mode 100644 index 7b38ffb..0000000 --- a/app/store/logs/20230918-TESTLOG.log +++ /dev/null @@ -1,7 +0,0 @@ -adfasf -anfasll ak shflks as klhfalk la EHWIC- fsjl -123 PVDM3- hui 800G2-POE-2 -sdhgksd sjk hk error -abc 123 fail -abc 123 fail -sdhgksd sjk hk error \ No newline at end of file diff --git a/app/store/logs/20230919-TEST.log b/app/store/logs/20230919-TEST.log deleted file mode 100644 index 8483dc6..0000000 --- a/app/store/logs/20230919-TEST.log +++ /dev/null @@ -1,8 +0,0 @@ -adfasf -anfasll ak shflks as klhfalk la EHWIC- fsjl -123 PVDM3- hui 800G2-POE-2 -sdhgksd sjk hk error -abc 123 fail -abc 123 fail -sdhgksd sjk hk error -123 PVDM3- hui 800G2-POE-2 \ No newline at end of file diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts new file mode 100644 index 0000000..95426cf --- /dev/null +++ b/app/utils/Logger.ts @@ -0,0 +1,59 @@ +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); + } + } + } + + return obj; + } + +export function loggerAPI(request, response, location) { + let old_data = ""; + let body = shortenStringsInObject(response.getBody(), 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") + + "] - " + + response.getStatus() + + " - " + + location + + "\n------------PAYLOAD-----------\n" + + JSON.stringify(request.all()) + + "\n--------------DATA-------------\n" + + JSON.stringify(body) + + "\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) { + response.status(500).send("CAN'T WRITE LOG"); + } + } \ No newline at end of file diff --git a/start/kernel.ts b/start/kernel.ts index 72bd5c2..84823b8 100644 --- a/start/kernel.ts +++ b/start/kernel.ts @@ -41,4 +41,5 @@ Server.middleware.register([ */ Server.middleware.registerNamed({ checkToken: () => import('App/Middleware/CheckToken'), + writeLog: () => import('App/Middleware/Logger') }) diff --git a/start/routes.ts b/start/routes.ts index cd99fe5..275aae3 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -198,29 +198,32 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); // }, 2000); //ERP get index serial number + Route.post( "/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber" -).middleware("checkToken"); +).middleware("checkToken").middleware("writeLog"); + Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware( "checkToken" -); +).middleware("writeLog"); //Users -Route.post("/api/account/createUser", "UsersController.create"); -Route.post("/api/account/checkLogin", "UsersController.checkLogin"); +Route.post("/api/account/createUser", "UsersController.create").middleware("writeLog"); + +Route.post("/api/account/checkLogin", "UsersController.checkLogin").middleware("writeLog"); //Log -Route.get("/api/log/showLog/:name?", "LogsController.showLog"); +Route.get("/api/log/showLog/:name?", "LogsController.showLog").middleware("writeLog"); -Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect"); +Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect").middleware("writeLog"); //Key-Value -Route.post("/api/getKeyValue", "ValuesController.getKeyValue"); +Route.post("/api/getKeyValue", "ValuesController.getKeyValue").middleware("writeLog"); -Route.post("/api/deleteValue", "ValuesController.destroy"); +Route.post("/api/deleteValue", "ValuesController.destroy").middleware("writeLog"); -Route.post("/api/addValue", "ValuesController.create"); +Route.post("/api/addValue", "ValuesController.create").middleware("writeLog"); Route.post("/api/backupProduct", async ({ request, response }) => { try { @@ -228,25 +231,43 @@ Route.post("/api/backupProduct", async ({ request, response }) => { const res = await axios.post( "https://logs.danielvu.com/api/getIndexSerialNumber", { from: date, to: date }, - { headers: { Authorization: request.headers().authorization?.replace(/"/g, "") } } + { + headers: { + Authorization: request.headers().authorization?.replace(/"/g, ""), + }, + } ); - res.data.map((obj, index)=>{ + res.data.map((obj, index) => { res.data[index] = { - PID:res.data[index].PID, - SN:res.data[index].SN, - VID:res.data[index].VID, - line:res.data[index].line.join(","), - file:res.data[index].fileName, - warehouse:res.data[index].warehouse - } - }) - const addProduct = await Product.createMany(res.data) + PID: res.data[index].PID, + SN: res.data[index].SN, + VID: res.data[index].VID, + line: res.data[index].line.join(","), + file: res.data[index].fileName, + warehouse: res.data[index].warehouse, + }; + }); + const addProduct = await Product.createMany(res.data); // console.log(addProduct) - response.status(200).send("Add "+res.data.length+" success!"); - await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product "+date+" success with "+res.data.length+" products") + response.status(200).send("Add " + res.data.length + " success!"); + await sendMessToZulip( + "stream", + "networkToolBot", + "Log service", + "Backup product " + + date + + " success with " + + res.data.length + + " products" + ); } catch (error) { response.status(500).send(error); - await sendMessToZulip("stream", "networkToolBot", "Log service", "Backup product fail. Please check!") + await sendMessToZulip( + "stream", + "networkToolBot", + "Log service", + "Backup product fail. Please check!" + ); } -}); +}).middleware("writeLog"); From aa0249eb282e8aba599720f7a523bcf0b2a56d25 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:07:07 +0700 Subject: [PATCH 225/298] add middleware writeLog --- app/utils/Logger.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index 95426cf..87b9a64 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -16,6 +16,11 @@ const shortenStringsInObject = (obj, maxLength) => { // Rút ngắn chuỗi lại maxLength ký tự obj[key] = obj[key].substring(0, maxLength); } + + if (Array.isArray(obj[key]) && obj[key].length > 20) { + // Rút ngắn chuỗi lại maxLength ký tự + obj[key] = obj[key].slice(0,20) + } } } From 47fcdd32196be8236f2544cd356ce0bd351a9c24 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:10:03 +0700 Subject: [PATCH 226/298] add middleware writeLog --- app/utils/Logger.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index 87b9a64..dd9e617 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -17,9 +17,9 @@ const shortenStringsInObject = (obj, maxLength) => { obj[key] = obj[key].substring(0, maxLength); } - if (Array.isArray(obj[key]) && obj[key].length > 20) { + if (Array.isArray(obj[key]) && obj[key].length > 10) { // Rút ngắn chuỗi lại maxLength ký tự - obj[key] = obj[key].slice(0,20) + obj[key] = "[Array:"+obj[key].length+"]" } } } From bc19538431930591674e6790abb0bebd3b099c90 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:12:56 +0700 Subject: [PATCH 227/298] add middleware writeLog --- app/utils/Logger.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index dd9e617..e9d5c3b 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -16,14 +16,15 @@ const shortenStringsInObject = (obj, maxLength) => { // Rút ngắn chuỗi lại maxLength ký tự obj[key] = obj[key].substring(0, maxLength); } - - if (Array.isArray(obj[key]) && obj[key].length > 10) { - // Rút ngắn chuỗi lại maxLength ký tự - obj[key] = "[Array:"+obj[key].length+"]" - } } } + + 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; } From fe6ef901b8393122aa988daf6d3a31fc9bec1bd4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:19:36 +0700 Subject: [PATCH 228/298] add middleware writeLog --- app/utils/Logger.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index e9d5c3b..1fc4861 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -24,7 +24,7 @@ const shortenStringsInObject = (obj, maxLength) => { // Rút ngắn chuỗi lại maxLength ký tự obj = "[Array:"+obj.length+"]\n"+obj.slice(0,15) } - + return obj; } @@ -44,11 +44,15 @@ export function loggerAPI(request, response, location) { response.getStatus() + " - " + location + - "\n------------PAYLOAD-----------\n" + + "\n------PAYLOAD------\n" + JSON.stringify(request.all()) + - "\n--------------DATA-------------\n" + + "\n-------DATA--------\n" + JSON.stringify(body) + - "\n-------------------------------"; + "\n-------HEADERS--------\n" + + JSON.stringify(request.headers()) + + "\n-------PARAMS--------\n" + + JSON.stringify(request.params()) + + "\n\n======================================================================\n======================================================================"; fs.exists(fileName, async (exists) => { if (exists) { From 920053844780903a39b3bf37a60b103f85c8a813 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:23:02 +0700 Subject: [PATCH 229/298] add middleware writeLog --- app/utils/Logger.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index 1fc4861..0aadc88 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -45,13 +45,13 @@ export function loggerAPI(request, response, location) { " - " + location + "\n------PAYLOAD------\n" + - JSON.stringify(request.all()) + + JSON.stringify(request.all(), null, 2) + "\n-------DATA--------\n" + - JSON.stringify(body) + + JSON.stringify(body, null, 2) + "\n-------HEADERS--------\n" + - JSON.stringify(request.headers()) + + JSON.stringify(request.headers(), null, 2) + "\n-------PARAMS--------\n" + - JSON.stringify(request.params()) + + JSON.stringify(request.params(), null, 2) + "\n\n======================================================================\n======================================================================"; fs.exists(fileName, async (exists) => { From b544f588a6f4cc400cdc3ccf58d2ee31fef72021 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 11:29:44 +0700 Subject: [PATCH 230/298] add middleware writeLog --- app/utils/Logger.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index 0aadc88..fe756b2 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -46,13 +46,13 @@ export function loggerAPI(request, response, location) { location + "\n------PAYLOAD------\n" + JSON.stringify(request.all(), null, 2) + - "\n-------DATA--------\n" + - JSON.stringify(body, null, 2) + - "\n-------HEADERS--------\n" + - JSON.stringify(request.headers(), null, 2) + - "\n-------PARAMS--------\n" + + "\n------PARAMS-------\n" + JSON.stringify(request.params(), null, 2) + - "\n\n======================================================================\n======================================================================"; + "\n-----RESPONSE------\n" + + JSON.stringify(body, null, 2) + + "\n------HEADERS------\n" + + JSON.stringify(request.headers(), null, 2) + + "\n\n======================================================================"; fs.exists(fileName, async (exists) => { if (exists) { From cb2cd65e1302a2419f2ad8b0ff517a75a7d8d55e Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 13:23:28 +0700 Subject: [PATCH 231/298] add middleware writeLog --- app/Controllers/Http/ErpsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 5686c1a..7bb01bd 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -109,7 +109,7 @@ export default class ErpsController { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" + SN !== "N/A" && SN !== "NA" && SN.length>4 ) { if (output.some((u) => u.SN === SN)) { output.map((u, index) => { From c53e40cacceb8dce2617a901ef867254311dd089 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 13:34:54 +0700 Subject: [PATCH 232/298] add middleware writeLog --- app/Controllers/Http/ErpsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index 7bb01bd..ff870c7 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -283,7 +283,7 @@ export default class ErpsController { ); // console.log(report); return report.filter( - (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !=="" + (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !=="" && SN!=="NA" ); // }, 15000); } catch (error) { From 64a2fa5a54bd1d127586a50534603e9dc42d3b39 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 14:09:39 +0700 Subject: [PATCH 233/298] add middleware writeLog --- app/utils/checkIndexSN.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index a4b677c..7234818 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -23,7 +23,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" && + SN !== "N/A" && SN.length>4 && i >= beginLine ) { if (output.some((u) => u.SN === SN)) { From bddb56f41ff4cd08adc6d517777530f090cde49c Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 15:11:15 +0700 Subject: [PATCH 234/298] add middleware writeLog --- app/utils/Logger.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index fe756b2..262b0dc 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -30,7 +30,8 @@ const shortenStringsInObject = (obj, maxLength) => { export function loggerAPI(request, response, location) { let old_data = ""; - let body = shortenStringsInObject(response.getBody(), 300) + let resBody = response.getBody() + let body = shortenStringsInObject(resBody, 300) try { const fileName = "./app/store/logsAPI/" + From cb9a7643d2ad6e6861b2084fad1d3200518ae5e0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 15:17:58 +0700 Subject: [PATCH 235/298] add middleware writeLog --- app/Middleware/Logger.ts | 5 +- app/store/logsAPI/29_09_2023.log | 84 ++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 app/store/logsAPI/29_09_2023.log diff --git a/app/Middleware/Logger.ts b/app/Middleware/Logger.ts index e9cfd2d..21fbc18 100644 --- a/app/Middleware/Logger.ts +++ b/app/Middleware/Logger.ts @@ -8,7 +8,8 @@ export default class Logger { ) { // code for middleware goes here. ABOVE THE NEXT CALL await next(); - - loggerAPI(request, response, request.url()); + let a = request, + let b = response + loggerAPI(a, b, request.url()); } } diff --git a/app/store/logsAPI/29_09_2023.log b/app/store/logsAPI/29_09_2023.log new file mode 100644 index 0000000..2e03e88 --- /dev/null +++ b/app/store/logsAPI/29_09_2023.log @@ -0,0 +1,84 @@ + + +[29/9/23-15:15:28] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "line": 1128, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "content-length": "98", + "accept-encoding": "gzip, deflate, br", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "host": "localhost:3333", + "connection": "close" +} + +====================================================================== + +[29/9/23-15:15:45] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "line": 1128, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "content-length": "98", + "accept-encoding": "gzip, deflate, br", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGJ4MHlqMDAwMG9vbmEzZTRkZDJzcSIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.UQ0lXBkz2MInbMKzqt2diepk3Da7CDS2fAYbUhJx7-Q; cln4bx0yj0000oona3e4dd2sq=e%3A1CWpFAPcV7y9-qpYpR359aUP8iQOnnBbf6JOIHjmJfLEeBmWUvdREsDpC8jyvK4t3brnP17YkPFLHUW4LSBtnA.ekxkNk5ueDJJbGFXNW5EQQ.kOlFj953FhJ9XqkeZJkmVKp10HwXtubgZMfAlIjT-ug", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "host": "localhost:3333", + "connection": "close" +} + +====================================================================== + +[29/9/23-15:15:47] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "line": 1128, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "content-length": "98", + "accept-encoding": "gzip, deflate, br", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGJ4MHlqMDAwMG9vbmEzZTRkZDJzcSIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.UQ0lXBkz2MInbMKzqt2diepk3Da7CDS2fAYbUhJx7-Q; cln4bx0yj0000oona3e4dd2sq=e%3AukqpM6Tq1-oRkCAInVYicUmDIkpFoB21opHGGfMRRPyv8xPVhPdwIyET7i4inDrkdji2GAC5p8Dm27ULMYFOsw.OWNvbnk5Y0ZwYzU5bWhTQg.qxI-LCelxLU07qTGDcNcYih7qCg0t54VmpNgy4fdO3c", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "host": "localhost:3333", + "connection": "close" +} + +====================================================================== \ No newline at end of file From 10195fc7a64ab5b469ff142b2f728a6f8df5dae0 Mon Sep 17 00:00:00 2001 From: Joseph Le Date: Fri, 29 Sep 2023 18:19:03 +1000 Subject: [PATCH 236/298] abc --- app/store/logsAPI/29_09_2023.log | 2906 ++++++++++++++++++++++++++++++ 1 file changed, 2906 insertions(+) create mode 100644 app/store/logsAPI/29_09_2023.log diff --git a/app/store/logsAPI/29_09_2023.log b/app/store/logsAPI/29_09_2023.log new file mode 100644 index 0000000..4d2589c --- /dev/null +++ b/app/store/logsAPI/29_09_2023.log @@ -0,0 +1,2906 @@ + + +[29/9/23-14:31:51] - 200 - /api/getKeyValue +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:69]\n[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.90, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "0", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e17fb8c93bb430-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "origin": "https://logs.danielvu.com", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare" +} + +====================================================================== + +[29/9/23-14:31:54] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1547]\n20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.1.log,20230929-TEST01-Session.Port13-13-172.16.20.1.log,20230929-HELEN1-Session.AU-1-Port8-10-wh.ipsupply.com.au.log,20230929-HELEN1-Session.AU-1-2911TS-wh.ipsupply.com.au.log,20230929-HAIPC-Session.Port8-10-172.16.20.1.log,20230929-TEST01-Session.Port16-16-172.16.20.1.log,20230929-TEST01-Session.TS_2911TS-172.16.20.1.log,20230929-TEST01-Session.Port16-16-172.16.20.7.log,20230929-HELEN1-Session.AU-Port16-16-wh.ipsupply.com.au.log,20230929-TEST01-Session.Port5-7-172.16.20.7.log,20230929-TEST01-Session.Port3-5-172.16.20.7.log,20230929-TEST01-Session.Port1-3-172.16.20.7.log,20230929-TEST01-Session.Port6-8-172.16.20.7.log,20230929-TEST01-Session.Port4-6-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.90, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e17fc92937b430-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDN4bHUxMDAwMG10NzE1OWVkNWRuYyIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.-SChCWHyfdZRQssgCe3oJa6xcFrL5bYr816LOt43y6Q; cln43xlu10000mt7159ed5dnc=e%3A_fDq7I9ZM6l-xqPDFOxjYqmaF2Fiqq1LlOwPP4cFccoKuO2lBOBqwVDZBHgQZbNHfAppV6abXjPZys0QfL5K9A.b0htOHdxVlpOeHJWSWxMdw._ts4dwVtzWY_o8kJVSzPK1c4uiG468qpwx4avm0cwrA" +} + +====================================================================== + +[29/9/23-14:31:56] - 200 - /api/log/showLog/20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "", + "contentFile": "1|-|$ ========= 20230929 - HAIPC - Start recording -- Session TS_2911TS (Host 172.16.20.1) -- 29/09/2023 - 11:21:08 =========\r\n2|-|$ \r\n3|-|$ $$$$$$\\ $$$$$$$\\ $$$$$$\\ $$\\ $$\\ $$$$$$$\\ $$$$$$$\\ $$\\ $$\\ $$\\ \r\n4|-|$ \\_$$ _|$$ __$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\ $$ __$$\\ $" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.90, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e17fd80e0cb430-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDN4bHUxMDAwMG10NzE1OWVkNWRuYyIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.-SChCWHyfdZRQssgCe3oJa6xcFrL5bYr816LOt43y6Q; cln43xlu10000mt7159ed5dnc=e%3AJDVEmGT4bDAD3XUfTZS-30sCMmEusx6zoG73DkliolHFRlNGQqbTplaKQuENY5hekXLbqk4mgTzou-zGDYp_yQ.RThqZmlXeWhTTnQ3VUt0cw.R7uVGqHdbMoMIIZRet1KHuRjPTzRKS7xX4ecCJXOZuU" +} + +====================================================================== + +[29/9/23-15:35:49] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20221111-HELEN1-Session.US-4-6-127.0.0.1.log", + "range": 100, + "line": 69 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20221111 - HELEN1 - Start recording -- Session US-4-6 (Host 127.0.0.1) -- 11/11/2022 - 03:22:26 =========\r\n$ \r\n$ User:admin\r\n$ Password:********\r\n$ (Cisco Controller) >show inv\r\n$ \r\n$ Incorrect usage. Use the '?' or key to list commands.\r\n$ \r\n$ (Cisco Controller) >show in" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.5, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "81", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1dcbf5ce0a7f6-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:35:49] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20221110-PHUONGG-Session.US-4-6-192.168.5.7.log", + "range": 100, + "line": 24 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20221110 - PHUONGG - Start recording -- Session US-4-6 (Host 192.168.5.7) -- 10/11/2022 - 13:50:18 =========\r\n$ ========= 20221110 - PHUONGG - End recording -- Session US-4-6 (Host 192.168.5.7) -- 10/11/2022 - 13:50:18 =========\r\n$ ========= 20221110 - PHUONGG - Start recording -- Ses" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.136, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1dcd78a79a94a-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:35:49] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20221111-HELEN1-Session.US-4-6-127.0.0.1.log", + "range": 100, + "line": 16 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20221111 - HELEN1 - Start recording -- Session US-4-6 (Host 127.0.0.1) -- 11/11/2022 - 03:22:26 =========\r\n$ \r\n$ User:admin\r\n$ Password:********\r\n$ (Cisco Controller) >show inv\r\n$ \r\n$ Incorrect usage. Use the '?' or key to list commands.\r\n$ \r\n$ (Cisco Controller) >show in" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.127, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "81", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1dcd08948a874-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:26] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-SAMBA-US1.log", + "range": 100, + "line": 569 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "\rStartTest\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\nSwitch#\r\nSwitch#\u0007\u0007\r\nSwitch#en\r\nSwitch#terminal length 0\r\nSwitch#sh inventory\r\nNAME: \"c92xx Stack\", DESCR: \"c92xx Stack\"\r\nPID: C9200-24P-A , VID: V01 , SN: JAD23230GGU\r\n\r\nNAME: \"Switch 1\", DESCR: \"C9200-" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.87, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea0b2d88aae7-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:28] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-SAMBA-US1.log", + "range": 100, + "line": 134 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "\r\n\r\n*Mar 14 18:22:25.858: %CRYPTO_ENGINE-5-KEY_ADDITION: A key named TP-self-signed-1050565428 has been generated or imported by crypto-engine\r\n*Mar 14 18:22:25.862: %SSH-5-ENABLED: SSH 1.99 has been enabled\r\n*Mar 14 18:22:25.989: %PKI-4-NOCONFIGAUTOSAVE: Configuration was modified. Issue \"write me" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 108.162.250.150, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea1a59fe6a51-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:31] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-SAMBA-US1.log", + "range": 100, + "line": 48 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 1 US 1\nspawn telnet 192.168.5.7 2323\r\nclear line 3\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n111-1921TS-111#clear line 3\r\n[confirm]\r\n [OK]\r\n111-1921TS-111#\r\n111-1921TS-111#clear line 3\r\n[confirm]\r\n [OK]\r\n111-1921TS-111#\r\n111-1921TS-111#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.137, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "59", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea29ba31a979-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:33] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-SAMBA-US1.log", + "range": 100, + "line": 569 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "\rStartTest\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\nSwitch#\r\nSwitch#\u0007\u0007\r\nSwitch#en\r\nSwitch#terminal length 0\r\nSwitch#sh inventory\r\nNAME: \"c92xx Stack\", DESCR: \"c92xx Stack\"\r\nPID: C9200-24P-A , VID: V01 , SN: JAD23230GGU\r\n\r\nNAME: \"Switch 1\", DESCR: \"C9200-" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.99, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea36aaad5c0d-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:36] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-HELEN1-Session.US-1-3-127.0.0.1.log", + "range": 100, + "line": 96 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230315 - HELEN1 - Start recording -- Session US-1-3 (Host 127.0.0.1) -- 15/03/2023 - 04:22:15 =========\r\n$ \r\n$ Switch>\r\n$ Switch>en\r\n$ Switch#sh inv\r\n$ NAME: \"c92xx Stack\", DESCR: \"c92xx Stack\"\r\n$ PID: C9200-24P-A , VID: V01 , SN: JAD23230GGU\r\n$ \r\n$ NAME: \"Switch 1\", DE" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.55, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "81", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea4ba875aabb-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:37] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230315-HELEN1-Session.US-1-3-127.0.0.1.log", + "range": 100, + "line": 10 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230315 - HELEN1 - Start recording -- Session US-1-3 (Host 127.0.0.1) -- 15/03/2023 - 04:22:15 =========\r\n$ \r\n$ Switch>\r\n$ Switch>en\r\n$ Switch#sh inv\r\n$ NAME: \"c92xx Stack\", DESCR: \"c92xx Stack\"\r\n$ PID: C9200-24P-A , VID: V01 , SN: JAD23230GGU\r\n$ \r\n$ NAME: \"Switch 1\", DE" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.6, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "81", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea50ebbf5723-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:39] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230227-HELEN1-Session.AU-Port15-15-wh.ipsupply.com.au.log", + "range": 100, + "line": 252 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ \r\n$ \r\n$ No Inactive Message Discriminator.\r\n$ \r\n$ \r\n$ Console logging: level debugging, 5 messages logged, xml disabled,\r\n$ filtering disabled\r\n$ Monitor logging: level debugging, 0 messages logged, xml disabled,\r\n$ filtering disabled\r\n$ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.87, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea5cea2eaac3-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:40] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230227-HELEN1-Session.AU-Port15-15-wh.ipsupply.com.au.log", + "range": 100, + "line": 255 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ \r\n$ \r\n$ Console logging: level debugging, 5 messages logged, xml disabled,\r\n$ filtering disabled\r\n$ Monitor logging: level debugging, 0 messages logged, xml disabled,\r\n$ filtering disabled\r\n$ Buffer logging: level debugging, 129 message" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.99, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea631c56a80b-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:41] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230222-TEST_STATION-Session.Port16-16-172.16.20.7.log", + "range": 100, + "line": 207 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ *Feb 22 03:44:29.694: %CRYPTO_ENGINE-5-KEY_ADDITION: A key named CISCO_IDEVID_SUDI has been generated or imported by pki-sudi\r\n$ *Feb 22 03:44:29.722: %PKI-2-NON_AUTHORITATIVE_CLOCK: PKI functions can not be initialized until an authoritative time source, like NTP, can be obtained.\r\n$ *Feb 22 0" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.26, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "93", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea6aef885c0a-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:42] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230222-TEST_STATION-Session.Port16-16-172.16.20.7.log", + "range": 100, + "line": 127 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ Cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r\n$ San Jose, California 95134-1706\r\n$ \r\n$ \r\n$ \r\n$ Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT9K_LITE_IOSXE), Version 16.11.1, RELEASE SOFTW" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.55, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "93", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea730abb574d-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-15:44:44] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230222-TEST_STATION-Session.Port16-16-172.16.20.7.log", + "range": 100, + "line": 130 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ 170 West Tasman Drive\r\n$ San Jose, California 95134-1706\r\n$ \r\n$ \r\n$ \r\n$ Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT9K_LITE_IOSXE), Version 16.11.1, RELEASE SOFTWARE (fc3)\r\n$ Technical Support: http://www.cisco.com/techsupport\r\n$ Copyright (c) 1986" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.26, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "93", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e1ea80cd4eaabb-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4OTE1LCJleHAiOjE3Mjc0ODQ5MTV9.UQShlc56-hdYpqWqCvNoChIqrngzTQn4MwB9TRt1qEk", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-16:06:38] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.5, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20a8f9ee11239-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare" +} + +====================================================================== + +[29/9/23-16:06:40] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.215.101, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20a99a8ba0508-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3AzdI9rqN8cC6ZR0K3grTMBYm0KOYA6TNOCr181D31Z7u_HzFaV0-mAKSz_xCrE4W1CgA0JN8g2EVCgKc5SZZvgQ.amFxYUtZamU3TzJ2Smk0Zw.bxfZF62GyuNvZelUUFOGk86ijZbIJN-AscOQgjSUUHY" +} + +====================================================================== + +[29/9/23-16:06:40] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.93, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20a9ecabe8b24-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3A-fSQ2gcvrfcmAkMYY87YBuFmzI21Q8fXP_xrLHHayKOQ9I7PGg2lLRluJ7v_ci12pGORUlWosou2d7nJieOPUw.NjNpeUdTbW5jX2h1ME1qaw.1DjNk3Df07FaJRH0i29mEvaNNIZQSCW42BwdQHcBTCQ" +} + +====================================================================== + +[29/9/23-16:06:41] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.210.171, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20aa46cd11fb6-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3AsWMz6yoLPRIHfrpd14eFhxGs4lz2gwcKCmo9Nhca-ovLm_dfcqqPa_nwjC8RwyJ6AMpMGalgehtsgD5oaS8VFw.cTVFMm53YkYtZjE1c0tFRQ.0vF6U-OgZglgpxXiycXh1lQSCa8vq46wZTCj2CQ4QVk" +} + +====================================================================== + +[29/9/23-16:06:42] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.5, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20aa958fe1923-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3AoCprfTMuNiuypWUAI-P6shniBPdENA4VN9rc6Q1gmEL1L3wLfFrZacsS_mapeT_--hYu9hKgfDL46glriBcEBw.ZThMNmJ3Y0VFVk1KU20xTA.XsDYnwATq3T9JNVBBGv--Ew4QbmQesJ8tLxqpvVqZRc" +} + +====================================================================== + +[29/9/23-16:06:43] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.218.228, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20aac8a58099d-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3AxTJDPUgZALhK44tX0povR9AEygvtJ0P8A4O73bfuUIVXvKBZ46xAf-N3O49MNBU5UEKAtNbtj8PwGpv3eSEhyQ.OG1pQkFmTXc2Smx6TUtQRQ.-Ya2AHAKkupBW0JMuB5ThjS64c_cTinm-S6uPp2amPw" +} + +====================================================================== + +[29/9/23-16:06:45] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230629-HELEN1-Session.US2-13-5-127.0.0.1.log", + "line": 100, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230629 - HELEN1 - Start recording -- Session US2-13-5 (Host 127.0.0.1) -- 29/06/2023 - 03:53:51 =========\r\n$ \r\n$ Router>\r\n$ Router>en\r\n$ Router#sh inv\r\n$ NAME: \"Chassis\", DESCR: \"Cisco ASR1001 Chassis w/o IDC\"\r\n$ PID: ASR1001 , VID: V03, SN: SSI180404YZ\r\n$ \r\n$ NAME: " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 162.158.178.93, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "97", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e20ab4cbcd21d6-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNDdiaTI3MDAwMDVkNzFoNTh6aHgwbCIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.QUryYwmBJQLWH7DDp31PusE8cOdkANOd-Udaq_CblQw; cln47bi2700005d71h58zhx0l=e%3Am_gEs-FuoslTaT1MuhZyvDHLgVr2QX0GXMCQscgXx0waM3hKeFezH2Vtc7IBsPzlS7EAdVQ4qrzUyA4OnVaOnQ.YTdUTjNOOGI5RHZJUEQ3eQ.Lmwlsp6WgarGlujoyRnccc1rahZkOF-PS_YqsnbzL7g" +} + +====================================================================== + +[29/9/23-16:22:55] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230623-SAMBA-US14.log", + "range": 100, + "line": 6423 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.218.243, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "62", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e222686fd65dec-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTQ4NDgwLCJleHAiOjE3Mjc0ODQ0ODB9.TDZ8Tq3NxJfQN1p9GRDNelEhWYPg7faWw5giFoCE6lA", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-17:50:47] - 200 - /api/log/showLog/20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "", + "contentFile": "1|-|$ ========= 20230929 - HAIPC - Start recording -- Session TS_2911TS (Host 172.16.20.1) -- 29/09/2023 - 11:21:08 =========\r\n2|-|$ \r\n3|-|$ $$$$$$\\ $$$$$$$\\ $$$$$$\\ $$\\ $$\\ $$$$$$$\\ $$$$$$$\\ $$\\ $$\\ $$\\ \r\n4|-|$ \\_$$ _|$$ __$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\ $$ __$$\\ $" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a3206c930456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-HAIPC-Session.TS_2911TS-172.16.20.1.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare" +} + +====================================================================== + +[29/9/23-17:51:25] - 200 - /api/getKeyValue +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:69]\n[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "0", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a4112d090456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "origin": "https://logs.danielvu.com", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AuUXDEn0Mg7FceS-FXnC2DPm-QnO3tWDcgWk7QPo72lagO3N1iycWbPRf09gcceg9I_nQkHi-x7QvPVGgVmcLvw.UElUSGRKRzdZck56WXlIMA.DxZWAlftjxU6DAJQ0ZHzqlGoQXko5kTkoZaYK91YM40" +} + +====================================================================== + +[29/9/23-17:51:30] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a42ec9a00456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AgHiLV5UnDfExzUocrnMXNheYY0HKsqf-360qEOhoJNX7fq-kyueGJ7pDbGlHHyZ9nOV3YisfDWekIaKqHtGTCA.RGZzSkRRRzBDT1NFNmFxVA.A_VXFwyre0bfN52CLJMDN2_QmeR-H2Tyb944gQj64Sg" +} + +====================================================================== + +[29/9/23-17:51:32] - 200 - /api/log/showLog/20230929-TEST01-Session.Port18-18-172.16.20.1.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-TEST01-Session.Port18-18-172.16.20.1.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "18|-|$ *Dec 31 23:54:35.999: DTLS_CLIENT_|-|ERROR|-|: ../capwap/base_capwap/dtls/base_capwap_dtls_handshake.c:929 Unexpected message received while expecting HelloVerifyRequest\r\n146|-|$ *Dec 31 23:56:06.999: DTLS_CLIENT_|-|ERROR|-|: ../capwap/base_capwap/dtls/base_capwap_dtls_handshake.c:929 Unexp", + "contentFile": "1|-|$ ========= 20230929 - TEST01 - Start recording -- Session Port18-18 (Host 172.16.20.1) -- 29/09/2023 - 16:43:48 =========\r\n2|-|$ \r\n3|-|$ $$$$$$\\ $$$$$$$\\ $$$$$$\\ $$\\ $$\\ $$$$$$$\\ $$$$$$$\\ $$\\ $$\\ $$\\ \r\n4|-|$ \\_$$ _|$$ __$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\ $$ __$$\\ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a43a6a910456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-TEST01-Session.Port18-18-172.16.20.1.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3A7e6geDpRm8kqt4dOSmde73LCQCrHyw4ijKLF8Ld0PtCRK2yzTGwEOTUULe0S30qWHG0dI7YhyN37_kI9KeiG4A.Nm5FeHFBc1kwdXA1Vm12aQ.EECk1dD9VgbOGYCMrxnuG8uya6nEvFk40FKy4xaScoU" +} + +====================================================================== + +[29/9/23-17:51:34] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a448590c0456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3Afzsii9vCxBgBj2LEN_lCzwpWkL65Zk062U_AfnFTY0iTyoR8nTLKZO4LNv1y1ugyMVzUE1k1Q1WqmPziiKiReQ.dWd5UjdiNTFDMzhTczd1Nw.bCoe5PIiXpZu_bjl-oXNj32eZSr59Rtq__O9HB8_6is" +} + +====================================================================== + +[29/9/23-17:51:35] - 200 - /api/log/showLog/20230929-TEST01-Session.Port12-12-172.16.20.1.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-TEST01-Session.Port12-12-172.16.20.1.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "", + "contentFile": "1|-|$ ========= 20230929 - TEST01 - Start recording -- Session Port12-12 (Host 172.16.20.1) -- 29/09/2023 - 16:43:47 =========\r\n2|-|$ \r\n3|-|$ $$$$$$\\ $$$$$$$\\ $$$$$$\\ $$\\ $$\\ $$$$$$$\\ $$$$$$$\\ $$\\ $$\\ $$\\ \r\n4|-|$ \\_$$ _|$$ __$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\ $$ __$$\\ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a44f2bf10456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-TEST01-Session.Port12-12-172.16.20.1.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3Ahw6cs4hEhk8Bl3TmflD-0qJ2kz_oJ0WKGtkCLAISe_hJ6SgQEkfbr5wrCKFjz5879BobTwT_17GaYkNPG8Lmnw.Y0xzSzR6ZFhja3BVeXhfcw.quvddAcACB8mYVK8B9x8AJ6PHo9M50Lz-EVQ-u84tmc" +} + +====================================================================== + +[29/9/23-17:51:51] - 200 - /api/getKeyValue +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:69]\n[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "0", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a4b0dbd50456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "origin": "https://logs.danielvu.com", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AqRWUE1S8dLfuQn2qijW_x1ozWrx2RgtQN4Tct-UbqY3t_8nMrKDCmdMIr4yHhvxZHp7s6WCf5A22LVQObN4QyQ.dkMtNVd5Q1FaQm9OcE9ZRQ.MqFWYVwvX-Btp_Pqii0yjiBb6cY5Xmv-d2toG1KCUGY" +} + +====================================================================== + +[29/9/23-17:51:59] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a4e6ffa20456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AfGgECvH6zZ5OrEM-5rC0ItUGXy0ySKBkOx6NwHB8YgDWs76yejEChg9WsO07nVSe4IG04NEqh7D6UwoZUbArSg.WHItSE5YYmpXMDVMMVAtWQ.M4yBq3LCdLpY2aFu8krfGk7euS-mPHBdt49P658BHgQ" +} + +====================================================================== + +[29/9/23-17:52:02] - 200 - /api/log/showLog/20230929-TEST01-Session.Port18-18-172.16.20.1.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-TEST01-Session.Port18-18-172.16.20.1.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "18|-|$ *Dec 31 23:54:35.999: DTLS_CLIENT_|-|ERROR|-|: ../capwap/base_capwap/dtls/base_capwap_dtls_handshake.c:929 Unexpected message received while expecting HelloVerifyRequest\r\n146|-|$ *Dec 31 23:56:06.999: DTLS_CLIENT_|-|ERROR|-|: ../capwap/base_capwap/dtls/base_capwap_dtls_handshake.c:929 Unexp", + "contentFile": "1|-|$ ========= 20230929 - TEST01 - Start recording -- Session Port18-18 (Host 172.16.20.1) -- 29/09/2023 - 16:43:48 =========\r\n2|-|$ \r\n3|-|$ $$$$$$\\ $$$$$$$\\ $$$$$$\\ $$\\ $$\\ $$$$$$$\\ $$$$$$$\\ $$\\ $$\\ $$\\ \r\n4|-|$ \\_$$ _|$$ __$$\\ $$ __$$\\ $$ | $$ |$$ __$$\\ $$ __$$\\ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a4f728710456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-TEST01-Session.Port18-18-172.16.20.1.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3Adl4AS89CNFYoivLe7_OjJsffEV2lTXZI8NfRju6COhLBeYub9vr3uLYgUZF5YWJVic5jzt-NAiH7Ag1ql4etIQ.eFZKdE5HdTVteEZ2aEFUeg.EnqTbjNgbiT_oKQpWvUvi6k9wdvlRYZceOqQU0RxTYo" +} + +====================================================================== + +[29/9/23-17:52:05] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a507cd6b0456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3ApAqR-fI2f5qIkXKus9nbnf445aPGKo9vzvrn8NvsVFa8C94QPfwvAZxLEeTVrAIinzGnS_2b_hzCI-c_dlj7bg.WDFNc29NRVRoRkx1dkFPdA.-poXRp8-o58blSVA2IVgRRLmbpDGmbmaZAsqFR7feMg" +} + +====================================================================== + +[29/9/23-17:52:08] - 200 - /api/log/showLog/20230929-HELEN1-Session.AU-Port08-10-wh.ipsupply.com.au.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-HELEN1-Session.AU-Port08-10-wh.ipsupply.com.au.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "", + "contentFile": "1|-|$ ========= 20230929 - HELEN1 - Start recording -- Session AU-Port08-10 (Host wh.ipsupply.com.au) -- 29/09/2023 - 12:53:46 =========\r\n2|-|$ 2023 Sep 29 05:50:12 switch %$ VDC-1 %$ %POAP-2-POAP_INFO: [SAL1949U9JD-00:FE:C8:CA:6F:1F] - USB Initializing Success\r\n3|-|$ 2023 Sep 29 05:50:12 switch " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a5190ff90456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-HELEN1-Session.AU-Port08-10-wh.ipsupply.com.au.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3ANs3aOeymvE8DNl3jg7oipY8U5Y0xQOuUqVff_XBq9Zp_A3W8HIhRoaBq4nIjXQTbyzwOgDMzxsEA97p6bo5hEg.bU5TNG1NdHcxTk16SmdtNQ.YulTjZAeG3x4qf6TDOJvb9xiMkMKpbrlsp09bmcnCo8" +} + +====================================================================== + +[29/9/23-17:52:09] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a524ac000456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AB0snMRNsgwWOPlftOt49_ShHlgy_HLexec0THJDDLpGB9gSQ9u5tkHLbUPAD1vYvMLoKfMvDlRNhMk3v86sF-w.UXpEVkVpRUFnVEx6TWtSVw.BwQTxa4NRpO3zLEdvZ9XVqn1NMhFdxWef6CGj9xde-A" +} + +====================================================================== + +[29/9/23-17:52:11] - 200 - /api/log/showLog/20230929-TEST02-Session.VN_2911TS-172.16.20.7.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-TEST02-Session.VN_2911TS-172.16.20.7.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "", + "contentFile": "1|-|$ ========= 20230929 - TEST02 - Start recording -- Session VN_2911TS (Host 172.16.20.7) -- 29/09/2023 - 16:13:56 =========\r\n2|-|$ \r\n3|-|$ VN_2911TS#clear line 17\r\n4|-|$ [confirm]\r\n5|-|$ [OK]\r\n6|-|$ VN_2911TS#\r\n7|-|$ VN_2911TS#clear line 18\r\n8|-|$ [confirm]\r\n9|-|$ [OK]\r\n10|-|$ VN_2911" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a52e1b370456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-TEST02-Session.VN_2911TS-172.16.20.7.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3A-ZokRO2iU2t59p-vXZ17fqaXdmLAvyVMNN6BsqfYjtbg0mw97WmgJQzFrOsNcSVEI0-6Te95PuaqSblGAF8wKg.ZE5aaHBCRzRsRWRmTzFRTg.bFqdQTg-hPXIZQmfpi79OtCmq467Fr7j6z9L9vsjeEg" +} + +====================================================================== + +[29/9/23-17:52:13] - 200 - /api/getAllLogDetect +------PAYLOAD------ +{} +------PARAMS------- +{} +-----RESPONSE------ +"[Array:1566]\n20230929-TEST01-Session.Port18-18-172.16.20.1.log,20230929-TEST01-Session.Port17-17-172.16.20.1.log,20230929-TEST01-Session.Port15-15-172.16.20.1.log,20230929-TEST01-Session.Port14-14-172.16.20.1.log,20230929-TEST01-Session.Port12-12-172.16.20.1.log,20230929-TEST01-Session.Port11-11-172.16.20.7.log,20230929-TEST01-Session.Port15-15-172.16.20.7.log,20230929-TEST01-Session.Port14-14-172.16.20.7.log,20230929-TEST01-Session.Port13-13-172.16.20.7.log,20230929-TEST01-Session.Port12-12-172.16.20.7.log,20230929-TEST02-Session.Port18-18-172.16.20.7.log,20230929-TEST02-Session.Port17-17-172.16.20.7.log,20230929-TEST02-Session.VN_2911TS-172.16.20.7.log,20230929-TEST01-Session.APC2-172.16.20.33.log,20230929-TEST01-Session.Port18-18-172.16.20.7.log" +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a53e7c590456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3Ar249T9WMGe8Kejbpo13cZeXqpoVSU5PNMqZMLAK-ohwqHjdDCs9w9AAM_Wb70Ta4ACx0ts8CQRUVyVf0PZyTcA.OHhEUmJpSkpseUg5OWVUdg.710DfIIB-VqcKoZWE3W-jAc4EzqMfVSJnPzVUsXHcRs" +} + +====================================================================== + +[29/9/23-17:52:16] - 200 - /api/log/showLog/20230929-HELEN1-Session.AU-Port16-16-wh.ipsupply.com.au.log +------PAYLOAD------ +{} +------PARAMS------- +{ + "name": "20230929-HELEN1-Session.AU-Port16-16-wh.ipsupply.com.au.log" +} +-----RESPONSE------ +{ + "modelSpecial": "", + "issueItem": "40|-|$ Last reboot reason 0x1:power cycle/|-|fail|-|ure\r\n60|-|$ syntax |-|error|-|, expecting .\r\n64|-|$ syntax |-|error|-|, expecting .\r", + "contentFile": "1|-|$ ========= 20230929 - HELEN1 - Start recording -- Session AU-Port16-16 (Host wh.ipsupply.com.au) -- 29/09/2023 - 05:52:17 =========\r\n2|-|$ \r\n3|-|$ Amnesiac (ttyu0)\r\n4|-|$ \r\n5|-|$ login: \r\n6|-|$ Amnesiac (ttyu0)\r\n7|-|$ \r\n8|-|$ login: \r\n9|-|$ Amnesiac (ttyu0)\r\n10|-|$ \r\n11|-|$ login: ro" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.214.200, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2a54d0cef0456-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "sec-ch-ua": "\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"", + "accept": "application/json", + "dnt": "1", + "sec-ch-ua-mobile": "?0", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-site": "same-origin", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": "https://logs.danielvu.com/logs/20230929-HELEN1-Session.AU-Port16-16-wh.ipsupply.com.au.log", + "accept-language": "vi,vi-VN;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5", + "priority": "u=1, i", + "cdn-loop": "cloudflare", + "cookie": "adonis-session=s%3AeyJtZXNzYWdlIjoiY2xuNGIxZm85MDAwMHJxNzE4azRlNzUwbiIsInB1cnBvc2UiOiJhZG9uaXMtc2Vzc2lvbiJ9.brUcLTZAhDuY0kgIZ9zSnJIO29ioghmOYbYF729_Nws; cln4b1fo90000rq718k4e750n=e%3AP6DcBr5ZGbpdyUVJ9Qyzu2zZ0VMywpiN9CXZOyHevEF7omQ2Id-GxI5NjZPtdRypAE3qC2KrR8bw9KnrZDFcGw.TXd5N3BTS280U1B5SGY2RQ.6Y1rr2Uj8MWrurk76VlMnJ2jBNI66tlH9q4XxMjGeV4" +} + +====================================================================== + +[29/9/23-18:04:50] - 200 - /api/account/checkLogin +------PAYLOAD------ +{ + "username": "erpuser", + "password": "Work1234%" +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "mess": "AUTHENTICATION_SUCCESS", + "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.54, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "45", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b7b92df2574e-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:04:52] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-17-9-127.0.0.1.log", + "range": 100, + "line": 63 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230928 - HELEN1 - Start recording -- Session US2-17-9 (Host 127.0.0.1) -- 28/09/2023 - 06:22:22 =========\r\n$ \r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.126, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "83", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b7c46e66a883-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:04:57] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20220902-SAMBA-US3.log", + "range": 100, + "line": 77 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 3 US 1\nspawn telnet 192.168.5.7 2323\r\nTrying 192.168.5.7...clear line 5\r\n\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n111-1921TS-111#clear line 5\r\n[confirm]\r\n [OK]\r\n111-1921TS-111#\r\n111-1921TS-111#clear line 5\r\n[confirm]\r\n [OK]\r\n111-1921TS-111#\r\n111-1921TS-111#quit\r\nConnection closed" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 108.162.250.149, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "59", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b7e4fe8955b7-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:04:59] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20220901-HELEN1-Session.US-3-5-127.0.0.1.log", + "range": 100, + "line": 754 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ use. Delivery of Cisco cryptographic products does not imply\r\n$ third-party authority to import, export, distribute or use encryption.\r\n$ Importers, exporters, distributors and users are responsible for\r\n$ compliance with U.S. and local country laws. By using this product you\r\n$ agree to comp" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.150, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "82", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b7f1dcb65d1c-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:01] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20220901-HELEN1-Session.US-3-5-127.0.0.1.log", + "range": 100, + "line": 840 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ Aug 31 20:06:07.717: %USB_CONSOLE-6-MEDIA_RJ45: Console media-type is RJ45.\r\n$ Aug 31 20:06:08.748: %PLATFORM_ENV-1-FRU_PS_ACCESS: UNKNOWN or UNSUPPORTED Power Supply\r\n$ % Please answer 'yes' or 'no'.\r\n$ Would you like to enter the initial configuration dialog? [yes/no]: no\r\n$ Switch>\r\n$ Aug" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.86, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "82", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b7faecca5c07-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:04] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US17.log", + "range": 100, + "line": 58 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 7 US 2\nspawn telnet 192.168.5.7 2333\r\nTrying 192.168.5.7...clear line 9\r\n\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 9\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 9\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.5, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b80c690aa7fc-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:05] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-17-9-127.0.0.1.log", + "range": 100, + "line": 63 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ ========= 20230928 - HELEN1 - Start recording -- Session US2-17-9 (Host 127.0.0.1) -- 28/09/2023 - 06:22:22 =========\r\n$ \r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ Switch>\r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ \r\n$ " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 108.162.250.149, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "83", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b81538616a45-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:11] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230906-HELEN1-Session.US2-11-3-127.0.0.1.log", + "range": 100, + "line": 154 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ 2023 Sep 5 21:20:24 %$ VDC-1 %$ %USER-2-SYSTEM_MSG: CLIS: loading cmd files end - clis\r\n$ 2023 Sep 5 21:20:24 %$ VDC-1 %$ %USER-2-SYSTEM_MSG: CLIS: init begin - clis\r\n$ \r\n$ 2023 Sep 5 21:21:59 switch %$ VDC-1 %$ %VDC_MGR-2-VDC_ONLINE: vdc 1 has come online \r\n$ Starting Power On Auto Pr" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.24, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b83b2c47ab01-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:15] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230906-HELEN1-Session.US2-11-3-127.0.0.1.log", + "range": 100, + "line": 133 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ nohup: redirecting stderr to stdout\r\n$ autoneg unmodified, ignoring\r\n$ autoneg unmodified, ignoring\r\n$ Checking all filesystems....r. done.\r\n$ Loading system software\r\n$ Uncompressing system image: bootflash:/n5000-uk9.6.0.2.N1.2.bin Tue Sep 5 21:19:48 UTC 2023\r\n$ \r\n$ Load plugins that def" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.86, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b853bce4aaed-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:21] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-13-5-127.0.0.1.log", + "range": 100, + "line": 4385 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ mifs[8]: Bytes available : 3869696 \r\n$ mifs[8]: mifs fsck took 0 seconds.\r\n$ mifs[8]: Initialization complete.\r\n$ \r\n$ mifs[9]: 5 files, 1 directories\r\n$ mifs[9]: Total bytes : 258048 \r\n$ mifs[9]: Bytes used : 8192 \r\n$ mifs[9]: Bytes available : 249856 \r\n$ mifs[9]: mi" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.86, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b873aefcaaf6-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:22] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-13-5-127.0.0.1.log", + "range": 100, + "line": 2605 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ mifs[8]: Bytes available : 3869696 \r\n$ mifs[8]: mifs fsck took 0 seconds.\r\n$ mifs[8]: Initialization complete.\r\n$ \r\n$ mifs[9]: 5 files, 1 directories\r\n$ mifs[9]: Total bytes : 258048 \r\n$ mifs[9]: Bytes used : 8192 \r\n$ mifs[9]: Bytes available : 249856 \r\n$ mifs[9]: mi" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.18, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b8820be55c0f-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:26] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-13-5-127.0.0.1.log", + "range": 100, + "line": 1537 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ mifs[8]: Bytes available : 3869696 \r\n$ mifs[8]: mifs fsck took 0 seconds.\r\n$ mifs[8]: Initialization complete.\r\n$ \r\n$ mifs[9]: 5 files, 1 directories\r\n$ mifs[9]: Total bytes : 258048 \r\n$ mifs[9]: Bytes used : 8192 \r\n$ mifs[9]: Bytes available : 249856 \r\n$ mifs[9]: mi" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.35, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b897eb18a956-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:05:29] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-13-5-127.0.0.1.log", + "range": 100, + "line": 395 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ Last reset from power-on\r\n$ 1 Virtual Ethernet interface\r\n$ 12 Gigabit Ethernet interfaces\r\n$ The password-recovery mechanism is enabled.\r\n$ \r\n$ 512K bytes of flash-simulated non-volatile configuration memory.\r\n$ Base ethernet MAC Address : 00:A2:89:4E:4C:00\r\n$ Motherboard assembly n" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.120, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b8ac2c345d18-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:09] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.126, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b9a55dd1a86a-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:11] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1128 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.54, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b9b21b48aae7-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:19] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1203 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ POST: PortASIC Port Loopback Tests : End, Status Passed\r\n$ \r\n$ POST: PortASIC Macsec Loopback Tests : Begin\r\n$ POST: PortASIC Macsec Loopback Tests : End, Status Passed\r\n$ \r\n$ Waiting for Port download...Complete\r\n$ Initializing Port Extension Feature Support...\r\n$ \r\n$ \r\n$ This product c" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.26, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip, br", + "cf-ray": "80e2b9e2df0caabe-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:20] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.54, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b9eb1c51aaf0-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:22] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 53 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.161, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2b9f61e715d1c-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:27] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.35, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2ba133dcca932-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:30] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 180 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.69.62.26, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2ba29bb9daaf3-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:37] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.136, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2ba568f18a94d-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:06:44] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1128 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.17, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2ba7e3ba6a81d-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:08:39] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.5, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2bd50bb51a7f5-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:08:56] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 53 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.21, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2bdb5cadd571d-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:09:17] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 180 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.6, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip, br", + "cf-ray": "80e2be39ee92a961-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:11:31] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1128 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.151, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c1818e2ea87c-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:11:35] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1203 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ POST: PortASIC Port Loopback Tests : End, Status Passed\r\n$ \r\n$ POST: PortASIC Macsec Loopback Tests : Begin\r\n$ POST: PortASIC Macsec Loopback Tests : End, Status Passed\r\n$ \r\n$ Waiting for Port download...Complete\r\n$ Initializing Port Extension Feature Support...\r\n$ \r\n$ \r\n$ This product c" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 108.162.250.182, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c1979b566a72-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:11:36] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1243 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ Top Assembly Revision Number : C0\r\n$ Version ID : V02\r\n$ CLEI Code Number : CMMTJ00BRB\r\n$ Hardware Board Revision Number : 0x09\r\n$ \r\n$ \r\n$ Switch Ports Model SW Version SW Image \r\n$ ------ ----- ----- " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.66.127, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip, br", + "cf-ray": "80e2c19f39d2a88c-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:11:38] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 180 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.6, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c1aaadc85727-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:11:59] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-SAMBA-US14.log", + "range": 100, + "line": 93 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "Line 4 US 2\nspawn telnet 192.168.5.7 2333\r\nclear line 6\r\nTrying 192.168.5.7...\r\nConnected to 192.168.5.7.\r\nEscape character is '^]'.\r\n\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#clear line 6\r\n[confirm]\r\n [OK]\r\n222-1921TS-222#\r\n222-1921TS-222#quit\r\nConnection clos" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.35, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "60", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c22f49d8a971-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:01] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1243 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ Top Assembly Revision Number : C0\r\n$ Version ID : V02\r\n$ CLEI Code Number : CMMTJ00BRB\r\n$ Hardware Board Revision Number : 0x09\r\n$ \r\n$ \r\n$ Switch Ports Model SW Version SW Image \r\n$ ------ ----- ----- " +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.18, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c23a7c58a7ea-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:02] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1203 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ POST: PortASIC Port Loopback Tests : End, Status Passed\r\n$ \r\n$ POST: PortASIC Macsec Loopback Tests : Begin\r\n$ POST: PortASIC Macsec Loopback Tests : End, Status Passed\r\n$ \r\n$ Waiting for Port download...Complete\r\n$ Initializing Port Extension Feature Support...\r\n$ \r\n$ \r\n$ This product c" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.6, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c240ef74571b-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:05] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 180 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.4, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "84", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip, br", + "cf-ray": "80e2c2549908a83e-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:06] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1128 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.210.6, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c25c6e44a979-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:08] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "range": 100, + "line": 1203 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ POST: PortASIC Port Loopback Tests : End, Status Passed\r\n$ \r\n$ POST: PortASIC Macsec Loopback Tests : Begin\r\n$ POST: PortASIC Macsec Loopback Tests : End, Status Passed\r\n$ \r\n$ Waiting for Port download...Complete\r\n$ Initializing Port Extension Feature Support...\r\n$ \r\n$ \r\n$ This product c" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "203.129.30.213, 172.68.146.99, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "85", + "cf-connecting-ip": "203.129.30.213", + "cf-ipcountry": "AU", + "accept-encoding": "gzip", + "cf-ray": "80e2c26639caa835-SYD", + "cf-visitor": "{\"scheme\":\"https\"}", + "user-agent": "GuzzleHttp/7", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1OTc0NjkwLCJleHAiOjE3Mjc1MTA2OTB9.ebek6iojtLB9XvoMem2Rdakc2qUVvf3LLbzYzz1JQRY", + "content-type": "application/json", + "cdn-loop": "cloudflare", + "accept": "application/json" +} + +====================================================================== + +[29/9/23-18:12:53] - 200 - /api/getParagraph +------PAYLOAD------ +{ + "fileName": "20230928-HELEN1-Session.US2-14-6-127.0.0.1.log", + "line": 1128, + "range": 100 +} +------PARAMS------- +{} +-----RESPONSE------ +{ + "content": "$ (c) of the Commercial Computer Software - Restricted\r\n$ Rights clause at FAR sec. 52.227-19 and subparagraph\r\n$ (c) (1) (ii) of the Rights in Technical Data and Computer\r\n$ Software clause at DFARS sec. 252.227-7013.\r\n$ \r\n$ cisco Systems, Inc.\r\n$ 170 West Tasman Drive\r" +} +------HEADERS------ +{ + "x-forwarded-host": "logs.danielvu.com", + "x-forwarded-server": "logs.danielvu.com", + "x-real-ip": "172.16.6.2", + "x-forwarded-for": "118.71.46.74, 172.71.218.78, 172.16.6.2", + "x-forwarded-proto": "http", + "host": "logs.danielvu.com", + "connection": "Upgrade", + "content-length": "98", + "cf-connecting-ip": "118.71.46.74", + "cf-ipcountry": "VN", + "accept-encoding": "gzip", + "cf-ray": "80e2c37f99800955-HKG", + "cf-visitor": "{\"scheme\":\"https\"}", + "accept": "application/json", + "user-agent": "Thunder Client (https://www.thunderclient.com)", + "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZF91c2VyIjoxLCJ1c2VybmFtZSI6ImVycHVzZXIiLCJjcmVhdGVkQXQiOiIyMDIzLTA4LTIzVDE1OjI4OjAxLjAwMCsxMDowMCIsInVwZGF0ZWRBdCI6IjIwMjMtMDgtMjNUMTU6Mjg6MDEuMDAwKzEwOjAwIiwiaWF0IjoxNjk1MzY0OTYxLCJleHAiOjE3MjY5MDA5NjF9.7IZbp-PRtgutV_AWA7Uf0ljHBJyfczPbJKiD5KO2bjM", + "content-type": "application/json", + "cdn-loop": "cloudflare" +} + +====================================================================== \ No newline at end of file From ce70def12ef8cee5598b43d842ae8d3aaec1dd3f Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 15:21:56 +0700 Subject: [PATCH 237/298] add middleware writeLog --- start/routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index 275aae3..b3310cf 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -209,9 +209,9 @@ Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware( ).middleware("writeLog"); //Users -Route.post("/api/account/createUser", "UsersController.create").middleware("writeLog"); +Route.post("/api/account/createUser", "UsersController.create") -Route.post("/api/account/checkLogin", "UsersController.checkLogin").middleware("writeLog"); +Route.post("/api/account/checkLogin", "UsersController.checkLogin") //Log Route.get("/api/log/showLog/:name?", "LogsController.showLog").middleware("writeLog"); From d48ca621da56e924ee0d9e7bb3cbc77d5c7ce46e Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 15:22:57 +0700 Subject: [PATCH 238/298] add middleware writeLog --- start/routes.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/start/routes.ts b/start/routes.ts index b3310cf..5039df4 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -202,11 +202,13 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); Route.post( "/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber" -).middleware("checkToken").middleware("writeLog"); +).middleware("checkToken") +// .middleware("writeLog"); Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware( "checkToken" -).middleware("writeLog"); +) +// .middleware("writeLog"); //Users Route.post("/api/account/createUser", "UsersController.create") From 81340d18b352ab796b33f1da3e2dc70e4b0fbd68 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 15:24:39 +0700 Subject: [PATCH 239/298] add middleware writeLog --- app/Middleware/Logger.ts | 2 +- start/routes.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Middleware/Logger.ts b/app/Middleware/Logger.ts index 21fbc18..7eda5be 100644 --- a/app/Middleware/Logger.ts +++ b/app/Middleware/Logger.ts @@ -8,7 +8,7 @@ export default class Logger { ) { // code for middleware goes here. ABOVE THE NEXT CALL await next(); - let a = request, + let a = request let b = response loggerAPI(a, b, request.url()); } diff --git a/start/routes.ts b/start/routes.ts index 5039df4..43e00cc 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -203,12 +203,12 @@ Route.post( "/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber" ).middleware("checkToken") -// .middleware("writeLog"); +.middleware("writeLog"); Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware( "checkToken" ) -// .middleware("writeLog"); +.middleware("writeLog"); //Users Route.post("/api/account/createUser", "UsersController.create") From 5f13c789a16419ba02f5fc7e26048fcb75672027 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 16:23:37 +0700 Subject: [PATCH 240/298] store/logsAPI --- app/Middleware/Logger.ts | 4 +--- app/utils/Logger.ts | 14 +++++++------- start/routes.ts | 36 +++++++++++++++++++++--------------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/app/Middleware/Logger.ts b/app/Middleware/Logger.ts index 7eda5be..bc38837 100644 --- a/app/Middleware/Logger.ts +++ b/app/Middleware/Logger.ts @@ -8,8 +8,6 @@ export default class Logger { ) { // code for middleware goes here. ABOVE THE NEXT CALL await next(); - let a = request - let b = response - loggerAPI(a, b, request.url()); + loggerAPI(request, response, request.url()) } } diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index 262b0dc..fc023f0 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -28,9 +28,9 @@ const shortenStringsInObject = (obj, maxLength) => { return obj; } -export function loggerAPI(request, response, location) { +export function loggerAPI(req, res, location) { let old_data = ""; - let resBody = response.getBody() + let resBody = res.lazyBody[0] let body = shortenStringsInObject(resBody, 300) try { const fileName = @@ -42,17 +42,17 @@ export function loggerAPI(request, response, location) { "\n\n[" + moment(Date.now()).format("D/M/YY-HH:mm:ss") + "] - " + - response.getStatus() + + res.response.statusCode + " - " + location + "\n------PAYLOAD------\n" + - JSON.stringify(request.all(), null, 2) + + JSON.stringify(req.all(), null, 2) + "\n------PARAMS-------\n" + - JSON.stringify(request.params(), null, 2) + + JSON.stringify(req.params(), null, 2) + "\n-----RESPONSE------\n" + JSON.stringify(body, null, 2) + "\n------HEADERS------\n" + - JSON.stringify(request.headers(), null, 2) + + JSON.stringify(req.headers(), null, 2) + "\n\n======================================================================"; fs.exists(fileName, async (exists) => { @@ -65,6 +65,6 @@ export function loggerAPI(request, response, location) { }); } catch (error) { - response.status(500).send("CAN'T WRITE LOG"); + console.log(error) } } \ No newline at end of file diff --git a/start/routes.ts b/start/routes.ts index 43e00cc..52382af 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -199,31 +199,37 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); //ERP get index serial number -Route.post( - "/api/getIndexSerialNumber", - "ErpsController.getIndexSerialNumber" -).middleware("checkToken") -.middleware("writeLog"); +Route.post("/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber") + .middleware("checkToken") + // .middleware("writeLog"); -Route.post("/api/getParagraph", "ErpsController.getParagraph").middleware( - "checkToken" -) -.middleware("writeLog"); +Route.post("/api/getParagraph", "ErpsController.getParagraph") +// .middleware("writeLog") +.middleware("checkToken") + //Users -Route.post("/api/account/createUser", "UsersController.create") +Route.post("/api/account/createUser", "UsersController.create"); -Route.post("/api/account/checkLogin", "UsersController.checkLogin") +Route.post("/api/account/checkLogin", "UsersController.checkLogin"); //Log -Route.get("/api/log/showLog/:name?", "LogsController.showLog").middleware("writeLog"); +Route.get("/api/log/showLog/:name?", "LogsController.showLog").middleware( + "writeLog" +); -Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect").middleware("writeLog"); +Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect").middleware( + "writeLog" +); //Key-Value -Route.post("/api/getKeyValue", "ValuesController.getKeyValue").middleware("writeLog"); +Route.post("/api/getKeyValue", "ValuesController.getKeyValue").middleware( + "writeLog" +); -Route.post("/api/deleteValue", "ValuesController.destroy").middleware("writeLog"); +Route.post("/api/deleteValue", "ValuesController.destroy").middleware( + "writeLog" +); Route.post("/api/addValue", "ValuesController.create").middleware("writeLog"); From 78e82cfeec902af1adb1968f9bcb51fd05d44858 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 16:26:38 +0700 Subject: [PATCH 241/298] store/logsAPI --- app/store/logsAPI/test.log | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/store/logsAPI/test.log diff --git a/app/store/logsAPI/test.log b/app/store/logsAPI/test.log new file mode 100644 index 0000000..e69de29 From 9350f061c5e19e67abe795f2e47c1e83efed1f10 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 16:47:25 +0700 Subject: [PATCH 242/298] add middleware writeLog --- app/utils/Logger.ts | 10 +++++----- start/routes.ts | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/Logger.ts b/app/utils/Logger.ts index fc023f0..cffb2f8 100644 --- a/app/utils/Logger.ts +++ b/app/utils/Logger.ts @@ -30,8 +30,8 @@ const shortenStringsInObject = (obj, maxLength) => { export function loggerAPI(req, res, location) { let old_data = ""; - let resBody = res.lazyBody[0] - let body = shortenStringsInObject(resBody, 300) + let resBody = res.getBody() + // let body = shortenStringsInObject(resBody, 300) try { const fileName = "./app/store/logsAPI/" + @@ -42,7 +42,7 @@ export function loggerAPI(req, res, location) { "\n\n[" + moment(Date.now()).format("D/M/YY-HH:mm:ss") + "] - " + - res.response.statusCode + + res.getStatus() + " - " + location + "\n------PAYLOAD------\n" + @@ -50,7 +50,7 @@ export function loggerAPI(req, res, location) { "\n------PARAMS-------\n" + JSON.stringify(req.params(), null, 2) + "\n-----RESPONSE------\n" + - JSON.stringify(body, null, 2) + + JSON.stringify(resBody, null, 2) + "\n------HEADERS------\n" + JSON.stringify(req.headers(), null, 2) + "\n\n======================================================================"; @@ -65,6 +65,6 @@ export function loggerAPI(req, res, location) { }); } catch (error) { - console.log(error) + res.status(500).send("CAN'T WRITE LOG"); } } \ No newline at end of file diff --git a/start/routes.ts b/start/routes.ts index 52382af..04a45ef 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -201,11 +201,11 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); Route.post("/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber") .middleware("checkToken") - // .middleware("writeLog"); + .middleware("writeLog"); Route.post("/api/getParagraph", "ErpsController.getParagraph") -// .middleware("writeLog") .middleware("checkToken") +.middleware("writeLog") //Users From ccfd6cc0adb3507ff3207e7ded0d1fa04581eae3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Fri, 29 Sep 2023 16:54:51 +0700 Subject: [PATCH 243/298] add middleware writeLog --- .gitignore | 1 + app/Controllers/Http/ErpsController.ts | 4 ++-- start/routes.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 6d0550c..b1d0ea8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ coverage .DS_STORE .env app/utils/indexSN.txt +app/store tmp diff --git a/app/Controllers/Http/ErpsController.ts b/app/Controllers/Http/ErpsController.ts index ff870c7..6075293 100644 --- a/app/Controllers/Http/ErpsController.ts +++ b/app/Controllers/Http/ErpsController.ts @@ -109,7 +109,7 @@ export default class ErpsController { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" && SN !== "NA" && SN.length>4 + SN !== "N/A" && SN.length>4 ) { if (output.some((u) => u.SN === SN)) { output.map((u, index) => { @@ -283,7 +283,7 @@ export default class ErpsController { ); // console.log(report); return report.filter( - (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !=="" && SN!=="NA" + (i) => i.SN !== "" && /^[A-Z0-9-]{5,}$/.test(i.SN) === true && i.PID !=="" ); // }, 15000); } catch (error) { diff --git a/start/routes.ts b/start/routes.ts index 04a45ef..f5c0786 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -201,7 +201,7 @@ runtimeCheckLogs(Env.get("FOLDER_LOGS")); Route.post("/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber") .middleware("checkToken") - .middleware("writeLog"); + // .middleware("writeLog"); Route.post("/api/getParagraph", "ErpsController.getParagraph") .middleware("checkToken") From 39dec28a47dee56490f0e08dfdbdb1b27418b685 Mon Sep 17 00:00:00 2001 From: joseph le Date: Sat, 30 Sep 2023 10:22:50 +0700 Subject: [PATCH 244/298] create function powerSchedule --- app/utils/powerSchedule.js | 47 ++++++++++++ screenshot.js | 149 +++++++++++++++++++++---------------- 2 files changed, 132 insertions(+), 64 deletions(-) create mode 100644 app/utils/powerSchedule.js diff --git a/app/utils/powerSchedule.js b/app/utils/powerSchedule.js new file mode 100644 index 0000000..554b5d9 --- /dev/null +++ b/app/utils/powerSchedule.js @@ -0,0 +1,47 @@ +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); + // Open a new page + const page = await browser.newPage(); + await page.goto("https://ithongtin.com/lich-cup-dien/can-tho/ninh-kieu"); + const data = await page.evaluate(() => { + const title = document.title; + const paragraphText = document.querySelector("table").textContent; + return { + title, + paragraphText, + }; + }); + await browser.close(); + 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-------", + }; + + if ( + data.paragraphText + .split(" ") + .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B")).length > 0 + ) { + client.messages.send(params); + } +})(); \ No newline at end of file diff --git a/screenshot.js b/screenshot.js index 37c1124..de8b849 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,32 +1,56 @@ -// const puppeteer = require("puppeteer"); +const puppeteer = require("puppeteer"); +const zulip = require("zulip-js"); +// const axios = require("axios"); -const axios = require("axios"); +(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); + // Open a new page + const page = await browser.newPage(); + await page.goto("https://ithongtin.com/lich-cup-dien/can-tho/ninh-kieu"); + const data = await page.evaluate(() => { + const title = document.title; + const paragraphText = document.querySelector("table").textContent; + return { + title, + paragraphText, + }; + }); + await browser.close(); + 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-------", + }; -// (async () => { -// // Launch a headless browser -// const browser = await puppeteer.launch({ -// headless: true, -// args: ["--no-sandbox"], -// }); - -// // Open a new page -// const page = await browser.newPage(); -// await page.goto( -// "https://logs.danielvu.com/screenShot/20230913-TEST01-Session.Port4-6-172.16.20.7.log" -// ); -// const bodyHandle = await page.$("body"); -// const { height } = await bodyHandle.boundingBox(); -// await bodyHandle.dispose(); -// await page.setViewport({ width: 1920, height: 500 }); -// setTimeout(async () => { -// await page.screenshot({ path: "screenshot.png" }); -// await browser.close(); -// }, 5000); -// // } else { -// // console.error(`Element with class name '${className}' not found.`); -// // } -// // Close the browser -// })(); + if ( + data.paragraphText + .split(" ") + .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B")).length > 0 + ) { + client.messages.send(params); + } + // }, 5000); + // } else { + // console.error(`Element with class name '${className}' not found.`); + // } + // Close the browser +})(); // const zulip = require("zulip-js"); @@ -163,7 +187,6 @@ const axios = require("axios"); // uploadFileToZulip(filePath); - // const puppeteer = require("puppeteer"); // (async () => { @@ -180,8 +203,6 @@ const axios = require("axios"); // })(); // const zulip = require("zulip-js"); - - // (async () => { // const config = { // username: "networktool-bot@zulip.ipsupply.com.au", @@ -198,41 +219,41 @@ const axios = require("axios"); // 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/" - ); +// (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(" i.search(" i.search(" i.search(" { - let temp = u - .slice(u.search("")) - .split(">")[1]; +// const arrayLine = data1.concat(data2) - if ( - parseInt(temp?.split("-")[0]) >= from && - parseInt(temp?.split("-")[0]) <= to - ) { - listLog.push( - (u.slice(u.search("")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") + - u.slice(u.search("")).split(">")[1] + - " " - ); - } -}); - console.log(listLog) -})() \ No newline at end of file +// // const arrayLineAUTO = data +// // .split("\n") +// // .filter((i) => i.search(" { +// let temp = u +// .slice(u.search("")) +// .split(">")[1]; + +// if ( +// parseInt(temp?.split("-")[0]) >= from && +// parseInt(temp?.split("-")[0]) <= to +// ) { +// listLog.push( +// (u.slice(u.search("")).split(">")[1].includes("AUTO")?"http://192.168.5.7:8080/AUTOlog/":"http://192.168.5.7:8080/") + +// u.slice(u.search("")).split(">")[1] + +// " " +// ); +// } +// }); +// console.log(listLog) +// })() From 253139e4189b078eed6fd7561e0c854b1a360870 Mon Sep 17 00:00:00 2001 From: joseph le Date: Sun, 1 Oct 2023 13:38:57 +0700 Subject: [PATCH 245/298] create function powerSchedule --- app/utils/powerSchedule.js | 24 +++++++++++--------- screenshot.js | 46 ++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/app/utils/powerSchedule.js b/app/utils/powerSchedule.js index 554b5d9..8fa1dac 100644 --- a/app/utils/powerSchedule.js +++ b/app/utils/powerSchedule.js @@ -19,29 +19,31 @@ const zulip = require("zulip-js"); const data = await page.evaluate(() => { const title = document.title; const paragraphText = document.querySelector("table").textContent; + console.log(paragraphText) return { title, paragraphText, }; }); await browser.close(); - 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-------", - }; + 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); } })(); \ No newline at end of file diff --git a/screenshot.js b/screenshot.js index de8b849..2e0f732 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,6 +1,5 @@ const puppeteer = require("puppeteer"); const zulip = require("zulip-js"); -// const axios = require("axios"); (async () => { // Launch a headless browser @@ -26,30 +25,29 @@ const zulip = require("zulip-js"); }; }); await browser.close(); - 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-------", - }; - - if ( - data.paragraphText + +console.log("data: ", +data.paragraphText .split(" ") - .filter((i) => i.includes("KDC 91B") || i.includes("KDC91B")).length > 0 - ) { - client.messages.send(params); - } - // }, 5000); - // } else { - // console.error(`Element with class name '${className}' not found.`); - // } - // Close the browser + .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"); From 2e195e2630d9186934152999bff2e7d8642d16ac Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 3 Oct 2023 08:13:20 +0700 Subject: [PATCH 246/298] update API to int --- app/utils/checkIndexSN.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index 7234818..3d84d0a 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -185,13 +185,13 @@ export const checkIndexSN = async (content, beginLine, nameF) => { { headers: { Authorization: "Bearer " + token } } ); - // const response_int = await axios.post( - // "https://int.ipsupply.com.au/api/transferPostData", - // data, - // { headers: { Authorization: "Bearer " + token } } - // ); + 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.data); + console.log(nameF + " response\n", response_int.data); } } } catch (error) { From 52ee65cf5399acae4fd9ddae9948f1e85be57e0c Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 3 Oct 2023 22:24:40 +0700 Subject: [PATCH 247/298] update function powerSchedule --- app/utils/powerSchedule.js | 79 ++++++++++++++---------- screenshot.js | 121 +++++++++++++++++++++++-------------- 2 files changed, 124 insertions(+), 76 deletions(-) diff --git a/app/utils/powerSchedule.js b/app/utils/powerSchedule.js index 8fa1dac..d2286a4 100644 --- a/app/utils/powerSchedule.js +++ b/app/utils/powerSchedule.js @@ -13,37 +13,54 @@ const zulip = require("zulip-js"); realm: "https://zulip.ipsupply.com.au", }; const client = await zulip(config); - // Open a new page const page = await browser.newPage(); - await page.goto("https://ithongtin.com/lich-cup-dien/can-tho/ninh-kieu"); - const data = await page.evaluate(() => { - const title = document.title; - const paragraphText = document.querySelector("table").textContent; - console.log(paragraphText) - return { - title, - paragraphText, - }; - }); - await browser.close(); - - 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); - } + // Điều hướng đến trang web chứa thẻ + await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien"); + + // Tìm thẻ 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ẻ cần trích xuất + const rows = tbody.querySelectorAll('tr'); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ + + // Lặp qua từng hàng và lấy nội dung của các cột (thẻ ) 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ẻ ) 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(); + + 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); + })(); \ No newline at end of file diff --git a/screenshot.js b/screenshot.js index 2e0f732..540b409 100644 --- a/screenshot.js +++ b/screenshot.js @@ -2,53 +2,84 @@ 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); - // Open a new page + const browser = await puppeteer.launch(); const page = await browser.newPage(); - await page.goto("https://ithongtin.com/lich-cup-dien/can-tho/ninh-kieu"); - const data = await page.evaluate(() => { - const title = document.title; - const paragraphText = document.querySelector("table").textContent; - return { - title, - paragraphText, - }; - }); - await browser.close(); - -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); - // } + + // Điều hướng đến trang web chứa thẻ + await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien"); + + // Tìm thẻ 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ẻ cần trích xuất + const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ + // const headerRow = document.querySelectorAll("thead"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ + // Lấy tên các cột từ hàng đầu (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ẻ ) 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ẻ ) 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ẻ ) 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 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"); From 9eab08377c633d8ae0650ec5d01cccb9f3b5a6f8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 07:15:51 +0700 Subject: [PATCH 248/298] change port --- app/utils/sendNotification.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendNotification.js b/app/utils/sendNotification.js index 29ab533..824b825 100644 --- a/app/utils/sendNotification.js +++ b/app/utils/sendNotification.js @@ -40,7 +40,7 @@ const sendNotification = async () => { } }); - exec("nc -zv 172.16.6.23 3333", (error, stdout, 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) { From c88f3b2354be17fc878ad257281f36c24c49fa1b Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 07:39:56 +0700 Subject: [PATCH 249/298] change time watcher --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7a7c649..bd8ed28 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -95,7 +95,7 @@ export async function runtimeCheckLogs(folderPath) { const filePath = `${folderPath}/${fileName}`; const scan = fs.watchFile( filePath, - { interval: 300000 }, + { interval: 15000 }, async (eventType) => { //check special item, extra RAM, error in log From b67c3a3580ab64fc309e03f32462fea0784730c2 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:10:32 +0700 Subject: [PATCH 250/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index bd8ed28..b767ef8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -88,7 +88,7 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file - await fileList + await fileList.slice(0,20) ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { //path file From 97c5c1285f0eaac4140008e554e58d603bd69e6c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:29:40 +0700 Subject: [PATCH 251/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 45 ++++++++------ screenshot.js | 110 ++++++++++++++++++---------------- 2 files changed, 85 insertions(+), 70 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index b767ef8..244a789 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -1,4 +1,4 @@ -import Env from '@ioc:Adonis/Core/Env'; +import Env from "@ioc:Adonis/Core/Env"; import fs from "fs"; import chokidar from "chokidar"; import moment from "moment"; @@ -8,7 +8,7 @@ import KeyValue from "App/Models/KeyValue"; import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; -import { checkIndexSN } from './checkIndexSN'; +import { checkIndexSN } from "./checkIndexSN"; export async function runtimeCheckLogs(folderPath) { try { @@ -88,22 +88,26 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file - await fileList.slice(0,20) + const watcher = chokidar.watch( + fileList + ?.filter((i) => fileList_old.includes(i) === false) + .map((file) => folderPath + "/" + file) + ); + await fileList ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { //path file const filePath = `${folderPath}/${fileName}`; - const scan = fs.watchFile( - filePath, - { interval: 15000 }, - async (eventType) => { - //check special item, extra RAM, error in log - + watcher.on("change", async (path) => { + // fs.watchFile(filePath,{ interval: 15000 }, + // async (eventType) => { + //check special item, extra RAM, error in log + if (path === filePath) { let lines = []; let allFile = await LogDetectFile.all(); let allReport = await LogReport.all(); let allValue = await KeyValue.all(); - + //get information file let fileDetect = allFile?.filter( (i) => i.$original.file_name === fileName @@ -132,7 +136,7 @@ export async function runtimeCheckLogs(folderPath) { //get index SN and send to ERP - checkIndexSN(contentFile, lastLine, fileName) + checkIndexSN(contentFile, lastLine, fileName); //get list item to check let listKeyValues = allValue.filter( @@ -171,8 +175,13 @@ export async function runtimeCheckLogs(folderPath) { // fileName // ); //check report of line not exist - let checkLog = allReport?.filter((report)=>report.$original.id_file === log?.id_ldf && report.$original.line === (index + 1) && report.$original.detected_content === value) - + let checkLog = allReport?.filter( + (report) => + report.$original.id_file === log?.id_ldf && + report.$original.line === index + 1 && + report.$original.detected_content === value + ); + // await Database.rawQuery( // "select * from log_reports where id_file = " + // log?.id_ldf + @@ -220,9 +229,11 @@ export async function runtimeCheckLogs(folderPath) { // ); //Get all report newest let listReport = await getListLineByItem( - logsDetect.map((obj) => obj.$original).filter((l) => l.line > lastLine) + logsDetect + .map((obj) => obj.$original) + .filter((l) => l.line > lastLine) ); - + let content = "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; @@ -283,9 +294,7 @@ export async function runtimeCheckLogs(folderPath) { } }, 3000); } - ); - - scan.setMaxListeners(0); + }); }); } } catch (error) { diff --git a/screenshot.js b/screenshot.js index 540b409..6da946d 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,63 +1,69 @@ -const puppeteer = require("puppeteer"); -const zulip = require("zulip-js"); +let a = [1,2,3] -(async () => { - const browser = await puppeteer.launch(); - const page = await browser.newPage(); +console.log(a.map(i=>i+1)) - // Điều hướng đến trang web chứa thẻ - await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien"); - // Tìm thẻ 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'); +// const puppeteer = require("puppeteer"); +// const zulip = require("zulip-js"); - // 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ẻ cần trích xuất - const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ - // const headerRow = document.querySelectorAll("thead"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ - // Lấy tên các cột từ hàng đầu (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ẻ ) 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 - // }); +// (async () => { +// const browser = await puppeteer.launch(); +// const page = await browser.newPage(); - // Lặp qua từng hàng và lấy nội dung của các cột (thẻ ) 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ẻ ) 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) - }); +// // Điều hướng đến trang web chứa thẻ +// await page.goto("https://www.cskh.evnspc.vn/TraCuu/LichNgungGiamCungCapDien"); - return { data: data, columnNames: data1 }; - }); - const content = [] - tableData.data?.map((u,index)=>{ - for(let i=0; i 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"); - await browser.close(); - }, 5000); -})(); +// // 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ẻ cần trích xuất +// const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ +// // const headerRow = document.querySelectorAll("thead"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ +// // Lấy tên các cột từ hàng đầu (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ẻ ) 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ẻ ) 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ẻ ) 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 Date: Wed, 4 Oct 2023 08:30:26 +0700 Subject: [PATCH 252/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 244a789..4f48af8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -209,10 +209,10 @@ export async function runtimeCheckLogs(folderPath) { //true: import log to log_report table, send report to Zulip setTimeout(async () => { if (lines.length === 0) { - console.log(`${fileName} has changed (${eventType})---Good`); + console.log(`${fileName} has changed ---Good`); } else { console.log( - `${fileName} has changed (${eventType})---SOS---${lines.length}` + `${fileName} has changed ---SOS---${lines.length}` ); let allReport_new = await LogReport.all(); let fileDetect = allFile?.filter( From d73664d77f55a4f84d247c666d059cac740367db Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:33:41 +0700 Subject: [PATCH 253/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 4f48af8..f6077cd 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -93,6 +93,8 @@ export async function runtimeCheckLogs(folderPath) { ?.filter((i) => fileList_old.includes(i) === false) .map((file) => folderPath + "/" + file) ); + + watcher.setMaxListeners(200); await fileList ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { From 2c4a0c7d11cbccc47fc2e823f66b68889f67ca2c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:42:51 +0700 Subject: [PATCH 254/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index f6077cd..127674d 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -12,7 +12,6 @@ import { checkIndexSN } from "./checkIndexSN"; export async function runtimeCheckLogs(folderPath) { try { - const connection = Database.connection("mysql"); let fileList = Array(); let fileList_old = Array(); // Function to update the list of files From e750e871077a9de0f392dad0e0c2a478990dfc8d Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:44:14 +0700 Subject: [PATCH 255/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 127674d..d8fef7c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -88,13 +88,13 @@ export async function runtimeCheckLogs(folderPath) { async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file const watcher = chokidar.watch( - fileList + fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) .map((file) => folderPath + "/" + file) ); watcher.setMaxListeners(200); - await fileList + await fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { //path file From 49ad47f89b966c4e9b76114879d55abccc5847eb Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:46:46 +0700 Subject: [PATCH 256/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index d8fef7c..d7c3f62 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -193,14 +193,14 @@ export async function runtimeCheckLogs(folderPath) { // "'" // ); - if (checkLog?.length === 0) { - await LogReport.create({ - detected_content: value, - line: index + 1, - id_file: log?.id_ldf, - }); - lines.push(index + 1); - } + // if (checkLog?.length === 0) { + // await LogReport.create({ + // detected_content: value, + // line: index + 1, + // id_file: log?.id_ldf, + // }); + // lines.push(index + 1); + // } } // if(checkSpecialVersion()) @@ -279,19 +279,19 @@ export async function runtimeCheckLogs(folderPath) { ")\n"; }); - sendMessToZulip( - "stream", - Env.get("ZULIP_STREAM_ALERT"), - Env.get("ZULIP_TOPIC_ALERT"), - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); + // sendMessToZulip( + // "stream", + // Env.get("ZULIP_STREAM_ALERT"), + // Env.get("ZULIP_TOPIC_ALERT"), + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); } }, 3000); } From ef07a6af479c8befe2507d1fffa08b6ea3a3041d Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:48:57 +0700 Subject: [PATCH 257/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 327 ++++++++++++++++------------------ 1 file changed, 152 insertions(+), 175 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index d7c3f62..2aa201e 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -103,198 +103,175 @@ export async function runtimeCheckLogs(folderPath) { // fs.watchFile(filePath,{ interval: 15000 }, // async (eventType) => { //check special item, extra RAM, error in log - if (path === filePath) { - let lines = []; - let allFile = await LogDetectFile.all(); - let allReport = await LogReport.all(); - let allValue = await KeyValue.all(); + // if (path === filePath) { + // let lines = []; + // let allFile = await LogDetectFile.all(); + // let allReport = await LogReport.all(); + // let allValue = await KeyValue.all(); - //get information file - let fileDetect = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + // //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)); - // await LogDetectFile.findBy( - // "file_name", - // fileName - // ); - //get all log of file - // let logsDetect = await Database.rawQuery( - // "select * from log_reports where id_file = " + - // fileDetect?.id_ldf - // ); - 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 content file in local - let contentFile = await fs - .readFileSync(filePath) - .toString() - ?.split("\n"); + // //get index SN and send to ERP - //get index SN and send to ERP + // checkIndexSN(contentFile, lastLine, fileName); - 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 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 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); - //get list item special - let listExtraItem = allValue - .filter((i) => i.$original.key === "MODEL_SPECIAL") - .map((obj) => obj.$original.value); + // //Process file content + // contentFile.map((line, index) => { + // //check line the line with errors and exclude errors + // listKeyValues + // .map((obj) => obj.$original.value) + // .map(async (value) => { + // if ( + // line.search(value) !== -1 && + // listExcludeErr.filter((err) => line.includes(err)) + // .length === 0 + // ) { + // let log = allFile?.filter( + // (i) => i.$original.file_name === fileName + // )[0]; - //Process file content - contentFile.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - 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 + // ); - // const log = await LogDetectFile.findBy( - // "file_name", - // fileName - // ); - //check report of line not exist - 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); + // } + // } - // await Database.rawQuery( - // "select * from log_reports where id_file = " + - // log?.id_ldf + - // " and line = " + - // (index + 1) + - // " and detected_content='" + - // value + - // "'" - // ); + // // if(checkSpecialVersion()) + // }); + // }); - // if (checkLog?.length === 0) { - // await LogReport.create({ - // detected_content: value, - // line: index + 1, - // id_file: log?.id_ldf, - // }); - // lines.push(index + 1); - // } - } + // //true: import log to log_report table, send report to Zulip + // setTimeout(async () => { + // if (lines.length === 0) { + // console.log(`${fileName} has changed ---Good`); + // } else { + // console.log( + // `${fileName} has changed ---SOS---${lines.length}` + // ); + // let allReport_new = await LogReport.all(); + // let fileDetect = allFile?.filter( + // (i) => i.$original.file_name === fileName + // )[0]; - // if(checkSpecialVersion()) - }); - }); + // 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) + // ); - //true: import log to log_report table, send report to Zulip - setTimeout(async () => { - if (lines.length === 0) { - console.log(`${fileName} has changed ---Good`); - } else { - console.log( - `${fileName} has changed ---SOS---${lines.length}` - ); - let allReport_new = await LogReport.all(); - let fileDetect = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + // let content = + // "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + // let spoiler = ""; + // let issueFound = ""; - 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) - ); + // listReport.map((log, index) => { + // let item = listExtraItem.includes(log.detected_content) + // ? ":medal: **" + log.detected_content + "**" + // : ":small_orange_diamond: " + log.detected_content; - let content = - "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - let spoiler = ""; - let issueFound = ""; + // 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"; + // }); - 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"; - }); - - // sendMessToZulip( - // "stream", - // Env.get("ZULIP_STREAM_ALERT"), - // Env.get("ZULIP_TOPIC_ALERT"), - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - } - }, 3000); - } + // sendMessToZulip( + // "stream", + // Env.get("ZULIP_STREAM_ALERT"), + // Env.get("ZULIP_TOPIC_ALERT"), + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); + // } + // }, 3000); + // } + console.log(path + " change") }); }); } From 6de80b0104787099c38b0a2e2b78e1536ae2bd68 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:53:11 +0700 Subject: [PATCH 258/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 350 +++++++++++++++++----------------- 1 file changed, 176 insertions(+), 174 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 2aa201e..6d9d6ee 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -94,185 +94,187 @@ export async function runtimeCheckLogs(folderPath) { ); watcher.setMaxListeners(200); + + watcher.on("change", async (path) => { + // fs.watchFile(filePath,{ interval: 15000 }, + // async (eventType) => { + //check special item, extra RAM, error in log + // if (path === filePath) { + // let lines = []; + // let allFile = await LogDetectFile.all(); + // let allReport = await LogReport.all(); + // let allValue = await KeyValue.all(); + + // //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 + // contentFile.map((line, index) => { + // //check line the line with errors and exclude errors + // listKeyValues + // .map((obj) => obj.$original.value) + // .map(async (value) => { + // if ( + // line.search(value) !== -1 && + // 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()) + // }); + // }); + + // //true: import log to log_report table, send report to Zulip + // setTimeout(async () => { + // if (lines.length === 0) { + // console.log(`${fileName} has changed ---Good`); + // } else { + // console.log( + // `${fileName} has changed ---SOS---${lines.length}` + // ); + // let allReport_new = await LogReport.all(); + // 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 = ""; + + // 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"; + // }); + + // sendMessToZulip( + // "stream", + // Env.get("ZULIP_STREAM_ALERT"), + // Env.get("ZULIP_TOPIC_ALERT"), + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); + // } + // }, 3000); + // } + console.log(path + " change") + }); await fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) ?.forEach((fileName) => { //path file const filePath = `${folderPath}/${fileName}`; - watcher.on("change", async (path) => { - // fs.watchFile(filePath,{ interval: 15000 }, - // async (eventType) => { - //check special item, extra RAM, error in log - // if (path === filePath) { - // let lines = []; - // let allFile = await LogDetectFile.all(); - // let allReport = await LogReport.all(); - // let allValue = await KeyValue.all(); - - // //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 - // contentFile.map((line, index) => { - // //check line the line with errors and exclude errors - // listKeyValues - // .map((obj) => obj.$original.value) - // .map(async (value) => { - // if ( - // line.search(value) !== -1 && - // 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()) - // }); - // }); - - // //true: import log to log_report table, send report to Zulip - // setTimeout(async () => { - // if (lines.length === 0) { - // console.log(`${fileName} has changed ---Good`); - // } else { - // console.log( - // `${fileName} has changed ---SOS---${lines.length}` - // ); - // let allReport_new = await LogReport.all(); - // 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 = ""; - - // 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"; - // }); - - // sendMessToZulip( - // "stream", - // Env.get("ZULIP_STREAM_ALERT"), - // Env.get("ZULIP_TOPIC_ALERT"), - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - // } - // }, 3000); - // } - console.log(path + " change") - }); + }); } } catch (error) { From 3b39ccc271e107bf2660ef56244854e2d400dbaa Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:57:27 +0700 Subject: [PATCH 259/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 303 +++++++++++++++++----------------- 1 file changed, 152 insertions(+), 151 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 6d9d6ee..4bf88a4 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -99,175 +99,176 @@ export async function runtimeCheckLogs(folderPath) { // fs.watchFile(filePath,{ interval: 15000 }, // async (eventType) => { //check special item, extra RAM, error in log - // if (path === filePath) { - // let lines = []; - // let allFile = await LogDetectFile.all(); - // let allReport = await LogReport.all(); - // let allValue = await KeyValue.all(); + const fileName = path.split("/")[path.split("/").length - 1] + const filePath = path + let lines = []; + let allFile = await LogDetectFile.all(); + let allReport = await LogReport.all(); + let allValue = await KeyValue.all(); - // //get information file - // let fileDetect = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //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)); + 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 content file in local + let contentFile = await fs + .readFileSync(filePath) + .toString() + ?.split("\n"); - // //get index SN and send to ERP + //get index SN and send to ERP - // checkIndexSN(contentFile, lastLine, fileName); + 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 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 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); + //get list item special + let listExtraItem = allValue + .filter((i) => i.$original.key === "MODEL_SPECIAL") + .map((obj) => obj.$original.value); - // //Process file content - // contentFile.map((line, index) => { - // //check line the line with errors and exclude errors - // listKeyValues - // .map((obj) => obj.$original.value) - // .map(async (value) => { - // if ( - // line.search(value) !== -1 && - // listExcludeErr.filter((err) => line.includes(err)) - // .length === 0 - // ) { - // let log = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //Process file content + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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 - // ); + 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 (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()) + }); + }); - // //true: import log to log_report table, send report to Zulip - // setTimeout(async () => { - // if (lines.length === 0) { - // console.log(`${fileName} has changed ---Good`); - // } else { - // console.log( - // `${fileName} has changed ---SOS---${lines.length}` - // ); - // let allReport_new = await LogReport.all(); - // let fileDetect = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //true: import log to log_report table, send report to Zulip + setTimeout(async () => { + if (lines.length === 0) { + console.log(`${fileName} has changed ---Good`); + } else { + console.log( + `${fileName} has changed ---SOS---${lines.length}` + ); + let allReport_new = await LogReport.all(); + 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 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 content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + let issueFound = ""; - // listReport.map((log, index) => { - // let item = listExtraItem.includes(log.detected_content) - // ? ":medal: **" + log.detected_content + "**" - // : ":small_orange_diamond: " + log.detected_content; + 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"; - // }); + 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"; + }); - // sendMessToZulip( - // "stream", - // Env.get("ZULIP_STREAM_ALERT"), - // Env.get("ZULIP_TOPIC_ALERT"), - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - // } - // }, 3000); - // } - console.log(path + " change") + sendMessToZulip( + "stream", + Env.get("ZULIP_STREAM_ALERT"), + Env.get("ZULIP_TOPIC_ALERT"), + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n***Issue found:***\n" + + issueFound + ); + } + }, 3000); + + // console.log(path + " change") }); await fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) From 1e255cf6d7642a64b2db22be49903a75a8cab960 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 08:59:23 +0700 Subject: [PATCH 260/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 4bf88a4..3d44d33 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -268,15 +268,15 @@ export async function runtimeCheckLogs(folderPath) { } }, 3000); - // console.log(path + " change") + console.log(path + " change") }); - await fileList.slice(0,40) - ?.filter((i) => fileList_old.includes(i) === false) - ?.forEach((fileName) => { - //path file - const filePath = `${folderPath}/${fileName}`; + // await fileList.slice(0,40) + // ?.filter((i) => fileList_old.includes(i) === false) + // ?.forEach((fileName) => { + // //path file + // const filePath = `${folderPath}/${fileName}`; - }); + // }); } } catch (error) { console.log(error); From ec3fbfc857f6a38b37c75be675e1c521ce7f8956 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:07:25 +0700 Subject: [PATCH 261/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 299 ++++++++++++++++++---------------- 1 file changed, 155 insertions(+), 144 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 3d44d33..bd497cf 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -106,168 +106,179 @@ export async function runtimeCheckLogs(folderPath) { let allReport = await LogReport.all(); let allValue = await KeyValue.all(); - //get information file - let fileDetect = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + + console.log(allReport) + + + + + // //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)); + // 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 content file in local + // let contentFile = await fs + // .readFileSync(filePath) + // .toString() + // ?.split("\n"); - //get index SN and send to ERP + // //get index SN and send to ERP - checkIndexSN(contentFile, lastLine, fileName); + // 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 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 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); + // //get list item special + // let listExtraItem = allValue + // .filter((i) => i.$original.key === "MODEL_SPECIAL") + // .map((obj) => obj.$original.value); - //Process file content - contentFile.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - listExcludeErr.filter((err) => line.includes(err)) - .length === 0 - ) { - let log = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + // //Process file content + // contentFile.map((line, index) => { + // //check line the line with errors and exclude errors + // listKeyValues + // .map((obj) => obj.$original.value) + // .map(async (value) => { + // if ( + // line.search(value) !== -1 && + // 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 - ); + // 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 (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()) + // }); + // }); - //true: import log to log_report table, send report to Zulip - setTimeout(async () => { - if (lines.length === 0) { - console.log(`${fileName} has changed ---Good`); - } else { - console.log( - `${fileName} has changed ---SOS---${lines.length}` - ); - let allReport_new = await LogReport.all(); - let fileDetect = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + // //true: import log to log_report table, send report to Zulip + // setTimeout(async () => { + // if (lines.length === 0) { + // console.log(`${fileName} has changed ---Good`); + // } else { + // console.log( + // `${fileName} has changed ---SOS---${lines.length}` + // ); + // let allReport_new = await LogReport.all(); + // 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 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 content = + // "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + // let spoiler = ""; + // let issueFound = ""; - listReport.map((log, index) => { - let item = listExtraItem.includes(log.detected_content) - ? ":medal: **" + log.detected_content + "**" - : ":small_orange_diamond: " + log.detected_content; + // 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"; - }); + // 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"; + // }); - sendMessToZulip( - "stream", - Env.get("ZULIP_STREAM_ALERT"), - Env.get("ZULIP_TOPIC_ALERT"), - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); - } - }, 3000); + // sendMessToZulip( + // "stream", + // Env.get("ZULIP_STREAM_ALERT"), + // Env.get("ZULIP_TOPIC_ALERT"), + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); + // } + // }, 3000); + + + + + console.log(path + " change") }); // await fileList.slice(0,40) From e71c36441efe8bd8a944f624733f496d90aff09a Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:12:46 +0700 Subject: [PATCH 262/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index bd497cf..68af835 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -9,7 +9,7 @@ import Database from "@ioc:Adonis/Lucid/Database"; import { sendMessToZulip } from "./sendMessToZulip"; import { getListLineByItem } from "./getListLineByItem"; import { checkIndexSN } from "./checkIndexSN"; - +import { DateTime } from "luxon"; export async function runtimeCheckLogs(folderPath) { try { let fileList = Array(); @@ -102,10 +102,13 @@ export async function runtimeCheckLogs(folderPath) { const fileName = path.split("/")[path.split("/").length - 1] const filePath = path let lines = []; + const today = DateTime.now().toFormat('yyyy-MM-dd'); let allFile = await LogDetectFile.all(); - let allReport = await LogReport.all(); + // let allReport = await LogReport.all(); let allValue = await KeyValue.all(); - + const allReport = await LogReport.query() + .whereRaw(`DATE(created_at) = ?`, [today]) + .fetch(); console.log(allReport) From a9d6af93645b233bae9560c594fe7b16cac98286 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:14:07 +0700 Subject: [PATCH 263/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 68af835..0ff61c0 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -108,7 +108,6 @@ export async function runtimeCheckLogs(folderPath) { let allValue = await KeyValue.all(); const allReport = await LogReport.query() .whereRaw(`DATE(created_at) = ?`, [today]) - .fetch(); console.log(allReport) From aa9b721bfd80bda0eb99b9ffa9977d711791898a Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:18:14 +0700 Subject: [PATCH 264/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 290 +++++++++++++++++----------------- 1 file changed, 145 insertions(+), 145 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0ff61c0..8814a37 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -109,172 +109,172 @@ export async function runtimeCheckLogs(folderPath) { const allReport = await LogReport.query() .whereRaw(`DATE(created_at) = ?`, [today]) - console.log(allReport) + // console.log(allReport) - // //get information file - // let fileDetect = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //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)); + 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 content file in local + let contentFile = await fs + .readFileSync(filePath) + .toString() + ?.split("\n"); - // //get index SN and send to ERP + //get index SN and send to ERP - // checkIndexSN(contentFile, lastLine, fileName); + 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 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 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); + //get list item special + let listExtraItem = allValue + .filter((i) => i.$original.key === "MODEL_SPECIAL") + .map((obj) => obj.$original.value); - // //Process file content - // contentFile.map((line, index) => { - // //check line the line with errors and exclude errors - // listKeyValues - // .map((obj) => obj.$original.value) - // .map(async (value) => { - // if ( - // line.search(value) !== -1 && - // listExcludeErr.filter((err) => line.includes(err)) - // .length === 0 - // ) { - // let log = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //Process file content + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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 - // ); + 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 (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()) + }); + }); - // //true: import log to log_report table, send report to Zulip - // setTimeout(async () => { - // if (lines.length === 0) { - // console.log(`${fileName} has changed ---Good`); - // } else { - // console.log( - // `${fileName} has changed ---SOS---${lines.length}` - // ); - // let allReport_new = await LogReport.all(); - // let fileDetect = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + //true: import log to log_report table, send report to Zulip + setTimeout(async () => { + if (lines.length === 0) { + console.log(`${fileName} has changed ---Good`); + } else { + console.log( + `${fileName} has changed ---SOS---${lines.length}` + ); + let allReport_new = await LogReport.all(); + 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 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 content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + let issueFound = ""; - // listReport.map((log, index) => { - // let item = listExtraItem.includes(log.detected_content) - // ? ":medal: **" + log.detected_content + "**" - // : ":small_orange_diamond: " + log.detected_content; + 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"; - // }); + 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"; + }); - // sendMessToZulip( - // "stream", - // Env.get("ZULIP_STREAM_ALERT"), - // Env.get("ZULIP_TOPIC_ALERT"), - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - // } - // }, 3000); + sendMessToZulip( + "stream", + Env.get("ZULIP_STREAM_ALERT"), + Env.get("ZULIP_TOPIC_ALERT"), + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n***Issue found:***\n" + + issueFound + ); + } + }, 3000); From 42845467ef34de7f8749b01becfb93f2a04fad0c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:20:19 +0700 Subject: [PATCH 265/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 8814a37..b88877d 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -196,7 +196,8 @@ export async function runtimeCheckLogs(folderPath) { console.log( `${fileName} has changed ---SOS---${lines.length}` ); - let allReport_new = await LogReport.all(); + let allReport_new = await LogReport.query() + .whereRaw(`DATE(created_at) = ?`, [today]) let fileDetect = allFile?.filter( (i) => i.$original.file_name === fileName )[0]; From 8ff674f50b6acf5215fd54da6b439611e2088b43 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:25:01 +0700 Subject: [PATCH 266/298] change runtimeCheckLog --- app/utils/getListLineByItem.ts | 2 - app/utils/runtimeCheckLogs.ts | 165 +++++++++++++++++---------------- 2 files changed, 83 insertions(+), 84 deletions(-) diff --git a/app/utils/getListLineByItem.ts b/app/utils/getListLineByItem.ts index d6cf224..ebe432d 100644 --- a/app/utils/getListLineByItem.ts +++ b/app/utils/getListLineByItem.ts @@ -1,5 +1,3 @@ -import LogReport from "App/Models/LogReport"; - export async function getListLineByItem(listReport) { try { // Mảng ban đầu diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index b88877d..8886ebf 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -189,93 +189,94 @@ export async function runtimeCheckLogs(folderPath) { }); //true: import log to log_report table, send report to Zulip - setTimeout(async () => { - if (lines.length === 0) { - console.log(`${fileName} has changed ---Good`); - } else { - console.log( - `${fileName} has changed ---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]; + // setTimeout(async () => { + // if (lines.length === 0) { + // console.log(`${fileName} has changed ---Good`); + // } else { + // console.log( + // `${fileName} has changed ---SOS---${lines.length}` + // ); + // let allReport_new = await LogReport.query() + // .whereRaw(`DATE(created_at) = ?`, [today]) - 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 fileDetect = allFile?.filter( + // (i) => i.$original.file_name === fileName + // )[0]; - let content = - "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; - let spoiler = ""; - let issueFound = ""; + // 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) + // ); - listReport.map((log, index) => { - let item = listExtraItem.includes(log.detected_content) - ? ":medal: **" + log.detected_content + "**" - : ":small_orange_diamond: " + log.detected_content; + // let content = + // "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + // let spoiler = ""; + // let issueFound = ""; - 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"; - }); + // listReport.map((log, index) => { + // let item = listExtraItem.includes(log.detected_content) + // ? ":medal: **" + log.detected_content + "**" + // : ":small_orange_diamond: " + log.detected_content; - sendMessToZulip( - "stream", - Env.get("ZULIP_STREAM_ALERT"), - Env.get("ZULIP_TOPIC_ALERT"), - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); - } - }, 3000); + // 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"; + // }); + + // sendMessToZulip( + // "stream", + // Env.get("ZULIP_STREAM_ALERT"), + // Env.get("ZULIP_TOPIC_ALERT"), + // "------------\n\n:warning: :warning: **" + + // fileName + + // "**\n\n" + + // content + + // "\n\n" + + // spoiler + + // "\n\n***Issue found:***\n" + + // issueFound + // ); + // } + // }, 3000); From 65535a3ba4766e1c4ea7f1b95b568e9018f7fc7c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:26:14 +0700 Subject: [PATCH 267/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 8886ebf..57e5aa5 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -175,11 +175,11 @@ export async function runtimeCheckLogs(folderPath) { ); if (checkLog?.length === 0) { - await LogReport.create({ - detected_content: value, - line: index + 1, - id_file: log?.id_ldf, - }); + // await LogReport.create({ + // detected_content: value, + // line: index + 1, + // id_file: log?.id_ldf, + // }); lines.push(index + 1); } } From 0ebebdd7f089095974a1ebcaef5f24bcc97e3fca Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:28:12 +0700 Subject: [PATCH 268/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 57e5aa5..61d82f8 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -153,40 +153,40 @@ export async function runtimeCheckLogs(folderPath) { .map((obj) => obj.$original.value); //Process file content - contentFile.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - listExcludeErr.filter((err) => line.includes(err)) - .length === 0 - ) { - let log = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + // contentFile.map((line, index) => { + // //check line the line with errors and exclude errors + // listKeyValues + // .map((obj) => obj.$original.value) + // .map(async (value) => { + // if ( + // line.search(value) !== -1 && + // 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 - ); + // 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 (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()) + // }); + // }); //true: import log to log_report table, send report to Zulip // setTimeout(async () => { From 3e7b60839e24a26e7250a4f6f3f14d43a6c64dfa Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:37:35 +0700 Subject: [PATCH 269/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 65 ++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 61d82f8..ea5ebb1 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -103,7 +103,8 @@ export async function runtimeCheckLogs(folderPath) { const filePath = path let lines = []; const today = DateTime.now().toFormat('yyyy-MM-dd'); - let allFile = await LogDetectFile.all(); + 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() @@ -153,40 +154,40 @@ export async function runtimeCheckLogs(folderPath) { .map((obj) => obj.$original.value); //Process file content - // contentFile.map((line, index) => { - // //check line the line with errors and exclude errors - // listKeyValues - // .map((obj) => obj.$original.value) - // .map(async (value) => { - // if ( - // line.search(value) !== -1 && - // listExcludeErr.filter((err) => line.includes(err)) - // .length === 0 - // ) { - // let log = allFile?.filter( - // (i) => i.$original.file_name === fileName - // )[0]; + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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 - // ); + 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 (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()) + }); + }); //true: import log to log_report table, send report to Zulip // setTimeout(async () => { From b238af9d2fcd5f278cda74c5d9a89c2a243bfbb0 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 09:39:21 +0700 Subject: [PATCH 270/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index ea5ebb1..49a4372 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -153,6 +153,8 @@ export async function runtimeCheckLogs(folderPath) { .filter((i) => i.$original.key === "MODEL_SPECIAL") .map((obj) => obj.$original.value); + + console.log(contentFile.length) //Process file content contentFile.map((line, index) => { //check line the line with errors and exclude errors From b72cce28dd0b864ce03ced5a121a27eee3265f9b Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:03:41 +0700 Subject: [PATCH 271/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 106 +++++++++++++++++++++++----------- screenshot.js | 2 +- 2 files changed, 74 insertions(+), 34 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 49a4372..b8d6d98 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -156,40 +156,80 @@ export async function runtimeCheckLogs(folderPath) { console.log(contentFile.length) //Process file content - contentFile.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - 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(contentFile.length>30000){ + for (let i = 0; i < contentFile.length; i += 30000) { + const chunk = contentFile.slice(i, i + 30000); + chunk.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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()) + }); }); - }); + } + }else{ + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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()) + }); + }); + } //true: import log to log_report table, send report to Zulip // setTimeout(async () => { diff --git a/screenshot.js b/screenshot.js index 6da946d..0326eaf 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,6 +1,6 @@ let a = [1,2,3] -console.log(a.map(i=>i+1)) +console.log(a.slice(0,4)) From 3093f39ab6ce5ceb7e5cf2f9f95680ff1d00d38c Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:07:52 +0700 Subject: [PATCH 272/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index b8d6d98..0a27223 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -134,7 +134,7 @@ export async function runtimeCheckLogs(folderPath) { //get index SN and send to ERP - checkIndexSN(contentFile, lastLine, fileName); + // checkIndexSN(contentFile, lastLine, fileName); //get list item to check let listKeyValues = allValue.filter( From af2f13174edbff2ac444324a10cf97276606b1b1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:15:54 +0700 Subject: [PATCH 273/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0a27223..6b882cc 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -157,8 +157,8 @@ export async function runtimeCheckLogs(folderPath) { console.log(contentFile.length) //Process file content if(contentFile.length>30000){ - for (let i = 0; i < contentFile.length; i += 30000) { - const chunk = contentFile.slice(i, i + 30000); + for (let i = 0; i < contentFile.length; i += 10000) { + const chunk = contentFile.slice(i, i + 10000); chunk.map((line, index) => { //check line the line with errors and exclude errors listKeyValues From 58104d9b01923f3f3d744a7513ae19d09f0dbf09 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:22:10 +0700 Subject: [PATCH 274/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 68 ++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 6b882cc..7ac435a 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -159,40 +159,42 @@ export async function runtimeCheckLogs(folderPath) { if(contentFile.length>30000){ for (let i = 0; i < contentFile.length; i += 10000) { const chunk = contentFile.slice(i, i + 10000); - chunk.map((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - 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); + setTimeout(() => { + chunk.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + 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()) + }); + }); + }, 3000); } }else{ contentFile.map((line, index) => { From 077771dc108ca93ea2a797a1ce82931060782112 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:23:55 +0700 Subject: [PATCH 275/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7ac435a..c6842b6 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -159,7 +159,7 @@ export async function runtimeCheckLogs(folderPath) { if(contentFile.length>30000){ for (let i = 0; i < contentFile.length; i += 10000) { const chunk = contentFile.slice(i, i + 10000); - setTimeout(() => { + chunk.map((line, index) => { //check line the line with errors and exclude errors listKeyValues @@ -194,7 +194,6 @@ export async function runtimeCheckLogs(folderPath) { // if(checkSpecialVersion()) }); }); - }, 3000); } }else{ contentFile.map((line, index) => { From 4b708d4330668adba653620e2ff7120125d4ba7f Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:25:46 +0700 Subject: [PATCH 276/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index c6842b6..6f8aa1c 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -157,8 +157,8 @@ export async function runtimeCheckLogs(folderPath) { console.log(contentFile.length) //Process file content if(contentFile.length>30000){ - for (let i = 0; i < contentFile.length; i += 10000) { - const chunk = contentFile.slice(i, i + 10000); + for (let i = 0; i < contentFile.length; i += 1000) { + const chunk = contentFile.slice(i, i + 1000); chunk.map((line, index) => { //check line the line with errors and exclude errors From d133fe98ce1e85862be1ec66ea0ff57e0bd781d2 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:27:04 +0700 Subject: [PATCH 277/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 6f8aa1c..db4d466 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -157,8 +157,8 @@ export async function runtimeCheckLogs(folderPath) { console.log(contentFile.length) //Process file content if(contentFile.length>30000){ - for (let i = 0; i < contentFile.length; i += 1000) { - const chunk = contentFile.slice(i, i + 1000); + for (let i = 0; i < contentFile.length; i += 50000) { + const chunk = contentFile.slice(i, i + 50000); chunk.map((line, index) => { //check line the line with errors and exclude errors From b6971755189152a68bf0a02bad1db3da47cf8ce8 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:30:17 +0700 Subject: [PATCH 278/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 200 +++++++++++++++++----------------- 1 file changed, 97 insertions(+), 103 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index db4d466..e9f3132 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -134,7 +134,7 @@ export async function runtimeCheckLogs(folderPath) { //get index SN and send to ERP - // checkIndexSN(contentFile, lastLine, fileName); + checkIndexSN(contentFile, lastLine, fileName); //get list item to check let listKeyValues = allValue.filter( @@ -156,9 +156,9 @@ export async function runtimeCheckLogs(folderPath) { console.log(contentFile.length) //Process file content - if(contentFile.length>30000){ - for (let i = 0; i < contentFile.length; i += 50000) { - const chunk = contentFile.slice(i, i + 50000); + if(contentFile.length>50000){ + for (let i = 0; i < contentFile.length; i += 1000) { + const chunk = contentFile.slice(i, i + 1000); chunk.map((line, index) => { //check line the line with errors and exclude errors @@ -182,11 +182,11 @@ export async function runtimeCheckLogs(folderPath) { ); if (checkLog?.length === 0) { - // await LogReport.create({ - // detected_content: value, - // line: index + 1, - // id_file: log?.id_ldf, - // }); + await LogReport.create({ + detected_content: value, + line: index + 1, + id_file: log?.id_ldf, + }); lines.push(index + 1); } } @@ -218,11 +218,11 @@ export async function runtimeCheckLogs(folderPath) { ); if (checkLog?.length === 0) { - // await LogReport.create({ - // detected_content: value, - // line: index + 1, - // id_file: log?.id_ldf, - // }); + await LogReport.create({ + detected_content: value, + line: index + 1, + id_file: log?.id_ldf, + }); lines.push(index + 1); } } @@ -233,101 +233,95 @@ export async function runtimeCheckLogs(folderPath) { } //true: import log to log_report table, send report to Zulip - // setTimeout(async () => { - // if (lines.length === 0) { - // console.log(`${fileName} has changed ---Good`); - // } else { - // console.log( - // `${fileName} has changed ---SOS---${lines.length}` - // ); - // let allReport_new = await LogReport.query() - // .whereRaw(`DATE(created_at) = ?`, [today]) + setTimeout(async () => { + if (lines.length === 0) { + console.log(`${fileName} has changed ---Good`); + } else { + console.log( + `${fileName} has changed ---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 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 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 content = + "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; + let spoiler = ""; + let issueFound = ""; - // listReport.map((log, index) => { - // let item = listExtraItem.includes(log.detected_content) - // ? ":medal: **" + log.detected_content + "**" - // : ":small_orange_diamond: " + log.detected_content; + 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"; - // }); + 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"; + }); - // sendMessToZulip( - // "stream", - // Env.get("ZULIP_STREAM_ALERT"), - // Env.get("ZULIP_TOPIC_ALERT"), - // "------------\n\n:warning: :warning: **" + - // fileName + - // "**\n\n" + - // content + - // "\n\n" + - // spoiler + - // "\n\n***Issue found:***\n" + - // issueFound - // ); - // } - // }, 3000); - - - - - - - console.log(path + " change") + sendMessToZulip( + "stream", + Env.get("ZULIP_STREAM_ALERT"), + Env.get("ZULIP_TOPIC_ALERT"), + "------------\n\n:warning: :warning: **" + + fileName + + "**\n\n" + + content + + "\n\n" + + spoiler + + "\n\n***Issue found:***\n" + + issueFound + ); + } + }, 3000) + // console.log(path + " change") }); // await fileList.slice(0,40) // ?.filter((i) => fileList_old.includes(i) === false) From a9f59638468efcf22dced77d8cf5e477d3fb3b06 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:43:35 +0700 Subject: [PATCH 279/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index e9f3132..7795b40 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -90,8 +90,9 @@ export async function runtimeCheckLogs(folderPath) { const watcher = chokidar.watch( fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) - .map((file) => folderPath + "/" + file) - ); + .map((file) => folderPath + "/" + file),{ + interval: 300000 + }); watcher.setMaxListeners(200); @@ -110,11 +111,6 @@ export async function runtimeCheckLogs(folderPath) { const allReport = await LogReport.query() .whereRaw(`DATE(created_at) = ?`, [today]) - // console.log(allReport) - - - - //get information file let fileDetect = allFile?.filter( (i) => i.$original.file_name === fileName From c6333d40ea3a4f9b7145841f65bac794589e3e1e Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 10:48:31 +0700 Subject: [PATCH 280/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 7795b40..57a6dc0 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -91,6 +91,7 @@ export async function runtimeCheckLogs(folderPath) { fileList.slice(0,40) ?.filter((i) => fileList_old.includes(i) === false) .map((file) => folderPath + "/" + file),{ + persistent: true, interval: 300000 }); @@ -149,8 +150,6 @@ export async function runtimeCheckLogs(folderPath) { .filter((i) => i.$original.key === "MODEL_SPECIAL") .map((obj) => obj.$original.value); - - console.log(contentFile.length) //Process file content if(contentFile.length>50000){ for (let i = 0; i < contentFile.length; i += 1000) { @@ -231,10 +230,10 @@ export async function runtimeCheckLogs(folderPath) { //true: import log to log_report table, send report to Zulip setTimeout(async () => { if (lines.length === 0) { - console.log(`${fileName} has changed ---Good`); + console.log(fileName + "has changed("+contentFile.length+") ---Good"); } else { console.log( - `${fileName} has changed ---SOS---${lines.length}` + fileName + "has changed("+contentFile.length+") ---SOS---"+lines.length ); let allReport_new = await LogReport.query() .whereRaw(`DATE(created_at) = ?`, [today]) From 6d04a73c351d02304e1fd62fe94b649d2c0cbe40 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 11:15:31 +0700 Subject: [PATCH 281/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 373 ++++++++++++++++++---------------- 1 file changed, 195 insertions(+), 178 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 57a6dc0..653c256 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -87,13 +87,14 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file + let listFileWatch = fileList.slice(0, 40)?.filter((i) => fileList_old.includes(i) === false).map((file) => folderPath + "/" + file) const watcher = chokidar.watch( - fileList.slice(0,40) - ?.filter((i) => fileList_old.includes(i) === false) - .map((file) => folderPath + "/" + file),{ - persistent: true, - interval: 300000 - }); + listFileWatch, + { + persistent: true, + interval: 300000, + } + ); watcher.setMaxListeners(200); @@ -101,97 +102,65 @@ export async function runtimeCheckLogs(folderPath) { // fs.watchFile(filePath,{ interval: 15000 }, // async (eventType) => { //check special item, extra RAM, error in log - const fileName = path.split("/")[path.split("/").length - 1] - const filePath = path - let lines = []; - 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]) + const fileName = path.split("/")[path.split("/").length - 1]; + const filePath = path; + let lines = []; + 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 information file + let fileDetect = allFile?.filter( + (i) => i.$original.file_name === fileName + )[0]; - //get content file in local - let contentFile = await fs - .readFileSync(filePath) - .toString() - ?.split("\n"); + 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 index SN and send to ERP + //get content file in local + let contentFile = await fs + .readFileSync(filePath) + .toString() + ?.split("\n"); - checkIndexSN(contentFile, lastLine, fileName); + //get index SN and send to ERP - //get list item to check - let listKeyValues = allValue.filter( - (i) => - i.$original.key === "MODEL_SPECIAL" || - i.$original.key === "CATCH_FAULTY" - ); + checkIndexSN(contentFile, lastLine, fileName); - //get list exclude error - let listExcludeErr = allValue - .filter((i) => i.$original.key === "EXCLUDE_ERR") - .map((obj) => obj.$original.value); + //get list item to check + let listKeyValues = allValue.filter( + (i) => + i.$original.key === "MODEL_SPECIAL" || + i.$original.key === "CATCH_FAULTY" + ); - //get list item special - let listExtraItem = allValue - .filter((i) => i.$original.key === "MODEL_SPECIAL") - .map((obj) => obj.$original.value); + //get list exclude error + let listExcludeErr = allValue + .filter((i) => i.$original.key === "EXCLUDE_ERR") + .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((line, index) => { - //check line the line with errors and exclude errors - listKeyValues - .map((obj) => obj.$original.value) - .map(async (value) => { - if ( - line.search(value) !== -1 && - 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()) - }); - }); - } - }else{ - contentFile.map((line, index) => { + //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((line, index) => { //check line the line with errors and exclude errors listKeyValues .map((obj) => obj.$original.value) @@ -204,14 +173,14 @@ export async function runtimeCheckLogs(folderPath) { 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, @@ -221,109 +190,157 @@ export async function runtimeCheckLogs(folderPath) { lines.push(index + 1); } } - + // if(checkSpecialVersion()) }); }); } + } else { + contentFile.map((line, index) => { + //check line the line with errors and exclude errors + listKeyValues + .map((obj) => obj.$original.value) + .map(async (value) => { + if ( + line.search(value) !== -1 && + listExcludeErr.filter((err) => line.includes(err)).length === + 0 + ) { + let log = allFile?.filter( + (i) => i.$original.file_name === fileName + )[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 checkLog = allReport?.filter( + (report) => + report.$original.id_file === log?.id_ldf && + report.$original.line === index + 1 && + report.$original.detected_content === value + ); - let fileDetect = allFile?.filter( - (i) => i.$original.file_name === fileName - )[0]; + if (checkLog?.length === 0) { + await LogReport.create({ + detected_content: value, + line: index + 1, + id_file: log?.id_ldf, + }); + lines.push(index + 1); + } + } - 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 = ""; - - 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"; + // if(checkSpecialVersion()) }); + }); + } - sendMessToZulip( - "stream", - Env.get("ZULIP_STREAM_ALERT"), - Env.get("ZULIP_TOPIC_ALERT"), - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + - content + - "\n\n" + - spoiler + - "\n\n***Issue found:***\n" + - issueFound - ); - } - }, 3000) + //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 = ""; + + 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"; + }); + + sendMessToZulip( + "stream", + Env.get("ZULIP_STREAM_ALERT"), + Env.get("ZULIP_TOPIC_ALERT"), + "------------\n\n:warning: :warning: **" + + fileName + + "**\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) { From 5550b21bf82ee3c41a5bf735c133eb30e8b8e869 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 12:13:42 +0700 Subject: [PATCH 282/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 653c256..0b0d34d 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -87,7 +87,7 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file - let listFileWatch = fileList.slice(0, 40)?.filter((i) => fileList_old.includes(i) === false).map((file) => folderPath + "/" + file) + let listFileWatch = fileList?.filter((i) => fileList_old.includes(i) === false).map((file) => folderPath + "/" + file) const watcher = chokidar.watch( listFileWatch, { From d8efb4487fcbb36cb2a5a4fa21b5cddd7da6b4a3 Mon Sep 17 00:00:00 2001 From: joseph le Date: Wed, 4 Oct 2023 14:29:37 +0700 Subject: [PATCH 283/298] change runtimeCheckLog --- app/utils/runtimeCheckLogs.ts | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 0b0d34d..28b4a46 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -87,14 +87,13 @@ export async function runtimeCheckLogs(folderPath) { // Watch for changes in the files listed async function watchFilesInList() { //only check new file ---> fileList - fileList_old = new file - let listFileWatch = fileList?.filter((i) => fileList_old.includes(i) === false).map((file) => folderPath + "/" + file) - const watcher = chokidar.watch( - listFileWatch, - { - persistent: true, - interval: 300000, - } - ); + let listFileWatch = fileList + ?.filter((i) => fileList_old.includes(i) === false) + .map((file) => folderPath + "/" + file); + const watcher = chokidar.watch(listFileWatch, { + persistent: true, + interval: 300000, + }); watcher.setMaxListeners(200); @@ -103,6 +102,7 @@ export async function runtimeCheckLogs(folderPath) { // async (eventType) => { //check special item, extra RAM, error in log const fileName = path.split("/")[path.split("/").length - 1]; + // const fileName = path.split("\\")[path.split("\\").length - 1]; const filePath = path; let lines = []; const today = DateTime.now().toFormat("yyyy-MM-dd"); @@ -166,7 +166,7 @@ export async function runtimeCheckLogs(folderPath) { .map((obj) => obj.$original.value) .map(async (value) => { if ( - line.search(value) !== -1 && + line.includes(value) && listExcludeErr.filter((err) => line.includes(err)) .length === 0 ) { @@ -201,8 +201,9 @@ export async function runtimeCheckLogs(folderPath) { listKeyValues .map((obj) => obj.$original.value) .map(async (value) => { + // console.log({line:Array(line), value:Array(value)}) if ( - line.search(value) !== -1 && + line.includes(value) && listExcludeErr.filter((err) => line.includes(err)).length === 0 ) { @@ -216,7 +217,7 @@ export async function runtimeCheckLogs(folderPath) { report.$original.line === index + 1 && report.$original.detected_content === value ); - + if (checkLog?.length === 0) { await LogReport.create({ detected_content: value, @@ -274,7 +275,11 @@ export async function runtimeCheckLogs(folderPath) { "| |Last updated at | Item/error | Line | Report \n|---|:---:|:---|:---|:-----------:\n"; let spoiler = ""; let issueFound = ""; - + let important = [ + "Vxx", + "V00", + "(CAT3K_CAA-UNIVERSALK9-M), Version 16.9.", + ]; listReport.map((log, index) => { let item = listExtraItem.includes(log.detected_content) ? ":medal: **" + log.detected_content + "**" @@ -314,13 +319,16 @@ export async function runtimeCheckLogs(folderPath) { ")\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"), - "------------\n\n:warning: :warning: **" + - fileName + - "**\n\n" + + icon + + "\n\n" + content + "\n\n" + spoiler + From 97a270777d1cb658351855a85ac73d96c04e57f5 Mon Sep 17 00:00:00 2001 From: joseph le Date: Sat, 7 Oct 2023 10:02:58 +0700 Subject: [PATCH 284/298] update interval time, create regex version special --- app/utils/checkIndexSN.ts | 14 ++++-- app/utils/powerSchedule.js | 53 +++++++++++--------- app/utils/runtimeCheckLogs.ts | 92 ++++++++++++++++++++++++++++++----- screenshot.js | 36 +++++++++++++- 4 files changed, 154 insertions(+), 41 deletions(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index 3d84d0a..bec3225 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -1,3 +1,4 @@ +import Env from "@ioc:Adonis/Core/Env"; // const axios = require("axios"); // import fs from "fs"; @@ -23,7 +24,8 @@ export const checkIndexSN = async (content, beginLine, nameF) => { ?.split(":")[1] ?.replace("\r", "") .trim() !== "" && - SN !== "N/A" && SN.length>4 && + SN !== "N/A" && + SN.length > 4 && i >= beginLine ) { if (output.some((u) => u.SN === SN)) { @@ -170,10 +172,10 @@ export const checkIndexSN = async (content, beginLine, nameF) => { 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", @@ -185,13 +187,15 @@ export const checkIndexSN = async (content, beginLine, nameF) => { { headers: { Authorization: "Bearer " + token } } ); - const response_int = await axios.post( + 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); + console.log(nameF + " response\n", response_int.data); + } } } } catch (error) { diff --git a/app/utils/powerSchedule.js b/app/utils/powerSchedule.js index d2286a4..17d9134 100644 --- a/app/utils/powerSchedule.js +++ b/app/utils/powerSchedule.js @@ -29,38 +29,47 @@ const zulip = require("zulip-js"); // 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ẻ cần trích xuất - const rows = tbody.querySelectorAll('tr'); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ - + const tbody = document.querySelector("tbody"); // Lựa chọn thẻ cần trích xuất + const rows = tbody.querySelectorAll("tr"); // Lựa chọn tất cả các hàng (thẻ ) bên trong thẻ + // Lặp qua từng hàng và lấy nội dung của các cột (thẻ ) 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ẻ ) trong hàng + const columns = Array.from(row.querySelectorAll("td")); // Lựa chọn tất cả các cột (thẻ ) 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(); + 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 + 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-------", - }; + 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); - -})(); \ No newline at end of file +})(); diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index 28b4a46..bc09fbb 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -37,13 +37,26 @@ export async function runtimeCheckLogs(folderPath) { const checkSpecialVersion = (paragraph) => { try { const regex = /\(CAT3K_CAA-UNIVERSALK9-M\), Version 16\.9\.[2-9]/; - const regex1 = /Version (\d+\.\d+\.\d+)/; + 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); - if (match) { - const desiredSubstring = match[0]; - const match2 = desiredSubstring.match(regex1); - return match2[0]; + 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 ""; } @@ -60,8 +73,8 @@ export async function runtimeCheckLogs(folderPath) { if ( filePath?.split(".")[filePath.split(".").length - 1] === "log" && filePath.split("/")[filePath.split("/").length - 1]?.split("-")[0] === - //localhost - // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === + //localhost + // filePath.split("\\")[filePath.split("\\").length - 1]?.split("-")[0] === moment(Date.now()).format("YYYYMMDD").toString() ) { //add information file to database @@ -92,6 +105,7 @@ export async function runtimeCheckLogs(folderPath) { .map((file) => folderPath + "/" + file); const watcher = chokidar.watch(listFileWatch, { persistent: true, + usePolling: true, interval: 300000, }); @@ -160,7 +174,7 @@ export async function runtimeCheckLogs(folderPath) { for (let i = 0; i < contentFile.length; i += 1000) { const chunk = contentFile.slice(i, i + 1000); - chunk.map((line, index) => { + chunk.map(async (line, index) => { //check line the line with errors and exclude errors listKeyValues .map((obj) => obj.$original.value) @@ -193,10 +207,36 @@ export async function runtimeCheckLogs(folderPath) { // 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((line, index) => { + contentFile.map(async (line, index) => { //check line the line with errors and exclude errors listKeyValues .map((obj) => obj.$original.value) @@ -217,7 +257,7 @@ export async function runtimeCheckLogs(folderPath) { report.$original.line === index + 1 && report.$original.detected_content === value ); - + if (checkLog?.length === 0) { await LogReport.create({ detected_content: value, @@ -230,6 +270,32 @@ export async function runtimeCheckLogs(folderPath) { // 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); + } + } }); } @@ -278,7 +344,7 @@ export async function runtimeCheckLogs(folderPath) { let important = [ "Vxx", "V00", - "(CAT3K_CAA-UNIVERSALK9-M), Version 16.9.", + "(CAT3K_CAA-UNIVERSALK9-M), Version", ]; listReport.map((log, index) => { let item = listExtraItem.includes(log.detected_content) @@ -321,7 +387,9 @@ export async function runtimeCheckLogs(folderPath) { let icon = important.filter((i) => content.includes(i)).length > 0 - ? "------------\n\n:no_entry: :no_entry:**" + fileName + "**:no_entry: :no_entry:" + ? "------------\n\n:no_entry: :no_entry:**" + + fileName + + "**:no_entry: :no_entry:" : "------------\n\n:warning: :warning: **" + fileName + "**"; sendMessToZulip( "stream", diff --git a/screenshot.js b/screenshot.js index 0326eaf..3c35259 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,8 +1,40 @@ -let a = [1,2,3] +// let a = [1,2,3] -console.log(a.slice(0,4)) +// 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"); From 1aa8acc16115e38394570b45be610d793e2f3940 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:08:51 +0700 Subject: [PATCH 285/298] create function sendDeviceInfor to mail --- app/utils/runtimeCheckLogs.ts | 4 +- app/utils/sendDeviceInfor.ts | 315 ++++++++++++++++++++++++++++++++++ package-lock.json | 15 ++ package.json | 2 + screenshot.js | 68 ++++---- start/routes.ts | 10 ++ 6 files changed, 382 insertions(+), 32 deletions(-) create mode 100644 app/utils/sendDeviceInfor.ts diff --git a/app/utils/runtimeCheckLogs.ts b/app/utils/runtimeCheckLogs.ts index bc09fbb..2b29ecd 100644 --- a/app/utils/runtimeCheckLogs.ts +++ b/app/utils/runtimeCheckLogs.ts @@ -38,9 +38,9 @@ export async function runtimeCheckLogs(folderPath) { 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]/; + /\(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]\.[2-9]/; + /\(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); diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts new file mode 100644 index 0000000..26d7c61 --- /dev/null +++ b/app/utils/sendDeviceInfor.ts @@ -0,0 +1,315 @@ +import Env from '@ioc:Adonis/Core/Env'; +import fs from "fs"; +import moment from "moment/moment"; +import dotenv from "dotenv"; +import nodeMailer from "nodemailer"; +dotenv.config(); + +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 listInformation = []; + let html = ""; + //List file today + const listFile = fs + .readdirSync(Env.get('FOLDER_LOGS')) + .filter((f) => f.includes("TEST01")); + + //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((file) => { + fs.readFile(Env.get('FOLDER_LOGS') + "/" + file, "utf8", (err, data) => { + if (err) { + console.log(`Error reading file: ${err}`); + } else { + //Array line + const lines = data?.split("\n"); + const linesInventory = []; + //Get index of "lines" with show inv + lines?.map((line, index) => { + if (line.match(regexInventory) !== null) { + linesInventory.push(index); + } + }); + // console.log(linesInventory); + //cut content with content1 = [linesInventory[index],linesInventory[index+1]] ... + linesInventory?.map((line, index) => { + const deviceContent = lines?.slice( + linesInventory[index], + linesInventory[index + 1] + ); + 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 !== "") { + let RAM = + ( + parseInt( + showVersion + .filter((line) => line.includes("bytes of memory")) + .join("
") + .match(regexMemory)[0] + ) / + 1024 / + 1024 + ).toFixed(2) + "G"; + + let flash = showVersion + .filter((line) => + line.toLocaleLowerCase().includes("compactflash") + ) + .join("
"); + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: RAM, + flash: + flash.match(regexMemory) !== null + ? ( + parseInt(flash.match(regexMemory)[0]) / + 1024 / + 1024 + ).toFixed(2) + "G" + : "", + extraItem: "yes", + }); + + html += `${PID} + ${VID} + ${SN} + ${RAM} + ${ + flash.match(regexMemory) !== null + ? ( + parseInt(flash.match(regexMemory)[0]) / + 1024 / + 1024 + ).toFixed(2) + "G" + : "" + } + yes`; + } + } else { + if (PID !== "" && SN !== "") { + let RAM = + ( + parseInt( + showVersion + .filter((line) => line.includes("bytes of memory")) + .join("
") + .match(regexMemory)[0] + ) / + 1024 / + 1024 + ).toFixed(2) + "G"; + + let flash = showVersion + .filter((line) => + line.toLocaleLowerCase().includes("compactflash") + ) + .join("
"); + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: RAM, + flash: + flash.match(regexMemory) !== null + ? ( + parseInt(flash.match(regexMemory)[0]) / + 1024 / + 1024 + ).toFixed(2) + "G" + : "", + extraItem: "no", + }); + + html += `${PID} + ${VID} + ${SN} + ${RAM} + ${ + flash.match(regexMemory) !== null + ? ( + parseInt(flash.match(regexMemory)[0]) / + 1024 / + 1024 + ).toFixed(2) + "G" + : "" + } + no`; + } + } + }); + } else { + //show version not exists --> RAM = N/A, Flash = N/A + showInventoryContent.map((u, index) => { + const PID = u + ?.split("VID:")[0] + ?.split("PID:")[1] + ?.replace(/,/g, "") + .trim(); + const VID = u + ?.split("VID:")[1] + ?.split("SN:")[0] + ?.replace(/,/g, "") + .trim(); + const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim(); + + if (index > 0) { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extraItem: "yes", + }); + + html += `${PID} + ${VID} + ${SN} + + + yes`; + } + } else { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extraItem: "no", + }); + + html += `${PID} + ${VID} + ${SN} + + + no`; + } + } + }); + } + }); + } + }); + }); + + setTimeout(() => { + console.log(listInformation); + const options = { + from: "admin@apactech.io", + to: "joseph@apactech.io", + subject: "SN AUTO REPORT", + html: + "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + " + + html + + "\ +
PIDVIDSNRAMFlashExtra Item
", + }; + transporter.sendMail(options); + }, 5000); + // const match = "show inventory".match(regexInventory); + + // console.log(match) + } catch (error) { + console.log(error); + } +} diff --git a/package-lock.json b/package-lock.json index cab53c1..e8d3ef2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,12 +17,14 @@ "axios": "^1.4.0", "child_process": "^1.0.2", "chokidar": "^3.5.3", + "dotenv": "^16.3.1", "fs": "^0.0.1-security", "helpers": "^0.0.6", "jsonwebtoken": "^9.0.1", "luxon": "^3.4.0", "moment": "^2.29.4", "mysql2": "^3.6.0", + "nodemailer": "^6.9.5", "path": "^0.12.7", "proxy-addr": "^2.0.7", "puppeteer": "^21.2.1", @@ -6203,6 +6205,14 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/nodemailer": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -14083,6 +14093,11 @@ "acorn-walk": "^8.0.2" } }, + "nodemailer": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 32c734b..2a1b2db 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,14 @@ "axios": "^1.4.0", "child_process": "^1.0.2", "chokidar": "^3.5.3", + "dotenv": "^16.3.1", "fs": "^0.0.1-security", "helpers": "^0.0.6", "jsonwebtoken": "^9.0.1", "luxon": "^3.4.0", "moment": "^2.29.4", "mysql2": "^3.6.0", + "nodemailer": "^6.9.5", "path": "^0.12.7", "proxy-addr": "^2.0.7", "puppeteer": "^21.2.1", diff --git a/screenshot.js b/screenshot.js index 3c35259..10f0f01 100644 --- a/screenshot.js +++ b/screenshot.js @@ -1,40 +1,48 @@ +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]); - } +// 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 (match1) { +// console.log(match1[0]); +// } - if (match2) { - console.log(match2[0]); - } - } else { - return ""; - } - } catch (error) { - console.log(error); - } -}; +// 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)" -); +// 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"); diff --git a/start/routes.ts b/start/routes.ts index f5c0786..0e45dca 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -25,6 +25,7 @@ import Env from "@ioc:Adonis/Core/Env"; import { sendMessToZulip } from "App/utils/sendMessToZulip"; import moment from "moment"; import Product from "App/Models/Product"; +import { sendDeviceInfora } from "App/utils/sendDeviceInfor"; runtimeCheckLogs(Env.get("FOLDER_LOGS")); @@ -279,3 +280,12 @@ Route.post("/api/backupProduct", async ({ request, response }) => { ); } }).middleware("writeLog"); + +Route.post("/api/test", async ({ request, response }) => { + try { + sendDeviceInfora() + } catch (error) { + console.log(error) + } +}) + From f941cc615b6d9a61b10c45a1f5c79cb3e46573d1 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:13:23 +0700 Subject: [PATCH 286/298] create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 62 ++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index 26d7c61..e592df4 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -1,4 +1,4 @@ -import Env from '@ioc:Adonis/Core/Env'; +import Env from "@ioc:Adonis/Core/Env"; import fs from "fs"; import moment from "moment/moment"; import dotenv from "dotenv"; @@ -17,7 +17,7 @@ export const sendDeviceInfora = async () => { let html = ""; //List file today const listFile = fs - .readdirSync(Env.get('FOLDER_LOGS')) + .readdirSync(Env.get("FOLDER_LOGS")) .filter((f) => f.includes("TEST01")); //Configure mail @@ -34,7 +34,7 @@ export const sendDeviceInfora = async () => { //Read file in listFile await listFile.map((file) => { - fs.readFile(Env.get('FOLDER_LOGS') + "/" + file, "utf8", (err, data) => { + fs.readFile(Env.get("FOLDER_LOGS") + "/" + file, "utf8", (err, data) => { if (err) { console.log(`Error reading file: ${err}`); } else { @@ -123,16 +123,23 @@ export const sendDeviceInfora = async () => { if (index > 0) { if (PID !== "" && SN !== "") { let RAM = - ( - parseInt( - showVersion - .filter((line) => line.includes("bytes of memory")) - .join("
") - .match(regexMemory)[0] - ) / - 1024 / - 1024 - ).toFixed(2) + "G"; + showVersion + .filter((line) => line.includes("bytes of memory")) + .join("
") + .match(regexMemory) !== null + ? ( + parseInt( + showVersion + .filter((line) => + line.includes("bytes of memory") + ) + .join("
") + .match(regexMemory)[0] + ) / + 1024 / + 1024 + ).toFixed(2) + "G" + : ""; let flash = showVersion .filter((line) => @@ -173,16 +180,23 @@ export const sendDeviceInfora = async () => { } else { if (PID !== "" && SN !== "") { let RAM = - ( - parseInt( - showVersion - .filter((line) => line.includes("bytes of memory")) - .join("
") - .match(regexMemory)[0] - ) / - 1024 / - 1024 - ).toFixed(2) + "G"; + showVersion + .filter((line) => line.includes("bytes of memory")) + .join("
") + .match(regexMemory) !== null + ? ( + parseInt( + showVersion + .filter((line) => + line.includes("bytes of memory") + ) + .join("
") + .match(regexMemory)[0] + ) / + 1024 / + 1024 + ).toFixed(2) + "G" + : ""; let flash = showVersion .filter((line) => @@ -312,4 +326,4 @@ export const sendDeviceInfora = async () => { } catch (error) { console.log(error); } -} +}; From ce040610297de6dfcce1d6ed97210fd94d63f048 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:26:22 +0700 Subject: [PATCH 287/298] create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 73 ++++++++++++++---------------------- 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index e592df4..f56b6e1 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -122,73 +122,58 @@ export const sendDeviceInfora = async () => { // let memory = if (index > 0) { if (PID !== "" && SN !== "") { - let RAM = - showVersion - .filter((line) => line.includes("bytes of memory")) - .join("
") - .match(regexMemory) !== null - ? ( - parseInt( - showVersion - .filter((line) => - line.includes("bytes of memory") - ) - .join("
") - .match(regexMemory)[0] - ) / - 1024 / - 1024 - ).toFixed(2) + "G" - : ""; + // let RAM = + // showVersion + // .filter((line) => line.includes("bytes of memory")) + // .join("
") + // .match(regexMemory) !== null + // ? ( + // parseInt( + // showVersion + // .filter((line) => + // line.includes("bytes of memory") + // ) + // .join("
") + // .match(regexMemory)[0] + // ) / + // 1024 / + // 1024 + // ).toFixed(2) + "G" + // : ""; - let flash = showVersion - .filter((line) => - line.toLocaleLowerCase().includes("compactflash") - ) - .join("
"); + // let flash = showVersion + // .filter((line) => + // line.toLocaleLowerCase().includes("compactflash") + // ) + // .join("
"); listInformation.push({ PID: PID, VID: VID, SN: SN, - RAM: RAM, - flash: - flash.match(regexMemory) !== null - ? ( - parseInt(flash.match(regexMemory)[0]) / - 1024 / - 1024 - ).toFixed(2) + "G" - : "", + RAM: "", + flash: "", extraItem: "yes", }); html += `${PID} ${VID} ${SN} - ${RAM} - ${ - flash.match(regexMemory) !== null - ? ( - parseInt(flash.match(regexMemory)[0]) / - 1024 / - 1024 - ).toFixed(2) + "G" - : "" - } + + yes`; } } else { if (PID !== "" && SN !== "") { let RAM = showVersion - .filter((line) => line.includes("bytes of memory")) + .filter((line) => line.includes("bytes of memory") || line.includes("bytes of physical memory")) .join("
") .match(regexMemory) !== null ? ( parseInt( showVersion .filter((line) => - line.includes("bytes of memory") + line.includes("bytes of memory") || line.includes("bytes of physical memory") ) .join("
") .match(regexMemory)[0] From 869008a066d4a1cb7e3c7a09450c9042aaacd9a6 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:28:03 +0700 Subject: [PATCH 288/298] Create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index f56b6e1..a67416e 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -18,7 +18,6 @@ export const sendDeviceInfora = async () => { //List file today const listFile = fs .readdirSync(Env.get("FOLDER_LOGS")) - .filter((f) => f.includes("TEST01")); //Configure mail const transporter = nodeMailer.createTransport({ From e7ede1a3b93f2967136ba6cae3ba05b3d8dff229 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:41:09 +0700 Subject: [PATCH 289/298] Create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index a67416e..ae6eb40 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -53,6 +53,7 @@ export const sendDeviceInfora = async () => { linesInventory[index], linesInventory[index + 1] ); + let backgroundColor = index%2===0?"rgb(200 200 200 / 39%)":"white" const showInventory = []; let check = true; let begin = 0; @@ -154,7 +155,7 @@ export const sendDeviceInfora = async () => { extraItem: "yes", }); - html += `${PID} + html += `${PID} ${VID} ${SN} @@ -203,7 +204,7 @@ export const sendDeviceInfora = async () => { extraItem: "no", }); - html += `${PID} + html += `${PID} ${VID} ${SN} ${RAM} @@ -246,7 +247,7 @@ export const sendDeviceInfora = async () => { extraItem: "yes", }); - html += `${PID} + html += `${PID} ${VID} ${SN} @@ -264,7 +265,7 @@ export const sendDeviceInfora = async () => { extraItem: "no", }); - html += `${PID} + html += `${PID} ${VID} ${SN} From 41cf39d554869ea9c03b73db8a590052f06fdd7f Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:43:37 +0700 Subject: [PATCH 290/298] Create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index ae6eb40..05674c2 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -155,7 +155,7 @@ export const sendDeviceInfora = async () => { extraItem: "yes", }); - html += `${PID} + html += `${PID} ${VID} ${SN} @@ -247,7 +247,7 @@ export const sendDeviceInfora = async () => { extraItem: "yes", }); - html += `${PID} + html += `${PID} ${VID} ${SN} From 16386ddc0316f23ecd7ca784d24414a2ee1c4294 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:44:45 +0700 Subject: [PATCH 291/298] Create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index 05674c2..a7ed675 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -53,7 +53,7 @@ export const sendDeviceInfora = async () => { linesInventory[index], linesInventory[index + 1] ); - let backgroundColor = index%2===0?"rgb(200 200 200 / 39%)":"white" + let backgroundColor = "rgb(200 200 200 / 39%)" const showInventory = []; let check = true; let begin = 0; From 17cb02d5992f5580746daf955c06ccf0f0137563 Mon Sep 17 00:00:00 2001 From: joseph le Date: Mon, 9 Oct 2023 16:44:58 +0700 Subject: [PATCH 292/298] Create function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index a7ed675..162c7c8 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -53,7 +53,7 @@ export const sendDeviceInfora = async () => { linesInventory[index], linesInventory[index + 1] ); - let backgroundColor = "rgb(200 200 200 / 39%)" + let backgroundColor = "rgb(200 200 200 / 30%)" const showInventory = []; let check = true; let begin = 0; From ca18146b236df1b22c9a5c06fc04b14737e3f768 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 09:31:24 +0700 Subject: [PATCH 293/298] update prod --- app/utils/checkIndexSN.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/checkIndexSN.ts b/app/utils/checkIndexSN.ts index bec3225..af7ae73 100644 --- a/app/utils/checkIndexSN.ts +++ b/app/utils/checkIndexSN.ts @@ -187,7 +187,7 @@ export const checkIndexSN = async (content, beginLine, nameF) => { { headers: { Authorization: "Bearer " + token } } ); - if (Env.get("RUN_ENV") !== "prod") { + if (Env.get("RUN_ENV") === "prod") { const response_int = await axios.post( "https://int.ipsupply.com.au/api/transferPostData", data, From 297ca11585486a0dedaa42a31d8270ac18c6bd0b Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 10:26:00 +0700 Subject: [PATCH 294/298] Update function sendDeviceInfor to mail --- app/Models/InfoDevice.ts | 34 ++ app/Models/LogDetectFile.ts | 3 + app/utils/sendDeviceInfor.ts | 521 ++++++++++-------- .../migrations/1696904362937_info_devices.ts | 21 + 4 files changed, 355 insertions(+), 224 deletions(-) create mode 100644 app/Models/InfoDevice.ts create mode 100644 database/migrations/1696904362937_info_devices.ts diff --git a/app/Models/InfoDevice.ts b/app/Models/InfoDevice.ts new file mode 100644 index 0000000..b894a6d --- /dev/null +++ b/app/Models/InfoDevice.ts @@ -0,0 +1,34 @@ +import { DateTime } from 'luxon' +import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm' + +export default class InfoDevice extends BaseModel { + public static table = 'info_devices' + + @column({ isPrimary: true }) + public id_info: number + + @column() + public PID: string + + @column() + public SN: string + + @column() + public VID: string + + @column() + public RAM: string + + @column() + public flash: string + + @column() + public extraItem: string + + @column.dateTime({ autoCreate: true }) + public created_at: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + public updated_at: DateTime + +} diff --git a/app/Models/LogDetectFile.ts b/app/Models/LogDetectFile.ts index 84e7354..5a21f22 100644 --- a/app/Models/LogDetectFile.ts +++ b/app/Models/LogDetectFile.ts @@ -11,6 +11,9 @@ export default class LogDetectFile extends BaseModel { @column() public file_name: string + @column() + public last_check_SN: number + @column.dateTime({ autoCreate: true }) public created_at: DateTime diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index 162c7c8..5a27219 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -3,6 +3,9 @@ import fs from "fs"; import moment from "moment/moment"; import dotenv from "dotenv"; import nodeMailer from "nodemailer"; +import LogDetectFile from "App/Models/LogDetectFile"; +import InfoDevice from "App/Models/InfoDevice"; +import KeyValue from "App/Models/KeyValue"; dotenv.config(); export const sendDeviceInfora = async () => { @@ -13,11 +16,16 @@ export const sendDeviceInfora = async () => { const regexVersion = /sh.*? ver.*/; const regexMemory = /(\d+)K/g; const date = moment(Date.now()).format("YYYYMMDD"); + const memDefault = (await KeyValue.all()) + .filter((i) => i.$attributes.key === "MEMORY_DEFAULT") + .map((obj) => obj.$attributes.value); const listInformation = []; + let dataFile = await LogDetectFile.all(); + // console.log(dataFile) + // console.log(dataFile) let html = ""; //List file today - const listFile = fs - .readdirSync(Env.get("FOLDER_LOGS")) + const listFile = fs.readdirSync(Env.get("FOLDER_LOGS")); //Configure mail const transporter = nodeMailer.createTransport({ @@ -32,179 +40,236 @@ export const sendDeviceInfora = async () => { }); //Read file in listFile - await listFile.map((file) => { - fs.readFile(Env.get("FOLDER_LOGS") + "/" + file, "utf8", (err, data) => { - if (err) { - console.log(`Error reading file: ${err}`); - } else { - //Array line - const lines = data?.split("\n"); - const linesInventory = []; - //Get index of "lines" with show inv - lines?.map((line, index) => { - if (line.match(regexInventory) !== null) { - linesInventory.push(index); - } - }); - // console.log(linesInventory); - //cut content with content1 = [linesInventory[index],linesInventory[index+1]] ... - linesInventory?.map((line, index) => { - const deviceContent = lines?.slice( - linesInventory[index], - linesInventory[index + 1] - ); - let backgroundColor = "rgb(200 200 200 / 30%)" - const showInventory = []; - let check = true; - let begin = 0; - let end = 4; + await listFile.map(async (file) => { + fs.readFile( + Env.get("FOLDER_LOGS") + "/" + file, + "utf8", + async (err, data) => { + if (err) { + console.log(`Error reading file: ${err}`); + } else { + //Array line + const lines = data?.split("\n"); + const linesInventory = []; + let DBFileCheck = dataFile.filter( + (i) => i.$attributes.file_name === file + )[0]; + if (DBFileCheck !== undefined) { + if (lines.length > DBFileCheck?.$extras.last_check_SN) { + const DBFile = await LogDetectFile.find( + DBFileCheck?.$attributes.id_ldf + ); - //get showInventory content - while (check === true) { - if ( - deviceContent - .slice(begin, end) - .filter( - (i) => - i.includes("PID:") && - i.includes("VID:") && - i.includes("SN:") - ).length > 0 - ) { - showInventory.push(deviceContent.slice(begin, end).join("\n")); - begin = end; - end = end + 4; - } else { - check = false; + // console.log(DBFile) + + DBFile.last_check_SN = lines.length; + await DBFile.save(); } - } - - const showInventoryContent = showInventory - .join("\n") - .split("\n") - .filter( - (i) => - i.includes("PID:") && i.includes("VID:") && i.includes("SN:") + } else { + await LogDetectFile.firstOrCreate( + { file_name: file }, + { file_name: file } ); - //show version exists - if ( - deviceContent.filter((line) => line.match(regexVersion) !== null) - .length > 0 - ) { - const lineShowver = deviceContent.indexOf( + dataFile = await LogDetectFile.all(); + DBFileCheck = dataFile.filter( + (i) => i.$attributes.file_name === file + )[0]; + } + + //Get index of "lines" with show inv + lines + ?.slice(DBFileCheck?.$extras.last_check_SN, lines.length - 1) + .map((line, index) => { + if (line.match(regexInventory) !== null) { + linesInventory.push(index); + } + }); + + //cut content with content1 = [linesInventory[index],linesInventory[index+1]] ... + linesInventory?.map((line, index) => { + const deviceContent = lines?.slice( + linesInventory[index], + linesInventory[index + 1] + ); + + let backgroundColor = "rgb(200 200 200 / 30%)"; + const showInventory = []; + let check = true; + let begin = 0; + let end = 4; + + //get showInventory content + while (check === true) { + if ( + deviceContent + .slice(begin, end) + .filter( + (i) => + i.includes("PID:") && + i.includes("VID:") && + i.includes("SN:") + ).length > 0 + ) { + showInventory.push( + deviceContent.slice(begin, end).join("\n") + ); + begin = end; + end = end + 4; + } else { + check = false; + } + } + + const showInventoryContent = showInventory + .join("\n") + .split("\n") + .filter( + (i) => + i.includes("PID:") && + i.includes("VID:") && + i.includes("SN:") + ); + + //show version exists + if ( deviceContent.filter( (line) => line.match(regexVersion) !== null - )[0] - ); - - const showVersion = deviceContent.slice( - lineShowver, - deviceContent.indexOf( + ).length > 0 + ) { + const lineShowver = deviceContent.indexOf( deviceContent.filter( - (line) => line.search("Configuration register") !== -1 + (line) => line.match(regexVersion) !== null )[0] - ) + 1 - ); + ); - showInventoryContent.map((u, index) => { - const PID = u - ?.split("VID:")[0] - ?.split("PID:")[1] - ?.replace(/,/g, "") - .trim(); - const VID = u - ?.split("VID:")[1] - ?.split("SN:")[0] - ?.replace(/,/g, "") - .trim(); - const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim(); - // let memory = - if (index > 0) { - if (PID !== "" && SN !== "") { - // let RAM = - // showVersion - // .filter((line) => line.includes("bytes of memory")) - // .join("
") - // .match(regexMemory) !== null - // ? ( - // parseInt( - // showVersion - // .filter((line) => - // line.includes("bytes of memory") - // ) - // .join("
") - // .match(regexMemory)[0] - // ) / - // 1024 / - // 1024 - // ).toFixed(2) + "G" - // : ""; + const showVersion = deviceContent.slice( + lineShowver, + deviceContent.indexOf( + deviceContent.filter( + (line) => line.search("Configuration register") !== -1 + )[0] + ) + 1 + ); - // let flash = showVersion - // .filter((line) => - // line.toLocaleLowerCase().includes("compactflash") - // ) - // .join("
"); - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: "", - flash: "", - extraItem: "yes", - }); + showInventoryContent.map((u, index) => { + const PID = u + ?.split("VID:")[0] + ?.split("PID:")[1] + ?.replace(/,/g, "") + .trim(); + const VID = u + ?.split("VID:")[1] + ?.split("SN:")[0] + ?.replace(/,/g, "") + .trim(); + const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim(); + // let memory = + if (index > 0) { + if (PID !== "" && SN !== "") { + // let RAM = + // showVersion + // .filter((line) => line.includes("bytes of memory")) + // .join("
") + // .match(regexMemory) !== null + // ? ( + // parseInt( + // showVersion + // .filter((line) => + // line.includes("bytes of memory") + // ) + // .join("
") + // .match(regexMemory)[0] + // ) / + // 1024 / + // 1024 + // ).toFixed(2) + "G" + // : ""; - html += `${PID} + // let flash = showVersion + // .filter((line) => + // line.toLocaleLowerCase().includes("compactflash") + // ) + // .join("
"); + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "yes", + }); + + html += `${PID} ${VID} ${SN} yes`; - } - } else { - if (PID !== "" && SN !== "") { - let RAM = - showVersion - .filter((line) => line.includes("bytes of memory") || line.includes("bytes of physical memory")) - .join("
") - .match(regexMemory) !== null - ? ( - parseInt( - showVersion - .filter((line) => - line.includes("bytes of memory") || line.includes("bytes of physical memory") - ) - .join("
") - .match(regexMemory)[0] - ) / - 1024 / - 1024 - ).toFixed(2) + "G" - : ""; - - let flash = showVersion - .filter((line) => - line.toLocaleLowerCase().includes("compactflash") - ) - .join("
"); - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: RAM, - flash: - flash.match(regexMemory) !== null + } + } else { + if (PID !== "" && SN !== "") { + const memDefaultForPID = + memDefault.filter((i) => + PID.includes(i.split(":")[0]) + )[0] !== undefined + ? memDefault.filter((i) => + PID.includes(i.split(":")[0]) + )[0] + : PID + ":N/A:N/A"; + let RAM = + showVersion + .filter( + (line) => + line.includes("bytes of memory") || + line.includes("bytes of physical memory") + ) + .join("
") + .match(regexMemory) !== null ? ( - parseInt(flash.match(regexMemory)[0]) / + parseInt( + showVersion + .filter( + (line) => + line.includes("bytes of memory") || + line.includes("bytes of physical memory") + ) + .join("
") + .match(regexMemory)[0] + ) / 1024 / 1024 - ).toFixed(2) + "G" - : "", - extraItem: "no", - }); + ).toFixed(2) + + "G (D: " + + memDefaultForPID.split(":")[1] + + ")" + : ""; - html += `${PID} + let flash = showVersion + .filter((line) => + line.toLocaleLowerCase().includes("compactflash") + ) + .join("
"); + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: RAM, + flash: + flash.match(regexMemory) !== null + ? ( + parseInt(flash.match(regexMemory)[0]) / + 1024 / + 1024 + ).toFixed(2) + + "G (D: " + + memDefaultForPID.split(":")[2] + + ")" + : "", + extra_item: "no", + }); + + html += `${PID} ${VID} ${SN} ${RAM} @@ -214,96 +279,104 @@ export const sendDeviceInfora = async () => { parseInt(flash.match(regexMemory)[0]) / 1024 / 1024 - ).toFixed(2) + "G" + ).toFixed(2) + + "G (D: " + + memDefaultForPID.split(":")[2] + + ")" : "" } no`; + } } - } - }); - } else { - //show version not exists --> RAM = N/A, Flash = N/A - showInventoryContent.map((u, index) => { - const PID = u - ?.split("VID:")[0] - ?.split("PID:")[1] - ?.replace(/,/g, "") - .trim(); - const VID = u - ?.split("VID:")[1] - ?.split("SN:")[0] - ?.replace(/,/g, "") - .trim(); - const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim(); + }); + } else { + //show version not exists --> RAM = N/A, Flash = N/A + showInventoryContent.map((u, index) => { + const PID = u + ?.split("VID:")[0] + ?.split("PID:")[1] + ?.replace(/,/g, "") + .trim(); + const VID = u + ?.split("VID:")[1] + ?.split("SN:")[0] + ?.replace(/,/g, "") + .trim(); + const SN = u?.split("SN:")[1]?.replace(/,/g, "").trim(); - if (index > 0) { - if (PID !== "" && SN !== "") { - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: "", - flash: "", - extraItem: "yes", - }); + if (index > 0) { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "yes", + }); - html += `${PID} + html += `${PID} ${VID} ${SN} yes`; - } - } else { - if (PID !== "" && SN !== "") { - listInformation.push({ - PID: PID, - VID: VID, - SN: SN, - RAM: "", - flash: "", - extraItem: "no", - }); + } + } else { + if (PID !== "" && SN !== "") { + listInformation.push({ + PID: PID, + VID: VID, + SN: SN, + RAM: "", + flash: "", + extra_item: "no", + }); - html += `${PID} + html += `${PID} ${VID} ${SN} no`; + } } - } - }); - } - }); + }); + } + }); + } } - }); + ); }); - setTimeout(() => { - console.log(listInformation); - const options = { - from: "admin@apactech.io", - to: "joseph@apactech.io", - subject: "SN AUTO REPORT", - html: - "\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - " + - html + - "\ -
PIDVIDSNRAMFlashExtra Item
", - }; - transporter.sendMail(options); + setTimeout(async () => { + if (listInformation.length > 0) { + console.log(listInformation); + const options = { + from: "admin@apactech.io", + to: "joseph@apactech.io", + subject: "SN AUTO REPORT", + html: + "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + " + + html + + "\ +
PIDVIDSNRAMFlashExtra Item
", + }; + transporter.sendMail(options); + + await InfoDevice.createMany(listInformation); + } }, 5000); // const match = "show inventory".match(regexInventory); diff --git a/database/migrations/1696904362937_info_devices.ts b/database/migrations/1696904362937_info_devices.ts new file mode 100644 index 0000000..8d02fad --- /dev/null +++ b/database/migrations/1696904362937_info_devices.ts @@ -0,0 +1,21 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class extends BaseSchema { + protected tableName = 'info_devices' + + public async up () { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + + /** + * Uses timestamptz for PostgreSQL and DATETIME2 for MSSQL + */ + table.timestamp('created_at', { useTz: true }) + table.timestamp('updated_at', { useTz: true }) + }) + } + + public async down () { + this.schema.dropTable(this.tableName) + } +} From 3c91f9b5cfaa8bc8ac35961d9527b0d8f4eebaa4 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 13:24:43 +0700 Subject: [PATCH 295/298] Update function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 37 ++++-------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index 5a27219..ca36569 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -1,12 +1,10 @@ import Env from "@ioc:Adonis/Core/Env"; import fs from "fs"; import moment from "moment/moment"; -import dotenv from "dotenv"; import nodeMailer from "nodemailer"; import LogDetectFile from "App/Models/LogDetectFile"; import InfoDevice from "App/Models/InfoDevice"; import KeyValue from "App/Models/KeyValue"; -dotenv.config(); export const sendDeviceInfora = async () => { try { @@ -21,12 +19,12 @@ export const sendDeviceInfora = async () => { .map((obj) => obj.$attributes.value); const listInformation = []; let dataFile = await LogDetectFile.all(); - // console.log(dataFile) - // console.log(dataFile) + let html = ""; //List file today - const listFile = fs.readdirSync(Env.get("FOLDER_LOGS")); - + const listFile = fs + .readdirSync(Env.get("FOLDER_LOGS")) + .filter((f) => f.includes(date) && f.split(".")[f.split(".").length - 1]); //Configure mail const transporter = nodeMailer.createTransport({ pool: true, @@ -167,30 +165,6 @@ export const sendDeviceInfora = async () => { // let memory = if (index > 0) { if (PID !== "" && SN !== "") { - // let RAM = - // showVersion - // .filter((line) => line.includes("bytes of memory")) - // .join("
") - // .match(regexMemory) !== null - // ? ( - // parseInt( - // showVersion - // .filter((line) => - // line.includes("bytes of memory") - // ) - // .join("
") - // .match(regexMemory)[0] - // ) / - // 1024 / - // 1024 - // ).toFixed(2) + "G" - // : ""; - - // let flash = showVersion - // .filter((line) => - // line.toLocaleLowerCase().includes("compactflash") - // ) - // .join("
"); listInformation.push({ PID: PID, VID: VID, @@ -378,9 +352,6 @@ export const sendDeviceInfora = async () => { await InfoDevice.createMany(listInformation); } }, 5000); - // const match = "show inventory".match(regexInventory); - - // console.log(match) } catch (error) { console.log(error); } From b2aaa60f6e2afead4e1d4e75de5e852db9850f46 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 13:43:12 +0700 Subject: [PATCH 296/298] Update function sendDeviceInfor to mail --- app/utils/sendDeviceInfor.ts | 4 ++-- start/routes.ts | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/utils/sendDeviceInfor.ts b/app/utils/sendDeviceInfor.ts index ca36569..c2f6074 100644 --- a/app/utils/sendDeviceInfor.ts +++ b/app/utils/sendDeviceInfor.ts @@ -328,8 +328,8 @@ export const sendDeviceInfora = async () => { console.log(listInformation); const options = { from: "admin@apactech.io", - to: "joseph@apactech.io", - subject: "SN AUTO REPORT", + to: "joseph@apactech.io, ips@ipsupply.com.au", + subject: "(AUTO-REPORT) SERIAL NUMBER", html: "\ \ diff --git a/start/routes.ts b/start/routes.ts index 0e45dca..9735422 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -219,14 +219,10 @@ Route.get("/api/log/showLog/:name?", "LogsController.showLog").middleware( "writeLog" ); -Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect").middleware( - "writeLog" -); +Route.get("/api/getAllLogDetect", "LogsController.getAllLogDetect") //Key-Value -Route.post("/api/getKeyValue", "ValuesController.getKeyValue").middleware( - "writeLog" -); +Route.post("/api/getKeyValue", "ValuesController.getKeyValue") Route.post("/api/deleteValue", "ValuesController.destroy").middleware( "writeLog" @@ -281,7 +277,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { } }).middleware("writeLog"); -Route.post("/api/test", async ({ request, response }) => { +Route.post("/api/sendMailInforDevice", async ({ request, response }) => { try { sendDeviceInfora() } catch (error) { From 4d7ec5545605792c15bb93230798da424ce42905 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 14:09:43 +0700 Subject: [PATCH 297/298] update edit value UI --- app/Controllers/Http/ValuesController.ts | 11 +- manage-view/src/api/apiLog.js | 5 +- manage-view/src/pages/ManageValues.jsx | 179 ++++++++++++++++++----- start/routes.ts | 6 +- 4 files changed, 157 insertions(+), 44 deletions(-) diff --git a/app/Controllers/Http/ValuesController.ts b/app/Controllers/Http/ValuesController.ts index b25372a..5291e89 100644 --- a/app/Controllers/Http/ValuesController.ts +++ b/app/Controllers/Http/ValuesController.ts @@ -24,7 +24,16 @@ export default class ValuesController { public async show({}: HttpContextContract) {} - public async edit({}: 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) {} diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index 86e8497..6717f93 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,7 +1,8 @@ -const API = process.env.REACT_APP_API_SERVER_ADDRESS; -// const API = "http://localhost:3333/api"; +// const API = process.env.REACT_APP_API_SERVER_ADDRESS; +const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; export const addKeyValue = API + "/addValue"; +export const editValue = API + "/editValue"; export const getLog = API + "/log/showLog"; export const getListLog = API + "/getAllLogDetect"; \ No newline at end of file diff --git a/manage-view/src/pages/ManageValues.jsx b/manage-view/src/pages/ManageValues.jsx index 514c3b1..cbe0032 100644 --- a/manage-view/src/pages/ManageValues.jsx +++ b/manage-view/src/pages/ManageValues.jsx @@ -1,13 +1,13 @@ import axios from "axios"; 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 [keyValue, setKeyValue] = 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 () => { try { const res = await axios.post(getKeyValues); @@ -17,22 +17,22 @@ const ManageValues = () => { console.log(error); } }; - + useEffect(() => { getValues(); }, []); - + console.log(inputValue) return (
- + @@ -53,30 +58,99 @@ const ManageValues = () => { {keyValue?.map((value) => ( - + ))}
{ Key Value
{value.key} - + { + setInputValue(e.target.value) + + }} + > - + } + }} + > + Delete + + +
-
- { + setAddValue({ ...addValue, key: e.target.value }); + }} + > {key .filter((value, index, self) => { return self.indexOf(value) === index; @@ -85,27 +159,52 @@ const ManageValues = () => { ))} - { - setAddValue({...addValue, value: e.target.value}) - }}> - - + }} + > + Add +
- + + {" "} + +
- ); }; diff --git a/start/routes.ts b/start/routes.ts index 9735422..0bded1c 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -228,6 +228,10 @@ Route.post("/api/deleteValue", "ValuesController.destroy").middleware( "writeLog" ); +Route.post("/api/editValue", "ValuesController.edit").middleware( + "writeLog" +); + Route.post("/api/addValue", "ValuesController.create").middleware("writeLog"); Route.post("/api/backupProduct", async ({ request, response }) => { @@ -277,7 +281,7 @@ Route.post("/api/backupProduct", async ({ request, response }) => { } }).middleware("writeLog"); -Route.post("/api/sendMailInforDevice", async ({ request, response }) => { +Route.post("/api/sendMailInforDevice", async () => { try { sendDeviceInfora() } catch (error) { From d9eb50d6e5b48cd243d546121b10188a721224e9 Mon Sep 17 00:00:00 2001 From: joseph le Date: Tue, 10 Oct 2023 14:09:57 +0700 Subject: [PATCH 298/298] update edit value UI --- manage-view/src/api/apiLog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manage-view/src/api/apiLog.js b/manage-view/src/api/apiLog.js index 6717f93..da1346d 100644 --- a/manage-view/src/api/apiLog.js +++ b/manage-view/src/api/apiLog.js @@ -1,5 +1,5 @@ -// const API = process.env.REACT_APP_API_SERVER_ADDRESS; -const API = "http://localhost:3333/api"; +const API = process.env.REACT_APP_API_SERVER_ADDRESS; +// const API = "http://localhost:3333/api"; export const getKeyValues = API + "/getKeyValue"; export const deleteValue = API + "/deleteValue"; export const addKeyValue = API + "/addValue";