public static function parseMap($rules) { global $USER_DETAILS; $importMaps = self::XMLtoArray(self::$xml); if (!isset($importMaps['zabbix_export'])) { $importMaps['zabbix_export'] = $importMaps; } try { if ($USER_DETAILS['type'] == USER_TYPE_SUPER_ADMIN) { $images = $importMaps['zabbix_export']['images']; $images_to_add = array(); $images_to_update = array(); foreach ($images as $inum => $image) { if (CImage::exists($image)) { if ($image['imagetype'] == IMAGE_TYPE_ICON && isset($rules['icons']['exist']) || $image['imagetype'] == IMAGE_TYPE_BACKGROUND && isset($rules['background']['exist'])) { $options = array('filter' => array('name' => $image['name']), 'output' => API_OUTPUT_SHORTEN); $imgs = CImage::get($options); $img = reset($imgs); $image['imageid'] = $img['imageid']; // image will be decoded in class.image.php $image['image'] = $image['encodedImage']; unset($image['encodedImage']); $images_to_update[] = $image; } } else { if ($image['imagetype'] == IMAGE_TYPE_ICON && isset($rules['icons']['missed']) || $image['imagetype'] == IMAGE_TYPE_BACKGROUND && isset($rules['background']['missed'])) { // No need to decode_base64 $image['image'] = $image['encodedImage']; unset($image['encodedImage']); $images_to_add[] = $image; } } } //sdi($images_to_add); if (!empty($images_to_add)) { $result = CImage::create($images_to_add); if (!$result) { throw new Exception(S_CANNOT_ADD_IMAGE); } } //sdi($images_to_update); if (!empty($images_to_update)) { $result = CImage::update($images_to_update); if (!$result) { throw new Exception(S_CANNOT_UPDATE_IMAGE); } } } $importMaps = $importMaps['zabbix_export']['sysmaps']; $sysmaps = array(); foreach ($importMaps as $mnum => &$sysmap) { unset($sysmap['sysmapid']); $exists = CMap::exists(array('name' => $sysmap['name'])); if ($exists && isset($rules['maps']['exist'])) { $db_maps = CMap::getObjects(array('name' => $sysmap['name'])); if (empty($db_maps)) { throw new Exception(S_NO_PERMISSIONS_FOR_MAP . ' [' . $sysmap['name'] . '] import'); } $db_map = reset($db_maps); $sysmap['sysmapid'] = $db_map['sysmapid']; } else { if ($exists || !isset($rules['maps']['missed'])) { info('Map [' . $sysmap['name'] . '] skipped - user rule'); unset($importMaps[$mnum]); continue; // break if not update exist } } if (isset($sysmap['backgroundid'])) { $image = getImageByIdent($sysmap['backgroundid']); if (!$image) { error(S_CANNOT_FIND_BACKGROUND_IMAGE . ' "' . $sysmap['backgroundid']['name'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'); $sysmap['backgroundid'] = 0; } else { $sysmap['backgroundid'] = $image['imageid']; } } else { $sysmap['backgroundid'] = 0; } if (!isset($sysmap['selements'])) { $sysmap['selements'] = array(); } if (!isset($sysmap['links'])) { $sysmap['links'] = array(); } foreach ($sysmap['selements'] as $snum => &$selement) { $nodeCaption = isset($selement['elementid']['node']) ? $selement['elementid']['node'] . ':' : ''; if (!isset($selement['elementid'])) { $selement['elementid'] = 0; } switch ($selement['elementtype']) { case SYSMAP_ELEMENT_TYPE_MAP: $db_sysmaps = CMap::getObjects($selement['elementid']); if (empty($db_sysmaps)) { $error = S_CANNOT_FIND_MAP . ' "' . $nodeCaption . $selement['elementid']['name'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $tmp = reset($db_sysmaps); $selement['elementid'] = $tmp['sysmapid']; break; case SYSMAP_ELEMENT_TYPE_HOST_GROUP: $db_hostgroups = CHostgroup::getObjects($selement['elementid']); if (empty($db_hostgroups)) { $error = S_CANNOT_FIND_HOSTGROUP . ' "' . $nodeCaption . $selement['elementid']['name'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $tmp = reset($db_hostgroups); $selement['elementid'] = $tmp['groupid']; break; case SYSMAP_ELEMENT_TYPE_HOST: $db_hosts = CHost::getObjects($selement['elementid']); if (empty($db_hosts)) { $error = S_CANNOT_FIND_HOST . ' "' . $nodeCaption . $selement['elementid']['host'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $tmp = reset($db_hosts); $selement['elementid'] = $tmp['hostid']; break; case SYSMAP_ELEMENT_TYPE_TRIGGER: $db_triggers = CTrigger::getObjects($selement['elementid']); if (empty($db_triggers)) { $error = S_CANNOT_FIND_TRIGGER . ' "' . $nodeCaption . $selement['elementid']['host'] . ':' . $selement['elementid']['description'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $tmp = reset($db_triggers); $selement['elementid'] = $tmp['triggerid']; break; case SYSMAP_ELEMENT_TYPE_IMAGE: default: break; } $icons = array('iconid_off', 'iconid_on', 'iconid_unknown', 'iconid_disabled', 'iconid_maintenance'); foreach ($icons as $icon) { if (isset($selement[$icon])) { $image = getImageByIdent($selement[$icon]); if (!$image) { $error = S_CANNOT_FIND_IMAGE . ' "' . $selement[$icon]['name'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $selement[$icon] = $image['imageid']; } else { $selement[$icon] = 0; } } } unset($selement); foreach ($sysmap['links'] as $lnum => &$link) { if (!isset($link['linktriggers'])) { continue; } foreach ($link['linktriggers'] as $ltnum => &$linktrigger) { $nodeCaption = isset($linktrigger['triggerid']['node']) ? $linktrigger['triggerid']['node'] . ':' : ''; $db_triggers = CTrigger::getObjects($linktrigger['triggerid']); if (empty($db_triggers)) { $error = S_CANNOT_FIND_TRIGGER . ' "' . $nodeCaption . $linktrigger['triggerid']['host'] . ':' . $linktrigger['triggerid']['description'] . '" ' . S_USED_IN_EXPORTED_MAP_SMALL . ' "' . $sysmap['name'] . '"'; throw new Exception($error); } $tmp = reset($db_triggers); $linktrigger['triggerid'] = $tmp['triggerid']; } unset($linktrigger); } unset($link); $sysmaps[] = $sysmap; } unset($sysmap); $importMaps = $sysmaps; foreach ($importMaps as $mnum => $importMap) { $sysmap = $importMap; if (isset($importMap['sysmapid'])) { $result = CMap::update($importMap); $sysmapids = $result['sysmapids']; // Deleteing all selements (with links) $db_selementids = array(); $res = DBselect('SELECT selementid FROM sysmaps_elements WHERE sysmapid=' . $sysmap['sysmapid']); while ($db_selement = DBfetch($res)) { $db_selementids[$db_selement['selementid']] = $db_selement['selementid']; } delete_sysmaps_element($db_selementids); //---- } else { // first we must create an empty map without any elements (they will be added below) $mapToCreate = $importMap; $mapToCreate['selements'] = array(); $mapToCreate['links'] = array(); $result = CMap::create($mapToCreate); $sysmapids = $result['sysmapids']; $sysmap['sysmapid'] = reset($sysmapids); } // adding elements and links $selements = $importMap['selements']; $links = $importMap['links']; foreach ($selements as $id => $selement) { if (!isset($selement['elementid']) || $selement['elementid'] == 0) { $selement['elementid'] = 0; $selement['elementtype'] = SYSMAP_ELEMENT_TYPE_IMAGE; } if (!isset($selement['iconid_off']) || $selement['iconid_off'] == 0) { throw new Exception(S_NO_ICON_FOR_MAP_ELEMENT . ' ' . $sysmap['name'] . ':' . $selement['label']); } $selement['sysmapid'] = $sysmap['sysmapid']; $selementids = CMap::addElements($selement); $selementid = reset($selementids); foreach ($links as $id => &$link) { if ($link['selementid1'] == $selement['selementid']) { $links[$id]['selementid1'] = $selementid; } else { if ($link['selementid2'] == $selement['selementid']) { $links[$id]['selementid2'] = $selementid; } } } unset($link); } foreach ($links as $id => $link) { if (!isset($link['linktriggers'])) { $link['linktriggers'] = array(); } $link['sysmapid'] = $sysmap['sysmapid']; $result = CMap::addLinks($link); } if (isset($importMap['sysmapid'])) { info(S_MAP . ' [' . $sysmap['name'] . '] ' . S_UPDATED_SMALL); } else { info(S_MAP . ' [' . $sysmap['name'] . '] ' . S_ADDED_SMALL); } } return true; } catch (Exception $e) { error($e->getMessage()); return false; } }