UNPKG

network-config

Version:

debian ip network configuration for NodeJS

115 lines (97 loc) 2.99 kB
'use strict'; var _ = require('lodash'); var assert = require('assert'); var fs = require('fs'); module.exports = function (cp) { /** * Configure a network interface * @param {string} name interface name * @param {object} description interface definition * @param {function} f(err) */ function configure(name, description, f) { assert(_.isString(name)); assert(_.isPlainObject(description)); fs.readFile(configure.FILE, { encoding: 'utf8' }, function (err, content) { if (err) { return f(err); } fs.writeFile(configure.FILE, replaceInterface(name, content, description), function (err) { if (err) { return f(err); } if (typeof description.restart == 'boolean'? description.restart : true) { cp.exec('service networking reload', function (err, __, stderr) { f(err || stderr || null); }); } else { f(null); } }); }); } configure.FILE = '/etc/network/interfaces'; return configure; }; function replaceInterface(name, content, interfaceDescription) { var replaceFn; if (interfaceDescription.manual) { replaceFn = formatManualConfig; } else if (interfaceDescription.ipv6) { replaceFn = interfaceDescription.dhcp? formatIp6DhcpConfig : formatIp6Config; } else { replaceFn = interfaceDescription.dhcp? formatDhcpConfig : formatConfig; } return excludeInterface(name, content).trim() + '\n\n' + replaceFn(_.extend({ name: name }, interfaceDescription)) + '\n'; } function excludeInterface(name, content) { var without = _.curry(function (name, content) { return !_.includes(content, name); }); return _.chain(content) .split('\n\n') .filter(without(name)) .join('\n\n').trim(); } var formatDhcpConfig = _.template(function () { /** auto <%= name %> iface <%= name %> inet dhcp */ }.toString().split('\n').slice(2, -2).join('\n')); var formatConfig = _.template(function () { /** auto <%= name %> iface <%= name %> inet static address <%= ip %> netmask <%= netmask %><%= (typeof(network) !== "undefined") ? "\n network "+ network : ""%><%= (typeof(gateway) !== "undefined") ? "\n gateway "+ gateway : ""%> */ }.toString().split('\n').slice(2, -2).join('\n')); var formatManualConfig = _.template(function () { /** auto <%= name %> iface <%= name %> inet manual */ }.toString().split('\n').slice(2, -2).join('\n')); var formatIp6DhcpConfig = _.template(function () { /** auto <%= name %> iface <%= name %> inet manual iface <%= name %> inet6 auto */ }.toString().split('\n').slice(2, -2).join('\n')); var formatIp6Config = _.template(function () { /** auto <%= name %> iface <%= name %> inet manual iface <%= name %> inet6 static address <%= ip6 %>/<%= ip6prefixlen %><%= (typeof(ip6Gateway) !== "undefined") ? "\n gateway "+ ip6Gateway : ""%> */ }.toString().split('\n').slice(2, -2).join('\n'));