Pular para o conteúdo

Bash: Gráficos estatísticos de tráfego de rede

Dica publicada em Shell Script / Miscelânea
Sandro Marcell SMarcell
Hits: 5.992 Categoria: Shell Script Subcategoria: Miscelânea
  • Indicar
  • Impressora
  • Denunciar

Bash: Gráficos estatísticos de tráfego de rede

Depois enfrentar alguns problemas bem estranhos após implementar o MRTG aqui onde trabalho, resolvi criar minha "própria" versão do mesmo (quanta pretensão hein... rsrsrs) em shell script apenas para monitorar o quanto de download/upload estava ocorrendo aqui na rede. Para tal usei:
  • RRDtool v1.4.7
  • Bash v4.1.10
  • Lighttpd v1.4.35
  • Linux 2.6.37.6

A configuração e uso do script é bem simples, bastando fazer o seguinte:

Alterar as variáveis globais conforme necessário.

Executar o script para gerar as bases de dados:

# ./nome_script.sh

Executar novamente o script, mas agora para gerar as páginas .html:

# ./nome_script.sh -html

Agora agende no cron do usuário root a execução do script a cada 5 minutos:

*/5 * * * * /caminho/para/nome_script.sh > /dev/null 2>&1

E finalmente acesse via navegador web a página HTML gerada.

Feito tudo isso você terá uma página mais ou menos como esta:
Linux: Bash: Gráficos estatísticos de tráfego de rede
Tudo muito simples e funcional. :)

Segue o código do script:

#!/bin/bash
#
# Copyleft 2016 Sandro Marcell 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
PATH='/bin:/sbin:/usr/bin:/usr/sbin'
LC_ALL='pt_BR.UTF-8'

# Como utilizar este script:
#
# 1 - Altera as VARIAVEIS GLOBAIS conforme necessario
# 2 - Execute o script para gerar as bases de dados
# root> ./nome_script.sh
# 3 - Execute novamente o script, mas agora para gerar as paginas .html
# root> ./nome_script.sh --html
# 4 - Agende no cron do usuario root a execucao do mesmo (de 5 em 5 min.)
# */5 * * * * /caminho/para/nome_script.sh > /dev/null 2>&1
# 5 - Acesse as paginas .html geradas atraves dum navegador web
#
# Desenvolvido com: rrdtool v1.4.7, Bash v4.1.10 e Linux 2.6.37.6

# Diretorio onde serao armazenadas as bases de dados do rrdtool
BASES_RRD='/var/lib/rrd'

# Diretorio do servidor web onde serao armazenados os arquivos html/png gerados
DIR_WWW='/var/www/html/rrdnet'

# Gerar os graficos para os seguintes periodos de tempo
PERIODOS='day week month year'

# Interfaces de rede que serao monitoradas
# Este vetor deve ser definido da seguinte forma:
#       ...
# Ex.: Supondo que seu servidor possua tres interfaces de rede, onde
# eth0 = Link para a internet
# eth1 = Link da LAN
# eth2 = Link para a DMZ
# entao faca:
# INTERFACES=('eth0' 'Link internet' 'eth1' 'Link LAN' 'eth2' 'Link DMZ')
INTERFACES=('lo' 'Loopback' 'eth0' 'Link LAN')

# Criando os diretorios de trabalho caso nao existam
[ ! -d "$BASES_RRD" ] && mkdir -p "$BASES_RRD"
[ ! -d "$DIR_WWW" ] && mkdir -p "$DIR_WWW"

# Funcao principal que sera responsavel pela coleta e armazenamento/atualizacao
# das bases de dados rrd
function coletarDados {
	declare -a args=("${INTERFACES[@]}") # Aquele POG basico... ^_^

	while [ ${#args[@]} -ne 0 ]; do
		iface="${args[0]}" # Interface a ser monitorada
		desc="${args[1]}"  # Descricao da interface monitorada
		args=("${args[@]:2}")

		# Coletando os valores recebidos/enviados pela interface
		# Obs.: Os valores sao coletados em bytes mas ao se gerar
		# os graficos, esses dados serao convertidos para bits
		local bytes_rec=$( /dev/null
		[ $? -gt 0 ] && return 1
	done

	return 0
}

# Funcao que ira criar as paginas .html
function gerarHTML {
	declare -a ifaces
	local titulo='Gráficos estatísticos de tráfego de rede'

	# Filtrando o vetor $INTERFACES para retornar somente as interfaces de rede
	for ((i = 0; i <= ${#INTERFACES[@]}; i++)); do
		((i % 2 == 0)) && ifaces+=("${INTERFACES[$i]}")
	done

	echo 'Gerando paginas HTML...'

	# 1o: Gerar a pagina index.html
	cat <<- FIM > ${DIR_WWW}/index.html
	
	
	
	${0##*/}
	
	
	
	
	
	
	
		
		
$(for i in ${ifaces[@]}; do echo "
\
" done)
FIM # 2o: Gerar pagina especifica para cada interface com os periodos definidos for i in ${ifaces[@]}; do cat <<- FIM > ${DIR_WWW}/${i}.html ${0##*/}
$(for p in $PERIODOS; do echo "
\
" done)
FIM done return 0 } # Gerar os arquivos .html se for o caso # Chamada do script: ./nome_script.sh --html if [ "$1" == '--html' ]; then gerarHTML exit 0 fi # Coletando dados e gerando os graficos # Chamada do script: ./nome_script.sh coletarDados

Download do código-fonte: rrd_network.sh

Faloura!!!

Utilizando abas no Vim

Encriptando e compactando arquivos com o zip

js-bwm: monitorando seu link de internet em tempo real

PHP + jQuery - Monitorando link de internet em tempo real

Ordenando uma lista de IPs (IPv4) com o sort

Trocando letrinhas em segundos (sed)

Canivete suíço em bash

Mplayer 1.0pre6a (script de instalação)

Despertador em Shell

Habilitando X11 via SSH no Slackware

Contribuir com comentário

Entre na sua conta para comentar.