Skip to content

Instantly share code, notes, and snippets.

@pringlized
Last active November 26, 2016 00:01
Show Gist options
  • Save pringlized/f79c11325401d76d7a0c38a4c389361d to your computer and use it in GitHub Desktop.
Save pringlized/f79c11325401d76d7a0c38a4c389361d to your computer and use it in GitHub Desktop.
Immediately-Invoked Function Expression (IIFE) for generating & validating IPv4 IP addresses
var ip = (function() {
var _privateIps = [
'10.0.0.0',
'10.255.255.255',
'172.16.0.0',
'172.31.255.255',
'192.168.0.0',
'192.168.255.255'
];
var _publicIps = [
'0.0.0.0',
'255.255.255.255',
];
// PRIVATE FUNCTIONS
this._generateInRange = function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
this._generateOctets = function() {
return [_generateInRange(0,255), _generateInRange(0,255), _generateInRange(0,255),_generateInRange(0,255)];
}
this._concatenateOctets = function(octets) {
var ip = '';
for (var i = 0; i < octets.length; i++) {
ip += octets[i];
ip += (i < octets.length - 1) ? '.' : '';
}
return ip;
}
// PUBLIC FUNCTIONS
this.isPrivate = function(ip) {
return /^10\.|^192\.168\.|^172\.16\.|^172\.17\.|^172\.18\.|^172\.19\.|^172\.20\.|^172\.21\.|^172\.22\.|^172\.23\.|^172\.24\.|^172\.25\.|^172\.26\.|^172\.27\.|^172\.28\.|^172\.29\.|^172\.30\.|^172\.31\./.test(ip);
}
this.isPublic = function(ip) {
return !isPrivate(ip);
}
this.private = function() {
var ip = '';
var networks = [10, 172, 192];
var octets = [networks[_generateInRange(0,2)]];
// generate address
switch(octets[0]) {
case 10:
octets.push(_generateInRange(0, 255), _generateInRange(0, 255), _generateInRange(0, 255))
break;
case 172:
octets.push(_generateInRange(16, 31), _generateInRange(0, 255), _generateInRange(0, 255))
break;
case 192:
octets.push(168, _generateInRange(0, 255), _generateInRange(0, 255));
break;
default:
return ip;
}
return _concatenateOctets(octets);
};
this.public = function() {
var ip = '';
octets = _generateOctets();
var privateNetworks = [10, 172, 192];
// regenerate if private network octets were generated
while (octets.indexOf(privateNetworks) >= 0) {
switch(octets[0]) {
case 10:
octets = _generateOctets();
break;
case 172:
if (octets[1] >= 16 || octete[1] <= 31) {
octets = _generateOctets();
}
break;
case 192:
if (octets[1] === 168) {
octets = _generateOctets();
}
break;
default:
break;
}
}
return _concatenateOctets(octets);
}
return {
private: private,
public: public,
isPrivate: isPrivate,
isPublic: isPublic
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment