added webhook support

This commit is contained in:
Raj Nandan Sharma
2023-12-10 15:55:08 +05:30
parent 4a74ed3b4f
commit 04cdc007f2
5 changed files with 133 additions and 5 deletions
+8 -2
View File
@@ -121,9 +121,15 @@ const OneMinuteFetch = async (envSecrets, url, method, headers, body, timeout, c
keys.sort((a,b) => {
return moment(a).isBefore(moment(b)) ? -1 : 1;
});
let sortedDay0 = {};
keys.reverse() //reverse to keep 90days data
.slice(0, 129600) //90days data
.reverse() //reverse to keep 0day data
.forEach((key) => {
sortedDay0[key] = originalData[key];
});
try {
fs.writeFileSync(out, JSON.stringify(originalData, null, 2));
fs.writeFileSync(out, JSON.stringify(sortedDay0, null, 2));
} catch (error) {
console.error(error);
}
+7 -2
View File
@@ -78,12 +78,13 @@ const Startup = async () => {
let name = monitor.name;
let url = monitor.url;
let method = monitor.method;
let tag = monitor.tag;
let hasAPI = false;
let folderName = name.replace(/[^a-z0-9]/gi, "-").toLowerCase();
monitors[i].folderName = folderName;
if (!name) {
console.log("name, url, method are required");
if (!name || !tag) {
console.log("name, tag are required");
process.exit(1);
}
@@ -141,6 +142,10 @@ const Startup = async () => {
console.log("duplicate monitor detected");
process.exit(1);
}
if (checkIfDuplicateExists(monitors.map((monitor) => monitor.tag)) === true) {
console.log("duplicate tag detected");
process.exit(1);
}
fs.ensureFileSync(FOLDER_MONITOR);
fs.ensureFileSync(FOLDER_SITE);
+1 -1
View File
@@ -70,7 +70,7 @@ section {
cursor: pointer;
}
.oneline:hover {
transform: scaleY(1.1);
transform: scaleY(1.2);
}
.oneline.hover {
+98
View File
@@ -0,0 +1,98 @@
// @ts-nocheck
import fs from "fs-extra"
import { env } from "$env/dynamic/public";
import moment from "moment";
const WEBHOOK_TOKEN = process.env.WEBHOOK_TOKEN;
const WEBHOOK_IP = process.env.WEBHOOK_IP;
const store = function(data, authHeader, ip){
const tag = data.tag;
//remove Bearer from start in authHeader
const authToken = authHeader.replace("Bearer ", "");
if (authToken !== WEBHOOK_TOKEN) {
return { error: "invalid token", status: 401 };
}
if (WEBHOOK_IP !== undefined && ip != "" && ip !== WEBHOOK_IP) {
return { error: "invalid ip", status: 401 };
}
const resp = {};
if (data.status === undefined || ["UP", "DOWN", "DEGRADED"].indexOf(data.status) === -1) {
return { error: "status missing", status: 400 };
}
if (data.latency === undefined || isNaN(data.latency)) {
return { error: "latency missing or not a number", status: 400 };
}
if (data.timestampInSeconds !== undefined && isNaN(data.timestampInSeconds)) {
return { error: "timestampInSeconds not a number", status: 400 };
}
if (data.timestampInSeconds === undefined) {
data.timestampInSeconds = Math.floor(Date.now() / 1000);
}
resp.status = data.status;
resp.latency = data.latency;
resp.type = "webhook";
let timestampISO = moment().toISOString();
try {
timestampISO = moment.unix(data.timestampInSeconds).toISOString();
//throw error if timestampISO is future or older than 90days
if (moment(timestampISO).isAfter(moment().add(1, "minute"))) {
throw new Error("timestampInSeconds is in future");
}
if (moment(timestampISO).isBefore(moment().subtract(90, "days"))) {
throw new Error("timestampInSeconds is older than 90days");
}
} catch (err) {
return { error: err.message, status: 400 };
}
//check if tag is valid
let tags = [];
let monitors = [];
try {
monitors = JSON.parse(fs.readFileSync(env.PUBLIC_KENER_FOLDER + "/monitors.json", "utf8"));
tags = monitors.map((monitor) => monitor.tag);
if (tags.indexOf(tag) == -1) {
throw new Error("not a valid tag");
}
} catch (err) {
return { error: err.message, status: 400 };
}
//get the monitor object matching the tag
const monitor = monitors.find((monitor) => monitor.tag === tag);
//read the monitor.path0Day file
let day0 = {};
try {
day0 = JSON.parse(fs.readFileSync(monitor.path0Day, "utf8"));
} catch (error) {
return { error: "something went wrong", status: 400 };
}
let timeStampISOMinute = moment(timestampISO).startOf('minute').toISOString();
day0[timeStampISOMinute] = resp;
//sort the keys
let keys = Object.keys(day0);
keys.sort((a,b) => {
return moment(a).isBefore(moment(b)) ? -1 : 1;
});
let sortedDay0 = {};
//oppsite of sort is required and only first 1440 keys are required
keys.reverse()
.slice(0, 129600)
.reverse()
.forEach((key) => {
sortedDay0[key] = day0[key];
});
//write the monitor.path0Day file
fs.writeFileSync(monitor.path0Day, JSON.stringify(sortedDay0, null, 2));
return { status: 200, message: "success at " + timeStampISOMinute };
}
export { store };
+19
View File
@@ -0,0 +1,19 @@
// @ts-nocheck
// @ts-ignore
import { json } from "@sveltejs/kit";
import { store } from "$lib/server/webhook";
export async function POST({ request }) {
const payload = await request.json();
// const headers = await request.headers();
const authorization = request.headers.get('authorization');
let ip = ""
try {
ip = request.headers.get("x-forwarded-for") || request.socket.remoteAddress || request.headers.get("x-real-ip")
} catch(err){
console.log("IP Not Found " + err.message)
}
let resp = store(payload, authorization, ip);
return json(resp, {
status: resp.status,
});
}