147 lines
4.3 KiB
JavaScript
147 lines
4.3 KiB
JavaScript
|
// Generated by CoffeeScript 1.10.0
|
||
|
(function() {
|
||
|
var Netmask, ip2long, long2ip;
|
||
|
|
||
|
long2ip = function(long) {
|
||
|
var a, b, c, d;
|
||
|
a = (long & (0xff << 24)) >>> 24;
|
||
|
b = (long & (0xff << 16)) >>> 16;
|
||
|
c = (long & (0xff << 8)) >>> 8;
|
||
|
d = long & 0xff;
|
||
|
return [a, b, c, d].join('.');
|
||
|
};
|
||
|
|
||
|
ip2long = function(ip) {
|
||
|
var b, byte, i, j, len;
|
||
|
b = (ip + '').split('.');
|
||
|
if (b.length === 0 || b.length > 4) {
|
||
|
throw new Error('Invalid IP');
|
||
|
}
|
||
|
for (i = j = 0, len = b.length; j < len; i = ++j) {
|
||
|
byte = b[i];
|
||
|
if (isNaN(parseInt(byte, 10))) {
|
||
|
throw new Error("Invalid byte: " + byte);
|
||
|
}
|
||
|
if (byte < 0 || byte > 255) {
|
||
|
throw new Error("Invalid byte: " + byte);
|
||
|
}
|
||
|
}
|
||
|
return ((b[0] || 0) << 24 | (b[1] || 0) << 16 | (b[2] || 0) << 8 | (b[3] || 0)) >>> 0;
|
||
|
};
|
||
|
|
||
|
Netmask = (function() {
|
||
|
function Netmask(net, mask) {
|
||
|
var error, error1, error2, i, j, ref;
|
||
|
if (typeof net !== 'string') {
|
||
|
throw new Error("Missing `net' parameter");
|
||
|
}
|
||
|
if (!mask) {
|
||
|
ref = net.split('/', 2), net = ref[0], mask = ref[1];
|
||
|
}
|
||
|
if (!mask) {
|
||
|
switch (net.split('.').length) {
|
||
|
case 1:
|
||
|
mask = 8;
|
||
|
break;
|
||
|
case 2:
|
||
|
mask = 16;
|
||
|
break;
|
||
|
case 3:
|
||
|
mask = 24;
|
||
|
break;
|
||
|
case 4:
|
||
|
mask = 32;
|
||
|
break;
|
||
|
default:
|
||
|
throw new Error("Invalid net address: " + net);
|
||
|
}
|
||
|
}
|
||
|
if (typeof mask === 'string' && mask.indexOf('.') > -1) {
|
||
|
try {
|
||
|
this.maskLong = ip2long(mask);
|
||
|
} catch (error1) {
|
||
|
error = error1;
|
||
|
throw new Error("Invalid mask: " + mask);
|
||
|
}
|
||
|
for (i = j = 32; j >= 0; i = --j) {
|
||
|
if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) {
|
||
|
this.bitmask = i;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
} else if (mask) {
|
||
|
this.bitmask = parseInt(mask, 10);
|
||
|
this.maskLong = 0;
|
||
|
if (this.bitmask > 0) {
|
||
|
this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0;
|
||
|
}
|
||
|
} else {
|
||
|
throw new Error("Invalid mask: empty");
|
||
|
}
|
||
|
try {
|
||
|
this.netLong = (ip2long(net) & this.maskLong) >>> 0;
|
||
|
} catch (error2) {
|
||
|
error = error2;
|
||
|
throw new Error("Invalid net address: " + net);
|
||
|
}
|
||
|
if (!(this.bitmask <= 32)) {
|
||
|
throw new Error("Invalid mask for ip4: " + mask);
|
||
|
}
|
||
|
this.size = Math.pow(2, 32 - this.bitmask);
|
||
|
this.base = long2ip(this.netLong);
|
||
|
this.mask = long2ip(this.maskLong);
|
||
|
this.hostmask = long2ip(~this.maskLong);
|
||
|
this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base;
|
||
|
this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1);
|
||
|
this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0;
|
||
|
}
|
||
|
|
||
|
Netmask.prototype.contains = function(ip) {
|
||
|
if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) {
|
||
|
ip = new Netmask(ip);
|
||
|
}
|
||
|
if (ip instanceof Netmask) {
|
||
|
return this.contains(ip.base) && this.contains(ip.broadcast || ip.last);
|
||
|
} else {
|
||
|
return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Netmask.prototype.next = function(count) {
|
||
|
if (count == null) {
|
||
|
count = 1;
|
||
|
}
|
||
|
return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask);
|
||
|
};
|
||
|
|
||
|
Netmask.prototype.forEach = function(fn) {
|
||
|
var index, j, k, len, long, range, ref, ref1, results, results1;
|
||
|
range = (function() {
|
||
|
results = [];
|
||
|
for (var j = ref = ip2long(this.first), ref1 = ip2long(this.last); ref <= ref1 ? j <= ref1 : j >= ref1; ref <= ref1 ? j++ : j--){ results.push(j); }
|
||
|
return results;
|
||
|
}).apply(this);
|
||
|
results1 = [];
|
||
|
for (index = k = 0, len = range.length; k < len; index = ++k) {
|
||
|
long = range[index];
|
||
|
results1.push(fn(long2ip(long), long, index));
|
||
|
}
|
||
|
return results1;
|
||
|
};
|
||
|
|
||
|
Netmask.prototype.toString = function() {
|
||
|
return this.base + "/" + this.bitmask;
|
||
|
};
|
||
|
|
||
|
return Netmask;
|
||
|
|
||
|
})();
|
||
|
|
||
|
exports.ip2long = ip2long;
|
||
|
|
||
|
exports.long2ip = long2ip;
|
||
|
|
||
|
exports.Netmask = Netmask;
|
||
|
|
||
|
}).call(this);
|