goldilocks.js/lib/ddns/index.js

57 lines
1.7 KiB
JavaScript
Raw Normal View History

2016-10-17 23:40:55 +00:00
'use strict';
2017-09-14 21:26:19 +00:00
module.exports.create = function (deps, conf) {
var loopback = require('./loopback').create(deps, conf);
var dnsCtrl = require('./dns-ctrl').create(deps, conf);
2016-10-17 23:40:55 +00:00
async function getSession() {
var sessions = await deps.storage.owners.all();
var session = sessions.filter(function (sess) {
return sess.token.scp.indexOf('dns') >= 0;
})[0];
if (!session) {
throw new Error('no sessions with DNS grants');
}
// The OAUTH3 library stores some things on the root session object that we usually
// just leave inside the token, but we need to pull those out before we use it here
session.provider_uri = session.provider_uri || session.token.provider_uri || session.token.iss;
session.client_uri = session.client_uri || session.token.azp;
session.scope = session.scope || session.token.scp;
return session;
}
2017-09-14 21:26:19 +00:00
var publicAddress;
async function recheckPubAddr() {
2017-09-14 21:26:19 +00:00
if (!conf.ddns.enabled) {
return;
}
var session = await getSession();
var directives = await deps.OAUTH3.discover(session.token.aud);
var addr = await loopback.checkPublicAddr(directives.api);
2016-10-17 23:40:55 +00:00
if (publicAddress === addr) {
return;
}
if (conf.debug) {
console.log('previous public address',publicAddress, 'does not match current public address', addr);
}
await dnsCtrl.setDeviceAddress(session, addr);
publicAddress = addr;
2017-09-14 21:26:19 +00:00
}
2016-10-17 23:40:55 +00:00
2017-09-15 00:28:49 +00:00
recheckPubAddr();
2017-09-14 21:26:19 +00:00
setInterval(recheckPubAddr, 5*60*1000);
2016-10-17 23:40:55 +00:00
2017-09-14 21:26:19 +00:00
return {
loopbackServer: loopback.server
, setDeviceAddress: dnsCtrl.setDeviceAddress
, getDeviceAddresses: dnsCtrl.getDeviceAddresses
2017-09-14 21:26:19 +00:00
, recheckPubAddr: recheckPubAddr
2016-10-17 23:40:55 +00:00
};
2017-09-14 21:26:19 +00:00
};