Esempio n. 1
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;
     }
 }