1 Monitoramento de Redes utilizando Netflow e Software Livre: estudo de caso no POP-GO1 Giovane César Moreira Moura POP-GO – Ponto de Presença da RNP em Goiás Praça Universitária, S/N. Setor Universitário. Escola de Engenharia, Prédio UFGNET. CEP-74605-220 – Goiânia,GO [email protected] Resumo. Este artigo trata do uso de Netflow como ferramenta para monitoramento da rede do POP-GO. Mostramos como foi automatizado o processo de caracterização do tráfego utilizando somente software livre em sistema operacional Linux. Todo código-fonte desenvolvido é disponibilizado neste artigo. 1. Introdução O monitoramento de redes tem a função de prover dados e ferramentas para auxiliar o engenheiro de tráfego ou administrador de redes em basicamente quatro atividades: a) Dimensionamento de infra-estrutura de TI: Este é um dos problemas mais difíceis para os administradores resolverem. O monitoramento fornece dados tais como a porcentagem do uso do link, o atraso inerente da rede, o tempo de resposta, etc. Esses dados podem ser valiosos para determinar os gargalos do sistema, que são pontos a serem alterados para uma melhor desempenho. Um exemplo seria de uma empresa que fosse lançar um novo produto com venda pela internet. Como deveria ser expandido sua infraestrutura afim de atender a nova demanda, que aumentaria com o lançamento do novo produto? Se não for feito um dimensionamento correto, os usuários podem não conseguir finalizar a compra no site da empresa. Como conseqüência, eles simplesmente deixarão de comprar. O sucesso do produto depende é diretamente relacionado ao desempenho do sistema. b) Segurança: segurança atualmente não é mais uma opção, é uma necessidade para todos os tamanhos de empresas. Tanto para guardar os segredos comerciais e também para garantir a privacidade dos consumidores e funcionários. Imagine uma loja varejista online que tivesse todo o seu cadastro de clientes extraviado, incluindo dados como número de cartão de crédito. O monitoramento neste caso fornece marcas sobre atividades suspeitas na rede e pode ser usado para identificar origem de tentativas de ataques. c) Caracterização do tráfego: Um administrador pode querer saber quais serviços estão sendo mais utilizados na rede, e para isso o monitoramento é feito para indicar o uso de cada serviço em relação a capacidade da rede. Um exemplo seria separar o tráfego por serviços (http, ftp, smtp) para dimensionar corretamente o sistema. No POP-GO fizemos uma caracterização do tráfego que será mostrada neste mesmo artigo. d) Estudo em geral. 1 Ponto de Presença da RNP em Goiás 2 Dentre as diversas tecnologias de monitoramento de redes, duas se destacam. A primeira e mais simples é o uso do protocolo SNMP [SNM 2005] . SNMP vem embutido em vários dispositivos como roteadores domésticos ADSL, switches e dispositivos de redes em geral. SNMP também pode ser instalado em sistemas operacionais.SNMP é o protocolo mais utilizado para monitoramento, pois é fácil de ser configurado, requer pouca largura de banda e pouca carga de CPU. Além de parâmetros de rede, SNMP pode monitorar outros parâmetros não inerentes a rede, como o espaço em disco de uma estação, temperatura, etc... . Para estudos iniciais de monitoramento, recomenda-se o uso de SNMP. Existe ferramentas livres que integram o monitoramento com SNMP, entre elas o JFFNMS [JFF 2005] Cacti [CAC 2005] . Porém para os dados que necessitávamos o SNMP não nos atendia. Outra tecnologia utilizada para monitoramento de redes é o Cisco IOS Netflow [NET 2005]. Foi esta tecnologia que utilizamos no POP-GO para caracterização do tráfego, devido a uma série de fatores, como facilidade de trabalhar com grande volume de dados, conseguir monitorar o tráfego por endereços IP específicos e já estar disponível no nosso ponto de monitoramento: o roteador de borda. No item 2 explicamos o porquê do monitoramento, no item 3 explicamos o projeto de monitoramento do POP-GO, bem como o configuração do software necessário, tanto quanto a disponibilização de todo código desenvolvido sob licença GPL. No item 4 comentamos os resultados obtidos, com as metas cumpridas. O item 5 é a conclusão do projeto, e invoca a comunidade para trabalhar com o código. Há ainda 5 anexos ao artigo, que trazem o código fonte desenvolvido para este projeto. 2. Necessidade de monitoramento A origem deste projeto foi a necessidade de um único relatório. E a partir da entrega deste relatório, continuamos o projeto estendendo para um uso diversificado. O relatório exigido surgiu a partir de um problema detectado. O POP-GO é conectado ao POP-DF1 via uma conexão ATM alugada de uma operadora de telefonia ( um contrato anual, licitado todo ano). No ano de 2004, a empresa que fornecia o link era então a Brasil Telecom [BRT 2005] . Detectamos que quando um usuário de dentro da rede do POP-GO tentava acessar um site hospedado em Goiás (exemplo: Detran-GO – www.detran-go.gov.br), os pacotes deste usuário saíam do POP-GO e iam até Curitiba-PR para então voltarem para Goiânia. Os pacotes percorriam um caminho muito extenso pelo país, ocasionando maior atraso para o usuário final e uma sobrecarga desnecessária aos demais enlaces da RNP (DF,RJ e PR) para rotear pacotes que poderiam ter ficado dentro do estado de GO mesmo. Para solucionar este problema, foi pensado um projeto de Ponto de Troca de Tráfego2 entre POP-GO e Brasil Telecom. PTT é um conceito implementado em roteadores de borda(no nosso caso um Cisco 7500). A implantação de um PTT exigiria um maior uso de memória e recursos do roteador. Foi necessário então um estudo de viabilidade do projeto, para justificar o uso de tais recursos. Deveríamos descobrir quanto de tráfego da rede do POP-GO se destinava a rede da Brasil Telecom (entenda-se todos os clientes da Brasil Telecom , incluindo-se usuários de ADSL,empresas que contratam link da concessionária, o governo, e etc..) e quanto do tráfego que entrava na rede POP-GO proveniente da rede da Brasil Telecom. Se fosse uma porcentagem significativa de todo tráfego, o PTT seria algo interessante para ambas partes. 1 Ponto de Presença da RNP no Distrito Federal 2 PTT - Ponto de Troca de Tráfego Internet é uma rede eletrônica de alta velocidade onde as redes distintas se conectam por meio de roteadores IP com o propósito de troca de tráfego. 3 3. Projeto de monitoramento Como obter esses dados para o relatório? Para explicar melhor, é necessário mostrar a topologia do POP-GO na Figura 1: Figura 1: Topologia Lógica do POP-GO Esta figura representa a topologia lógica em alto nível do POP-GO (sem considerar a REMAV Goiânia, a qual seu tráfego fica apenas dentro da rede do POP-GO, não passando para a internet). Observe que o POP-GO conecta UFG, Embrapa,CEFET,Sectec e a secretaria municipal de Educação ao POP-DF, e de lá a Internet. Para o tal, todo o tráfego destes clientes vai para um conjunto de switches (representado pelo switch maior), culminando roteador de borda Cisco 7500. Ou seja, basta apenas monitorar todo o tráfego por um ponto da rede, no roteador de borda. Se um aluno de dentro da UFG tenta acessar, por exemplo, o site www.detran.go.gov.br (que pertence a rede Brasil Telecom), esses dados passam pela rede da UFG inteira até alcançar o Cisco 7500 do POP-GO. E lá conseguimos também monitorar o quanto de tráfego de entrada da Brasil Telecom acessa nossa rede. Uma analogia seria como se o Cisco 7500 fosse uma ponte que liga uma ilha (rede do POP-GO) a um continente(Internet). Para realizar o monitoramento apenas no roteador de borda, a Cisco disponibiliza a tecnologia Netflow [NET 2005]. Cisco IOS Netflow é um software disponível no roteador Cisco 7500 do POP-GO, que provê um conjunto chave de serviços para aplicações IP, incluindo contagem de tráfico de rede, billing baseado no uso da rede (por exemplo, monitorar quanto de download um determinado IP realizou), permitem um maior planejamento da rede, maior segurança, monitoramento de tentativas de DoS1 e DDoS2 e caracterização do tráfego. Podemos extrair diversas informações, sobre os usuários da rede e quais aplicativos estão usando, horário de pico, roteamento, etc. O funcionamento do Netflow é basicamente o seguinte: a medida que os pacotes passam por suas interaces, o roteador ( Figura 1) gera dados sobre o tráfego (que são “logs” dos pacotes). Desses fluxos ele acumula dados com características únicas,como 1 Denial of Service, ou ataque de negação de serviço 2 Distributed Denial of Service, ou ataque distribuído de negação de serviço. 4 endereço IP, aplicação, CoS. Então esses dados condensados são exportados para um coletor que os recebe,armazena e então analisa (no nosso caso, utilizamos uma estação IBM Netfinity PIII 550Mhz para coleta de dados utilizando Slackware Linux [SLA 2005]). Vide Figura 2. O software de coleta faz parte do flow-tools [FLO 2005] , que é um conjunto de ferramentas livres). Um dos softwares integrantes do flow-tools, o flow-capture, fica captando os dados vindos do Cisco 7500 na porta 9800 utilizando UPD como protocolo de transporte (diminuindo o overnhead). A título de ilustração, no POP-GO coletávamos até 220MB/dia, em dias de tráfego intenso. O volume de dados é diretamente proporcional a quantidade de tráfego. É um volume expressivo de dados, visto que estes são dados brutos e precisam ser tratados por softwares para se extrair a informação desejada. Como o Netflow coleta os fluxos e sumariza usando IP, poderíamos aplicar regras na análise dos dados coletados e obter respostas a perguntas como: “queremos saber qual a porcentagem dos dados que passam pelo nosso roteador vão para a rede da Brasil Telecom e qual a porcentagem dos dados de entrada que vem de lá”, apenas informando a nossa ferramenta de análise, o flow-tools, quais faixas de endereços IP pertenciam a rede Brasil Telecom . Com o projeto definido, bastava apenas a implementação do que foi estipulado. O que foi feito durante a execução foi basicamente: 1. Pedir para o pessoal da administração da RNP no Rio de Janeiro configurar remotamente o Cisco 7500 para exportar os dados coletados pelo Netflow para nossa estação coletora (IBM PIII 550Mhz). 2. Configurar a estação para coletar os dados. 3. Esperar o tempo de coleta. Para termos uma boa estatística, precisávamos de um bom espaço amostral, que foi definido para um período de 37 dias de coleta. 4. Gerar o relatório após os 37 dias. O relatório foi então entregue no dia 23/09/2004. Descobrimos então que a Brasil Telecom respondeu por 17,64% dos uploads e 11,65% dos downloads na rede do POPGO. Neste ponto finalizou-se o objetivo inicial, porém não paramos por aí. Uma vez que a máquina a coletora ainda continuava a receber os dados do Netflow, decidimos então ampliar o uso da ferramenta para obter outras análises, uma extensão para caracterização de tráfego automatizada. Essa extensão se basearia em: a) Analisar os dados diariamente e extrair informações. Queriamos ter informações sobre o volume total de upload e download e também o tráfego de entrada e saídas nas portas 80(http), 20(ftp), 25(snmp). b) Que essa análise fosse automática, e gerasse gráficos todos os dias. c) Esses gráficos fossem disponibilizados no site do POP-GO. Para executar tal projeto, precisariamos deixar a máquina coletora sempre online recebendo fluxos de netflow, 24horas por dia, 7 dias por semana, e então analisar e armazenar. Baseado em nossa experiência anterior com o JFFNMS [JFF 2005], o qual usa a ferramenta RRDTool [RRD 2005] para armazenar os dados e gerar os gráficos colhidos via SNMP, decidimos utilizar o RRDTool para armazenar e gerar dados a partir da colteta do Netflow. Até este momento tinhámos relatórios do flow-tools e sabíamos 5 onde queríamos chegar, que era ter gráficos com RRDTool. O que fizemos foi desenvolver scripts para automatizar a tarefa. Nossa infra estrutura para o projeto é descrita na Figura 2: Figura 2:Hardware e Software envolvido no projeto No roteador não fizemos nada; ficou por conta do pessoal da RNP do Rio de Janeiro configurá-lo para exportar os fluxos para nossa estação. E nessa estação que todo trabalho foi executado. Depois de analisar os dados e gerar os gráficos, é tudo transmitido via ssh com chave para o servidor web do PoP-GO. 3.1 Configuração da estação coletora Para configurar a estação coletora, a primeira coisa é instalar o pacote flow-tools. Feito isso, utilizamos o flow-capture para coletar os dados, com o comando abaixo: #flow-capture -w /netflow -E20G <ip_estação_coletora>/0/9800 Este comando informa ao flow-capture(software integrante do flow-tools) para coletar os dados na porta 9800 e os armazenar na pasta /netflow, num total de 20G (-E20G - quando este limite é atingido, os dados mais antigos são sobrepostos). Com esta linha é criado automaticamente uma estrutura de diretórios dentro de /netflow separados por ano, mês e dia. E dentro do dia em questão é que os arquivos dos fluxos são propriamente armazenados. A árvore diretórios criada pode ser vista na Figura 3: 6 |-| | | | | | | | | 2004 |-- 2004-10 | |-- 2004-10-01 | |-- 2004-10-02 | |-- 2004-10-03 | |-- 2004-10-04 | |-- 2004-10-05 | |-- 2004-10-06 | |-- 2004-10-07 | |-- 2004-10-08 Figura 3: Estrutura de Diretórios criada pelo flow-capture Dentro de cada diretório é que ficam os arquivos de flows, quem podem ser vistos na Figura 4 : bash-3.00$ du -h 1.3M 1.3M 1.2M 1.2M ft-v05.2005-08-09.000000-0300 ft-v05.2005-08-09.001500-0300 ft-v05.2005-08-09.003000-0300 ft-v05.2005-08-09.004500-0300 Figura 4: Flows armazenados A nomenclatura destes arquivos segue o padrão: ft indica flow-tools, v05 é a versão do Netflow, 2005-08-09 é a data do arquivo, e 001500 é a hora , ou seja, 00:15min. -0300 significa o fuso horário, que é GMT -3 para o Brasil. Flow-tools são um conjunto de ferramentas. Para utilizá-las, basta encadear no shell (bash no nosso caso) por pipes para obter os relatórios desejados. Seguem alguns dos principais componentes do flow-tools na Tabela 1 : Aplicativo Função flow-filter Filtra o tráfego baseado em campos como porta. Por exemplo, podemos querer saber quanto tráfego da AS Brasil telecom corresponde a porta 80. Então marcamos os flows com flow-tag e passamos para o flow-filter.. flow-cat Concatena os arquivos de flow. Tipicamente os arquivos de flows são referentes a 5 ou 15 minutos de exports. Use flow cat para concatená-los e aumentar suas análises para perídos de tempo maiores. flow-report Gera relatórios. Relatório contém IP de origem e destino, AS de origem e destino. Mais de 50 tipos de relatórios são suportados. flow-dscan Ferramenta simples para detectar scanners na rede e tentativas de ataques de negação de serviços (DDoS e DoS) flow-header flow-stat Exibe metadados do flow. Gerá relatórios também, dentre mais de 30 tipos possíveis. Tabela 1: Alguns aplicativos flow-tools 7 Um exemplo do uso de flow-tools seria a execução do comando abaixo: flow-cat /netflow | flow-filter -p25 |flow-stat -f0 Flow-cat concatena os arquivos do Netflow que estão abaixo da árvore /netflow, então passa para a flow-filter via pipe, que filtra os fluxos que possuem tráfego na porta 25. Flow-stat gera relatório a partir dos dados vindos da cadeia de comandos anteriores. Parte deste relatório é exibido abaixo: ## --- ---- ---- Report Information --- --- --# # Fields: Total # Symbols: Disabled # Sorting: None # Name: Overall Summary # # Args: /usr/local/netflow/bin/flow-stat -f0 # Total Flows : 161145 Total Octets : 203357738 Total Packets : 3360762 Total Time (1/1000 secs) (flows): 1288065068 Duration of data (realtime) : 86400 Duration of data (1/1000 secs) : 86470120 Average flow time (1/1000 secs) : 7993.0000 Average packet size (octets) : 60.0000 Average flow size (octets) : 1261.0000 Average packets per flow : 20.0000 Average flows / second (flow) : 1.8636 Average flows / second (real) : 1.8651 Average Kbits / second (flow) : 18.8142 Average Kbits / second (real) : 18.8294 Visto um exemplo básico, passamos agora ao ambiente de produção, como é feito o monitoramento. Todo processo é resumido em scripts agendadados para o crond, para ser executado a partir de 00:01 horas. O conteúdo do script daily, que é executado pelo crond, pode ser visto na Figura 5 . #!/bin/bash #scrip daily – a ser executado diariamente pelo crond #Giovane Moreira [email protected] #scripts abaixo (n_generatte,n_ripdata e NGRAPHS geram o no #final os gráficos, que são passados via scp ao servidor web /var/scripts/n_generate /var/scripts/n_ripdata /var/scripts/NGRAPHS scp -r -i /var/grafico/.ssh/id_rsa /var/scripts/graphs/ login@servidorweb:/var/www/htdocs/ Figura 5: Script daily, executado as 00:01 pelo crond 8 O fluxograma deste processo pode ser visto na Figura 6: Figura 6: Fluxograma completo do projeto Como se pode ver, daily na verdade invoca 3 scripts e realiza uma cópia dos arquivos via scp para o servidor web. 3.2 Software desenvolvidos Com a idéia do projeto já em mente, nos voltamos agora aos softwares desenvolvidos no projeto, todos sobre a licença GPL. Estes softwares são os que o script daily invoca. Incluem 3 scripts em shell e um software em C. Script n_generate: gerar os relatórios do flow-tools a partir do que foi armazenado no disco. Sempre se analisa os dados do dia anterior, por isso date recebe 1 day ago. Como produto gera uma série de arquivos com extensão txt, que são os relatórios com várias linhas e informações. Disponível no Anexo 1. Script n_ripdata: script que se contém expressões regulares para extrair dos relatórios completos apenas os campos chaves que vão para o RRDTool para gerarem os gráficos. Por exemplo, queremos saber quantos bytes passaram de upload na porta 25, e armazenar isso em um arquivo para que possa ser lido, apenas o número total. E então esse valor é armazenado nos arquivos do RRDTool. Disponível no Anexo 2 Software converte.c: Os relatórios que o n_ripdata estão em bytes. Este software então converte de bytes para gigabytes os valores. Disponível no Anexo 3. Script NGRAPHS: script responsável por gerar os gráficos e disponibilizar automaticamente nos diretórios. Cria os gráficos, gera diretórios de acordo com a data. Disponível no Anexo 4. 3.3 Entendendo o RRDTool RRDTool é o software chave para gerenciar os dados fornecidos pelo Netflow e gerar gráfico. Uma documentação de como foi implementado no POP-GO o uso do RRDTool pode ser visto no Anexo 5. 4. Resultados Obtidos Os resultados obtidos foram uma ferramenta automática que coleta, analisa, gera gráficos e disponibiliza no servidor web usando apenas software livre na estações. São disponibilizados diversos tipos de gráficos. O primeiro tipo é que condensa todo o volume de uploads e downloads num gráfico apenas. Abaixo seguem os gráficos 9 disponibilizados para os dias 1 à 7 de agosto de 2005: Um dos gráficos obtidos pode ser visto na Figura 7. Figura 7: Gráfico gerado pelo RRDTool. Downloads de 1 à 7 de agosto. Pela legenda da figura, percebe-se a curva de downloads no POP-GO durante uma semana do mês de agosto de 2005. O valor máximo de download para um único dia desta semana foi de 98.9GB. Percebe-se que a maior parte do tráfego do download não é relacionado as portas mais comuns, como 80,20 e 25. O tráfego peer-to-peer [P2P 2005] é um dos grandes responsáveis pelo restante dos downloads. Outro gráfico é o que mostra todo o upload no mesmo período. Pode ser visto na Figura 8. Figura 8: Uploads de 1 à 7 de agosto A Figura 7 e Figura 8 retrataram o tráfego caracterizado, ou seja , por portas. Para um comparativo em termos de volume total (sem caracterização), podemos ver a Figura 9: 10 Figura 9: Volume total de uploads e downloads Mais gráficos podem ser consultados no site do POP-GO [POP 2005] , na seção monitoramento. Existem gráficos mensais, gráficos de uploads e downloads por porta (gráfico só para porta 80, 25 ,etc.) 5. Conclusão A partir da necessidade de um relatório para viabilização de um PTT foi gerado todo um projeto de monitoramento para o POP-GO. Geramos softwares que automatizam toda a parte de caracterização do tráfego, desde a coleta a disponibilização no site do POP-GO [POP 2005]. Com exceção do roteador Cisco,todos os demais softwares usados neste projeto foram softwares livres. E todo o código produzido volta agora para a comunidade em forma de software livre. Ficou demonstrado a força do software livre na área de monitoramento de rede e a capacidade de integração das mais diversas ferramentas. Com o flow-tools se coleta os dados, e o RRDTool armazena os dados e gera os gráficos (e por sua vez RRDTool utiliza outra grama de aplicativos livres, como a biblioteca gráfica GD para gerar gráficos), então automatizamos este processo com scripts em Shell e código em C e finalmente disponibilizar o conteúdo no servidor web (Apache) do POP-GO via scp. Como produto final temos a seção “Monitoramento” do site do POP-GO sendo atualizada automaticamente. Temos a esperança que a comunidade melhore o código e venha a integrar com outras ferramentas de monitoramento, como o JFFNMS [JFF 2005]. 11 6. Referências [SNM 2005] Net-SNMP . http://net-snmp.sourceforge.net/ [JFF 2005] JJFNMS - Just For Fun Network Management System. http://www.jffnms.org [CAC 2005] Cacti: The Complete RRDTool-based Graphing Solution. http://www.cacti.net [NET 2005] Cisco IOS Software NetFlow. http://www.cisco.com/warp/public/732/Tech/nmp/netflow/index.shtml [BRT 2005] Brasil Telecom - http://www.brasiltelecom.com.br/ [SLA 2005] The Slackware Linux Project. http://slackware.com/ [FLO 2005] flow-tools. http://www.splintered.net/sw/flow-tools/ [RRD 2005] RRDTool – About RRDTool. http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ [P2P 2005] Peer-to-Peer – Wikipedia. http://en.wikipedia.org/wiki/Peer-topeer [POP 2005] Ponto de Presença da RNP em Goiás http://www.pop-go.rnp.br 12 Anexo 1: Script n_generate #n_generate é um software livre; você pode redistribui-lo e/ou #modifica-lo dentro dos termos da Licença Pública Geral GNU como #publicada pela Fundação do Software Livre (FSF); na versão 2 da #Licença. #Este programa é distribuido na esperança que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO #a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença #Pública Geral GNU para maiores detalhes. #!/bin/bash #n_generate: script para acessar os diretórios gerados pelo flowcapture e então gerar os dados necessários para gerar os gráficos via rrdtool. #date recebe data no formato 2005/2005-07/2005-07-08, que é a #estrutura de diretórios do flow-capture que contem os flows. data=`date --date '1 days ago' +%Y/%Y-%m/%Y-%m-%d` netflow_dir=/usr/local/netflow/bin dir=/netflow/$data/ #acessa o diretório dos fluxos do dia. cd $dir echo $dir #Gera upload.txt que contém o Upload Total do roteador $netflow_dir/flow-cat $dir |$netflow_dir/flow-stat -f18> /netflow/${data}/upload.txt #Download Total $netflow_dir/flow-cat $dir |$netflow_dir/flow-stat -f17 >/netflow/${data}/download.txt #Upload na Porta 80 $netflow_dir/flow-cat $dir |$netflow_dir/flow-filter -P80 | $netflow_dir/flow-stat -f0 > /netflow/${data}/p80u.txt #Download na Porta 80$netflow_dir/flow-cat $dir | $netflow_dir/flow-filter -p80 |$netflow_dir/flow-stat -f0 > /netflow/${data}/p80d.txt #Upload na Porta 20 $netflow_dir/flow-cat $dir |$netflow_dir/flow-filter -P20 | $netflow_dir/flow-stat -f0 >/netflow/${data}/p20u.txt #Download na Porta 20 $netflow_dir/flow-cat $dir |$netflow_dir/flow-filter -p20 | $netflow_dir/flow-stat -f0 >/netflow/${data}/p20d.txt #Upload na Porta 25 $netflow_dir/flow-cat $dir |$netflow_dir/flow-filter -P25 | $netflow_dir/flow-stat -f0 >/netflow/${data}/p25u.txt #Download na Porta 25 13 $netflow_dir/flow-cat $dir |$netflow_dir/flow-filter -p25 | $netflow_dir/flow-stat -f0 >/netflow/${data}/p25d.txt 14 Anexo 2: Script n_ripdata #n_ripdata é um software livre; você pode redistribui-lo e/ou #modifica-lo dentro dos termos da Licença Pública Geral GNU como #publicada pela Fundação do Software Livre (FSF); na versão 2 da #Licença. #Este programa é distribuido na esperança que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO #a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença #Pública Geral GNU para maiores detalhes. #!/bin/bash #n_ripdata: script para extrair dados dos relatórios do flowtools, para então usar no RRDTTOOL #como converter data em timestamp: date -d040914 +%s netflow_dir=/usr/local/netflow/bin/ data=`date --date '1 days ago' +%Y/%Y-%m/%Y-%m-%d ` datastamp=`date --date '1 days ago' +%s` cd /netflow/${data} #abaixo são expressões regulares que extraem os campos que serão #armazenados em arquivos _rrd.txt para leitura do RRDTool, apenas o #dado que interessa. É feito uma execução para cada txt. #upload total head -13 upload.txt|tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' > upload_rrd.txt | awk #download total head -13 download.txt|tail -1 | sed "s/\W* \W* \(\W\)/\1/g " awk -F" " '{print $3}' >download_rrd.txt #download na porta 80 head -11 p80d.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p80d_rrd.txt | | awk #download na porta 20 head -11 p20d.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p20d_rrd.txt | awk #download na porta 25 head -11 p25d.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p25d_rrd.txt | awk #upload na porta 80 head -11 p80u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p80u_rrd.txt | awk #upload na porta 20 head -11 p20u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' > p20u_rrd.txt | awk #upload na porta 25 15 head -11 p25u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p25u_rrd.txt | awk #esses dados são gerados em bytes, queremos convertê-los para #gigabytes, por isso chamamos o programa a.out (feito em c) para #executar isso. E grava no mesmo arquivo. Apenas converte de bytes #para gbytes. temp=$(cat upload_rrd.txt) /var/scripts/a.out $temp > upload_rrd.txt temp=$(cat download_rrd.txt) /var/scripts/a.out $temp > download_rrd.txt temp=$(cat p20d_rrd.txt) /var/scripts/a.out $temp > p20d_rrd.txt temp=$(cat p20u_rrd.txt) /var/scripts/a.out $temp > p20u_rrd.txt temp=$(cat p25d_rrd.txt) /var/scripts/a.out $temp > p25d_rrd.txt temp=$(cat p25u_rrd.txt) /var/scripts/a.out $temp > p25u_rrd.txt temp=$(cat p80d_rrd.txt) /var/scripts/a.out $temp > p80d_rrd.txt temp=$(cat p80u_rrd.txt) /var/scripts/a.out $temp > p80u_rrd.txt #agora é que precisamos colocar os arquivos na forma que o RRDTOOL #consegue armazenar. A saída será algo na forma: 40:30:20:20.30 #na documentação do rrdtool será explicado o porque desta forma. #arquivo que o netflow lê e armazena. Versão dos downloads. temp=`cat download_rrd.txt``echo :``cat p80d_rrd.txt``echo :``cat p20d_rrd.txt``echo :``cat p25d_rrd.txt` echo $temp > update_d #arquivo que o netflow lê e armazena. Versão dos uploads. temp=`cat upload_rrd.txt``echo :``cat p80u_rrd.txt``echo :``cat p20u_rrd.txt``echo :``cat p25u_rrd.txt` echo $temp >update_u #comando que faz o rrdtool atualizar sua base com os arquivos #coletados do dia. Apenas atualiza. /usr/bin/rrdtool update /var/scripts/download.rrd $datastamp:`cat update_d` /usr/bin/rrdtool update /var/scripts/upload.rrd $datastamp:`cat update_u` 16 Anexo 3: converte.c //*converte é um software livre; você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação do Software Livre (FSF); na versão 2 da Licença. Este programa é distribuido na esperança que possa ser util, mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU para maiores detalhes.*/ // converte.c – software de conversão de valores de byte para gigabytes. #include <stdlib.h> # include <stdio.h> #include <math.h> int main(int argc, char *argv[]) { if(argc != 2) return(99); printf("%.3f",((atof(argv[1])/1024)/1024)/1024); return(0); } 17 Anexo 4: Script NGRAPHS #NGRAPHS é um software livre; você pode redistribui-lo e/ou #modifica-lo dentro dos termos da Licença Pública Geral GNU como #publicada pela Fundação do Software Livre (FSF); na versão 2 da #Licença. #Este programa é distribuido na esperança que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO #a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença #Pública Geral GNU para maiores detalhes. #!/bin/bash #NGRAPHS: script de criação de gráficos, árvore de diretórios de disponibilização no apache. por Giovane Moreira [email protected] #primeiramente devemos testar se há realmente os diretórios para guardar os gráficos. A estrutura de diretórios segue o padrã #graphs/ANO/MES <DENTRO DE MES TEM AS PASTAS #mensal,1st,2nd,3rd,last,cada qual com 6 gráficos distintos. #após atualizar os rrd , é preciso gerar os gráficos novamente e #disponibilizar. cd /var/scripts ano=`date +%y` mes=`date +%m` temp=`date +%d` ano_mes=`echo graphs/$ano/$mes` ano_dir=`echo graphs/$ano` rrdtool=/usr/bin/rrdtool #determina qual semana estamos, se é 1, 2 3 ou 4 if [ $temp -lt 8 ]; then semana=1 elif [ $temp -ge 7 ] && [ $temp -lt 15 ]; then semana=2 elif [ $temp -ge 15 ] && [ $temp -lt 22 ]; then semana=3 else semana=4 fi #testa se os diretórios existem. Os gráfico são organizados #árvore como: <ano><mes><semana> if [ -d $ano_mes ]; then echo "os dir estão ok" elif [ -d $ano_dir ]; then #cria dir do mes novo mkdir /var/scripts/graphs/$ano/$mes numa 18 mkdir mkdir mkdir mkdir mkdir /var/scripts/graphs/$ano/$mes/mensal /var/scripts/graphs/$ano/$mes/1st /var/scripts/graphs/$ano/$mes/2nd /var/scripts/graphs/$ano/$mes/3rd /var/scripts/graphs/$ano/$mes/last else mkdir mkdir mkdir mkdir mkdir mkdir mkdir /var/scripts/graphs/$ano /var/scripts/graphs/$ano/$mes /var/scripts/graphs/$ano/$mes/mensal /var/scripts/graphs/$ano/$mes/1st /var/scripts/graphs/$ano/$mes/2nd /var/scripts/graphs/$ano/$mes/3rd /var/scripts/graphs/$ano/$mes/last fi #funções que geram os gráficos.. serão invocadas logo abaixo... #Geral_updown: gera gráfico de upload e download total, sem #dividir por portas. Geral_updown() { #gráfico down e upload total syear=$1 #syear = start year – ano de início smonth=$2 sday=$3 eano=$4 #eano = end ano – ano de fim emes=$5 eday=$6 #essa variáveis valem para todas as funções de gráficos desse #script. Delimitam o intervalo de início e fim da geração dos #gráficos. $rrdtool graph Geral_updown.gif --start `date -d ${syear}${smonth}${sday} +%s` --end `date -d ${eano}${emes}${eday} +%s` --title "PoP-GO: Cisco - Downloads e Uploads Volume Total Ano:$syear Mês:$smonth" --vertical-label "gigabytes" DEF:download=download.rrd:download:LAST DEF:upload=upload.rrd:upload:LAST LINE1:download#ff0000:"Downloads" LINE2:upload#0400ff:"Uploads" 'GPRINT:download:LAST:Último Download\:%2.1lf GB' 'GPRINT:upload:LAST:Último Upload\:%2.1lf GB' 'GPRINT:download:MAX:Download Max\:%2.1lf GB' 'GPRINT:upload:MAX:Upload Max\:%2.1lf GB' 'GPRINT:download: MIN:Download Mín\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mín\:%2.1lf GB' -w 509 } #gera o gráfico de upload e download nas portas específicas. Portas_updown() { #gráfico down e upload nas portas específicas 19 syear=$1 smonth=$2 sday=$3 eano=$4 emes=$5 eday=$6 porta=$7 $rrdtool graph P${porta}_updown.gif --start `date -d ${syear}${smonth}${sday} +%s` --end `date -d ${eano}${emes}${eday} +%s` --title "PoP-GO: Cisco - Downloads e Uploads Volume Total Porta $porta Ano:$syear Mês:$smonth" --vertical-label "gigabytes" DEF:download=download.rrd:p${porta}d:LAST DEF:upload=upload.rrd:p${porta}u:LAST LINE1:download#ff0000:"Downloads Porta $porta" LINE2:upload#0400ff:"Uploads Porta $porta" 'GPRINT:download:LAST:Último Download\:%2.1lf GB' 'GPRINT:upload:LAST:Último Upload\:%2.1lf GB' 'GPRINT:download:MAX:Download Max\:%2.1lf GB' 'GPRINT:up load:MAX:Upload Max\:%2.1lf GB' 'GPRINT:download:MIN:Download Mín\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mín\:%2.1lf GB' -w 509 } All_down() { #gráfico download geral e na P80,P20 e P25 syear=$1 smonth=$2 sday=$3 eano=$4 emes=$5 eday=$6 $rrdtool graph All_down.gif --start `date -d ${syear}${smonth}${sday} +%s` --end `date -d ${eano}${emes}${eday} +%s` --title "PoP-GO: Cisco - Downloads - Volume Total Total,Portas 80,20,25 Ano:$syear Mês:$smonth" --vertical-label "gigabytes" DEF:download=download.rrd:download:LAST DEF:p80d=download.rrd:p80d:LAST DEF:p20d=download.rrd:p20d:LAST DEF:p25d=download.rrd:p25d:LAST LINE1:download#ff0000:"Download Total" LINE2:p80d#0400:"Download Porta 80" LINE3:p20d#00FF00:"Download Porta 20" 'GPRINT:download:LAST:Último Download\:%2.1lf GB' 'GPRINT:p80d:LAST:Último Download 80\:%2.1lf GB' 'GPRINT:p20d:LAST:Último Download P20\:%2.1lf GB' 'GPRINT:p25d:LAST:Último Download P25\:%2.1lf GB' 'GPRINT:download:MAX:Download Max\:%2.1lf GB' 'GPRINT:p80d:MAX:Download Max P80 \:%2.1lf GB' 'GPRINT:p20d:MAX:Download Max P20 \:%2.1lf GB' 'GPRINT:p25d:MAX:Download Max P25:%2.1lf GB' 'GPRINT:download:MIN:Download Mín\:%2.1lf GB' 'GPRINT:p80d:MIN:Download Mín P80\:%2.1lf GB' 'GPRINT:p20d:MIN:Download Mín P20\:%2.1lGB' 'GPRINT:p25d:MIN:Download Mín P25\:%2.1lf GB' -w 509 } 20 All_up() { #gráfic upload geral e na P80,P20 e P25 $rrdtool graph All_up.gif --start `date -d ${syear}${smonth}${sday} +%s` --end `date -d ${eano}${emes}${eday} +%s` --title "PoP-GO: Cisco -Uploads - Volume Total Total,Portas 80,20,25 Ano:$syear Mês:$smonth" --vertical-label "gigabytes" DEF:upload=upload.rrd:upload:LAST DEF:p80u=upload rd:p80u:LAST DEF:p20u=upload.rrd:p20u:LAST DEF:p25u=upload.rrd:p25u:LAST LINE1:upload#ff0000:"Upload Total" LINE2:p80u#0400ff:"Upload Porta 80" INE3:p20u#00FF00:"Upload Porta 20" 'GPRINT:upload:LAST:Último Upload\:%2.1lf GB' 'GPRINT:p80u:LAST:Último Upload P80\:%2.1lf GB' 'GPRINT:p20u:LAST:Último Upload P20\:%2.1lf GB' 'GPRINT:p25u:LAST:Último Upload P25\:%2.1lf GB' 'GPRINT:upload:MAX:Upload Max\:%2.1lf GB' 'GPRINT:p80u:MAX:Upload Max P80 \:%2.1lf GB' 'GPRINT:p20u:MAX:Upload Max P20 \:%2.1lf GB' 'GPRINT:p25u:MAX:Upload Max P25 \:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mín\:%1lf GB' 'GPRINT:p80u:MIN:Upload Mín P80\:%2.1lf GB' 'GPRINT:p20u:MIN:Upload Mín P20\:%2.1lf GB' 'GPRINT:p25u:MIN:Upload Mín P25\:%2.1lf GB' -w 509 } #funções agora que setam variáveis e então invocam as funçoes #geradoras de gráficos...#Mensal gera gráficos para o mês inteiro, invocando funções anteriores: Mensal () { #seta syear, smonth e sday, eyear,emonth e eday e invoca syear=$ano smonth=$mes sday=01 eyear=$ano emonth=$mes eday=07 Geral_updown $syear $smonth $sday $eyear $emonth $eday ; Portas_updown $syear $smonth $sday $eyear $emonth $eday 80; Portas_updown $syear $smonth $sday $eyear $emonth $eday 20; Portas_updown $syear $smonth $sday $eyear $emonth $eday 25; All_down $syear $smonth $sday $eyear $emonth $eday ; All_up $syear $smonth $sday $eyear $emonth $eday; #move paras as devidas pastas mv Geral_updown.gif /var/scripts/graphs/$ano/$mes/1st/ mv P80_updown.gif /var/scripts/graphs/$ano/$mes/1st/ mv P25_updown.gif /var/scripts/graphs/$ano/$mes/1st/ mv P20_updown.gif /var/scripts/graphs/$ano/$mes/1st/ mv All_down.gif /var/scripts/graphs/$ano/$mes/1st/ mv All_up.gif /var/scripts/graphs/$ano/$mes/1st/ 21 } #segunda no caso se for a segunda semana do mês Segunda () { #seta syear, smonth e sday, eyear,emonth e eday e invoca syear=$ano smonth=$mes sday=08 eyear=$ano eday=15 emonth=$mes Geral_updown $syear $smonth $sday $eyear $emonth $eday ; Portas_updown $syear $smonth $sday $eyear $emonth $eday 80; Portas_updown $syear $smonth $sday $eyear $emonth $eday 20; Portas_updown $syear $smonth $sday $eyear $emonth $eday 25; All_down $syear $smonth $sday $eyear $emonth $eday ; All_down $syear $smonth $sday $eyear $emonth $eday ; All_up $syear $smonth $sday $eyear $emonth $eday; #move paras as devidas pastas mv Geral_updown.gif /var/scripts/graphs/$ano/$mes/2nd/ mv P80_updown.gif /var/scripts/graphs/$ano/$mes/2nd/ mv P25_updown.gif /var/scripts/graphs/$ano/$mes/2nd/ mv P20_updown.gif /var/scripts/graphs/$ano/$mes/2nd/ mv All_down.gif /var/scripts/graphs/$ano/$mes/2nd/ mv All_up.gif /var/scripts/graphs/$ano/$mes/2nd/ } #para terceira semana do mês Terceira () { #seta syear, smonth e sday, eyear,emonth e eday e invoca syear=$ano smonth=$mes sday=16 eyear=$ano emonth=$mes eday=21 Geral_updown $syear $smonth $sday $eyear $emonth $eday ; Portas_updown $syear $smonth $sday $eyear $emonth $eday 80; Portas_updown $syear $smonth $sday $eyear $emonth $eday 20; Portas_updown $syear $smonth $sday $eyear $emonth $eday 25; All_down $syear $smonth $sday $eyear $emonth $eday ; All_up $syear $smonth $sday $eyear $emonth $eday ; 22 #move as pastas pros devidos locaiss pastas mv Geral_updown.gif /var/scripts/graphs/$ano/$mes/3rd/ mv P80_updown.gif /var/scripts/graphs/$ano/$mes/3rd/ mv P25_updown.gif /var/scripts/graphs/$ano/$mes/3rd/ mv P20_updown.gif /var/scripts/graphs/$ano/$mes/3rd/ mv All_down.gif /var/scripts/graphs/$ano/$mes/3rd/ mv All_up.gif /var/scripts/graphs/$ano/$mes/3rd/ } #para última semana do mês Last () { #seta syear, smonth e sday, eyear,emonth e eday e invoca syear=$ano smonth=$mes sday=22 eyear=$ano emonth=$mes #informa se o mês tem 30 ou 31 ou 28 dias. case $mes in O1) eday=31 ;; 02) eday=28 ;; 03) eday=31 ;; 04) eday=30 ;; 05) eday=31 ;; 06) eday=30 ;; 07) eday=31 ;; 08) eday=31 ;; 09) eday=30 ;; 10) eday=31 ;; 11) eday=30 ;; 12) eday=31 ;; esac Geral_updown $syear $smonth $sday $eyear $emonth $eday ; Portas_updown $syear $smonth $sday $eyear $emonth $eday 80; Portas_updown $syear $smonth $sday $eyear $emonth $eday 20; Portas_updown $syear $smonth $sday $eyear $emonth $eday 25; All_down $syear $smonth $sday $eyear $emonth $eday ; All_up $syear $smonth $sday $eyear $emonth $eday; #move paras as devidas pastas mv Geral_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P80_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P25_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P20_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv All_down.gif /var/scripts/graphs/$ano/$mes/last/ mv All_up.gif /var/scripts/graphs/$ano/$mes/last/ } All_down $syear $smonth $sday $eyear $emonth $eday ; All_up $syear $smonth $sday $eyear $emonth $eday; 23 #move paras as devidas pastas mv Geral_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P80_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P25_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv P20_updown.gif /var/scripts/graphs/$ano/$mes/last/ mv All_down.gif /var/scripts/graphs/$ano/$mes/last/ mv All_up.gif /var/scripts/graphs/$ano/$mes/last/ } #se for a 1ª semana, não há necessidade de gerar gráfico da 2ªsemana. if [ $semana -eq 1 ]; then #gera graficos mensal apenas, e copias ele pra pasta 1st.. pq #sao iguasi! Mensal ; Primeira ; elif [ $semana -eq 2 ]; then #gera grafico mensal, 1st e 2nd Mensal ; Primeira ; Segunda ; elif [ $semana -eq 3 ]; then #gera grafico mensal, 1st, 2nd e 3rd Mensal ; Primeira ; Segunda ; Terceira ; elif [ $semana -eq 4 ]; then #gera todos os graficos Mensal ; Primeira ; Segunda ; Terceira ; Last ; fi #copia os gráficos para o diretório correto. cp -r /var/scripts/graphs /var/www/htdocs chown -R nobody /var/www/htdocs/graphs 24 Anexo 5: Entendendo o RRDTool RRDtool é uma ferramenta que cria arquivos na ordem round-robin e então armazena os valores (como uma base de dados) e depois pode gerar gráficos a partir desses valores. É uma evolução de outro projeto, o MRTG. Enquanto MRTG é focado em aplicações SNMP, o RRDTool pode ser usado para monitorar qualquer tipo de dado, desde dados de rede de computadores a crescimento de bactérias. Para gerar gráficos, ele requer a biblioteca gráfica GD. Antes de usarmos o RRDtool no projeto, precisamos criar os arquivos .rrd , que serão a base de dados para os dados. É nele que serão inseridos os valores diários de upload na porta 80, upload total, download na porta 20, etc... . No uso no PoP-GO decidi criar 2 arquivos: um para downloads e outro para uploads. Utilizei o comando: #Arquivo RRD de downloads rrdtool create download.rrd --start `date -d 040930 +%s` --step 86400 DS:download:GAUGE:86400:0:200 DS:p80d:GAUGE:86400:0:200 DS:p20d:GAUGE:86400:0:200 DS:p25d:GAUGE:864 00:0:200 RRA:LAST:0.5:1:7 RRA:LAST:0.5:1:30 RRA:LAST:0.5:1:365 #Arquivo RRD de Uploads rrdtool create upload.rrd --start `date -d 040930 +%s` --step 86400 DS:upload:GAUGE:86400:0:200 DS:p80u:GAUGE:86400:0:200 DS:p20u:GAUGE:86400:0:200 DS:p25u:GAUGE:86400:0 :200 RRA:LAST:0.5:1:7 RRA:LAST:0.5:1:30 RRA:LAST:0.5:1:365 A sintaxe do arquivo de downloads quanto o de uploads é basicamente a mesma, de forma que basta explicar apenas um deles. O parâmetro create download.rrd passa ao RRDtool que criaremos um arquivo novo do zero, com data inicial em 30/09/04 , passado pelo parâmetro --start . O parâmetro step informa que o passo em segundos que atualizaremos o arquivo, ou seja, o arquivo será atualizado a cada 24 horas, ou 86400 segundos. É que nossa análise é feita após o fim do dia, onde extraímos tudo que aconteceu. Já o parâmetro DS:ds-name:DST:dst arguments significa que estamos criando uma fonte de dados. DS é sigla para Data Source (fonte de dados). Temos várias fontes no script, e pegando como exemplo a DS:p80u:GAUGE:86400:0:200 temos que p80u é um nome para nossa data source (na verdade, armazena os uploads da porta 80,sintaxe que eu uso, você pode usar a que quiser). GAUGE significa que devemos armazenar nosso dado com ele chega. Outras opções no lugar de GAUGE seriam DERIVE, que armazena a derivada da reta valor que chega em relação ao valor anterior. Existem outros tipos de fonte de dados (DST – data source types), consulte as páginas de manual do software para mais informações. Como argumentos estamos usando 86400, que é o período para atualização do arquivo. E 0:200 no caso define a faixa máxima de valores que pode variar este dado, no caso nosso de 0 gigabytes a 200 gigabytes. Qualquer valor fora deixa faixa será interpretado com UNKNOWN. Por exemplo, não é possível que tenhamos download abaixo de 0. No que se refere ao comando RRA:LAST:0.5:1:7, RRA é a sigla para RoundRobin Archive. Um RRA consiste de dados estatísticos de DS(data sources). A sintaxe genérica para o RRA é RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows , que na 25 verdade é parâmetro que diz o que deve ser feito com os dados do DS.Pode ser uma média e armazenar de hora em hora, mas no nosso caso ele armazena o último valor recebido. É o arquivo que determina quantos slots tem para armazenar dados, evitando o crescimento linear da base de dados. Ele armazena amostras para semana,mês e ano no nosso caso. Depois destes arquivos criados, o primeiro passo o armazenar os dados neles, feito da seguinte forma: # esse comando diz para atualizar o arquivo dowload.rrd com a data #atual e o conteúdo extraído de update_d. Vide NGRAPHS. rrdtool update /var/scripts/download.rrd $datastamp:`cat update_d` Ou seja, inserimos um valor como por exemplo 20:40:40:32, que serão os valroes dos downloads geral, na porta 80, 20 e 25 para o dia (representado por $datastamp, vide NGRAPHS) em questão. No outro dia, quando rodarmos o script, o datastamp será outro e atualizará automaticamente o valor. Com os dados “populados”, basta agora gerarmos os gráficos. O RRDtool fornece um parâmetro para criar gráficos. Vejamos o exemplo: $rrdtool graph Geral_updown.gif --start `date -d ${syear}${smonth}${sday} +%s` --end `date -d ${eano}${emes}${eday} +%s` --title "PoP-GO: Cisco - Downloads e Uploads Volume Total Ano:$syear Mês:$smonth" --vertical-label "gigabytes" DEF:download=download.rrd:download:LAST DEF:upload=upload.rrd:upload:LAST LINE1:download#ff0000:"Downloads" LINE2:upload#0400ff:"Uploads" 'GPRINT:download:LAST:Último Download\:%2.1lf GB' 'GPRINT:upload:LAST:Último Upload\:%2.1lf GB' 'GPRINT:download:MAX:Download Max\:%2.1lf GB' 'GPRINT:upload:MAX:Upload Max\:%2.1lf GB' 'GPRINT:download: MIN:Download Mín\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mín\:%2.1lf GB' -w 509 } O parâmetro graph diz ao rrdtool para criar um gráfico de nome Geral_updown.gif, a partir da data depois de --start. Essa data é a do dia anterior, visto que geramos o gráfico e análises após a meia noite. Estabelecemos o fim do gráfico pela opção --end . O parâmetro --title informa qual será o título que aparecerá no gráfico, no cabeçalho, como na figura acima foi PoP-GO ... . A linha DEF:download=download.rrd:download:LAST serve para buscar dados no arquivo rrd. Dentro de download.rrd, pegaremos o valor da DS download com a função de consolidação LAST e armazenaremos num nome virtual (vname) também chamado download. Esse vname é o download após DEF:. Aí dentro deste comando quando quisermos nos refererir a este valor de download dentro de download.rrd, usaremos o nome download apenas. O parâmetro LINE1:download#ff0000:"Downloads" cria uma linha da cor ff0000 que conterá o valor de download variando no no intervalo de tempo que escolhemos acima com --start e --end . O parâmetro 'GPRINT:download:MAX:Download Max\:%2.1lf GB' imprime uma linha que diz Downlaod Max no gráfico e joga o conteúdo de download na frente. O parâmetro -w 509 informa a largura máxima da figura, que será 509 pixels. Foi necessário para padronizar o tamanho do gráfico para o site do PoP-GO. Pode parecer um pouco complicado, mas torna-se fácil com o uso diário. 26 Recomendo leitura das páginas de manual e tutoriais do site oficial do RRDTool. Com isso fecha-se nossas ferramentas desenvolvidas e obtivemos o resultado desejado.