Controlando a sua banda da internet

12 de novembro de 2010

A pedido de um amigo que migrou para o Linux e não conseguiu encontrar ferramenta equiparável para o Linux, resolvi criar esse simples script que tem a função de controlar a sua banda de internet na rede.

O objetivo desse script é ficar varrendo a rede à procura de máquina online, e caso as encontre é reduzida a taxa de download e upload da máquina que estiver consumindo muita banda. O script pode ser executado em qualquer máquina na rede, mas o objetivo é rodar na máquina que estiver consumindo mais banda.

A utilidade desse script está voltada para aqueles que gostam de baixar muitos arquivos, geralmente grande, na internet e acaba ocupando toda a banda, deixando praticamente nada para os demais computadores que estão conectados à rede, dessa forma, deixando a rede lenta. Com esse script em execução basta que uma máquina apareça na rede que automaticamente a taxa de download e upload será reduzida, deixando as demais máquinas, que estão na rede, navegar com uma largura de banda maior.

Críticas e sugestões para novas implementações são sempre bem vindas!

Download do script v0.2

Para executar o script:

$ sudo ./controle-de-banda.sh

ou

$ bash controle-de-banda.sh
#!/bin/bash

# Por Tales A. Mendonça - 12/11/2010 - v0.2
# talesam.org

clear
# Checa a permissão
if test $(id -u) != 0; then
	echo -e "e[1m *e[me[31m ERRO:e[m Sem permissão para executar o script"
	echo -e "e[1m *e[m Execute-o com e[33msudoe[m ou como e[33mroote[m"
	exit 0
fi
# Checa se o wondershaper está instalo
if [ "$(whereis wondershaper)" = "wondershaper:" ]; then
	echo -e "e[1m *e[me[31m ERRO:e[m Você não possui oe[m e[33mwondershaper e[minstalado, favor instalar"
	echo -e "e[1m *e[m Saindo do script.."
	sleep 2
	exit 1
fi

echo ""
echo -e "Programa para controlar, limitar, a banda, tráfego, de uma máquina na rede.nEste script funciona da seguinte maneira: A máquina que estiver com um tráfego muitonelevado, por exemplo, baixando algum arquivo grande e ocupando toda a banda da redenpoderá rodar esse script para que esta mesma máquina seja limitada caso possua maisnmáquina em rede acessando a internet."

echo ""
echo -e "Escolha um valor para o e[1mDownloade[m ou [Enter] para default (*)"
echo ""
echo -e "  1.  e[32m128e[m kbps =  e[33m16e[m   KB/s"
echo -e "  2.  e[32m256e[m kbps =  e[33m32e[m   KB/s"
echo -e "  3.  e[32m300e[m kbps =  e[33m37.5e[m KB/s"
echo -e "* 4.  e[32m512e[m kbps =  e[33m64e[m   KB/s"
echo -e "  5.  e[32m600e[m kbps =  e[33m75e[m   KB/s"
echo -e "  6. e[32m1024e[m kbps = e[33m128e[m   KB/s"
echo -e "  0. e[31mSaire[m"
read down
case $down in
	1) down=128
		d=16
	;;
	2) down=256
		d=32
	;;
	3) down=300
		d=37.5
	;;
	5) down=600
		d=75
	;;
	6) down=1024
		d=128
	;;
	0) exit 0
	;;
	*) down=512
		d=64
	;;
esac
echo -e "  Download = e[33m$de[m KB/s"

echo ""
echo -e "Escolha um valor para o e[1mUploade[m ou [Enter] para default (*)"
echo ""
echo -e "  1.  e[32m128e[m kbps =  e[33m16e[m   KB/s"
echo -e "  2.  e[32m256e[m kbps =  e[33m32e[m   KB/s"
echo -e "  3.  e[32m300e[m kbps =  e[33m37.5e[m KB/s"
echo -e "* 4.  e[32m512e[m kbps =  e[33m64e[m   KB/s"
echo -e "  5.  e[32m600e[m kbps =  e[33m75e[m   KB/s"
echo -e "  6. e[32m1024e[m kbps = e[33m128e[m   KB/s"
echo -e "  0. e[31mSaire[m"
read up
case $up in
	1) up=128
		u=16
	;;
	2) up=256
		u=32
	;;
	3) up=300
		u=37.5
	;;
	5) up=600
		u=75
	;;
	6) up=1024
		u=128
	;;
	0) exit 0
	;;
	*) up=512
		u=64
	;;
esac
echo -e "  Upload = e[33m$ue[m KB/s"

echo ""
echo -e "Escolha o tempo gasto para a checagem na rede por máquinas online ou [Enter] para default (*)"
echo ""
echo -e "  1.   e[33m5e[ms"
echo -e "  2.  e[33m10e[ms"
echo -e "  3.  e[33m15e[ms"
echo -e "  4.  e[33m20e[ms"
echo -e "  5.  e[33m25e[ms"
echo -e "* 6.  e[33m30e[ms"
echo -e "  7.  e[33m35e[ms"
echo -e "  8.  e[33m40e[ms"
echo -e "  9.  e[33m45e[ms"
echo -e "  10. e[33m50e[ms"
echo -e "  11. e[33m55e[ms"
echo -e "  12. e[33m60e[ms"
echo -e "  0. e[31mSaire[m"
read tempo
case $tempo in
	1) tempo=5
	;;
	2) tempo=10
	;;
	3) tempo=15
	;;
	4) tempo=20
	;;
	5) tempo=25
	;;
	7) tempo=35
	;;
	8) tempo=40
	;;
	9) tempo=45
	;;
	10) tempo=50
	;;
	11) tempo=55
	;;
	12) tempo=60
	;;
	0) exit 0
	;;
	*) tempo=30
	;;
esac
echo -e "  Upload = e[33m$tempoe[ms"

echo ""
echo -e "Digite o intervalo de máquinas que deseja pingar.nEx.: Para pingar as máquina com IP final 100, 103 e 110, então defina o valor como e[34m100 110e[m. nPara definir apenar uma máquina, especifique valores iguais, como e[34m100 100e[m"
read faixaMaquina

# ----------------------------------------------- #
# ----------------------------------------------- #
### Não altere nada daqui para baixo ###

# Muda a linguagem para o padrão, inglês
LC_ALL_BACKUP=$LC_ALL
export LC_ALL=C

# Interface que será limitada a banda
iface="$(route -n | grep UG | cut -d " " -f1- | rev | cut -d " " -f1 | rev)"

# Pinga a faixa de IP definida
faixaIp="$(ifconfig $iface | grep "inet addr" | cut -d: -f2 | cut -d " " -f1 | rev | cut -d. -f2- | rev)"

# Último octeto do IP
finalIp="$(ifconfig $iface | grep "inet addr" | cut -d. -f4 | cut -d " " -f1)"

# Volta a linguagem para o formato original
export LC_ALL=$LC_ALL_BACKUP
# ----------------------------------------------- #

clear
# Libera toda a banda antes de iniciar o controle
echo -e "Liberando toda a banda.."
sleep 2
wondershaper clear $iface
sleep 1
clear

while : ; do
echo -e "Procurando máquina(s) online.."
x=1
	for ip in $(seq $faixaMaquina); do
		if [ "$ip" != "$finalIp" ]; then
			ping -c 1 $faixaIp.$ip>/dev/null
			if [ $? -eq 0 ]; then
				x=0
				echo -e "e[30;1m  -> $faixaIp.e[me[32;1m$ip e[m" && break # Máquina online
			else
				x=1
			fi
		fi
	done

	if [ $x != 0 ]; then
		echo -e "Máquinas online não encontradas, liberando toda a banda.."
		sleep 1
		wondershaper clear $iface # Libera toda a banda
	else
		echo -e "Encontrado máquina Online, setando valores para download e upload"
		echo -e "Download = e[33m$down kbpse[m, Upload = e[33m$up kbpse[m"
		sleep 1
		wondershaper $iface $down $up # Limita a banda
	fi
sleep $tempo ; clear
done