logo

NJP

Validate IP address(es) if is the part of Network ranges saved in ServiceNow

Import · Sep 17, 2023 · article
var onDemandDiscoveryUtil = Class.create();
onDemandDiscoveryUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    checkIP: function(ip) {
        ip = ip ? ip : this.getParameter('sysparm_ip');
        ip = String(ip);
        var range_obj = {
            within_range: false,
            range: ''
        };
        rangeArray = this._myIPSubnet()
            .split(',')
            .filter(function(x) {
            return x;
        });

        for (var i = 0; i < rangeArray.length; i++) {
            if (this._isIp4InCidr(ip, rangeArray[i])) {
                range_obj.within_range = true;
                range_obj.range = rangeArray[i];
                break;
            }
        }
        return JSON.stringify(range_obj);
    },
    _ip4ToInt: function(ip) 
    {
        return ip.split('.').reduce(function(integer, oct) 
                                    {
            return (integer << 8 )  + parseInt(oct, 10);
        }, 0) >>> 0;
    },
    _isIp4InCidr: function(ip, cidr) {
        var split = cidr.split('/');
        var range = split[0];
        var bits = split[1];
        var mask = -1 << (32 - bits);

        // check if the masked IP is the same as the range
        return (this._ip4ToInt(ip) & mask) == (this._ip4ToInt(range));
    },
    _myIPSubnet:function()
    {
        var ipsunetRet=[];
        var ipsubnet=new GlideRecord('discovery_range_item');
        ipsubnet.addEncodedQuery("active=true^summaryISNOTEMPTY^type=IP Network");
        ipsubnet.query();
        while(ipsubnet.next())
        {
            ipsunetRet.push(ipsubnet.getValue('summary'));
        }
        return ipsunetRet.join(",");
    },
    ifNotInRange:function(ipAddresses)
    {
        var app=ipAddresses.split(",");
        var au=new ArrayUtil();
        var ips=au.unique(app);
        var retArr=[];
        for(var i=0;i<ips.length;i++)
        {
            var retStr=this.checkIP(ips[i]);
            var retObj=JSON.parse(retStr);
            if(retObj.within_range==false)
                retArr.push(ips[i]);    
        }
        return JSON.stringify(retArr); 

    },


    type: 'onDemandDiscoveryUtil'
});
//Calling fuction

var ips='10.143.98.67,10.88.132.143,10.255.133.134,10.88.131.120,10.255.133.154,10.255.133.147,172.16.2.1,10.143.139.163,10.143.120.131,10.143.180.117172.16.2.1,10.143.50.195';
var api=new onDemandDiscoveryUtil();
gs.info("IPs Not in Range: "+api.ifNotInRange(ips))

Output:

SaurabhGupta_0-1694930866015.png

C If you found value in this blog/article, I'd be grateful if you could either bookmark it or mark it as helpful.

Labels:

View original source

https://www.servicenow.com/community/developer-blog/validate-ip-address-es-if-is-the-part-of-network-ranges-saved-in/ba-p/2673872