function delete_sysmaps_elements_with_groupid($groupids) { zbx_value2array($groupids); if (empty($groupids)) { return true; } $db_elements = DBselect('SELECT selementid ' . ' FROM sysmaps_elements ' . ' WHERE ' . DBcondition('elementid', $groupids) . ' AND elementtype=' . SYSMAP_ELEMENT_TYPE_HOST_GROUP); $selementids = array(); while ($db_element = DBfetch($db_elements)) { $selementids[$db_element['selementid']] = $db_element['selementid']; } delete_sysmaps_element($selementids); return TRUE; }
/** * Delete Element from map * * @param array $selements multidimensional array with selement objects * @param array $selements[0, ...]['selementid'] selementid to delete */ public static function deleteElements($selements) { $result = true; $selements = zbx_toArray($selements); $selementids = zbx_objectValues($selements, 'selementid'); $sysmapids = zbx_objectValues($selements, 'sysmapid'); try { self::BeginTransaction(__METHOD__); $options = array('sysmapids' => $sysmapids, 'editable' => 1, 'preservekeys' => 1); $upd_maps = self::get($options); foreach ($selements as $snumm => $selement) { if (!isset($upd_maps[$selement['sysmapid']])) { self::exception(ZBX_API_ERROR_PARAMETERS, S_NO_PERMISSIONS); } } $result = delete_sysmaps_element($selementids); $result = self::EndTransaction($result, __METHOD__); if (!$result) { self::exception(ZBX_API_ERROR_INTERNAL, 'Map delete elements failed'); } return $selementids; } catch (APIException $e) { self::EndTransaction(false, __METHOD__); $errors = $e->getErrors(); $error = reset($errors); self::setError(__METHOD__, ZBX_API_ERROR_PARAMETERS, $error); return false; } }
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; } }
if ($result) { unset($_REQUEST['form']); } } else { if (isset($_REQUEST['delete'])) { if (isset($_REQUEST['linkid'])) { $result = delete_link($_REQUEST['linkid']); show_messages($result, 'Link deleted', 'Cannot delete link'); add_audit_if($result, AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_MAP, 'Name [' . $sysmap['name'] . '] Link [' . $_REQUEST['linkid'] . '] deleted'); if ($result) { unset($_REQUEST['linkid']); unset($_REQUEST['form']); } } else { if (isset($_REQUEST['selementid'])) { $result = delete_sysmaps_element($_REQUEST['selementid']); show_messages($result, 'Element deleted', 'Cannot delete element'); add_audit_if($result, AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_MAP, 'Name [' . $sysmap['name'] . '] Element [' . $_REQUEST['selementid'] . '] deleteed '); if ($result) { unset($_REQUEST['selementid']); unset($_REQUEST['form']); } } } } } echo SBR; if (isset($_REQUEST['form']) && ($_REQUEST['form'] == 'add_element' || $_REQUEST['form'] == 'update' && isset($_REQUEST['selementid']))) { show_table_header(S_DISPLAYED_ELEMENTS); echo SBR; insert_map_element_form();
if ($link['selementid1'] == $selement['selementid']) { $links[$id]['selementid1'] = $selementid; } else { if ($link['selementid2'] == $selement['selementid']) { $links[$id]['selementid2'] = $selementid; } } } } else { //SDII($selement); $selement['sysmapid'] = $sysmapid; $result = CMap::updateElements($selement); unset($db_selementids[$selement['selementid']]); } } delete_sysmaps_element($db_selementids); $db_linkids = array(); $res = DBselect('SELECT linkid FROM sysmaps_links WHERE sysmapid=' . $sysmapid); while ($db_link = DBfetch($res)) { $db_linkids[$db_link['linkid']] = $db_link['linkid']; } foreach ($links as $id => $link) { $link['sysmapid'] = $sysmapid; if (isset($link['new'])) { $result = add_link($link); } else { $result = update_link($link); unset($db_linkids[$link['linkid']]); } } delete_link($db_linkids);