UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO UNMS: PLATAFORMA UNIFICADA PARA O GERENCIAMENTO DE REDES Área de Redes de Computadores por Axel Krieger Neto Fabrício Bortoluzzi, M.Sc. Orientador Itajaí (SC), fevereiro de 2009 UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO UNMS: PLATAFORMA UNIFICADA PARA O GERENCIAMENTO DE REDES Área de Redes de Computadores por Axel Krieger Neto Relatório apresentado à Banca Examinadora do Trabalho de Conclusão do Curso de Ciência da Computação para análise e aprovação. Orientador: Fabrício Bortoluzzi, M.Sc. Itajaí (SC), fevereiro de 2009 AGRADECIMENTOS Agradeço a: • Meu pai por seu apoio e compreensão, essenciais para a conclusão deste curso. • Minha mãe pelo grande incentivo dado durante toda a vida estudantil. • Orientador Fabrício Bortoluzzi que foi bastante requisitado por sugestões e criticas durante todo o projeto. • Ademir Goulart professor que me demonstrou pela primeira vez, o funcionamento de softwares de gerência de redes e que despertou a curiosidade sobre o assunto. • Francis Benito Odisi por autorizar a utilização de componentes de desenvolvimento gráfico e de acesso a banco de dados, ambos de sua autoria. • Todos os colegas do curso de Ciência da Computação sem os quais muitos conhecimentos deixariam de ser aprendidos. ii SUMÁRIO LISTA DE ABREVIATURAS................................................................... v LISTA DE FIGURAS................................................................................vi LISTA DE TABELAS .............................................................................viii RESUMO....................................................................................................ix ABSTRACT................................................................................................. x 1 INTRODUÇÃO ...................................................................................... 1 1.1 PROBLEMATIZAÇÃO................................................................................... 2 1.1.1 Formulação do Problema .............................................................................. 2 1.1.2 Solução Proposta ............................................................................................ 3 1.2 OBJETIVOS ..................................................................................................... 4 1.2.1 Objetivo Geral................................................................................................ 4 1.2.2 Objetivos Específicos...................................................................................... 4 1.3 METODOLOGIA............................................................................................. 4 1.4 ESTRUTURA DO TRABALHO ..................................................................... 5 2 FUNDAMENTAÇÃO TEÓRICA ........................................................ 6 2.1 .NET FRAMEWORK E PROJETO MONO .................................................. 6 2.1.1 .NET Framework ........................................................................................... 6 2.1.2 Projeto Mono.................................................................................................. 9 2.2 MODELOS, ARQUITETURAS E PROTOCOLOS DE GERÊNCIA........ 12 2.2.1 Conceitos....................................................................................................... 12 2.2.2 FCAPS: Fault, Configuration, Accounting, Performance and Security ... 14 2.2.3 CMIP/CMISE............................................................................................... 15 2.2.4 SNMP............................................................................................................ 17 2.3 SOFTWARES DE MONITORAMENTO..................................................... 27 2.3.1 Nagios............................................................................................................ 27 2.3.2 Cacti .............................................................................................................. 33 2.3.3 Tabela comparativa de softwares de gerência de redes ............................. 38 3 PROJETO ............................................................................................. 40 3.1 REQUISITOS FUNCIONAIS, NÃO FUNCIONAIS E REGRAS DE NEGÓCIO .............................................................................................................. 41 3.1.1 Motor ............................................................................................................ 42 3.1.2 Interface com o usuário ............................................................................... 43 3.2 DIAGRAMAS DE CASO DE USO ............................................................... 44 3.2.1 Motor ............................................................................................................ 44 3.2.2 Interface com o usuário ............................................................................... 45 3.3 DIAGRAMAS DE CLASSE .......................................................................... 60 3.3.1 Motor ............................................................................................................ 61 iii 3.3.2 Interface........................................................................................................ 62 3.4 DIAGRAMA ENTIDADE-RELACIONAL .................................................. 63 4 Desenvolvimento................................................................................... 64 4.1 CLASSE DE MANIPULAÇÃO DE DADOS DO PROTOCOLO SNMP... 65 4.1.1 Padrão TLV.................................................................................................. 66 4.1.2 Codificação/Decodificação BER .................................................................. 67 4.1.3 A biblioteca de classes resultante ................................................................ 68 4.2 O MOTOR DO UNMS................................................................................... 70 4.2.1 Checando através de ICMP......................................................................... 71 4.2.2 Checando serviços ........................................................................................ 72 4.2.3 Checando os OIDs........................................................................................ 72 4.3 DESENVOLVIMENTO DA INTERFACE .................................................. 73 4.3.1 Construção de gráficos na plataforma .NET .............................................. 74 4.3.2 Exibindo hosts no Google Earth.................................................................. 76 4.3.3 Desenvolvimento da auto-descoberta de dispositivos................................. 78 4.4 TESTES DO UNMS ....................................................................................... 79 4.4.1 Processo de testes da biblioteca de acesso SNMP ....................................... 79 4.4.2 Testes da ferramenta.................................................................................... 80 5 CONCLUSÕES .................................................................................... 83 REFERÊNCIAS BIBLIOGRÁFICAS ................................................... 85 iv LISTA DE ABREVIATURAS API ASN.1 BCL BER CLR CMIP CMIS CMISE CMOT EGP FCAPS GPL ICMP IETF IL ISO ITU ITU-T JIT LPP MIB NGWS NMS OID OSI PDU RFC SGBD SMI SNMP TCC TLV TMN UNIVALI UNMS XML Application Programming Interface Abstract Syntax Notation One Base Class Library Basic Encoding Rules Common Language Runtime Common Management Interface Protocol Common Management Information Service Common Management Information Service Element Common Management over TCP/IP Exterior Gateway Protocol Fault, Configuration, Accounting, Performance and Security General Public License Internet Control Message Protocol Internet Engineering Task Force Intermediate Language International Standards Organization International Telecommunication Union ITU Telecommunication Standardization Sector Just in Time Compilation Lightweight Presentation Protocol Management Information Base Next Generation Windows Services Network Management System Object Identifier Open Systems Interconnection Protocol Data Unit Release For Comments Sistema Gerenciador de Banco de Dados Structure of Managed Information Simple Network Management Protocol Trabalho de Conclusão de Curso Type, Length and Value Telecommunications Management Networks Universidade do Vale do Itajaí Unified Network Management System Extensible Markup Language v LISTA DE FIGURAS Figura 1. A Arquitetura .NET. .........................................................................................................8 Figura 2. Tratamento de arquivos para sistemas multi-plataforma....................................................9 Figura 3. GTK# no Linux. .............................................................................................................10 Figura 4. GTK# no Windows.........................................................................................................10 Figura 5. Código fonte para detecção de plataforma.......................................................................11 Figura 6. Resultado da detecção do sistema operacional no Linux. ................................................11 Figura 7. Resultado da detecção do sistema operacional no Windows XP. .....................................11 Figura 8. Status do desenvolvimento do namespace System. ..........................................................12 Figura 9. MIB do ambiente de gerenciamento Internet...................................................................13 Figura 10. Sistema de gerenciamento baseado em CMIP/CMIS.....................................................16 Figura 11. Relação entre o NMS e o Agente. .................................................................................18 Figura 12. A árvore de objetos da SMIv1.......................................................................................20 Figura 13. Primeiras linhas de uma MIB........................................................................................20 Figura 14. Formato da declaração de objetos gerenciáveis. ............................................................21 Figura 15. Definição de objetos gerenciáveis. ................................................................................21 Figura 16. Definição da Sequence IfEntry......................................................................................22 Figura 17. SMIv2 e novos ramos. ..................................................................................................22 Figura 18. Definição de objetos gerenciáveis na SMIv2.................................................................23 Figura 19. MIB-II. .........................................................................................................................25 Figura 20. Tela inicial do Nagios. ..................................................................................................30 Figura 21. Detalhes dos hosts. .......................................................................................................31 Figura 22. Detalhes dos serviços....................................................................................................32 Figura 23. Recurso “Mapa da Rede”..............................................................................................33 Figura 24. Tela inicial do Cacti......................................................................................................34 Figura 25. Cadastro e/ou alteração de um dispositivo de rede no Cacti...........................................37 Figura 26. Visualizando gráficos no Cacti......................................................................................38 Figura 27. Exemplo de uso. ...........................................................................................................40 Figura 28. Modelo em camadas. ....................................................................................................41 Figura 29. Diagrama de casos de uso do Motor..............................................................................44 Figura 30. Diagrama de casos de uso da interface. .........................................................................45 Figura 31. Interface de login. .........................................................................................................46 Figura 32. Interface principal do cadastro de hosts.........................................................................48 Figura 33. Interface de configuração de monitoramento.................................................................49 Figura 34. Interface de cadastro de serviços...................................................................................51 Figura 35. Interface de cadastro de usuários...................................................................................52 Figura 36. Interface de visualização de estados de hosts. ...............................................................53 Figura 37. Interface de visualização de estados dos serviços dos hosts. ..........................................54 Figura 38. Interface de visualização da topologia da rede...............................................................55 Figura 39. Interface para a chamada da visualização de hosts no Google Earth. .............................56 Figura 40. Visualização de gráficos. ..............................................................................................57 Figura 41. Visualização de eventos................................................................................................58 Figura 42. Detectando hosts...........................................................................................................60 Figura 43. Diagrama de classes do motor.......................................................................................61 Figura 44. Diagrama Entidade-Relacional......................................................................................63 Figura 45. Formato de desenvolvimento. .......................................................................................65 Figura 46. Datagrama SNMP.........................................................................................................66 vi Figura 47. Espaço community do SNMP. ......................................................................................66 Figura 48. Valor binário de sete em sete bits..................................................................................68 Figura 49. Resultado da codificação BER. .....................................................................................68 Figura 50. Métodos da classe de codificação/decodificação BER...................................................68 Figura 51. Métodos da classe de Snmp. .........................................................................................69 Figura 52. Métodos e atributos da classe SnmpData.......................................................................70 Figura 53. Métodos da classe ICMP. .............................................................................................71 Figura 54. Exemplo de uso para o .Net Charting e seu logotipo. ....................................................74 Figura 55. .Net Charting no Visual Studio. ....................................................................................74 Figura 56. .Net Charting e gráfico de barras...................................................................................75 Figura 57. Exemplo de uso do .Net Charting..................................................................................75 Figura 58. Exemplo de KML. ........................................................................................................77 Figura 59. Google Earth exibindo os hosts.....................................................................................78 Figura 60. Wireshark detectando os datagramas SNMP. ................................................................79 Figura 61. Comparando o datagrama correto (linha superior) e o incorreto (linha inferior).............80 Figura 62. O gráfico construído corretamente para medir a carga de processamento de um host. ...82 vii LISTA DE TABELAS Tabela 1. Tipos de dados SMIv1....................................................................................................19 Tabela 2. Novos tipos de dados da SMIv2 .....................................................................................23 Tabela 3. Aprimoramentos na definição de objetos. .......................................................................23 Tabela 4. Novos termos .................................................................................................................24 Tabela 5. Explicação dos ramos da MIB-II ....................................................................................25 Tabela 6. Tipos de traps.................................................................................................................27 Tabela 7. Lista dos principais plugins do Nagios ...........................................................................28 Tabela 8. Arquivos padrões de configuração do Nagios .................................................................29 Tabela 9. Tabela comparativa de softwares de gerência de redes....................................................39 Tabela 10. Bibliotecas SNMP pesquisadas.....................................................................................66 Tabela 11. Tipos de dado do protocolo SNMP utilizado no padrão TLV........................................67 Tabela 12. Dados sobre o segundo teste.........................................................................................81 viii RESUMO KRIEGER NETO, Axel. UNMS: Plataforma Unificada para Gerenciamento de Redes. Itajaí, 2008. 98 f. Trabalho de Conclusão de Curso (Graduação em Ciência da Computação)–Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí, Itajaí, 2009. Com a expansão das redes de computadores, tornou-se necessária a utilização de softwares que monitorem seus recursos. A necessidade de gerenciamento otimizado resultou em vários padrões, arquiteturas e protocolos de gerência além de softwares de monitoramento de estados e grafadores. Neste trabalho é demonstrado o processo de desenvolvimento do UNMS, um software de monitoramento de redes construído para a plataforma .NET e que une estes dois principais recursos. O estudo e compreensão do SNMP no nível de seus datagramas durante este processo bem como as regras básicas de codificação e o TLV foram documentados neste TCC. O resultado deste processo é um software de código aberto, com um motor que se torna multi-plataforma se utilizado junto com o projeto Mono. Palavras-chave: Gerência de Redes. Monitoramento de Redes. NMS. Plataforma .NET. SNMP. TLV. Regras básicas de codificação. Projeto Mono. ix ABSTRACT Expansion of computer networks has made it necessary to use software to monitor netwoirking resources. The need for optimal management resulted in several standards, architectures and protocols in addition to the monitoring softwares of state diagrams and graphers. This work demonstrates the development process of UNMS, a network monitoring software built for the .NET plataform and that unites those two main resources. The study and understanding at datagram level of SNMP during this process such as the basic encoding rules and TLV were documented in this paper. The result of this process is an open-source software, with a multi-plataform engine using Mono Project. Keywords: Network Management. Network Monitoring. NMS. .NET Plataform. SNMP. TLV. Baisc Encoding Rules. Mono Project. x 1 INTRODUÇÃO As redes de computadores se tornaram presentes na maioria das organizações modernas. Poucas áreas, em um período tão curto, apresentaram tantas revoluções tecnológicas quanto as Redes de Computadores (TANENBAUM, 2003). O uso e a dependência da Internet como instrumento de agilidade para os negócios faz com que as Redes de Computadores sejam altamente utilizadas. O número de sistemas que necessitam desta tecnologia vem aumentando significativamente, tornando necessária a existência de rotinas que monitoram os diversos equipamentos que compõem a rede, como roteadores, switches, access points, computadores, etc., garantindo que os dispositivos não estejam apenas funcionando, mas também operando de forma otimizada. Para este propósito, foram criados protocolos de gerência de redes como o SNMP (Simple Network Management Protocol – Protocolo Simples de Gerência de Redes) e o CMIP (Common Management Information Protocol – Protocolo de Gerência de Informações Comuns). O processo de monitoramento é considerado uma parte do processo de gerenciamento de rede. Gerenciamento de rede inclui o oferecimento, a integração e a coordenação de hardware, software e humanos, para monitorar, testar, consultar, configurar, analisar, avaliar e controlar os recursos da rede, e de elementos, para satisfazer às exigências operacionais, de desempenho e de qualidade de serviço em tempo real a um custo razoável (SAYDAM, 1996). O protocolo SNMP é o padrão de facto para a obtenção de tais indicadores (MAURO; SCHMIDT, 2001, tradução nossa) sendo, portanto, o protocolo adotado para a construção do UNMS. A tarefa de se encontrar um único software que trate todas as necessidades de gerenciamento não é trivial e geralmente frustra o administrador, já que dificilmente se encontra algum software que, ao mesmo tempo em que monitora os recursos, faz gráficos de carga e produz alertas. Além disso, os softwares de gerenciamento costumam ser de difícil configuração, já que a maioria é configurada através de arquivos de texto, que em muitos casos são muito complexos. Também existem os softwares de difícil utilização, obrigando o administrador da rede a estudar dezenas de linhas de comando para se extrair um mínimo de informação. Atualmente, existem vários softwares que monitoram a rede em utilização, como por exemplo, o Nagios (NAGIOS, 2008) e o Cacti (CACTI, 2008). Vários administradores de rede utilizam os dois em conjunto. O Nagios monitora os recursos da rede e emite alertas mediante estados indesejados. Já o Cacti grafa a carga e/ou utilização de recursos. Neste cenário, ocorre a dificuldade de configurar, já que ambos são manipulados em ambientes distintos, fazendo-se necessário o cadastro dos equipamentos duas vezes, ou mais, se o administrador considerar necessárias outras ferramentas de apoio à gestão da infra-estrutura, gerando redundância de dados entre outros problemas. Neste trabalho, é demonstrada a construção de um software chamado UNMS (Unified Network Management System – Sistema de Gerenciamento de Redes Unificado), cujo objetivo é de tratar a dependência de mais de um software de gerencia de redes evitando as redundâncias descritas. Destaca-se o estudo em mais baixo nível do protocolo SNMP. Isto foi necessário devido a falta de bibliotecas nativas do .NET que tratam deste protocolo. 1.1 PROBLEMATIZAÇÃO A problematização do presente trabalho será abordada através da: • Formulação do problema; e • Solução Proposta. 1.1.1 Formulação do Problema Pode-se considerar que existe, atualmente, uma grande dependência da Internet como ferramenta do dia-a-dia, resultando em um alto grau de uso de redes de computadores. Devido a este crescimento, houve a necessidade da criação de sistemas que monitoram e gerenciam todos os dispositivos de rede. Os sistemas atuais que monitoram a rede foram criados para solucionar parte dos problemas. Uns simplesmente monitoram os estados dos hosts, emitindo alertas ou apenas exibindo informações sobre eles. Outros ainda exibem informações de serviços de rede como um servidor Web por exemplo. Ainda existem sistemas que constroem gráficos de utilização de recursos, que permitem ao administrador de rede, visualizar as informações de um modo mais fácil e amigável, podendo resultar em tomadas de decisão mais eficientes e corretas. 2 Devido a existência de vários tipos de sistemas de monitoramento de redes, existe também a necessidade de possuir mais de um, com a finalidade de garantir um alto grau de controle sobre a rede. Ao utilizar vários sistemas de monitoramento o administrador da rede é forçado a configurar cada um individualmente, podendo resultar em inconsistências. Além disso, existem casos em que sistema é de difícil utilização, sendo apenas executado usando linhas de comando na maioria das vezes bastante extensas. Outros ainda são de difícil configuração, sendo ajustados por vários arquivos de texto, obrigando o administrador a estudá-los exaustivamente antes que consiga algum tipo de resultado. Analisando pelo lado do desenvolvedor de softwares, existe também uma ausência de bibliotecas de classes, que fazem com que a utilização do protocolo SNMP seja mais simples. A existência de bibliotecas que atinjam esta necessidade fará com que o desenvolvedor se preocupa mais com a lógica de negócio e reduzindo o tempo de construção de softwares. 1.1.2 Solução Proposta Neste trabalho foi construída uma ferramenta de gerência de redes de computadores que é fácil de utilizar, configurar e instalar. Além disto, o motor desta ferramenta é compatível com vários sistemas operacionais diferentes. O envio de alertas da ferramenta é limitado à exibição destes na tela e ao envio de emails. A solução sanou problemas das soluções similares analisadas. As soluções de monitoramento estudadas foram o Nagios (NAGIOS, 2008) e Cacti (CACTI, 2008). O motor do UNMS foi construído utilizando o projeto Mono, uma implementação de código aberto da plataforma .NET, que permite aos programadores criarem e executarem aplicações em vários sistemas operacionais como Linux, Mac OS X e o Windows. A linguagem que foi adotada para a construção da ferramenta é a C# e o SGBD (Sistema de Gerenciamento de Banco de Dados) será o PostgreSQL. Já a interface foi construída ignorando aspectos de compatibilidade com o projeto Mono. Buscando facilitar a utilização do SNMP na plataforma .NET bem como o correto funcionamento do motor, foi construído uma biblioteca de classes própria. Esta contém uma classe principal que manipula as informações do protocolo através de métodos estáticos, tornando seu uso direto e objetivo. 3 1.2 OBJETIVOS Os objetivos do trabalho são compostos pelo objetivo geral e por cinco objetivos específicos. 1.2.1 Objetivo Geral O objetivo geral deste trabalho é especificar e produzir um software de gerência para redes de computadores com interface gráfica local que contemple as tarefas de mapas de estado e grafagem de objetos, endereçando as principais dificuldades encontradas no uso dos softwares de mesmo propósito disponíveis para uso. 1.2.2 Objetivos Específicos Os objetivos específicos deste projeto de pesquisa são: • Listar as principais características de softwares de gerência de redes de código aberto; • Compreender a especificação .NET implementada através do projeto de código-fonte aberto Mono; • Especificar e construir o UNMS; • Testar e validar o comportamento do UNMS aplicando-o em uma infra-estrutura de rede; e • Documentar o desenvolvimento e os resultados do sistema. 1.3 Metodologia A realização da primeira parte do trabalho de conclusão de curso seguiu duas etapas principais: estudo e projeto. A primeira parte do trabalho teve como objeto de estudo a plataforma .NET e o projeto Mono. Além disso, foram estudadas as arquiteturas, protocolos e conceitos relacionados à gerência de redes, necessários para compreender como construir a solução proposta. Também, foram estudados outros aplicativos de gerência de redes, através dos quais foi possível enumerar vários recursos interessantes. Todos os estudos foram realizados utilizando a Internet e livros, e os resultados foram descritos na seção de Fundamentação Teórica. 4 A etapa de projeto teve como objetivo modelar o sistema através da construção de diagramas de caso de uso, classe e entidade-relacional. Os recursos mais importantes enumerados, ainda na etapa anterior, foram considerados na elaboração do projeto. A etapa de desenvolvimento foi a que englobou a criação das bibliotecas básicas e a construção do motor e da interface. Além disso, foram realizados estudos adicionais e mais aprofundados, necessários para a construção de alguns recursos. 1.4 Estrutura do trabalho A estrutura deste trabalho é composta por quatro seções principais: Introdução, Fundamentação Teórica, Projeto, Desenvolvimento e Conclusão. A Introdução aborda o trabalho como um todo, explicando o problema, mostrando os objetivos a serem alcançados e a solução proposta. A seção de Fundamentação Teórica aborda os assuntos necessários para construir a solução proposta. São demonstradas as principais arquiteturas e conceitos existentes na área de gerência de redes bem como a plataforma em que se deseja programar a solução, o Mono, traçando um comparativo simplificado entre este e a implementação de referência da Microsoft. A terceira seção aborda o projeto de software, que descreve os requisitos funcionais, requisitos não funcionais e as regras de negócio. Os diagramas do projeto escolhidos para esta solução são exibidos e explicados, bem como a importância de contemplá-los em um projeto de software. A seção de Desenvolvimento aborda os principais aspectos a serem descritos durante a construção de toda a solução proposta. A criação de bibliotecas, estudos mais aprofundados e testes são documentados nesta sessão. A última etapa exibe as conclusões tiradas sobre este trabalho de conclusão de curso. 5 2 FUNDAMENTAÇÃO TEÓRICA A fundamentação teórica deste trabalho irá abordar os seguintes temas: (i) .NET Framework e Projeto Mono; (ii) protocolos, arquiteturas e conceitos de gerência de redes; (iii) protocolo de gerência de rede SNMP; (iv) descrição das ferramentas de monitoramento de código aberto. 2.1 .NET Framework e Projeto Mono Nas seções seguintes, serão exibidos os estudos do .NET Framework e uma implementação alternativa e de código aberto, o Projeto Mono. 2.1.1 .NET Framework .NET é a plataforma criada pela Microsoft no final dos anos 90 utilizando o nome NGWS (Next Generation Windows Services – Nova Geração de Serviços Windows), entretanto, foi no ano 2000 que a Microsoft liberou a primeira versão beta do .NET 1.0. O .NET fornece uma nova API (Application Programming Interface – Interface de Programação de Aplicativos), com novas funcionalidades, novas ferramentas para a construção de aplicações para o Microsoft Windows e Web, novos componentes e novos serviços (TEMPLEMAN; VITTER, 2002, tradução nossa). Uma nova API se tornou necessária para aplicações Windows, pelo fato de que sua API foi escrita em C e cresceu com o passar dos anos. Atualmente, a API do Windows possui milhares de rotinas e vários problemas, já que os novos recursos da API foram adicionados pouco a pouco e com pouca organização. O fato de que a API do Windows seja construída em C acaba dificultando o desenvolvimento em outras linguagens, inclusive em linguagens mais modernas orientadas a objetos (IBIDEM). Várias linguagens podem ser utilizadas para se desenvolver na plataforma .NET, entres as quais o C#, Visual Basic .NET e J# se destacam. As aplicações desenvolvidas com essas linguagens são compiladas para o IL (Intermediate Language – Linguagem Intermediária), que se assemelha ao bytecode do Java. Isto significa que ao se desenvolver usando Visual Basic.NET, C# ou qualquer outra linguagem suportada, a aplicação será compilada para a mesma linguagem, a IL. Com a aplicação já compilada para a IL, é necessário um mecanismo para executá-la. Este mecanismo é o CLR (Common Language Runtime - Linguagem Comum de Tempo de Execução). O CLR dispõe de vários recursos como, JIT (Just in Time Compilation – Compilação em tempo de execução), responsável por traduzir o IL em código nativo, Garbage Collection (coleta de lixo), políticas de segurança e serviços de depuração. Com estes recursos, o CLR se situa entre o sistema operacional e a aplicação, provendo a segurança e controlando o acesso à memória, permitindo acesso transparente aos serviços do sistema operacional. A plataforma .NET possui sua própria biblioteca de classes (BCL - Base Class Library). Conforme Templeman e Viter (2002, tradução nossa), a BCL não é especifica para uma única linguagem, podendo ser utilizada por qualquer linguagem que será compilada para a IL. Além disso, a BCL é orientada à objetos, disponibilizando suas funcionalidades através de um grande número de classes organizadas em vários namespaces1. A BCL fornece ao desenvolvedor os seguintes itens: • Definição de tipos básicos como int, char, entre outros. • Tipos de coleção genéricos como vetores, listas, pilhas, tabelas hash, enumeradores e filas. • As classes podem definir suas exceções usando a BCL, sendo possível gerar uma exceção usando C# e tratá-la usando VB.NET. • Classes para tratamento do console, arquivos, entrada e saída, sockets, etc. • Classes para desenvolver interfaces gráficas, desenhos em duas dimensões, tratamento de imagens e impressão. • Serialização de objetos, um modo de salvar os objetos que estão na memória em um arquivo XML ou binário. Também possibilita carregar os objetos de um arquivo. • Classes que implementam e gerenciam segurança. • Classes para construção de aplicações distribuídas e sistemas Web. • Classes para lidar com XML. • Utilização de recursos do Sistema Operacional como threads (processos), timers, etc. 1 Namespaces são utilizados para organizar classes. 7 O recurso de compilação Just in Time da arquitetura .NET permite que o código IL seja portável e eficiente. A eficiência é garantida quando o código IL é compilado para o código nativo em tempo de execução. Neste modo, a compilação ocorre quando o método é executado pela primeira vez, e nas suas execuções seguintes, ele já executará o código nativo. Outro modo de funcionamento do JIT é a compilação em tempo de instalação. Além disso, segundo Templeman e Vitter (2002, tradução nossa), a plataforma .NET será portável assim que a IL seja suportada em outros sistemas operacionais. O recurso de Garbage Collection (coleta de lixo), é um recurso bastante útil presente na plataforma .NET. Ele elimina problemas presentes em linguagens como o C, na qual os programadores tem que desalocar manualmente a memória. O gerenciamento manual de memória pode gerar grandes problemas. Caso o programador esqueça de desalocar a memória ou a desaloque mais de uma vez, o programa poderá gerar erros. (TEMPLEMAN; VITTER, 2002, tradução nossa). A disposição dos itens da arquitetura .NET são exibidos na Figura 1. Figura 1. A Arquitetura .NET. Fonte: Templeman e Vitter (2002). Uma alternativa aos desenvolvedores .NET é o projeto de código aberto Mono. Ele suporta praticamente as mesmas linguagens que o .NET Framework suporta e, pode ser executado em vários Sistemas Operacionais baseados em Unix, além de Mac OS X e o próprio Windows. 8 2.1.2 Projeto Mono Mono é uma implementação multi-plataforma e de código aberto do .NET Framework. Neste projeto, o principal compilador é destinado à linguagem C#, já que esta foi desenvolvida especialmente pela Microsoft no .NET Framework. Entretanto, conforme Bornstein e Dumbill (2004, tradução nossa), existem compiladores para o Mono com outras linguagens como Java, C, Basic e Cobol. A CLR (Common Language Runtime - Linguagem Comum de Tempo de Execução) faz parte do projeto, garantindo que a aplicação rode de modo seguro, evitando travamentos, desperdícios de memória e garantindo um alto desempenho. As vantagens do Just In Time Compiler já mencionadas, também estão presentes no projeto Mono. Assim como na plataforma .NET, no Mono uma aplicação é compilada para a IL (Intermediate Language – Linguagem Intermediária). Isto garante a portabilidade da aplicação, já que o Mono pode ser instalado nos sistemas operacionais Linux, Solaris, Mac OS X, Windows e Unix (MONO, 2008, tradução nossa). Para executar o mesmo software em sistemas operacionais diferentes, algumas práticas devem ser adotadas, já que nem todos eles foram criados da mesma forma (BORNSTEIN; DUMBILL, 2004 tradução nossa). A primeira delas trata da diferença no caractere separador de diretórios quando se está trabalhando com arquivos. A Figura 2 demonstra estas diferenças. String directory = “tmp”; String filename = “thefile”; //Modo incorreto String filePath = directory + “/” + filename; //Modo correto 1 String filePath = System.IO.Path.Combine(directory, filename); //Modo correto 2 String filePath = directory + System.IO.Path.DirectorySeparatorChar + filename; Figura 2. Tratamento de arquivos para sistemas multi-plataforma. Fonte: Adaptado de Bornstein e Dumbill (2004). No mesmo contexto de arquivos, ainda existem problemas ao se trabalhar com o diretório raiz. No sistema operacional linux, existe apenas um diretório raiz o /. No Windows, podem existir vários diretórios sendo diferenciados por letras (C:\, D:\, ...). Para contornar este problema, pode-se utilizar o método System.IO.Directory.GetLogicalDrives(), que retornará uma ou mais Strings contendo os 9 diretórios raízes do sistema operacional. Além disto, deve-se ressaltar que alguns sistemas operacionais são sensíveis à caixa (como o Linux) e outros não (como o Windows). Outro problema é a definição de qual módulo de interface gráfica (GUI) utilizar. Para o Mono, pode-se utilizar os módulos GTK#, Qt#, System.Windows.Forms entre outros. Cada um deles é recomendado para diferentes sistemas operacionais e/ou ambientes gráficos. O GTK# é principalmente destinado para ser utilizado no Gnome além de ter boa compatibilidade com o Windows de 32 bits, demonstrado pelas Figura 3 e Figura 4 (SCHÖNIG; GESCHWINDE, 2003, tradução nossa). Já o System.Windows.Forms é o mais recomendável para o uso no Windows, e é compatível com as versões x86 do linux (BORNSTEIN; DUMBILL, 2004, tradução nossa). Figura 3. GTK# no Linux. Figura 4. GTK# no Windows. Outro ponto crítico é quando se trata das configurações de cada aplicação desenvolvida. Em aplicativos para Windows, na maioria das vezes, as aplicações guardam suas configurações no registro, não presente em outros sistemas operacionais. Portanto, não se pode desenvolver 10 aplicações que utilizam o registro do Windows, caso o objetivo a ser alcançado seja a portabilidade do aplicativo (IBIDEM). Existem outros tipos de compatibilidades e para lidar com elas faz-se necessário uma codificação específica para cada plataforma. A detecção de diferentes plataformas através do código fonte é demonstrada pela Figura 5. Utilizando o atributo VersionString, é possível utilizar if ou switch-case para separar códigos de diferentes sistemas operacionais. using System; using System.Diagnostics; namespace soDetection { class MainClass { public static void Main(string[] args) { OperatingSystem os = Environment.OSVersion; Console.WriteLine(os.VersionString); } } } Figura 5. Código fonte para detecção de plataforma. Fonte: Adaptado de Bornstein e Dumbill (2004). Os resultados da execução do código da Figura 5 são exibidos pelas Figura 6 para o sistema operacional Linux e Figura 7 para o Windows XP Service Pack 3. Figura 6. Resultado da detecção do sistema operacional no Linux. Figura 7. Resultado da detecção do sistema operacional no Windows XP. 11 Mono é uma boa alternativa para os desenvolvedores, entretanto, ele não possui todas as classes do .NET Framework disponíveis. A Figura 8 mostra os estados das partes do namespace System, o maior e mais utilizado. Figura 8. Status do desenvolvimento do namespace System. Fonte: Mono (2008). 2.2 Modelos, arquiteturas e protocolos de gerência Atualmente existem várias arquiteturas, modelos e protocolos de monitoramento de redes propostos por várias organizações em todo o mundo. Uns são utilizados em larga escala enquanto outros não passam de conceitos. As arquiteturas, modelos e protocolos de gerência direcionados às redes de dados serão mostrados nos sub-tópicos seguintes. 2.2.1 Conceitos O ambiente de gerenciamento OSI (Open Systems Interconnection – Interconexão de Sistemas Abertos) de redes possui os conceitos de Gerente, Agentes e Objetos Gerenciados. O Gerente possui a capacidade de receber notificações, informações e realizar ações de controle sobre 12 os Objetos Gerenciados. Um objeto gerenciável é qualquer recurso que está sujeito a ações de gerenciamento, como uma conexão, uma interface de rede ethernet ou uma porta de roteador, etc. O Agente executa operações de gerenciamento sobre os objetos gerenciados, como desligar a interface 11 do switch ou solicitar a quantidade de octetos que trafegaram na referida porta. Neste ambiente, aplica-se o protocolo CMIP (TAROUCO et al, 1993). No ambiente de gerenciamento das redes interligadas à Internet, aplica-se o protocolo SNMP (Simple Network Management Protocol – Protocolo Simples de Gerencia de Redes). Este ambiente é bastante semelhante ao de gerenciamento OSI, pois a maioria dos conceitos abordados é comum a ambos. Entretanto, a organização da árvore de objetos gerenciados é diferente (IBIDEM). A MIB (Managed Information Base – Base de Informações Gerenciais) é um conjunto de objetos gerenciados. Seu conceito é empregado tanto no padrão OSI quanto no Internet (IBIDEM). A organização de objetos na MIB é feita seguindo um conjunto de regras definidos na SMI (Structure of Managed Information – Estrutura de Informações Gerenciais). O acesso aos dados dos objetos é feito utilizando a notação ISO ASN.1 (Abstract Syntax Notation, One- Notação de Sintaxe Abstrata, Um). Para identificar um objeto, utiliza-se o OID (Object Identifier – Identificador de Objeto) que são números separados por pontos. A Figura 9 ilustra o início da árvore do ambiente de gerenciamento Internet (MAURO; SCHMIDT, 2001, tradução nossa). Figura 9. MIB do ambiente de gerenciamento Internet. Fonte: Adaptado de TAROUCO et al (1993) e MAURO e SCHMIDT (2001). 13 Para o Objeto “Management”, o OID resultante seria .1.3.6.1.2. Todo objeto gerenciável deste modelo iniciará com o identificador exemplificado. Segundo Mauro e Schmidt (2001, tradução nossa), “O Nó Raiz não possui qualquer nome ou número”. A descrição da SMI Internet será aprofundada adiante. Neste sub-seção, foram explicados os conceitos necessários para o entendimento dos subseções seguintes. 2.2.2 FCAPS: Fault, Configuration, Accounting, Performance and Security FCAPS é um modelo de gerência de redes definido por ITU-T que era direcionado a área de telecomunicações. A ISO (International Standards Organization – Organização de Padrões Internacionais) foi a entidade responsável por aplicar a FCAPS em redes de dados. Este modelo divide a gerência em cinco áreas funcionais (NETWORKDICTIONARY, 2008a, tradução nossa): • Fault Management (gerência de falhas): serve para detectar, criar registros, notificar os usuários e até consertar possíveis erros fazendo com que a rede continue funcionando. Ao ocorrer um erro, uma mensagem o gerente de rede pode ser avisado, através de um protocolo de gerência de redes como o SNMP. • Configuration Management (gerência de configurações): serve para monitorar a rede, as configurações do sistema, além das várias versões de hardware e software. A importância deste item aumenta conforme o tamanho da rede. • Accouting Management (gerência de contas): a medição da utilização da rede pode ser monitorada de forma individual ou por grupo. Além disto, pode-se detectar se a rede está sendo utilizada para o propósito correto. Alguns dos itens que podem ser monitorados são: uso de CPU, link e disco. Para este propósito, um protocolo bastante utilizado é o RADIUS. • Performance Management (gerência de desempenho): as variáveis que compõem a medição do desempenho de uma rede são a vazão (throughput) da rede, os tempos de resposta e a taxa de utilização da rede. Este item trata justamente desta medição. • Security Management (gerência de segurança): este item trata da segurança da rede, garantindo que as informações que trafegam nela sejam acessadas apenas por pessoas autorizadas, além de evitar que a rede sofra algum tipo de ataque. 14 O modelo FCAPS é uma extensão de um framework conceitual de gerencia de redes chamado TMN (Telecommunications Management Networks – Gerência de Redes de Telecomunicações), no qual também se identificam as mesmas cinco áreas de funcionais de gerenciamento, com pequenas alterações (IBIDEM). O objetivo do TMN é: ...prover uma estrutura organizada para interconectar vários tipos de Sistemas de Suporte à Operação e equipamentos de telecomunicações para a troca de informações de gerenciamento de interfaces padronizadas que incluem a definição de protocolos e mensagens (TAROUCO et al, 1993). O FCAPS define várias regras que abordam os principais aspectos da gerência de redes. Outra abordagem que mescla diversos aspectos das práticas de gerência apresentadas é o CMIP. 2.2.3 CMIP/CMISE CMIP (Common Management Information Protocol – Protocolo de Gerência de Informações Comuns) que é um protocolo da ISO (International Standards Organization – Organização Internacional de Padrões) e é utilizado em conjunto com o CMIS (Common Management Information Services – Serviço de Gerência de Informações Comuns). Este padrão em conjunto com o padrão SNMP são os mais importantes (Networkdictionary, 2008a, tradução nossa). Conforme Kurose e Ross (2007), o CMIP foi projetado para ser independente de produtos ou fabricantes específicos e inicialmente era concorrente do protocolo SNMP. Tanto CMIP quanto CMISE também são utilizados na arquitetura CMOT (Common Management over TCP/IP – Gerenciamento comum sobre TCP/IP) (TAROUCO et al, 1993) ou (CMIP over TCP/IP – CMIP sobre TCP/IP) (MILLER, 1997, tradução nossa). O CMOT é baseado na estrutura de gerenciamento OSI e nos modelos, serviços e protocolos desenvolvidos pela OSI para gerenciamento de redes (TAROUCO et al, 1993). Conforme o Networkdictionary (2008b, tradução nossa), o CMIS define um sistema de gerência de redes, já o CMIP supre a necessidade da existência de uma interface que provê funções que podem ser utilizadas tanto por protocolos de gerência de redes que estão conformes com a ISO e até por protocolos customizados. CMIP utiliza o mecanismo de transporte orientado à conexão já que utiliza o protocolo TCP. Isto pode ser considerado uma desvantagem, já que se um dispositivo de rede estiver com 15 problemas, o software de gerência só poderá receber dados do dispositivo após efetuar uma conexão com este. Apesar disso, este protocolo possui embutido um sistema de segurança que suporta controle de acesso, autorização e gravação de registros. Quando aplicado na arquitetura CMOT, o CMIP pode ser utilizado com o protocolo LPP (Lightweight Presentation Protocol – Protocolo de Apresentação Simples). Neste caso, devido o uso do LPP, o CMIP poderá rodar tanto no protocolo TCP quanto no UDP, conforme em Tarouco et al (1993): O CMOT deixa a escolha de TCP ou UDP para a aplicação de gerenciamento. Os sistemas dentro de um ambiente de LAN (Local Area Network – Rede local) são melhor servidos pela escolha do UDP, enquanto os sistemas em um ambiente WAN (Wide Area Network – Rede de longa distância) deveriam escolher TCP. O protocolo CMIP de modo algum especifica o software de gerenciamento, apenas define como será a comunicação entre agentes e o software (Networkdictionary, 2008b, tradução nossa). Este esquema de comunicação é mostrado na Figura 10. Figura 10. Sistema de gerenciamento baseado em CMIP/CMIS. Fonte: Adaptado de Networkdictionary (2008b). Conforme Networkdictionary (2008b, tradução nossa), o CMIP possui vantagens quando comparado ao SNMP: 16 • CMIP além de obter informações, pode realizar tarefas, o que é impossível no SNMP. • Possui segurança embutida. • Provê recursos poderosos que permitem aplicações gerenciais de realizarem mais tarefas com uma única requisição. • Em redes em condições incomuns, ele gerará relatórios melhores. O acesso de informações gerenciais em objetos gerenciáveis é feito através do CMISE (Common Management Information Service Element – Elemento do Serviço de Gerência de Informações Comuns), o qual utiliza o CMIP para requisitar informações (TAROUCO et al, 1993). Por último, é revisado o SNMP, protocolo para a gerência que se consolidou com o advento da Internet. 2.2.4 SNMP O SNMP (Simple Network Management Protocol – Protocolo Simples para o Gerenciamento de Redes) é um protocolo de gerência de redes. Foi introduzido em 1988 para suprir uma necessidade crescente de gerenciamento de dispositivos que utilizam o protocolo IP (Internet Protocol) como roteadores, switches, modems, access points, etc. Seu coração é um conjunto simples de operações que permite aos softwares de gerência relatarem os dados de dispositivos de rede suportados. Por exemplo, pode-se utilizar SNMP para desligar uma interface de um roteador ou checar a velocidade da interface Ethernet. SNMP pode ainda monitorar a temperatura de um switch e até gerar um alerta se esta ficar muito alta (MAURO; SCHMIDT, 2001, tradução nossa). Existem atualmente três versões do protocolo SNMP (IBIDEM): • SNMP versão 1 (SNMPv1): é a versão definida pelo RFC 1157 (RFC 1157, 1989), padrão da IETF (Internet Engineering Task Force – Força Tarefa de Engenharia da Internet). A segurança desta versão é baseada em comunidades, que nada mais são do que senhas. Pode-se definir uma comunidade com acessos de somente leitura para acessar apenas informações ou leitura e escrita que podem alterar configurações. Uma terceira comunidade é chamada de trap. • SNMP versão 2 (SNMPv2): esta versão é chamada tecnicamente de SNMPv2c. É definida pelos RFC 1905 (RFC 1905, 1996), RFC 1906 (RFC 1906, 1996) e RFC 1907 17 (RFC 1907, 1996). Segundo a IETF, ainda encontra-se em estado experimental, entretanto, alguns fabricantes de equipamentos de rede já estão disponibilizando equipamentos de rede com suporte desta versão. • SNMP versão 3 (SNMPv3): ainda em estado experimental, a SNMPv3 terá vários recursos novos como uma autenticação mais segura e comunicação privada entre entidades gerenciadas. A versão é definida pelos RFC da versão 2 e os RFC 2571 (RFC 2571, 1999), RFC 2572 (RFC 2572, 1999), RFC 2573 (RFC 2573, 1999), RFC 2574 (RFC 2574, 1999) e RFC 2575 (RFC 2575, 1999). O protocolo SNMP não é orientado a conexões como o CMIP, já que utiliza o protocolo UDP (User Datagram Protocol – Protocolo de Datagrama do Usuário). Isto significa que o SNMP possui um desempenho superior, já que não existe um overhead (sobrecarga) da conexão. Além disso, o UDP não possui timeouts, este é programado diretamente no software de gerenciamento. 2.2.4.1 Gerenciadores e Agentes O protocolo SNMP aplica os conceitos de gerente e agente (MILLER, 1997, tradução nossa). O Gerenciador, também conhecido como NMS (Network Management Station – Estação de Gerenciamento da Rede) se comunica com os agentes através de requisições chamadas polling (teste e resposta). O Agente pode alertar o NMS quando utiliza os traps, que funcionam como gatilhos que são disparados caso alguma condição seja alcançada (MAURO; SCHMIDT, 2001, tradução nossa). A Figura 11 mostra a relação entre o NMS e o Agente. Apesar de que a figura demonstre ações de forma separada, o NMS pode realizar o polling e receber traps ao mesmo tempo. Figura 11. Relação entre o NMS e o Agente. Fonte: Adaptado de Mauro e Schmidt (2001). 18 Assim como os agentes e o NMS, o conhecimento sobre a SMI e suas versões é primordial para o entendimento do protocolo SNMP. 2.2.4.2 SMIv1 Cada versão do protocolo SNMP possui uma versão de SMI. Na SMI versão 1, a definição de Objetos Gerenciáveis é composta por três itens: 1. Nome: é o que identifica o objeto gerenciável. Este item pode ser um nome ou o OID (Object Identifier). 2. Tipo e sintaxe: O tipo do objeto é definido usando a sintaxe ASN.1. É um modo de definir como os dados serão transmitidos entre gerenciadores e agentes. Os tipos de objetos são parecidos com os da linguagem C. A Tabela 1 exibe os principais tipos. 3. Encoding (Codificação): Uma instância de um objeto gerenciado é codificada numa string de octetos usando BER (Basic Encoding Rules – Regras Básicas de Codificação). Tabela 1. Tipos de dados SMIv1 Tipo de dado Integer Octect String Counter Object Identifier Sequence Sequence of IP Address Gauge TimeTicks Descrição É um número inteiro de 32 bits, bastante utilizado para dados enumerados. Para enumeração, o 0 não é considerado. É uma string (seqüência de caracteres) de octetos, usado para transmissão de texto ou identificação física de uma interface de rede. É um valor de 32 bits com o valor mínimo zero e o máximo igual a 232-1. Quando o valor máximo é atingido, ele volta para zero e recomeça. É utilizado para contagem de qualquer item, como quantidade de erros numa interface de redes ou octetos que trafegaram nesta interface. É um valor que sofre incrementação, sendo que uma decrementação ocorre apenas em casos de erros. Quando o agente é reiniciado, os dados do tipo Counter recebem zero. O OID é definido por números decimais separados por pontos. Define uma lista de vários tipos de dados com sintaxe ASN.1, parecendo uma tabela. Define um objeto gerenciável feito com o tipo Sequence. É um valor de 32 bits que representa um IP versão 4. Ambas as SMIv1 e SMIv2 não possuem suporte ao IP versão 6. É um valor de 32 bits com o valor mínimo zero e o máximo igual a 232-1. Diferente do Counter, este tipo pode decrementar normalmente. A velocidade de uma interface de um roteador é medida com Gauge. É um valor de 32 bits com o valor mínimo zero e o máximo igual a 232-1. Este tipo mede o tempo em centenas de segundos. O uptime (tempo ligado) de um dispositivo é medido com este tipo. Fonte: Adaptado de Mauro e Schmidt (2001). 19 Como já mencionado, os objetos gerenciáveis estão dispostos na SMI numa estrutura em árvore. É através desta árvore que se define o Object Identifier (identificador do objeto). A árvore SMI com suas partes mais importantes é demonstrada na Figura 12. Figura 12. A árvore de objetos da SMIv1. Fonte: Adaptado de Mauro e Schmidt (2001). 2.2.4.3 MIB do SMIv1 Uma MIB é definida usando a sintaxe ASN.1. Conforme Mauro e Schmidt (2001), “É muito importante que se saiba ler e entender uma MIB já que em alguns casos pode ser necessário implantar uma ou parte dela”. Na Figura 13 é demonstrado o código de uma versão de uma MIB. Os comentários são iniciados por -- . RFC1213-MIB DEFINITIONS ::= BEGIN IMPORTS mgmt, NetworkAddress, IpAddress, Counter, Gauge, TimeTicks FROM RFC1155-SMI OBJECT-TYPE FROM RFC 1212; mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } Figura 13. Primeiras linhas de uma MIB. Fonte: Mauro e Schmidt (2001). As primeiras linhas de uma MIB foram apresentadas na Figura 13. Na primeira linha, define-se o nome da MIB, que no caso é “RFC1213-MIB” (RFC 1213 – 1991). A sessão IMPORTS, permite que sejam importados tipos de dados e OIDs de outras MIBs. No caso acima, foram importados tipos de dados da RFC 1155 (RFC 1155, 1990) SMI (SMIv1), que incluem: 20 • mgmt; • NetworkAddress; • IpAddress; • Counter; • Gauge; e • TimeTicks. Além disso, foi importado o Object Type RFC 1212 (RFC 1212, 1991), o qual define a maneira de como a MIB foi escrita. A última linha da Figura 13 define o início dos OIDs dos objetos gerenciáveis. Por ser mgmt, o OID equivalente é 1.3.6.1.2. Após a sessão de IMPORTS, parte-se então para a definição dos objetos gerenciáveis (IBIDEM), que seguem o formato demonstrado pela Figura 14. <nome> OBJECT-TYPE SYNTAX <tipo de dado> ACCESS <pode ser read-only, read-write, write-only, ou not-accessible> STATUS <mandatory, optional, ou obsolete> DESCRIPTION "Descrição textual do objeto gerenciável." ::= { <Um OID único do objeto gerenciável.> } Figura 14. Formato da declaração de objetos gerenciáveis. Fonte: Mauro e Schmidt (2001). Para exemplificar a definição de objetos gerenciáveis, utilizou-se o ifTable, que nada mais é que uma lista de interfaces de rede num dispositivo gerenciável. ifTable OBJECT-TYPE SYNTAX SEQUENCE OF IfEntry ACCESS not-accessible STATUS mandatory DESCRIPTION "A list of interface entries. The number of entries is given by the value of ifNumber." ::= { interfaces 2 } Figura 15. Definição de objetos gerenciáveis. Fonte: Mauro e Schmidt (2001). A sintaxe deste objeto é SEQUENCE OF IfEntry, que é uma tabela que possui colunas que são definidas pela IfEntry. O objeto está marcado como inacessível, portanto, não é possível fazer com que o agente consulte este objeto. Seu status é mandatory (obrigatório) significando que o agente precisa implementar este objeto para ser compatível com os padrões da especificação MIB21 II. O campo Description (descrição) descreve o que é este objeto. Na última linha da Figura 15, define-se o OID, que é 1.3.6.1.2.1.2.2 ou iso.org.dod.internet.mgmt.interfaces.2. Na Figura 16, é demonstrado um trecho da definição da Sequence IfEntry. IfEntry ::= SEQUENCE { ifIndex INTEGER, ifDescr DisplayString, ifType INTEGER, ifMtu INTEGER, (...) ifSpecific OBJECT IDENTIFIER } Figura 16. Definição da Sequence IfEntry. Fonte: Mauro e Schmidt (2001). Na definição da Sequence nota-se que seu nome começa com letra maiúscula, diferente de quando se define um objeto gerenciável. Como uma Sequence se parece com uma tabela, nesta esperamos encontrar todos os tipos descritos em sua definição. A adição de novos registros também pode ser feita pelo NMS (MAURO; SCHMIDT, 2001, tradução nossa). 2.2.4.4 SMIv2 e sua MIB A SMIv2 adiciona novos itens à arvore de objetos gerenciáveis além de mais tipos de dados. A principal novidade é o ramo snmpV2, que possui o OID 1.3.6.1.6.3.1.1.. A Figura 17 exibe a SMIv2. Figura 17. SMIv2 e novos ramos. Fonte: Mauro e Schmidt (2001). 22 Os novos tipos de dados incluídos na SMIv2 estão na Tabela 2. Tabela 2. Novos tipos de dados da SMIv2 Tipo de dado Integer32 Counter32 Gauge32 Unsigned32 Counter64 BITS Descrição Mesmo que Integer (inteiro). Mesmo que Counter (contador). Mesmo que Gauge. Representa um valor decimal que vai de 0 até 232-1. Similar ao Counter32, entretanto seu valor máximo é 18.446.744.073.709.551.615. Sendo seu valor máximo bem alto, este tipo se torna ideal para contadores que podem ser reiniciados antes do tempo desejado. Uma enumeração de bits não negativos. Fonte: Adaptado de Mauro e Schmidt (2001). Na SMIv2 também houve mudanças na especificação dos objetos gerenciáveis através da adição de novos campos adicionais. Estes campos permitem que os objetos sejam descritos de melhor maneira. A nova estrutura de descrição de objetos segue o modelo exibido na Figura 18. <nome> OBJECT-TYPE SYNTAX <tipo de dado> UnitsParts <Opcional, veja descrição na Tabela 3> MAX-ACCESS <Opcional> STATUS <Ver descrição na Tabela 3> DESCRIPTION "Descrição textual deste objeto gerenciável." AUGMENTS { <nome da tabela> } ::= { <O OID que representa este objeto.> } Figura 18. Definição de objetos gerenciáveis na SMIv2. Fonte: Mauro e Schmidt (2001). Cada trecho dos aprimoramentos demonstrados na Figura 18, é descrito na Tabela 3. Tabela 3. Aprimoramentos na definição de objetos. Aprimoramento UnitsParts MAX-ACCESS STATUS Descrição Uma descrição textual da unidade usada (segundos, milisegundos). É um aprimoramento do ACCESS da SMIv1 (que também pode ser utilizado nesta versão). A diferença, são os novos valores suportados: read-only (somente leitura), read-write (leitura e escrita), read-create (leitura e criação), not-accessible (não acessível) e accessible-for-notify (acessível para notificação). Esta clausula foi extendida para permitir os valores current, obsolete e deprecated. O valor current tem o mesmo significado que mandatory da SMIv1. 23 Augments É utilizado em casos em que é importante adicionar uma ou mais colunas novas a uma tabela. Esta clausula necessita que seja especificado o nome da tabela que terá colunas adicionadas. Fonte: Adaptado de Mauro e Schmidt (2001). Na SMIv2 também são introduzidos novas convenções textuais, termos que fazem com que o objeto gerenciável seja declarado de um modo mais abstrato. Os novos termos são definidos na RFC 2579 (RFC 2579, 1999). A Tabela 4 apresenta esses termos. Tabela 4. Novos termos Convenção Textual DisplayString PhysAddress MacAddress TruthValue TestAndIncr AutonomousType VariablePointer RowPointer RowStatus TimeStamp TimeInterval DateAndTime StorageType TDomain TAddress Descrição É uma seqüência de caracteres NVT ASCII, e não pode ultrapassar 255 caracteres. Endereço físico ou da camada de enlace representado por uma cadeia de octetos. É o endereço MAC da interface de rede, definido por seis octetos, sendo que o bit menos significante é o primeiro. É um tipo booleano que recebe true (verdadeiro) ou false (falso). Utilizado para evitar problemas quando duas estações de gerenciamento modificam um único valor ao mesmo tempo. É um OID utilizado para definir um novo ramo na árvore da MIB. É um ponteiro para uma instância qualquer de um objeto gerenciável. Este ponteiro contém o OID da instância. É um ponteiro para uma tupla de uma tabela. Usado para gerenciar a inserção e exclusão de tuplas numa tabela, garantindo a integridade desta tabela. RowStatus pode receber os valores active(1)(ativo), notInService(2)(fora de serviço), notReady(3)(fora de prontidão), createAndGo(4)(criar e continuar), createAndWait(5)(criar e esperar) e destroy(6)(destruir). Mede o tempo que passou desde que o dispositivo foi ligado até o momento de alguma ocorrência. Mede um período de tempo em centenas de segundos, podendo receber valores de 0 até 2147483647. É um Octect String utilizado para representar a data e o horário. Define o tipo de memória que o agente está utilizando. Os valores possíveis são other(1), volatile(2), nonVolatile(3), permanent(4) e readOnly(5). Fornece o tipo de serviço de transporte. Fornece o endereço do tipo de transporte. Seu tamanho pode ser de 1 até 255 octetos. Fonte: Adaptado de Mauro e Schmidt (2001). 24 2.2.4.5 MIB-II MIB-II é um importante grupo de gerenciamento, porque todos os dispositivos que suportam SNMP também suportam este grupo (MAURO; SCHMIDT, 2001, tradução nossa). MIB-II é um ramo da árvore SMI, o qual deriva do nó mgmt(2). A Figura 19 demonstra graficamente o ramo MIB-II. Figura 19. MIB-II. Fonte: Adaptado de Mauro e Schmidt (2001). A Tabela 5 explica brevemente cada item desta sub-árvore. Tabela 5. Explicação dos ramos da MIB-II Ramo System OID 1.3.6.1.2.1.1 Interfaces 1.3.6.1.2.1.2 At 1.3.6.1.2.1.3 Ip 1.3.6.1.2.1.4 Icmp 1.3.6.1.2.1.5 Tcp Udp 1.3.6.1.2.1.6 1.3.6.1.2.1.7 Egp 1.3.6.1.2.1.8 Descrição Alguns dos itens mais importantes deste são o uptime do sistema, contato do administrador e o nome do sistema. Possui informações sobre o estado de cada interface de rede como, octetos enviados, octetos recebidos, se está ligada ou desligada, etc. Este ramo só existe para manter a compatibilidade com versões mais antigas de algumas aplicações. Este ramo trata de tradução de endereços. Possui várias informações sobre vários aspectos do protocolo IP, incluindo roteamento. Possui informações sobre o ICMP, como erros e descarte de pacotes. Rastreia, entre outros itens, o estado de uma conexão TCP. Com ele é possível construir estatísticas sobre o protocolo UDP, contendo informações como a quantidade de pacotes que entraram e saíram. Possui dados sobre o protocolo EGP (Exterior Gateway Protocol – Protocolo de gateway externo). 25 transmission 1.3.6.1.2.1.10 Snmp 1.3.6.1.2.1.11 Este ramo é raramente utilizado, sendo que é utilizado em MIBs de dispositivos mais específicos. Possui dados sobre o protocolo SNMP no dispositivo que está sendo gerenciado, como a quantidade de pacotes SNMP enviados e recebidos, traps, etc. Fonte: Adaptado de Mauro e Schmidt (2001). 2.2.4.6 Operações do protocolo SNMP No protocolo SNMP e em suas versões, existem as seguintes operações ou PDU’s (Protocol Data Unit – Unidade de Dados do Protocolo) (MILLER, 1997, tradução nossa): get, get-next, getbulk, set, get-response, trap, notification, inform, report (MAURO; SCHMIDT, 2001, tradução nossa). Algumas das principais operações são descritas a seguir. Operação get Esta operação é iniciada apenas pelo NMS e ocorre quando este necessita de alguma informação do dispositivo que está sendo gerenciado. Ao fazer a requisição o OID do objeto é passado como um parâmetro. Em casos em que o dispositivo está com sobrecarga de processamento, é possível que o dispositivo descarte o pacote (MAURO; SCHMIDT, 2001, tradução nossa). Esta operação está disponível em todas as versões do SNMP. A resposta do agente é adquirida utilizando a operação get-response (MILLER, 1997, tradução nossa). Operação get-next Esta operação tem o seu funcionamento semelhante ao da operação get. Entretanto, esta operação é utilizada para receber um grupo de informações. A operação get-next navega na árvore utilizando a técnica top-down (MAURO; SCHMIDT, 2001, tradução nossa). Operação get-bulk Esta operação está disponível apenas nas versões 2 e 3 do SNMP (IBIDEM). get-bulk permite que o NMS requisite um grande número de dados de um objeto gerenciável. É uma operação que também se assemelha a operação get. Entretanto, a operação get gera erros ao requisitar um grande número de dados em casos em que o dispositivo esteja muito ocupado. Mas no caso do get-bulk, segundo MILLER (1997, tradução nossa) e MAURO e SCHMIDT (2001, tradução nossa), a operação evita este erro, retornando dados incompletos. 26 Operação set A operação set está disponível em todas as versões do SNMP. Esta é utilizada para alterar o valor de um objeto gerenciável ou criar uma nova tupla em uma tabela, dependendo é claro, das permissões (MILLER, 1997, tradução nossa). Traps Trap é a maneira utilizada pelo agente de comunicar o NMS de um evento ocorrido. O agente possui configurado quem é o destinatário destas traps, sendo que geralmente é configurado o IP do NMS (MAURO; SCHMIDT, 2001, tradução nossa). Existem seis tipos genéricos de traps, conforme a Tabela 6. Tabela 6. Tipos de traps Tipo coldStart(0) warmStart(1) linkDown(2) linkUp(3) authenticationFailure(4) egpNeighborLoss(5) enterpriseSpecific(6) Descrição Indica que o agente foi reiniciado. Todos os objetos gerenciáveis do tipo Counter e Gauge são zerados. Indica que o agente se reiniciou. Neste caso nenhum objeto gerenciável é alterado. É enviado caso alguma interface do dispositivo foi desconectada ou desligada. É enviado caso alguma interface do dispositivo foi conectada ou ligou. Indica que alguém tentou fazer alguma requisição ao agente e ele negou devido a uma falha de autenticação. Indica a perda de conexão com um vizinho que utiliza o protocolo EGP. Esta trap é configurada ou especificada de acordo com o fabricante do dispositivo. Nestes casos, o NMS necessita decodificar a trap. Fonte: Adaptado de Mauro e Schmidt (2001). 2.3 Softwares de monitoramento Os sistemas de monitoramento descritos nesta seção servirão como fonte de requisitos para a construção de um novo sistema. Os softwares escolhidos são: Nagios (NAGIOS, 2008) e Cacti (CACTI, 2008), que são bastante utilizados atualmente. 2.3.1 Nagios Nagios (NAGIOS, 2008) é um software de monitoramento de hosts e de serviços, construído para informar o administrador de problemas antes que estes sejam detectados pelo usuário final. Foi 27 desenvolvido inicialmente para rodar em Linux, mas atualmente ele roda em qualquer sistema baseado em Unix. Para realizar os mais diversos tipos de monitoramento, Nagios faz uso de plugins, que são específicos para cada tipo de monitoramento. O daemon (espécie de serviço) do Nagios ativa estes plugins para que eles coletem as informações necessárias e assim as retorna para ele. O Nagios utiliza plugins para realizar o monitoramento sendo, portanto, um software bastante flexível, já que o administrador pode construir facilmente plugins específicos para um dado tipo de aplicação. Aplicações já conhecidas e bastante utilizadas já possuem plugins construídos (BURGESS, 2005, tradução nossa). A Tabela 7 possui uma lista dos principais plugins. Tabela 7. Lista dos principais plugins do Nagios Plugin check_http check_dns check_dhcp check_disk check_dummy check_imap check_mysql check_mysql_query check_nntp check_procs Descrição Este plugin testa os serviços de HTTP (Hypertext Transfer Protocol – Protocolo de transferência de hipertexto) em um host específico. Ele suporta o HTTP assim como o HTTPS (Hypertext Transfer Protocol Secure – Protocolo de transferência de hipertexto seguro). Além disto, ele pode consultar redirecionamentos, buscar por expressões regulares, medir o tempo de conexão e verificar se algum certificado está para expirar. Este faz uso do software nslookup (já disponível em grande parte dos Sistemas Operacionais) para verificar se o servidor DNS (Domain Name Server – Servidor de Nomes de Domínios) especificado pode traduzir o domínio para um endereço IP. Utilizado para testar a disponibilidade de um dado servidor DHCP (Dynamic Host Configuration Protocol – Protocolo de Configuração Dinâmica de Hosts). Utilizado para verificar a quantidade de espaço em disco disponível. Ele pode gerar um alerta caso o valor crítico (configurável) seja alcançado. Ao invés de verificar o estado de um serviço, este plugin retorna valores estipulados pelo administrador. Faz a verificação de uma conexão IMAP (Internet Message Access Protocol – Protocolo de Acesso para Mensagens da Internet). Faz um teste de conexão com um banco de dados MySQL. Um plugin para teste de banco de dados MySQL mais elaborado. Este executa uma consulta no banco de dados, e o valor retornado é comparado com o valor aceitável configurado, podendo emitir alertas caso o valor aceitável seja ultrapassado. Faz um teste de conexão com um host que possui NNTP (Network News Transfer Protocol – Protocolo de Transferência de Notícias pela Rede). Faz uma checagem de todos os processos em um host e pode gerar avisos e alertas críticos caso alguma métrica esteja fora dos parâmetros configurados. 28 check_ping check_smtp check_tcp check_udp check_nt Faz o uso de ICMP (Internet Control Message Protocol – Protocol de Mensagens de Controle da Internet) para construir estatísticas de conexão com um determinado host. Este plugin simplesmente tentará abrir uma conexão com um servidor SMTP (Simple Mail Transfer Protocol - Protocolo de Simples Transferência de Emails). Faz um teste de uma conexão de TCP (Transfer Control Protocol – Protocolo de Controle de Transferência) qualquer com um determinado host. Semelhante ao check_tcp, mas testa com o protocolo UDP (User Datagram Protocol – Protocolo Livre de Datagrama). Este plugin coleta uma informação específica do serviço NSClient rodando em hosts que estão rodando com Windows NT/2000/XP/2003. A informação que se deseja é um parâmetro a ser passado. Com os plugins necessários instalados, pode-se então iniciar o monitoramento. É possível instalar o Nagios já pré-configurado, de modo que ele já monitore a máquina em que está rodando e o seu gateway. Nagios é configurado utilizando arquivos texto, e os arquivos padrões são exibidos na Tabela 8. Tabela 8. Arquivos padrões de configuração do Nagios Arquivo nagios.cfg checkcommands.cfg misccommands.cfg timeperiods.cfg cgi.cfg contacts.cfg contactgroups.cfg hosts.cfg hostgroups.cfg Descrição Contém configurações básicas como formato da data e hora. Por padrão, este arquivo já vem configurado corretamente, bastando alteração de poucos parâmetros. Neste arquivo existem informações sobre os plugins e como eles serão utilizados. É o arquivo que contém diversos tipos de comandos que podem ser executados, incluindo a configuração do comando de envio de alertas (por celular, email, etc). Neste arquivo é especificado quando o Nagios executará as verificações. Contém as permissões dos usuários que acessarão as informações do Nagios. Este arquivo contém as definições de contatos para alertas e avisos. Neste arquivo é possível construir grupos, especificando quais os contatos fazem partes de cada grupo. Este arquivo possui a lista e o modo de como os hosts serão monitorados. Neste arquivo, cada host pode possuir especificado um endereço IP, um apelido, o seu nome, os comandos de checagem, etc. Neste arquivo é possível construir grupos de hosts, facilitando o monitoramento. Com o Nagios configurado, pode-se então verificar os dados coletados. Para isto, basta acessar a página do Nagios, que possui um endereço configurado na instalação, fornecendo o 29 usuário e senha, também configurados no processo de instalação. A Figura 20 mostra a tela inicial do Nagios. Figura 20. Tela inicial do Nagios. Fonte: Nagios (2008). 30 Para visualizar o estado dos serviços, seleciona-se a opção Service Details (Detalhes dos Serviços). A tela que surgirá apresenta os hosts com seus respectivos serviços e estados. Além disso, é exibida uma descrição detalhada do estado do serviço. A Figura 21 demonstra esta tela. Figura 21. Detalhes dos hosts. Fonte: Nagios (2008). 31 Para visualizar o estado dos hosts, é acessada a opção Host Detail (Detalhe do Host). Nesta tela são exibidos todos os hosts com o respectivo estado e informações. A Figura 22 demonstra esta tela. Figura 22. Detalhes dos serviços. Fonte: Nagios (2008). Outro recurso interessante do Nagios é a exibição do Mapa da Rede (Network Map). Ele consiste em exibir a topologia da rede graficamente, mostrando os computadores, roteadores, entre outros hosts. Além disso, ele pode exibir qual Sistema Operacional o host está rodando, caso este esteja especificado no arquivo “hosts.cfg”. A Figura 23 demonstra este recurso. 32 Figura 23. Recurso “Mapa da Rede”. Fonte: Nagios (2008). O Nagios possui vários recursos poderosos, entretanto, ele não possui nenhuma forma de construção de gráficos. Grande parte dos administradores de rede vem adotando o Cacti como um software adicional para a produção destes gráficos. 2.3.2 Cacti Cacti (CACTI, 2008) é uma interface completa para o RRDtool (Round Robin Database Tool – Ferramenta para Bancos de Dados Round Robin), coletando todas as informações necessárias para construir gráficos e as gravando em uma base no banco de dados MySQL. Ele é totalmente construído com a linguagem PHP. As configurações são todas feitas na interface Web do Cacti e estas são também armazenadas no banco de dados MySQL. 33 O RRDtool é um padrão industrial OpenSource (código aberto) de alto desempenho para armazenamento de informações e gráficos que representam dados temporais. Esta ferramenta pode ser utilizada em conjunto com as linguagens PHP, Python, Perl, Ruby e TCL (OETIKER, 2008, tradução nossa). Para iniciar o uso do Cacti, basta acessar a URL na qual ele se encontra. Deve-se fornecer o usuário “admin” e a senha “admin”, sendo que a senha deve ser alterada no primeiro acesso. A tela inicial é demonstrada na Figura 24. Figura 24. Tela inicial do Cacti. Fonte: Cacti (2008). Na parte superior da tela, o Cacti apresenta duas opções: console (gerência de configurações) e graphs (gráficos). A tela inicial iniciará com a opção console já selecionada, e nesta opção é possível cadastrar, alterar ou excluir algum dispositivo e/ou gráfico. 34 A tela de cadastro e alteração de dispositivos de rede do Cacti é demonstrada na Figura 25. Os campos a serem preenchidos são descritos a seguir, sendo que parte deles já é preenchida com valores padrão. • Description (descrição): deve ser preenchido com alguma informação útil sobre o dispositivo. • Hostname (nome do host): deve ser preenchido com o nome do dispositivo de rede ou seu endereço IP. • Host Template (modelo do host): deve-se selecionar em qual modelo o host se enquadra. Os modelos já incluídos no Cacti são: Cisco Router (Roteador da marca Cisco), Generic SNMP-enabled Host (Host genérico com SNMP ativo), Karlnet Wireless Bridge (Ponte de rede sem-fio da marca Karlnet), Local Linux Machine (Máquina Local com sistema operacional Linux), Netware 4/5 Server (Servidor Netware versão 4 ou 5), ucd/net SNMP Host, Windows 2000/XP Host. • Notes (notas): neste campo é possível cadastrar informações sobre o dispositivo já que é um campo bastante grande. • Disable Host (inativar host): este campo é selecionado caso deseja-se que o dispositivo não seja verificado pelo Cacti. • Downed Device Detection (Detecção de dispositivos desconectados/desligados): o modo de como é feita a detecção do dispositivo na rede. Pode ser selecionado por Ping ou desativar a detecção. • Ping Method (método do ping): é o modo de como o ping será executado caso a opção Downed Device Detection esteja marcada como ping. Pode-se executar o ICMP Ping, TCP Ping e UDP Ping. • Ping Port (porta para o ping): seleciona-se a porta para a qual o ping irá “disparar”. Somente em casos de TCP Ping e UDP Ping. • Ping timeout (tempo limite para resposta do ping): a métrica deste campo é em milisegundos. • Ping Retry Count (número de tentativas de ping): é informada a quantidade máxima de vezes em que é tentada a realização do ping. 35 • SNMP Version (versão SNMP): neste campo pode-se selecionar entre as versões 1, 2 ou 3 do protocolo SNMP. Dependendo da versão selecionada, os campos seguintes se alteram. Para exemplificar, foi selecionada a versão 2. • SNMP Community (Comunidade SNMP): é preenchido o nome da comunidade SNMP que foi configurada no agente do dispositivo. Já que o Cacti apenas coleta informações dos dispositivos, uma comunidade com privilégios de apenas leitura é o suficiente. • SNMP port (porta do SNMP): este campo é preenchido o número da porta em que o agente SNMP do dispositivo está “escutando”. • SNMP timeout (tempo limite do SNMP): preenchido com o tempo máximo de espera pela resposta de uma requisição SNMP. O valor é em mili-segundos. • Maximum OID’s per Get Request (quantidade máxima de OIDs por requisição): é informada a quantidade máxima de OIDs que uma operação SNMP do tipo get pode retornar. 36 Figura 25. Cadastro e/ou alteração de um dispositivo de rede no Cacti. Fonte: Cacti (2008). Depois de preenchidos os campos, basta acionar o botão Create (criar) e o dispositivo é cadastrado no banco de dados e então passa a ser monitorado. Para visualizar os gráficos gerados pelo Cacti, basta selecionar a opção graphs no topo da tela. A Figura 26 mostra esta visualização, exibindo apenas um gráfico, entretanto basta utilizar a rolagem para mostrar os outros gráficos. No topo da tela existe um modo de montar o gráfico de acordo com um período especificado. Inicialmente, o Cacti já preenche esses valores que exibem os gráficos com base em dados das últimas 24 horas. No lado esquerdo da tela, é possível selecionar o 37 dispositivo que se deseja visualizar os gráficos (neste caso existe apenas um). Abaixo de cada gráfico, o Cacti apresenta estatísticas. Figura 26. Visualizando gráficos no Cacti. Fonte: Cacti (2008). Com o Cacti e o Nagios analisados, parte-se então para a criação de uma tabela com os recursos destes softwares, contendo o que a solução proposta também irá possuir. 2.3.3 Tabela comparativa de softwares de gerência de redes Na Tabela 9, é exibida uma tabela comparativa, mostrando os recursos mais importantes disponíveis em cada um dos softwares de gerência de redes estudados e os recursos que foram implementados na solução proposta. 38 Tabela 9. Tabela comparativa de softwares de gerência de redes Recurso Exibe o estado de hosts Exibe o estado de serviços Construção de gráficos de uso de hosts e serviços Exibe a topologia da rede Exibe os hosts distribuídos geograficamente Suporte ao SNMP Suporte ao CMIP Plataforma Alerta por Nagios Sim Cacti Não Solução Proposta Sim Sim Não Sim Não Sim Sim Sim Não Sim Não Não Sim Sim Não Web Email, ... Sim Não Web Não possui Sim Não Desktop Email 39 3 PROJETO Nesta sessão estão descritas as modelagens das duas aplicações propostas: Motor e Interface do usuário. A modelagem utilizará a UML (Unified Modeling Language – Linguagem de Modelagem Unificada), pois de acordo com Alhir (1998, tradução nossa), é uma linguagem de modelagem visual pronta para usar extensível, simples, escalável, independente de linguagem e de processo de desenvolvimento. O produto final gerado por este trabalho é formado de um motor de coleta e interpretação dos dados de estado dos hosts monitorados e por uma interface gráfica que processa e exibe as informações em um formato adequando para o administrador da rede de computadores. Um exemplo do funcionamento da solução é exibido pela Figura 27. Dependendo da infra-estrutura da rede, é possível rodar a interface no mesmo computador que está rodando o motor. Figura 27. Exemplo de uso. Já o modelo em camadas é exibido Figura 28. Figura 28. Modelo em camadas. Host é qualquer dispositivo de rede gerenciável por SNMP. Ele normalmente executa dentro de um sistema operacional (ex: Microsoft Windows, GNU/Linux, Cisco IOS) ou ainda em firmwares 2que implementam o protocolo. Motor implementa o software de tratamento de eventos propriamente dito. As principais funções do motor do UNMS são: gravar ocorrências (log), enviar alertas, realizar o polling, além de diversas outras menos perceptíveis pelos demais elementos. Já a Interface oferece interação do motor com o ser humano. Nela estão contempladas todas as rotinas de manipulação do motor, tais como cadastros, eventos, relatórios, gráficos e outros. 3.1 Requisitos Funcionais, Não Funcionais e Regras de Negócio A descrição dos Requisitos Funcionais, Não Funcionais e as Regras de Negócio são primordiais para a construção de qualquer software, pois descrevem o que e como será criado. Motor e interface são descritos separadamente. 2 Software embutido em aparelhos eletrônicos, tais como modems, roteadores e switches, entre outros. 41 3.1.1 Motor O motor será a aplicação responsável por coletar as informações dos hosts e serviços da rede e armazená-las. Os requisitos funcionais identificados estão descritos a seguir: • RF01: O motor deve coletar as informações disponíveis de um host através do protocolo SNMP. • RF02: O motor deve gravar as informações coletadas num banco de dados. • RF03: O motor deve realizar monitoramento por ICMP Echo/Reply em todos os hosts cadastrados. • RF04: O motor deve possuir um mecanismo de auto-detecção de hosts na LAN. Os requisitos não funcionais identificados estão a seguir. A categorização dos itens está entre parênteses. • RNF01: O motor deve ser construído utilizando a linguagem de programação C#. (implementação) • RNF02: O motor deve utilizar o SGDB PostgreSQL 8.2. (implementação) • RNF03: O motor deverá ser construído utilizando a plataforma Mono. (implementação) • RNF04: O motor deve ser compatível com as versões 1 e 2 do protocolo SNMP. (conformidade) • RNF05: O motor não deverá apresentar interface gráfica. (usabilidade) • RNF06: O motor será concebido como software livre, licenciado nos termos da licença GPLv2 (General Public License 2- Licença Pública Geral) (GNU, 2008). As regras de negócio identificadas estão a seguir: • RN01: Caso não haja configurações avançadas de um dado host, o motor irá monitorá-lo com o uso ICMP-ECHO / ICMP-REPLY. 42 • RN02: O motor não trata da configuração de traps nos dispositivos de rede. 3.1.2 Interface com o usuário A interface com o usuário será a aplicação responsável por exibir os dados coletados na tela bem como permitir a configuração do sistema. Os requisitos funcionais identificados são os seguintes: • RF01: A interface deve permitir o cadastro de hosts. • RF02: A interface deve permitir o cadastro de serviços que serão monitorados. • RF03: A interface deve exibir a localização dos hosts cadastrados utilizando o mecanismo do Google Earth. • RF04: A interface deve exibir uma tela de monitoramento que liste todos os hosts e seu estado. • RF05: A interface deve exibir uma tela de monitoramento que liste todos os serviços por host com o respectivo estado e descrição. • RF06: A interface deve permitir o cadastro de usuários. • RF07: A interface deve exibir a topologia da rede. • RF08: A interface deve exibir registros de eventos (logs). • RF09: A interface deve exibir graficamente, o histórico da taxa de uso dos itens selecionados de cada host. • RF10: O sistema deve permitir que o usuário cadastre grupos de hosts. • RF11: A interface deve permitir ao usuário iniciar o recurso de auto-detecção da rede o qual se encontra no motor. • RF12: A interface deve permitir a visualização do histórico de eventos de um host. Os requisitos não funcionais identificados para a construção do software estão listados abaixo. As categorias de cada requisito estão entre parênteses. 43 • RNF01: A interface deve ser desenvolvida utilizando a linguagem de programação Visual C#. (implementação) • RNF02: O Sistema de Gerenciamento de Banco de Dados que será utilizado é o PostgreSQL. (implementação) • RNF03: A interface será concebida como software livre, licenciado nos termos da licença GPLv2 (General Public License 2- Licença Pública Geral) (GNU, 2008). As regras de negócio identificadas são as seguintes: • RN01: Cada serviço cadastrado deve estar com relacionado com um host previamente cadastrado. • RN02: Cada item que está sendo grafado deve estar relacionado com um host previamente cadastrado. 3.2 Diagramas de Caso de Uso Os diagramas de caso de uso são importantes no projeto de qualquer sistema, pois de acordo com Alhir (1998, tradução nossa), eles contêm os atores que representam os usuários do sistema, incluindo os usuários humanos e outros sistemas, além de representar as funcionalidades ou serviços providos pelo sistema para o usuário. 3.2.1 Motor O diagrama de caso de uso construído para o Motor da aplicação é exibido na Figura 29. Figura 29. Diagrama de casos de uso do Motor. 44 3.2.2 Interface com o usuário Já os diagramas de caso de uso para a interface são exibidos na Figura 30. Figura 30. Diagrama de casos de uso da interface. A descrição dos casos de uso da interface é feita a seguir. 3.2.2.1 UC01 – Efetuar login Este caso de é responsável por efetuar o login no sistema. Relações • RF06: A interface deve permitir o cadastro de usuários. Condições • Pré-condição: Ter um usuário já cadastrado. • Pós-condição: Um usuário está autenticado no sistema. Cenários Faz o login {Principal} 45 1. Ao abrir o sistema, o usuário informa o seu nome de usuário e a senha (Figura 31). 2. Sistema verifica se o usuário e senha estão corretos. 3. O sistema fecha a tela de login e abre a tela principal. Usuário e/ou senha inválidos {Exceção} Se no passo 2 o usuário e/ou senha estiverem errados ou usuário não existe 2.1. O sistema exibe uma tela com a mensagem “Usuário e/ou senha inválidos” Figura 31. Interface de login. 3.2.2.2 UC02 – Cadastra um host Este caso de uso trata do cadastramento de hosts no sistema. Relações • RF01: A interface deve permitir o cadastro de hosts. • RF10: O sistema deve permitir que o usuário cadastre grupos de hosts. Condições • Pré-condição: Um usuário autenticado no sistema. • Pré-condição: Um tipo de host deve estar cadastrado. • Pré-condição: Um grupo de host deve estar cadastrado. • Pós-condição: Um host está cadastrado. • Pós-condição: O host cadastrado, se ativo, começa a ser monitorado. 46 Cenários Cadastra o host {Principal} 1. O usuário abre a interface de cadastro de hosts (Figura 32). 2. O usuário informa os dados do novo host. 3. O usuário clica em “Salvar”, ou no botão com um ícone de disquete. Altera um host {Alternativo} Se no passo 2 o usuário quiser alterar um host: 2.1. O usuário clica no ícone de lupa na parte superior e seleciona o host a ser alterado. 2.2. O usuário altera os dados do host. 2.3. O usuário clica em salvar. Exlcui um host {Alternativo} Se no passo 2 o usuário quiser excluir um host: 2.1. O usuário clica no ícone de lupa na parte superior e seleciona o host a ser alterado. 2.2. O usuário clica em Excluir ou no botão com um desenho de X. 2.3. Uma janela é exibida pedindo a confirmação da exclusão. 47 Figura 32. Interface principal do cadastro de hosts. 48 Altera a Forma de Monitoramento {Alternativo} Se no passo 2 o usuário quiser alterar ou configurar um modo de monitoramento diferente: 2.1. O usuário clica no botão “Monitoramento”. 2.2. O usuário altera os dados na interface que irá surgir conforme necessário (Figura 33). 2.3. O usuário clica em OK. Figura 33. Interface de configuração de monitoramento. 3.2.2.3 UC03 – Cadastra um serviço Este caso de uso trata do cadastro de serviços que podem ser monitorados. Relações • RF02: A interface deve permitir o cadastro de serviços que serão monitorados. Condições • Pré-condição: Um host deve estar cadastrado. • Pós-condição: Um serviço está cadastrado. Cenários 49 Cadastra o Serviço {Principal} 1. O usuário abre a interface de cadastro de hosts e clica em Serviços (Figura 34). 2. O usuário preenche os dados sobre o serviço. 3. O usuário clica em “Salvar”. Altera um serviço {Alternativo} Se no passo 2 o usuário quiser alterar um serviço: 2.1. O usuário seleciona o serviço na lista. 2.2. O usuário altera os dados do serviço conforme necessário (Figura 34). 2.3. O usuário clica em Salvar. 2.4. Caso as operações na janela foram finalizadas, o usuário clica em OK. Exclui um serviço {Alternativo} Se no passo 2 o usuário quiser excluir um serviço: 2.1. O usuário seleciona o serviço na lista. 2.3. O usuário clica em Remover. 2.4. Caso as operações na janela foram finalizadas, o usuário clica em OK. 50 Figura 34. Interface de cadastro de serviços. 3.2.2.4 UC04 – Cadastra um usuário Este caso de uso trata do cadastro de um usuário que poderá utilizar o sistema de monitoramento. Relações • RF06: A interface deve permitir o cadastro de usuários. Condições • Pré-condição: Um usuário autenticado no sistema. • Pós-condição: Um novo usuário foi cadastrado, alterado ou excluído no sistema. Cenários Cadastra o usuário {Principal} 1. O usuário abre a interface de cadastro de usuários (Figura 35). 2. O usuário informa os dados do novo usuário. 3. O usuário clica em “Salvar”. 51 Altera um usuário {Alternativo} Se no passo 2 o usuário quiser alterar os dados de um usuário: 2.1. O usuário faz uma busca clicando no botão com desenho de uma lupa. 2.2. O usuário seleciona o usuário a ser alterado. 2.3. O usuário altera os dados do usuário selecionado. 2.4. O usuário clica em “Salvar”. Exclui um usuário {Alternativo} Se no passo 2 o usuário quiser alterar os dados de um usuário: 2.1 O usuário faz uma busca clicando no botão com desenho de uma lupa. 2.2. O usuário seleciona o usuário a ser excluído. 2.3. O usuário clica em “Excluir”. 2.4. Uma janela é exibida pedindo a confirmação da exclusão. Figura 35. Interface de cadastro de usuários. 3.2.2.5 UC05 – Visualiza o estado dos hosts Este caso de uso corresponde à visualização dos estados dos hosts cadastrados. 52 Relações • RF04: A interface deve exibir uma tela de monitoramento que liste todos os hosts e seu estado atual. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pré-condição: Um host deve estar cadastrado no sistema. Cenários Visualização de Estados de Hosts{Principal} 1. O usuário abre a interface de visualização de estados de hosts (Figura 36). 2. O usuário pode selecionar o Grupo ou tipo de hosts para filtrar quais hosts devem ser exibidos na lista. Figura 36. Interface de visualização de estados de hosts. 3.2.2.6 UC06 – Visualiza os estados dos serviços dos hosts Este caso de uso corresponde à visualização dos estados dos serviços de hosts cadastrados. 53 Relações • RF05: A interface deve exibir uma tela de monitoramento que liste todos os serviços por host com o respectivo estado e descrição. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pré-condição: Um host deve estar cadastrado no sistema. • Pré-condição: Um serviço deve estar cadastrado. Cenários Visualização de Estados de Serviços dos Hosts {Principal} 1. O usuário abre a interface de visualização de estados de hosts (Figura 37). 2. O usuário pode selecionar o Grupo de hosts para filtrar quais serviços dos hosts devem ser exibidos na lista. Figura 37. Interface de visualização de estados dos serviços dos hosts. 54 3.2.2.7 UC07 – Visualiza a topologia lógica da rede Este caso de uso corresponde à visualização da topologia lógica da rede. Relações • RF07: A interface deve exibir a topologia lógica da rede. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pré-condição: Um host deve estar cadastrado no sistema. Cenários Visualização da Topologia Lógica da Rede {Principal} 1. O usuário abre a interface de visualização da topologia lógica da rede (Figura 38). Figura 38. Interface de visualização da topologia da rede. 55 3.2.2.8 UC08 - Visualiza os hosts geograficamente no Google Earth Este caso de uso corresponde à visualização dos hosts utilizando o mecanismo do Google Earth. Relações • RF03: A interface deve exibir a localização dos hosts cadastrados utilizando o mecanismo do Google Earth. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pré-condição: Um host deve estar cadastrado no sistema. Cenários Visualização geográfica de hosts {Principal} 1. O usuário abre a interface de visualização do posicionamento geográfico dos hosts (Figura 39). 2. O software Google Earth, se instalado, irá exibir os hosts cadastrados. Figura 39. Interface para a chamada da visualização de hosts no Google Earth. 56 3.2.2.9 UC10 – Visualiza gráficos de uso Este caso de uso corresponde a visualização de gráficos de utilização e/ou carga de recursos dos hosts. Relações • RF09: A interface deve exibir graficamente, o histórico da taxa de uso dos itens selecionados de cada host. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pré-condição: Um host deve estar cadastrado no sistema. Cenários Visualização de gráficos {Principal} 1. O usuário abre a tela de exibição de gráficos (Figura 40). 2. O usuário seleciona qual host, monitor e o período de visualização. 3. O usuário clica no botão Visualizar. Figura 40. Visualização de gráficos. 57 3.2.2.10 UC11 – Visualiza registros de eventos Este caso de uso corresponde a visualização de registros (logs). Relações • RF08: A interface deve exibir registros de eventos (logs). Condições • Pré-condição: O usuário deve estar autenticado no sistema. Cenários Visualização de registro de eventos {Principal} 1. O usuário abre a tela de exibição de eventos (Figura 41). Figura 41. Visualização de eventos. 58 3.2.2.11 UC12 – Cadastro automático de hosts Este caso de uso corresponde a auto-detecção de hosts na rede. Relações • RF11: A interface deve permitir ao usuário iniciar o recurso de auto-detecção da rede. Condições • Pré-condição: O usuário deve estar autenticado no sistema. • Pós-condição: Um ou mais hosts foram adicionados no sistema. Cenários Detecção de hosts {Principal} 1. O usuário abre a tela de detecção de hosts (Figura 42). 2. O usuário seleciona o método de detecção. 3. O usuário clica em “Iniciar”. 4. Uma barra de progresso indica o andamento da detecção. 5. Ao final do processo, o usuário selecione os hosts a serem adicionados e clica em salvar. 59 Figura 42. Detectando hosts. 3.3 Diagramas de Classe De acordo com Booch, Rumbaugh e Jacobson (2005, tradução nossa), “Os diagramas de classes são os diagramas encontrados com maior freqüência na modelagem de sistemas orientados a objetos. Um diagrama de classes mostra um conjunto de classes, interfaces e colaborações e seus relacionamentos”. As classes, de acordo com Alhir (1998, tradução nossa), são entidades que possuem atributos, operações e associações. As associações representam o relacionamento entre duas ou mais classes que possuem em comum, algumas características. Para o correto entendimento do funcionamento e construção dos módulos, os diagramas de classes são exibidos nas sessões seguintes. 60 3.3.1 Motor A Figura 43 exibe o diagrama de classes do motor. Figura 43. Diagrama de classes do motor. A descrição de cada classe é exibida a seguir: • Host: Esta classe corresponde a um host; • HostService: Esta classe corresponde a um serviço que se encontra num host; • ServiceType: Esta classe representa um tipo de serviço; • DateTimePeriod: É uma classe simples que possui dois atributos que definem um intervalo de tempo. Ela está ligada à classe Host, pois define quais intervalos de tempo este não será monitorado; • HostData: Classe que guarda qualquer tipo de dado relacionado à um host. Normalmente será preenchida por dados da MIB do host; • Trap: Classe representa uma trap recebida pelo motor. Esta ligada a um Host pois este pode possuir várias traps; • Group: Representa um grupo de hosts; • User: corresponde à um usuário do sistema; 61 • StateAlert: classe que contém dados sobre em qual situação pode se emitir um alerta devido uma trap; • MonitoringType: é um enumerator que identifica qual é o tipo de monitoramento de um host; e • Engine: classe responsável por todas as operações do motor. 3.3.2 Interface O diagrama de classes da interface é semelhante ao diagrama do motor, sendo que apenas a classe Engine não está presente. 62 3.4 Diagrama Entidade-Relacional O diagrama entidade-relacional, apesar de não ser padrão UML, ele é importante, pois define a estrutura do banco de dados. O diagrama resultante para este projeto é exibido pela Figura 44. Figura 44. Diagrama Entidade-Relacional. 63 4 DESENVOLVIMENTO A programação do UNMS empregou as seguintes ferramentas: • Microsoft Visual Studio 2005 • Banco de dados PostgreSQL 8.3 • pgAdmin III • MonoDevelop 1.0 Ao utilizar o Visual Studio 2005 (VISUALSTUDIO, 2008) com a linguagem de programação C#, foi utilizada uma biblioteca de conexão com o banco de dados que visa facilitar o uso do nPgSQL (POSTGRESQL, 2008). A utilização de ODBC foi descartada pelo fato de oferecer desempenho inferior se comparado com uma conexão direta com o banco de dados. Foi utilizado o padrão DAO (Data Access Object) de desenvolvimento. Este padrão permite que ocorra a separação da lógica de negócio da parte que faz o tratamento do acesso aos dados persistidos (BUSHMANN; HENNEY; SCHMIDT, 2007, tradução nossa). Com base neste padrão, uma maneira um pouco diferente de desenvolvimento foi adotada. Para garantir uma boa modularidade, optou-se por desenvolver estes itens da seguinte forma: 1. Um Project que possui as classes entidade (beans) e persistência; 2. Um Project que possui as classes de visão. A Figura 45 demonstra no Visual Studio como foi abordado o padrão de desenvolvimento DAO. O Project Hosts apresenta, entre outros, a classe Bean (Host) e a classe DAO (HostDAO). 64 Figura 45. Formato de desenvolvimento. Portanto, para cada entidade do sistema, haverá dois Projects em uma Solution do Visual Studio. Isto garante que implementações e correções futuras sejam facilitadas. Além disso, este formato permite que tanto o motor quanto a interface utilizem os mesmos Projects de beans e DAO. Além disso, o HostDAO foi utilizado para acesso a bases SNMP no host. Antes de aprofundar o desenvolvimento dos recursos mais importantes do motor e da interface, é necessário entender o processo da criação da Classe de manipulação de dados do protocolo SNMP. 4.1 Classe de manipulação de dados do protocolo SNMP Para desenvolver um software que possa se comunicar através de SNMP com os dispositivos de rede, foi necessário pesquisar bibliotecas que fornecessem os recursos necessários para isto, já que o .NET Framework não possui tal recurso. Entretanto, com o objetivo de adquirir um conhecimento mais aprofundado sobre o assunto, foi decidido que uma biblioteca própria fosse construída, resultando em mais assuntos a serem revisados. O estudo bibliotecas já existentes ajudaram a compreender melhor o protocolo. A lista de bibliotecas estudadas é exibida pela Tabela 10. 65 Tabela 10. Bibliotecas SNMP pesquisadas Biblioteca An SNMP Library for .NET Framework (CROWE, 2005) SNMP Library (CODEPROJECT, 2008) Descrição Esta biblioteca é bastante completa, mas complexa. Possui métodos de tradução de OIDs para descrição e vice-versa. Possui métodos simples de utilização. Por outro lado, necessita de instância de alguns objetos que a torna confusa. Além disso, ela é carente em alguns recursos que são necessários para este projeto. Para construir uma biblioteca de acessos SNMP, inicialmente foram necessários estudos sobre o funcionamento de mais baixo nível do protocolo. O entendimento da estrutura do datagrama SNMP, exibida pela Figura 46, foi primordial para a construção da biblioteca. Figura 46. Datagrama SNMP. Fonte: Adaptado de Bruey (2008). Conforme o estudo e o desenvolvimento ocorriam através de observações no diagrama, o padrão TLV (Type, Length, Value – Tipo, Tamanho e Valor) e a codificação BER (Basic Encoding Rules – Regras de Básicas de Codificação) foram descobertos: 4.1.1 Padrão TLV Um datagrama SNMP tem sua estrutura básica construída utilizando o padrão TLV (Type, Length, Value – Tipo, Tamanho e Valor) (JAMHOUR, 2008). O pacote é extremamente organizado através deste padrão, de modo que cada parte e sub-parte são separadas, especificadas e dimensionadas de acordo com o valor e tipo. A Figura 47 demonstra o campo community de um datagrama SNMP. Na Figura 46 (Datagrama SNMP), ele seria inserido inteiramente no local correspondente, seguindo este padrão. Figura 47. Espaço community do SNMP. 66 O campo “tipo” é um valor numérico que corresponde a um tipo de dado disponível no ASN.1 (IBIDEM). A lista de tipos de dados e seu valor numérico são demonstrados na Tabela 11. Tabela 11. Tipos de dado do protocolo SNMP utilizado no padrão TLV. Identificador Boolean Integer UInt32 BitString OctetString ObjectIdentifier Null Sequence Counter32 Counter64 Gauge TimeTicks IPAddress Opaque NetAddress Valor 0x01 0x02 0x47 0x03 0x04 0x06 0x05 0x30 0x41 0x46 0x42 0x43 0x40 0x44 0x45 Fonte: Adaptado de CodeProject (2008). O campo “tamanho” é um valor numérico de significa a quantidade de bytes que o campo “valor” possui. 4.1.2 Codificação/Decodificação BER A codificação/decodificação BER (Basic Encoding Rules – Regras Básicas de Codificação) é o sistema adotado para codificação dos dados para transferência do datagrama SNMP pela rede (JAMHOUR, 2008). O BER aplicado ao SNMP é utilizado em casos em que certamente algum valor ocupará mais de um byte. Seu funcionamento consiste em marcar com 1 o bit mais à esquerda de um byte para indicar que existe mais bytes a serem lidos para a decodificação da mensagem. Caso o bit mais à esquerda do byte seja 0, quer dizer que este é o último byte a ser lido. Para exemplificar, um OID deverá ser convertido em um vetor de bytes, para que ele seja incorporado ao pacote SNMP. O OID utilizado é 1.3.6.1756.3.1. O valor 1756 é o ponto em que será necessário aplicar a codificação. 67 Inicialmente, converte-se 1756 para binário: 11011011100 (para facilitar a leitura, em hexadecimal, o seu valor é 0x6DC). A seguir, é necessário separar o valor de sete em sete bits, conforme a Figura 48. 1101 1011100 Figura 48. Valor binário de sete em sete bits. A seguir, os valores separados devem ser completados para todos terem oito bits. Ao serem completados, são marcados os bits mais a esquerda conforme a regra de codificação BER. O resultado é exibido na Figura 49. Os valores grifados são os bits de indicação. 10001101 01011100 Figura 49. Resultado da codificação BER. 4.1.3 A biblioteca de classes resultante As pesquisas realizadas bem como a compreensão dos novos conceitos resultaram na biblioteca de acesso a dados do protocolo SNMP, batizada de “libSNMP”. Esta possui enumerators, classes com métodos de codificação/decodificação BER e classe com métodos para manipulação de dados do SNMP. A classe de codificação BER possui apenas dois métodos, exibidos pela Figura 50. Ambos os métodos trabalham com um vetor de bytes (byte[]) e um valor inteiro de 32 bits sem sinal (UInt32). Public static byte[] Encode(UInt32 source); Public static UInt32 Decode(byte[] source); Figura 50. Métodos da classe de codificação/decodificação BER A principal classe desta biblioteca é a “Snmp”. Esta possui métodos estáticos, responsáveis por consultar os objetos gerenciáveis de dispositivos de rede e retornar os resultados. Além disto, existem também outros métodos que auxiliam no desenvolvimento. A Figura 51 exibe a lista de métodos públicos existentes. 68 Public static SnmpData Request(SnmpVersion ver, string community, SnmpOp op, string oid, string host); public static SnmpData RequestTextual(SnmpVersion ver, string community, SnmpOp op, string textualDesc, string host); public static SnmpDataList RequestWalk(SnmpVersion ver, string community, string startOid, string host); public static string TranslateToDescr(string oid); public static string TranslateToOid(string textualDescr); public static string GetDeviceDescription(DeviceType dt, int deviceIndex, string host, string community); Figura 51. Métodos da classe de Snmp. O método Request é o método responsável por realizar uma operação sobre algum valor correspondente ao OID informado. O tipo da operação é passada por parâmetro através de um enumerator. A versão do protocolo também é selecionada por um enumerator. O método RequestTextual é semelhante ao Request, mas a operação é realizada passando a descrição textual do OID. Dentro do método ocorre uma operação de tradução da descrição em um OID, já que em um pacote SNMP não suporta operações utilizando-se a descrição textual. O RequestWalk utiliza-se de uma operação do SNMP, o get-next. Através disto, é possível navegar na árvore de OIDs e resgatar vários dados através de um único método. A operação getnext não possui critério de parada, ou seja, é necessário um controle no próprio método de requisição. Para isto, utilizou-se um laço infinito que realizaria um break caso o próximo OID não comece com OID fornecido como parâmetro. Isto foi possível através do método String.StartsWith(). Os métodos TranslateToDescr e TranslateToOid são os responsáveis pela conversão de um OID para sua descrição e vice-versa. Esta operação é possível, pois existe uma tabela em memória que possui os principais OIDs e suas respectivas descrições. O método GetDeviceDescription é utilizado principalmente para consultar qual o nome de um dispositivo de rede ou disco, baseado em uma análise simples do OID passado por parâmetro. O conceito de TLV não exige uma classe ou métodos para seu tratamento. Isto ocorre pelo fato de que este conceito seja utilizado diretamente na construção e decodificação do pacote SNMP. Portanto, o TLV está embutido em todos os métodos do tipo Request presentes na libSNMP. 69 Cada método do Request retorna um tipo SnmpData ou um SnmpDataList. O SnmpDataList é uma lista de SnmpData que contém métodos de exibição de dados para o console, métodos de adição diferenciados e de consulta. A definição da classe SnmpData é exibida pela Figura 52 . public SnmpDataType Type; public object Value; public string Oid; public string Description; public string DescriptionWithIndex; public override string ToString(); Figura 52. Métodos e atributos da classe SnmpData. Um SnmpDataType é selecionado em um enumerator conforme o pacote de resposta de algum Request. O atributo Value possui o valor recebido pela resposta e é do tipo object, pois este tipo pode guardar qualquer tipo de informação, podendo ser um tipo básico como int ou uma String por exemplo. Description e DecriptionWithIndex retornam uma descrição do dado, de acordo com a tabela em memória previamente citada. O método ToString() foi construído para que o objeto SnmpData possa ser exibido de maneira mais clara. Nesta mesma biblioteca, existe uma classe privada chamada mib2. Esta contém um objeto DataTable no qual é possível carregar dados em memória e realizar SELECT, como se fosse num banco de dados que suporte SQL. Neste objeto, existem vários registros que representam os OIDs e suas descrições textuais. O objetivo desta classe, portanto, é de possibilitar traduções de OIDs para sua descrição e vice-versa. 4.2 O motor do UNMS O motor do UNMS é o responsável pela realização de todas as verificações de hosts e serviços cadastrados. Sua estrutura é composta por dois mecanismos: • Mecanismo de escalonamento; e • Mecanismo de verificação de hosts e serviços. O mecanismo de escalonamento se assemelha ao escalonador de processos de um Sistema Operacional. No caso do UNMS, o objetivo é verificar quais hosts serão checados na próxima iteração de verificações do motor. A cada chamada desse mecanismo, o tempo que falta para a 70 próxima checagem é recalculado levando-se em conta o tempo atual e o tempo da última verificação. Os hosts selecionados são adicionados na lista de hosts a serem checados. O mecanismo de verificação de hosts e serviços é acionado pelo método Start(). Sua primeira ação é escalonar os hosts, verificando quais devem ser checados. No motor, segue-se a seguinte ordem de verificação: 1. Teste de host através do ICMP Echo/Reply (Ping); 2. Checagem de serviços; e 3. Verificação dos OIDs através de SNMP. A cada verificação realizada, os dados de cada item verificado são atualizados para visualização através da interface. O motor foi todo construído e testado no Visual Studio da Microsoft. Entretanto, devido este ser construído como aplicação console, sua compatibilidade com o Mono não foi comprometida. 4.2.1 Checando através de ICMP O protocolo ICMP é outro caso em que o .NET Framework não fornece os métodos necessários. Para realizar operações com ICMP, foi utilizada a biblioteca Advanced Ping Program (JAVA2S, 2008). Esta biblioteca foi de grande utilidade, mas por outro lado foram necessárias implementações e adaptações. O objetivo foi de padronizar e facilitar o uso da biblioteca. Para as alterações, o sniffer WireShark (WIRESHARK, 2008) foi bastante utilizado. O resultado final foi uma classe que possui cinco métodos públicos, exibidos pela Figura 53. public static List<IPAddress> BroacastICMP(string broadCastIp); public static int Ping(string ipAddress); public static int PingHostName(string hostname); public static List<IPAddress> TraceRoute(string targeIpAddress, int hops); public static List<IPAddress> TraceRouteHostName(string targeHostName, int hops); Figura 53. Métodos da classe ICMP. O método BroadcastICMP retorna a lista de IPs que responderam ao ICMP Echo disparado para um endereço de broadcast. Ping retorna um inteiro com o tempo de resposta de um host em 71 milissegundos. O PingHostName funciona como o método Ping, mas passando um nome de host. Os métodos TraceRoute e TraceRouteHostName retornam uma lista de IPs que fazem parte da rota até o host informado, sendo que o número máximo de passos é informado como parâmetro. A verificação por ICMP ocorre em todos os hosts escalonados para uma determinada iteração, independente do seu tipo de monitoramento. Neste caso, os hosts são atualizados quanto ao resultado obtido pelo ICMP Echo/Reply e em casos de problema, um registro é criado no log. 4.2.2 Checando serviços Este recurso do motor é o responsável pela verificação de serviços de um determinado host de uma porta TCP. Para sua checagem, foi elaborado um método que recebe o nome do host e a porta, retornando um valor em milissegundos correspondente ao tempo de resposta do serviço. Inicialmente, é armazenado o horário de início da verificação. Então, um Socket TCP é instanciado com o objetivo de se conectar a porta do host informado. Após a conexão, já ocorre a desconexão e o cálculo do tempo que a operação levou é retornado. Caso ocorra um erro de conexão é retornado o valor 9999. O tempo limite para verificação de cada porta é de 1 segundo (ou 1000 milissegundos). O sistema de registro de eventos para os serviços é igual ao processo de verificação por ICMP. O tempo de resposta da última medição é armazenado e em casos de erro um registro no log é adicionado. 4.2.3 Checando os OIDs Cada OID cadastrado para um host é verificado a cada iteração para qual o host foi escalonado. Para a checagem, foi utilizado o método Snmp.Request, disponível na biblioteca construída durante o TCC-2. Diferente dos outros dois métodos de verificação, o sistema de verificação SNMP armazena os dados adicionando-os na tabela e não alterando os já existentes. Isto é necessário para a criação dos gráficos. Por outro lado, segue a mesma regra em que caso algum erro seja encontrado, um registro é criado na tabela de log. 72 4.3 Desenvolvimento da Interface A interface do UNMS é a responsável pela exibição dos dados registrados pelo motor de uma maneira amigável ao usuário. Em sua construção, foi proposto um sistema multi-plataforma e o Gtk# seria o sistema de interface gráfica a ser utilizado. Com o MonoDevelop (MONODEVELOP, 2008), é possível construir aplicações multiplataforma para a plataforma .NET com interface gráfica Gtk# e outras. Esta ferramenta é relativamente nova, e a ausência de recursos como break-points, watches entre outros, se tornou um fator decisivo. O resultado foi o abandono desta ferramenta durante o desenvolvimento da interface e o Visual Studio da Microsoft foi utilizado. Espera-se, que com o avanço do projeto Mono, ferramentas gratuitas como o MonoDevelop se tornem mais completas. Como o UNMS foi construído de forma modular, seria possível reutilizar as DLLs construídas no desenvolvimento de uma interface multi-plataforma. Todas as telas de cadastro do sistema foram construídas utilizando a herança de formulários. Este recurso está disponível no Windows Forms e busca o reaproveitamento do código. Isto ocorre ao construir uma interface básica e seus métodos e então criar um novo Form o qual irá herdar desta interface. O resultado no sistema são interfaces padronizadas e com uma lista pronta de todos os métodos a serem implementados. Os componentes do Form “pai” são exibidos na interface de desenvolvimento em um modo de somente leitura. 73 4.3.1 Construção de gráficos na plataforma .NET Para a construção de gráficos em .NET, foi necessário a utilização de uma biblioteca não pertencente ao .NET Framework. Para este TCC, foi utilizado o .Net Charting (DOTNETCHARTING, 2008), um componente pago. Apesar disso, ele pode ser utilizado gratuitamente. Sem o licenciamento, ele exibe um logotipo no gráfico, conforme a Figura 54. Figura 54. Exemplo de uso para o .Net Charting e seu logotipo. .Net Charting é integrado com o Microsoft Visual Studio através de sua adição na lista de componentes, conforme a Figura 55. Figura 55. .Net Charting no Visual Studio. O componente é utilizado ao arrastá-lo ao formulário Windows. Seu posicionamento e dimensões são ajustados, e então se codifica o gráfico. É possível também, utilizá-lo na construção 74 de páginas em ASP.NET. No Windows, as escalas são ajustadas conforme as dimensões do formulário sem necessidade da criação de código adicional. A seguir, na Figura 56, é exibido um exemplo de gráfico de barras construído com o .Net Charting. Figura 56. .Net Charting e gráfico de barras. No UNMS, os gráficos são de linha. A Figura 57 apresenta um trecho de codificação comentado, exemplificando o uso do .Net Charting. chart1.Series = new Series(); //Inicia nova série chart1.Type = ChartType.Scatter; //O gráfico é de linha chart1.SeriesCollection.Clear(); //A coleção de Series é apagada chart1.Title = String.Empty; //O título do gráfico é branco chart1.TitleBox = new Box(); //Re-inicia a caixa do título do gráfico chart1.XAxis.Scale = dotnetCHARTING.WinForms.Scale.Time; //A escala do eixo X é por tempo chart1.XAxis.TimeInterval = TimeInterval.Minute; //A escala é em minutos chart1.XAxis.FormatString = "HH:mm"; //O formato de exibição de dados do eixo X é Horas:Minutos chart1.XAxis.Name = "Tempo"; //O título para o eixo X é tempo chart1.YAxis.Name = "% Carga"; //O título do eixo Y é % Carga //Inserindo valores no gráfico Element el; //Declaro um elemento no gráfico //Laço de repetição que possui um objetos que contêm uma data e um Double foreach (KeyValuePair<DateTime, Double> kvp in ls) { el = new Element(); //Instância de um novo elemento el.YValue = kvp.Value; el.XDateTime = kvp.Key; chart1.Series.AddElements(el); //Insere o novo elemento no gráfico } chart1.SeriesCollection.Add(); //Insere a coleção de dados no gráfico chart1.SeriesCollection[0].DefaultElement.Color = Color.Green; //A linha do gráfico é verde //Não é desejado que cada valor possua um marcador individual chart1.SeriesCollection[0].DefaultElement.Marker.Visible = false; Figura 57. Exemplo de uso do .Net Charting. 75 4.3.2 Exibindo hosts no Google Earth A tarefa de se criar um mecanismo que exibe os hosts no Google Earth foi bastante desafiadora. Após várias pesquisas, foi encontrado um método, o qual consiste na criação de arquivos KML (Keyhole Markup Language – Linguagem de Marcação Keyhole). O arquivo KML é um XML que possui as informações necessárias para se desenhar marcos em um software como o Google Earth. Sua estrutura é facilmente descoberta ao criar um marco no próprio Google Earth e depois utilizar a opção “Salvar meus lugares”. Com o KML gerado pelo Google Earth em mãos, o passo seguinte foi codificar uma classe que possui métodos que criam um KML a partir de dados geográficos. A biblioteca resultante possui duas classes: Location (Localização) e KmlGen (Gerador do KML). A classe Location possui apenas três atributos que identificam um local: nome, latitude e longitude. A classe KmlGen possui uma lista de Location. Com a lista contendo as localizações, podese acionar o método CreateKml, fornecendo o caminho onde será criado o Kml. Para efeitos de teste, um arquivo KML foi gerado a partir do software Google Earth. Sua extensão foi alterada para XML e o arquivo foi aberto para exibição no Internet Explorer. Por parte do KmlGen, foi adotado o mesmo procedimento. Então, com os dois XML sendo exibidos lado a lado foi possível constatar as diferenças e então corrigi-las. O arquivo que demonstra o KML gerado pela ferramenta é exibido Figura 58. Vale ressaltar o grau de precisão da latitude e longitude. 76 <?xml version="1.0" encoding="UTF-8" ?> - <kml xmlns="http://earth.google.com/kml/2.2"> - <Document> <name>Casa.kml</name> - <Style id="sn_ylw-pushpin"> - <IconStyle> <scale>1.1</scale> - <Icon> <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href> </Icon> <hotSpot x="20" y="2" xunits="pixels" yunits="pixels" /> </IconStyle> </Style> - <Style id="sh_ylw-pushpin"> - <IconStyle> <scale>1.3</scale> - <Icon> <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href> </Icon> <hotSpot x="20" y="2" xunits="pixels" yunits="pixels" /> </IconStyle> </Style> - <StyleMap id="msn_ylw-pushpin"> - <Pair> <key>normal</key> <styleUrl>#sn_ylw-pushpin</styleUrl> </Pair> - <Pair> <key>highlight</key> <styleUrl>#sh_ylw-pushpin</styleUrl> </Pair> </StyleMap> - <Placemark> <name>Casa</name> - <LookAt> <longitude>-48.91114504933488</longitude> <latitude>-27.09442286390817</latitude> <altitude>0</altitude> <range>158.9999911670838</range> <tilt>0</tilt> <heading>0.1669381198608628</heading> <altitudeMode>relativeToGround</altitudeMode> </LookAt> <styleUrl>#msn_ylw-pushpin</styleUrl> - <Point> <coordinates>-48.91131727570033,-27.09449447216344,0</coordinates> </Point> </Placemark> </Document> </kml> Figura 58. Exemplo de KML. O Google Earth exibe os hosts através dos marcadores amarelos, que é o modo descrito pelo KML gerado. A maneira de como o software exibe os hosts é exibida pela Figura 59. 77 Figura 59. Google Earth exibindo os hosts. Com a biblioteca concluída, foi adicionado ao menu a opção de exibição dos hosts no Google Earth. Esta opção gera o Kml e inicia o Google Earth o passando como parâmetro. 4.3.3 Desenvolvimento da auto-descoberta de dispositivos A auto-descoberta tem como objetivo de detectar todos os hosts presentes na mesma subrede de onde a interface está sendo executada. Através do protocolo ICMP, o qual utiliza a mesma biblioteca descrita em “Checando através de ICMP”, o mecanismo de detecção pode funcionar de duas maneiras conforme o desejo do usuário: • Descoberta por broadcast; e • Teste de IP por IP. O sistema de descoberta por broadcast consiste em disparar o ICMP Echo (Ping) para o endereço de broadcast da sub-rede. Desta forma, todos os hosts presentes irão responder com um Reply e seus IPs serão armazenados em uma lista. O modo de teste de IP por IP funciona através de um laço de repetição que dispara o ICMP Echo individualmente para cada IP que está na sub-rede. Todos os hosts que responderem a requisição serão armazenados em uma lista. Com a lista de hosts presentes na lista, é possível selecionar quais os hosts que se deseja adicionar ao UNMS. Hosts já cadastrados não são exibidos nesta tela evitando duplicidade. 78 4.4 Testes do UNMS Foram realizados experimentos durante todo o processo de desenvolvimento do UNMS. Os testes foram realizados no Laboratório de Redes da UNIVALI. Estes testes foram feitos à medida que o aplicativo foi se tornando cada vez mais complexo. Além disso, testes de funcionamento gerais foram executados. 4.4.1 Processo de testes da biblioteca de acesso SNMP Devido à alta complexidade no processo de codificação de biblioteca de classes SNMP, uma plataforma de testes foi montada de forma a facilitar a construção desta biblioteca. Os testes foram realizados no Laboratório de Redes da UNIVALI, utilizando a infra-estrutura presente além dos softwares VMWare (VMWARE, 2008) e Wireshark. No VMWare, foi instalado uma máquina virtual com o Sistema Operacional Linux e distribuição Ubuntu 7.04 (UBUNTU, 2008). Com o sistema operacional Windows rodando de forma nativa no computador, comparava-se o funcionamento dos utilitários presentes no Linux como snmpwalk e snmpget com os métodos presentes na biblioteca, até então em desenvolvimento. Com a utilização do Wireshark, foi possível perceber os erros cometidos no processo. A Figura 60, exibe o caso em que o sniffer detectou erros na construção do datagrama SNMP pela biblioteca e exibe também um datagrama construído corretamente, construído pelo utilitário snmpget. Figura 60. Wireshark detectando os datagramas SNMP. É possível observar na Figura 60 os pacotes 3 e 4, sendo respectivamente, a requisição e uma resposta, ambos corretos. No pacote 17, observa-se uma requisição inválida, esta realizada pela biblioteca. Para que esta biblioteca funcione corretamente, algumas classe auxiliares também foram testadas. A classe de codificação/decodificação BER sofreu uma série de testes. Vários valores maiores que 255 foram processados por esta classe de modo a detectar possíveis erros. 79 No próprio Wireshark, foi possível observar problemas através da análise do hexadecimal correspondente ao pacote capturado. Tal comparação foi feita colando-se o hexadecimal dos datagramas correto e incorreto no bloco de notas, conforme a Figura 61. Figura 61. Comparando o datagrama correto (linha superior) e o incorreto (linha inferior). Vale destacar que o hexadecimal desnecessário já é descartado, selecionando a parte que trata de SNMP no próprio Wireshark. Dados aleatórios como o identificador da requisição SNMP, que é identificável analisando o datagrama também foram desconsiderados. Na Figura 61, a linha superior representa parte do datagrama correto e a inferior o incorreto. Ao observar as diferenças existentes, as devidas correções foram realizadas. 4.4.2 Testes da ferramenta Com as bibliotecas necessárias já concluídas, e o desenvolvimento do aplicativo em andamento, os testes foram iniciados. Entretanto, destacam-se os dois principais testes realizados no Laboratório de Redes da UNIVALI. O primeiro teste foi realizado quando a interface era uma mera ferramenta de validação dos dados coletados pelo motor. Neste caso, foi possível observar alguns pequenos erros de coleta e que o motor não atualizava a lista de hosts de forma adequada. Neste cenário, foram elaboradas modificações no escalonador de hosts de modo que este coletasse os novos hosts automaticamente a cada iteração. Deste modo, tanto a interface quanto o motor estariam trabalhando com dados atualizados. Neste mesmo teste, foi verificado como seria o funcionamento do motor no Linux, executando através da plataforma Mono. Como esperado, não houve problemas. Neste mesmo teste, buscou-se avaliar o mecanismo responsável por exibir os OIDs que podem ser utilizados para construir gráficos. Possíveis erros podiam ocorrer na coleta em hosts que executavam sistemas operacionais diferentes do Windows, devido a possíveis vícios no desenvolvimento para este sistema operacional. Entretanto, tais erros não apareceram o que comprovou mais uma vez o bom funcionamento da biblioteca construída bem como a grande utilidade do protocolo SNMP e a MIB-II. 80 O segundo teste foi realizado para verificar possíveis erros. Este teste foi realizado também no Laboratório de Redes da UNIVALI no qual a ferramenta rodou durante uma hora e meia. Neste cenário, nenhum host ou serviço foi alterado ou adicionado, sendo o principal foco o motor do aplicativo. Com monitoramentos realizados periodicamente no gerenciador de tarefas do Windows, foram observadas as porcentagens de consumo de processador, memória e do adaptador de rede. A Tabela 12 exibe de forma resumida os resultados deste segundo teste. Tabela 12. Dados sobre o segundo teste Dado Porcentagem de uso do processador pelo processo motor Memória utilizada pelo processo Porcentagem de uso da rede Hosts monitorados por ICMP Hosts monitorados por SNMP Serviços monitorados Período de polling Valor 4% (valor máximo) Mínimo: 11 Mb Máximo: 40 Mb Mínimo: 0,02% Máximo: 03% 17 03 10 30 segundos para todos os hosts Neste mesmo teste, foram executados os testes de detecção de hosts. Na infra-estrutura de redes em que se encontra o Laboratório de Redes da UNIVALI, a máscara de rede utilizada é a 255.255.254.0, o que permite a presença de 510 IPs para hosts, 1 IP identificador da rede e 1 IP de broadcast. Com o teste desta funcionalidade sendo realizado após as 20h, foram detectados 458 hosts através da detecção IP por IP. O processo de detecção por broadcast, de forma estranha, acabou não detectando host algum. Entretanto, verificou-se no Wireshark que IPs de classe A (10.0.0.0) estavam respondendo ao pedido sendo que IPs de classe C (200.169.60.0) eram esperados. Estes IPs foram descartados. Além disso, buscou-se detectar possíveis erros durante a coleta de dados SNMP para construção de gráficos. Esperava-se que possíveis erros pudessem surgir quando a coleta ocorresse em hosts que executassem em Linux, semelhante ao caso já descrito. Felizmente, estes erros não apareceram e o gráfico de carga de processador de um host com Linux foi construído com sucesso, conforme demonstrado na Figura 62. 81 Figura 62. O gráfico construído corretamente para medir a carga de processamento de um host. Para validar o mecanismo de criação de gráficos, o motor foi iniciado com o host Linux sem processamento algum. Após um pequeno período, foi iniciado o aplicativo “top” o qual comprovou que o computador estava com baixa porcentagem de processamento. Para simular um processamento maior, o aplicativo top foi reiniciado, mas com uma taxa de atualização de dados em 0,01 (a linha de comando utilizada foi: top –d 0.01), o que fez com que o uso do processador pelo próprio aplicativo aumentasse para cerca de 10%. 82 5 CONCLUSÕES Este trabalho de conclusão de curso demonstrou o processo de construção de um software de monitoramento de redes, o UNMS. A utilização em conjunto de vários conceitos, arquiteturas e componentes resultou em um aplicativo potencialmente útil para os gerentes de redes de computadores. A engenharia de software para o UNMS permitiu estudar as diversas facetas necessárias para a concepção do produto final. A discussão do formato final das interfaces, dos elementos que são realmente necessários e úteis foi bastante discutida durante a banca de TCC-I. Vários comentários de visitantes e dos avaliadores agregaram recursos adicionais valiosos, como o sistema de auto-detecção de hosts na rede. Vários itens foram discutidos novamente com o orientador e puderam ser melhorados. Durante o processo de criação do software, foram encontradas várias dificuldades em se desenvolver um software na plataforma Mono. A principal dificuldade foi em utilizar o MonoDevelop, a principal IDE do Mono. Vários recursos valiosos ao desenvolvedor estão ausentes nesta ferramenta o que inviabilizou o desenvolvimento nesta plataforma. Ao descartar a utilização do Mono, utilizou-se o Visual Studio 2005 da Microsoft. Neste cenário, optou-se por manter o motor do UNMS multi-plataforma, obedecendo às regras de desenvolvimento necessárias para atingir este objetivo. Por outro lado, interface gráfica do UNMS não atendeu a esta questão, pois alguns componentes visuais importantes, presentes no Windows Forms, não existem para o Gtk#. Ainda sobre a interface gráfica do UNMS, vale destacar o uso de KML para exibição de pontos geográficos no Google Earth. Tal recurso demonstra grande flexibilidade podendo ser utilizado para várias finalidades. Para realizar o desenvolvimento do motor, foi necessário o estudo mais aprofundado sobre o protocolo SNMP. O conhecimento em Sockets adquirido com o decorrer do curso finalmente foi colocado em prática pelo autor deste TCC. A construção de uma biblioteca própria para tratamento da comunicação SNMP demonstrou ser a parte mais prazerosa e desafiante de todo o processo de construção do UNMS. Além disso, ressalta-se a importância de um software sniffer como o 83 Wireshark, essencial na criação de um software que utiliza Sockets. Nesta etapa vale destacar que existe uma grande escassez de material sobre SNMP destinado aos desenvolvedores de software. O recurso de recebimento de traps, que seria desenvolvido segundo o projeto inicial, acabou não sendo realizado. Entretanto acredita-se que tal operação seja pouco necessária, pois o UNMS realiza um monitoramento ativo através do polling que oferece recursos aparentemente similares em seu modo final de operação. A gerência de redes é uma área com ampla quantidade de elementos que podem ser monitorados, implementados e sugeridos. Durante conversas com o orientador e visitantes do TCCI, pode-se correlacionar vários aspectos que poderiam ser abordados em trabalhos futuros: 1) compatibilidade com MIBs específicas; 2) coleta de dados do syslog; 3) implementação em outros idiomas; 4) interface mais detalhada; 5) estudos sobre escalabilidade; 6) sistema detalhado para inventário da informática e 6) incrementos no sistema de localização geográfica. 84 REFERÊNCIAS BIBLIOGRÁFICAS ALHIR, Siman Si. UML in a nutshell. Sebastopol: O’Reilly, 1998. BOOCH, G., RUMBAUGH, J., JACOBSON, I. The unified modeling language user guide. 2.ed. Boston: Addison-Wesley, 2005. BORNSTEIN, Niel. M.; DUMBILL Edd. Mono: a developer’s notebook. EUA: O’Reilly, 2004. BRUEY, Douglas. SNMP: Simple? Network Management Protocol. Disponível em: <http://www.rane.com/note161.html>. Acesso em: 25 ago 2008. BURGESS, Chris. The nagios book. Disponível em: <http://www.nagiosbook.org>. Acesso em: 13 maio 2008. BUSHMANN, F.; HENNEY, K.; SCHMIDT, D.C. Pattern-oriented software architecture: on patterns and patterns languages. Indianapolis: Willey Publishing, 2007. 5v. CACTI. CACTI: the complete RRDTool-based Graphing Solution. Disponível em: <http://www.cacti.net>. Acesso em: 14 maio 2008. DOTNETCHARTING. ASP.NET chart and charting for .NET. Disponível em: <http://www.dotnetcharting.com>. Acesso em: 20 out 2008. GNU. The GNU General Public License. Disponível em: <http://www.gnu.org/licenses/gpl.html/>. Acesso em: 29 maio 2008. KUROSE, James F.; ROSS, Keith W. Redes de computadores e a internet. 3. ed. São Paulo: Pearson Addison Wesley, 2006. JAVA2S. Advanced ping program. Disponível em: <http://www.java2s.com/Code/CSharp/Network/AdvancedPingProgram.htm>. Acesso em: 15 out 2008. JAMHOUR, Edgard. Gerência de Redes (SNMP). Disponível em: <http://www.ppgia.pucpr.br/~jamhour/Pessoal/Mestrado/TARC/LDAP.ppt>. Acesso em: 10 set 2008. MAURO, Douglas; SCHMIDT, Kevin. Essential SNMP. EUA: O'Reilly, 2001. MILLER, Mark A. Managing internetworks with SNMP. 2. ed. EUA: M & T Books, 1997. MONO. Main page - mono. Disponível em: <http://www.mono-project.com>. Acesso em: 23 maio 2008. MONODEVELOP. Main Page – MonoDevelop. Disponível em: <http://www.monodevelop.com>. Acesso em: 12 set 2008. NAGIOS. Nagios: home. Disponível em: <http://www.nagios.org>. Acesso em: 13 maio 2008. NETWORKDICTIONARY. FCAPS: network management functional model. 2008a. Disponível em: <http://www.networkdictionary.com/networking/FCAPS.php>. Acesso em: 01 abr. 2008. NETWORKDICTIONARY. ISO CMIP: common management information protocol. 2008b. Disponível em: <http://www.networkdictionary.com/protocols/cmip.php>. Acesso em: 01 abr. 2008. OETIKER, Tobias. RRDTool: about RRDtool. Disponível em: <http://oss.oetiker.ch/rrdtool/>. Acesso em: 14 maio 2008. RFC 1157. Simple Network Management Protocol (SNMP). 1990. Disponível em: <http://www.ietf.org/rfc/rfc1157.txt>. Acesso em: 01 abr 2008. RFC 1157. Simple Network Management Protocol (SNMP). 1990. Disponível em: <http://www.ietf.org/rfc/rfc1157.txt>. Acesso em: 01 abr 2008. RFC 1212. Management Information Base for Network Management of TCP/IP-based internets:MIB-II. 1991. Disponível em: <http://www.ietf.org/rfc/rfc1213.txt>. Acesso em: 01 abr 2008. RFC 1213. Management Information Base for Network Management of TCP/IP-based internets:MIB-II. 1991. Disponível em: <http://www.ietf.org/rfc/rfc1213.txt>. Acesso em: 01 abr 2008. RFC 1905. Protocol operations for version 2 of the Simple Network Management Protocol (SNMPv2). 1996. Disponível em: <http://www.ietf.org/rfc/rfc1905.txt>. Acesso em: 01 abr 2008. RFC 1906. Transport mappings for version 2 of the Simple Network Management Protocol (SNMPv2). 1996. Disponível em: <http://www.ietf.org/rfc/rfc1906.txt>. Acesso em: 01 abr 2008. RFC 1907. Management Information Base for Version 2 of the Simple Network Management Protocol (SNMPv2). 1996. Disponível em: <http://www.ietf.org/rfc/rfc1907.txt>. Acesso em: 01 abr 2008. RFC 2571. An architecture for describing SNMP management frameworks. 1999. Disponível em: <http://www.ietf.org/rfc/rfc2571.txt>. Acesso em: 01 abr 2008. RFC 2572. Message processing and dispatching for the Simple Network Management Protocol (SNMP). 1999. Disponível em: <http://www.ietf.org/rfc/rfc2572.txt>. Acesso em: 01 abr 2008. RFC 2573. SNMP Applications. 1999. Disponível em: <http://www.ietf.org/rfc/rfc2573.txt>. Acesso em: 01 abr 2008. RFC 2574. User-based Security Model (USM) for version 3 of the Simple Network Management Protocol (SNMPv3). 1999. Disponível em: <http://www.ietf.org/rfc/rfc2574.txt>. Acesso em: 01 abr 2008. RFC 2575. View-based Access Control Model (VACM) for the Simple Network Management Protocol (SNMP). 1999. Disponível em: <http://www.ietf.org/rfc/rfc2575.txt>. Acesso em: 01 abr 2008. 86 RFC 2579. Textual conventions for SMIv2. 1999. Disponível em: <http://www.ietf.org/rfc/rfc2579.txt>. Acesso em: 01 abr 2008. SCHÖNIG, Hans-Jücrgen; GESCHWINDE, Ewald. Mono kick start. EUA: Sams Publishing, 2003. TANENBAUM, Andrew S. Redes de computadores. 4. ed. Rio de Janeiro: Campus, 2001. TAROUCO et al. Gerenciamento de redes: uma abordagem de Sistemas Abertos. Itaim-Bibi: Makron Books, 1993. TEMPLEMAN, Julian; VITTER, David. Visual Studio .NET – the .NET Framework black book. EUA: The Coriolis Group, 2002. TURTSCHI, Adrian; WERRY, Jason; HACK Greg. C# .NET guia do desenvolvedor. 2 ed. Rio de Janeiro: Alta Books, 2004. UBUNTU. Ubuntu Home Page | Ubuntu. Disponível em: <http://www.ubuntu.com>. Acesso em: 01 ago 2008. VISUAL STUDIO. Sistema de desenvolvimento Visual Studio. Disponível em: <http://msdn.microsoft.com/pt-br/vstudio/products/default.aspx>. Acesso em: 01 nov 2008. VMWARE. VMware: Virtualization via Hypervisor, Virtual Machine and Server Consolidation – Vmware. Disponível em: <http://www.vmware.com>. Acesso em 01 ago 2008. WIRESHARK. Wireshark: Go-deep. Disponível em: <http://www.wireshark.org>. Acesso em: 10 ago 2008. 87