5 de ago. de 2010

Monitorando o Servidor com C#

image

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.

image image

Aproveitem! :)

2 comentários:

Rafael disse...

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!

Anônimo disse...

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?