function findConnectorOrDie($object) { if (isset($object->connector)) { return $object->connector; } if (!isset($object->owner)) { derr("cannot find API connector"); } if (is_null($object->owner)) { derr("cannot find API connector"); } return findConnector($object->owner); }
} if (strtolower($value) == strtolower($owner->name())) { return true; } return false; }, 'arg' => true); RQuery::$defaultFilters['rule']['rule']['operators']['is.unused.fast'] = array('eval' => function ($object, &$nestedQueries, $value) { /** @var $object Rule|SecurityRule|NatRule|DecryptionRule */ if (!$object->isSecurityRule()) { derr("unsupported filter : this is not a security rule." . $object->toString()); } $vsys = $object->owner->owner; if (!$vsys->isVirtualSystem()) { derr("this is filter is only supported on firewall/vsys based, Panorama is not allowed." . $object->toString()); } $connector = findConnector($vsys); if ($connector === null) { derr("this filter is available only from API enabled PANConf objects"); } if (!isset($vsys->apiCache)) { $vsys->apiCache = array(); } // caching results for speed improvements if (!isset($vsys->apiCache['unusedSecurity'])) { $vsys->apiCache['unusedSecurity'] = array(); $apiCmd = '<show><running><rule-use><rule-base>security</rule-base><type>unused</type><vsys>' . $vsys->name() . '</vsys></rule-use></running></show>'; $apiResult = $connector->sendCmdRequest($apiCmd); DH::dom_to_xml($apiResult); $rulesXml = DH::findXPath('/result/rules/entry', $apiResult); for ($i = 0; $i < $rulesXml->length; $i++) { $ruleName = $rulesXml->item($i)->textContent;