diff options
author | artem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-06-01 12:02:22 +0000 |
---|---|---|
committer | artem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-06-01 12:02:22 +0000 |
commit | eebf8121ea8f616317d67f04bf577e4c5bdca0d1 (patch) | |
tree | f1ad35fa41d124eea270a1056c0ad8246680a71c /frontends/php/include/import.inc.php | |
parent | 1d0d7ac11023dd1eccac147f9e1b2abf41d95334 (diff) | |
download | zabbix-eebf8121ea8f616317d67f04bf577e4c5bdca0d1.tar.gz zabbix-eebf8121ea8f616317d67f04bf577e4c5bdca0d1.tar.xz zabbix-eebf8121ea8f616317d67f04bf577e4c5bdca0d1.zip |
- added availability to export/import templates for hosts (Artem)
- added permissions for hosts on import (Artem)
git-svn-id: svn://svn.zabbix.com/trunk@4220 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'frontends/php/include/import.inc.php')
-rw-r--r-- | frontends/php/include/import.inc.php | 1412 |
1 files changed, 726 insertions, 686 deletions
diff --git a/frontends/php/include/import.inc.php b/frontends/php/include/import.inc.php index 38e53ac5..6a36a968 100644 --- a/frontends/php/include/import.inc.php +++ b/frontends/php/include/import.inc.php @@ -1,686 +1,726 @@ -<?php -/* -** ZABBIX -** Copyright (C) 2000-2005 SIA Zabbix -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -**/ - require_once "include/defines.inc.php"; - include_once "include/hosts.inc.php"; -?> -<?php - class CZabbixXMLImport - { - function CZabbixXMLImport() - { - global $USER_DETAILS, $ZBX_CURNODEID; - - $this->main_node= null; - $this->sub_node = null; - $this->data = null; - $this->host = array('exist' => 0, 'missed' => 0); - $this->item = array('exist' => 0, 'missed' => 0); - $this->trigger = array('exist' => 0, 'missed' => 0); - $this->graph = array('exist' => 0, 'missed' => 0); - - $this->accessible_groups = get_accessible_groups_by_user($USER_DETAILS, - PERM_READ_WRITE, null, PERM_RES_IDS_ARRAY, $ZBX_CURNODEID); - } - - function CharacterData($parser, $data) - { - $this->element_data .= html_entity_decode($data); - } - - function StartElement($parser, $name, $attrs) - { - $this->element_data = ''; - - if(!isset($this->root)) - { - if($name == XML_TAG_ZABBIX_EXPORT) - if(isset($attrs['version'])) - if($attrs['version'] == '1.0') - { - $this->root = true; - return; - } - else - { - error('Unsupported version of imported data'); - } - error('Unsupported file format'); - $this->root = false; - } - elseif(!$this->root) - { - return false; - } - - global $ZBX_CURNODEID; - - $data = &$this->data[$name]; - - foreach($attrs as $id => $val) - $attrs[$id] = html_entity_decode($val); - - switch($name) - { - case XML_TAG_HOST: - $this->main_node= array($name); - $this->sub_node = null; - $data = $attrs; - $data['groups'] = array(); - $data['skip'] = false; - - if($host_data = DBfetch(DBselect('select hostid from hosts'. - ' where host='.zbx_dbstr($data['name']). - ' and '.DBid2nodeid('hostid').'='.$ZBX_CURNODEID))) - { /* exist */ - if($this->host['exist']==1) /* skip */ - { - $data['skip'] = true; - info('Host ['.$data['name'].'] skipped - user rule'); - break; // case - } - - $data['hostid'] = $host_data['hostid']; - $data['templates'] = get_templates_by_hostid($host_data['hostid']); - } - else - { /* missed */ - if($this->host['missed']==1) /* skip */ - { - $data['skip'] = true; - info('Host ['.$data['name'].'] skipped - user rule'); - break; // case - } - - $data['templates'] = array(); - $data['hostid'] = add_host( - $data['name'], - 10050, - HOST_STATUS_TEMPLATE, - 0, /* useip */ - "", /* dns */ - "", /* ip */ - array(), - null, - array()); - } - break; // case - case XML_TAG_GRAPH: - $data = $attrs; - $data['items'] = array(); - $this->sub_node = null; - array_push($this->main_node, $name); - break; // case - case XML_TAG_ITEM: - case XML_TAG_TRIGGER: - case XML_TAG_GRAPH_ELEMENT: - /*case XML_TAG_SCREEN: - case XML_TAG_SCREEN_ELEMENT:*/ - $data = $attrs; - $this->sub_node = null; - array_push($this->main_node, $name); - break; // case - case XML_TAG_HOSTS: - case XML_TAG_GROUPS: - case XML_TAG_ZABBIX_EXPORT: - case XML_TAG_APPLICATIONS: - case XML_TAG_ITEMS: - case XML_TAG_TRIGGERS: - case XML_TAG_GRAPHS: - /* case XML_TAG_SCREENS:*/ - $this->sub_node = null; - break; // case - case XML_TAG_GROUP: - case XML_TAG_APPLICATION: - default: - $this->sub_node = $name; - break; // case - } - } - - function EndElement($parser, $name) - { - if(!$this->root) - { - return false; - } - - global $USER_DETAILS; - global $ZBX_CURNODEID; - - $data = &$this->data[$name]; - - switch($name) - { - case XML_TAG_HOST: - if($data['skip'] || !$data['hostid']) - break; // case - - if(!isset($data['port'])) $data['port'] = 10050; - if(!isset($data['status'])) $data['status'] = 0; - if(!isset($data['useip'])) $data['useip'] = 0; - if(!isset($data['dns'])) $data['dns'] = ""; - if(!isset($data['ip'])) $data['ip'] = ""; - - if(update_host($data['hostid'], $data['name'], $data['port'], $data['status'], - $data['useip'], $data['dns'], $data['ip'], $data['templates'], null, $data['groups'])) - { - info('Host ['.$data['name'].'] updated'); - } - - break; // case - case XML_TAG_GROUP: - if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) - break; //case - - if(!($group = DBfetch(DBselect('select groupid, name from groups'. - ' where '.DBid2nodeid('groupid').'='.$ZBX_CURNODEID. - ' and name='.zbx_dbstr($this->element_data))))) - { - error('Missed group ['.$this->element_data.']'); - break; // case - } - - if(!in_array($group["groupid"], $this->accessible_groups)) - { - error('Group ['.$this->element_data.'] skipped - Access deny.'); - break; // case - } - - array_push($this->data[XML_TAG_HOST]['groups'], $group["groupid"]); - - break; // case - case XML_TAG_APPLICATION: - if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) - break; //case - - if(!isset($this->data[XML_TAG_ITEM])) - break; //case - - if(!($application = DBfetch(DBselect('select applicationid from applications'. - ' where '.DBid2nodeid('applicationid').'='.$ZBX_CURNODEID. - ' and name='.zbx_dbstr($this->element_data). - ' and hostid='.$this->data[XML_TAG_HOST]['hostid'])))) - { - $applicationid = add_application($this->element_data, $this->data[XML_TAG_HOST]['hostid']); - } - else - { - $applicationid = $application['applicationid']; - } - - $this->data[XML_TAG_ITEM]['applications'][] = $applicationid; - - break; // case - case XML_TAG_ITEM: - if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) - { - if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip']) - { - info('Item ['.$data['description'].'] skipped - user rule for host'); - break; // case - } - - error('Item ['.$data['description'].'] skipped - missed host'); - break; // case - } - - if(!isset($data['description'])) $data['description'] = ""; - if(!isset($data['delay'])) $data['delay'] = 30; - if(!isset($data['history'])) $data['history'] = 90; - if(!isset($data['trends'])) $data['trends'] = 365; - if(!isset($data['status'])) $data['status'] = 0; - if(!isset($data['units'])) $data['units'] = ''; - if(!isset($data['multiplier'])) $data['multiplier'] = 0; - if(!isset($data['delta'])) $data['delta'] = 0; - if(!isset($data['formula'])) $data['formula'] = ''; - if(!isset($data['lastlogsize'])) $data['lastlogsize'] = 0; - if(!isset($data['logtimefmt'])) $data['logtimefmt'] = ''; - if(!isset($data['delay_flex'])) $data['delay_flex'] = ''; - if(!isset($data['trapper_hosts'])) $data['trapper_hosts'] = ''; - if(!isset($data['snmp_community'])) $data['snmp_community'] = ''; - if(!isset($data['snmp_oid'])) $data['snmp_oid'] = ''; - if(!isset($data['snmp_port'])) $data['snmp_port'] = 161; - if(!isset($data['snmpv3_securityname'])) $data['snmpv3_securityname'] = ''; - if(!isset($data['snmpv3_securitylevel'])) $data['snmpv3_securitylevel'] = 0; - if(!isset($data['snmpv3_authpassphrase'])) $data['snmpv3_authpassphrase'] = ''; - if(!isset($data['snmpv3_privpassphrase'])) $data['snmpv3_privpassphrase'] = ''; - if(!isset($data['valuemap'])) $data['valuemap'] = ''; - if(!isset($data['applications'])) $data['applications'] = array(); - - if(!empty($data['valuemap'])) - { - if( $valuemap = DBfetch(DBselect('select valuemapid from valuemaps '. - ' where '.DBid2nodeid('valuemapid').'='.$ZBX_CURNODEID. - ' and name='.zbx_dbstr($data['valuemap']))) ) - { - $data['valuemapid'] = $valuemap['valuemapid']; - } - else - { - $data['valuemapid'] = add_valuemap($data['valuemap'],array()); - } - } - - if($item = DBfetch(DBselect('select itemid,valuemapid,templateid from items'. - ' where key_='.zbx_dbstr($data['key']). - ' and hostid='.$this->data[XML_TAG_HOST]['hostid'].' and '. - DBid2nodeid('itemid').'='.$ZBX_CURNODEID))) - { /* exist */ - if($this->item['exist']==1) /* skip */ - { - info('Item ['.$data['description'].'] skipped - user rule'); - break; - } - - if( !isset($data['valuemapid']) ) - $data['valuemapid'] = $item['valuemapid']; - - update_item( - $item['itemid'], - $data['description'], - $data['key'], - $this->data[XML_TAG_HOST]['hostid'], - $data['delay'], - $data['history'], - $data['status'], - $data['type'], - $data['snmp_community'], - $data['snmp_oid'], - $data['value_type'], - $data['trapper_hosts'], - $data['snmp_port'], - $data['units'], - $data['multiplier'], - $data['delta'], - $data['snmpv3_securityname'], - $data['snmpv3_securitylevel'], - $data['snmpv3_authpassphrase'], - $data['snmpv3_privpassphrase'], - $data['formula'], - $data['trends'], - $data['logtimefmt'], - $data['valuemapid'], - $data['delay_flex'], - array_unique(array_merge( - $data['applications'], - get_applications_by_itemid($item['itemid']) - )), - $item['templateid']); - } - else - { /* missed */ - if($this->item['missed']==1) /* skip */ - { - info('Item ['.$data['description'].'] skipped - user rule'); - break; // case - } - - if( !isset($data['valuemapid']) ) - $data['valuemapid'] = 0; - - add_item( - $data['description'], - $data['key'], - $this->data[XML_TAG_HOST]['hostid'], - $data['delay'], - $data['history'], - $data['status'], - $data['type'], - $data['snmp_community'], - $data['snmp_oid'], - $data['value_type'], - $data['trapper_hosts'], - $data['snmp_port'], - $data['units'], - $data['multiplier'], - $data['delta'], - $data['snmpv3_securityname'], - $data['snmpv3_securitylevel'], - $data['snmpv3_authpassphrase'], - $data['snmpv3_privpassphrase'], - $data['formula'], - $data['trends'], - $data['logtimefmt'], - $data['valuemapid'], - $data['delay_flex'], - $data['applications']); - } - - break; // case - case XML_TAG_TRIGGER: - if(!isset($data['expression'])) $data['expression'] = ''; - if(!isset($data['description'])) $data['description'] = ''; - if(!isset($data['priority'])) $data['priority'] = 0; - if(!isset($data['status'])) $data['status'] = 0; - if(!isset($data['comments'])) $data['comments'] = ''; - if(!isset($data['url'])) $data['url'] = ''; - - if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) - { - if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip']) - { - info('Trigger ['.$data['description'].'] skipped - user rule for host'); - break; // case - } - if(strstr($data['expression'],'{HOSTNAME}')) - { - error('Trigger ['.$data['description'].'] skipped - missed host'); - break; // case - } - } - else - { - $data['expression'] = str_replace('{HOSTNAME}', - $this->data[XML_TAG_HOST]['name'], - $data['expression']); - - if($trigger = DBfetch(DBselect('select distinct t.triggerid,t.templateid '. - ' from triggers t,functions f,items i '. - ' where t.triggerid=f.triggerid and f.itemid=i.itemid'. - ' and i.hostid='.$this->data[XML_TAG_HOST]['hostid']. - ' and t.description='.zbx_dbstr($data['description'])))) - { /* exist */ - if($this->trigger['exist']==1) /* skip */ - { - info('Trigger ['.$data['description'].'] skipped - user rule'); - break; // case - } - - update_trigger( - $trigger['triggerid'], - $data['expression'], - $data['description'], - $data['priority'], - $data['status'], - $data['comments'], - $data['url'], - get_trigger_dependences_by_triggerid($trigger['triggerid']), - $trigger['templateid']); - - break; // case - } - else /* missed */ - { - // continue [add_trigger] - } - } - - if($this->trigger['missed']==1) /* skip */ - { - info('Trigger ['.$data['description'].'] skipped - user rule'); - break; // case - } - - add_trigger( - $data['expression'], - $data['description'], - $data['priority'], - $data['status'], - $data['comments'], - $data['url']); - - break; // case - case XML_TAG_GRAPH: - if(isset($data['error'])) - { - error('Graph ['.$data['name'].'] skipped - error occured'); - break; // case - } - - if(!isset($data['yaxistype'])) $data['yaxistype'] = 0; - if(!isset($data['show_work_period'])) $data['show_work_period'] = 1; - if(!isset($data['show_triggers'])) $data['show_triggers'] = 1; - if(!isset($data['graphtype'])) $data['graphtype'] = 0; - if(!isset($data['yaxismin'])) $data['yaxismin'] = 0; - if(!isset($data['yaxismax'])) $data['yaxismax'] = 0; - if(!isset($data['items'])) $data['items'] = array(); - - if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) - { - if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip']) - { - info('Graph ['.$data['name'].'] skipped - user rule for host'); - break; // case - } - foreach($data['items'] as $id) - - if(strstr($data['name'],'{HOSTNAME}')) - { - error('Graph ['.$data['name'].'] skipped - missed host'); - break; // case - } - } - else - { - if($graph = DBfetch(DBselect('select distinct g.graphid, g.templateid'. - ' from graphs g, graphs_items gi, items i'. - ' where g.graphid=gi.graphid and gi.itemid=i.itemid'. - ' and g.name='.zbx_dbstr($data['name']). - ' and i.hostid='.$this->data[XML_TAG_HOST]['hostid']))) - { /* exist */ - if($this->graph['exist']==1) /* skip */ - { - info('Graph ['.$data['name'].'] skipped - user rule'); - break; // case - } - - $data['graphid'] = $graph['graphid']; - - update_graph( - $data['graphid'], - $data['name'], - $data['width'], - $data['height'], - $data['yaxistype'], - $data['yaxismin'], - $data['yaxismax'], - $data['show_work_period'], - $data['show_triggers'], - $data['graphtype'], - $graph['templateid']); - - DBexecute('delete from graphs_items where graphid='.$data['graphid']); - } - else - { /* missed */ - // continue [add_group] - } - } - - if(!isset($data['graphid'])) - { - if($this->graph['missed']==1) /* skip */ - { - info('Graph ['.$data['name'].'] skipped - user rule'); - break; // case - } - - $data['graphid'] = add_graph( - $data['name'], - $data['width'], - $data['height'], - $data['yaxistype'], - $data['yaxismin'], - $data['yaxismax'], - $data['show_work_period'], - $data['show_triggers'], - $data['graphtype']); - } - - foreach($data['items'] as $item) - { - add_item_to_graph( - $data['graphid'], - $item['itemid'], - $item['color'], - $item['drawtype'], - $item['sortorder'], - $item['yaxisside'], - $item['calc_fnc'], - $item['type'], - $item['periods_cnt']); - } - break; // case - case XML_TAG_GRAPH_ELEMENT: - if(!isset($this->data[XML_TAG_GRAPH])) - break; // case - - $data['key'] = explode(':', $data['item']); - if(count($data['key']) < 2) - { - $this->data[XML_TAG_GRAPH]['error'] = true; - error('Incorrect element for graph ['.$data['name'].']'); - break; // case - } - - $data['host'] = array_shift($data['key']); - $data['key'] = implode(':', $data['key']); - - if(isset($this->data[XML_TAG_HOST]['name'])) - { - $data['host'] = str_replace('{HOSTNAME}',$this->data[XML_TAG_HOST]['name'],$data['host']); - } - - if(!isset($data['drawtype'])) $data['drawtype'] = 0; - if(!isset($data['sortorder'])) $data['sortorder'] = 0; - if(!isset($data['color'])) $data['color'] = 'Dark Green'; - if(!isset($data['yaxisside'])) $data['yaxisside'] = 1; - if(!isset($data['calc_fnc'])) $data['calc_fnc'] = 2; - if(!isset($data['type'])) $data['type'] = 0; - if(!isset($data['periods_cnt'])) $data['periods_cnt'] = 5; - - if(!($item = DBfetch(DBselect('select i.itemid from items i,hosts h'. - ' where h.hostid=i.hostid and i.key_='.zbx_dbstr($data['key']). - ' and h.host='.zbx_dbstr($data['host']))))) - { - $this->data[XML_TAG_GRAPH]['error'] = true; - - error('Missed item ['.$data['key'].'] for host ['.$data['host'].']'); - break; // case - } - - $data['itemid'] = $item['itemid']; - - array_push($this->data[XML_TAG_GRAPH]['items'], $data); - - break; // case - /*case XML_TAG_SCREEN: - case XML_TAG_SCREEN_ELEMENT: - break; // case*/ - default: - if(isset($this->sub_node) && isset($this->main_node)) - { - $main_node = array_pop($this->main_node); - $this->data[$main_node][$this->sub_node] = $this->element_data; - array_push($this->main_node, $main_node); - } - $this->sub_node = null; - return; - } - - unset($this->data[$name], $data); - - array_pop($this->main_node); - } - - function Parse($file) - { - $this->main_node = null; - $this->sub_node = null; - $this->data = null; - - $xml_parser = xml_parser_create(); - - xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false); - - xml_set_element_handler($xml_parser, array(&$this, "StartElement"), array(&$this, "EndElement")); - - xml_set_character_data_handler($xml_parser, array(&$this, "characterData")); - - if (!($fp = fopen($file, "r"))) - { - error("could not open XML input"); - xml_parser_free($xml_parser); - return false; - } - else - { - while ($data = fread($fp, 4096)) - { - if (!xml_parse($xml_parser, $data, feof($fp))) - { - error( sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($xml_parser)), - xml_get_current_line_number($xml_parser)) - ); - fclose($fp); - xml_parser_free($xml_parser); - return false; - } - } - fclose($fp); - } - xml_parser_free($xml_parser); - - $this->main_node = null; - $this->sub_node = null; - $this->data = null; - - return true; - } - - function SetRules($host, $item, $trigger, $graph) - { - $this->host = $host; - $this->item = $item; - $this->trigger = $trigger; - $this->graph = $graph; - } - } - - class CZabbixHostImport - { - function CZabbixHostImport() - { - } - - function Parse($file) - { - if (!($fp = fopen($file, "r"))) - { - error("could not open XML input"); - xml_parser_free($xml_parser); - return false; - } - else - { - while(!feof($fp)) - { - $len = fgets($fp); - echo $len.'<br/>'."\n"; - } - fclose($fp); - } - - info('Underconstructor!'); - return true; - } - } -?> +<?php
+/*
+** ZABBIX
+** Copyright (C) 2000-2005 SIA Zabbix
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**/
+ require_once "include/defines.inc.php";
+ include_once "include/hosts.inc.php";
+?>
+<?php
+ class CZabbixXMLImport
+ {
+ function CZabbixXMLImport()
+ {
+ global $USER_DETAILS, $ZBX_CURNODEID;
+
+ $this->main_node= null;
+ $this->sub_node = null;
+ $this->data = null;
+ $this->host = array('exist' => 0, 'missed' => 0);
+ $this->template = array('exist' => 0, 'missed' => 0);
+ $this->item = array('exist' => 0, 'missed' => 0);
+ $this->trigger = array('exist' => 0, 'missed' => 0);
+ $this->graph = array('exist' => 0, 'missed' => 0);
+
+ $this->accessible_groups = get_accessible_groups_by_user($USER_DETAILS,
+ PERM_READ_WRITE, null, PERM_RES_IDS_ARRAY, $ZBX_CURNODEID);
+
+ $this->accessible_hosts = get_accessible_hosts_by_user($USER_DETAILS,
+ PERM_READ_WRITE, null, PERM_RES_IDS_ARRAY, $ZBX_CURNODEID);
+
+ $this->accessible_nodes = get_accessible_nodes_by_user($USER_DETAILS,
+ PERM_READ_WRITE, null, PERM_RES_IDS_ARRAY, $ZBX_CURNODEID);
+ }
+
+ function CharacterData($parser, $data)
+ {
+ $this->element_data .= html_entity_decode($data);
+ }
+
+ function StartElement($parser, $name, $attrs)
+ {
+ $this->element_data = '';
+
+ if(!isset($this->root))
+ {
+ if($name == XML_TAG_ZABBIX_EXPORT)
+ if(isset($attrs['version']))
+ if($attrs['version'] == '1.0')
+ {
+ $this->root = true;
+ return;
+ }
+ else
+ {
+ error(S_UNSUPPORTED_VERSION_OF_IMPORTED_DATA);
+ }
+ error(S_UNSUPPORTED_FILE_FORMAT);
+ $this->root = false;
+ }
+ elseif(!$this->root)
+ {
+ return false;
+ }
+
+ global $ZBX_CURNODEID;
+
+ $data = &$this->data[$name];
+
+ foreach($attrs as $id => $val)
+ $attrs[$id] = html_entity_decode($val);
+
+ switch($name)
+ {
+ case XML_TAG_HOST:
+ $this->main_node= array($name);
+ $this->sub_node = null;
+ $data = $attrs;
+ $data['groups'] = array();
+ $data['skip'] = false;
+
+ if($host_data = DBfetch(DBselect('select hostid from hosts'.
+ ' where host='.zbx_dbstr($data['name']).
+ ' and '.DBid2nodeid('hostid').'='.$ZBX_CURNODEID)))
+ { /* exist */
+ if($this->host['exist']==1) /* skip */
+ {
+ $data['skip'] = true;
+ info('Host ['.$data['name'].'] skipped - user rule');
+ break; // case
+ }
+ if(!in_array($host_data['hostid'], $this->accessible_hosts)){
+ error('Host ['.$data['name'].'] skipped - Access deny.');
+ break; // case
+ }
+
+ $data['hostid'] = $host_data['hostid'];
+ $data['templates'] = get_templates_by_hostid($host_data['hostid']);
+ }
+ else
+ { /* missed */
+ if($this->host['missed']==1) /* skip */
+ {
+ $data['skip'] = true;
+ info('Host ['.$data['name'].'] skipped - user rule');
+ break; // case
+ }
+
+ if(!in_array($ZBX_CURNODEID, $this->accessible_nodes)){
+ error('Host ['.$data['name'].'] skipped - Access deny.');
+ break; // case
+ }
+
+ $data['templates'] = array();
+ $data['hostid'] = add_host(
+ $data['name'],
+ 10050,
+ HOST_STATUS_TEMPLATE,
+ 0, /* useip */
+ "", /* dns */
+ "", /* ip */
+ array(),
+ null,
+ array());
+ }
+ break; // case
+ case XML_TAG_GRAPH:
+ $data = $attrs;
+ $data['items'] = array();
+ $this->sub_node = null;
+ array_push($this->main_node, $name);
+ break; // case
+ case XML_TAG_TEMPLATE:
+ case XML_TAG_ITEM:
+ case XML_TAG_TRIGGER:
+ case XML_TAG_GRAPH_ELEMENT:
+ /*case XML_TAG_SCREEN:
+ case XML_TAG_SCREEN_ELEMENT:*/
+ $data = $attrs;
+ $this->sub_node = null;
+ array_push($this->main_node, $name);
+ break; // case
+ case XML_TAG_HOSTS:
+ case XML_TAG_GROUPS:
+ case XML_TAG_ZABBIX_EXPORT:
+ case XML_TAG_APPLICATIONS:
+ case XML_TAG_TEMPLATES:
+ case XML_TAG_ITEMS:
+ case XML_TAG_TRIGGERS:
+ case XML_TAG_GRAPHS:
+ /* case XML_TAG_SCREENS:*/
+ $this->sub_node = null;
+ break; // case
+ case XML_TAG_GROUP:
+ case XML_TAG_APPLICATION:
+ default:
+ $this->sub_node = $name;
+ break; // case
+ }
+ }
+
+ function EndElement($parser, $name)
+ {
+ if(!$this->root)
+ {
+ return false;
+ }
+
+ global $USER_DETAILS;
+ global $ZBX_CURNODEID;
+
+ $data = &$this->data[$name];
+
+ switch($name)
+ {
+ case XML_TAG_HOST:
+ if($data['skip'] || !isset($data['hostid']) || !$data['hostid'])
+ break; // case
+
+ if(!isset($data['port'])) $data['port'] = 10050;
+ if(!isset($data['status'])) $data['status'] = 0;
+ if(!isset($data['useip'])) $data['useip'] = 0;
+ if(!isset($data['dns'])) $data['dns'] = "";
+ if(!isset($data['ip'])) $data['ip'] = "";
+
+ if(update_host($data['hostid'], $data['name'], $data['port'], $data['status'],
+ $data['useip'], $data['dns'], $data['ip'], $data['templates'], null, $data['groups']))
+ {
+ info('Host ['.$data['name'].'] updated');
+ }
+
+ break; // case
+ case XML_TAG_GROUP:
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ break; //case
+
+ if(!($group = DBfetch(DBselect('select groupid, name from groups'.
+ ' where '.DBid2nodeid('groupid').'='.$ZBX_CURNODEID.
+ ' and name='.zbx_dbstr($this->element_data)))))
+ {
+ error('Missed group ['.$this->element_data.']');
+ break; // case
+ }
+
+ if(!in_array($group["groupid"], $this->accessible_groups))
+ {
+ error('Group ['.$this->element_data.'] skipped - Access deny.');
+ break; // case
+ }
+
+ array_push($this->data[XML_TAG_HOST]['groups'], $group["groupid"]);
+
+ break; // case
+ case XML_TAG_APPLICATION:
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ break; //case
+
+ if(!isset($this->data[XML_TAG_ITEM]))
+ break; //case
+
+ if(!($application = DBfetch(DBselect('select applicationid from applications'.
+ ' where '.DBid2nodeid('applicationid').'='.$ZBX_CURNODEID.
+ ' and name='.zbx_dbstr($this->element_data).
+ ' and hostid='.$this->data[XML_TAG_HOST]['hostid']))))
+ {
+ $applicationid = add_application($this->element_data, $this->data[XML_TAG_HOST]['hostid']);
+ }
+ else
+ {
+ $applicationid = $application['applicationid'];
+ }
+
+ $this->data[XML_TAG_ITEM]['applications'][] = $applicationid;
+
+ break; // case
+ case XML_TAG_TEMPLATE:
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ break; //case
+
+ if(!($template = DBfetch(DBselect('SELECT DISTINCT host, hostid '.
+ ' FROM hosts'.
+ ' WHERE '.DBid2nodeid('hostid').'='.$ZBX_CURNODEID.
+ ' AND host='.zbx_dbstr($this->element_data)))))
+ {
+ error('Missed template ['.$this->element_data.']');
+ break; // case
+ }
+
+ if(!in_array($template["hostid"], $this->accessible_hosts))
+ {
+ error('Template ['.$this->element_data.'] skipped - Access deny.');
+ break; // case
+ }
+
+ $this->data[XML_TAG_HOST]['templates'][$template["hostid"]] = $template['host'];
+ break; // case
+ case XML_TAG_ITEM:
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ {
+ if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip'])
+ {
+ info('Item ['.$data['description'].'] skipped - user rule for host');
+ break; // case
+ }
+
+ error('Item ['.$data['description'].'] skipped - missed host');
+ break; // case
+ }
+
+ if(!isset($data['description'])) $data['description'] = "";
+ if(!isset($data['delay'])) $data['delay'] = 30;
+ if(!isset($data['history'])) $data['history'] = 90;
+ if(!isset($data['trends'])) $data['trends'] = 365;
+ if(!isset($data['status'])) $data['status'] = 0;
+ if(!isset($data['units'])) $data['units'] = '';
+ if(!isset($data['multiplier'])) $data['multiplier'] = 0;
+ if(!isset($data['delta'])) $data['delta'] = 0;
+ if(!isset($data['formula'])) $data['formula'] = '';
+ if(!isset($data['lastlogsize'])) $data['lastlogsize'] = 0;
+ if(!isset($data['logtimefmt'])) $data['logtimefmt'] = '';
+ if(!isset($data['delay_flex'])) $data['delay_flex'] = '';
+ if(!isset($data['trapper_hosts'])) $data['trapper_hosts'] = '';
+ if(!isset($data['snmp_community'])) $data['snmp_community'] = '';
+ if(!isset($data['snmp_oid'])) $data['snmp_oid'] = '';
+ if(!isset($data['snmp_port'])) $data['snmp_port'] = 161;
+ if(!isset($data['snmpv3_securityname'])) $data['snmpv3_securityname'] = '';
+ if(!isset($data['snmpv3_securitylevel'])) $data['snmpv3_securitylevel'] = 0;
+ if(!isset($data['snmpv3_authpassphrase'])) $data['snmpv3_authpassphrase'] = '';
+ if(!isset($data['snmpv3_privpassphrase'])) $data['snmpv3_privpassphrase'] = '';
+ if(!isset($data['valuemap'])) $data['valuemap'] = '';
+ if(!isset($data['applications'])) $data['applications'] = array();
+
+ if(!empty($data['valuemap']))
+ {
+ if( $valuemap = DBfetch(DBselect('select valuemapid from valuemaps '.
+ ' where '.DBid2nodeid('valuemapid').'='.$ZBX_CURNODEID.
+ ' and name='.zbx_dbstr($data['valuemap']))) )
+ {
+ $data['valuemapid'] = $valuemap['valuemapid'];
+ }
+ else
+ {
+ $data['valuemapid'] = add_valuemap($data['valuemap'],array());
+ }
+ }
+
+ if($item = DBfetch(DBselect('select itemid,valuemapid,templateid from items'.
+ ' where key_='.zbx_dbstr($data['key']).
+ ' and hostid='.$this->data[XML_TAG_HOST]['hostid'].' and '.
+ DBid2nodeid('itemid').'='.$ZBX_CURNODEID)))
+ { /* exist */
+ if($this->item['exist']==1) /* skip */
+ {
+ info('Item ['.$data['description'].'] skipped - user rule');
+ break;
+ }
+
+ if( !isset($data['valuemapid']) )
+ $data['valuemapid'] = $item['valuemapid'];
+
+ update_item(
+ $item['itemid'],
+ $data['description'],
+ $data['key'],
+ $this->data[XML_TAG_HOST]['hostid'],
+ $data['delay'],
+ $data['history'],
+ $data['status'],
+ $data['type'],
+ $data['snmp_community'],
+ $data['snmp_oid'],
+ $data['value_type'],
+ $data['trapper_hosts'],
+ $data['snmp_port'],
+ $data['units'],
+ $data['multiplier'],
+ $data['delta'],
+ $data['snmpv3_securityname'],
+ $data['snmpv3_securitylevel'],
+ $data['snmpv3_authpassphrase'],
+ $data['snmpv3_privpassphrase'],
+ $data['formula'],
+ $data['trends'],
+ $data['logtimefmt'],
+ $data['valuemapid'],
+ $data['delay_flex'],
+ array_unique(array_merge(
+ $data['applications'],
+ get_applications_by_itemid($item['itemid'])
+ )),
+ $item['templateid']);
+ }
+ else
+ { /* missed */
+ if($this->item['missed']==1) /* skip */
+ {
+ info('Item ['.$data['description'].'] skipped - user rule');
+ break; // case
+ }
+
+ if( !isset($data['valuemapid']) )
+ $data['valuemapid'] = 0;
+
+ add_item(
+ $data['description'],
+ $data['key'],
+ $this->data[XML_TAG_HOST]['hostid'],
+ $data['delay'],
+ $data['history'],
+ $data['status'],
+ $data['type'],
+ $data['snmp_community'],
+ $data['snmp_oid'],
+ $data['value_type'],
+ $data['trapper_hosts'],
+ $data['snmp_port'],
+ $data['units'],
+ $data['multiplier'],
+ $data['delta'],
+ $data['snmpv3_securityname'],
+ $data['snmpv3_securitylevel'],
+ $data['snmpv3_authpassphrase'],
+ $data['snmpv3_privpassphrase'],
+ $data['formula'],
+ $data['trends'],
+ $data['logtimefmt'],
+ $data['valuemapid'],
+ $data['delay_flex'],
+ $data['applications']);
+ }
+
+ break; // case
+ case XML_TAG_TRIGGER:
+ if(!isset($data['expression'])) $data['expression'] = '';
+ if(!isset($data['description'])) $data['description'] = '';
+ if(!isset($data['priority'])) $data['priority'] = 0;
+ if(!isset($data['status'])) $data['status'] = 0;
+ if(!isset($data['comments'])) $data['comments'] = '';
+ if(!isset($data['url'])) $data['url'] = '';
+
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ {
+ if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip'])
+ {
+ info('Trigger ['.$data['description'].'] skipped - user rule for host');
+ break; // case
+ }
+ if(strstr($data['expression'],'{HOSTNAME}'))
+ {
+ error('Trigger ['.$data['description'].'] skipped - missed host');
+ break; // case
+ }
+ }
+ else
+ {
+ $data['expression'] = str_replace('{HOSTNAME}',
+ $this->data[XML_TAG_HOST]['name'],
+ $data['expression']);
+
+ if($trigger = DBfetch(DBselect('select distinct t.triggerid,t.templateid '.
+ ' from triggers t,functions f,items i '.
+ ' where t.triggerid=f.triggerid and f.itemid=i.itemid'.
+ ' and i.hostid='.$this->data[XML_TAG_HOST]['hostid'].
+ ' and t.description='.zbx_dbstr($data['description']))))
+ { /* exist */
+ if($this->trigger['exist']==1) /* skip */
+ {
+ info('Trigger ['.$data['description'].'] skipped - user rule');
+ break; // case
+ }
+
+ update_trigger(
+ $trigger['triggerid'],
+ $data['expression'],
+ $data['description'],
+ $data['priority'],
+ $data['status'],
+ $data['comments'],
+ $data['url'],
+ get_trigger_dependences_by_triggerid($trigger['triggerid']),
+ $trigger['templateid']);
+
+ break; // case
+ }
+ else /* missed */
+ {
+ // continue [add_trigger]
+ }
+ }
+
+ if($this->trigger['missed']==1) /* skip */
+ {
+ info('Trigger ['.$data['description'].'] skipped - user rule');
+ break; // case
+ }
+
+ add_trigger(
+ $data['expression'],
+ $data['description'],
+ $data['priority'],
+ $data['status'],
+ $data['comments'],
+ $data['url']);
+
+ break; // case
+ case XML_TAG_GRAPH:
+ if(isset($data['error']))
+ {
+ error('Graph ['.$data['name'].'] skipped - error occured');
+ break; // case
+ }
+
+ if(!isset($data['yaxistype'])) $data['yaxistype'] = 0;
+ if(!isset($data['show_work_period'])) $data['show_work_period'] = 1;
+ if(!isset($data['show_triggers'])) $data['show_triggers'] = 1;
+ if(!isset($data['graphtype'])) $data['graphtype'] = 0;
+ if(!isset($data['yaxismin'])) $data['yaxismin'] = 0;
+ if(!isset($data['yaxismax'])) $data['yaxismax'] = 0;
+ if(!isset($data['items'])) $data['items'] = array();
+
+ if(!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid'])
+ {
+ if(isset($this->data[XML_TAG_HOST]['skip']) && $this->data[XML_TAG_HOST]['skip'])
+ {
+ info('Graph ['.$data['name'].'] skipped - user rule for host');
+ break; // case
+ }
+ foreach($data['items'] as $id)
+
+ if(strstr($data['name'],'{HOSTNAME}'))
+ {
+ error('Graph ['.$data['name'].'] skipped - missed host');
+ break; // case
+ }
+ }
+ else
+ {
+ if($graph = DBfetch(DBselect('select distinct g.graphid, g.templateid'.
+ ' from graphs g, graphs_items gi, items i'.
+ ' where g.graphid=gi.graphid and gi.itemid=i.itemid'.
+ ' and g.name='.zbx_dbstr($data['name']).
+ ' and i.hostid='.$this->data[XML_TAG_HOST]['hostid'])))
+ { /* exist */
+ if($this->graph['exist']==1) /* skip */
+ {
+ info('Graph ['.$data['name'].'] skipped - user rule');
+ break; // case
+ }
+
+ $data['graphid'] = $graph['graphid'];
+
+ update_graph(
+ $data['graphid'],
+ $data['name'],
+ $data['width'],
+ $data['height'],
+ $data['yaxistype'],
+ $data['yaxismin'],
+ $data['yaxismax'],
+ $data['show_work_period'],
+ $data['show_triggers'],
+ $data['graphtype'],
+ $graph['templateid']);
+
+ DBexecute('delete from graphs_items where graphid='.$data['graphid']);
+ }
+ else
+ { /* missed */
+ // continue [add_group]
+ }
+ }
+
+ if(!isset($data['graphid']))
+ {
+ if($this->graph['missed']==1) /* skip */
+ {
+ info('Graph ['.$data['name'].'] skipped - user rule');
+ break; // case
+ }
+
+ $data['graphid'] = add_graph(
+ $data['name'],
+ $data['width'],
+ $data['height'],
+ $data['yaxistype'],
+ $data['yaxismin'],
+ $data['yaxismax'],
+ $data['show_work_period'],
+ $data['show_triggers'],
+ $data['graphtype']);
+ }
+
+ foreach($data['items'] as $item)
+ {
+ add_item_to_graph(
+ $data['graphid'],
+ $item['itemid'],
+ $item['color'],
+ $item['drawtype'],
+ $item['sortorder'],
+ $item['yaxisside'],
+ $item['calc_fnc'],
+ $item['type'],
+ $item['periods_cnt']);
+ }
+ break; // case
+ case XML_TAG_GRAPH_ELEMENT:
+ if(!isset($this->data[XML_TAG_GRAPH]))
+ break; // case
+
+ $data['key'] = explode(':', $data['item']);
+ if(count($data['key']) < 2)
+ {
+ $this->data[XML_TAG_GRAPH]['error'] = true;
+ error('Incorrect element for graph ['.$data['name'].']');
+ break; // case
+ }
+
+ $data['host'] = array_shift($data['key']);
+ $data['key'] = implode(':', $data['key']);
+
+ if(isset($this->data[XML_TAG_HOST]['name']))
+ {
+ $data['host'] = str_replace('{HOSTNAME}',$this->data[XML_TAG_HOST]['name'],$data['host']);
+ }
+
+ if(!isset($data['drawtype'])) $data['drawtype'] = 0;
+ if(!isset($data['sortorder'])) $data['sortorder'] = 0;
+ if(!isset($data['color'])) $data['color'] = 'Dark Green';
+ if(!isset($data['yaxisside'])) $data['yaxisside'] = 1;
+ if(!isset($data['calc_fnc'])) $data['calc_fnc'] = 2;
+ if(!isset($data['type'])) $data['type'] = 0;
+ if(!isset($data['periods_cnt'])) $data['periods_cnt'] = 5;
+
+ if(!($item = DBfetch(DBselect('select i.itemid from items i,hosts h'.
+ ' where h.hostid=i.hostid and i.key_='.zbx_dbstr($data['key']).
+ ' and h.host='.zbx_dbstr($data['host'])))))
+ {
+ $this->data[XML_TAG_GRAPH]['error'] = true;
+
+ error('Missed item ['.$data['key'].'] for host ['.$data['host'].']');
+ break; // case
+ }
+
+ $data['itemid'] = $item['itemid'];
+
+ array_push($this->data[XML_TAG_GRAPH]['items'], $data);
+
+ break; // case
+ /*case XML_TAG_SCREEN:
+ case XML_TAG_SCREEN_ELEMENT:
+ break; // case*/
+ default:
+ if(isset($this->sub_node) && isset($this->main_node))
+ {
+ $main_node = array_pop($this->main_node);
+ $this->data[$main_node][$this->sub_node] = $this->element_data;
+ array_push($this->main_node, $main_node);
+ }
+ $this->sub_node = null;
+ return;
+ }
+
+ unset($this->data[$name], $data);
+
+ array_pop($this->main_node);
+ }
+
+ function Parse($file)
+ {
+ $this->main_node = null;
+ $this->sub_node = null;
+ $this->data = null;
+
+ $xml_parser = xml_parser_create();
+
+ xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
+
+ xml_set_element_handler($xml_parser, array(&$this, "StartElement"), array(&$this, "EndElement"));
+
+ xml_set_character_data_handler($xml_parser, array(&$this, "characterData"));
+
+ if (!($fp = fopen($file, "r")))
+ {
+ error("could not open XML input");
+ xml_parser_free($xml_parser);
+ return false;
+ }
+ else
+ {
+ while ($data = fread($fp, 4096))
+ {
+ if (!xml_parse($xml_parser, $data, feof($fp)))
+ {
+ error( sprintf("XML error: %s at line %d",
+ xml_error_string(xml_get_error_code($xml_parser)),
+ xml_get_current_line_number($xml_parser))
+ );
+ fclose($fp);
+ xml_parser_free($xml_parser);
+ return false;
+ }
+ }
+ fclose($fp);
+ }
+ xml_parser_free($xml_parser);
+
+ $this->main_node = null;
+ $this->sub_node = null;
+ $this->data = null;
+
+ return true;
+ }
+
+ function SetRules($host, $template, $item, $trigger, $graph)
+ {
+ $this->host = $host;
+ $this->template = $template;
+ $this->item = $item;
+ $this->trigger = $trigger;
+ $this->graph = $graph;
+ }
+ }
+
+ class CZabbixHostImport
+ {
+ function CZabbixHostImport()
+ {
+ }
+
+ function Parse($file)
+ {
+ if (!($fp = fopen($file, "r")))
+ {
+ error("could not open XML input");
+ xml_parser_free($xml_parser);
+ return false;
+ }
+ else
+ {
+ while(!feof($fp))
+ {
+ $len = fgets($fp);
+ echo $len.'<br/>'."\n";
+ }
+ fclose($fp);
+ }
+
+ info('Underconstructor!');
+ return true;
+ }
+ }
+?>
|