Um aluno me questionou se é possível fazer uma aplicação que monitore um servidor, através da resposta do mesmo a um ping.
Aceitei o desafio, e escrevi uma simples e didática aplicação que realiza este monitoramento, utilizando, de maneira simples, as classes de rede do .NET Framework.
1º temos de construir uma classe “Monitor”. ela conterá duas propriedades:
- IP: Uma string com o IP do servidor que será monitorado, ex: 10.1.1.5.
- Status: Um enumerador IPStatus, que contém todos os status do resultado de um ping, ex: Success, TimedOut, DestinationNetworkUnreachable, etc. Esta por sua vez é somente leitura, então só implementamos o “get” dela.
E finalmente um metodo “Monitorar()”, que executará o ping, com espera de no máximo 4s (4000 milisegundos), com intervalos de 1 segundo (1000 milisegundos) entre um disparo e outro. A execução desse método se da enquanto o retorno do pingo for igual a “Success”.
Acompanhe a classe implementada abaixo:
// –> Utilizar o namespace: System.Net.NetworkInformation;
public class Monitor
{
string ip;public string IP
{
get { return ip; }
set { ip = value; }
}IPStatus status;
public IPStatus Status
{
get { return status; }
}public void Monitorar()
{
Ping ping = new Ping();
PingReply resposta;do
{
resposta = ping.Send(ip, 4000);
Console.WriteLine(string.Format("Ping: {0}; Tempo de Resposta: {1}; Status: {2};", resposta.Address, resposta.RoundtripTime, resposta.Status));
Thread.Sleep(1000);
} while (resposta.Status == IPStatus.Success);status = resposta.Status;
}
}
Agora que já temos um monitor, vamos implementar uma classe responsável pelo envio de e-mail. Esse e-mail será enviado quando o monitor parar de monitorar, ou seja, quando o ping parar de responder.
Para esta classe “Email” temos três propriedades string, representando o e-mail de destino, título do e-mail e mensagem (corpo) do email.
Ela contém também um método “Enviar()”. Este por sua vez, criará a mensagem de envio com as propriedades informadas, mais o e-mail de origem. Finalmente configurará um objeto de SMTP, com os dados de um servidor de e-mail SMTP. Depois é só disparar o email. Acompanhe:
// –> Utilizar os namespaces: System.Net.Mail; System.Net;
public class Email
{
private string emailDestino;public string EmailDestino
{
get { return emailDestino; }
set { emailDestino = value; }
}private string titulo;
public string Titulo
{
get { return titulo; }
set { titulo = value; }
}private string mensagem;
public string Mensagem
{
get { return mensagem; }
set { mensagem = value; }
}public void Enviar()
{
MailMessage email = new MailMessage();
email.From = new MailAddress("seuemail@seuprovedor.com");
email.To.Add(emailDestino);
email.Subject = titulo;
email.Body = mensagem;SmtpClient smtp = new SmtpClient("smtp.seuhostsmtp.com.br");
smtp.Credentials = new NetworkCredential("usuário", "senha");
smtp.Send(email);
}
}
Com tudo o que precisamos resgistrado na orientação a objetos, basta consumi-los, olhe o exemplo do uso das classes:
class Program
{
static void Main(string[] args)
{
string ip;Console.WriteLine("Informe o IP do servidor que será monitorado: ");
ip = Console.ReadLine();Monitor monitor = new Monitor();
monitor.IP = ip;
monitor.Monitorar();Email email = new Email();
email.EmailDestino = "destino@email.com.br";
email.Titulo = "Servidor Parou";
email.Mensagem = string.Format("O servidor {0} parou de responder: {1}", ip, monitor.Status);
email.Enviar();Console.WriteLine("Monitoramento encerrado...");
Console.ReadKey();
}
}
Neste programa, é lido um ip que irá ser monitorado, criamos um objeto “monitor”, informamos este ip na sua propriedade, e mandamos monitorar. Quando ele encerrar, é porque o ping já não foi bem sucedido, então criamos um objeto “email”, “escrevemos o e-mail” e enviamos.
Aproveitem! :)
2 comentários:
Muito bom o código.
O legal é colocar esse programa rodando no próprio servidor, pois como fica ligado 24 hrs, assim que cair já manda o sinal.
Parabéns!
Ele não pode ficar no servidor, pois se a perda do sinal se der por falta de internet, como seria enviado o e-mail?
Postar um comentário