highlighted code
👤 admin
🔴 Admin
✍️ It's not important where you are, it's important with who you are and how you live with them.
⏳ Last active: 15 Apr 2025 at 16:00
📅 Created: 06 Mar 2025 at 04:05
👀 Viewed: 77 times
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
// List of IP addresses/hostnames to monitor
$addresses = [
'192.168.1.1' => 'Local Network',
'google.com' => 'Google',
];
// Function to check reachability (OS-aware)
function pingAddress($address) {
$os = strtoupper(substr(PHP_OS, 0, 3));
if ($os === 'WIN') {
$command = "ping -n 1 " . escapeshellarg($address); // Windows command
} else {
// Linux/Unix command with IPv4 and timeout
$command = "ping -4 -c 1 -W 2 " . escapeshellarg($address);
}
exec($command, $output, $result);
// Analyze output
if ($os === 'WIN') {
foreach ($output as $line) {
if (strpos($line, 'Destination host unreachable') !== false ||
strpos($line, 'Request timed out') !== false) {
return false;
}
}
return $result === 0;
} else {
// For Linux, check exit code and packet loss
foreach ($output as $line) {
if (strpos($line, '100% packet loss') !== false) {
return false;
}
}
return $result === 0;
}
}
// Email notification function
function sendEmail($subject, $body) {
$mail = new PHPMailer(true);
try {
// SMTP configuration
$mail->isSMTP();
$mail->Host = ''; // SMTP server address
$mail->SMTPAuth = true;
$mail->Username = ''; // SMTP username
$mail->Password = ''; // SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Encryption
$mail->Port = 587; // TCP port
// Encoding settings
$mail->CharSet = 'UTF-8';
// Sender information
$mail->setFrom('sonik@webleit.eu', 'Ping Monitor');
// Recipient list
$recipients = [
'user@mail.com' => 'User name 1',
'user2@mail.com' => 'User name 2',
];
foreach ($recipients as $email => $name) {
$mail->addAddress($email, $name);
}
// Email content
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->send();
echo 'Notification email sent successfully.';
} catch (Exception $e) {
echo "Email delivery failed: {$mail->ErrorInfo}";
}
}
// Read previous failures
$previousFailedAddresses = [];
if (file_exists('failed_addresses.txt')) {
$fileContent = file_get_contents('failed_addresses.txt');
if (!empty($fileContent)) {
$previousFailedAddresses = json_decode($fileContent, true);
if (!is_array($previousFailedAddresses)) {
$previousFailedAddresses = []; // Reset if invalid JSON
}
}
}
// Track current failures
$currentFailedAddresses = [];
// HTML output with auto-refresh
echo "<html><head>";
echo "<meta http-equiv='refresh' content='120'>"; // Auto-refresh every 2 minutes
echo "</head><body>";
echo "<table border='1' cellpadding='5' cellspacing='0'>";
$index = 0;
foreach ($addresses as $address => $description) {
if ($index % 5 == 0) echo "<tr>";
$isReachable = pingAddress($address);
$status = $isReachable ? 'Online' : 'Offline';
$color = $isReachable ? 'green' : 'red';
echo "<td style='background-color: $color; padding: 10px;'>";
echo "<strong>$address</strong><br>$description<br><em>$status</em>";
echo "</td>";
if (!$isReachable) {
$currentFailedAddresses[$address] = $description;
}
if (($index + 1) % 5 == 0) echo "</tr>";
$index++;
}
// Detect new outages
$newFailedAddresses = array_diff_key($currentFailedAddresses, $previousFailedAddresses);
if (!empty($newFailedAddresses)) {
$subject = "New Service Outages Detected";
$body = "New unreachable services:";
foreach ($newFailedAddresses as $address => $description) {
$body .= "- <strong>$address</strong> ($description)
";
}
$body .= "";
sendEmail($subject, $body);
}
// Detect recoveries
$recoveredAddresses = array_diff_key($previousFailedAddresses, $currentFailedAddresses);
if (!empty($recoveredAddresses)) {
$subject = "Service Restorations Detected";
$body = "Recovered services:";
foreach ($recoveredAddresses as $address => $description) {
$body .= "- <strong>$address</strong> ($description)
";
}
$body .= "";
sendEmail($subject, $body);
}
// Save current status
file_put_contents('failed_addresses.txt', json_encode($currentFailedAddresses));
// Close HTML table
echo "</table>";
echo "</body></html>";
If you want to comment: Login or Register