moved the DNS API calls to another file
This commit is contained in:
		
							parent
							
								
									8930a528bc
								
							
						
					
					
						commit
						83f72730a2
					
				
							
								
								
									
										97
									
								
								lib/ddns/dns-ctrl.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								lib/ddns/dns-ctrl.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| module.exports.create = function (deps, conf) { | ||||
|   function dnsType(addr) { | ||||
|     if (/^\d+\.\d+\.\d+\.\d+$/.test(addr)) { | ||||
|       return 'A'; | ||||
|     } | ||||
|     if (-1 !== addr.indexOf(':') && /^[a-f:\.\d]+$/i.test(addr)) { | ||||
|       return 'AAAA'; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async function setDeviceAddress(session, addr) { | ||||
|     var directives = await deps.OAUTH3.discover(session.token.aud); | ||||
| 
 | ||||
|     // Set the address of the device to our public address.
 | ||||
|     await deps.request({ | ||||
|       url: deps.OAUTH3.url.normalize(directives.api)+'/api/com.daplie.domains/acl/devices/' + conf.device.hostname | ||||
|     , method: 'POST' | ||||
|     , headers: { | ||||
|         'Authorization': 'Bearer ' + session.refresh_token | ||||
|       , 'Accept': 'application/json; charset=utf-8' | ||||
|       } | ||||
|     , json: { | ||||
|         addresses: [ | ||||
|           { value: addr, type:  dnsType(addr) } | ||||
|         ] | ||||
|       } | ||||
|     }); | ||||
| 
 | ||||
|     // Then update all of the records attached to our hostname, first removing the old records
 | ||||
|     // to remove the reference to the old address, then creating new records for the same domains
 | ||||
|     // using our new address.
 | ||||
|     var allDns = deps.OAUTH3.api(directives.api, {session: session, api: 'dns.list'}); | ||||
|     var ourDomains = allDns.filter(function (record) { | ||||
|       return record.device === conf.device.hostname; | ||||
|     }).map(function (record) { | ||||
|       var zoneSplit = record.zone.split('.'); | ||||
|       return { | ||||
|         tld: zoneSplit.slice(1).join('.') | ||||
|       , sld: zoneSplit[0] | ||||
|       , sub: record.host.slice(0, -(record.zone.length + 1)) | ||||
|       }; | ||||
|     }); | ||||
| 
 | ||||
|     var common = { | ||||
|       api: 'devices.detach' | ||||
|     , session: session | ||||
|     , device: conf.device.hostname | ||||
|     }; | ||||
|     await deps.PromiseA.all(ourDomains.map(function (record) { | ||||
|       return deps.OAUTH3.api(directives.api, Object.assign({}, common, record)); | ||||
|     })); | ||||
| 
 | ||||
|     common = { | ||||
|       api: 'devices.attach' | ||||
|     , session: session | ||||
|     , device: conf.device.hostname | ||||
|     , ip: addr | ||||
|     , ttl: 300 | ||||
|     }; | ||||
|     await deps.PromiseA.all(ourDomains.map(function (record) { | ||||
|       return deps.OAUTH3.api(directives.api, Object.assign({}, common, record)); | ||||
|     })); | ||||
|   } | ||||
| 
 | ||||
|   async function getDeviceAddresses(session) { | ||||
|     var directives = await deps.OAUTH3.discover(session.token.aud); | ||||
| 
 | ||||
|     var result = await deps.request({ | ||||
|       url: deps.OAUTH3.url.normalize(directives.api)+'/api/org.oauth3.dns/acl/devices' | ||||
|     , method: 'GET' | ||||
|     , headers: { | ||||
|         'Authorization': 'Bearer ' + session.refresh_token | ||||
|       , 'Accept': 'application/json; charset=utf-8' | ||||
|       } | ||||
|     , json: true | ||||
|     }); | ||||
| 
 | ||||
|     if (!result.body) { | ||||
|       throw new Error('No response body in request for device addresses'); | ||||
|     } | ||||
|     if (result.body.error) { | ||||
|       throw Object.assign(new Error('error getting device list'), result.body.error); | ||||
|     } | ||||
| 
 | ||||
|     var dev = result.body.devices.filter(function (dev) { | ||||
|       return dev.name === conf.device.hostname; | ||||
|     })[0]; | ||||
|     return (dev || {}).addresses || []; | ||||
|   } | ||||
| 
 | ||||
|   return { | ||||
|     getDeviceAddresses: getDeviceAddresses | ||||
|   , setDeviceAddress:   setDeviceAddress | ||||
| , }; | ||||
| }; | ||||
| @ -2,15 +2,7 @@ | ||||
| 
 | ||||
| module.exports.create = function (deps, conf) { | ||||
|   var loopback = require('./loopback').create(deps, conf); | ||||
| 
 | ||||
|   function dnsType(addr) { | ||||
|     if (/^\d+\.\d+\.\d+\.\d+$/.test(addr)) { | ||||
|       return 'A'; | ||||
|     } | ||||
|     if (-1 !== addr.indexOf(':') && /^[a-f:\.\d]+$/i.test(addr)) { | ||||
|       return 'AAAA'; | ||||
|     } | ||||
|   } | ||||
|   var dnsCtrl = require('./dns-ctrl').create(deps, conf); | ||||
| 
 | ||||
|   async function getSession() { | ||||
|     var sessions = await deps.storage.owners.all(); | ||||
| @ -30,88 +22,6 @@ module.exports.create = function (deps, conf) { | ||||
|     return session; | ||||
|   } | ||||
| 
 | ||||
|   async function setDeviceAddress(addr) { | ||||
|     var session = await getSession(); | ||||
|     var directives = await deps.OAUTH3.discover(session.token.aud); | ||||
| 
 | ||||
|     // Set the address of the device to our public address.
 | ||||
|     await deps.request({ | ||||
|       url: directives.api+'/api/com.daplie.domains/acl/devices/' + conf.device.hostname | ||||
|     , method: 'POST' | ||||
|     , headers: { | ||||
|         'Authorization': 'Bearer ' + session.refresh_token | ||||
|       , 'Accept': 'application/json; charset=utf-8' | ||||
|       } | ||||
|     , json: { | ||||
|         addresses: [ | ||||
|           { value: addr, type:  dnsType(addr) } | ||||
|         ] | ||||
|       } | ||||
|     }); | ||||
| 
 | ||||
|     // Then update all of the records attached to our hostname, first removing the old records
 | ||||
|     // to remove the reference to the old address, then creating new records for the same domains
 | ||||
|     // using our new address.
 | ||||
|     var allDns = deps.OAUTH3.api(directives.api, {session: session, api: 'dns.list'}); | ||||
|     var ourDomains = allDns.filter(function (record) { | ||||
|       return record.device === conf.device.hostname; | ||||
|     }).map(function (record) { | ||||
|       var zoneSplit = record.zone.split('.'); | ||||
|       return { | ||||
|         tld: zoneSplit.slice(1).join('.') | ||||
|       , sld: zoneSplit[0] | ||||
|       , sub: record.host.slice(0, -(record.zone.length + 1)) | ||||
|       }; | ||||
|     }); | ||||
| 
 | ||||
|     var common = { | ||||
|       api: 'devices.detach' | ||||
|     , session: session | ||||
|     , device: conf.device.hostname | ||||
|     }; | ||||
|     await deps.PromiseA.all(ourDomains.map(function (record) { | ||||
|       return deps.OAUTH3.api(directives.api, Object.assign({}, common, record)); | ||||
|     })); | ||||
| 
 | ||||
|     common = { | ||||
|       api: 'devices.attach' | ||||
|     , session: session | ||||
|     , device: conf.device.hostname | ||||
|     , ip: addr | ||||
|     , ttl: 300 | ||||
|     }; | ||||
|     await deps.PromiseA.all(ourDomains.map(function (record) { | ||||
|       return deps.OAUTH3.api(directives.api, Object.assign({}, common, record)); | ||||
|     })); | ||||
|   } | ||||
| 
 | ||||
|   async function getDeviceAddresses() { | ||||
|     var session = await getSession(); | ||||
|     var directives = await deps.OAUTH3.discover(session.token.aud); | ||||
| 
 | ||||
|     var result = await deps.request({ | ||||
|       url: directives.api+'/api/org.oauth3.dns/acl/devices' | ||||
|     , method: 'GET' | ||||
|     , headers: { | ||||
|         'Authorization': 'Bearer ' + session.refresh_token | ||||
|       , 'Accept': 'application/json; charset=utf-8' | ||||
|       } | ||||
|     , json: true | ||||
|     }); | ||||
| 
 | ||||
|     if (!result.body) { | ||||
|       throw new Error('No response body in request for device addresses'); | ||||
|     } | ||||
|     if (result.body.error) { | ||||
|       throw Object.assign(new Error('error getting device list'), result.body.error); | ||||
|     } | ||||
| 
 | ||||
|     var dev = result.body.devices.filter(function (dev) { | ||||
|       return dev.name === conf.device.hostname; | ||||
|     })[0]; | ||||
|     return (dev || {}).addresses || []; | ||||
|   } | ||||
| 
 | ||||
|   var publicAddress; | ||||
|   async function recheckPubAddr() { | ||||
|     if (!conf.ddns.enabled) { | ||||
| @ -130,7 +40,7 @@ module.exports.create = function (deps, conf) { | ||||
|       console.log('previous public address',publicAddress, 'does not match current public address', addr); | ||||
|     } | ||||
| 
 | ||||
|     await setDeviceAddress(addr); | ||||
|     await dnsCtrl.setDeviceAddress(session, addr); | ||||
|     publicAddress = addr; | ||||
|   } | ||||
| 
 | ||||
| @ -139,8 +49,8 @@ module.exports.create = function (deps, conf) { | ||||
| 
 | ||||
|   return { | ||||
|     loopbackServer:     loopback.server | ||||
|   , setDeviceAddress:   setDeviceAddress | ||||
|   , getDeviceAddresses: getDeviceAddresses | ||||
|   , setDeviceAddress:   dnsCtrl.setDeviceAddress | ||||
|   , getDeviceAddresses: dnsCtrl.getDeviceAddresses | ||||
|   , recheckPubAddr:     recheckPubAddr | ||||
|   }; | ||||
| }; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user