node-red-contrib-udpdnserver
v1.0.7
Published
A Node-RED node .
Downloads
28
Readme
node-red-contrib-udpdnserver
This is a fully formed UDP Node-Red node that provides a caching DNS Server.
The Node uses an alaSQL in memory database that can store and then cache requests to significantly speed up local server requests, for example requests can go from 350ms to 8ms when cached.
Cache values (on a per domain basis) for time to live (TTL) are in seconds, after that it deletes the entry(s) and starts learning again.
The Cache learning algorythm (LTTL) is in seconds, it allows (on a per domain basis) the ability to learn about multiple addresses or requests, for example, if the LTTL is set to 60, and multiple command line "nslookup www.google.com" requests are performed by the user, then all of the addresses received by the cache are randomly sent back to the user on susequent cached requests, this is done until the domain TTL has expired and it then flushes the RR (Resource Request) cache and the learning is started again.
When creating TTL and LTTL values, if the TTL is 99999999999 and the LTTL is 0, then they effectively are static cached values that will not timeout and are immediately cached
Note all RR types are intercepted and then made available to the cache,user's can decide to further process them in their own Node-Red processes and/or cache.
One designed capabilty is that the Node is programmable in the Node-Red builder, it allows users to add alaSQL SQL/Javascript functions and tables - functionality to extend the Node.
The first output is from the decision engine eg: if the result is from the cache or from the upstream DNS resolver, you can add as many upstream resolvers as you like, a random selection is applied select an upstream DNS resolver. Note that upstream resolvers can have a different port number and this can be set by way of addrress and port for example
msg1.sql="select uds_insertUpstreamAddress('8.8.4.4',5353) rr";
msg1.sql="select uds_insertUpstreamAddress('8.8.4.4',53) rr";
msg1.sql="select uds_insertUpstreamAddress('8.8.4.4') rr"; // use default 53
This allows you to cascade node-red-contrib-updnserver nodes (only available using multiple upstream node-red or bind instances)
#Zones
Zones are now provided by a new zones table and subnets are loaded into it eg: local,network,dmz... an unlimitied number can be created, including an unlimited of subnets can be defined. Subnets are resolved to zoneNames during the resolving process meaning, the incoming IP calling address can now have its own address cached and a lookup on a per zone is now performed.
Another capability that it has, is it allows tracking domains that requests have gone to, also, it tracks the calling address and ports the requests originated from, this is provided by the second output.
Note that the input and third output are for requests and responces to alaSQL and allow you to easily extend the Node.
Currently ONLY IPV4 requests are resolved, although the node itself actually stores "Type 28" request for IPV6, I just havent written the functions yet.
Refer to this wiki for the RR types. https://en.wikipedia.org/wiki/List_of_DNS_record_types
#To Install
npm install node-red-contrib-udpdnserver
Import the flow below into Node-Red
set the ip address of the listener in the node eg 127.0.0.1
set the port if not on the default port (53)
point resolv.conf to this address
Try it out
Use this Zoned flow to get you started, note that on the info tab, the basic node standard functions are and will be maintained.
[{"id":"a035f5cf.05a5","type":"tab","label":"DNS Server Test","disabled":false,"info":""},{"id":"17ea11d5.5022d6","type":"switch","z":"a035f5cf.05a5","name":"","property":"payload.result","propertyType":"msg","rules":[{"t":"eq","v":"resolved","vt":"str"},{"t":"eq","v":"cached","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":750,"y":120,"wires":[["b7d7a1b6.b50f7"],["8bbde0c4.70de5"]]},{"id":"af3a77a5.5ff54","type":"debug","z":"a035f5cf.05a5","name":"RAW Answer","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":910,"y":240,"wires":[]},{"id":"8bbde0c4.70de5","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":890,"y":147,"wires":[]},{"id":"2f61fb8f.9ece84","type":"switch","z":"a035f5cf.05a5","name":"","property":"payload.sql","propertyType":"msg","rules":[{"t":"cont","v":"CREATE DATABASE","vt":"str"},{"t":"cont","v":"getIPV4Address","vt":"str"},{"t":"cont","v":"getIPV4cName","vt":"str"},{"t":"cont","v":"delete from","vt":"str"},{"t":"cont","v":"CACHED RESULT","vt":"str"},{"t":"cont","v":"select * from learnrr","vt":"str"},{"t":"cont","v":"rrParse","vt":"str"},{"t":"cont","v":"rrInsert","vt":"str"},{"t":"cont","v":"checkLearn","vt":"str"},{"t":"cont","v":"checkCache","vt":"str"},{"t":"cont","v":"insertUpstreamAddress","vt":"str"},{"t":"cont","v":"select * from rr","vt":"str"},{"t":"cont","v":"select uds_getUpstreamAddress","vt":"str"},{"t":"cont","v":"select uds_getZoneNames","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":15,"x":890,"y":440,"wires":[["44fc7346.bb17cc"],["fda83f4c.b764a"],["5a53636e.6e252c"],["a65fa71.9182558"],["b11edb86.91f078"],["51184bb.1078db4"],["dbb26bc2.fd7358"],[],[],["2e602004.6c1b68"],["8ec15a84.275c4"],["f9c2196e.7e50f8"],["8bd8a7ba.233af8"],["571bb00c.e088c"],["85030c3c.2e817"]]},{"id":"51184bb.1078db4","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult","x":1160,"y":420,"wires":[]},{"id":"a65fa71.9182558","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1110,"y":380,"wires":[]},{"id":"a9fc718e.bce2b","type":"function","z":"a035f5cf.05a5","name":"Who's learning","func":"var msg1 = {};\nmsg1.sql=\"select * from learnrr rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":320,"y":380,"wires":[["c61cec42.5c38a"]]},{"id":"39fd8213.1a905e","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":380,"wires":[["a9fc718e.bce2b"]]},{"id":"5a53636e.6e252c","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr","x":1180,"y":340,"wires":[]},{"id":"3689d351.28b52c","type":"function","z":"a035f5cf.05a5","name":"flush rr learn","func":"var msg1 = {};\nmsg1.sql=\"delete from learnrr\";\nreturn msg1;","outputs":1,"noerr":0,"x":310,"y":420,"wires":[["5f7bf829.218c4"]]},{"id":"a32cdcc2.fa12a","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":420,"wires":[["3689d351.28b52c"]]},{"id":"85030c3c.2e817","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1110,"y":700,"wires":[]},{"id":"84668137.928648","type":"function","z":"a035f5cf.05a5","name":"show the rr list","func":"var msg1 = {};\nmsg1.sql=\"select * from rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":320,"y":340,"wires":[["f78f73e0.928fc"]]},{"id":"f8d50a10.edd458","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":340,"wires":[["84668137.928648"]]},{"id":"8b13dfe.6bbc6a","type":"function","z":"a035f5cf.05a5","name":"checkLearnRrCache","func":"var msg1 = {};\nmsg1.sql=\"select uds_checkLearn() rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":340,"y":120,"wires":[["e619fe92.81abe8"]]},{"id":"18ab7aff.49a78d","type":"function","z":"a035f5cf.05a5","name":"get upstream Addr","func":"var msg1 = {};\nmsg1.sql=\"select uds_getUpstreamAddress() rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":330,"y":300,"wires":[["e3cc0edb.f10e78"]]},{"id":"11b86721.7dd4a1","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":300,"wires":[["18ab7aff.49a78d"]]},{"id":"7ab28bcc.50d28c","type":"function","z":"a035f5cf.05a5","name":"insertUpstreamAddress","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertUpstreamAddress('8.8.8.8',53) rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":340,"y":220,"wires":[["72915bb9.7a0da4"]]},{"id":"db3d1773.df6a18","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":220,"wires":[["7ab28bcc.50d28c"]]},{"id":"25a944af.d5333c","type":"function","z":"a035f5cf.05a5","name":"checkRrCache","func":"var msg1 = {};\nmsg1.sql=\"select uds_checkCache() rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":320,"y":80,"wires":[["c709655d.362d3"]]},{"id":"d2feb44.ab227c8","type":"inject","z":"a035f5cf.05a5","name":"Scan Cache's","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":80,"wires":[["25a944af.d5333c"]]},{"id":"2e602004.6c1b68","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr[1]","x":1180,"y":500,"wires":[]},{"id":"815b63f6.d58a78","type":"function","z":"a035f5cf.05a5","name":"insertUpstreamAddress","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertUpstreamAddress('8.8.4.4',53) rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":340,"y":260,"wires":[["9a9f3ca1.c911c8"]]},{"id":"4fecba52.844ef4","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":260,"wires":[["815b63f6.d58a78"]]},{"id":"b7d7a1b6.b50f7","type":"function","z":"a035f5cf.05a5","name":"Create CACHE RR Record 600 sec holding 60 sec learning","func":"var msg1 = {};\nmsg.payload.rr.forEach(function(element) {\ndelete element[\"ttl\"];\nmsg1.sql=\"SELECT uds_rrInsert('\"+\n msg.payload.zone+\n \"','\"+\n element.name+\n \"','\"+\n JSON.stringify(element)+\n \"','\"+ '600'+\n \"','\"+ '60' +\n \"');\";\nnode.send([{sql:msg1.sql}]); \n});","outputs":1,"noerr":0,"x":1050,"y":100,"wires":[["e5a54a2b.2c1298"]]},{"id":"52ecf72c.85dfe8","type":"udpdnserver","z":"a035f5cf.05a5","address":"0.0.0.0","port":53,"name":"UDPdnServer","functions":"CREATE DATABASE UDPdnServer;\nUSE DATABASE UDPdnServer;\nCREATE TABLE rr(zoneName,domainName, rr,ttl);\nCREATE TABLE learnrr(zoneName,domainName,lttl);\nCREATE TABLE upStreams(address,port);\nCREATE TABLE zones(zoneName,addressMask);\n\nCREATE FUNCTION uds_insertZone AS ``function(zoneName,addressMask) {\n let count = alasql('USE DATABASE UDPdnServer;SELECT zoneName,addressMask FROM zones WHERE zoneName = ? and addressMask = ?',[zoneName,addressMask]);\n let recFound = count[1].length;\n if (recFound == 0) {\n alasql('USE DATABASE UDPdnServer;INSERT INTO zones (zoneName,addressMask) VALUES (?,?);',[zoneName,addressMask]);\n } \n return count;\n}``;\n\nCREATE FUNCTION uds_getZoneAddressMask AS ``function(zoneName) {\n let data = alasql('USE DATABASE UDPdnServer;SELECT zoneName,addressMask from zones where zoneName = ?;',[zoneName]);\n let addresses = data[1];\n return addresses;\n}``;\n\nCREATE FUNCTION uds_getCachedRr AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer; SELECT zoneName,domainName FROM rr where not exists (select zoneName,domainName from learnrr);');\n return data[1]\n}``;\n\nCREATE FUNCTION uds_getCountCachedRr AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer; SELECT zoneName,domainName FROM rr where not exists (select zoneName,domainName from learnrr);');\n return data[1].length;\n}``;\n\nCREATE FUNCTION uds_getRrCount AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer;SELECT count(*) rrcount from rr;');\n return data[1];\n}``;\n\nCREATE FUNCTION uds_getLearnCount AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer;SELECT count(*) learnrrcount from learnrr;');\n return data[1];\n}``;\n\nCREATE FUNCTION uds_insertUpstreamAddress AS ``function(address,port) {\n let count = alasql('USE DATABASE UDPdnServer;SELECT address FROM upStreams WHERE address = ?',[address]);\n let recFound = count[1].length;\n if (recFound == 0) {\n alasql('USE DATABASE UDPdnServer;INSERT INTO upStreams (address,port) VALUES (?,?);',[address,port]);\n } \n return count;\n}``;\n\nCREATE FUNCTION uds_getUpstreamAddress AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer;SELECT address,port from upStreams rec;');\n let addresses = data[1];\n let count = addresses.length;\n if (count > 0) {\n var min=0;\n var max=count-1;\n var index=Math.floor(Math.random() * (max - min + 1)) + min;\n return addresses[index]; \n }\nelse\n return '1.1.1.1';\n}``;\n\nCREATE FUNCTION uds_checkCache AS ``function() {\n var currentTs = Math.round(new Date().getTime()/1000); \n let count = alasql('USE DATABASE UDPdnServer;SELECT distinct domainName FROM rr where ttl < ?;',[currentTs] );\n let recFound = count[1].length;\n if (recFound) {\n for (var i = 0; i < recFound; i++) { \n var domainName = count[1][i].domainName;\n alasql('USE DATABASE UDPdnServer;delete from rr where domainName = ?;',[domainName]);\n } \n };\n return count;\n}``;\n\nCREATE FUNCTION uds_checkLearn AS ``function() {\n var currentTs = Math.round(new Date().getTime()/1000); \n let count = alasql('USE DATABASE UDPdnServer;SELECT * FROM learnrr;');\n let recFound = count[1].length;\n if (recFound) {\n for (var i = 0; i < recFound; i++) { \n if (currentTs > count[1][i].lttl) {\n var domainName = count[1][i].domainName;\n var zoneName = count[1][i].zoneName;\n alasql('USE DATABASE UDPdnServer;delete from learnrr where zoneName = ? and domainName = ?;',[zoneName,domainName]);\n }\n } \n };\n return count;\n}``;\n\nCREATE FUNCTION uds_rrLearn AS ``function(zoneName,domainName,lttl) {\n let count = alasql('USE DATABASE UDPdnServer;SELECT domainName FROM learnrr WHERE zoneName = ? and domainName = ?;',[zoneName,domainName]);\n let recFound = count[1].length;\n if (recFound == 0) {\n alasql('USE DATABASE UDPdnServer;INSERT INTO learnrr (zoneName,domainName,lttl) VALUES (?,?,?);',[zoneName,domainName,lttl]);\n } \n return count;\n}``;\n\nCREATE FUNCTION uds_rrInsert AS ``function(zoneName,domainName,rr,ttl,lttl) {\n let count = alasql('USE DATABASE UDPdnServer;SELECT * FROM rr WHERE zoneName = ? and domainName = ? and rr = ?;',[zoneName,domainName,rr]);\n let recFound = count[1].length;\n if (recFound == 0) {\n var currentT = Math.round(new Date().getTime() / 1000);\n var dttl = currentT+parseInt(ttl);\n var dlttl= currentT+parseInt(lttl);\n count= alasql('USE DATABASE UDPdnServer;INSERT INTO rr (zoneName,domainName,rr,ttl) VALUES (?,?,?,?);',[zoneName,domainName,rr,dttl]);\n // Start the domain learning\n let learnrr = alasql('SELECT uds_rrLearn(?,?,?) learnrec;',[zoneName,domainName,dlttl]);\n } \n return count;\n}``;\n\nCREATE FUNCTION uds_rrReplace AS ``function(zoneName,domainName,rr,ttl,lttl) {\n let count = alasql('USE DATABASE UDPdnServer;DELETE FROM rr WHERE zoneName = ? and domainName = ?;',[zoneName,domainName]);\n var currentT = Math.round(new Date().getTime() / 1000);\n var dttl = currentT+parseInt(ttl);\n var dlttl= currentT+parseInt(lttl);\n count= alasql('USE DATABASE UDPdnServer;INSERT INTO rr (zoneName,domainName,rr,ttl) VALUES (?,?,?,?);',[zoneName,domainName,rr,dttl]);\n // Start the domain learning\n let learnrr = alasql('SELECT uds_rrLearn(?,?,?) learnrec;',[zoneName,domainName,dlttl]);\n return count;\n}``;\n\nCREATE FUNCTION uds_rrParse AS ``function(zoneName,domainName,typeIn,dataIn,checkLearnrr) {\n var rrIn; \n if (domainName === '') { rrIn= alasql('USE DATABASE UDPdnServer;SELECT rr FROM rr' );}\nelse \n if (checkLearnrr) { rrIn= alasql('USE DATABASE UDPdnServer; SELECT rr FROM rr where zoneName = ? and domainName = ? and not exists (select zoneName,domainName from learnrr where zoneName = ? and domainName = ?);',[zoneName,domainName,zoneName,domainName]);}\nelse\n { rrIn= alasql('USE DATABASE UDPdnServer; SELECT rr FROM rr where zoneName = ? and domainName = ?;',[zoneName,domainName]);}\n var outRR = [];\n for (var i = 0; i < rrIn[1].length; i++) { \n if (dataIn === '') {outRR.push(JSON.parse(rrIn[1][i].rr));}\n else \n if (JSON.parse(rrIn[1][i].rr)[typeIn] == dataIn) {outRR.push(JSON.parse(rrIn[1][i].rr));}\n }\n return {\"zoneName\":zoneName,\"domainName\":domainName,\"rrcount\":i-1,\"rr\":outRR}; \n}``;\n\n\nCREATE FUNCTION uds_getIPV4Address AS ``function(zoneName,domainName) {\n let data = alasql('SELECT uds_rrParse(?,?,?,?,?) rec;',[zoneName,domainName,'type','1',true]);\n let addresses = data[0].rec.rr;\n let count = addresses.length;\n if (count > 0) {\n var min=0;\n var max=count-1;\n var index=Math.floor(Math.random() * (max - min + 1)) + min;\n return {\"zoneName\":zoneName,\"domainName\":domainName,\"type\":\"1\",\"address\":addresses[index].address}; \n }\nelse\n return {\"zoneName\":zoneName,\"domainName\":domainName,\"type\":\"1\",\"address\":\"none\"};\n}``;\n\nCREATE FUNCTION uds_getIPV4cName AS ``function(zoneName,domainName) {\n let savedName = domainName;\n let data1 = '';\n let notdone = true;\n do {\n data1 = alasql('SELECT uds_rrParse(?,?,?,?,?) rec;',[zoneName,savedName,'type','5',true]);\n if (data1[0].rec.rr[0] != null) {\n savedName = data1[0].rec.rr[0].data;\n }\n else { notdone=false; }\n }\n while (notdone);\nreturn {\"zoneName\":zoneName,\"domainName\":domainName,\"type\":\"5\",\"data\":savedName};\n}``;\n\nCREATE FUNCTION uds_resolveIPV4Address AS ``function(zoneName,domainName) {\n let data1 = alasql('SELECT uds_getIPV4cName(?,?) rec;',[zoneName,domainName]);\n domainName = data1[0].rec.data;\n let data2 = alasql('SELECT uds_getIPV4Address(?,?) rec;',[zoneName,domainName]);\n return data2[0].rec;\n}``;\n\nCREATE FUNCTION uds_getZoneNames AS ``function() {\n let data = alasql('USE DATABASE UDPdnServer;SELECT * from zones');\n return data[1]; \n}``;\n\n","x":720,"y":240,"wires":[["17ea11d5.5022d6","e0e2b28a.9f4ee"],["af3a77a5.5ff54"],["2f61fb8f.9ece84","c83b17ba.ee6078","3c6e7081.a978d8"]]},{"id":"dbb26bc2.fd7358","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr","x":1180,"y":460,"wires":[]},{"id":"fda83f4c.b764a","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr","x":1180,"y":300,"wires":[]},{"id":"44fc7346.bb17cc","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":1130,"y":260,"wires":[]},{"id":"9ce7d6ff.cb4fb8","type":"inject","z":"a035f5cf.05a5","name":"Scan Cache's","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":120,"wires":[["8b13dfe.6bbc6a"]]},{"id":"f9c2196e.7e50f8","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult","x":1160,"y":580,"wires":[]},{"id":"decaec5a.8d21d8","type":"dns","z":"a035f5cf.05a5","name":"","method":"lookup","x":330,"y":520,"wires":[["67d160b9.7343d8"]]},{"id":"6bd67113.68d7","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"www.google.com.au","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":500,"wires":[["decaec5a.8d21d8"]]},{"id":"67d160b9.7343d8","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":510,"y":520,"wires":[]},{"id":"8292a593.e26238","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"www.ebay.com.au","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":540,"wires":[["decaec5a.8d21d8"]]},{"id":"b58b3616.265378","type":"function","z":"a035f5cf.05a5","name":"flush rr cache","func":"var msg1 = {};\nmsg1.sql=\"delete from rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":310,"y":460,"wires":[["b5f9f812.f066d8"]]},{"id":"f990fb70.3f1728","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":460,"wires":[["b58b3616.265378"]]},{"id":"e0e2b28a.9f4ee","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":890,"y":200,"wires":[]},{"id":"b5f4f30b.a5f6a8","type":"function","z":"a035f5cf.05a5","name":"insertUpstreamAddress","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertUpstreamAddress('1.1.1.1','5759') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":340,"y":180,"wires":[["ad8ca0a6.366b3"]]},{"id":"14cd76d7.b71049","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":180,"wires":[["b5f4f30b.a5f6a8"]]},{"id":"8ec15a84.275c4","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult","x":1160,"y":540,"wires":[]},{"id":"8bd8a7ba.233af8","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr","x":1180,"y":620,"wires":[]},{"id":"6c9dfa24.ffd68c","type":"function","z":"a035f5cf.05a5","name":"Default Domain Rr List","func":"var hname = msg.payload.hostname;\nvar subdomain = hname.slice(0,hname.search(\"-gateway\"));\nvar domainname = 'mynet.net';\nvar entry = [];\nvar record = [];\nentry = JSON.parse('{ \"name\":\"'+subdomain+'-gateway.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.1.254\"}');\nrecord.push(entry);\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-trig-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.1.'+i+'\"}');\n record.push(entry);}\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-user-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.2.'+i+'\"}');\n record.push(entry);}\n for (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-tech-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.3.'+i+'\"}');\n record.push(entry);}\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-nerx-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.4.'+i+'\"}');\n record.push(entry);} \nfor (var i = 1; i <= 2; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-mongo-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.5.'+i+'\"}');\n record.push(entry);} \nmsg.payload={\"rr\":record};\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":980,"wires":[["f4d0b961.8c5418"]]},{"id":"443c8add.5eca0c","type":"inject","z":"a035f5cf.05a5","name":"Global","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":1020,"wires":[["7aef199d.a4c178"]]},{"id":"f1de7312.018758","type":"OS","z":"a035f5cf.05a5","name":"","x":290,"y":980,"wires":[["6c9dfa24.ffd68c"]]},{"id":"c83b17ba.ee6078","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":890,"y":280,"wires":[]},{"id":"ef7c0f45.d9f43","type":"function","z":"a035f5cf.05a5","name":"Create Cached Domain Rr's","func":"var msg1 = {};\nmsg.payload.rr.forEach(function(element) {\ndelete element[\"ttl\"];\nmsg1.sql=\"SELECT uds_rrReplace('\"+\n \"network\"+\n \"','\"+\n element.name+\n \"','\"+\n JSON.stringify(element)+\n \"','\"+ '99999999999'+\n \"','\"+ '0' +\n \"');\";\nnode.send([{sql:msg1.sql}]); \n});","outputs":1,"noerr":0,"x":740,"y":1020,"wires":[["f57f936d.b5a5f"]]},{"id":"6631fbc6.9cd3cc","type":"function","z":"a035f5cf.05a5","name":"Default Domain Rr List","func":"var hname = msg.payload.hostname;\nvar subdomain = hname.slice(0,hname.search(\"-gateway\"));\nvar domainname = 'mynet.net';\nvar entry = [];\nvar record = [];\nentry = JSON.parse('{ \"name\":\"'+subdomain+'-gateway.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.11.254\"}');\nrecord.push(entry);\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-trig-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.11.'+i+'\"}');\n record.push(entry);}\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-user-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.12.'+i+'\"}');\n record.push(entry);}\n for (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-tech-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.13.'+i+'\"}');\n record.push(entry);}\nfor (var i = 1; i <= 8; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-nerx-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.14.'+i+'\"}');\n record.push(entry);} \nfor (var i = 1; i <= 2; i++) { \n entry = JSON.parse('{ \"name\":\"'+subdomain+'-mongo-0'+i+'.'+domainname+'\", \"type\": 1,\"class\": 1,\"ttl\": 38400,\"address\": \"192.168.15.'+i+'\"}');\n record.push(entry);} \nmsg.payload={\"rr\":record};\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":1020,"wires":[["ef7c0f45.d9f43"]]},{"id":"fc79cbf2.025118","type":"inject","z":"a035f5cf.05a5","name":"Defaults","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":980,"wires":[["f1de7312.018758"]]},{"id":"7aef199d.a4c178","type":"OS","z":"a035f5cf.05a5","name":"","x":290,"y":1020,"wires":[["6631fbc6.9cd3cc"]]},{"id":"3510c82d.b82198","type":"function","z":"a035f5cf.05a5","name":"insertZone","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertZone('network','192.168.101.0/24') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":300,"y":620,"wires":[["fed93d6e.9461a"]]},{"id":"91d3a3d5.943dc","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":620,"wires":[["3510c82d.b82198"]]},{"id":"eb9fcde9.0aff48","type":"function","z":"a035f5cf.05a5","name":"get zone","func":"var msg1 = {};\nmsg1.sql=\"select uds_getZoneAddressMask('local') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":300,"y":700,"wires":[["2acb0ef6.2af15a"]]},{"id":"801c75eb.71bf88","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":700,"wires":[["eb9fcde9.0aff48"]]},{"id":"ae759544.0ff41","type":"function","z":"a035f5cf.05a5","name":"insertZone","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertZone('network','192.168.128.0/19') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":300,"y":660,"wires":[["e60e178a.f6eaa"]]},{"id":"119dfc50.98a314","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":660,"wires":[["ae759544.0ff41"]]},{"id":"6b23565.7b217a8","type":"function","z":"a035f5cf.05a5","name":"get zone network","func":"var msg1 = {};\nmsg1.sql=\"select uds_getZoneAddressMask('network') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":320,"y":740,"wires":[["caae358.e8af748"]]},{"id":"af20c5b5.dd321","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":740,"wires":[["6b23565.7b217a8"]]},{"id":"4f4f9868.670688","type":"function","z":"a035f5cf.05a5","name":"insertZone","func":"var msg1 = {};\nmsg1.sql=\"select uds_insertZone('local','127.0.0.1/32') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":300,"y":580,"wires":[["8acdfa25.591e68"]]},{"id":"d71583e9.211648","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":580,"wires":[["4f4f9868.670688"]]},{"id":"37690f5.cec447","type":"function","z":"a035f5cf.05a5","name":"get zoneNames","func":"var msg1 = {};\nmsg1.sql=\"select uds_getZoneNames() rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":320,"y":820,"wires":[["2fffd6e2.71622a"]]},{"id":"ee3059e3.87b47","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":820,"wires":[["37690f5.cec447"]]},{"id":"f4d0b961.8c5418","type":"function","z":"a035f5cf.05a5","name":"Create Cached Domain Rr's","func":"var msg1 = {};\nmsg.payload.rr.forEach(function(element) {\ndelete element[\"ttl\"];\nmsg1.sql=\"SELECT uds_rrReplace('\"+\n \"local\"+\n \"','\"+\n element.name+\n \"','\"+\n JSON.stringify(element)+\n \"','\"+ '99999999999'+\n \"','\"+ '0' +\n \"');\";\nnode.send([{sql:msg1.sql}]); \n});","outputs":1,"noerr":0,"x":740,"y":980,"wires":[["8f69a8fa.7b3658"]]},{"id":"571bb00c.e088c","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload.sqlResult[0].rr","x":1180,"y":660,"wires":[]},{"id":"e5a54a2b.2c1298","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":1312,"y":100,"wires":[]},{"id":"43a5a1a5.1395a8","type":"link in","z":"a035f5cf.05a5","name":"server","links":["e5a54a2b.2c1298","c709655d.362d3","e619fe92.81abe8","ad8ca0a6.366b3","72915bb9.7a0da4","9a9f3ca1.c911c8","e3cc0edb.f10e78","f78f73e0.928fc","c61cec42.5c38a","5f7bf829.218c4","b5f9f812.f066d8","fed93d6e.9461a","e60e178a.f6eaa","2acb0ef6.2af15a","2fffd6e2.71622a","8acdfa25.591e68","caae358.e8af748","8f69a8fa.7b3658","f57f936d.b5a5f","92cac2c.e1501c","4d1737cb.9c4168","55596e71.859508","5b5b6b4c.25d5ac"],"x":595,"y":240,"wires":[["52ecf72c.85dfe8"]]},{"id":"c709655d.362d3","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":80,"wires":[]},{"id":"e619fe92.81abe8","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":120,"wires":[]},{"id":"ad8ca0a6.366b3","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":180,"wires":[]},{"id":"72915bb9.7a0da4","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":220,"wires":[]},{"id":"9a9f3ca1.c911c8","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":260,"wires":[]},{"id":"e3cc0edb.f10e78","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":300,"wires":[]},{"id":"f78f73e0.928fc","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":340,"wires":[]},{"id":"c61cec42.5c38a","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":380,"wires":[]},{"id":"5f7bf829.218c4","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":420,"wires":[]},{"id":"b5f9f812.f066d8","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":460,"wires":[]},{"id":"fed93d6e.9461a","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":620,"wires":[]},{"id":"e60e178a.f6eaa","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":660,"wires":[]},{"id":"2acb0ef6.2af15a","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":700,"wires":[]},{"id":"2fffd6e2.71622a","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":820,"wires":[]},{"id":"8acdfa25.591e68","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":580,"wires":[]},{"id":"caae358.e8af748","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":740,"wires":[]},{"id":"8f69a8fa.7b3658","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":915,"y":980,"wires":[]},{"id":"f57f936d.b5a5f","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":915,"y":1020,"wires":[]},{"id":"c55733ed.fc258","type":"function","z":"a035f5cf.05a5","name":"get zone local","func":"var msg1 = {};\nmsg1.sql=\"select uds_getZoneAddressMask('local') rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":310,"y":780,"wires":[["92cac2c.e1501c"]]},{"id":"c903c998.ae9de8","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":780,"wires":[["c55733ed.fc258"]]},{"id":"92cac2c.e1501c","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":780,"wires":[]},{"id":"fb54cb9a.4f93f8","type":"function","z":"a035f5cf.05a5","name":"flush rr learn","func":"var msg1 = {};\nmsg1.sql=\"delete from learnrr\";\nreturn msg1;","outputs":1,"noerr":0,"x":330,"y":860,"wires":[["4d1737cb.9c4168"]]},{"id":"8b350019.e4d8","type":"ui_button","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":0,"height":0,"passthru":false,"label":"Clear Learning","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":120,"y":860,"wires":[["fb54cb9a.4f93f8"]]},{"id":"5b002ae1.50623c","type":"function","z":"a035f5cf.05a5","name":"flush rr cache","func":"var msg1 = {};\nmsg1.sql=\"delete from rr\";\nreturn msg1;","outputs":1,"noerr":0,"x":310,"y":940,"wires":[["55596e71.859508"]]},{"id":"ba9af3af.3d1688","type":"ui_button","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":0,"height":0,"passthru":false,"label":"Clear All Rr's","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":110,"y":940,"wires":[["5b002ae1.50623c"]]},{"id":"7061e8b7.6edbf","type":"ui_button","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":0,"height":0,"passthru":false,"label":"Reload All Rr's","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":120,"y":900,"wires":[[]]},{"id":"4d1737cb.9c4168","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":860,"wires":[]},{"id":"55596e71.859508","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":495,"y":940,"wires":[]},{"id":"fb313c69.ee17b8","type":"function","z":"a035f5cf.05a5","name":"","func":"msg.payload=msg.payload.sqlResult[0].rec[0].rrcount;\nreturn msg;","outputs":1,"noerr":0,"x":950,"y":760,"wires":[["29212d6c.a9fd3a"]]},{"id":"791fcbfb.37e714","type":"function","z":"a035f5cf.05a5","name":"","func":"msg.payload=msg.payload.sqlResult[0].rec[0].learnrrcount;\nreturn msg;","outputs":1,"noerr":0,"x":950,"y":800,"wires":[["c264b49f.fcbdc"]]},{"id":"29212d6c.a9fd3a","type":"ui_gauge","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":"8","height":"8","gtype":"gage","title":"Total Rr","label":"units","format":"{{value}}","min":0,"max":"2000","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":1120,"y":760,"wires":[]},{"id":"c264b49f.fcbdc","type":"ui_gauge","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":"8","height":"8","gtype":"gage","title":"Learned Domains","label":"units","format":"{{value}}","min":0,"max":"2000","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":1150,"y":800,"wires":[]},{"id":"70051e9f.b80a2","type":"function","z":"a035f5cf.05a5","name":"","func":"msg.payload=msg.payload.sqlResult[0].rec;\nreturn msg;","outputs":1,"noerr":0,"x":950,"y":840,"wires":[["fcb6029d.714"]]},{"id":"fcb6029d.714","type":"ui_gauge","z":"a035f5cf.05a5","name":"","group":"9bca3911.c2db3","order":0,"width":"8","height":"8","gtype":"gage","title":"CachedRr","label":"units","format":"{{value}}","min":0,"max":"2000","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":1120,"y":840,"wires":[]},{"id":"3c6e7081.a978d8","type":"switch","z":"a035f5cf.05a5","name":"","property":"payload.sql","propertyType":"msg","rules":[{"t":"cont","v":"select * from rr","vt":"str"},{"t":"cont","v":"select uds_getRrCount()","vt":"str"},{"t":"cont","v":"select uds_getLearnCount()","vt":"str"},{"t":"cont","v":"SELECT uds_getCountCachedRr()","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":5,"x":750,"y":840,"wires":[[],["fb313c69.ee17b8"],["791fcbfb.37e714"],["70051e9f.b80a2"],["bdcf179f.7adc2"]]},{"id":"bdcf179f.7adc2","type":"debug","z":"a035f5cf.05a5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":970,"y":880,"wires":[]},{"id":"18e1dd76.16a2cb","type":"function","z":"a035f5cf.05a5","name":"show the count rr list","func":"var msg1 = {};\nmsg1.sql=\"select uds_getRrCount() rec\";\nreturn msg1;","outputs":1,"noerr":0,"x":340,"y":1080,"wires":[["5b5b6b4c.25d5ac"]]},{"id":"371637f9.206f8","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"2","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":1080,"wires":[["18e1dd76.16a2cb"]]},{"id":"e04758d3.13b07","type":"function","z":"a035f5cf.05a5","name":"show the count learnrr list","func":"var msg1 = {};\nmsg1.sql=\"select uds_getLearnCount() rec\";\nreturn msg1;","outputs":1,"noerr":0,"x":345,"y":1123,"wires":[["5b5b6b4c.25d5ac"]]},{"id":"aacfda68.3de35","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"2","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":1123,"wires":[["e04758d3.13b07"]]},{"id":"f4694215.7ddf3","type":"function","z":"a035f5cf.05a5","name":"show the CachedRr list","func":"var msg1 = {};\nmsg1.sql=\"select uds_getCachedRr();\";\nreturn msg1;","outputs":1,"noerr":0,"x":346,"y":1161,"wires":[["5b5b6b4c.25d5ac"]]},{"id":"fcd73d30.972d9","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":116,"y":1161,"wires":[["f4694215.7ddf3"]]},{"id":"d4a6cea2.0e8948","type":"function","z":"a035f5cf.05a5","name":"show the count Cached list","func":"var msg1 = {};\nmsg1.sql=\"SELECT uds_getCountCachedRr() rec\";\nreturn msg1;","outputs":1,"noerr":0,"x":360,"y":1203.666748046875,"wires":[["5b5b6b4c.25d5ac"]]},{"id":"7eabbd1e.596e5c","type":"inject","z":"a035f5cf.05a5","name":"","topic":"","payload":"","payloadType":"date","repeat":"2","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":1203.666748046875,"wires":[["d4a6cea2.0e8948"]]},{"id":"5b5b6b4c.25d5ac","type":"link out","z":"a035f5cf.05a5","name":"to Server","links":["43a5a1a5.1395a8"],"x":575,"y":1140,"wires":[]},{"id":"b11edb86.91f078","type":"debug","z":"a035f5cf.05a5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1250,"y":380,"wires":[]},{"id":"9bca3911.c2db3","type":"ui_group","z":"","name":"Default","tab":"9419bf99.d85f98","disp":true,"width":"24"},{"id":"9419bf99.d85f98","type":"ui_tab","z":"","name":"DNS","icon":"dashboard"}]