/** * @return IP4Map */ public function getIP4Mapping() { $result = array('unresolved' => array()); $mapObject = new IP4Map(); foreach ($this->members as $member) { if ($member->isTmpAddr()) { $result['unresolved'][] = $member; continue; } elseif ($member->isAddress()) { $localMap = $member->getIP4Mapping(); $mapObject->addMap($localMap, true); } elseif ($member->isGroup()) { $localMap = $member->getIP4Mapping(); $mapObject->addMap($localMap, true); } else { derr('unsupported type of objects ' . $member->toString()); } } $mapObject->sortAndRecalculate(); return $mapObject; }
/** * return 0 if not match, 1 if $network is fully included in this object, 2 if $network is partially matched by this object. * @param $network|IP4Map ie: 192.168.0.2/24, 192.168.0.2,192.168.0.2-192.168.0.4 * @return int */ public function includesIP4Network($network) { if ($this->type != self::TypeIpNetmask && $this->type != self::TypeIpRange) { return 0; } if (is_object($network)) { $networkMap = $network; } else { $networkMap = IP4Map::mapFromText($network); } return cidr::netMatch($networkMap->getFirstMapEntry(), $this->getIP4Mapping()->getFirstMapEntry()); }
/** * @param $zoneIP4Mapping array array of IP start-end to zone ie Array( 0=>Array('start'=>0, 'end'=>50, 'zone'=>'internet') 1=>... ) * @param $objectIsNegated bool IP4Mapping of this object will be inverted before doing resolution * @return string[] containing zones matched */ public function &calculateZonesFromIP4Mapping(&$zoneIP4Mapping, $objectIsNegated = false) { $zones = array(); $objectsMapping = $this->getIP4Mapping(); if ($objectIsNegated) { $fakeMapping = IP4Map::mapFromText('0.0.0.0-255.255.255.255'); $objectsMapping->substract($fakeMapping); } foreach ($zoneIP4Mapping as &$zoneMapping) { $result = $objectsMapping->substractSingleIP4Entry($zoneMapping); if ($result != 0) { $zones[$zoneMapping['zone']] = $zoneMapping['zone']; } if ($objectsMapping->count() == 0) { break; } } return $zones; }