You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					209 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					209 lines
				
				5.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								// Generated by CoffeeScript 1.12.7
							 | 
						||
| 
								 | 
							
								(function() {
							 | 
						||
| 
								 | 
							
								  var Netmask, atob, chr, chr0, chrA, chra, 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, c, i, j, n, ref;
							 | 
						||
| 
								 | 
							
								    b = [];
							 | 
						||
| 
								 | 
							
								    for (i = j = 0; j <= 3; i = ++j) {
							 | 
						||
| 
								 | 
							
								      if (ip.length === 0) {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (i > 0) {
							 | 
						||
| 
								 | 
							
								        if (ip[0] !== '.') {
							 | 
						||
| 
								 | 
							
								          throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        ip = ip.substring(1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      ref = atob(ip), n = ref[0], c = ref[1];
							 | 
						||
| 
								 | 
							
								      ip = ip.substring(c);
							 | 
						||
| 
								 | 
							
								      b.push(n);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (ip.length !== 0) {
							 | 
						||
| 
								 | 
							
								      throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    switch (b.length) {
							 | 
						||
| 
								 | 
							
								      case 1:
							 | 
						||
| 
								 | 
							
								        if (b[0] > 0xFFFFFFFF) {
							 | 
						||
| 
								 | 
							
								          throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return b[0] >>> 0;
							 | 
						||
| 
								 | 
							
								      case 2:
							 | 
						||
| 
								 | 
							
								        if (b[0] > 0xFF || b[1] > 0xFFFFFF) {
							 | 
						||
| 
								 | 
							
								          throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return (b[0] << 24 | b[1]) >>> 0;
							 | 
						||
| 
								 | 
							
								      case 3:
							 | 
						||
| 
								 | 
							
								        if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) {
							 | 
						||
| 
								 | 
							
								          throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0;
							 | 
						||
| 
								 | 
							
								      case 4:
							 | 
						||
| 
								 | 
							
								        if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) {
							 | 
						||
| 
								 | 
							
								          throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0;
							 | 
						||
| 
								 | 
							
								      default:
							 | 
						||
| 
								 | 
							
								        throw new Error('Invalid IP');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  chr = function(b) {
							 | 
						||
| 
								 | 
							
								    return b.charCodeAt(0);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  chr0 = chr('0');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  chra = chr('a');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  chrA = chr('A');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  atob = function(s) {
							 | 
						||
| 
								 | 
							
								    var base, dmax, i, n, start;
							 | 
						||
| 
								 | 
							
								    n = 0;
							 | 
						||
| 
								 | 
							
								    base = 10;
							 | 
						||
| 
								 | 
							
								    dmax = '9';
							 | 
						||
| 
								 | 
							
								    i = 0;
							 | 
						||
| 
								 | 
							
								    if (s.length > 1 && s[i] === '0') {
							 | 
						||
| 
								 | 
							
								      if (s[i + 1] === 'x' || s[i + 1] === 'X') {
							 | 
						||
| 
								 | 
							
								        i += 2;
							 | 
						||
| 
								 | 
							
								        base = 16;
							 | 
						||
| 
								 | 
							
								      } else if ('0' <= s[i + 1] && s[i + 1] <= '9') {
							 | 
						||
| 
								 | 
							
								        i++;
							 | 
						||
| 
								 | 
							
								        base = 8;
							 | 
						||
| 
								 | 
							
								        dmax = '7';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    start = i;
							 | 
						||
| 
								 | 
							
								    while (i < s.length) {
							 | 
						||
| 
								 | 
							
								      if ('0' <= s[i] && s[i] <= dmax) {
							 | 
						||
| 
								 | 
							
								        n = (n * base + (chr(s[i]) - chr0)) >>> 0;
							 | 
						||
| 
								 | 
							
								      } else if (base === 16) {
							 | 
						||
| 
								 | 
							
								        if ('a' <= s[i] && s[i] <= 'f') {
							 | 
						||
| 
								 | 
							
								          n = (n * base + (10 + chr(s[i]) - chra)) >>> 0;
							 | 
						||
| 
								 | 
							
								        } else if ('A' <= s[i] && s[i] <= 'F') {
							 | 
						||
| 
								 | 
							
								          n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (n > 0xFFFFFFFF) {
							 | 
						||
| 
								 | 
							
								        throw new Error('too large');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      i++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (i === start) {
							 | 
						||
| 
								 | 
							
								      throw new Error('empty octet');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return [n, i];
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Netmask = (function() {
							 | 
						||
| 
								 | 
							
								    function Netmask(net, mask) {
							 | 
						||
| 
								 | 
							
								      var error, 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) {
							 | 
						||
| 
								 | 
							
								        mask = 32;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      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 || mask === 0) {
							 | 
						||
| 
								 | 
							
								        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 (error1) {
							 | 
						||
| 
								 | 
							
								        error = error1;
							 | 
						||
| 
								 | 
							
								        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, lastLong, long;
							 | 
						||
| 
								 | 
							
								      long = ip2long(this.first);
							 | 
						||
| 
								 | 
							
								      lastLong = ip2long(this.last);
							 | 
						||
| 
								 | 
							
								      index = 0;
							 | 
						||
| 
								 | 
							
								      while (long <= lastLong) {
							 | 
						||
| 
								 | 
							
								        fn(long2ip(long), long, index);
							 | 
						||
| 
								 | 
							
								        index++;
							 | 
						||
| 
								 | 
							
								        long++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Netmask.prototype.toString = function() {
							 | 
						||
| 
								 | 
							
								      return this.base + "/" + this.bitmask;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return Netmask;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  })();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exports.ip2long = ip2long;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exports.long2ip = long2ip;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exports.Netmask = Netmask;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}).call(this);
							 |