Ik heb nu het Noc-script maar ik mis servercheck.php :(
En hoe berekend je de gemidelde uptime?
Afdrukvoorbeeld
Ik heb nu het Noc-script maar ik mis servercheck.php :(
En hoe berekend je de gemidelde uptime?
Je checkt per minuut... Elke check sla je op. dus check++
Dan heb je ook nog uptime. Als hij up is geef je + 100 anders doe je + 0
Dan doe je uptime / checks = gemiddelde :)
Voorbeeld: http://noc.intronic.nl/
servercheck.php (deze is wel heel erg aangepast door mijzelf...)
PHP Code:<?php
include("config.php");
function checkserver($ip,$poort){
if($poort == 80){
$fp = fopen("http://". $ip ."/noc.php","r");
if(!$fp){
return false;
} else {
$content = trim(fgets($fp));
if($content > 100){
return false;
} else {
return true;
}
}
} elseif($poort == 3306){
$conn = fsockopen($ip,$poort,$errno,$err,5);
if(!$conn){
return false;
} else {
return true;
}
} elseif($poort == 21){
$conn = ftp_connect($ip);
if(!$conn){
return false;
} else {
return true;
}
} else {
$conn = fsockopen($ip,$poort,$errno,$err,5);
if(!$conn){
return false;
} else {
return true;
}
}
}
$servers = $db->query("SELECT * FROM servers");
while($row = $db->fetch($servers)){
$maand = date("m-Y");
$select = $db->query("SELECT * FROM uptime WHERE maand = '".$maand."' AND serverid = '".$row["serverid"]."'");
if($db->num($select) == "1") {
$data = $db->fetch($select);
$checks = $data['checks'];
$uptime = $data['uptime'];
} else {
$checks = "0";
$uptime = "0";
}
/*
Status 30 is goed te bereiken, 20 is 1x slecht te bereiken geweest,
status 10 is 2x slecht te bereiken geweest en status 0 is echt down.
*/
$check = checkserver($row["ip"], $row["poort"]);
if(!$check){
if($row["status"] == 30){
$status = 20;
$checks = $checks+1;
$uptime = $uptime+100;
$email = 0;
} elseif($row["status"] == 20) {
$status = 10;
$checks = $checks+1;
$uptime = $uptime+100;
$email = 0;
} elseif($row["status"] == 10) {
$status = 0;
$checks = $checks+1;
$uptime = $uptime+0;
$email = 1;
} else {
$status = 0;
$checks = $checks+1;
$uptime = $uptime+0;
$email = 0;
}
} else {
$status = 30;
$checks = $checks+1;
$uptime = $uptime+100;
$email = 0;
}
if($email == 1) {
$server = explode(".",$row['hostname']);
$onderwerp = strtoupper($server[0]).": ".$row['servicetype']." DOWN";
$to = $config_email1;
$header = "From: ".strtoupper($server[0])."\n";
$header .= "Bcc: ".$config_email2."\n";
mail($to,$onderwerp,"",$header);
}
$maand = date("m-Y");
$select = $db->query("SELECT * FROM uptime WHERE maand = '".$maand."' AND serverid = '".$row["serverid"]."'");
if($db->num($select) == "1") {
$db->query("UPDATE uptime SET uptime = '".$uptime."', checks = '".$checks."' WHERE serverid = '". $row["serverid"] ."' AND maand = '".$maand."'");
$db->query("UPDATE servers SET last_check = '".mktime()."', status = '".$status."' WHERE serverid = '".$row["serverid"]."'");
} else {
$db->query("INSERT INTO `uptime` (`uptimeid`, `serverid`, `maand`, `uptime`, `checks`) VALUES ('', '".$row["serverid"]."', '".$maand."', '".$uptime."', '".$checks."');");
$db->query("UPDATE servers SET last_check = '".mktime()."', status = '".$status."' WHERE serverid = '".$row["serverid"]."'");
}
}
?>
Graag ontopic..
Code:<?php
include("./inc/config.php");
function checkserver($ip,$poort){
if($poort == 80){
$fp = fopen("http://". $ip ."/noc.php","r");
if(!$fp){
return false;
} else {
$content = trim(fgets($fp));
if($content > 5){
// Load is hoger dan 5 waarschuwing sms sturen naar de beheerder
mysql_query("UPDATE `servers` SET `load`= '". $content ."' WHERE `ip` = '". $ip ."' LIMIT 1");
return false;
} else {
mysql_query("UPDATE `servers` SET `load`= '". $content ."' WHERE `ip` = '". $ip ."' LIMIT 1");
return true;
}
}
} elseif($poort == 3306){
$conn = fsockopen($ip,$poort,$errno,$err,5);
if(!$conn){
return false;
} else {
return true;
}
} elseif($poort == 21){
$conn = ftp_connect($ip);
if(!$conn){
return false;
} else {
ftp_close($conn);
return true;
}
} else {
$conn = fsockopen($ip,$poort,$errno,$err,5);
if(!$conn){
return false;
} else {
return true;
}
}
}
function sendsms($sms, $afzender, $sms_user, $sms_pass, $sms_url){
$select = mysql_query("SELECT `telefoon` FROM `ontvangers`");
while($row = mysql_fetch_array($select)){
$telefoon .= $row["telefoon"].",";
}
$sms = urlencode($sms);
$to = urlencode($telefoon);
$$afzender = urlencode($afzender);
$url = $sms_url."?username=". $sms_user ."&password=". $sms_pass ."&afzender=". $afzender ."&ontvanger=". $to ."&message=". $sms;
$result = implode ('', file($url));
}
$sms = NULL;
$select = mysql_query("SELECT * FROM `servers`");
while($row = mysql_fetch_array($select)){
/*
Status 30 is goed te bereiken, 20 is 1x slecht te bereiken geweest,
status 10 is 2x slecht te bereiken geweest en status 0 is echt down.
*/
$check = checkserver($row["ip"], $row["poort"]);
if(!$check){
if($row["status"] == 30){
$status = 20;
} elseif($row["status"] == 20){
$status = 10;
} elseif($row["status"] == 10){
$status = 0;
$last = mysql_query("SELECT `last_sms` FROM `servers` WHERE `serverid` = '". $row["serverid"] ."' LIMIT 1");
$fetch = mysql_fetch_array($last);
$diff = time() - $fetch["last_sms"];
if($diff > 1800){
$sms .= $row["ip"].":".$row["poort"]." is offline (". $row["servicetype"] .")";
mysql_query("UPDATE `servers` SET `last_sms`= UNIXTIMESTAMP () WHERE `serverid` = '". $row["serverid"] ."' LIMIT 1");
}
} else {
$status = 0;
}
} else {
$status = 30;
}
$sql = "UPDATE `servers` SET `last_check` = UNIX_TIMESTAMP(), `status` = '$status' WHERE `serverid` = '". $row["serverid"] ."' LIMIT 1";
if(!mysql_query($sql)){
echo mysql_error();
}
}
if(!empty($sms)){
mail($emailadres, $onderwerp, "Bericht: \n$sms", "From: $sitenaam");
// sendsms($sms, $afzender, $sms_user, $sms_pass, $sms_url);
}
unset($sms);
?>
Ik snap het :)
Ik zal cheks dan wel moeten omzetten naar minimum van een tijd(dag/maand) omdat ik nog geen aparte NOC-server heb.
En als deze server uitvald klop die cheks niet meer :D Krijg ik bijna altijd 100% :p
Bedank voor de informatie.
Rollerscapes kan jij dan het aangepaste noc script uploaden want ik heb ook wel interrese in een uptime report.Citaat:
Oorspronkelijk geplaatst door Rollerscapes
Trouwens weet iemand waarom er af en toe geen Load meer bij staat
Citaat:
Oorspronkelijk geplaatst door RayManZ
Worden jou uptime percentages per maand daar ook automatisch mee berekend?
Over de uptime: Ik gaat zelf iets maken, ik heb alleen een voorbeeld nodig.
Ik zelf werkt met php5 en postgresql8 en wat eigen gemaakte classes dus helaas kan ik het niet met julie delen.
Je kijkt gewoon hoeveel minuten er in een maand zitten en dat is dan je minimale totaal, dan kijk je hoeveel keer hij heeft geteld alles wat niet bestaat is weer een beetje minder.
Maar het probleem is (wat ik niet zeker weet) is dat als de server 5 minuten down was je gelijk 10% minder hebt maar dit weet ik niet helemaal zeker :)
aantal minuten in een maand van 30 dagen: 30*24*60 = 43200
5 minuten down = 100 - ( (5*100) / 43200 ) = 99,988% uptime
Ik zal dit weekend wel even mijn versie delen. Ik moet hem eerst alleen even ombouwen want er zit van alles in gebouwt wat niet van toepassing voor de rest...
Ik kijk trouwens alleen naar port 80 tegenwoordig en de load. Dat is het belangrijkste lijkt me...
uptime kan je toch ook gewoon berekenen aan de hand van het aantal gefaalde metingen?
Je moet immers de uptime berekenen, niet de downtime, en dat kan al vanaf meting 1.
Mwah aangezien mySQL toch nog af en toe wel eens op zn gat wil gaan houd ik die liever ook in de gaten. En de SMTP server ook... Zijn vaak kleine dingen om te fixen, maar grote punten voor klanten. Websites waarvan mySQL down is is heel groot irritatiepunt en meestal op te lossen door simpele restart.Citaat:
Oorspronkelijk geplaatst door RayManZ
ja maar het nadeel is alleen als je op port 3306 controleert dat je niet merkt als hij is vast gelopen... Dit heb ik ook al eens gehad. Dan moet je op die server een eigen script zette en die een query laten uitvoeren. Als deze dan mislukt een email verzenden naar jezelf... Dit is denk ik betrouwbaarder.
En wat als je dat email adres uit de database moet halen :D
SMTP kan volgens mij weinig mee fout gaan tenzij je hem kopeld aan Mysql :X
Ik heb op mijn test server de SMTP nu aan Postgresql gekopeld, nu nog op de productie server doorvoeren.
Voor totaale uptime kan je de ping(UDP) port moniteren.
Dan ben je een domme programmeur :DCitaat:
Oorspronkelijk geplaatst door Rollerscapes