1 |
3a515b92
|
cagy
|
'use strict'
|
2 |
|
|
|
3 |
|
|
var os = require('os')
|
4 |
|
|
var util = require('util')
|
5 |
|
|
var EventEmitter = require('events').EventEmitter
|
6 |
|
|
var serviceName = require('multicast-dns-service-types')
|
7 |
|
|
var txt = require('dns-txt')()
|
8 |
|
|
|
9 |
|
|
var TLD = '.local'
|
10 |
|
|
|
11 |
|
|
module.exports = Service
|
12 |
|
|
|
13 |
|
|
util.inherits(Service, EventEmitter)
|
14 |
|
|
|
15 |
|
|
function Service (opts) {
|
16 |
|
|
if (!opts.name) throw new Error('Required name not given')
|
17 |
|
|
if (!opts.type) throw new Error('Required type not given')
|
18 |
|
|
if (!opts.port) throw new Error('Required port not given')
|
19 |
|
|
|
20 |
|
|
this.name = opts.name
|
21 |
|
|
this.protocol = opts.protocol || 'tcp'
|
22 |
|
|
this.type = serviceName.stringify(opts.type, this.protocol)
|
23 |
|
|
this.host = opts.host || os.hostname()
|
24 |
|
|
this.port = opts.port
|
25 |
|
|
this.fqdn = this.name + '.' + this.type + TLD
|
26 |
|
|
this.subtypes = opts.subtypes || null
|
27 |
|
|
this.txt = opts.txt || null
|
28 |
|
|
this.published = false
|
29 |
|
|
|
30 |
|
|
this._activated = false // indicates intent - true: starting/started, false: stopping/stopped
|
31 |
|
|
}
|
32 |
|
|
|
33 |
|
|
Service.prototype._records = function () {
|
34 |
|
|
var records = [rr_ptr(this), rr_srv(this), rr_txt(this)]
|
35 |
|
|
|
36 |
|
|
var self = this
|
37 |
|
|
var interfaces = os.networkInterfaces()
|
38 |
|
|
Object.keys(interfaces).forEach(function (name) {
|
39 |
|
|
interfaces[name].forEach(function (addr) {
|
40 |
|
|
if (addr.internal) return
|
41 |
|
|
if (addr.family === 'IPv4') {
|
42 |
|
|
records.push(rr_a(self, addr.address))
|
43 |
|
|
} else {
|
44 |
|
|
records.push(rr_aaaa(self, addr.address))
|
45 |
|
|
}
|
46 |
|
|
})
|
47 |
|
|
})
|
48 |
|
|
|
49 |
|
|
return records
|
50 |
|
|
}
|
51 |
|
|
|
52 |
|
|
function rr_ptr (service) {
|
53 |
|
|
return {
|
54 |
|
|
name: service.type + TLD,
|
55 |
|
|
type: 'PTR',
|
56 |
|
|
ttl: 28800,
|
57 |
|
|
data: service.fqdn
|
58 |
|
|
}
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
function rr_srv (service) {
|
62 |
|
|
return {
|
63 |
|
|
name: service.fqdn,
|
64 |
|
|
type: 'SRV',
|
65 |
|
|
ttl: 120,
|
66 |
|
|
data: {
|
67 |
|
|
port: service.port,
|
68 |
|
|
target: service.host
|
69 |
|
|
}
|
70 |
|
|
}
|
71 |
|
|
}
|
72 |
|
|
|
73 |
|
|
function rr_txt (service) {
|
74 |
|
|
return {
|
75 |
|
|
name: service.fqdn,
|
76 |
|
|
type: 'TXT',
|
77 |
|
|
ttl: 4500,
|
78 |
|
|
data: txt.encode(service.txt)
|
79 |
|
|
}
|
80 |
|
|
}
|
81 |
|
|
|
82 |
|
|
function rr_a (service, ip) {
|
83 |
|
|
return {
|
84 |
|
|
name: service.host,
|
85 |
|
|
type: 'A',
|
86 |
|
|
ttl: 120,
|
87 |
|
|
data: ip
|
88 |
|
|
}
|
89 |
|
|
}
|
90 |
|
|
|
91 |
|
|
function rr_aaaa (service, ip) {
|
92 |
|
|
return {
|
93 |
|
|
name: service.host,
|
94 |
|
|
type: 'AAAA',
|
95 |
|
|
ttl: 120,
|
96 |
|
|
data: ip
|
97 |
|
|
}
|
98 |
|
|
}
|