Пример #1
0
 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;
 }