<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.7">
  <classes>
    <class id="IPDiscovery" _delta="define">
      <parent>IPApplication</parent>
      <properties>
        <category>bizmodel,searchable, ipmgmt</category>
        <abstract>false</abstract>
        <db_table>ipdiscovery</db_table>
        <naming>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="org_id"/>
          </attributes>
        </reconciliation>
        <icon>asset/img/icons8-binoculars-48.png</icon>
      </properties>
      <fields>
        <field id="last_discovery_date" xsi:type="AttributeDateTime">
          <sql>last_discovery_date</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="duration" xsi:type="AttributeDuration">
          <sql>duration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="dhcp_range_discovery_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>dhcp_range_discovery_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="ping_enabled" xsi:type="AttributeEnum">
          <sql>ping_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="ping_timeout" xsi:type="AttributeInteger">
          <sql>ping_timeout</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="iplookup_enabled" xsi:type="AttributeEnum">
          <sql>iplookup_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="dns1" xsi:type="AttributeDomainName">
          <sql>dns1</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="dns2" xsi:type="AttributeDomainName">
          <sql>dns2</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="scan_enabled" xsi:type="AttributeEnum">
          <sql>scan_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="port_number" xsi:type="AttributeInteger">
          <sql>port_number</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="protocol" xsi:type="AttributeEnum">
          <values>
            <value>udp</value>
            <value>tcp</value>
            <value>both</value>
          </values>
          <sql>protocol</sql>
          <default_value>udp</default_value>
          <is_null_allowed>false</is_null_allowed>
        </field>
         <field id="scan_timeout" xsi:type="AttributeInteger">
          <sql>scan_timeout</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="scan_cnx_refused_enabled" xsi:type="AttributeEnum">
          <sql>scan_cnx_refused_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="ipv4subnets_list" xsi:type="AttributeLinkedSet">
          <linked_class>IPv4Subnet</linked_class>
          <ext_key_to_me>ipdiscovery_id</ext_key_to_me>
          <tracking_level/>
          <edit_mode>add_remove</edit_mode>
         </field>
      </fields>
      <methods>
        <method id="DoCheckToWrite">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function DoCheckToWrite()
	{
		parent::DoCheckToWrite();

		// If scan is enabled, make sure port number is not null
		if ($this->Get('scan_enabled') == 'yes')
		{
			if ($this->Get('port_number') == '')
			{
				$this->m_aCheckIssues[] = Dict::Format('UI:IPDiscovery:Action:New:ScanWithNoPort');
				return;
			}
		}
    }]]></code>
        </method>
        <method id="GetInitialStateAttributeFlags">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array())
	{
	  $sFlagsFromParent = parent::GetInitialStateAttributeFlags($sAttCode, $aReasons);
		switch ($sAttCode)
		{
			case 'last_discovery_date':
			case 'duration':
				return (OPT_ATT_READONLY | $sFlagsFromParent);

			default:
				break;
		}
		return $sFlagsFromParent;
    }]]></code>
        </method>
        <method id="GetAttributeFlags">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '')
	{
	  $sFlagsFromParent = parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState);
		switch ($sAttCode)
		{
			case 'last_discovery_date':
			case 'duration':
				return (OPT_ATT_READONLY | $sFlagsFromParent);

			default:
				break;
		}
		return $sFlagsFromParent;
    }]]></code>
        </method>
      </methods>
      <presentation>
        <list>
          <items>
            <item id="uuid">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="location_id">
              <rank>40</rank>
            </item>
            <item id="ping_enabled">
              <rank>50</rank>
            </item>
            <item id="iplookup_enabled">
              <rank>60</rank>
            </item>
            <item id="scan_enabled">
              <rank>70</rank>
            </item>
          </items>
        </list>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="business_criticity">
              <rank>40</rank>
            </item>
            <item id="location_id">
              <rank>50</rank>
            </item>
            <item id="move2production">
              <rank>60</rank>
            </item>
            <item id="uuid">
              <rank>70</rank>
            </item>
            <item id="ping_enabled">
              <rank>80</rank>
            </item>
            <item id="ping_timeout">
              <rank>90</rank>
            </item>
            <item id="iplookup_enabled">
              <rank>100</rank>
            </item>
            <item id="dns1">
              <rank>110</rank>
            </item>
            <item id="dns2">
              <rank>120</rank>
            </item>
            <item id="scan_enabled">
              <rank>130</rank>
            </item>
            <item id="port_number">
              <rank>140</rank>
            </item>
            <item id="protocol">
              <rank>150</rank>
            </item>
            <item id="scan_timeout">
              <rank>160</rank>
            </item>
            <item id="scan_cnx_refused_enabled">
              <rank>170</rank>
            </item>
          </items>
        </search>
        <default_search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="org_id">
              <rank>20</rank>
            </item>
            <item id="status">
              <rank>30</rank>
            </item>
            <item id="uuid">
              <rank>70</rank>
            </item>
          </items>
        </default_search>
        <details>
          <items>
            <item id="col:col0">
              <items>
                <item id="fieldset:Class:IPDiscovery:baseinfo">
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="org_id">
                      <rank>20</rank>
                    </item>
                    <item id="status">
                      <rank>30</rank>
                    </item>
                    <item id="business_criticity">
                      <rank>40</rank>
                    </item>
                    <item id="location_id">
                      <rank>50</rank>
                    </item>
                    <item id="description">
                      <rank>60</rank>
                    </item>
                    <item id="move2production">
                      <rank>70</rank>
                    </item>
                    <item id="uuid">
                       <rank>80</rank>
                    </item>
                  </items>
                  <rank>10</rank>
                </item>
                <item id="fieldset:Class:IPDiscovery:operation">
                  <items>
                    <item id="dhcp_range_discovery_enabled">
                      <rank>10</rank>
                    </item>
                    <item id="last_discovery_date">
                      <rank>20</rank>
                    </item>
                    <item id="duration">
                      <rank>30</rank>
                    </item>
                  </items>
                </item>
              </items>
              <rank>10</rank>
            </item>
            <item id="col:col1">
              <items>
                <item id="fieldset:Class:IPDiscovery:pinginfo">
                  <items>
                    <item id="ping_enabled">
                      <rank>10</rank>
                    </item>
                    <item id="ping_timeout">
                      <rank>20</rank>
                    </item>
                  </items>
                  <rank>10</rank>
                </item>
                <item id="fieldset:Class:IPDiscovery:iplookupinfo">
                  <items>
                    <item id="iplookup_enabled">
                      <rank>10</rank>
                    </item>
                    <item id="dns1">
                      <rank>20</rank>
                    </item>
                    <item id="dns2">
                      <rank>30</rank>
                    </item>
                  </items>
                  <rank>20</rank>
                </item>
                <item id="fieldset:Class:IPDiscovery:scaninfo">
                  <items>
                    <item id="scan_enabled">
                      <rank>10</rank>
                    </item>
                    <item id="port_number">
                      <rank>20</rank>
                    </item>
                    <item id="protocol">
                      <rank>30</rank>
                    </item>
                    <item id="scan_timeout">
                      <rank>40</rank>
                    </item>
                    <item id="scan_cnx_refused_enabled">
                      <rank>50</rank>
                    </item>
                  </items>
                  <rank>30</rank>
                </item>
              </items>
              <rank>20</rank>
            </item>
            <item id="contacts_list">
              <rank>30</rank>
            </item>
            <item id="documents_list">
              <rank>40</rank>
            </item>
            <item id="ipv4subnets_list">
              <rank>50</rank>
            </item>
          </items>
        </details>
      </presentation>
    </class>
    <class id="IPSubnet" _created_in="teemip-ip-mgmt" _delta="must_exist">
      <fields>
        <field id="ipdiscovery_id" xsi:type="AttributeExternalKey" _delta="define">
          <sql>ipdiscovery_id</sql>
          <filter/>
          <dependencies/>
          <is_null_allowed>true</is_null_allowed>
          <target_class>IPDiscovery</target_class>
          <on_target_delete>DEL_AUTO</on_target_delete>
        </field>
        <field id="ipdiscovery_name" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>name</target_attcode>
        </field>
        <field id="ipdiscovery_dhcp_range_discovery_enabled" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>dhcp_range_discovery_enabled</target_attcode>
        </field>
        <field id="ipdiscovery_ping_enabled" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>ping_enabled</target_attcode>
        </field>
        <field id="ipdiscovery_iplookup_enabled" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>iplookup_enabled</target_attcode>
        </field>
        <field id="ipdiscovery_scan_enabled" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>scan_enabled</target_attcode>
        </field>
        <field id="ipdiscovery_scan_cnx_refused_enabled" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>ipdiscovery_id</extkey_attcode>
          <target_attcode>scan_cnx_refused_enabled</target_attcode>
        </field>
        <field id="ipdiscovery_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>ipdiscovery_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="dhcp_range_discovery_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>dhcp_range_discovery_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="ping_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>ping_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>yes</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="iplookup_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>iplookup_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>yes</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="scan_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>scan_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>yes</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="scan_cnx_refused_enabled" xsi:type="AttributeEnum" _delta="define">
          <sql>scan_cnx_refused_enabled</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
          </values>
          <default_value>no</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>radio_horizontal</display_style>
          <dependencies/>
        </field>
        <field id="last_discovery_date" xsi:type="AttributeDateTime" _delta="define">
          <sql>last_discovery_date</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="ping_duration" xsi:type="AttributeDuration" _delta="define">
          <sql>ping_duration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="ping_discovered" xsi:type="AttributeInteger" _delta="define">
          <sql>ping_discovered</sql>
          <default_value>0</default_value>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="iplookup_duration" xsi:type="AttributeDuration" _delta="define">
          <sql>iplookup_duration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="iplookup_discovered" xsi:type="AttributeInteger" _delta="define">
          <sql>iplookup_discovered</sql>
          <default_value>0</default_value>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="scan_duration" xsi:type="AttributeDuration" _delta="define">
          <sql>scan_duration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="scan_discovered" xsi:type="AttributeInteger" _delta="define">
          <sql>scan_discovered</sql>
          <default_value>0</default_value>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
      </fields>
      <methods>
        <method id="IsIPLookupEnabled" _delta="define">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function IsIPLookupEnabled()
	{
		$iIpDiscoveryId = $this->Get('ipdiscovery_id');
		if (($iIpDiscoveryId > 0) &&
		    ($this->Get('ipdiscovery_enabled') == 'yes') &&
		    ($this->Get('ipdiscovery_iplookup_enabled') == 'yes') &&
		    ($this->Get('iplookup_enabled') == 'yes')) {
		    return true;
	  }
		return false;
    }]]></code>
        </method>
      </methods>
      <presentation>
        <search _delta="must_exist">
          <items>
            <item id="ipdiscovery_id">
              <rank>80</rank>
            </item>
            <item id="ping_enabled">
              <rank>90</rank>
            </item>
            <item id="iplookup_enabled">
              <rank>100</rank>
            </item>
            <item id="scan_enabled">
              <rank>110</rank>
            </item>
          </items>
        </search>
        <default_search _delta="must_exist">
          <items>
            <item id="ipdiscovery_id">
              <rank>50</rank>
            </item>
          </items>
        </default_search>
      </presentation>
    </class>
    <class id="IPv4Range" _created_in="teemip-ip-mgmt" _delta="must_exist">
      <methods>
        <method id="IsIPLookupEnabled" _delta="define">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function IsIPLookupEnabled()
	{
		$oSubnet = MetaModel::GetObject('IPv4Subnet', $this->Get('subnet_id'), false /* MustBeFound */);
		return $oSubnet->IsIPLookupEnabled();
    }]]></code>
        </method>
      </methods>
    </class>
    <class id="IPv4Subnet" _created_in="teemip-ip-mgmt" _delta="must_exist">
      <presentation>
        <details _delta="must_exist">
          <items>
            <item id="col:col3" _delta="define">
              <items>
                <item id="fieldset:Class:IPSubnet:discoveryapp">
                  <items>
                    <item id="ipdiscovery_id">
                      <rank>10</rank>
                    </item>
                    <item id="ipdiscovery_dhcp_range_discovery_enabled">
                      <rank>20</rank>
                    </item>
                    <item id="ipdiscovery_ping_enabled">
                      <rank>30</rank>
                    </item>
                    <item id="ipdiscovery_iplookup_enabled">
                      <rank>40</rank>
                    </item>
                    <item id="ipdiscovery_scan_enabled">
                      <rank>50</rank>
                    </item>
                    <item id="ipdiscovery_scan_cnx_refused_enabled">
                      <rank>60</rank>
                    </item>
                  </items>
                  <rank>10</rank>
                </item>
                <item id="fieldset:Class:IPSubnet:discoverysubnet">
                  <items>
                    <item id="ipdiscovery_enabled">
                      <rank>10</rank>
                    </item>
                    <item id="dhcp_range_discovery_enabled">
                      <rank>20</rank>
                    </item>
                    <item id="ping_enabled">
                      <rank>30</rank>
                    </item>
                    <item id="iplookup_enabled">
                      <rank>40</rank>
                    </item>
                    <item id="scan_enabled">
                      <rank>50</rank>
                    </item>
                    <item id="scan_cnx_refused_enabled">
                      <rank>60</rank>
                    </item>
                  </items>
                  <rank>20</rank>
                </item>
                <item id="fieldset:Class:IPSubnet:discoverystats" >
                  <items>
                    <item id="last_discovery_date" _delta="define">
                      <rank>10</rank>
                    </item>
                    <item id="ping_duration">
                      <rank>20</rank>
                    </item>
                    <item id="ping_discovered">
                      <rank>30</rank>
                    </item>
                    <item id="iplookup_duration">
                      <rank>40</rank>
                    </item>
                    <item id="iplookup_discovered">
                      <rank>50</rank>
                    </item>
                    <item id="scan_duration">
                      <rank>60</rank>
                    </item>
                    <item id="scan_discovered">
                      <rank>70</rank>
                    </item>
                  </items>
                  <rank>30</rank>
                </item>
              </items>
              <rank>30</rank>
            </item>
          </items>
        </details>
        <search _delta="must_exist">
          <items>
             <item id="ipdiscovery_id" _delta="define">
              <rank>210</rank>
            </item>
            <item id="ipdiscovery_enabled" _delta="define">
              <rank>220</rank>
            </item>
            <item id="last_discovery_date" _delta="define">
              <rank>230</rank>
            </item>
            <item id="ping_enabled" _delta="define">
              <rank>240</rank>
            </item>
            <item id="iplookup_enabled" _delta="define">
              <rank>250</rank>
            </item>
            <item id="scan_enabled" _delta="define">
              <rank>260</rank>
            </item>
          </items>
        </search>
        <default_search _delta="must_exist">
          <items>
            <item id="ipdiscovery_id" _delta="define">
              <rank>70</rank>
            </item>
          </items>
        </default_search>
        <list _delta="must_exist">
          <items>
            <item id="ipdiscovery_id">
              <rank>90</rank>
            </item>
            <item id="ipdiscovery_enabled">
              <rank>100</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
    <class id="IPAddress" _created_in="teemip-ip-mgmt" _delta="must_exist">
      <fields>
        <field id="last_discovery_date" xsi:type="AttributeDateTime" _delta="define">
          <sql>last_discovery_date</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="responds_to_ping" xsi:type="AttributeEnum" _delta="define">
          <sql>responds_to_ping</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
            <value id="na">na</value>
          </values>
          <default_value>na</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>list</display_style>
          <dependencies/>
        </field>
        <field id="responds_to_iplookup" xsi:type="AttributeEnum" _delta="define">
          <sql>responds_to_iplookup</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
            <value id="na">na</value>
          </values>
          <default_value>na</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>list</display_style>
          <dependencies/>
        </field>
        <field id="fqdn_from_iplookup" xsi:type="AttributeString" _delta="define">
          <sql>fqdn_from_iplookup</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="responds_to_scan" xsi:type="AttributeEnum" _delta="define">
          <sql>responds_to_scan</sql>
          <values>
            <value id="yes">yes</value>
            <value id="no">no</value>
            <value id="cnx_refused">cnx_refused</value>
            <value id="na">na</value>
          </values>
          <default_value>na</default_value>
          <is_null_allowed>false</is_null_allowed>
          <display_style>list</display_style>
          <dependencies/>
        </field>
      </fields>
      <presentation>
        <search _delta="must_exist">
          <items>
            <item id="last_discovery_date" _delta="define">
              <rank>210</rank>
            </item>
            <item id="responds_to_ping" _delta="define">
              <rank>220</rank>
            </item>
            <item id="responds_to_iplookup" _delta="define">
              <rank>230</rank>
            </item>
            <item id="fqdn_from_iplookup" _delta="define">
              <rank>240</rank>
            </item>
            <item id="responds_to_scan" _delta="define">
              <rank>240</rank>
            </item>
          </items>
        </search>
      </presentation>
    </class>
    <class id="IPv4Address" _created_in="teemip-ip-mgmt" _delta="must_exist">
      <fields>
        <field id="ipdiscovery_name" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>subnet_id</extkey_attcode>
          <target_attcode>ipdiscovery_name</target_attcode>
        </field>
      </fields>
      <methods>
        <method id="IsIPLookupEnabled" _delta="define">
          <comment/>
          <static>false</static>
          <access>public</access>
          <type>Overload-cmdbAbstractObject</type>
          <code><![CDATA[ public function IsIPLookupEnabled()
	{
	  $iSubnetId = $this->Get('subnet_id');
	  if ($iSubnetId > 0) {
	      $oSubnet = MetaModel::GetObject('IPv4Subnet', $this->Get('subnet_id'), false /* MustBeFound */);
	      return $oSubnet->IsIPLookupEnabled();
	  }
	  return false;
    }]]></code>
        </method>
      </methods>
      <presentation>
        <details _delta="must_exist">
          <items>
            <item id="col:col3" _delta="define">
              <items>
                <item id="fieldset:Class:IPAddress:discoveryinfo">
                  <items>
                    <item id="ipdiscovery_name">
                      <rank>10</rank>
                    </item>
                    <item id="last_discovery_date">
                      <rank>20</rank>
                    </item>
                    <item id="responds_to_ping">
                      <rank>30</rank>
                    </item>
                    <item id="responds_to_iplookup">
                      <rank>40</rank>
                    </item>
		            <item id="fqdn_from_iplookup">
		              <rank>50</rank>
		            </item>
                    <item id="responds_to_scan">
                      <rank>60</rank>
                    </item>
                  </items>
                  <rank>10</rank>
                </item>
              </items>
              <rank>10</rank>
            </item>
          </items>
        </details>
        <search _delta="must_exist">
          <items>
            <item id="ipdiscovery_name" _delta="define">
              <rank>210</rank>
            </item>
            <item id="last_discovery_date" _delta="define">
              <rank>220</rank>
            </item>
            <item id="responds_to_ping" _delta="define">
              <rank>230</rank>
            </item>
            <item id="responds_to_iplookup" _delta="define">
              <rank>240</rank>
            </item>
            <item id="fqdn_from_iplookup" _delta="define">
              <rank>250</rank>
            </item>
            <item id="responds_to_scan" _delta="define">
              <rank>260</rank>
            </item>
          </items>
        </search>
        <list _delta="must_exist">
          <items>
            <item id="responds_to_ping" _delta="define">
              <rank>55</rank>
            </item>
            <item id="responds_to_iplookup" _delta="define">
              <rank>56</rank>
            </item>
            <item id="responds_to_scan" _delta="define">
              <rank>57</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
  </classes>
  <menus>
    <menu xsi:type="DashboardMenuNode" id="IPDiscovery" _delta="define">
      <parent>IPTools</parent>
      <rank>100</rank>
      <definition>
        <layout>DashboardLayoutOneCol</layout>
        <title/>
        <auto_reload>
          <enabled>false</enabled>
          <interval>300</interval>
        </auto_reload>
		<cells>
		    <cell id="teemip-disc-100">
		      <rank>0</rank>
		      <dashlets>
		        <dashlet id="teemip-disc-104" xsi:type="DashletHeaderStatic">
		          <rank>0</rank>
		          <title>Menu:IPDiscovery:IPv4Statistics</title>
		          <icon>teemip-ip-mgmt/asset/img/icons8-rj45-48.png</icon>
		        </dashlet>
		      </dashlets>
		    </cell>
		    <cell id="teemip-disc-300">
		      <rank>2</rank>
		      <dashlets>
		        <dashlet id="teemip-disc-301" xsi:type="DashletGroupByPie">
		          <rank>0</rank>
		          <title>Menu:IPDiscovery:IPv4Status</title>
		          <query>SELECT IPv4Address</query>
		          <group_by>status</group_by>
		          <style>pie</style>
		        </dashlet>
		        <dashlet id="teemip-disc-302" xsi:type="DashletHeaderDynamic">
		          <rank>1</rank>
		          <title>Menu:IPDiscovery:IPv4Ping</title>
		          <icon>teemip-ip-discovery/asset/img/icons8-ping-pong-48.png</icon>
		          <subtitle>By status</subtitle>
		          <query>SELECT IPv4Address WHERE responds_to_ping = 'yes'</query>
		          <group_by>status</group_by>
		          <values>allocated,released,reserved,unassigned</values>
		        </dashlet>
		        <dashlet id="teemip-disc-303" xsi:type="DashletHeaderDynamic">
		          <rank>2</rank>
		          <title>Menu:IPDiscovery:IPv4Scan</title>
		          <icon>teemip-ip-discovery/asset/img/icons8-vision-48.png</icon>
		          <subtitle>By status</subtitle>
		          <query>SELECT IPv4Address WHERE responds_to_scan = 'yes'</query>
		          <group_by>status</group_by>
		          <values>allocated,released,reserved,unassigned</values>
		        </dashlet>
		        <dashlet id="teemip-disc-304" xsi:type="DashletHeaderDynamic">
		          <rank>3</rank>
		          <title>Menu:IPDiscovery:IPv4Lookup</title>
		          <icon>teemip-ip-discovery/asset/img/icons8-broadcasting-48.png</icon>
		          <subtitle>By status</subtitle>
		          <query>SELECT IPv4Address WHERE responds_to_iplookup = 'yes'</query>
		          <group_by>status</group_by>
		          <values>allocated,released,reserved,unassigned</values>
		        </dashlet>
		      </dashlets>
		    </cell>
		    <cell id="teemip-disc-500">
		      <rank>4</rank>
		      <dashlets>
		        <dashlet id="teemip-disc-501" xsi:type="DashletGroupByTable">
		          <rank>0</rank>
		          <title>Menu:IPDiscovery:IPv4DiscoveredSubnets</title>
		          <icon>teemip-ip-mgmt/asset/img/icons8-subnet-48.png</icon>
		          <query>SELECT IPv4Subnet WHERE ipdiscovery_id != 0</query>
		          <group_by>ipdiscovery_id</group_by>
		          <style>table</style>
		        </dashlet>
		      </dashlets>
		    </cell>
		  </cells>
      </definition>
    </menu>
    <menu xsi:type="OQLMenuNode" id="IPDiscoveryApplication" _delta="define">
      <parent>IPDiscovery</parent>
      <rank>10</rank>
      <oql>SELECT IPDiscovery</oql>
      <do_search>1</do_search>
    </menu>
  </menus>
  <snippets>
    <snippet id="TeemIpIPDiscovery" _delta="define">
      <placement>module</placement>
      <module>teemip-ip-discovery</module>
      <rank>10</rank>
      <content><![CDATA[
/*************************************
 * Plugin to handle discovery results
 */
class TeemIpIPDiscovery implements iPopupMenuExtension
{
	/**
	 * @inheritdoc
	 */
	public static function EnumItems($iMenuId, $param) {
		$aResult = array();
		switch ($iMenuId) {
			case iPopupMenuExtension::MENU_OBJLIST_ACTIONS: // $param is a DBObjectSet
				break;

			case iPopupMenuExtension::MENU_OBJLIST_TOOLKIT: // $param is a DBObjectSet
				break;

			case iPopupMenuExtension::MENU_OBJDETAILS_ACTIONS: // $param is a DBObject
				$oObj = $param;

				if (($oObj instanceof IPv4Subnet) || ($oObj instanceof IPv4Range) || ($oObj instanceof IPv4Address)) {
					// Additional actions for IPSubnets
					if (!UserRights::IsActionAllowed('IPv4Address', UR_ACTION_MODIFY) == UR_ALLOWED_YES) {
						break;
					}
					if ($oObj->IsIPLookupEnabled() && ($oObj->DoCheckToExplodeFQDN('fqdn_from_iplookup') == '')) {
						$oAppContext = new ApplicationContext();
						$sContext = $oAppContext->GetForLink();

						$id = $oObj->GetKey();
						$sClass = get_class($oObj);

						$aParams = $oAppContext->GetAsHash();
						$aParams['class'] = $sClass;
						$aParams['id'] = $id;
						$aParams['operation'] = 'explodefqdn';
						$aParams['fqdn_attribute'] = 'fqdn_from_iplookup';
						$sMenu = 'UI:IPDiscovery:Action:ExplodeFQDN:IPAddress';
						$aResult[] = new URLPopupMenuItem($sMenu, Dict::S($sMenu), utils::GetAbsoluteUrlModulePage('teemip-ip-mgmt', 'ui.teemip-ip-mgmt.php', $aParams));
					}
				}
				break;

			case iPopupMenuExtension::MENU_DASHBOARD_ACTIONS: // $param is a Dashboard
				break;

			default:
				// Unknown type of menu, do nothing
				break;
		}

		return $aResult;
	}
}]]></content>
    </snippet>
  </snippets>
</itop_design>
