Select Git revision
index.js NaN GiB
const https = require('https');
const express = require('express');
const { error } = require('console');
const config = require('./config');
config.init();
const db = config.getDb();
const knotdns = require('./knotdns');
// number of times to try syncing DNS records from master before giving up
const retryMax = 5;
// Synchronizes current DNS records from master
function syncRecords() {
return new Promise((resolve, reject) => {
https.get(config.config().master.address + '/dyndns-list?id=' + config.config().master.myId + '&key=' + config.config().master.key, (res) => {
if (res.statusCode > 299) {
const errormsg = 'Bad HTTP status code from ' + config.config().master.address + ' : ' + res.statusCode;
reject(errormsg);
return;
}
let response = '';
res.on('data', (chunk) => response += chunk);
res.on('end', () => {
db.clearDomains().then(() => {
knotdns.clearZone().then(() => {
console.log("Purged existing domains");
try {
records = JSON.parse(response);
async function loadRecords(records) {
for (const r of records) {
const domain = r.domain.split(".")[0];
const token = r.token;
const ip = r.ip;
if (ip == "null") {
await db.registerDomain(domain, token);
console.log("Registering record without IP: " + domain);
} else {
await db.insertDomain(domain, token, ip);
await knotdns.updateRecord(domain, ip);
console.log("Registering domain " + domain + " to " + ip);
}
}
resolve();
return;
}
loadRecords(records);
} catch (error) {
const errormsg = "Error parsing records from master: " + error;
reject(errormsg);
return;
}
})
})
});
}).on('error', (error) => {
const errormsg = "Could not sync records from master: " + error;
reject(errormsg);
return;
});
})
}
// Start HTTP server and process record updates
function handleUpdates() {
return new Promise((resolve, reject) => {
const registerMW = require('./middleware/registerMW');
const replyMW = require('./middleware/replyMW');
const updateMW = require('./middleware/updateMW');
// register a new dyndns record
app.get('/register', registerMW(), replyMW());
// update an existing dyndns record
app.get('/update', updateMW(), replyMW());
const server_port = config.config().listenPort;
const server_domain = config.config().listenAddress;
app.listen(server_port, server_domain, function () {
console.log(`This server is listening on http://${server_domain}:${server_port}`);
resolve();
});
})
}
// Try syncing from master a few times and then serve DNS update requests
function syncAndRun(retries) {
console.log("Syncing records from " + config.config().master.address + "/ ...");
syncRecords().then(() => {
handleUpdates();
})
.catch((errormsg) => {
console.error(errormsg);
if (retries < retryMax) {
console.error("Retrying in 1 min.");
setTimeout(() => {
syncAndRun(retries + 1);
}, 60000);
} else {
console.error("Giving up.");
process.exit(1);
}
})
}
// Initialize
// --------------------------------------------------------
const app = express();
db.init();
// Sync records from master then serve requests
// --------------------------------------------------------
var retries = 0;
syncAndRun(retries);