function EndElement($parser, $name) { if (!$this->root) { return false; } global $USER_DETAILS; $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 (!isset($data['proxy'])) { $data['proxy'] = ''; } if (!zbx_empty($data['proxy'])) { $sql = 'SELECT hostid ' . ' FROM hosts ' . ' WHERE host=' . zbx_dbstr($data['proxy']) . ' AND status=' . HOST_STATUS_PROXY . ' AND ' . DBin_node('hostid', get_current_nodeid(false)); if ($host_data = DBfetch(DBselect($sql))) { $data['proxy'] = $host_data['hostid']; } else { $data['proxy'] = 0; } } else { $data['proxy'] = 0; } if (update_host($data['hostid'], $data['name'], $data['port'], $data['status'], $data['useip'], $data['dns'], $data['ip'], $data['proxy'], $data['templates'], 'no', '', 623, -1, 2, '', '', null, $data['groups'])) { info('Host [' . $data['name'] . '] updated'); } break; // case // based on mod by scricca // case // based on mod by scricca case XML_TAG_HOSTPROFILE: if (!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) { break; } //case if (!isset($data['devicetype'])) { $data['devicetype'] = ''; } if (!isset($data['name'])) { $data['name'] = ''; } if (!isset($data['os'])) { $data['os'] = ''; } if (!isset($data['serialno'])) { $data['serialno'] = ''; } if (!isset($data['tag'])) { $data['tag'] = ''; } if (!isset($data['macaddress'])) { $data['macaddress'] = ''; } if (!isset($data['hardware'])) { $data['hardware'] = ''; } if (!isset($data['software'])) { $data['software'] = ''; } if (!isset($data['contact'])) { $data['contact'] = ''; } if (!isset($data['location'])) { $data['location'] = ''; } if (!isset($data['notes'])) { $data['notes'] = ''; } delete_host_profile($this->data[XML_TAG_HOST]['hostid']); if (add_host_profile($this->data[XML_TAG_HOST]['hostid'], $data['devicetype'], $data['name'], $data['os'], $data['serialno'], $data['tag'], $data['macaddress'], $data['hardware'], $data['software'], $data['contact'], $data['location'], $data['notes'])) { info('Host Profile [' . $this->data[XML_TAG_HOST]['name'] . '] updated'); } break; // case //--- // Extended profiles // case //--- // Extended profiles case XML_TAG_HOSTPROFILE_EXT: if (!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) { break; } //case if (!isset($data['device_alias'])) { $data['device_alias'] = ''; } if (!isset($data['device_type'])) { $data['device_type'] = ''; } if (!isset($data['device_chassis'])) { $data['device_chassis'] = ''; } if (!isset($data['device_os'])) { $data['device_os'] = ''; } if (!isset($data['device_os_short'])) { $data['device_os_short'] = ''; } if (!isset($data['device_hw_arch'])) { $data['device_hw_arch'] = ''; } if (!isset($data['device_serial'])) { $data['device_serial'] = ''; } if (!isset($data['device_model'])) { $data['device_model'] = ''; } if (!isset($data['device_tag'])) { $data['device_tag'] = ''; } if (!isset($data['device_vendor'])) { $data['device_vendor'] = ''; } if (!isset($data['device_contract'])) { $data['device_contract'] = ''; } if (!isset($data['device_who'])) { $data['device_who'] = ''; } if (!isset($data['device_status'])) { $data['device_status'] = ''; } if (!isset($data['device_app_01'])) { $data['device_app_01'] = ''; } if (!isset($data['device_app_02'])) { $data['device_app_02'] = ''; } if (!isset($data['device_app_03'])) { $data['device_app_03'] = ''; } if (!isset($data['device_app_04'])) { $data['device_app_04'] = ''; } if (!isset($data['device_app_05'])) { $data['device_app_05'] = ''; } if (!isset($data['device_url_1'])) { $data['device_url_1'] = ''; } if (!isset($data['device_url_2'])) { $data['device_url_2'] = ''; } if (!isset($data['device_url_3'])) { $data['device_url_3'] = ''; } if (!isset($data['device_networks'])) { $data['device_networks'] = ''; } if (!isset($data['device_notes'])) { $data['device_notes'] = ''; } if (!isset($data['device_hardware'])) { $data['device_hardware'] = ''; } if (!isset($data['device_software'])) { $data['device_software'] = ''; } if (!isset($data['ip_subnet_mask'])) { $data['ip_subnet_mask'] = ''; } if (!isset($data['ip_router'])) { $data['ip_router'] = ''; } if (!isset($data['ip_macaddress'])) { $data['ip_macaddress'] = ''; } if (!isset($data['oob_ip'])) { $data['oob_ip'] = ''; } if (!isset($data['oob_subnet_mask'])) { $data['oob_subnet_mask'] = ''; } if (!isset($data['oob_router'])) { $data['oob_router'] = ''; } if (!isset($data['date_hw_buy'])) { $data['date_hw_buy'] = ''; } if (!isset($data['date_hw_install'])) { $data['date_hw_install'] = ''; } if (!isset($data['date_hw_expiry'])) { $data['date_hw_expiry'] = ''; } if (!isset($data['date_hw_decomm'])) { $data['date_hw_decomm'] = ''; } if (!isset($data['site_street_1'])) { $data['site_street_1'] = ''; } if (!isset($data['site_street_2'])) { $data['site_street_2'] = ''; } if (!isset($data['site_street_3'])) { $data['site_street_3'] = ''; } if (!isset($data['site_city'])) { $data['site_city'] = ''; } if (!isset($data['site_state'])) { $data['site_state'] = ''; } if (!isset($data['site_country'])) { $data['site_country'] = ''; } if (!isset($data['site_zip'])) { $data['site_zip'] = ''; } if (!isset($data['site_rack'])) { $data['site_rack'] = ''; } if (!isset($data['site_notes'])) { $data['site_notes'] = ''; } if (!isset($data['poc_1_name'])) { $data['poc_1_name'] = ''; } if (!isset($data['poc_1_email'])) { $data['poc_1_email'] = ''; } if (!isset($data['poc_1_phone_1'])) { $data['poc_1_phone_1'] = ''; } if (!isset($data['poc_1_phone_2'])) { $data['poc_1_phone_2'] = ''; } if (!isset($data['poc_1_cell'])) { $data['poc_1_cell'] = ''; } if (!isset($data['poc_1_screen'])) { $data['poc_1_screen'] = ''; } if (!isset($data['poc_1_notes'])) { $data['poc_1_notes'] = ''; } if (!isset($data['poc_2_name'])) { $data['poc_2_name'] = ''; } if (!isset($data['poc_2_email'])) { $data['poc_2_email'] = ''; } if (!isset($data['poc_2_phone_1'])) { $data['poc_2_phone_1'] = ''; } if (!isset($data['poc_2_phone_2'])) { $data['poc_2_phone_2'] = ''; } if (!isset($data['poc_2_cell'])) { $data['poc_2_cell'] = ''; } if (!isset($data['poc_2_screen'])) { $data['poc_2_screen'] = ''; } if (!isset($data['poc_2_notes'])) { $data['poc_2_notes'] = ''; } delete_host_profile_ext($this->data[XML_TAG_HOST]['hostid']); if (add_host_profile_ext($this->data[XML_TAG_HOST]['hostid'], $data)) { info('Host Extended Profile [' . $this->data[XML_TAG_HOST]['name'] . '] updated'); } break; // case //--- // case //--- case XML_TAG_GROUP: if (!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) { break; } //case $sql = 'SELECT groupid, name ' . ' FROM groups' . ' WHERE ' . DBin_node('groupid', get_current_nodeid(false)) . ' AND name=' . zbx_dbstr($this->element_data); if (!($group = DBfetch(DBselect($sql)))) { error('Missing group [' . $this->element_data . ']'); break; // case } if (!isset($this->available_groups[$group['groupid']])) { error('Group [' . $this->element_data . '] skipped - Access deny.'); break; // case } $this->data[XML_TAG_HOST]['groups'][$group['groupid']] = $group['groupid']; break; // case // case case XML_TAG_DEPENDENCY: if (!isset($data['triggerid_down']) || !$data['triggerid_down']) { break; } // case update_trigger($data['triggerid_down'], null, null, null, null, null, null, null, $data['triggerid_up'], null); break; // case // case case XML_TAG_DEPENDS: if (!isset($this->data[XML_TAG_DEPENDENCY]['triggerid_down']) || !$this->data[XML_TAG_DEPENDENCY]['triggerid_down']) { break; } //case if (!($trigger_up = get_trigger_by_description($this->element_data))) { break; } array_push($this->data[XML_TAG_DEPENDENCY]['triggerid_up'], $trigger_up['triggerid']); break; // case // 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 $sql = 'SELECT applicationid ' . ' FROM applications' . ' WHERE ' . DBin_node('applicationid', get_current_nodeid(false)) . ' AND name=' . zbx_dbstr($this->element_data) . ' AND hostid=' . $this->data[XML_TAG_HOST]['hostid']; if (!($application = DBfetch(DBselect($sql)))) { $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 case XML_TAG_TEMPLATE: if (!isset($this->data[XML_TAG_HOST]['hostid']) || !$this->data[XML_TAG_HOST]['hostid']) { break; } //case $sql = 'SELECT DISTINCT host, hostid ' . ' FROM hosts' . ' WHERE ' . DBin_node('hostid') . ' AND host=' . zbx_dbstr($this->element_data) . ' AND status IN (' . HOST_STATUS_MONITORED . ',' . HOST_STATUS_NOT_MONITORED . ',' . HOST_STATUS_TEMPLATE . ')'; if (!($template = DBfetch(DBselect($sql)))) { error('Missing template [' . $this->element_data . ']'); break; // case } if (!isset($this->available_hosts[$template['hostid']])) { error('Template [' . $this->element_data . '] skipped - Access deny.'); break; // case } $this->data[XML_TAG_HOST]['templates'][$template["hostid"]] = $template['host']; break; // case // 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 - missing 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['params'])) { $data['params'] = ''; } if (!isset($data['ipmi_sensor'])) { $data['ipmi_sensor'] = ''; } if (!isset($data['applications'])) { $data['applications'] = array(); } if (!empty($data['valuemap'])) { $sql = 'SELECT valuemapid ' . ' FROM valuemaps ' . ' WHERE ' . DBin_node('valuemapid', get_current_nodeid(false)) . ' AND name=' . zbx_dbstr($data['valuemap']); if ($valuemap = DBfetch(DBselect($sql))) { $data['valuemapid'] = $valuemap['valuemapid']; } else { $data['valuemapid'] = add_valuemap($data['valuemap'], array()); } } $sql = 'SELECT itemid,valuemapid,templateid ' . ' FROM items ' . ' WHERE key_=' . zbx_dbstr($data['key']) . ' AND hostid=' . $this->data[XML_TAG_HOST]['hostid'] . ' AND ' . DBin_node('itemid', get_current_nodeid(false)); if ($item = DBfetch(DBselect($sql))) { /* exist */ if ($this->item['exist'] == 1) { info('Item [' . $data['description'] . '] skipped - user rule'); break; } if (!isset($data['valuemapid'])) { $data['valuemapid'] = $item['valuemapid']; } $data['key_'] = $data['key']; $data['hostid'] = $this->data[XML_TAG_HOST]['hostid']; $data['applications'] = array_unique(array_merge($data['applications'], get_applications_by_itemid($item['itemid']))); $data['templateid'] = $item['templateid']; check_db_fields($item, $data); update_item($item['itemid'], $data); } else { /* missed */ if ($this->item['missed'] == 1) { info('Item [' . $data['description'] . '] skipped - user rule'); break; // case } if (!isset($data['valuemapid'])) { $data['valuemapid'] = 0; } $data['hostid'] = $this->data[XML_TAG_HOST]['hostid']; $data['key_'] = $data['key']; add_item($data); } break; // case // case case XML_TAG_TRIGGER: if (!isset($data['expression'])) { $data['expression'] = ''; } if (!isset($data['description'])) { $data['description'] = ''; } if (!isset($data['type'])) { $data['type'] = 0; } 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']) { // remember skipped triggers for dependencies $this->data[XML_TAG_DEPENDENCIES]['skip'][] = $this->data[XML_TAG_HOST]['name'] . ':' . $data['description']; info('Trigger [' . $data['description'] . '] skipped - user rule for host'); break; // case } if (zbx_strstr($data['expression'], '{HOSTNAME}')) { // remember skipped triggers for dependencies $this->data[XML_TAG_DEPENDENCIES]['skip'][] = $this->data[XML_TAG_HOST]['name'] . ':' . $data['description']; error('Trigger [' . $data['description'] . '] skipped - missing host'); break; // case } } else { $data['expression'] = str_replace('{{HOSTNAME}:', '{' . $this->data[XML_TAG_HOST]['name'] . ':', $data['expression']); $result = DBselect('SELECT DISTINCT t.triggerid,t.templateid,t.expression ' . ' 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'])); while ($trigger = DBfetch($result)) { if (explode_exp($trigger['expression'], 0) == $data['expression']) { break; // while } } if (!empty($trigger)) { /* exist */ if ($this->trigger['exist'] == 1) { /* skip */ // remember skipped triggers for dependencies $this->data[XML_TAG_DEPENDENCIES]['skip'][] = $this->data[XML_TAG_HOST]['name'] . ':' . $data['description']; info('Trigger [' . $data['description'] . '] skipped - user rule'); break; // case } update_trigger($trigger['triggerid'], $data['expression'], $data['description'], $data['type'], $data['priority'], $data['status'], $data['comments'], $data['url'], get_trigger_dependencies_by_triggerid($trigger['triggerid']), $trigger['templateid']); break; // case } else { /* missed */ // continue [add_trigger] } } if ($this->trigger['missed'] == 1) { // remember skipped triggers for dependencies $this->data[XML_TAG_DEPENDENCIES]['skip'][] = $this->data[XML_TAG_HOST]['name'] . ':' . $data['description']; info('Trigger [' . $data['description'] . '] skipped - user rule'); break; // case } add_trigger($data['expression'], $data['description'], $data['type'], $data['priority'], $data['status'], $data['comments'], $data['url']); break; // case // case case XML_TAG_GRAPH: if (isset($data['error'])) { error('Graph [' . $data['name'] . '] skipped - error occured'); break; // case } if (!isset($data['ymin_type'])) { $data['ymin_type'] = 0; } if (!isset($data['ymax_type'])) { $data['ymax_type'] = 0; } if (!isset($data['ymin_item_key'])) { $data['ymin_item_key'] = ''; } if (!isset($data['ymax_item_key'])) { $data['ymax_item_key'] = ''; } if (!isset($data['ymin_itemid'])) { $data['ymin_itemid'] = 0; } if (!isset($data['ymax_itemid'])) { $data['ymax_itemid'] = 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['show_legend'])) { $data['show_legend'] = 0; } if (!isset($data['show_3d'])) { $data['show_3d'] = 0; } if (!isset($data['percent_left'])) { $data['percent_left'] = 0; } if (!isset($data['percent_right'])) { $data['percent_right'] = 0; } if (!isset($data['items'])) { $data['items'] = array(); } if (!empty($data['ymin_item_key'])) { $data['ymin_item_key'] = explode(':', $data['ymin_item_key']); if (count($data['ymin_item_key']) < 2) { $this->data[XML_TAG_GRAPH]['error'] = true; error('Incorrect y min item for graph [' . $data['name'] . ']'); break; // case } $data['host'] = array_shift($data['ymin_item_key']); $data['ymin_item_key'] = implode(':', $data['ymin_item_key']); if (!($item = get_item_by_key($data['ymin_item_key'], $data['host']))) { $this->data[XML_TAG_GRAPH]['error'] = true; error('Missed item [' . $data['ymin_item_key'] . '] for host [' . $data['host'] . ']'); break; // case } $data['ymin_itemid'] = $item['itemid']; } if (!empty($data['ymax_item_key'])) { $data['ymax_item_key'] = explode(':', $data['ymax_item_key']); if (count($data['ymax_item_key']) < 2) { $this->data[XML_TAG_GRAPH]['error'] = true; error('Incorrect y max item for graph [' . $data['name'] . ']'); break; // case } $data['host'] = array_shift($data['ymax_item_key']); $data['ymax_item_key'] = implode(':', $data['ymax_item_key']); if (!($item = get_item_by_key($data['ymax_item_key'], $data['host']))) { $this->data[XML_TAG_GRAPH]['error'] = true; error('Missed item [' . $data['ymax_item_key'] . '] for host [' . $data['host'] . ']'); break; // case } $data['ymax_itemid'] = $item['itemid']; } 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 (zbx_strstr($data['name'], '{HOSTNAME}')) { error('Graph [' . $data['name'] . '] skipped - missing 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_with_items($data['graphid'], $data['name'], $data['width'], $data['height'], $data['ymin_type'], $data['ymax_type'], $data['yaxismin'], $data['yaxismax'], $data['ymin_itemid'], $data['ymax_itemid'], $data['show_work_period'], $data['show_triggers'], $data['graphtype'], $data['show_legend'], $data['show_3d'], $data['percent_left'], $data['percent_right'], $data['items'], $graph['templateid']); } 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_with_items($data['name'], $data['width'], $data['height'], $data['ymin_type'], $data['ymax_type'], $data['yaxismin'], $data['yaxismax'], $data['ymin_itemid'], $data['ymax_itemid'], $data['show_work_period'], $data['show_triggers'], $data['graphtype'], $data['show_legend'], $data['show_3d'], $data['percent_left'], $data['percent_right'], $data['items']); } break; // case // 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 = get_item_by_key($data['key'], $data['host']))) { $this->data[XML_TAG_GRAPH]['error'] = true; error('Missing 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*/ // 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 update_template_dependencies_for_host($hostid) { $db_triggers = get_triggers_by_hostid($hostid); while ($trigger_data = DBfetch($db_triggers)) { $db_chd_triggers = get_triggers_by_templateid($trigger_data['triggerid']); while ($chd_trigger_data = DBfetch($db_chd_triggers)) { update_trigger($chd_trigger_data['triggerid'], NULL, NULL, NULL, NULL, NULL, NULL, NULL, replace_template_dependencies(get_trigger_dependencies_by_triggerid($trigger_data['triggerid']), $hostid), $trigger_data['triggerid']); } } }
$sql .= ' AND h.hostid=' . $hostid; } $sql .= ' GROUP BY h.host, t.triggerid, t.description, t.expression, t.priority, t.status' . ' ORDER BY h.host,t.description'; $result = DBselect($sql); while ($row = DBfetch($result)) { $exp_desc = expand_trigger_description_by_data($row); $description = new CSpan($exp_desc, 'link'); if ($multiselect) { $js_action = 'add_selected_values("' . S_TRIGGERS . '", "' . $dstfrm . '", "' . $dstfld1 . '", "' . $dstact . '", "' . $row["triggerid"] . '");'; } else { $js_action = 'add_value("' . $dstfld1 . '", "' . $dstfld2 . '", "' . $row["triggerid"] . '", "' . $exp_desc . '");'; } $description->onClick($js_action); if ($row['dep_count'] > 0) { $description = array($description, BR(), BR(), bold(S_DEPENDS_ON), BR()); $deps = get_trigger_dependencies_by_triggerid($row["triggerid"]); foreach ($deps as $val) { $description[] = array(expand_trigger_description($val), BR()); } } switch ($row["status"]) { case TRIGGER_STATUS_DISABLED: $status = new CSpan(S_DISABLED, 'disabled'); break; case TRIGGER_STATUS_UNKNOWN: $status = new CSpan(S_UNKNOWN, 'unknown'); break; case TRIGGER_STATUS_ENABLED: $status = new CSpan(S_ENABLED, 'enabled'); break; }
if (!check_right_on_trigger_by_expression(PERM_READ_WRITE, $_REQUEST['expression'])) { if (isset($_REQUEST['triggerid'])) { show_messages(false, null, S_CANNOT_UPDATE_TRIGGER); } else { show_messages(false, null, S_CANNOT_ADD_TRIGGER); } } else { $status = isset($_REQUEST['status']) ? TRIGGER_STATUS_DISABLED : TRIGGER_STATUS_ENABLED; $deps = get_request('dependencies', array()); if (isset($_REQUEST['triggerid'])) { $triggerData = get_trigger_by_triggerid($_REQUEST['triggerid']); if ($triggerData['templateid']) { $_REQUEST['description'] = $triggerData['description']; $_REQUEST['expression'] = explode_exp($triggerData['expression'], 0); } $current_deps = get_trigger_dependencies_by_triggerid($_REQUEST['triggerid']); sort($deps); sort($current_deps); if ($deps == $current_deps) { $deps = null; } $type = get_request('type'); $priority = get_request('priority'); $comments = get_request('comments'); $url = get_request('url'); if ($triggerData['type'] == $_REQUEST['type']) { $type = null; } if ($triggerData['priority'] == $_REQUEST['priority']) { $priority = null; }
if ($PAGE_GROUPS['selected'] > 0) { $options += array('groupids' => $PAGE_GROUPS['selected']); } } $triggers = CTrigger::get($options); foreach ($triggers as $triggerid => $trigger) { $description = array(); if ($trigger['templateid'] > 0) { $real_hosts = get_realhosts_by_triggerid($triggerid); $real_host = DBfetch($real_hosts); $description[] = new CLink($real_host['host'], 'triggers.php?&hostid=' . $real_host['hostid'], 'unknown'); $description[] = ':'; } $description[] = new CLink(expand_trigger_description($triggerid), 'triggers.php?form=update&triggerid=' . $triggerid); // <<<--- add dependencies --->>> $deps = get_trigger_dependencies_by_triggerid($triggerid); if (count($deps) > 0) { $description[] = array(BR(), bold(S_DEPENDS_ON . ' : ')); foreach ($deps as $num => $dep_triggerid) { $description[] = BR(); $hosts = get_hosts_by_triggerid($dep_triggerid); while ($host = DBfetch($hosts)) { $description[] = $host['host']; $description[] = ', '; } array_pop($description); $description[] = ' : '; $description[] = expand_trigger_description($dep_triggerid); } } // --->>> add dependencies <<<---
$row['hostid'] = '0'; } $description = array(new CCheckBox('g_triggerid[' . $row['triggerid'] . ']', NULL, NULL, $row['triggerid']), SPACE); if ($row['templateid']) { $real_hosts = get_realhosts_by_triggerid($row['triggerid']); $real_host = DBfetch($real_hosts); if ($real_host) { $description[] = new CLink($real_host['host'], 'triggers.php?&hostid=' . $real_host['hostid'], 'unknown'); } else { $description[] = new CSpan('error', 'on'); } $description[] = ':'; } $description[] = new CLink(expand_trigger_description($row['triggerid']), 'triggers.php?form=update&triggerid=' . $row['triggerid'] . '&hostid=' . $row['hostid'], 'action'); //add dependencies $deps = get_trigger_dependencies_by_triggerid($row['triggerid']); if (count($deps) > 0) { $description[] = array(BR(), bold(S_DEPENDS_ON . ':'), SPACE); foreach ($deps as $num => $dep_triggerid) { // shows host name of depending trigger $description[] = BR(); $hosts = get_hosts_by_triggerid($dep_triggerid); if (($host = DBfetch($hosts)) && $host['hostid'] != $row['hostid']) { $description[] = $host['host'] . ':'; } $description[] = expand_trigger_description($dep_triggerid); $dep_trigger_desc = ''; while ($host = DBfetch($hosts)) { $dep_trigger_desc .= $host['host'] . ','; } trim($dep_trigger_desc, ',');
function copy_trigger_to_host($triggerid, $hostid, $copy_mode = false) { $trigger = get_trigger_by_triggerid($triggerid); $deps = replace_template_dependencies(get_trigger_dependencies_by_triggerid($triggerid), $hostid); $sql = 'SELECT t2.triggerid, t2.expression ' . ' FROM triggers t2, functions f1, functions f2, items i1, items i2 ' . ' WHERE f1.triggerid=' . $triggerid . ' AND i1.itemid=f1.itemid ' . ' AND f2.function=f1.function ' . ' AND f2.parameter=f1.parameter ' . ' AND i2.itemid=f2.itemid ' . ' AND i2.key_=i1.key_ ' . ' AND i2.hostid=' . $hostid . ' AND t2.triggerid=f2.triggerid ' . ' AND t2.templateid=0 '; $host_triggers = DBSelect($sql); while ($host_trigger = DBfetch($host_triggers)) { if (cmp_triggers_exressions($triggerid, $host_trigger['triggerid'])) { continue; } // link not linked trigger with same expression return update_trigger($host_trigger['triggerid'], NULL, $trigger['description'], $trigger['type'], $trigger['priority'], NULL, $trigger['comments'], $trigger['url'], $deps, $copy_mode ? 0 : $triggerid); } $newtriggerid = get_dbid('triggers', 'triggerid'); $result = DBexecute('INSERT INTO triggers ' . ' (triggerid,description,type,priority,status,comments,url,value,expression,templateid)' . ' VALUES (' . $newtriggerid . ',' . zbx_dbstr($trigger['description']) . ',' . $trigger['type'] . ',' . $trigger['priority'] . ',' . $trigger['status'] . ',' . zbx_dbstr($trigger['comments']) . ',' . zbx_dbstr($trigger['url']) . ",2,'0'," . ($copy_mode ? 0 : $triggerid) . ')'); if (!$result) { return $result; } $host = get_host_by_hostid($hostid); $newexpression = $trigger['expression']; // Loop: functions $functions = get_functions_by_triggerid($triggerid); while ($function = DBfetch($functions)) { $item = get_item_by_itemid($function['itemid']); $host_items = DBselect('SELECT * FROM items WHERE key_=' . zbx_dbstr($item['key_']) . ' AND hostid=' . $host['hostid']); $host_item = DBfetch($host_items); if (!$host_item) { error('Missing key "' . $item['key_'] . '" for host "' . $host['host'] . '"'); return FALSE; } $newfunctionid = get_dbid('functions', 'functionid'); $result = DBexecute('INSERT INTO functions (functionid,itemid,triggerid,function,parameter) ' . " values ({$newfunctionid}," . $host_item['itemid'] . ',' . $newtriggerid . ',' . zbx_dbstr($function['function']) . ',' . zbx_dbstr($function['parameter']) . ')'); $newexpression = str_replace('{' . $function['functionid'] . '}', '{' . $newfunctionid . '}', $newexpression); } DBexecute('UPDATE triggers SET expression=' . zbx_dbstr($newexpression) . ' WHERE triggerid=' . $newtriggerid); // copy dependencies delete_dependencies_by_triggerid($newtriggerid); foreach ($deps as $dep_id) { add_trigger_dependency($newtriggerid, $dep_id); } info('Added trigger "' . $trigger['description'] . '" to host "' . $host['host'] . '"'); add_audit_ext(AUDIT_ACTION_ADD, AUDIT_RESOURCE_TRIGGER, $newtriggerid, $trigger['description'], NULL, NULL, NULL); // Copy triggers to the child hosts $child_hosts = get_hosts_by_templateid($hostid); while ($child_host = DBfetch($child_hosts)) { // recursion $result = copy_trigger_to_host($newtriggerid, $child_host['hostid']); if (!$result) { return result; } } return $newtriggerid; }