IP ranger class"class" for generating IP addresses
File Name : IPrangerCLS.js Requirement : WSH 5.6 Author : Branimir Petrovic Submitted : 30/04/2002 Category : Class To use a class, follow this syntax : var MyObjClass = new MyClass; WScript.Echo(MyObjClass.MyMethod()); // FileName: IPrangerCLS(sStartIP, sEndIP).js ////////////////////////////////////////////////////////////////////// if (WScript.ScriptName == "IPrangerCLS(sStartIP, sEndIP).js") { demo_IPrangerCLS(); } // ======================== CLASS ==================================== function IPrangerCLS(sStartIP, sEndIP) { // Author: Branimir Petrovic // Date: 30 Apr 2002 // Version: 1.1.0 // // Revision History: // 12 Mar 2002 V 1.0.0 // 14 Mar 2002 V 1.0.1 Changed method name of atEnd() to haveMore() // 30 Apr 2002 V 1.1.0 Dropped "Common.js" dependancies // (copied over isObject(oObj) and isArray(oAry) // Array's "clone" method from Common.js adapted // and turned into cloneArray(SampleAry) function) // // Dependancies: // - WSH 5.6 // // Methods: // - getClassName() // Returns string: IPrangerCLS // - getVersion() // Returns version string "1.0.1". // - haveMore() // Returns 'true' as long as there are still some // IPs left in the pool. // - getNext() // Returns string: IP address // --- Private Data Members --- var SELF = "IPrangerCLS"; var VERSION = "1.1.0"; var fHaveMore = true; var fAscending; var nSAry = new Array(); var nEAry = new Array(); var nIPAry; // --- Public Methods --- this.getClassName = function () { return SELF; } this.getVersion = function () { return VERSION; } this.haveMore = function () { return fHaveMore; } this.getNext = getNext; // --- Constructor --- // Will throw an exception should start or end IP address prove to be invalid: if (!isValidIP(sStartIP, nSAry)) throw "Error in \"" + SELF + "\" constructor -> Invalid start IP: " + sStartIP; if (!isValidIP(sEndIP, nEAry)) throw "Error in \"" + SELF + "\" constructor -> Invalid end IP: " + sEndIP; fAscending = (compareArys(nSAry, nEAry)<0); return; // >>> // After this point start IP, end IP and ascending (or descending) direction // can not be changed (only methods can be called against this obj's instance). // >>> --- End of Consturctor --- >>> // ---------------- Functions Implementing Public Methods ------- function getNext() { var ME = ".getNext()"; var sNextIP = ""; if (!fHaveMore) throw SELF + ME + " end of IP range reached."; if (compareArys(nSAry, nEAry)==0) fHaveMore = false; if (nIPAry==undefined) { // This part is executed only on the very first getNext() // call and never again. nIPAry = cloneArray(nSAry); sNextIP = nIPAry.join("."); return sNextIP; // >>> } if (fAscending) { // Next IP in ascending order nextIP(nIPAry, 1); if (compareArys(nIPAry, nEAry)==0) fHaveMore = false; sNextIP = nIPAry.join("."); return sNextIP; // >>> } else { // Next IP in descending order nextIP(nIPAry, -1); if (compareArys(nIPAry, nEAry)==0) fHaveMore = false; sNextIP = nIPAry.join("."); return sNextIP; // >>> } } function haveMore() { return fHaveMore; } // ---------------- Helper Functions ---------------------------- function nextIP(nIPAry, nStep) { var nCarry=0; var ME = ".nextIP(\"" + nIPAry + "\", " + nStep + ")"; // Start from rightmost item: for (var i=3; i>=0; i--) { if (i==3) { // Only the rightmost part can have step larger than one. if ( (nIPAry[3] + nStep)>255 ) { nIPAry[3] = nIPAry[3] + nStep - 256; nCarry = 1; } else if ( (nIPAry[3] + nStep)<0 ) { nIPAry[3] = 256 - nIPAry[3] + nStep; nCarry = -1; } else { nIPAry[3] = nIPAry[3] + nStep; verifyIParray(nIPAry, SELF + ME + " attempted to generate invalid IP: "); return; // >>> } } else { if ( (nIPAry[i] + nCarry)>255 ) { nIPAry[i]= nIPAry[i] + nCarry - 256; nCarry = 1; } else if ( (nIPAry[i] + nCarry)<0 ) { nIPAry[i] = 256 - nIPAry[i] + nCarry; nCarry = -1; } else { nIPAry[i] = nIPAry[i] + nCarry; verifyIParray(nIPAry, SELF + ME + " attempted to generate invalid IP: "); return; // >>> } } } // --- end for } // --- end function function verifyIParray(nIPAry, sErrMsg) { // Will throw exception should array containing IP parts violates // allowed IP range if ( !( (nIPAry[0]>0)&&(nIPAry[0]<255) && (nIPAry[1]<=255) && (nIPAry[2]<=255) && (nIPAry[3]<=255) ) ) { throw sErrMsg + " " + nIPAry.join("."); } } function isValidIP(sIP, nAry) { // Will return true if passed string is IP is OK and // will load optional nAry with 4 IP integer fragments. if (typeof(sIP)!="string") return false; // >>> var sTmpIP; var oRegX = /(\d+)/g; if (!oRegX.test(sIP)) return false; // >>> var sAry = sIP.match(oRegX); if (sAry.length==4) { if ( (sAry[0]>0)&&(sAry[0]<255) && (sAry[1]<=255) && (sAry[2]<=255) && (sAry[3]<=255) ) { sTmpIP = sAry[0] + "." + sAry[1] + "." + sAry[2] + "." + sAry[3]; if (sTmpIP==sIP) { if (nAry) { // Convert string IP address fragments to integers nAry[0] = sAry[0]*1; nAry[1] = sAry[1]*1; nAry[2] = sAry[2]*1; nAry[3] = sAry[3]*1; } return true; // >>> } } return false; // >>> } else { return false; // >>> } } function compareArys(nSAry, nEAry) { // Will compare corresponding array items and return: // -1 if start IP is lower than end IP // 0 if start IP is equal to end IP // +1 if start IP is higher than end IP for (var i=0; i<nSAry.length; i++) { if (nSAry[i]==nEAry[i]) continue; return (nSAry[i]>nEAry[i])? 1:-1; } return 0; } // --- Start of 30 Apr 2002 addition --- <<<<< function cloneArray(SampleAry) { if (!isArray(SampleAry)) return undefined; // >>> var Ary = new Array(); for (var i=0; i<SampleAry.length; i++) { if (isObject(SampleAry[i])) { if (isArray(SampleAry[i])) { Ary[Ary.length] = cloneArray(SampleAry[i]); } else { // Array items are objects so we do not know what to do: Ary[Ary.length] = undefined; } } else { // Array items are not objects, meaning plain copy works: Ary[Ary.length] = SampleAry[i]; } } return Ary; // >>> } function isObject(oObj) { return (typeof(oObj)=="object"); } function isArray(oAry) { try { return oAry.constructor==Array; } catch(e) { return false; } } // --- End of 30 Apr 2002 addition --- <<<<< } // ======================== END OF CLASS ========================= // ================================================================== function demo_IPrangerCLS() { if (!isCScript()) { var oShell_IPrangerCLS = new ActiveXObject("WScript.Shell"); var sCMD = "CScript //nologo \"" + WScript.ScriptFullName + "\""; oShell_IPrangerCLS.Run(sCMD, 1, false); WScript.Quit(); // >>> } try { var oRange = new IPrangerCLS("192.168.200.1", "192.168.200.254"); } catch(e) { WScript.Echo(e); WScript.Sleep(5000); WScript.Quit(); } while (oRange.haveMore()) { WScript.Sleep(10); WScript.Echo("oRange.getNext() -> " + oRange.getNext()); } WScript.Echo("\t" + oRange.getClassName() + " V " + oRange.getVersion()); WScript.Sleep(10000); function isCScript() { return (/cscript.exe$/i).test(WScript.FullName); } } // ================================================================== |
|||||
![]()
|
|