diff options
Diffstat (limited to 'frontends/php/include/triggers.inc.php')
-rw-r--r-- | frontends/php/include/triggers.inc.php | 300 |
1 files changed, 180 insertions, 120 deletions
diff --git a/frontends/php/include/triggers.inc.php b/frontends/php/include/triggers.inc.php index 3ef8e0cf..acbd22c6 100644 --- a/frontends/php/include/triggers.inc.php +++ b/frontends/php/include/triggers.inc.php @@ -395,12 +395,14 @@ return FALSE; } - function get_hosts_by_triggerid($triggerid){ + function get_hosts_by_triggerid($triggerids){ + zbx_value2array($triggerids); + return DBselect('SELECT DISTINCT h.* '. ' FROM hosts h, functions f, items i '. ' WHERE i.itemid=f.itemid '. - ' and h.hostid=i.hostid '. - ' and f.triggerid='.$triggerid); + ' AND h.hostid=i.hostid '. + ' AND '.DBcondition('f.triggerid',$triggerids)); } function get_functions_by_triggerid($triggerid){ @@ -457,8 +459,9 @@ return $trigger; } - function get_triggers_by_templateid($triggerid){ - return DBselect('select * from triggers where templateid='.$triggerid); + function get_triggers_by_templateid($triggerids){ + zbx_value2array($triggerids); + return DBselect('SELECT * FROM triggers WHERE '.DBcondition('templateid',$triggerids)); } /* @@ -1058,22 +1061,31 @@ return $short_exp; } - function update_trigger_comments($triggerid,$comments){ - return DBexecute('UPDATE triggers SET comments='.zbx_dbstr($comments). - ' WHERE triggerid='.$triggerid); + function update_trigger_comments($triggerids,$comments){ + zbx_value2array($triggerids); + + return DBexecute('UPDATE triggers '. + ' SET comments='.zbx_dbstr($comments). + ' WHERE '.DBcondition('triggerid',$triggerids)); } # Update Trigger status - function update_trigger_status($triggerid,$status){ + function update_trigger_status($triggerids,$status){ + zbx_value2array($triggerids); + // first update status for child triggers - $db_chd_triggers = get_triggers_by_templateid($triggerid); + $upd_chd_triggers = array(); + $db_chd_triggers = get_triggers_by_templateid($triggerids); while($db_chd_trigger = DBfetch($db_chd_triggers)){ - update_trigger_status($db_chd_trigger["triggerid"],$status); + $upd_chd_triggers[$db_chd_trigger['triggerid']] = $db_chd_trigger['triggerid']; + } + if(!empty($upd_chd_triggers)){ + update_trigger_status($upd_chd_triggers,$status); } - add_event($triggerid,TRIGGER_VALUE_UNKNOWN); - return DBexecute('UPDATE triggers SET status='.$status.' WHERE triggerid='.$triggerid); + $triggerids = add_event($triggerids,TRIGGER_VALUE_UNKNOWN); + return DBexecute('UPDATE triggers SET status='.$status.' WHERE '.DBcondition('triggerid',$triggerids)); } /* @@ -1213,48 +1225,64 @@ return $description; } - function update_trigger_value_to_unknown_by_hostid($hostid){ + function update_trigger_value_to_unknown_by_hostid($hostids){ + zbx_value2array($hostids); + + $triggers = array(); $result = DBselect('SELECT DISTINCT t.triggerid '. - ' FROM hosts h,items i,triggers t,functions f '. + ' FROM items i,triggers t,functions f '. ' WHERE f.triggerid=t.triggerid '. ' AND f.itemid=i.itemid '. - ' AND h.hostid=i.hostid '. - ' AND h.hostid='.$hostid); + ' AND '.DBcondition('i.hostid',$hostids)); + $now = time(); while($row=DBfetch($result)){ - if(!add_event($row["triggerid"],TRIGGER_VALUE_UNKNOWN,$now)) continue; + $triggers[$row['triggerid']] = $row['triggerid']; + } + if(!empty($triggers)){ +// returns updated triggers + $triggers = add_event($triggers,TRIGGER_VALUE_UNKNOWN,$now); + } - DBexecute('update triggers set value='.TRIGGER_VALUE_UNKNOWN.' where triggerid='.$row["triggerid"]); + if(!empty($triggers)){ + DBexecute('UPDATE triggers SET value='.TRIGGER_VALUE_UNKNOWN.', lastchange='.$now.' WHERE '.DBcondition('triggerid',$triggers)); } + return true; } - /****************************************************************************** - * * - * Comments: !!! Don't forget sync code with C !!! * - * * - ******************************************************************************/ - function add_event($triggerid, $value, $time=NULL){ +/****************************************************************************** + * * + * Comments: !!! Don't forget sync code with C !!! * + * !!! C code dosn't support TRIGGERS MULTI EVENT !!! * + * * + ******************************************************************************/ + function add_event($triggerids, $value, $time=NULL){ + zbx_value2array($triggerids); if(is_null($time)) $time = time(); - $result = DBselect('SELECT value,clock '. - ' FROM events '. - ' WHERE objectid='.$triggerid. - ' AND object='.EVENT_OBJECT_TRIGGER. - ' ORDER BY clock desc',1); - $last_value = DBfetch($result); - if($last_value){ - if($value == $last_value['value']) - return false; + $result = DBselect('SELECT DISTINCT triggerid, value, type FROM triggers WHERE '.DBcondition('triggerid',$triggerids)); + while($trigger = DBfetch($result)){ + if(($value == $trigger['value']) && !(($value == TRIGGER_VALUE_TRUE) && ($trigger['type'] == TRIGGER_MULT_EVENT_ENABLED))){ + unset($triggerids[$trigger['triggerid']]); + } } - $eventid = get_dbid("events","eventid"); - $result = DBexecute('insert into events(eventid,source,object,objectid,clock,value) '. - ' values('.$eventid.','.EVENT_SOURCE_TRIGGERS.','.EVENT_OBJECT_TRIGGER.','.$triggerid.','.$time.','.$value.')'); - - if($value == TRIGGER_VALUE_FALSE || $value == TRIGGER_VALUE_TRUE){ - DBexecute('update alerts set retries=3,error=\'Trigger changed its status. Will not send repeats.\''. - ' where eventid='.$eventid.' and repeats>0 and status='.ALERT_STATUS_NOT_SENT); + + $events = array(); + foreach($triggerids as $id => $triggerid){ + $eventid = get_dbid('events','eventid'); + $result = DBexecute('INSERT INTO events (eventid,source,object,objectid,clock,value) '. + ' VALUES ('.$eventid.','.EVENT_SOURCE_TRIGGERS.','.EVENT_OBJECT_TRIGGER.','.$triggerid.','.$time.','.$value.')'); + $events[$eventid] = $eventid; } - return true; + + if(!empty($events) && ($value == TRIGGER_VALUE_FALSE || $value == TRIGGER_VALUE_TRUE)){ + DBexecute('UPDATE alerts '. + " SET retries=3,error='Trigger changed its status. Will not send repeats.'". + ' WHERE '.DBcondition('eventid',$events). + ' AND repeats>0 '. + ' AND status='.ALERT_STATUS_NOT_SENT); + } + return $triggerids; } function add_trigger_dependency($triggerid,$depid){ @@ -1268,67 +1296,86 @@ return $result; } - /****************************************************************************** - * * - * Purpose: Delete Trigger definition * - * * - * Comments: !!! Don't forget sync code with C !!! * - * * - ******************************************************************************/ - function delete_trigger($triggerid){ - // first delete child triggers - $db_triggers= get_triggers_by_templateid($triggerid); +/****************************************************************************** + * * + * Purpose: Delete Trigger definition * + * * + * Comments: !!! Don't forget sync code with C !!! * + * * + ******************************************************************************/ + function delete_trigger($triggerids){ + zbx_value2array($triggerids); + +// first delete child triggers + $del_chd_triggers = array(); + $db_triggers= get_triggers_by_templateid($triggerids); while($db_trigger = DBfetch($db_triggers)){// recursion - $result = delete_trigger($db_trigger["triggerid"]); - if(!$result) return $result; + $del_chd_triggers[$db_trigger['triggerid']] = $db_trigger['triggerid']; + } + if(!empty($del_chd_triggers)){ + $result = delete_trigger($del_chd_triggers); + if(!$result) return $result; } - // get hosts before functions deletion !!! - $trig_hosts = get_hosts_by_triggerid($triggerid); +// get hosts before functions deletion !!! + $trig_hosts = array(); + foreach($triggerids as $id => $triggerid){ + $trig_hosts[$triggerid] = get_hosts_by_triggerid($triggerid); + } - $result = delete_dependencies_by_triggerid($triggerid); + $result = delete_dependencies_by_triggerid($triggerids); if(!$result) return $result; - DBexecute("delete from trigger_depends where triggerid_up=$triggerid"); + DBexecute('DELETE FROM trigger_depends WHERE '.DBcondition('triggerid_up',$triggerids)); - $result=delete_function_by_triggerid($triggerid); + $result = delete_function_by_triggerid($triggerids); if(!$result) return $result; - $result=delete_events_by_triggerid($triggerid); + $result = delete_events_by_triggerid($triggerids); if(!$result) return $result; - $result=delete_services_by_triggerid($triggerid); + $result = delete_services_by_triggerid($triggerids); if(!$result) return $result; - $result=delete_sysmaps_elements_with_triggerid($triggerid); + $result = delete_sysmaps_elements_with_triggerid($triggerids); if(!$result) return $result; - DBexecute("delete from sysmaps_link_triggers where triggerid=$triggerid"); + DBexecute('DELETE FROM sysmaps_link_triggers WHERE '.DBcondition('triggerid',$triggerids)); - // disable actions - $db_actions = DBselect('select distinct actionid from conditions '. - " where conditiontype=".CONDITION_TYPE_TRIGGER." and value=".zbx_dbstr($triggerid)); +// disable actions + $db_actions = DBselect('SELECT DISTINCT actionid '. + ' FROM conditions '. + ' WHERE conditiontype='.CONDITION_TYPE_TRIGGER. + ' AND '.DBcondition('value',$triggerids)); // POSIBLE VALUE TYPE VIOLATION !!!!!!!!!!!!!!! + while($db_action = DBfetch($db_actions)){ - DBexecute("update actions set status=".ACTION_STATUS_DISABLED. - " where actionid=".$db_action["actionid"]); + DBexecute('UPDATE actions SET status='.ACTION_STATUS_DISABLED. + ' WHERE actionid='.$db_action['actionid']); } - // delete action conditions - DBexecute('delete from conditions where conditiontype='.CONDITION_TYPE_TRIGGER.' and value='.zbx_dbstr($triggerid)); - - $trigger = get_trigger_by_triggerid($triggerid); + +// delete action conditions // POSIBLE VALUE TYPE VIOLATION !!!!!!!!!!!!!!! + DBexecute('DELETE FROM conditions WHERE conditiontype='.CONDITION_TYPE_TRIGGER.' AND '.DBcondition('value',$triggerids)); - $result = DBexecute("delete from triggers where triggerid=$triggerid"); +// Get triggers INFO before delete them! + $triggers = array(); + $trig_res = DBselect('SELECT triggerid, description FROM triggers WHERE '.DBcondition('triggerid',$triggerids)); + while($trig_rows = DBfetch($trig_res)){ + $triggers[$trig_rows['triggerid']] = $trig_rows; + } +// -- + $result = DBexecute('DELETE FROM triggers WHERE '.DBcondition('triggerid',$triggerids)); if($result){ - $msg = "Trigger '".$trigger["description"]."' deleted"; - $trig_host = DBfetch($trig_hosts); - if($trig_host) - { - $msg .= " from host '".$trig_host["host"]."'"; + foreach($triggers as $triggerid => $trigger){ + $msg = "Trigger '".$trigger["description"]."' deleted"; + $trig_host = DBfetch($trig_hosts[$triggerid]); + if($trig_host){ + $msg .= " from host '".$trig_host["host"]."'"; + } + info($msg); } - info($msg); } - return $result; + return $result; } # Update Trigger definition @@ -1401,16 +1448,16 @@ if($event_to_unknown) add_event($triggerid,TRIGGER_VALUE_UNKNOWN); reset_items_nextcheck($triggerid); - $sql="update triggers set"; - if(!is_null($expression)) $sql .= " expression=".zbx_dbstr($expression).","; - if(!is_null($description)) $sql .= " description=".zbx_dbstr($description).","; - if(!is_null($type)) $sql .= " type=$type,"; - if(!is_null($priority)) $sql .= " priority=$priority,"; - if(!is_null($status)) $sql .= " status=$status,"; - if(!is_null($comments)) $sql .= " comments=".zbx_dbstr($comments).","; - if(!is_null($url)) $sql .= " url=".zbx_dbstr($url).","; - if(!is_null($templateid)) $sql .= " templateid=$templateid,"; - $sql .= " value=2 where triggerid=$triggerid"; + $sql="UPDATE triggers SET"; + if(!is_null($expression)) $sql .= ' expression='.zbx_dbstr($expression).','; + if(!is_null($description)) $sql .= ' description='.zbx_dbstr($description).','; + if(!is_null($type)) $sql .= ' type='.$type.','; + if(!is_null($priority)) $sql .= ' priority='.$priority.','; + if(!is_null($status)) $sql .= ' status='.$status.','; + if(!is_null($comments)) $sql .= ' comments='.zbx_dbstr($comments).','; + if(!is_null($url)) $sql .= ' url='.zbx_dbstr($url).','; + if(!is_null($templateid)) $sql .= ' templateid='.$templateid.','; + $sql .= ' value=2 WHERE triggerid='.$triggerid; $result = DBexecute($sql); @@ -1461,16 +1508,20 @@ * Comments: !!! Don't forget sync code with C !!! * * * ******************************************************************************/ - function delete_dependencies_by_triggerid($triggerid){ - $db_deps = DBselect('select triggerid_up, triggerid_down from trigger_depends'. - ' where triggerid_down='.$triggerid); + function delete_dependencies_by_triggerid($triggerids){ + zbx_value2array($triggerids); + + $db_deps = DBselect('SELECT triggerid_up, triggerid_down '. + ' FROM trigger_depends '. + ' WHERE '.DBcondition('triggerid_down',$triggerids)); + while($db_dep = DBfetch($db_deps)){ - DBexecute('update triggers set dep_level=dep_level-1 where triggerid='.$db_dep['triggerid_up']); - DBexecute('delete from trigger_depends'. - ' where triggerid_up='.$db_dep['triggerid_up']. - ' and triggerid_down='.$db_dep['triggerid_down']); + DBexecute('UPDATE triggers SET dep_level=dep_level-1 WHERE triggerid='.$db_dep['triggerid_up']); + DBexecute('DELETE FROM trigger_depends'. + ' WHERE triggerid_up='.$db_dep['triggerid_up']. + ' AND triggerid_down='.$db_dep['triggerid_down']); } - return true; + return true; } /****************************************************************************** @@ -1526,12 +1577,14 @@ } //*/ - function delete_function_by_triggerid($triggerid){ - return DBexecute("delete from functions where triggerid=$triggerid"); + function delete_function_by_triggerid($triggerids){ + zbx_value2array($triggerids); + return DBexecute('DELETE FROM functions WHERE '.DBcondition('triggerid',$triggerids)); } - function delete_events_by_triggerid($triggerid){ - return DBexecute('delete from events where objectid='.$triggerid.' and object='.EVENT_OBJECT_TRIGGER); + function delete_events_by_triggerid($triggerids){ + zbx_value2array($triggerids); + return DBexecute('DELETE FROM events WHERE '.DBcondition('objectid',$triggerids).' AND object='.EVENT_OBJECT_TRIGGER); } /****************************************************************************** @@ -1539,14 +1592,19 @@ * Comments: !!! Don't forget sync code with C !!! * * * ******************************************************************************/ - function delete_triggers_by_itemid($itemid){ - $result=DBselect("select triggerid from functions where itemid=$itemid"); + function delete_triggers_by_itemid($itemids){ + zbx_value2array($itemids); + + $del_triggers = array(); + $result=DBselect('SELECT triggerid FROM functions WHERE '.DBcondition('itemid',$itemids)); while($row=DBfetch($result)){ - if(!delete_trigger($row["triggerid"])){ - return FALSE; - } + $del_triggers[$row['triggerid']] = $row['triggerid']; + } + if(!empty($del_triggers)){ + if(!delete_trigger($del_triggers)) return FALSE; } - return TRUE; + + return TRUE; } /****************************************************************************** @@ -1556,12 +1614,14 @@ * Comments: !!! Don't forget sync code with C !!! * * * ******************************************************************************/ - function delete_services_by_triggerid($triggerid){ - $result = DBselect("select serviceid from services where triggerid=$triggerid"); + function delete_services_by_triggerid($triggerids){ + zbx_value2array($triggerids); + + $result = DBselect('SELECT serviceid FROM services WHERE '.DBcondition('triggerid',$triggerids)); while($row = DBfetch($result)){ - delete_service($row["serviceid"]); + delete_service($row['serviceid']); } - return TRUE; + return TRUE; } /* @@ -1649,23 +1709,23 @@ * Comments: !!! Don't forget sync code with C !!! * */ - function delete_template_triggers($hostid, $templateid = null, $unlink_mode = false){ + function delete_template_triggers($hostid, $templateids = null, $unlink_mode = false){ + zbx_value2array($templateids); + $triggers = get_triggers_by_hostid($hostid); while($trigger = DBfetch($triggers)){ - if($trigger["templateid"]==0) continue; + if($trigger['templateid']==0) continue; - if($templateid != null){ - if( !is_array($templateid)) $templateid = array($templateid); - + if($templateid != null){ $db_tmp_hosts = get_hosts_by_triggerid($trigger["templateid"]); $tmp_host = DBfetch($db_tmp_hosts); - if(!uint_in_array($tmp_host["hostid"], $templateid)) continue; + if(!uint_in_array($tmp_host["hostid"], $templateids)) continue; } if($unlink_mode){ - if(DBexecute("update triggers set templateid=0 where triggerid=".$trigger["triggerid"])){ - info("Trigger '".$trigger["description"]."' unlinked"); + if(DBexecute('UPDATE triggers SET templateid=0 WHERE triggerid='.$trigger['triggerid'])){ + info('Trigger "'.$trigger["description"].'" unlinked'); } } else{ |