mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-24 10:27:10 +02:00
Server: Resolves #8153: Allow setting NTP server using NTP_SERVER env variable
This commit is contained in:
parent
8cedf27fea
commit
33f0811ad2
@ -2,19 +2,29 @@ import shim from './shim';
|
||||
import time from './time';
|
||||
const ntpClient_ = require('./vendor/ntp-client');
|
||||
|
||||
const server = {
|
||||
domain: 'pool.ntp.org',
|
||||
port: 123,
|
||||
};
|
||||
interface NtpServer {
|
||||
domain: string;
|
||||
port: number;
|
||||
}
|
||||
|
||||
function ntpClient() {
|
||||
ntpClient_.dgram = shim.dgram();
|
||||
return ntpClient_;
|
||||
}
|
||||
|
||||
export async function getNetworkTime(): Promise<Date> {
|
||||
const parseNtpServer = (ntpServer: string): NtpServer => {
|
||||
const s = ntpServer.split(':');
|
||||
if (s.length !== 2) throw new Error('NTP server URL must be in format `domain:port`');
|
||||
return {
|
||||
domain: s[0],
|
||||
port: Number(s[1]),
|
||||
};
|
||||
};
|
||||
|
||||
export async function getNetworkTime(ntpServer: string): Promise<Date> {
|
||||
return new Promise((resolve: Function, reject: Function) => {
|
||||
ntpClient().getNetworkTime(server.domain, server.port, (error: any, date: Date) => {
|
||||
const s = parseNtpServer(ntpServer);
|
||||
ntpClient().getNetworkTime(s.domain, s.port, (error: any, date: Date) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
return;
|
||||
@ -25,7 +35,7 @@ export async function getNetworkTime(): Promise<Date> {
|
||||
});
|
||||
}
|
||||
|
||||
export async function getDeviceTimeDrift(): Promise<number> {
|
||||
export async function getDeviceTimeDrift(ntpServer: string): Promise<number> {
|
||||
const maxTries = 3;
|
||||
let tryCount = 0;
|
||||
|
||||
@ -34,12 +44,12 @@ export async function getDeviceTimeDrift(): Promise<number> {
|
||||
while (true) {
|
||||
tryCount++;
|
||||
try {
|
||||
ntpTime = await getNetworkTime();
|
||||
ntpTime = await getNetworkTime(ntpServer);
|
||||
break;
|
||||
} catch (error) {
|
||||
if (tryCount >= maxTries) {
|
||||
const newError = typeof error === 'string' ? new Error(error) : error;
|
||||
newError.message = `Cannot retrieve the network time from ${server.domain}:${server.port}: ${newError.message}`;
|
||||
newError.message = `Cannot retrieve the network time from ${ntpServer}: ${newError.message}`;
|
||||
throw newError;
|
||||
} else {
|
||||
await time.msleep(tryCount * 1000);
|
||||
|
@ -255,7 +255,8 @@ async function main() {
|
||||
appLogger().info(`Starting server v${config().appVersion} (${env}) on port ${config().port} and PID ${process.pid}...`);
|
||||
|
||||
if (config().maxTimeDrift) {
|
||||
const timeDrift = await getDeviceTimeDrift();
|
||||
appLogger().info(`Checking for time drift using NTP server: ${config().NTP_SERVER}`);
|
||||
const timeDrift = await getDeviceTimeDrift(config().NTP_SERVER);
|
||||
if (Math.abs(timeDrift) > config().maxTimeDrift) {
|
||||
throw new Error(`The device time drift is ${timeDrift}ms (Max allowed: ${config().maxTimeDrift}ms) - cannot continue as it could cause data loss and conflicts on the sync clients. You may increase env var MAX_TIME_DRIFT to pass the check, or set to 0 to disabled the check.`);
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ const defaultEnvValues: EnvVariables = {
|
||||
// check. https://github.com/laurent22/joplin/issues/5738
|
||||
|
||||
MAX_TIME_DRIFT: 2000,
|
||||
NTP_SERVER: 'pool.ntp.org:123',
|
||||
|
||||
// ==================================================
|
||||
// URL config
|
||||
@ -109,6 +110,7 @@ export interface EnvVariables {
|
||||
COOKIES_SECURE: boolean;
|
||||
RUNNING_IN_DOCKER: boolean;
|
||||
MAX_TIME_DRIFT: number;
|
||||
NTP_SERVER: string;
|
||||
|
||||
APP_BASE_URL: string;
|
||||
USER_CONTENT_BASE_URL: string;
|
||||
|
Loading…
Reference in New Issue
Block a user