Skip to content
Snippets Groups Projects
Select Git revision
  • 1b670472b4abf7ce8d3b82982dbb2f9d4bba6365
  • master default protected
2 results

router.py

Blame
  • 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);