1
- const error = require ( './error ' ) ;
2
- const logger = require ( '../logger' ) . ddns ;
3
- const internalAccessList = require ( '../internal/access-list' ) ;
4
- const utils = require ( './utils ' ) ;
1
+ const internalNginx = require ( '../../internal/nginx ' ) ;
2
+ const logger = require ( '../../ logger' ) . ddns ;
3
+ const internalAccessList = require ( '../../ internal/access-list' ) ;
4
+ const ddnsResolver = require ( './ddns_resolver ' ) ;
5
5
6
- const ddnsResolver = {
6
+ const ddnsUpdater = {
7
7
/**
8
8
* Starts a timer to periodically check for ddns updates
9
9
*/
10
10
initTimer : ( ) => {
11
- ddnsResolver . _initialize ( ) ;
12
- ddnsResolver . _interval = setInterval ( ddnsResolver . _checkForDDNSUpdates , ddnsResolver . _updateIntervalMs ) ;
13
- logger . info ( `DDNS Update Timer initialized (interval: ${ Math . floor ( ddnsResolver . _updateIntervalMs / 1000 ) } s)` ) ;
11
+ ddnsUpdater . _initialize ( ) ;
12
+ ddnsUpdater . _interval = setInterval ( ddnsUpdater . _checkForDDNSUpdates , ddnsUpdater . _updateIntervalMs ) ;
13
+ logger . info ( `DDNS Update Timer initialized (interval: ${ Math . floor ( ddnsUpdater . _updateIntervalMs / 1000 ) } s)` ) ;
14
14
// Trigger a run so that initial cache is populated and hosts can be updated - delay by 10s to give server time to boot up
15
- setTimeout ( ddnsResolver . _checkForDDNSUpdates , 10 * 1000 ) ;
15
+ setTimeout ( ddnsUpdater . _checkForDDNSUpdates , 10 * 1000 ) ;
16
16
} ,
17
17
18
- /**
19
- * Checks whether the address requires resolution (i.e. starts with ddns:)
20
- * @param {String } address
21
- * @returns {boolean }
22
- */
23
- requiresResolution : ( address ) => {
24
- if ( typeof address !== 'undefined' && address && address . toLowerCase ( ) . startsWith ( 'ddns:' ) ) {
25
- return true ;
26
- }
27
- return false ;
28
- } ,
29
-
30
- /**
31
- * Resolves the given address to its IP
32
- * @param {String } address
33
- * @param {boolean } forceUpdate: whether to force resolution instead of using the cached value
34
- */
35
- resolveAddress : ( address , forceUpdate = false ) => {
36
- if ( ! forceUpdate && ddnsResolver . _cache . has ( address ) ) {
37
- // Check if it is still valid
38
- const value = ddnsResolver . _cache . get ( address ) ;
39
- const ip = value [ 0 ] ;
40
- const lastUpdated = value [ 1 ] ;
41
- const nowSeconds = Date . now ( ) ;
42
- const delta = nowSeconds - lastUpdated ;
43
- if ( delta < ddnsResolver . _updateIntervalMs ) {
44
- return Promise . resolve ( ip ) ;
45
- }
46
- }
47
- ddnsResolver . _cache . delete ( address ) ;
48
- // Reach here only if cache value doesn't exist or needs to be updated
49
- let host = address . toLowerCase ( ) ;
50
- if ( host . startsWith ( 'ddns:' ) ) {
51
- host = host . substring ( 5 ) ;
52
- }
53
- return ddnsResolver . _queryHost ( host )
54
- . then ( ( resolvedIP ) => {
55
- ddnsResolver . _cache . set ( address , [ resolvedIP , Date . now ( ) ] ) ;
56
- return resolvedIP ;
57
- } )
58
- . catch ( ( /*error*/ ) => {
59
- // return input address in case of failure
60
- return address ;
61
- } ) ;
62
- } ,
63
-
64
-
65
18
/** Private **/
66
19
// Properties
67
20
_initialized : false ,
68
21
_updateIntervalMs : 60 * 60 * 1000 , // 1 hr default (overriden with $DDNS_UPDATE_INTERVAL env var)
69
- /**
70
- * cache mapping host to (ip address, last updated time)
71
- */
72
- _cache : new Map ( ) ,
73
22
_interval : null , // reference to created interval id
74
23
_processingDDNSUpdate : false ,
75
24
76
25
// Methods
77
26
78
27
_initialize : ( ) => {
79
- if ( ddnsResolver . _initialized ) {
28
+ if ( ddnsUpdater . _initialized ) {
80
29
return ;
81
30
}
82
31
// Init the resolver
@@ -85,51 +34,26 @@ const ddnsResolver = {
85
34
const interval = Number ( process . env . DDNS_UPDATE_INTERVAL . toLowerCase ( ) ) ;
86
35
if ( ! isNaN ( interval ) ) {
87
36
// Interval value from env is in seconds. Set min to 60s.
88
- ddnsResolver . _updateIntervalMs = Math . max ( interval * 1000 , 60 * 1000 ) ;
37
+ ddnsUpdater . _updateIntervalMs = Math . max ( interval * 1000 , 60 * 1000 ) ;
89
38
} else {
90
39
logger . warn ( `[DDNS] invalid value for update interval: '${ process . env . DDNS_UPDATE_INTERVAL } '` ) ;
91
40
}
92
41
}
93
- ddnsResolver . _initialized = true ;
94
- } ,
95
-
96
- /**
97
- *
98
- * @param {String } host
99
- * @returns {Promise }
100
- */
101
- _queryHost : ( host ) => {
102
- logger . info ( 'Looking up IP for ' , host ) ;
103
- return utils . execSafe ( 'getent' , [ 'hosts' , host ] )
104
- . then ( ( result ) => {
105
- if ( result . length < 8 ) {
106
- logger . error ( 'IP lookup returned invalid output: ' , result ) ;
107
- throw error . ValidationError ( 'Invalid output from getent hosts' ) ;
108
- }
109
- const out = result . split ( / \s + / ) ;
110
- logger . info ( `Resolved ${ host } to ${ out [ 0 ] } ` ) ;
111
- return out [ 0 ] ;
112
- } ,
113
- ( error ) => {
114
- logger . error ( 'Error looking up IP for ' + host + ': ' , error ) ;
115
- throw error ;
116
- } ) ;
42
+ ddnsUpdater . _initialized = true ;
117
43
} ,
118
44
119
45
/**
120
46
* Triggered by a timer, will check for and update ddns hosts in access list clients
121
47
*/
122
48
_checkForDDNSUpdates : ( ) => {
123
- const internalNginx = require ( '../internal/nginx' ) ; // Prevent circular import
124
-
125
49
logger . info ( 'Checking for DDNS updates...' ) ;
126
- if ( ! ddnsResolver . _processingDDNSUpdate ) {
127
- ddnsResolver . _processingDDNSUpdate = true ;
50
+ if ( ! ddnsUpdater . _processingDDNSUpdate ) {
51
+ ddnsUpdater . _processingDDNSUpdate = true ;
128
52
129
53
const updatedAddresses = new Map ( ) ;
130
54
131
55
// Get all ddns hostnames in use
132
- return ddnsResolver . _getAccessLists ( )
56
+ return ddnsUpdater . _getAccessLists ( )
133
57
. then ( ( rows ) => {
134
58
// Build map of used addresses that require resolution
135
59
const usedAddresses = new Map ( ) ;
@@ -202,7 +126,7 @@ const ddnsResolver = {
202
126
} )
203
127
. then ( ( ) => {
204
128
logger . info ( 'Finished checking for DDNS updates' ) ;
205
- ddnsResolver . _processingDDNSUpdate = false ;
129
+ ddnsUpdater . _processingDDNSUpdate = false ;
206
130
} ) ;
207
131
} else {
208
132
logger . info ( 'Skipping since previous DDNS update check is in progress' ) ;
@@ -236,4 +160,4 @@ const ddnsResolver = {
236
160
}
237
161
} ;
238
162
239
- module . exports = ddnsResolver ;
163
+ module . exports = ddnsUpdater ;
0 commit comments