0)
return get_realhosts_by_triggerid($trigger["templateid"]);
return get_hosts_by_triggerid($triggerid);
}
function get_trigger_by_triggerid($triggerid)
{
$sql="select * from triggers where triggerid=$triggerid";
$result=DBselect($sql);
$row=DBfetch($result);
if($row)
{
return $row;
}
error("No trigger with triggerid=[$triggerid]");
return FALSE;
}
function get_hosts_by_triggerid($triggerid)
{
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");
}
function get_functions_by_triggerid($triggerid)
{
return DBselect("select * from functions where triggerid=$triggerid");
}
function get_triggers_by_hostid($hostid, $show_mixed = "yes")
{
$db_triggers = DBselect("select distinct t.* from triggers t, functions f, items i".
" where i.hostid=$hostid and f.itemid=i.itemid and f.triggerid=t.triggerid");
if($show_mixed == "yes")
return $db_triggers;
$triggers = array();
while($db_trigger = DBfetch($db_triggers))
{
$db_hosts = get_hosts_by_triggerid($db_trigger["triggerid"]);
if(DBfetch($db_hosts))
{
array_push($triggers,$db_trigger["triggerid"]);
}
}
$sql = "select distinct * from triggers where triggerid=0";
foreach($triggers as $triggerid)
{
$sql .= " or triggerid=$triggerid";
}
return DBselect($sql);
}
function get_triggers_by_templateid($triggerid)
{
return DBselect("select * from triggers where templateid=$triggerid");
}
function get_hosts_by_expression($expression)
{
global $ZBX_CURNODEID;
$state="";
$host="";
$hosts=array();
for($i=0,$max=strlen($expression); $i<$max; $i++)
{
if($expression[$i] == '{' && $state=="")
{
$host="";
$state='HOST';
continue;
}
if($expression[$i] == ':' && $state == "HOST")
{
$state="";
$hosts[$host] = '\''.$host.'\'';
$host = '';
continue;
}
if($state == "HOST")
{
$host .= $expression[$i];
continue;
}
}
if(count($hosts) == 0) $hosts = array('0');
return DBselect('select distinct * from hosts where '.DBid2nodeid('hostid').'='.$ZBX_CURNODEID.
' and host in ('.implode(',',$hosts).')');
}
function validate_expression($expression)
{
// echo "Validating expression: $expression
";
$exp_hosts = get_hosts_by_expression($expression);
$ok=0;
// Replace all {server:key.function(param)} with 0
while($ok==0)
{
// echo "Expression:$expression
";
$arr="";
if (eregi('^((.)*)[ ]*(\{((.)*)\})[ ]*((.)*)$', $expression, $arr))
{
// for($i=0;$i<20;$i++)
// {
// if($arr[$i])
// echo " $i: ",$arr[$i],"
";
// }
if(validate_simple_expression($arr[3])!=0)
{
return -1;
}
$expression=$arr[1]."0".$arr[6];
}
else
{
$ok=1;
}
}
// echo "Result:$expression
";
$ok=0;
while($ok==0)
{
// Replace all with 0
// echo "Expression:$expression
";
$arr="";
// The minus sing '-' must be the last one in the list, otherwise it won't work!
if (eregi('^((.)*)([0-9\.]+[A-Z]{0,1})[ ]*([\&\|\>\<\=\+\*\/\#[.-.]]{1})[ ]*([0-9\.]+[A-Z]{0,1})((.)*)$', $expression, $arr))
{
// echo "OK
";
// for($i=0;$i<50;$i++)
// {
// if($arr[$i]!="")
// echo " $i: ",$arr[$i],"
";
// }
if(validate_float($arr[3])!=0)
{
error("[".$arr[3]."] is not a float");
return -1;
}
if(validate_float($arr[5])!=0)
{
error("[".$arr[5]."] is not a float");
return -1;
}
$expression=$arr[1]."(0)".$arr[6];
}
else
{
$ok=1;
}
// Replace all (float) with 0
// echo "Expression2:[$expression]
";
$arr="";
if (eregi('^((.)*)(\(([ 0-9\.]+)\))((.)*)$', $expression, $arr))
{
// echo "OK
";
// for($i=0;$i<30;$i++)
// {
// if($arr[$i]!="")
// echo " $i: ",$arr[$i],"
";
// }
if(validate_float($arr[4])!=0)
{
error("[".$arr[4]."] is not a float");
return -1;
}
$expression=$arr[1]."0".$arr[5];
$ok=0;
}
else
{
$ok=1;
}
}
$exp_host = DBfetch($exp_hosts);
if(!$exp_host)
{
error("Incorrect trigger expression. Incorrect host is used.");
return 1;
}
else
{
$rows=0;
unset($fail);
do
{
if($exp_host["status"]==HOST_STATUS_TEMPLATE)
{
$fail=1;
}
$rows++;
} while($exp_host = DBfetch($exp_hosts));
if(isset($fail) && ($rows>1))
{
error("Incorrect trigger expression. You can't use template hosts".
" in mixed expressions.");
return 1;
}
}
if($expression=="0")
{
return 0;
}
error("Incorrect trigger expression '$expression'");
return 1;
}
function add_trigger(
$expression, $description, $priority, $status,
$comments, $url, $deps=array(), $templateid=0)
{
if(!is_null($expression)) if(validate_expression($expression)) return FALSE;
$triggerid=get_dbid("triggers","triggerid");
$result=DBexecute("insert into triggers".
" (triggerid,description,priority,status,comments,url,value,error,templateid)".
" values ($triggerid,".zbx_dbstr($description).",$priority,$status,".zbx_dbstr($comments).",".
"".zbx_dbstr($url).",2,'Trigger just added. No status update so far.',$templateid)");
if(!$result)
{
return $result;
}
add_event($triggerid,TRIGGER_VALUE_UNKNOWN);
$expression = implode_exp($expression,$triggerid);
DBexecute("update triggers set expression=".zbx_dbstr($expression)." where triggerid=$triggerid");
reset_items_nextcheck($triggerid);
foreach($deps as $val)
{
$result = add_trigger_dependency($triggerid, $val);
}
$trig_hosts = get_hosts_by_triggerid($triggerid);
$trig_host = DBfetch($trig_hosts);
if($result)
{
$msg = "Added trigger '".$description."'";
if($trig_host)
{
$msg .= " to host '".$trig_host["host"]."'";
}
info($msg);
}
if($trig_host)
{// create trigger for childs
$child_hosts = get_hosts_by_templateid($trig_host["hostid"]);
while($child_host = DBfetch($child_hosts))
{
$result = copy_trigger_to_host($triggerid, $child_host["hostid"]);
if(!$result){
if($templateid == 0)
{ // delete main trigger (and recursively childs)
delete_trigger($triggerid);
}
return $result;
}
}
}
return $triggerid;
}
function get_trigger_dependences_by_triggerid($triggerid)
{
$result = array();
$db_deps = DBselect("select * from trigger_depends where triggerid_down=".$triggerid);
while($db_dep = DBfetch($db_deps))
array_push($result, $db_dep["triggerid_up"]);
return $result;
}
function copy_trigger_to_host($triggerid, $hostid, $copy_mode = false)
{
$trigger = get_trigger_by_triggerid($triggerid);
$deps = get_trigger_dependences_by_triggerid($triggerid);
$host_triggers = get_triggers_by_hostid($hostid, "no");
while($host_trigger = DBfetch($host_triggers))
{
if($host_trigger["templateid"] != 0) continue;
if(cmp_triggers($triggerid, $host_trigger["triggerid"])) continue;
// link not linked trigger with same expression
return update_trigger(
$host_trigger["triggerid"],
NULL, // expression
$trigger["description"],
$trigger["priority"],
NULL, // status
$trigger["comments"],
$trigger["url"],
$deps,
$copy_mode ? 0 : $triggerid);
}
$newtriggerid=get_dbid("triggers","triggerid");
$result = DBexecute("insert into triggers".
" (triggerid,description,priority,status,comments,url,value,expression,templateid)".
" values ($newtriggerid,".zbx_dbstr($trigger["description"]).",".$trigger["priority"].",".
$trigger["status"].",".zbx_dbstr($trigger["comments"]).",".
zbx_dbstr($trigger["url"]).",2,'{???:???}',".
($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 dependences
delete_dependencies_by_triggerid($newtriggerid);
$db_deps = DBselect("select * from trigger_depends where".
" triggerid_down=".$triggerid);
while($db_dep = DBfetch($db_deps))
{
add_trigger_dependency($newtriggerid, $db_dep["triggerid_up"]);
}
info("Added trigger '".$trigger["description"]."' to host '".$host["host"]."'");
// 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;
}
# Translate {10}>10 to something like localhost:procload.last(0)>10
function explode_exp ($expression, $html,$template=false)
{
# echo "EXPRESSION:",$expression,"
";
$functionid='';
$exp='';
$state='';
for($i=0,$max=strlen($expression); $i<$max; $i++)
{
if($expression[$i] == '{')
{
$functionid='';
$state='FUNCTIONID';
continue;
}
if($expression[$i] == '}')
{
$state='';
if($functionid=="TRIGGER.VALUE")
{
$exp .= "{".$functionid."}";
}
else if($function_data = DBfetch(DBselect('select h.host,i.key_,f.function,f.parameter,i.itemid,i.value_type'.
' from items i,functions f,hosts h'.
' where functionid='.$functionid.' and i.itemid=f.itemid and h.hostid=i.hostid')))
{
if($template) $function_data["host"] = '{HOSTNAME}';
if($html == 0)
{
$exp .= "{".$function_data["host"].":".$function_data["key_"].".".
$function_data["function"]."(".$function_data["parameter"].")}";
}
else
{
$link = new CLink($function_data["host"].":".$function_data["key_"],
'history.php?action='.( $function_data["value_type"] ==0 ? 'showvalues' : 'showgraph').
'&itemid='.$function_data['itemid']);
$exp .= $link->ToString().'.'.bold($function_data["function"].'(').$function_data["parameter"].bold(')');
}
}
else
{
if($html == 1) $exp .= "";
$exp .= "*ERROR*";
if($html == 1) $exp .= "";
}
continue;
}
if($state == "FUNCTIONID")
{
$functionid=$functionid.$expression[$i];
continue;
}
$exp=$exp.$expression[$i];
}
# echo "EXP:",$exp,"
";
return $exp;
}
function implode_exp ($expression, $triggerid)
# Translate localhost:procload.last(0)>10 to {12}>10
{
// echo "Expression:$expression
";
$exp='';
$state="";
for($i=0,$max=strlen($expression); $i<$max; $i++)
{
if($expression[$i] == '{')
{
if($state=="")
{
$host='';
$key='';
$function='';
$parameter='';
$state='HOST';
continue;
}
}
// Processing of macros {TRIGGER.VALUE}
if( ($expression[$i] == '}')&&($state=="HOST") )
{
$exp = $exp."{".$host."}";
$state="";
continue;
}
if( ($expression[$i] == '}')&&($state=="") )
{
// echo "HOST:$host
";
// echo "KEY:$key
";
// echo "FUNCTION:$function
";
// echo "PARAMETER:$parameter
";
$state='';
$res=DBselect("select i.itemid from items i,hosts h".
" where i.key_=".zbx_dbstr($key).
" and h.host=".zbx_dbstr($host).
" and h.hostid=i.hostid");
$row=DBfetch($res);
$itemid=$row["itemid"];
$functionid = get_dbid("functions","functionid");
$res=DBexecute("insert into functions (functionid,itemid,triggerid,function,parameter)".
" values ($functionid,$itemid,$triggerid,".zbx_dbstr($function).",".
zbx_dbstr($parameter).")");
if(!$res)
{
return $res;
}
$exp=$exp.'{'.$functionid.'}';
continue;
}
if($expression[$i] == '(')
{
if($state == "FUNCTION")
{
$state='PARAMETER';
continue;
}
}
if($expression[$i] == ')')
{
if($state == "PARAMETER")
{
$state='';
continue;
}
}
if(($expression[$i] == ':') && ($state == "HOST"))
{
$state="KEY";
continue;
}
if($expression[$i] == '.')
{
if($state == "KEY")
{
$state="FUNCTION";
continue;
}
// Support for '.' in KEY
if($state == "FUNCTION")
{
$state="FUNCTION";
$key=$key.".".$function;
$function="";
continue;
}
}
if($state == "HOST")
{
$host=$host.$expression[$i];
continue;
}
if($state == "KEY")
{
$key=$key.$expression[$i];
continue;
}
if($state == "FUNCTION")
{
$function=$function.$expression[$i];
continue;
}
if($state == "PARAMETER")
{
$parameter=$parameter.$expression[$i];
continue;
}
$exp=$exp.$expression[$i];
}
return $exp;
}
function update_trigger_comments($triggerid,$comments)
{
return DBexecute("update triggers set comments=".zbx_dbstr($comments).
" where triggerid=$triggerid");
}
# Update Trigger status
function update_trigger_status($triggerid,$status)
{
// first update status for child triggers
$db_chd_triggers = get_triggers_by_templateid($triggerid);
while($db_chd_trigger = DBfetch($db_chd_triggers))
{
update_trigger_status($db_chd_trigger["triggerid"],$status);
}
add_event($triggerid,TRIGGER_VALUE_UNKNOWN);
return DBexecute("update triggers set status=$status where triggerid=$triggerid");
}
# "Processor load on {HOSTNAME} is 5" to "Processor load on www.sf.net is 5"
function expand_trigger_description_by_data($row)
{
if($row)
{
if(is_null($row["host"])) $row["host"] = "{HOSTNAME}";
$description = str_replace("{HOSTNAME}", $row["host"],$row["description"]);
}
else
{
$description = "*ERROR*";
}
return $description;
}
function expand_trigger_description_simple($triggerid)
{
return expand_trigger_description_by_data(
DBfetch(
DBselect("select distinct t.description,h.host".
" from triggers t left join functions f on t.triggerid=f.triggerid ".
" left join items i on f.itemid=i.itemid ".
" left join hosts h on i.hostid=h.hostid ".
" where t.triggerid=$triggerid")
)
);
}
function expand_trigger_description($triggerid)
{
$description=expand_trigger_description_simple($triggerid);
$description=stripslashes(htmlspecialchars($description));
return $description;
}
function update_trigger_value_to_unknown_by_hostid($hostid)
{
$result = DBselect("select distinct t.triggerid".
" from hosts h,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");
$now = time();
while($row=DBfetch($result))
{
if(!add_event($row["triggerid"],TRIGGER_VALUE_UNKNOWN,$now)) continue;
DBexecute('update triggers set value='.TRIGGER_VALUE_UNKNOWN.' where triggerid='.$row["triggerid"]);
}
}
function add_event($triggerid, $value, $time=NULL)
{
if(is_null($time)) $time = time();
$result = DBselect('select value from events where triggerid='.$triggerid.' order by clock desc',1);
$last_value = DBfetch($result);
if($last_value)
{
if($value == $last_value['value'])
return false;
}
$eventid = get_dbid("events","eventid");
$result = DBexecute('insert into events(eventid,triggerid,clock,value) values('.$eventid.','.$triggerid.','.$time.','.$value.')');
if($value == TRIGGER_VALUE_FALSE || $value == TRIGGER_VALUE_TRUE)
{
DBexesute('update alerts set retries=3,error=\'Trigger changed its status. WIll not send repeats.\''.
' where triggerid='.$triggerid.' and repeats>0 and status='.ALERT_STATUS_NOT_SENT);
}
return true;
}
function add_trigger_dependency($triggerid,$depid)
{
$result=insert_dependency($triggerid,$depid);;
if(!$result)
{
return $result;
}
add_additional_dependencies($triggerid,$depid);
return $result;
}
# Delete Trigger definition
function delete_trigger($triggerid)
{
// first delete child triggers
$db_triggers= get_triggers_by_templateid($triggerid);
while($db_trigger = DBfetch($db_triggers))
{// recursion
$result = delete_trigger($db_trigger["triggerid"]);
if(!$result) return $result;
}
// get hosts before functions deletion !!!
$trig_hosts = get_hosts_by_triggerid($triggerid);
$result = delete_dependencies_by_triggerid($triggerid);
if(!$result) return $result;
DBexecute("delete from trigger_depends where triggerid_up=$triggerid");
$result=delete_function_by_triggerid($triggerid);
if(!$result) return $result;
$result=delete_events_by_triggerid($triggerid);
if(!$result) return $result;
$result=delete_services_by_triggerid($triggerid);
if(!$result) return $result;
$result=delete_sysmaps_elements_with_triggerid($triggerid);
if(!$result) return $result;
DBexecute("delete from alerts where triggerid=$triggerid");
DBexecute("update sysmaps_links set triggerid=NULL where triggerid=$triggerid");
$db_actions = DBselect("select distinct c.actionid from conditions c, triggers t".
" where c.conditiontype=".CONDITION_TYPE_TRIGGER.
" and c.value=t.triggerid and t.triggerid=".$triggerid);
while($db_action = DBfetch($db_actions))
{
DBexecute("update actions set status=".ACTION_STATUS_DISABLED.
" where actionid=".$db_action["actionid"]);
}
$trigger = get_trigger_by_triggerid($triggerid);
$result = DBexecute("delete from triggers where triggerid=$triggerid");
if($result)
{
$msg = "Trigger '".$trigger["description"]."' deleted";
$trig_host = DBfetch($trig_hosts);
if($trig_host)
{
$msg .= " from host '".$trig_host["host"]."'";
}
info($msg);
}
return $result;
}
# Update Trigger definition
function update_trigger($triggerid,$expression=NULL,$description=NULL,$priority=NULL,$status=NULL,
$comments=NULL,$url=NULL,$deps=array(),$templateid=0)
{
$trigger = get_trigger_by_triggerid($triggerid);
$trig_hosts = get_hosts_by_triggerid($triggerid);
$trig_host = DBfetch($trig_hosts);
if(is_null($expression))
{
$expression = explode_exp($trigger["expression"],0);
}
else
{
if(validate_expression($expression))
return FALSE;
}
$exp_hosts = get_hosts_by_expression($expression);
$chd_hosts = get_hosts_by_templateid($trig_host["hostid"]);
if(DBfetch($chd_hosts))
{
$exp_host = DBfetch($exp_hosts);
$db_chd_triggers = get_triggers_by_templateid($triggerid);
while($db_chd_trigger = DBfetch($db_chd_triggers))
{
$chd_trig_hosts = get_hosts_by_triggerid($db_chd_trigger["triggerid"]);
$chd_trig_host = DBfetch($chd_trig_hosts);
$newexpression = str_replace(
"{".$exp_host["host"].":",
"{".$chd_trig_host["host"].":",
$expression);
// recursion
update_trigger(
$db_chd_trigger["triggerid"],
$newexpression,
$description,
$priority,
NULL, // status
$comments,
$url,
$deps,
$triggerid);
}
}
$result=delete_function_by_triggerid($triggerid);
if(!$result)
{
return $result;
}
$expression = implode_exp($expression,$triggerid);
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($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);
delete_dependencies_by_triggerid($triggerid);
foreach($deps as $val)
{
$result=add_trigger_dependency($triggerid, $val);
}
if($result)
{
$trig_hosts = get_hosts_by_triggerid($triggerid);
$msg = "Trigger '".$trigger["description"]."' updated";
$trig_host = DBfetch($trig_hosts);
if($trig_host)
{
$msg .= " from host '".$trig_host["host"]."'";
}
info($msg);
}
return $result;
}
function check_right_on_trigger_by_triggerid($permission,$triggerid,$accessible_hosts=null)
{
$trigger_data = DBfetch(DBselect('select expression from triggers where triggerid='.$triggerid));
if(!$trigger_data) return false;
return check_right_on_trigger_by_expression($permission, explode_exp($trigger_data['expression'], 0), $accessible_hosts);
}
function check_right_on_trigger_by_expression($permission,$expression,$accessible_hosts=null)
{
if(is_null($accessible_hosts))
{
global $USER_DETAILS;
$accessible_hosts = get_accessible_hosts_by_user($USER_DETAILS, $permission, null, PERM_RES_IDS_ARRAY);
}
if(!is_array($accessible_hosts)) $accessible_hosts = explode(',', $accessible_hosts);
$db_hosts = get_hosts_by_expression($expression);
while($host_data = DBfetch($db_hosts))
{
if(!in_array($host_data['hostid'], $accessible_hosts)) return false;
}
return true;
}
function delete_dependencies_by_triggerid($triggerid)
{
$db_deps = DBselect("select triggerid_up, triggerid_down from trigger_depends".
" where triggerid_down=".$triggerid);
while($db_dep = DBfetch($db_deps))
{
delete_trigger_dependency($db_dep["triggerid_down"],$db_dep["triggerid_up"]);
}
return TRUE;
}
function delete_trigger_dependency($triggerid_down, $triggerid_up)
{
$result = DBselect("select triggerid_up from trigger_depends".
" where triggerid_up=$triggerid_up and triggerid_down=$triggerid_down");
while($row=DBfetch($result))
{
DBexecute("update triggers set dep_level=dep_level-1".
" where triggerid=".$row["triggerid_up"]);
}
DBexecute("delete from trigger_depends".
" where triggerid_up=$triggerid_up and triggerid_down=$triggerid_down");
return TRUE;
}
function insert_dependency($triggerid_down,$triggerid_up)
{
$triggerdepid = get_dbid("trigger_depends","triggerdepid");
$result=DBexecute("insert into trigger_depends (triggerdepid,triggerid_down,triggerid_up)".
" values ($triggerdepid,$triggerid_down,$triggerid_up)");
if(!$result)
{
return $result;
}
return DBexecute("update triggers set dep_level=dep_level+1 where triggerid=$triggerid_up");
}
// If 1 depends on 2, and 2 depends on 3, then add dependency 1->3
function add_additional_dependencies($triggerid_down,$triggerid_up)
{
$result=DBselect("select triggerid_down from trigger_depends".
" where triggerid_up=$triggerid_down");
while($row=DBfetch($result))
{
insert_dependency($row["triggerid_down"],$triggerid_up);
add_additional_dependencies($row["triggerid_down"],$triggerid_up);
}
$result=DBselect("select triggerid_up from trigger_depends where triggerid_down=$triggerid_up");
while($row=DBfetch($result))
{
insert_dependency($triggerid_down,$row["triggerid_up"]);
add_additional_dependencies($triggerid_down,$row["triggerid_up"]);
}
}
function delete_function_by_triggerid($triggerid)
{
return DBexecute("delete from functions where triggerid=$triggerid");
}
function delete_events_by_triggerid($triggerid)
{
return DBexecute("delete from events where triggerid=$triggerid");
}
function delete_triggers_by_itemid($itemid)
{
$result=DBselect("select triggerid from functions where itemid=$itemid");
while($row=DBfetch($result))
{
if(!delete_trigger($row["triggerid"]))
{
return FALSE;
}
}
return TRUE;
}
# Delete Service definitions by triggerid
function delete_services_by_triggerid($triggerid)
{
$result = DBselect("select serviceid from services where triggerid=$triggerid");
while($row = DBfetch($result))
{
delete_service($row["serviceid"]);
}
return TRUE;
}
function cmp_triggers($triggerid1, $triggerid2) // compare EXPRESSION !!!
{
$trig1 = get_trigger_by_triggerid($triggerid1);
$trig2 = get_trigger_by_triggerid($triggerid2);
$trig_fnc1 = get_functions_by_triggerid($triggerid1);
$expr1 = $trig1["expression"];
while($fnc1 = DBfetch($trig_fnc1))
{
$trig_fnc2 = get_functions_by_triggerid($triggerid2);
while($fnc2 = DBfetch($trig_fnc2)){
if(strcmp($fnc1["function"],$fnc2["function"])) continue;
if($fnc1["parameter"] != $fnc2["parameter"]) continue;
$item1 = get_item_by_itemid($fnc1["itemid"]);
$item2 = get_item_by_itemid($fnc2["itemid"]);
if(strcmp($item1["key_"],$item2["key_"])) continue;
$expr1 = str_replace(
"{".$fnc1["functionid"]."}",
"{".$fnc2["functionid"]."}",
$expr1);
break;
}
}
return strcmp($expr1,$trig2["expression"]);
}
function delete_template_triggers($hostid, $templateid = null /* array format 'arr[id]=name' */, $unlink_mode = false)
{
$triggers = get_triggers_by_hostid($hostid);
while($trigger = DBfetch($triggers))
{
if($trigger["templateid"]==0) continue;
if($templateid != null)
{
$db_tmp_hosts = get_hosts_by_triggerid($trigger["templateid"]);
$tmp_host = DBfetch($db_tmp_hosts);
if(is_array($templateid))
{
if(!isset($templateid[$tmp_host["hostid"]]))
continue;
}
elseif($tmp_host["hostid"] != $templateid)
continue;
}
if($unlink_mode)
{
if(DBexecute("update triggers set templateid=0 where triggerid=".$trigger["triggerid"]))
{
info("Trigger '".$trigger["description"]."' unlinked");
}
}
else
{
delete_trigger($trigger["triggerid"]);
}
}
return TRUE;
}
function copy_template_triggers($hostid, $templateid = null /* array format 'arr[id]=name' */, $copy_mode = false)
{
if(null == $templateid)
{
$templateid = get_templates_by_hostid($hostid);;
}
if(is_array($templateid))
{
foreach($templateid as $id => $name)
copy_template_triggers($hostid, $id, $copy_mode); // attention recursion
return;
}
$triggers = get_triggers_by_hostid($templateid);
while($trigger = DBfetch($triggers))
{
copy_trigger_to_host($trigger["triggerid"], $hostid, $copy_mode);
}
}
function get_triggers_overview($groupid, $nodeid)
{
global $USER_DETAILS;
$table = new CTableInfo(S_NO_TRIGGERS_DEFINED);
if($groupid > 0)
{
$group_where = ',hosts_groups hg where hg.groupid='.$groupid.' and hg.hostid=h.hostid and';
} else {
$group_where = ' where';
}
$result=DBselect('select distinct t.description,t.value,t.priority,t.lastchange,h.hostid,h.host'.
' from hosts h,items i,triggers t, functions f '.$group_where.
' h.status='.HOST_STATUS_MONITORED.' and h.hostid=i.hostid and i.itemid=f.itemid and f.triggerid=t.triggerid'.
' and h.hostid in ('.get_accessible_hosts_by_user($USER_DETAILS,PERM_READ_ONLY, null, null, $nodeid).') '.
' and t.status='.TRIGGER_STATUS_ENABLED.' and i.status='.ITEM_STATUS_ACTIVE.
' order by t.description');
unset($triggers);
unset($hosts);
while($row = DBfetch($result))
{
$hosts[$row['host']] = $row['host'];
$triggers[$row['description']][$row['host']] = array(
'value' => $row['value'],
'lastchange' => $row['lastchange'],
'priority' => $row['priority']);
}
if(!isset($hosts))
{
return $table;
}
sort($hosts);
$header=array(new CCol(S_TRIGGERS,'center'));
foreach($hosts as $hostname)
{
$header=array_merge($header,array(new CImg('vtext.php?text='.$hostname)));
}
$table->SetHeader($header,'vertical_header');
foreach($triggers as $descr => $trhosts)
{
$table_row = array(nbsp($descr));
foreach($hosts as $hostname)
{
$style = NULL;
if(isset($trhosts[$hostname]))
{
switch($trhosts[$hostname]['value'])
{
case TRIGGER_VALUE_TRUE:
$style = get_severity_style($trhosts[$hostname]['priority']);
break;
case TRIGGER_VALUE_FALSE:
$style = 'normal';
default:
$style = 'unknown_trigger';
}
if((time(NULL)-$trhosts[$hostname]['lastchange'])<300) $style .= '_blink1';
elseif((time(NULL)-$trhosts[$hostname]['lastchange'])<900) $style .= '_blink2';
}
array_push($table_row,new CCol(SPACE,$style));
}
$table->AddRow($table_row);
}
return $table;
}
function get_function_by_functionid($functionid)
{
$result=DBselect("select * from functions where functionid=$functionid");
$row=DBfetch($result);
if($row)
{
return $row;
}
else
{
error("No function with functionid=[$functionid]");
}
return $item;
}
function calculate_availability($triggerid,$period_start,$period_end)
{
if(($period_start==0)&&($period_end==0))
{
$sql="select count(*) as cnt,min(clock) as minn,max(clock) as maxx from events where triggerid=$triggerid";
}
else
{
$sql="select count(*) as cnt,min(clock) as minn,max(clock) as maxx from events where triggerid=$triggerid and clock>=$period_start and clock<=$period_end";
}
$row=DBfetch(DBselect($sql));
if($row["cnt"]>0)
{
$min=$row["minn"];
$max=$row["maxx"];
}
else
{
if(($period_start==0)&&($period_end==0))
{
$max=time();
$min=$max-24*3600;
}
else
{
$ret["true_time"] = 0;
$ret["false_time"] = 0;
$ret["unknown_time"] = 0;
$ret["true"] = 0;
$ret["false"] = 0;
$ret["unknown"] = 100;
return $ret;
}
}
$result=DBselect("select clock,value from events where triggerid=$triggerid and clock>=$min and clock<=$max");
$state = -1;
$true_time = 0;
$false_time = 0;
$unknown_time = 0;
$time = $min;
if(($period_start==0)&&($period_end==0))
{
$max=time();
}
$rows=0;
while($row=DBfetch($result))
{
$clock=$row["clock"];
$value=$row["value"];
$diff=$clock-$time;
$time=$clock;
if($state==-1)
{
$state=$value;
if($state == 0)
{
$false_time+=$diff;
}
if($state == 1)
{
$true_time+=$diff;
}
if($state == 2)
{
$unknown_time+=$diff;
}
}
else if($state==0)
{
$false_time+=$diff;
$state=$value;
}
else if($state==1)
{
$true_time+=$diff;
$state=$value;
}
else if($state==2)
{
$unknown_time+=$diff;
$state=$value;
}
$rows++;
}
if($rows==0)
{
$trigger = get_trigger_by_triggerid($triggerid);
$state = $trigger['value'];
}
if($state==0)
{
$false_time=$false_time+$max-$time;
}
elseif($state==1)
{
$true_time=$true_time+$max-$time;
}
elseif($state==3)
{
$unknown_time=$unknown_time+$max-$time;
}
$total_time=$true_time+$false_time+$unknown_time;
if($total_time==0)
{
$ret["true_time"] = 0;
$ret["false_time"] = 0;
$ret["unknown_time"] = 0;
$ret["true"] = 0;
$ret["false"] = 0;
$ret["unknown"] = 100;
}
else
{
$ret["true_time"] = $true_time;
$ret["false_time"] = $false_time;
$ret["unknown_time"] = $unknown_time;
$ret["true"] = (100*$true_time)/$total_time;
$ret["false"] = (100*$false_time)/$total_time;
$ret["unknown"] = (100*$unknown_time)/$total_time;
}
return $ret;
}
?>