isc-dhcp-server
Version:
NodeJS package to programatically manage an isc-dhcp-server.
107 lines (80 loc) • 2.68 kB
JavaScript
var is_ip = require('is-ip')
var { Netmask } = require('netmask')
// https://stackoverflow.com/questions/46200086/how-to-check-if-a-given-ip-falls-between-a-given-ip-range-using-node-js
function IPtoNum(ip){
return Number(
ip.split(".")
.map(d => ("000"+d).substr(-3) )
.join("")
);
}
exports.validateConfig = (config) => {
return new Promise((resolve, reject) => {
var required_opts = [
'interface',
'network',
'range',
'netmask',
'dns',
'router',
'broadcast'
]
required_opts.forEach(k => {
if (!config[k]) {
throw('Missing required option: ' + k)
}
})
if (!Array.isArray(config.range))
return reject('DHCP ip pool range must be array')
if (!Array.isArray(config.router) && typeof config.router != 'string')
return reject('router option must be of type string or array')
if (!Array.isArray(config.dns) && typeof config.dns != 'string')
return reject('dns option must be of type string or array')
if (typeof config.router == 'string')
config.router = [config.router]
if (typeof config.dns == 'string')
config.dns = [config.dns]
if (!config.static)
config.static = []
if (!Array.isArray(config.static))
return reject('static option must be of type array')
if (!is_ip(config.range[0]) || !is_ip(config.range[1]))
return reject('Invalid DHCP pool range')
if (!is_ip(config.network))
return reject('Network must be a valid IP')
if (!is_ip(config.netmask))
return reject('Netmask must be a valid IP')
if (!is_ip(config.broadcast))
return reject('Broadcast address must be a valid IP')
var block = new Netmask(`${config.range[0]}/${config.netmask}`)
if (!block.contains(config.range[1]))
return reject('Invalid DHCP pool range')
if (IPtoNum(config.range[0]) > IPtoNum(config.range[1]))
return reject('DHCP pool start must be less than pool end')
config.router.forEach(r => {
if (!is_ip(r))
throw('Gateway must be a valid IP')
})
config.dns.forEach(r => {
if (!is_ip(r))
throw('DNS must be valid IP(s)')
})
resolve(config)
})
}
exports.validateAll = (configs) => {
return new Promise((resolve, reject) => {
configs.forEach(c => {
var block = new Netmask(`${c.range[0]}/${c.netmask}`)
configs.forEach(cc => {
if (cc.interface != c.interface) {
var ip = cc.range[0] + '/' + cc.netmask
if (block.contains(ip))
reject('Network configuration conflict/overlapping')
}
})
})
resolve()
})
}