2021-08-27 08:30:39 +02:00

80 lines
1.9 KiB
JavaScript

const ip = require('ip');
const ipAddress = require('ip-address')
const { cidrv4, cidrv6 } = require('cidr-regex');
const errorMessage = new Error('IP supplied is not valid');
const getRangev4 = (ip1, ip2) => {
const ips = [];
let firstAddressLong = ip.toLong(ip1);
const lastAddressLong = ip.toLong(ip2);
for (firstAddressLong; firstAddressLong <= lastAddressLong; firstAddressLong++)
ips.push(ip.fromLong(firstAddressLong));
return ips;
}
const getRangev6 = (ip1, ip2) => {
const ips = [];
const firstAddress = new ipAddress.Address6(ip1);
const lastAddress = new ipAddress.Address6(ip2);
for (let i = firstAddress.bigInteger(); i <= lastAddress.bigInteger(); i++) {
ips.push(ipAddress.Address6.fromBigInteger(i).correctForm());
}
return ips;
}
const isCIDR = ip => {
return ip.indexOf('/') !== -1
}
const isRange = ip => {
return ip.indexOf('-') !== -1
}
const convert = (cidrIp, ip2) => {
const ip1v4 = new ipAddress.Address4(cidrIp);
const ip1v6 = new ipAddress.Address6(cidrIp);
if (ip2) {
const ip2v4 = new ipAddress.Address4(ip2);
const ip2v6 = new ipAddress.Address6(ip2);
if (ip1v4.valid && ip2v4.valid && !isCIDR(cidrIp) && !isCIDR(ip2)) {
return getRangev4(cidrIp, ip2);
}
if (ip1v6.valid && ip2v6.valid) {
return getRangev6(cidrIp, ip2);
}
} else {
if (ip1v4.valid) {
const subnet = ip.cidrSubnet(cidrIp);
const firstAddress = subnet.firstAddress;
const lastAddress = subnet.lastAddress;
return getRangev4(firstAddress, lastAddress);
}
if (ip1v6.valid) {
const IPv6 = new ipAddress.Address6(cidrIp);
return getRangev6(IPv6.startAddress().correctForm(), IPv6.endAddress().correctForm());
}
if (isRange(cidrIp)) {
const [ firstAddress, lastAddress ] = cidrIp.split('-');
return convert(firstAddress, lastAddress);
}
}
throw errorMessage;
}
module.exports = convert;