public static function parseScreen($rules) { try { self::validate(dirname(__FILE__) . '/xmlschemas/screens.rng'); $importScreens = self::XMLtoArray(self::$xml); $importScreens = $importScreens['zabbix_export']['screens']; $result = true; $screens = array(); foreach ($importScreens as $mnum => &$screen) { unset($screen['screenid']); $exists = CScreen::exists(array('name' => $screen['name'])); if ($exists && isset($rules['screens']['exist'])) { $db_screens = CScreen::getObjects(array('name' => $screen['name'])); if (empty($db_screens)) { throw new Exception(S_NO_PERMISSIONS_FOR_SCREEN . ' "' . $screen['name'] . '" import'); } $db_screen = reset($db_screens); $screen['screenid'] = $db_screen['screenid']; } else { if ($exists || !isset($rules['screens']['missed'])) { info('Screen [' . $screen['name'] . '] skipped - user rule'); unset($importScreens[$mnum]); continue; // break if not update exist } } if (!isset($screen['screenitems'])) { $screen['screenitems'] = array(); } foreach ($screen['screenitems'] as $snum => &$screenitem) { $nodeCaption = isset($screenitem['resourceid']['node']) ? $screenitem['resourceid']['node'] . ':' : ''; if (!isset($screenitem['resourceid'])) { $screenitem['resourceid'] = 0; } if (is_array($screenitem['resourceid'])) { switch ($screenitem['resourcetype']) { case SCREEN_RESOURCE_HOSTS_INFO: case SCREEN_RESOURCE_TRIGGERS_INFO: case SCREEN_RESOURCE_TRIGGERS_OVERVIEW: case SCREEN_RESOURCE_DATA_OVERVIEW: case SCREEN_RESOURCE_HOSTGROUP_TRIGGERS: if (is_array($screenitem['resourceid'])) { $db_hostgroups = CHostgroup::getObjects($screenitem['resourceid']); if (empty($db_hostgroups)) { $error = S_CANNOT_FIND_HOSTGROUP . ' "' . $nodeCaption . $screenitem['resourceid']['name'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_hostgroups); $screenitem['resourceid'] = $tmp['groupid']; } break; case SCREEN_RESOURCE_HOST_TRIGGERS: $db_hosts = CHost::getObjects($screenitem['resourceid']); if (empty($db_hosts)) { $error = S_CANNOT_FIND_HOST . ' "' . $nodeCaption . $screenitem['resourceid']['host'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_hosts); $screenitem['resourceid'] = $tmp['hostid']; break; case SCREEN_RESOURCE_GRAPH: $db_graphs = CGraph::getObjects($screenitem['resourceid']); if (empty($db_graphs)) { $error = S_CANNOT_FIND_GRAPH . ' "' . $nodeCaption . $screenitem['resourceid']['host'] . ':' . $screenitem['resourceid']['name'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_graphs); $screenitem['resourceid'] = $tmp['graphid']; break; case SCREEN_RESOURCE_SIMPLE_GRAPH: case SCREEN_RESOURCE_PLAIN_TEXT: $db_items = CItem::getObjects($screenitem['resourceid']); if (empty($db_items)) { $error = S_CANNOT_FIND_ITEM . ' "' . $nodeCaption . $screenitem['resourceid']['host'] . ':' . $screenitem['resourceid']['key_'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_items); $screenitem['resourceid'] = $tmp['itemid']; break; case SCREEN_RESOURCE_MAP: $db_sysmaps = CMap::getObjects($screenitem['resourceid']); if (empty($db_sysmaps)) { $error = S_CANNOT_FIND_MAP . ' "' . $nodeCaption . $screenitem['resourceid']['name'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_sysmaps); $screenitem['resourceid'] = $tmp['sysmapid']; break; case SCREEN_RESOURCE_SCREEN: $db_screens = CScreen::getObjects($screenitem['resourceid']); if (empty($db_screens)) { $error = S_CANNOT_FIND_SCREEN . ' "' . $nodeCaption . $screenitem['resourceid']['name'] . '" ' . S_USED_IN_EXPORTED_SCREEN_SMALL . ' "' . $screen['name'] . '"'; throw new Exception($error); } $tmp = reset($db_screens); $screenitem['resourceid'] = $tmp['screenid']; break; default: $screenitem['resourceid'] = 0; break; } } } unset($screenitem); $screens[] = $screen; } unset($screen); $importScreens = $screens; foreach ($importScreens as $mnum => $screen) { if (isset($screen['screenid'])) { $result = CScreen::update($screen); } else { $result = CScreen::create($screen); } if (isset($screen['screenid'])) { info(S_SCREEN . ' [' . $screen['name'] . '] ' . S_UPDATED_SMALL); } else { info(S_SCREEN . ' [' . $screen['name'] . '] ' . S_ADDED_SMALL); } } } catch (Exception $e) { error($e->getMessage()); return false; } return $result; }