2021-04-27 16:30:51 +00:00
|
|
|
const got = require("got");
|
|
|
|
const FormData = require("form-data");
|
2020-09-30 14:20:55 +00:00
|
|
|
const { calculateElapsedTime, getResponseContent } = require("../utils");
|
2021-05-24 14:27:30 +00:00
|
|
|
const { SkynetClient } = require("skynet-js");
|
|
|
|
|
|
|
|
const skynetClient = new SkynetClient(process.env.SKYNET_PORTAL_API);
|
|
|
|
const exampleSkylink = "AACogzrAimYPG42tDOKhS3lXZD8YvlF8Q8R17afe95iV2Q";
|
2020-09-09 12:25:00 +00:00
|
|
|
|
|
|
|
// uploadCheck returns the result of uploading a sample file
|
|
|
|
async function uploadCheck(done) {
|
|
|
|
const time = process.hrtime();
|
2021-04-27 16:30:51 +00:00
|
|
|
const form = new FormData();
|
2021-05-05 12:18:10 +00:00
|
|
|
const payload = Buffer.from(new Date()); // current date to ensure data uniqueness
|
|
|
|
const data = { up: false };
|
2021-04-27 16:30:51 +00:00
|
|
|
|
2021-05-05 12:18:10 +00:00
|
|
|
form.append("file", payload, { filename: "time.txt", contentType: "text/plain" });
|
2021-04-27 16:30:51 +00:00
|
|
|
|
|
|
|
try {
|
2021-05-05 12:18:10 +00:00
|
|
|
const response = await got.post(`${process.env.SKYNET_PORTAL_API}/skynet/skyfile`, { body: form });
|
2021-04-27 16:30:51 +00:00
|
|
|
|
2021-05-05 12:18:10 +00:00
|
|
|
data.statusCode = response.statusCode;
|
|
|
|
data.up = true;
|
|
|
|
data.ip = response.ip;
|
2021-04-27 16:30:51 +00:00
|
|
|
} catch (error) {
|
2021-05-05 12:18:10 +00:00
|
|
|
data.statusCode = error.response?.statusCode || error.statusCode || error.status;
|
|
|
|
data.errorMessage = error.message;
|
|
|
|
data.errorResponseContent = getResponseContent(error.response);
|
|
|
|
data.ip = error?.response?.ip ?? null;
|
2021-04-27 16:30:51 +00:00
|
|
|
}
|
|
|
|
|
2021-05-24 14:27:30 +00:00
|
|
|
done({ name: "upload_file", time: calculateElapsedTime(time), ...data });
|
|
|
|
}
|
|
|
|
|
|
|
|
// websiteCheck checks whether the main website is working
|
|
|
|
async function websiteCheck(done) {
|
2021-06-16 14:26:36 +00:00
|
|
|
return done(await genericAccessCheck("website", process.env.SKYNET_PORTAL_API));
|
2020-09-09 12:25:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// downloadCheck returns the result of downloading the hard coded link
|
|
|
|
async function downloadCheck(done) {
|
2021-05-24 14:27:30 +00:00
|
|
|
const url = await skynetClient.getSkylinkUrl(exampleSkylink);
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
return done(await genericAccessCheck("skylink", url));
|
2021-05-24 14:27:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// skylinkSubdomainCheck returns the result of downloading the hard coded link via subdomain
|
|
|
|
async function skylinkSubdomainCheck(done) {
|
|
|
|
const url = await skynetClient.getSkylinkUrl(exampleSkylink, { subdomain: true });
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
return done(await genericAccessCheck("skylink_via_subdomain", url));
|
2021-05-24 14:27:30 +00:00
|
|
|
}
|
|
|
|
|
2021-05-24 15:07:37 +00:00
|
|
|
// handshakeSubdomainCheck returns the result of downloading the skylink via handshake domain
|
2021-05-24 14:27:30 +00:00
|
|
|
async function handshakeSubdomainCheck(done) {
|
|
|
|
const url = await skynetClient.getHnsUrl("note-to-self", { subdomain: true });
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
return done(await genericAccessCheck("hns_via_subdomain", url));
|
2021-05-24 14:27:30 +00:00
|
|
|
}
|
|
|
|
|
2021-05-24 15:30:29 +00:00
|
|
|
// accountWebsiteCheck returns the result of accessing account dashboard website
|
2021-05-24 15:07:37 +00:00
|
|
|
async function accountWebsiteCheck(done) {
|
2021-05-24 15:12:16 +00:00
|
|
|
const url = `${process.env.SKYNET_DASHBOARD_URL}/auth/login`;
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
return done(await genericAccessCheck("account_website", url));
|
|
|
|
}
|
|
|
|
|
|
|
|
// directServerApiAccessCheck returns the basic server api check on direct server address
|
|
|
|
async function directServerApiAccessCheck(done) {
|
|
|
|
if (!process.env.SKYNET_SERVER_API) {
|
|
|
|
return done({ up: false, info: { message: "SKYNET_SERVER_API env variable not configured" } });
|
|
|
|
}
|
|
|
|
|
2021-06-18 10:57:44 +00:00
|
|
|
const [portalAccessCheck, serverAccessCheck] = await Promise.all([
|
2021-06-16 15:02:52 +00:00
|
|
|
genericAccessCheck("portal_api_access", process.env.SKYNET_PORTAL_API),
|
2021-06-18 10:57:44 +00:00
|
|
|
genericAccessCheck("server_api_access", process.env.SKYNET_SERVER_API),
|
2021-06-16 14:26:36 +00:00
|
|
|
]);
|
|
|
|
|
2021-06-18 10:57:44 +00:00
|
|
|
if (portalAccessCheck.ip !== serverAccessCheck.ip) {
|
|
|
|
serverAccessCheck.up = false;
|
|
|
|
serverAccessCheck.info = {
|
2021-06-16 14:26:36 +00:00
|
|
|
message: "Access ip mismatch between domain and direct access",
|
|
|
|
response: {
|
2021-06-18 10:57:44 +00:00
|
|
|
portal: { name: process.env.SKYNET_PORTAL_API, ip: portalAccessCheck.ip },
|
|
|
|
server: { name: process.env.SKYNET_SERVER_API, ip: serverAccessCheck.ip },
|
2021-06-16 14:26:36 +00:00
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-06-18 10:57:44 +00:00
|
|
|
return done(serverAccessCheck);
|
2021-05-24 15:07:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// accountHealthCheck returns the result of accounts service health checks
|
2021-05-24 14:27:30 +00:00
|
|
|
async function accountHealthCheck(done) {
|
2020-09-09 12:25:00 +00:00
|
|
|
const time = process.hrtime();
|
2021-05-05 12:18:10 +00:00
|
|
|
const data = { up: false };
|
2020-09-09 12:25:00 +00:00
|
|
|
|
|
|
|
try {
|
2021-05-24 14:27:30 +00:00
|
|
|
const response = await got(`${process.env.SKYNET_DASHBOARD_URL}/health`, { responseType: "json" });
|
2020-09-09 12:25:00 +00:00
|
|
|
|
2021-05-05 12:18:10 +00:00
|
|
|
data.statusCode = response.statusCode;
|
2021-05-24 14:27:30 +00:00
|
|
|
data.response = response.body;
|
|
|
|
data.up = response.body.dbAlive === true;
|
2021-05-05 12:18:10 +00:00
|
|
|
data.ip = response.ip;
|
2020-09-09 12:25:00 +00:00
|
|
|
} catch (error) {
|
2021-05-05 12:18:10 +00:00
|
|
|
data.statusCode = error?.response?.statusCode || error.statusCode || error.status;
|
|
|
|
data.errorMessage = error.message;
|
|
|
|
data.errorResponseContent = getResponseContent(error.response);
|
|
|
|
data.ip = error?.response?.ip ?? null;
|
2020-09-09 12:25:00 +00:00
|
|
|
}
|
|
|
|
|
2021-05-24 15:07:37 +00:00
|
|
|
done({ name: "accounts", time: calculateElapsedTime(time), ...data });
|
2020-09-09 12:25:00 +00:00
|
|
|
}
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
async function genericAccessCheck(name, url) {
|
2021-05-05 12:18:10 +00:00
|
|
|
const time = process.hrtime();
|
2021-05-24 14:27:30 +00:00
|
|
|
const data = { up: false, url };
|
2021-05-05 12:18:10 +00:00
|
|
|
|
|
|
|
try {
|
2021-05-24 14:27:30 +00:00
|
|
|
const response = await got(url, { headers: { cookie: "nocache=true" } });
|
2021-05-05 12:18:10 +00:00
|
|
|
|
|
|
|
data.statusCode = response.statusCode;
|
2021-05-24 14:27:30 +00:00
|
|
|
data.up = true;
|
2021-05-05 12:18:10 +00:00
|
|
|
data.ip = response.ip;
|
|
|
|
} catch (error) {
|
|
|
|
data.statusCode = error?.response?.statusCode || error.statusCode || error.status;
|
|
|
|
data.errorMessage = error.message;
|
|
|
|
data.errorResponseContent = getResponseContent(error.response);
|
|
|
|
data.ip = error?.response?.ip ?? null;
|
|
|
|
}
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
return { name, time: calculateElapsedTime(time), ...data };
|
2021-05-05 12:18:10 +00:00
|
|
|
}
|
|
|
|
|
2021-06-16 14:26:36 +00:00
|
|
|
const checks = [
|
|
|
|
uploadCheck,
|
|
|
|
websiteCheck,
|
|
|
|
downloadCheck,
|
|
|
|
skylinkSubdomainCheck,
|
|
|
|
handshakeSubdomainCheck,
|
|
|
|
directServerApiAccessCheck,
|
|
|
|
];
|
2021-05-05 12:18:10 +00:00
|
|
|
|
2021-05-31 07:58:58 +00:00
|
|
|
if (process.env.ACCOUNTS_ENABLED === "1") {
|
2021-05-24 15:07:37 +00:00
|
|
|
checks.push(accountHealthCheck, accountWebsiteCheck);
|
2021-05-05 12:18:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = checks;
|