Name

global.DiscoveryCreateRangeSets

Description

Creates range sets from IP networks, transforming the results of a Network Discovery into range sets that may be incorporated into discovery schedules.

Script

var DiscoveryCreateRangeSets = Class.create();

DiscoveryCreateRangeSets.launch = function() {
  var sw = new GlideScriptWriter();
  sw.appendLine('var crs = new DiscoveryCreateRangeSets();');
  sw.appendLine('crs.processNetworks();');
  sw.evaluateAsync();
};

DiscoveryCreateRangeSets.prototype = {
  initialize: function() {
      this.lastRouterID = null;
      this.rangeSetID = null;
  },
  
  /**
   * @return boolean TRUE on success, FALSE if no valid range items exist.
   */	
  processNetworks: function() {
      var netGR = new GlideRecord('cmdb_ci_ip_network');
      netGR.addQuery('discover', true);
      netGR.addNotNullQuery('router');
      netGR.addQuery('state', 'Ready');
      netGR.orderBy('router');
      netGR.query();
  	if (!netGR.hasNext()) // no valid records
  		return false;
  	
      while (netGR.next()) 
          this.processNetwork(netGR);
  	
  	return true;
  },

  processNetwork: function(netGR) {
      if (this.rangeSetContainsItem(netGR))
          return;

      this.createRangeItem(netGR.subnet);
      netGR.state = 'Processed';
      netGR.update();
  },

  rangeSetContainsItem: function(netGR) {
      //ensures that the rangeset exists, if not it is created
      this.ensureRangeSet(netGR.getValue('router'));

      var subnet = netGR.subnet;

      // check if our range set contains the IP network, if not we need to create it
      var riGR = new GlideRecord('discovery_range_item');
      riGR.addQuery('parent', this.rangeSetID);
      riGR.addQuery('type', 'IP Network');
      riGR.addQuery('name', 'Subnet: ' + subnet);
  	riGR.query();
      if (riGR.next())
          return true;

      return false;
  },

  ensureRangeSet: function(routerID) {
      if (this.lastRouterID == routerID)
          return;

      this.lastRouterID = routerID;
      var rtrGR = new GlideRecord('cmdb_ci');
      rtrGR.get(routerID);
      var rtrName = rtrGR.isValid() ? rtrGR.name : 'none';
      var rsGR = new GlideRecord('discovery_range');
      var rsName = 'Router: ' + rtrName;
      rsGR.addQuery('name', rsName);
      rsGR.query();
      if (rsGR.next()) {
          this.rangeSetID = rsGR.sys_id;
          return;
      }
      rsGR.initialize();
      rsGR.name = rsName;
      rsGR.active = true;
      this.rangeSetID = rsGR.insert();
  },
  
  createRangeItem: function(subnet) {
      var snParts = subnet.split('/');
      if (snParts.length != 2)
          return;

      var riGR = new GlideRecord('discovery_range_item');
      riGR.initialize();
      riGR.name = 'Subnet: ' + subnet;
      riGR.parent = this.rangeSetID;
      riGR.type = 'IP Network';
      riGR.active = true;
      riGR.network_ip = snParts[0];
      riGR.netmask = snParts[1];
      riGR.insert();
  },
 
  type: 'DiscoveryCreateRangeSets'
}

Sys ID

86629d450ab301560087d9bed64aff40

Offical Documentation

Official Docs: