$child){ //add childs
if($parentid == $child['serviceid']){
error('Service can\'t be parent and child in onetime.');
return FALSE;
}
}
if(is_null($triggerid) || $triggerid==0) $triggerid = 'NULL';
$serviceid=get_dbid("services","serviceid");
remove_service_links($serviceid); //removes all links with current serviceid
$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0)):(true); //add parent
foreach($childs as $id => $child){ //add childs
if(!isset($child['soft']) || empty($child['soft'])) $child['soft'] = 0;
$result = add_service_link($child['serviceid'],$serviceid,$child['soft']);
}
if(!$result){
return FALSE;
}
$result=DBexecute('INSERT INTO services (serviceid,name,status,triggerid,algorithm,showsla,goodsla,sortorder)'.
' VALUES ('.$serviceid.','.zbx_dbstr($name).',0 ,'.$triggerid.' ,'.zbx_dbstr($algorithm).
' ,'.$showsla.','.zbx_dbstr($goodsla).','.$sortorder.')');
if(!$result) return FALSE;
update_services_status_all(); // updating status to all services by the dependency
DBExecute('DELETE FROM services_times WHERE serviceid='.$serviceid);
foreach($service_times as $val){
$timeid = get_dbid('services_times','timeid');
$result = DBexecute('INSERT INTO services_times (timeid, serviceid, type, ts_from, ts_to, note)'.
' values ('.$timeid.','.$serviceid.','.$val['type'].','.$val['from'].','.$val['to'].','.zbx_dbstr($val['note']).')');
if(!$result)
{
delete_service($serviceid);
return FALSE;
}
}
return $serviceid;
}
function update_service($serviceid,$name,$triggerid,$algorithm,$showsla,$goodsla,$sortorder,$service_times=array(),$parentid,$childs){
foreach($childs as $id => $child){ //add childs
if($parentid == $child['serviceid']){
error('Service can\'t be parent and child in onetime.');
return FALSE;
}
}
remove_service_links($serviceid); //removes all links with current serviceid
$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0)):(true); //add parent
foreach($childs as $id => $child){ //add childs
if(empty($child['soft']) || !isset($child['soft'])) $child['soft'] = 0;
$result = add_service_link($child['serviceid'],$serviceid,$child['soft']);
}
if(!$result) return FALSE;
if(is_null($triggerid) || $triggerid==0) $triggerid = 'NULL';
$result = DBexecute('UPDATE services '.
' SET name='.zbx_dbstr($name).
',triggerid='.$triggerid.', status=0, algorithm='.$algorithm.', '.
' showsla='.$showsla.', goodsla='.$goodsla.', sortorder='.$sortorder.
' WHERE serviceid='.$serviceid);
update_services_status_all(); // updating status to all services by the dependency
DBexecute('DELETE FROM services_times WHERE serviceid='.$serviceid);
foreach($service_times as $val){
$timeid = get_dbid('services_times','timeid');
DBexecute('INSERT INTO services_times (timeid,serviceid, type, ts_from, ts_to, note)'.
' VALUES('.$timeid.','.$serviceid.','.$val['type'].','.$val['from'].','.$val['to'].','.zbx_dbstr($val['note']).')');
}
return $result;
}
function add_host_to_services($hostid, $serviceid){
$result = DBselect('SELECT distinct h.host,t.triggerid,t.description,t.expression '.
' FROM triggers t,hosts h,items i,functions f '.
' WHERE h.hostid='.$hostid.
' AND h.hostid=i.hostid '.
' AND i.itemid=f.itemid '.
' AND f.triggerid=t.triggerid '.
' AND '.DBin_node('t.triggerid', get_current_nodeid(false))
);
while($row=DBfetch($result)){
$serviceid2 = add_service(expand_trigger_description_by_data($row),$row["triggerid"],"on",0,"off",99);
add_service_link($serviceid2,$serviceid,0);
}
return 1;
}
function is_service_hardlinked($serviceid){
$row = DBfetch(DBselect("SELECT count(*) as cnt FROM services_links WHERE servicedownid=".$serviceid." and soft=0"));
if($row["cnt"]>0)
{
return TRUE;
}
return FALSE;
}
/*
* Function: get_service_status
*
* Description:
* retrive true status
*
* Author:
* Artem Suharev
*
* Comments:
*
*/
function get_service_status($serviceid,$algorithm,$triggerid=null,$status=0){
if(!$status && is_numeric($triggerid)){
$status = get_trigger_priority($triggerid);/* Do nothing */
}
if((SERVICE_ALGORITHM_MAX == $algorithm) || (SERVICE_ALGORITHM_MIN == $algorithm)){
if(SERVICE_ALGORITHM_MAX == $algorithm){
$result = DBselect('SELECT count(*) as count,max(status) as status'.
' FROM services s,services_links l '.
' WHERE l.serviceupid='.$serviceid.
' AND s.serviceid=l.servicedownid'
);
}
/* MIN otherwise */
else{
$result = DBselect('SELECT count(*) as count,min(status) as status'.
' FROM services s,services_links l '.
' WHERE l.serviceupid='.$serviceid.
' AND s.serviceid=l.servicedownid'
);
}
$rows = DBfetch($result);
if($rows && !is_null($rows['count']) && !is_null($rows['status'])){
if($rows['count'] > 0){
$status=$rows['status'];
}
}
}
return $status;
}
/******************************************************************************
* *
* Comments: !!! Don't forget sync code with C !!! *
* *
******************************************************************************/
function delete_service($serviceid){
$sql="DELETE FROM services_links WHERE servicedownid=$serviceid OR serviceupid=$serviceid";
if(!$result=DBexecute($sql)) return $result;
$sql="DELETE FROM services WHERE serviceid=$serviceid";
if(!$result=DBexecute($sql)) return $result;
$sql="DELETE FROM service_alarms WHERE serviceid=$serviceid";
if(!$result=DBexecute($sql)) return $result;
update_services_status_all();
return $result;
}
/*
* Function: clear_parents_from_trigger
*
* Description:
* removes any links between trigger and service if service is not leaf (treenode)
*
* Author:
* Artem Suharev
*
* Comments:
*
*/
function clear_parents_from_trigger($serviceid=0){
if($serviceid != 0){
$sql='UPDATE services '.
' SET triggerid = null '.
' WHERE serviceid = '.$serviceid;
DBexecute($sql);
return;
}
$sql = 'SELECT max(s.serviceid) as serviceid '.
' FROM services as s, services_links as sl '.
' WHERE s.serviceid = sl.serviceupid '.
' AND NOT(s.triggerid IS NULL) '.
' GROUP BY s.serviceid;';
$res = DBselect($sql);
while($rows = DBfetch($res)){
$sql='UPDATE services '.
' SET triggerid = null '.
' WHERE serviceid = '.$rows['serviceid'];
DBexecute($sql);
}
}
# Return TRUE if triggerid is a reason why the service is not OK
# Warning: recursive function
function does_service_depend_on_the_service($serviceid,$serviceid2)
{
$service=get_service_by_serviceid($serviceid);
if($service["status"]==0)
{
return FALSE;
}
if($serviceid==$serviceid2)
{
if($service["status"]>0)
{
return TRUE;
}
}
$result=DBselect("SELECT serviceupid FROM services_links WHERE servicedownid=$serviceid2 and soft=0");
while($row=DBfetch($result))
{
if(does_service_depend_on_the_service($serviceid,$row["serviceupid"]) == TRUE)
{
return TRUE;
}
}
return FALSE;
}
function service_has_parent($serviceid)
{
$row = DBfetch(DBselect("SELECT count(*) as cnt FROM services_links WHERE servicedownid=$serviceid"));
if($row["cnt"]>0)
{
return TRUE;
}
return FALSE;
}
function service_has_no_this_parent($parentid,$serviceid)
{
$row = DBfetch(DBselect("SELECT count(*) as cnt FROM services_links WHERE serviceupid=$parentid and servicedownid=$serviceid"));
if($row["cnt"]>0)
{
return FALSE;
}
return TRUE;
}
function add_service_link($servicedownid,$serviceupid,$softlink){
if( ($softlink==0) && (is_service_hardlinked($servicedownid)==true) ){
error("cannot link hardlinked service.");
return false;
}
if($servicedownid==$serviceupid){
error("cannot link service to itself.");
return false;
}
$linkid=get_dbid("services_links","linkid");
$sql="INSERT INTO services_links (linkid,servicedownid,serviceupid,soft) values ($linkid,$servicedownid,$serviceupid,$softlink)";
$result=DBexecute($sql);
if(!$result)
return $result;
return $linkid;
}
function update_service_link($linkid,$servicedownid,$serviceupid,$softlink){
if( ($softlink==0) && (is_service_hardlinked($servicedownid)==true) ){
return false;
}
if($servicedownid==$serviceupid){
error("cannot link service to itself.");
return false;
}
$sql="UPDATE services_links SET servicedownid=$servicedownid, serviceupid=$serviceupid, soft=$softlink WHERE linkid=$linkid";
return dbexecute($sql);
}
function remove_service_links($serviceid){
$query='DELETE
FROM services_links
WHERE serviceupid='.$serviceid.'
OR (servicedownid='.$serviceid.'
AND soft<>1)';
DBExecute($query);
}
function get_last_service_value($serviceid,$clock){
$sql="SELECT count(*) as cnt,max(clock) as maxx FROM service_alarms WHERE serviceid=$serviceid and clock<=$clock";
// echo " $sql
";
$result=DBselect($sql);
$row=DBfetch($result);
if($row["cnt"]>0)
{
$sql="SELECT value FROM service_alarms WHERE serviceid=$serviceid and clock=".$row["maxx"];
$result2=DBselect($sql);
// Assuring that we get very latest service value. There could be several with the same timestamp
// $value=DBget_field($result2,0,0);
while($row2=DBfetch($result2))
{
$value=$row2["value"];
}
}
else
{
$value=0;
}
return $value;
}
function expand_periodical_service_times(&$data,
$period_start, $period_end,
$ts_from, $ts_to,
$type='ut' /* 'ut' OR 'dt' */
)
{
/* calculate period FROM '-1 week' to know period name for $period_start */
for($curr = ($period_start - (7*24*3600)); $curr<=$period_end; $curr += 6*3600)
{
$curr_date = getdate($curr);
$from_date = getdate($ts_from);
if($curr_date['wday'] == $from_date['wday'])
{
$curr_from = mktime(
$from_date['hours'],$from_date['minutes'],$from_date['seconds'],
$curr_date['mon'],$curr_date['mday'],$curr_date['year']
);
$curr_to = $curr_from + ($ts_to - $ts_from);
$curr_from = max($curr_from, $period_start);
$curr_from = min($curr_from, $period_end);
$curr_to = max($curr_to, $period_start);
$curr_to = min($curr_to, $period_end);
$curr = $curr_to;
if(isset($data[$curr_from][$type.'_s']))
$data[$curr_from][$type.'_s'] ++;
else
$data[$curr_from][$type.'_s'] = 1;
if(isset($data[$curr_to][$type.'_e']))
$data[$curr_to][$type.'_e'] ++;
else
$data[$curr_to][$type.'_e'] = 1;
}
}
}
function calculate_service_availability($serviceid,$period_start,$period_end)
{
// $sql="SELECT count(*),min(clock),max(clock) FROM service_alarms WHERE serviceid=$serviceid and clock>=$period_start and clock<=$period_end";
/* FILL data */
/* structure of "$data"
* key - time stamp
* alarm - on/off status (0,1 - off; >1 - on)
* dt_s - count of downtime starts
* dt_e - count of downtime ends
* ut_s - count of uptime starts
* ut_e - count of uptime ends
*/
$data[$period_start]['alarm'] = get_last_service_value($serviceid,$period_start);
$service_alarms = DBselect("SELECT clock,value FROM service_alarms".
" WHERE serviceid=".$serviceid." and clock>=".$period_start." and clock<=".$period_end." order by clock");
/* add alarms */
while($db_alarm_row = DBfetch($service_alarms))
{
$data[$db_alarm_row['clock']]['alarm'] = $db_alarm_row['value'];
}
/* add periodical downtimes */
$service_times = DBselect('SELECT ts_from,ts_to FROM services_times WHERE type='.SERVICE_TIME_TYPE_UPTIME.
' and serviceid='.$serviceid);
if($db_time_row = DBfetch($service_times))
{
/* if exist any uptime - unmarked time is downtime */
$unmarked_period_type = 'dt';
do{
expand_periodical_service_times($data,
$period_start, $period_end,
$db_time_row['ts_from'], $db_time_row['ts_to'],
'ut');
}while($db_time_row = DBfetch($service_times));
}
else
{
/* if missed any uptime - unmarked time is uptime */
$unmarked_period_type = 'ut';
}
/* add periodical downtimes */
$service_times = DBselect('SELECT ts_from,ts_to FROM services_times WHERE type='.SERVICE_TIME_TYPE_DOWNTIME.
' and serviceid='.$serviceid);
while($db_time_row = DBfetch($service_times))
{
expand_periodical_service_times($data,
$period_start, $period_end,
$db_time_row['ts_from'], $db_time_row['ts_to'],
'dt');
}
/* add one-time downtimes */
$service_times = DBselect('SELECT ts_from,ts_to FROM services_times WHERE type='.SERVICE_TIME_TYPE_ONETIME_DOWNTIME.' and serviceid='.$serviceid);
while($db_time_row = DBfetch($service_times)){
if( ($db_time_row['ts_to'] < $period_start) || ($db_time_row['ts_from'] > $period_end)) continue;
if($db_time_row['ts_from'] < $period_start) $db_time_row['ts_from'] = $period_start;
if($db_time_row['ts_to'] > $period_end) $db_time_row['ts_to'] = $period_end;
if(isset($data[$db_time_row['ts_from']]['dt_s']))
$data[$db_time_row['ts_from']]['dt_s'] ++;
else
$data[$db_time_row['ts_from']]['dt_s'] = 1;
if(isset($data[$db_time_row['ts_to']]['dt_e']))
$data[$db_time_row['ts_to']]['dt_e'] ++;
else
$data[$db_time_row['ts_to']]['dt_e'] = 1;
}
if(!isset($data[$period_end])) $data[$period_end] = array();
/*
print('From: '.date('l d M Y H:i',$period_start).' To: '.date('l d M Y H:i',$period_end).BR);
$ut = 0;
$dt = 0;
foreach($data as $ts => $val)
{
print($ts);
print(" - [".date('l d M Y H:i',$ts)."]");
if(isset($val['ut_s'])) {print(' ut_s-'.$val['ut_s']); $ut+=$val['ut_s'];}
if(isset($val['ut_e'])) {print(' ut_e-'.$val['ut_e']); $ut-=$val['ut_e'];}
if(isset($val['dt_s'])) {print(' dt_s-'.$val['dt_s']); $dt+=$val['dt_s'];}
if(isset($val['dt_e'])) {print(' dt_e-'.$val['dt_e']); $dt-=$val['dt_e'];}
if(isset($val['alarm'])) {print(' alarm is '.$val['alarm']); }
print(' ut = '.$ut.' dt = '.$dt);
print(BR);
}
*/
/* calculate times */
ksort($data); /* sort by time stamp */
$dt_cnt = 0;
$ut_cnt = 0;
$sla_time = array(
'dt' => array('problem_time' => 0, 'ok_time' => 0),
'ut' => array('problem_time' => 0, 'ok_time' => 0)
);
$prev_alarm = $data[$period_start]['alarm'];
$prev_time = $period_start;
//print_r($data[$period_start]); print(BR);
if(isset($data[$period_start]['ut_s'])) $ut_cnt += $data[$period_start]['ut_s'];
if(isset($data[$period_start]['ut_e'])) $ut_cnt -= $data[$period_start]['ut_e'];
if(isset($data[$period_start]['dt_s'])) $dt_cnt += $data[$period_start]['dt_s'];
if(isset($data[$period_start]['dt_e'])) $dt_cnt -= $data[$period_start]['dt_e'];
foreach($data as $ts => $val)
{
if($ts == $period_start) continue; /* skip first data [already readed] */
if($dt_cnt > 0)
{
$period_type = 'dt';
}
else if($ut_cnt > 0)
{
$period_type = 'ut';
}
else /* dt_cnt=0 && ut_cnt=0 */
{
$period_type = $unmarked_period_type;
}
/* state=0,1 [OK] (1 - information severity of trigger), >1 [PROBLEMS] (trigger severity) */
if($prev_alarm > 1)
{
$sla_time[$period_type]['problem_time'] += $ts - $prev_time;
}
else
{
$sla_time[$period_type]['ok_time'] += $ts - $prev_time;
}
//print_r($val); print(BR);
if(isset($val['ut_s'])) $ut_cnt += $val['ut_s'];
if(isset($val['ut_e'])) $ut_cnt -= $val['ut_e'];
if(isset($val['dt_s'])) $dt_cnt += $val['dt_s'];
if(isset($val['dt_e'])) $dt_cnt -= $val['dt_e'];
if(isset($val['alarm'])) $prev_alarm = $val['alarm'];
$prev_time = $ts;
}
$sla_time['problem_time'] = &$sla_time['ut']['problem_time'];
$sla_time['ok_time'] = &$sla_time['ut']['ok_time'];
$sla_time['downtime_time'] = $sla_time['dt']['ok_time'] + $sla_time['dt']['problem_time'];
$full_time = $sla_time['problem_time'] + $sla_time['ok_time'];
if($full_time > 0)
{
$sla_time['problem'] = 100 * $sla_time['problem_time'] / $full_time;
$sla_time['ok'] = 100 * $sla_time['ok_time'] / $full_time;
}
else
{
$sla_time['problem'] = 100;
$sla_time['ok'] = 100;
}
return $sla_time;
}
function get_service_status_description($status)
{
$desc='OK';
if($status==5)
{
$desc='Disaster
';
}
elseif($status==4)
{
$desc='Serious'.SPACE.'problem
';
}
elseif($status==3)
{
$desc='Average'.SPACE.'problem
';
}
elseif($status==2)
{
$desc='Minor'.SPACE.'problem
';
}
elseif($status==1)
{
$desc='OK';
}
return $desc;
}
function get_num_of_service_childs($serviceid)
{
$row = DBfetch(DBselect("SELECT count(distinct servicedownid) as cnt FROM services_links ".
" WHERE serviceupid=".$serviceid));
return $row["cnt"];
}
function get_service_by_serviceid($serviceid)
{
$res = DBfetch(DBselect("SELECT * FROM services WHERE serviceid=".$serviceid));
if(!$res)
{
error("No service with serviceid=[".$serviceid."]");
return FALSE;
}
return $res;
}
function get_services_links_by_linkid($linkid)
{
$result=DBselect("SELECT * FROM services_links WHERE linkid=$linkid");
$res = DBfetch($result);
if(!$res)
{
error("No service linkage with linkid=[$linkid]");
return FALSE;
}
return $res;
}
function algorithm2str($algorithm)
{
if($algorithm == SERVICE_ALGORITHM_NONE)
{
return S_NONE;
}
elseif($algorithm == SERVICE_ALGORITHM_MAX)
{
return S_MAX_OF_CHILDS;
}
elseif($algorithm == SERVICE_ALGORITHM_MIN)
{
return S_MIN_OF_CHILDS;
}
return S_UNKNOWN;
}
function get_service_childs($serviceid,$soft=0){
$childs = array();
$query = 'SELECT sl.servicedownid '.
' FROM services_links sl '.
' WHERE sl.serviceupid = '.$serviceid.(($soft == 1)?(''):(' AND sl.soft <> 1'));
$res = DBSelect($query);
while($row = DBFetch($res)){
$childs[] = $row['servicedownid'];
$childs = array_merge($childs, get_service_childs($row['servicedownid']));
}
return $childs;
}
function createServiceTree(&$services,&$temp,$id=0,$serviceupid=0,$parentid=0, $soft=0, $linkid=''){
$rows = $services[$id];
if(($rows['serviceid'] > 0) && ($rows['caption'] != 'root')){
$rows['algorithm'] = algorithm2str($rows['algorithm']);
}
//---------------------------- if not leaf -----------------------------
$rows['parentid'] = $parentid;
if($soft == 0){
$rows['caption'] = new CLink($rows['caption'],'#',null,'javascript: call_menu(event, '.zbx_jsvalue($rows['serviceid']).','.zbx_jsvalue($rows['caption']).'); return false;');
$temp[$rows['serviceid']]=$rows;
if(isset($rows['childs'])){
foreach($rows['childs'] as $cid => $nodeid){
if(!isset($services[$nodeid['id']])){
continue;
}
if(isset($services[$nodeid['id']]['serviceupid'])){
createServiceTree($services,$temp,$nodeid['id'],$services[$nodeid['id']]['serviceupid'],$rows['serviceid'],$nodeid['soft'], $nodeid['linkid']);
}
}
}
} else {
$rows['caption'] = ''.$rows['caption'].'';
$temp[$rows['serviceid'].','.$linkid]=$rows;
}
return ;
}
function createShowServiceTree(&$services,&$temp,$id=0,$serviceupid=0,$parentid=0, $soft=0, $linkid=''){
$rows = $services[$id];
//---------------------------- if not leaf -----------------------------
$rows['parentid'] = $parentid;
if(($rows['serviceid'] > 0) && ($rows['caption'] != 'root')){
$rows['status'] = get_service_status_description($rows["status"]);
}
if($soft == 0){
$temp[$rows['serviceid']]=$rows;
if(isset($rows['childs'])){
foreach($rows['childs'] as $cid => $nodeid){
if(!isset($services[$nodeid['id']])){
continue;
}
if(isset($services[$nodeid['id']]['serviceupid'])){
createShowServiceTree($services,$temp,$nodeid['id'],$services[$nodeid['id']]['serviceupid'],$rows['serviceid'],$nodeid['soft'], $nodeid['linkid']); }
}
}
} else {
$rows['caption'] = new CSpan($rows['caption']);
$rows['caption']->AddOption('style','color: #888888;');
$temp[$rows['serviceid'].','.$linkid]=$rows;
}
return ;
}
function del_empty_nodes($services){
do{
unset($retry);
foreach($services as $id => $data){
if(isset($data['serviceupid']) && !isset($services[$data['serviceupid']])){
unset($services[$id]);
$retry = true;
//break;
}
}
} while(isset($retry));
return $services;
}
/******************************************************************************
* *
* Function: update_services_rec *
* *
* Purpose: re-calculate and updates status of the service and its childs *
* *
* Parameters: serviceid - item to update services for *
* *
* Return value: *
* *
* Author: Alexei Vladishev (PHP ver. by Artem Suharev) *
* *
* Comments: recursive function !!! Don't forget sync code with C !!! *
* *
******************************************************************************/
function update_services_rec($serviceid){
$result = DBselect('SELECT l.serviceupid,s.algorithm '.
' FROM services_links l,services s '.
' WHERE s.serviceid=l.serviceupid '.
' AND l.servicedownid='.$serviceid
);
while($rows=DBfetch($result)){
$serviceupid = $rows['serviceupid'];
$algorithm = $rows['algorithm'];
if(SERVICE_ALGORITHM_NONE == $algorithm){
/* Do nothing */
}
else if((SERVICE_ALGORITHM_MAX == $algorithm) || (SERVICE_ALGORITHM_MIN == $algorithm)){
$status = get_service_status($serviceupid,$algorithm);
add_service_alarm($serviceupid,$status,time());
DBexecute('UPDATE services SET status='.$status.' WHERE serviceid='.$serviceupid);
}
else{
error('Unknown calculation algorithm of service status ['.$algorithm.']');
return false;
}
}
$result = DBselect('SELECT serviceupid FROM services_links WHERE servicedownid='.$serviceid);
while($rows=DBfetch($result)){
$serviceupid = $rows['serviceupid'];
update_services_rec($serviceupid);
}
}
/******************************************************************************
* *
* Function: update_services *
* *
* Purpose: re-calculate and updates status of the service and its childs *
* on trigger priority change *
* *
* Parameters: serviceid - item to update services for *
* status - new status of the service *
* *
* Return value: *
* *
* Author: Alexei Vladishev (PHP ver. by Artem Suharev) *
* *
* Comments: !!! Don't forget sync code with C !!! *
* *
******************************************************************************/
function update_services($triggerid, $status){
DBexecute('UPDATE services SET status='.$status.' WHERE triggerid='.$triggerid);
$result = DBselect('SELECT serviceid,algorithm FROM services WHERE triggerid='.$triggerid);
while(($rows=DBfetch($result))){
$status = get_service_status($rows['serviceid'],$rows['algorithm']);
add_service_alarm($rows['serviceid'],$status,time());
update_services_rec($rows['serviceid']);
}
}
/*
* Function: update_services_status_all
*
* Description:
* Cleaning parent nodes from triggers, updating ALL services status.
*
* Author:
* Artem Suharev
*
* Comments: !!! Don't forget sync code with C !!!
*
*/
function update_services_status_all(){
clear_parents_from_trigger();
$result = DBselect('SELECT s.serviceid,s.algorithm,s.triggerid '.
' FROM services as s '.
' WHERE s.serviceid NOT IN (select distinct sl.serviceupid from services_links as sl)');
while($rows=DBfetch($result)){
$status = get_service_status($rows['serviceid'],$rows['algorithm'],$rows['triggerid']);
DBexecute('UPDATE services SET status = '.$status.' WHERE serviceid='.$rows['serviceid']);
add_service_alarm($rows['serviceid'],$status,time());
}
$result = DBselect('SELECT MAX(sl.servicedownid) as serviceid, sl.serviceupid '.
' FROM services_links AS sl '.
' WHERE sl.servicedownid NOT IN (select distinct sl.serviceupid from services_links as sl) '.
' GROUP BY sl.serviceupid');
while($rows=DBfetch($result)){
update_services_rec($rows['serviceid']);
}
}
/******************************************************************************
* *
* Comments: !!! Don't forget sync code with C !!! *
* *
******************************************************************************/
function latest_service_alarm($serviceid, $status){
$ret = false;
$result = DBselect('SELECT max(clock) as clock FROM service_alarms WHERE serviceid='.$serviceid);
$rows = DBfetch($result);
if(!$rows || is_null($rows['clock'])){
$ret = false;
}
else{
$clock=$rows['clock'];
$result = DBselect('SELECT value FROM service_alarms WHERE serviceid='.$serviceid.' AND clock='.$clock);
$rows = DBfetch($result);
if($rows && !is_null($rows['value'])){
if($rows['value'] == $status){
$ret = true;
}
}
}
return $ret;
}
/******************************************************************************
* *
* Comments: !!! Don't forget sync code with C !!! *
* *
******************************************************************************/
function add_service_alarm($serviceid,$status,$clock){
if(latest_service_alarm($serviceid,$status) == true){
return true;
}
DBexecute('INSERT INTO service_alarms (servicealarmid,serviceid,clock,value) VALUES ('.get_dbid('service_alarms','servicealarmid').','.$serviceid.','.$clock.','.$status.')');
return true;
}
?>