You are on page 1of 26

1

Monitoramento de Redes utilizando Netflow e Software Livre: estudo de caso no POP-GO1


Giovane Csar Moreira Moura POP-GO Ponto de Presena da RNP em Gois Praa Universitria, S/N. Setor Universitrio. Escola de Engenharia, Prdio UFGNET. CEP-74605-220 Goinia,GO giovane@gmail.com Resumo. Este artigo trata do uso de Netflow como ferramenta para monitoramento da rede do POP-GO. Mostramos como foi automatizado o processo de caracterizao do trfego utilizando somente software livre em sistema operacional Linux. Todo cdigo-fonte desenvolvido disponibilizado neste artigo.

1. Introduo
O monitoramento de redes tem a funo de prover dados e ferramentas para auxiliar o engenheiro de trfego ou administrador de redes em basicamente quatro atividades: a) Dimensionamento de infra-estrutura de TI: Este um dos problemas mais difceis 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 so pontos a serem alterados para uma melhor desempenho. Um exemplo seria de uma empresa que fosse lanar um novo produto com venda pela internet. Como deveria ser expandido sua infraestrutura afim de atender a nova demanda, que aumentaria com o lanamento do novo produto? Se no for feito um dimensionamento correto, os usurios podem no conseguir finalizar a compra no site da empresa. Como conseqncia, eles simplesmente deixaro de comprar. O sucesso do produto depende diretamente relacionado ao desempenho do sistema. b) Segurana: segurana atualmente no mais uma opo, uma necessidade para todos os tamanhos de empresas. Tanto para guardar os segredos comerciais e tambm para garantir a privacidade dos consumidores e funcionrios. Imagine uma loja varejista online que tivesse todo o seu cadastro de clientes extraviado, incluindo dados como nmero de carto de crdito. O monitoramento neste caso fornece marcas sobre atividades suspeitas na rede e pode ser usado para identificar origem de tentativas de ataques. c) Caracterizao do trfego: Um administrador pode querer saber quais servios esto sendo mais utilizados na rede, e para isso o monitoramento feito para indicar o uso de cada servio em relao a capacidade da rede. Um exemplo seria separar o trfego por servios (http, ftp, smtp) para dimensionar corretamente o sistema. No POP-GO fizemos uma caracterizao do trfego que ser mostrada neste mesmo artigo. d) Estudo em geral.
1 Ponto de Presena da RNP em Gois

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 vrios dispositivos como roteadores domsticos ADSL, switches e dispositivos de redes em geral. SNMP tambm pode ser instalado em sistemas operacionais.SNMP o protocolo mais utilizado para monitoramento, pois fcil de ser configurado, requer pouca largura de banda e pouca carga de CPU. Alm de parmetros de rede, SNMP pode monitorar outros parmetros no inerentes a rede, como o espao em disco de uma estao, 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] . Porm para os dados que necessitvamos o SNMP no nos atendia. Outra tecnologia utilizada para monitoramento de redes o Cisco IOS Netflow [NET 2005]. Foi esta tecnologia que utilizamos no POP-GO para caracterizao do trfego, devido a uma srie de fatores, como facilidade de trabalhar com grande volume de dados, conseguir monitorar o trfego por endereos IP especficos e j estar disponvel 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 configurao do software necessrio, tanto quanto a disponibilizao de todo cdigo desenvolvido sob licena GPL. No item 4 comentamos os resultados obtidos, com as metas cumpridas. O item 5 a concluso do projeto, e invoca a comunidade para trabalhar com o cdigo. H ainda 5 anexos ao artigo, que trazem o cdigo fonte desenvolvido para este projeto.

2. Necessidade de monitoramento
A origem deste projeto foi a necessidade de um nico relatrio. E a partir da entrega deste relatrio, continuamos o projeto estendendo para um uso diversificado. O relatrio exigido surgiu a partir de um problema detectado. O POP-GO conectado ao POP-DF1 via uma conexo ATM alugada de uma operadora de telefonia ( um contrato anual, licitado todo ano). No ano de 2004, a empresa que fornecia o link era ento a Brasil Telecom [BRT 2005] . Detectamos que quando um usurio de dentro da rede do POP-GO tentava acessar um site hospedado em Gois (exemplo: Detran-GO www.detran-go.gov.br), os pacotes deste usurio saam do POP-GO e iam at Curitiba-PR para ento voltarem para Goinia. Os pacotes percorriam um caminho muito extenso pelo pas, ocasionando maior atraso para o usurio final e uma sobrecarga desnecessria 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 Trfego2 entre POP-GO e Brasil Telecom. PTT um conceito implementado em roteadores de borda(no nosso caso um Cisco 7500). A implantao de um PTT exigiria um maior uso de memria e recursos do roteador. Foi necessrio ento um estudo de viabilidade do projeto, para justificar o uso de tais recursos. Deveramos descobrir quanto de trfego da rede do POP-GO se destinava a rede da Brasil Telecom (entenda-se todos os clientes da Brasil Telecom , incluindo-se usurios de ADSL,empresas que contratam link da concessionria, o governo, e etc..) e quanto do trfego que entrava na rede POP-GO proveniente da rede da Brasil Telecom. Se fosse uma porcentagem significativa de todo trfego, o PTT seria algo interessante para ambas partes.
1 Ponto de Presena da RNP no Distrito Federal 2 PTT - Ponto de Troca de Trfego Internet uma rede eletrnica de alta velocidade onde as redes distintas se conectam por meio de roteadores IP com o propsito de troca de trfego.

3. Projeto de monitoramento
Como obter esses dados para o relatrio? Para explicar melhor, necessrio mostrar a topologia do POP-GO na Figura 1:

Figura 1: Topologia Lgica do POP-GO

Esta figura representa a topologia lgica em alto nvel do POP-GO (sem considerar a REMAV Goinia, a qual seu trfego fica apenas dentro da rede do POP-GO, no passando para a internet). Observe que o POP-GO conecta UFG, Embrapa,CEFET,Sectec e a secretaria municipal de Educao ao POP-DF, e de l a Internet. Para o tal, todo o trfego 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 trfego 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 alcanar o Cisco 7500 do POP-GO. E l conseguimos tambm monitorar o quanto de trfego 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 disponvel no roteador Cisco 7500 do POP-GO, que prov um conjunto chave de servios para aplicaes IP, incluindo contagem de trfico 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 segurana, monitoramento de tentativas de DoS1 e DDoS2 e caracterizao do trfego. Podemos extrair diversas informaes, sobre os usurios da rede e quais aplicativos esto usando, horrio 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 trfego (que so logs dos pacotes). Desses fluxos ele acumula dados com caractersticas nicas,como
1 Denial of Service, ou ataque de negao de servio 2 Distributed Denial of Service, ou ataque distribudo de negao de servio.

4 endereo IP, aplicao, CoS. Ento esses dados condensados so exportados para um coletor que os recebe,armazena e ento analisa (no nosso caso, utilizamos uma estao 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 ttulo de ilustrao, no POP-GO coletvamos at 220MB/dia, em dias de trfego intenso. O volume de dados diretamente proporcional a quantidade de trfego. um volume expressivo de dados, visto que estes so dados brutos e precisam ser tratados por softwares para se extrair a informao desejada. Como o Netflow coleta os fluxos e sumariza usando IP, poderamos aplicar regras na anlise dos dados coletados e obter respostas a perguntas como: queremos saber qual a porcentagem dos dados que passam pelo nosso roteador vo para a rede da Brasil Telecom e qual a porcentagem dos dados de entrada que vem de l, apenas informando a nossa ferramenta de anlise, o flow-tools, quais faixas de endereos IP pertenciam a rede Brasil Telecom . Com o projeto definido, bastava apenas a implementao do que foi estipulado. O que foi feito durante a execuo foi basicamente: 1. Pedir para o pessoal da administrao da RNP no Rio de Janeiro configurar remotamente o Cisco 7500 para exportar os dados coletados pelo Netflow para nossa estao coletora (IBM PIII 550Mhz). 2. Configurar a estao para coletar os dados. 3. Esperar o tempo de coleta. Para termos uma boa estatstica, precisvamos de um bom espao amostral, que foi definido para um perodo de 37 dias de coleta. 4. Gerar o relatrio aps os 37 dias. O relatrio foi ento entregue no dia 23/09/2004. Descobrimos ento 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, porm no paramos por a. Uma vez que a mquina a coletora ainda continuava a receber os dados do Netflow, decidimos ento ampliar o uso da ferramenta para obter outras anlises, uma extenso para caracterizao de trfego automatizada. Essa extenso se basearia em: a) Analisar os dados diariamente e extrair informaes. Queriamos ter informaes sobre o volume total de upload e download e tambm o trfego de entrada e sadas nas portas 80(http), 20(ftp), 25(snmp). b) Que essa anlise fosse automtica, e gerasse grficos todos os dias. c) Esses grficos fossem disponibilizados no site do POP-GO. Para executar tal projeto, precisariamos deixar a mquina coletora sempre online recebendo fluxos de netflow, 24horas por dia, 7 dias por semana, e ento analisar e armazenar. Baseado em nossa experincia anterior com o JFFNMS [JFF 2005], o qual usa a ferramenta RRDTool [RRD 2005] para armazenar os dados e gerar os grficos colhidos via SNMP, decidimos utilizar o RRDTool para armazenar e gerar dados a partir da colteta do Netflow. At este momento tinhmos relatrios do flow-tools e sabamos

5 onde queramos chegar, que era ter grficos 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 no fizemos nada; ficou por conta do pessoal da RNP do Rio de Janeiro configur-lo para exportar os fluxos para nossa estao. E nessa estao que todo trabalho foi executado. Depois de analisar os dados e gerar os grficos, tudo transmitido via ssh com chave para o servidor web do PoP-GO.

3.1 Configurao da estao coletora


Para configurar a estao 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_estao_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 so sobrepostos). Com esta linha criado automaticamente uma estrutura de diretrios dentro de /netflow separados por ano, ms e dia. E dentro do dia em questo que os arquivos dos fluxos so propriamente armazenados. A rvore diretrios criada pode ser vista na Figura 3:

|-| | | | | | | | |

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 Diretrios criada pelo flow-capture

Dentro de cada diretrio 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 padro: ft indica flow-tools, v05 a verso do Netflow, 2005-08-09 a data do arquivo, e 001500 a hora , ou seja, 00:15min. -0300 significa o fuso horrio, que GMT -3 para o Brasil. Flow-tools so um conjunto de ferramentas. Para utiliz-las, basta encadear no shell (bash no nosso caso) por pipes para obter os relatrios desejados. Seguem alguns dos principais componentes do flow-tools na Tabela 1 : Aplicativo
flow-filter

Funo
Filtra o trfego baseado em campos como porta. Por exemplo, podemos querer saber quanto trfego da AS Brasil telecom corresponde a porta 80. Ento marcamos os flows com flow-tag e passamos para o flow-filter.. Concatena os arquivos de flow. Tipicamente os arquivos de flows so referentes a 5 ou 15 minutos de exports. Use flow cat para concaten-los e aumentar suas anlises para perdos de tempo maiores. Gera relatrios. Relatrio contm IP de origem e destino, AS de origem e destino. Mais de 50 tipos de relatrios so suportados. Ferramenta simples para detectar scanners na rede e tentativas de ataques de negao de servios (DDoS e DoS) Exibe metadados do flow. Ger relatrios tambm, dentre mais de 30 tipos possveis.
Tabela 1: Alguns aplicativos flow-tools

flow-cat

flow-report flow-dscan flow-header flow-stat

7 Um exemplo do uso de flow-tools seria a execuo do comando abaixo:


flow-cat /netflow | flow-filter -p25 |flow-stat -f0

Flow-cat concatena os arquivos do Netflow que esto abaixo da rvore /netflow, ento passa para a flow-filter via pipe, que filtra os fluxos que possuem trfego na porta 25. Flow-stat gera relatrio a partir dos dados vindos da cadeia de comandos anteriores. Parte deste relatrio 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 bsico, passamos agora ao ambiente de produo, como feito o monitoramento. Todo processo resumido em scripts agendadados para o crond, para ser executado a partir de 00:01 horas. O contedo 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 -giovane@gmail.com #scripts abaixo (n_generatte,n_ripdata e NGRAPHS geram o no #final os grficos, que so 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 cpia dos arquivos via scp para o servidor web.

3.2 Software desenvolvidos


Com a idia do projeto j em mente, nos voltamos agora aos softwares desenvolvidos no projeto, todos sobre a licena GPL. Estes softwares so os que o script daily invoca. Incluem 3 scripts em shell e um software em C. Script n_generate: gerar os relatrios 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 srie de arquivos com extenso txt, que so os relatrios com vrias linhas e informaes. Disponvel no Anexo 1. Script n_ripdata: script que se contm expresses regulares para extrair dos relatrios completos apenas os campos chaves que vo para o RRDTool para gerarem os grficos. 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 nmero total. E ento esse valor armazenado nos arquivos do RRDTool. Disponvel no Anexo 2 Software converte.c: Os relatrios que o n_ripdata esto em bytes. Este software ento converte de bytes para gigabytes os valores. Disponvel no Anexo 3. Script NGRAPHS: script responsvel por gerar os grficos e disponibilizar automaticamente nos diretrios. Cria os grficos, gera diretrios de acordo com a data. Disponvel no Anexo 4.

3.3 Entendendo o RRDTool


RRDTool o software chave para gerenciar os dados fornecidos pelo Netflow e gerar grfico. Uma documentao 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 automtica que coleta, analisa, gera grficos e disponibiliza no servidor web usando apenas software livre na estaes. So disponibilizados diversos tipos de grficos. O primeiro tipo que condensa todo o volume de uploads e downloads num grfico apenas. Abaixo seguem os grficos

9 disponibilizados para os dias 1 7 de agosto de 2005: Um dos grficos obtidos pode ser visto na Figura 7.

Figura 7: Grfico 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 ms de agosto de 2005. O valor mximo de download para um nico dia desta semana foi de 98.9GB. Percebe-se que a maior parte do trfego do download no relacionado as portas mais comuns, como 80,20 e 25. O trfego peer-to-peer [P2P 2005] um dos grandes responsveis pelo restante dos downloads. Outro grfico o que mostra todo o upload no mesmo perodo. Pode ser visto na Figura 8.

Figura 8: Uploads de 1 7 de agosto

A Figura 7 e Figura 8 retrataram o trfego caracterizado, ou seja , por portas. Para um comparativo em termos de volume total (sem caracterizao), podemos ver a Figura 9:

10

Figura 9: Volume total de uploads e downloads

Mais grficos podem ser consultados no site do POP-GO [POP 2005] , na seo monitoramento. Existem grficos mensais, grficos de uploads e downloads por porta (grfico s para porta 80, 25 ,etc.)

5. Concluso
A partir da necessidade de um relatrio para viabilizao de um PTT foi gerado todo um projeto de monitoramento para o POP-GO. Geramos softwares que automatizam toda a parte de caracterizao do trfego, desde a coleta a disponibilizao no site do POP-GO [POP 2005]. Com exceo do roteador Cisco,todos os demais softwares usados neste projeto foram softwares livres. E todo o cdigo produzido volta agora para a comunidade em forma de software livre. Ficou demonstrado a fora do software livre na rea de monitoramento de rede e a capacidade de integrao das mais diversas ferramentas. Com o flow-tools se coleta os dados, e o RRDTool armazena os dados e gera os grficos (e por sua vez RRDTool utiliza outra grama de aplicativos livres, como a biblioteca grfica GD para gerar grficos), ento automatizamos este processo com scripts em Shell e cdigo em C e finalmente disponibilizar o contedo no servidor web (Apache) do POP-GO via scp. Como produto final temos a seo Monitoramento do site do POP-GO sendo atualizada automaticamente. Temos a esperana que a comunidade melhore o cdigo e venha a integrar com outras ferramentas de monitoramento, como o JFFNMS [JFF 2005].

11

6. Referncias
[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 Presena da RNP em Gois 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 Licena Pblica Geral GNU como #publicada pela Fundao do Software Livre (FSF); na verso 2 da #Licena. #Este programa distribuido na esperana que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO #a qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena #Pblica Geral GNU para maiores detalhes. #!/bin/bash #n_generate: script para acessar os diretrios gerados pelo flowcapture e ento gerar os dados necessrios para gerar os grficos via rrdtool. #date recebe data no formato 2005/2005-07/2005-07-08, que a #estrutura de diretrios 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 diretrio dos fluxos do dia. cd $dir echo $dir #Gera upload.txt que contm 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 Licena Pblica Geral GNU como #publicada pela Fundao do Software Livre (FSF); na verso 2 da #Licena. #Este programa distribuido na esperana que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO #a qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena #Pblica Geral GNU para maiores detalhes. #!/bin/bash #n_ripdata: script para extrair dados dos relatrios do flowtools, para ento 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 so expresses regulares que extraem os campos que sero #armazenados em arquivos _rrd.txt para leitura do RRDTool, apenas o #dado que interessa. feito uma execuo para cada txt. #upload total head -13 upload.txt|tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' > upload_rrd.txt #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 #download na porta 20 head -11 p20d.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p20d_rrd.txt #download na porta 25 head -11 p25d.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p25d_rrd.txt #upload na porta 80 head -11 p80u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p80u_rrd.txt #upload na porta 20 head -11 p20u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' > p20u_rrd.txt #upload na porta 25

| awk

| awk

| awk

| awk

| awk

| awk

15
head -11 p25u.txt |tail -1 | sed "s/\W* \W* \(\W\)/\1/g " -F" " '{print $3}' >p25u_rrd.txt | awk

#esses dados so 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 sada ser algo na forma: 40:30:20:20.30 #na documentao do rrdtool ser explicado o porque desta forma. #arquivo que o netflow l e armazena. Verso 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. Verso 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 Licena Pblica Geral GNU como publicada pela Fundao do Software Livre (FSF); na verso 2 da Licena. Este programa distribuido na esperana que possa ser util, mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica Geral GNU para maiores detalhes.*/ // converte.c software de converso 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 Licena Pblica Geral GNU como #publicada pela Fundao do Software Livre (FSF); na verso 2 da #Licena. #Este programa distribuido na esperana que possa ser util, #mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO #a qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena #Pblica Geral GNU para maiores detalhes. #!/bin/bash #NGRAPHS: script de criao de grficos, rvore de diretrios de disponibilizao no apache. por Giovane Moreira giovane@gmail.com #primeiramente devemos testar se h realmente os diretrios para guardar os grficos. A estrutura de diretrios segue o padr #graphs/ANO/MES <DENTRO DE MES TEM AS PASTAS #mensal,1st,2nd,3rd,last,cada qual com 6 grficos distintos. #aps atualizar os rrd , preciso gerar os grficos 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 diretrios existem. Os grfico so organizados #rvore como: <ano><mes><semana>

numa

if [ -d $ano_mes ]; then echo "os dir esto ok" elif [ -d $ano_dir ]; then #cria dir do mes novo mkdir /var/scripts/graphs/$ano/$mes

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 fi

/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

#funes que geram os grficos.. sero invocadas logo abaixo... #Geral_updown: gera grfico de upload e download total, sem #dividir por portas. Geral_updown() { #grfico down e upload total syear=$1 #syear = start year ano de incio smonth=$2 sday=$3 eano=$4 #eano = end ano ano de fim emes=$5 eday=$6 #essa variveis valem para todas as funes de grficos desse #script. Delimitam o intervalo de incio e fim da gerao dos #grficos. $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 Ms:$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 Mn\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mn\:%2.1lf GB' -w 509 } #gera o grfico de upload e download nas portas especficas. Portas_updown() { #grfico down e upload nas portas especficas

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 Ms:$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 Mn\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mn\:%2.1lf GB' -w 509 } All_down() { #grfico 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 Ms:$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 Mn\:%2.1lf GB' 'GPRINT:p80d:MIN:Download Mn P80\:%2.1lf GB' 'GPRINT:p20d:MIN:Download Mn P20\:%2.1lGB' 'GPRINT:p25d:MIN:Download Mn P25\:%2.1lf GB' -w 509 }

20
All_up() { #grfic 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 Ms:$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 Mn\:%1lf GB' 'GPRINT:p80u:MIN:Upload Mn P80\:%2.1lf GB' 'GPRINT:p20u:MIN:Upload Mn P20\:%2.1lf GB' 'GPRINT:p25u:MIN:Upload Mn P25\:%2.1lf GB' -w 509 }

#funes agora que setam variveis e ento invocam as funoes #geradoras de grficos...#Mensal gera grficos para o ms inteiro, invocando funes 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 ms Segunda () { #seta syear, smonth e sday, eyear,emonth e eday 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/

e invoca

} #para terceira semana do ms Terceira () { #seta syear, smonth e sday, eyear,emonth e eday 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 ;

e invoca

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 ms Last () { #seta syear, smonth e sday, eyear,emonth e eday syear=$ano smonth=$mes sday=22 eyear=$ano emonth=$mes #informa se o ms 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;

e invoca

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, no h necessidade de gerar grfico da 2semana. 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 grficos para o diretrio 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 ento armazena os valores (como uma base de dados) e depois pode gerar grficos a partir desses valores. uma evoluo de outro projeto, o MRTG. Enquanto MRTG focado em aplicaes SNMP, o RRDTool pode ser usado para monitorar qualquer tipo de dado, desde dados de rede de computadores a crescimento de bactrias. Para gerar grficos, ele requer a biblioteca grfica GD. Antes de usarmos o RRDtool no projeto, precisamos criar os arquivos .rrd , que sero a base de dados para os dados. nele que sero inseridos os valores dirios 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 parmetro create download.rrd passa ao RRDtool que criaremos um arquivo novo do zero, com data inicial em 30/09/04 , passado pelo parmetro --start . O parmetro 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 anlise feita aps o fim do dia, onde extramos tudo que aconteceu. J o parmetro DS:ds-name:DST:dst arguments significa que estamos criando uma fonte de dados. DS sigla para Data Source (fonte de dados). Temos vrias 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 opes no lugar de GAUGE seriam DERIVE, que armazena a derivada da reta valor que chega em relao ao valor anterior. Existem outros tipos de fonte de dados (DST data source types), consulte as pginas de manual do software para mais informaes. Como argumentos estamos usando 86400, que o perodo para atualizao do arquivo. E 0:200 no caso define a faixa mxima 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, no possvel 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 estatsticos de DS(data sources). A sintaxe genrica para o RRA RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows , que na

25 verdade parmetro que diz o que deve ser feito com os dados do DS.Pode ser uma mdia 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,ms 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 contedo extrado 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 sero os valroes dos downloads geral, na porta 80, 20 e 25 para o dia (representado por $datastamp, vide NGRAPHS) em questo. No outro dia, quando rodarmos o script, o datastamp ser outro e atualizar automaticamente o valor. Com os dados populados, basta agora gerarmos os grficos. O RRDtool fornece um parmetro para criar grficos. 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 Ms:$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 Mn\:%2.1lf GB' 'GPRINT:upload:MIN:Upload Mn\:%2.1lf GB' -w 509 }

O parmetro graph diz ao rrdtool para criar um grfico de nome Geral_updown.gif, a partir da data depois de --start. Essa data a do dia anterior, visto que geramos o grfico e anlises aps a meia noite. Estabelecemos o fim do grfico pela opo --end . O parmetro --title informa qual ser o ttulo que aparecer no grfico, no cabealho, 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 funo de consolidao LAST e armazenaremos num nome virtual (vname) tambm chamado download. Esse vname o download aps DEF:. A dentro deste comando quando quisermos nos refererir a este valor de download dentro de download.rrd, usaremos o nome download apenas. O parmetro 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 parmetro 'GPRINT:download:MAX:Download Max\:%2.1lf GB' imprime uma linha que diz Downlaod Max no grfico e joga o contedo de download na frente. O parmetro -w 509 informa a largura mxima da figura, que ser 509 pixels. Foi necessrio para padronizar o tamanho do grfico para o site do PoP-GO. Pode parecer um pouco complicado, mas torna-se fcil com o uso dirio.

26 Recomendo leitura das pginas de manual e tutoriais do site oficial do RRDTool. Com isso fecha-se nossas ferramentas desenvolvidas e obtivemos o resultado desejado.