Name

global.DiscoveryPortScanner

Description

DiscoveryPortScanner is a set of functions used in discovery port scanning

Script

var DiscoveryPortScanner = Class.create();
DiscoveryPortScanner.prototype = {
  initialize: function() {
      this.firedProbes = [];
  },

  firePortProbeByPort: function(port) {
      var probesFired = 0;
      var isNetworkDiscovery = (g_disco_functions.getDiscoveryType(agent_correlator) == 'Networks');

      if (!isNetworkDiscovery && !g_disco_functions.isInRange(g_device.getSource()))
          return probesFired;

      var portProbes = this.getPortProbes();
      PROBES: while (portProbes.next()) {
          var servicePorts = this.getSPFromPP(portProbes);
          var alreadyFired = g_array_util.contains(this.firedProbes, portProbes.sys_id);
          // if this probe matches our port and we haven't triggered it yet, then lets do so!
          if (g_array_util.contains(servicePorts, port) && !alreadyFired) {
              probesFired += this.scheduleProbe(portProbes, port);
              this.firedProbes.push(new String(portProbes.sys_id));
              continue PROBES;
          }            
      }

      return probesFired;
  },

  scheduleProbe: function(portProbe, port) {
      var probesFired = 0;

      var probe = Probe.getById(portProbe.getValue("triggers_probe"));
      if (probe != null) {
          probe.setSource(g_device.getSource());
          probe.addParameter("use_class", portProbe.getValue("classy"));
          probe.addParameter("port_probe", portProbe.getValue('sys_id'));
          probe.addParameter("port", port);

          if (g_device.getCmdbCi())
              probe.addParameter("cmdb_ci", g_device.getCmdbCi());

          if (GlideHostUtil.isLocalhost(g_device.getSource()))
              probe.addParameter("aka", StringUtil.join(GlideHostUtil.getNonLoopbackIPs()));

          probe.setMidSelectDetails(g_probe.getParameter("mid_selector_details"));
  		probe.create(g_probe.getAgent(), g_probe.getEccQueueId());
          probesFired++;
      }

      return probesFired;
  },

  updateCIServicePorts: function(openPorts, scannedPorts, cmdbCi) {
      var availPorts = new GlideRecord('cmdb_ip_service_ci');
      availPorts.addQuery('ci', cmdbCi);
      availPorts.deleteMultiple();

      for (var i = 0; i < openPorts.length; i++) {
          var port = openPorts[i];

          var portGR = g_disco_functions.getService(port);
          availPorts.initialize();
          availPorts.setValue('service', portGR.sys_id);
          availPorts.setValue('ci', cmdbCi);
          availPorts.insert();
      }

      if (openPorts.length)
          g_device.log("Open ports found: " + openPorts.join(", "));
      else
          g_device.log("No open ports found (" + scannedPorts.join(", ") + ")");
  },

  getPortProbes: function() {
      var gr = new GlideRecord("discovery_port_probe");
      gr.initialize();
      gr.addActiveQuery();
      gr.query();

      return gr;
  },

  getPortProbeByName: function(name) {
      var gr = new GlideRecord("discovery_port_probe");
      gr.initialize();
      gr.addActiveQuery();
      gr.addQuery('name', name);
      gr.query();
      gr.next();
      return gr;
  },

  getAllServicePorts: function() {
      var serviceList = [];

      var portProbes = this.getPortProbes();
      while (portProbes.next()) {
          var list = this.getSPFromPP(portProbes);
          for (var i = 0; i < list.length; i++)
              serviceList.push(list[i]);
      }

      return serviceList;
  },

  getSPFromPPId: function(ppid) {
      var gr = new GlideRecord("discovery_port_probe");
      if (ppid)
          gr.get('sys_id', ppid);
      return this.getSPFromPP(gr);
  },

  getSPFromPP: function(portProbe) {
      var serviceList = [];
      var services = portProbe.services.getGlideList().getValues();
      if (services.isEmpty())
          return serviceList;

      var cmdbIPService = new GlideRecord("cmdb_ip_service");
      cmdbIPService.addQuery("sys_id", services);
      cmdbIPService.query();
      while (cmdbIPService.next())
          serviceList.push(new String(cmdbIPService.port));

      return serviceList;
  },

  getPPFromSP: function(servicePort) {
      var cmdbIPService = new GlideRecord('cmdb_ip_service');
      cmdbIPService.addQuery('port', servicePort);
      cmdbIPService.query();
      if (!cmdbIPService.next())
          return null;

      var portProbes = new GlideRecord('discovery_port_probe');
      portProbes.addQuery('services', 'CONTAINS', cmdbIPService.getValue('sys_id'));
      portProbes.query();
      if (!portProbes.next())
          return null;

      return portProbes;
  },

  type: "DiscoveryPortScanner"
}

Sys ID

51563c700a0a0b1c0048f123e37d933b

Offical Documentation

Official Docs: