if (isset($_REQUEST['sysmapid'])) { $options = array('sysmapids' => $_REQUEST['sysmapid'], 'editable' => 1, 'extendoutput' => 1); $maps = CMap::get($options); if (empty($maps)) { access_deny(); } else { $sysmap = reset($maps); } } // EXPORT /////////////////////////////////// if ($EXPORT_DATA) { $maps = get_request('maps', array()); $options = array('sysmapids' => $maps, 'select_selements' => API_OUTPUT_EXTEND, 'select_links' => API_OUTPUT_EXTEND, 'output' => API_OUTPUT_EXTEND); $sysmaps = CMap::get($options); $options = array('sysmapids' => zbx_objectValues($sysmaps, 'sysmapid'), 'output' => API_OUTPUT_EXTEND, 'select_image' => 1); $images = CImage::get($options); prepareMapExport($sysmaps); $images = prepareImageExport($images); $sysmaps = array('images' => $images, 'sysmaps' => $sysmaps); $xml = zbxXML::arrayToXML($sysmaps); print $xml; exit; } // IMPORT /////////////////////////////////// $rules = get_request('rules', array()); if (!isset($_FILES['import_file'])) { foreach (array('maps', 'icons', 'background') as $key) { $rules[$key]['exist'] = 1; $rules[$key]['missed'] = 1; } }
function getImageByIdent($ident) { zbx_value2array($ident); if (!isset($ident['name'])) { return 0; } static $images; if (is_null($images)) { // get All images $images = array(); $options = array('output' => API_OUTPUT_EXTEND, 'nodeids' => get_current_nodeid(true)); $dbImages = CImage::get($options); foreach ($dbImages as $inum => $img) { if (!isset($images[$img['name']])) { $images[$img['name']] = array(); } $nodeName = get_node_name_by_elid($img['imageid'], true); if (!is_null($nodeName)) { $images[$img['name']][$nodeName] = $img; } else { $images[$img['name']][] = $img; } } //------ } $ident['name'] = trim($ident['name'], ' '); if (!isset($images[$ident['name']])) { return 0; } $sImages = $images[$ident['name']]; if (!isset($ident['node'])) { return reset($sImages); } else { if (isset($sImages[$ident['node']])) { return $sImages[$ident['node']]; } else { return 0; } } }
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; } }