$child){ //add childs if((bccomp($parentid , $child['serviceid'])==0)){ 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((bccomp($parentid , $child['serviceid'])==0)){ 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: * Aly * * Comments: * Don't forget to sync code with C!!!! */ function get_service_status($serviceid,$algorithm,$triggerid=null,$status=0){ if(is_numeric($triggerid)){ $status = ($serv_status = get_service_status_of_trigger($triggerid))?$serv_status:$status; } if((SERVICE_ALGORITHM_MAX == $algorithm) || (SERVICE_ALGORITHM_MIN == $algorithm)){ $sort_order = (SERVICE_ALGORITHM_MAX == $algorithm)?' DESC ':' ASC '; $sql = 'SELECT s.status'. ' FROM services s,services_links l '. ' WHERE l.serviceupid='.$serviceid. ' AND s.serviceid=l.servicedownid '. ' ORDER BY s.status '.$sort_order; $result = DBselect($sql); $rows = DBfetch($result); if($rows && !zbx_empty($rows['status'])){ $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; $sql="DELETE FROM services_times 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: * Aly * * 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 s, services_links 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((bccomp($serviceid, $serviceid2)==0)){ 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 linkid FROM services_links WHERE servicedownid='.$serviceid)); if($row && !zbx_empty($row['linkid'])){ return TRUE; } return FALSE; } // Seems not used ant more! function service_has_no_this_parent($parentid,$serviceid) { $row = DBfetch(DBselect('SELECT linkid FROM services_links WHERE serviceupid='.$parentid.' AND servicedownid='.$serviceid)); if($row && !zbx_empty($row['linkid'])){ 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((bccomp($servicedownid, $serviceupid)==0)){ 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((bccomp($servicedownid, $serviceupid)==0)){ 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 VDI($time,$show=1){ $time = (is_array($time))?$time:getdate($time); return ($time['mon'].'/'.$time['mday'].'/'.$time['year'].' '.$time['hours'].':'.$time['minutes'].':'.$time['seconds']); } */ function expand_periodical_service_times(&$data, $period_start, $period_end, $ts_from, $ts_to, $type='ut' /* 'ut' OR 'dt' */ ) { //SDI("PERIOD: ".VDI($period_start).' - '.VDI($period_end)); //SDI('serv time: '.VDI($ts_from,0).' - '.VDI($ts_to,0)); /* calculate period FROM '-1 week' to know period name for $period_start */ for($curr = ($period_start - (7*24*3600)); $curr<=$period_end;$curr+=86400){ $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'] ); //SDI('FROM '.VDI($curr_from,0)); $curr_to = $curr_from + ($ts_to - $ts_from); $curr_from = max($curr_from, $period_start); $curr_from = min($curr_from, $period_end); //SDI('FROM2 '.VDI($curr_from,0)); //SDI('TO '.VDI($curr_to,0)); $curr_to = max($curr_to, $period_start); $curr_to = min($curr_to, $period_end); //SDI('TO2 '.VDI($curr_to,0).' : '.VDI($curr,0)); $curr = $curr_to; //SDI('CURR '.VDI($curr,0)); 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 servicealarmid,clock,value '. ' FROM service_alarms '. ' WHERE serviceid='.$serviceid. ' AND clock>='.$period_start. ' AND clock<='.$period_end. ' ORDER BY servicealarmid'); /* 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(); ksort($data); /* sort by time stamp */ /* if($serviceid == 1 || $serviceid == 2){ print('
'.$serviceid.':
'); print('From: '.date('l d M Y H:i',$period_start).' To: '.date('l d M Y H:i',$period_end).SBR); $ut = 0; $dt = 0; foreach($data as $ts => $val) { print($ts); print(" - [".date('l d M Y H:i:s',$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(SBR); } } //*/ /* calculate times */ $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(SBR); 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(SBR); 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; } /* if($serviceid == 1 || $serviceid == 2){ SDI($serviceid); SDI($sla_time); } //*/ $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=new CSpan(S_OK_BIG,'green'); if(TRIGGER_SEVERITY_DISASTER == $status){ $desc=new CTag('div','yes',S_DISASTER,'disaster'); } else if(TRIGGER_SEVERITY_HIGH == $status){ $desc=new CTag('div','yes',S_SERIOUS_PROBLEM,'high'); } else if(TRIGGER_SEVERITY_AVERAGE == $status){ $desc=new CTag('div','yes',S_AVERAGE_PROBLEM,'average'); } else if(TRIGGER_SEVERITY_WARNING == $status){ $desc=new CTag('div','yes',S_MINOR_PROBLEM,'warning'); } else if(TRIGGER_SEVERITY_INFORMATION == $status){ $desc=new CSpan(S_OK_BIG,'green'); } 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?'':' 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'] = new CSpan($rows['caption'],'unknown'); $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 Aly) * * * * 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); // ATANTION recursion!!! } } /****************************************************************************** * * * 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 Aly) * * * * 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'],$triggerid); 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: * Aly * * 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 s '. ' WHERE s.serviceid NOT IN (select distinct sl.serviceupid from services_links 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 sl '. ' WHERE sl.servicedownid NOT IN (select distinct sl.serviceupid from services_links 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 servicealarmid, value '. ' FROM service_alarms '. ' WHERE serviceid='.$serviceid. ' ORDER BY servicealarmid DESC',1); $rows = DBfetch($result); if($rows && !is_null($rows['value']) && ($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)){ return true; } $result = DBexecute('INSERT INTO service_alarms (servicealarmid,serviceid,clock,value) VALUES ('.get_dbid('service_alarms','servicealarmid').','.$serviceid.','.$clock.','.$status.')'); return $result; } ?>