uptime-kuma/server/util-server.js

148 lines
3.4 KiB
JavaScript
Raw Normal View History

2021-07-27 18:47:13 +01:00
const tcpp = require("tcp-ping");
2021-07-01 10:00:23 +01:00
const Ping = require("./ping-lite");
2021-07-27 18:47:13 +01:00
const { R } = require("redbean-node");
2021-07-01 07:03:06 +01:00
exports.tcping = function (hostname, port) {
return new Promise((resolve, reject) => {
tcpp.ping({
address: hostname,
port: port,
attempts: 1,
}, function(err, data) {
if (err) {
reject(err);
}
if (data.results.length >= 1 && data.results[0].err) {
reject(data.results[0].err);
}
resolve(Math.round(data.max));
});
});
}
2021-07-01 10:00:23 +01:00
exports.ping = function (hostname) {
return new Promise((resolve, reject) => {
const ping = new Ping(hostname);
ping.send(function(err, ms) {
if (err) {
reject(err)
} else if (ms === null) {
reject(new Error("timeout"))
} else {
resolve(Math.round(ms))
}
});
});
}
2021-07-09 07:14:03 +01:00
exports.setting = async function (key) {
return await R.getCell("SELECT `value` FROM setting WHERE `key` = ? ", [
2021-07-27 18:47:13 +01:00
key,
2021-07-09 07:14:03 +01:00
])
}
2021-07-21 19:02:35 +01:00
exports.setSetting = async function (key, value) {
let bean = await R.findOne("setting", " `key` = ? ", [
2021-07-27 18:47:13 +01:00
key,
2021-07-21 19:02:35 +01:00
])
if (! bean) {
bean = R.dispense("setting")
bean.key = key;
}
bean.value = value;
await R.store(bean)
}
2021-07-09 07:14:03 +01:00
exports.getSettings = async function (type) {
2021-07-31 14:57:58 +01:00
let list = await R.getAll("SELECT `key`, `value` FROM setting WHERE `type` = ? ", [
2021-07-27 18:47:13 +01:00
type,
2021-07-09 07:14:03 +01:00
])
let result = {};
for (let row of list) {
2021-07-31 14:57:58 +01:00
result[row.key] = JSON.parse(row.value);
2021-07-09 07:14:03 +01:00
}
return result;
}
2021-07-31 14:57:58 +01:00
exports.setSettings = async function (type, data) {
let keyList = Object.keys(data);
let promiseList = [];
for (let key of keyList) {
let bean = await R.findOne("setting", " `key` = ? ", [
key
]);
if (bean == null) {
bean = R.dispense("setting");
bean.type = type;
bean.key = key;
}
if (bean.type === type) {
bean.value = JSON.stringify(data[key]);
promiseList.push(R.store(bean))
}
}
await Promise.all(promiseList);
}
// ssl-checker by @dyaa
// param: res - response object from axios
// return an object containing the certificate information
const getDaysBetween = (validFrom, validTo) =>
Math.round(Math.abs(+validFrom - +validTo) / 8.64e7);
const getDaysRemaining = (validFrom, validTo) => {
const daysRemaining = getDaysBetween(validFrom, validTo);
if (new Date(validTo).getTime() < new Date().getTime()) {
return -daysRemaining;
}
return daysRemaining;
};
exports.checkCertificate = function (res) {
const {
valid_from,
valid_to,
subjectaltname,
issuer,
fingerprint,
} = res.request.res.socket.getPeerCertificate(false);
if (!valid_from || !valid_to || !subjectaltname) {
2021-07-27 18:47:13 +01:00
throw {
message: "No TLS certificate in response",
};
}
const valid = res.request.res.socket.authorized || false;
const validTo = new Date(valid_to);
const validFor = subjectaltname
.replace(/DNS:|IP Address:/g, "")
.split(", ");
const daysRemaining = getDaysRemaining(new Date(), validTo);
return {
valid,
validFor,
validTo,
daysRemaining,
issuer,
fingerprint,
};
2021-07-27 18:47:13 +01:00
}