Script atualizador de IP dinâmico (Cloudflare, No-IP, Freedns, ZoneEdit e DNSomatic)

Script executa no Cron a cada 5 minutos para verificar se houve alteração no IP e atualizar nos hosts dinâmicos

#!/bin/sh
# script atualizador de IP
#daniel.uramg 2010

echo Script iniciado...

#VERIFICA SE ESTA AGENDADO NO CRON, SE NÃO TIVER SE AGENDA
CRONFILE="/var/spool/cron/crontabs/root"
[ -z "`grep dnsomatic.sh $CRONFILE`" ] && echo "*/5 * * * * /partition/scriptsteste/./dnsomatic.sh" >> $CRONFILE && cron.reload

#Se não existir o arquivo dnsomatic.txt o cria
[ ! -e /partition/tmp/dnsomatic.txt ] && touch /partition/tmp/dnsomatic.txt

#Variavel para pegar o IP válido, caso a primeira falhe tenta outras vezes
IPATUAL="`wget -O - http://myip.dnsomatic.com/`"
[ -z "$IPATUAL" ] && IPATUAL="`wget -O - http://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'`"
[ -z "$IPATUAL" ] && IPATUAL="`wget -O - http://dynupdate.no-ip.com/ip.php`"


#Função que atualiza o IP nos hosts e envia email
UPDATE(){
#DOCS API: https://api.cloudflare.com/#zone-properties
#Exemplo Batch https://gist.github.com/benkulbertis/fff10759c2391b6618dd/
auth_email="meuemail"
auth_key="meutoken"
zone_name="site.com"
record_name="www.site.com"
zone_identifier=$(/usr/local/bin/./curl -k -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | cut -f 3 -d: | cut -f 1 -d, | sed 's/"//g')
record_identifier=$(/usr/local/bin/./curl -k -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | cut -f 3 -d: | cut -f 1 -d, | sed 's/"//g')
GETcfIdeias=$(/usr/local/bin/./curl -k -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$IPATUAL\"}")

ZEuser="login"
ZEpass="senha"
ZEhosts="host1.com,host2.com.br"
#GETze="`wget -O - http://$ZEuser:[email protected]/auth/dynamic.html?host=$ZEhosts`"

NOipuser="user"
NOippass="senha"
NOiphosts="host1.zapto.org,host2.ddns.net,host3.ddns.net"
GETnoip="`wget -O - http://$NOipuser:[email protected]/nic/update?hostname=$NOiphosts`"

FREEDNStoken="token=="
GETfreedns="`/usr/local/bin/./curl -k https://freedns.afraid.org/dynamic/update.php?$FREEDNStoken`"

DNSomaticuser="user"
DNSomaticpass="senha"
DNSomatichosts="all.dnsomatic.com"
GETdnsomatic="`wget -O - http://$DNSomaticuser:[email protected]/nic/update?host=$DNSomatichosts`"

#Exibe no console
echo "IP atualizado: $IPATUAL"

##Envia email
/partition/scriptsteste/./sendmail.sh "`[ -z "$GETcfIdeias" -o -z "$GETnoip" ] && echo "ATENÇÃO!"` IP Atualizado $IPATUAL" "
`[ -z "$GETcfIdeias" -o -z "$GETnoip" ] && echo "HOUVE ERRO EM ALGUM DOS SERVIÇOS! VERIFIQUE COM ATENÇÃO."`


IPATUAL = http://$IPATUAL

Retorno do CloudFlare: (ideias.pw)
$GETcfIdeias

Retorno FreeDNS: (Ideias.2p.fm)
$GETfreedns

Retorno do No-IP: (zapto e ddns)
$GETnoip

Retorno do DNSomatic: (um pouco de tudo)
$GETdnsomatic

Retorno do ZoneEdit: (desativado)
$GETze"

#Carrega valor do IP e dos Hosts no arquivo dnsomatic.txt
echo "IP: $IPATUAL" > /partition/tmp/dnsomatic.txt
echo "dnsomatic: $GETdnsomatic" >> /partition/tmp/dnsomatic.txt
echo "freedns: $GETfreedns" >> /partition/tmp/dnsomatic.txt
echo "zoneedit: $GETze" >> /partition/tmp/dnsomatic.txt
echo "no-ip: $GETnoip" >> /partition/tmp/dnsomatic.txt
echo "cloudflare: $GETcf" >> /partition/tmp/dnsomatic.txt

[ -z "$CONT" ] && CONT="1" || CONT="$(($CONT+1))"

#DEBUG
cat /partition/tmp/dnsomatic.txt
echo -e "\a"
echo CONT=$CONT

#[ -z "` echo "$GET" | grep "good"`" ] && sleep 30 && UPDATE
#[ ! -z "` echo "$GETze" | grep "Too many updates too quickly"`" ] && echo "deu zica" && exit 1
#[ -z "` echo "$GETze" | grep "SUCCESS"`" -a "$CONT" -lt 5 ] && sleep 30 && UPDATE
}

#Função para verificar se a entrada A foi atualizada em cada domínio
#verificadns_func(){
#echo "Entra na verificação dos Hosts, aguardando 5 minutos..."
#sleep 300 #300 - aguarda 5 minutos

#DOMINIOS="digipaperinformatica.com\nwebtracker.com.br\nrecicladigital.com.br"

#DNSCHECK_FUNC() {
#	wget -O - "http://www.dnswatch.info/dns/dnslookup?la=en&host=$1&type=A&submit=Resolve" | grep "A record found" | cut -f 4 -d' '
#}

##DESATIVADO TEMPORARIAMENTE
#	echo -e $DOMINIOS | while read DOMINIO; do
#		if [ "`DNSCHECK_FUNC "$DOMINIO"`" -a "`DNSCHECK_FUNC "$DOMINIO"`" != "$IPATUAL" ]; then
#echo "Dominio $DOMINIO não atualizado, nova tentativa"
#/partition/scriptsteste/./sendmail.sh "Domínio $DOMINIO" "O domínio $DOMINIO parece não ter sido atualizado com sucesso
#A entrada A deste domínio é: `DNSCHECK_FUNC $DOMINIO` e o IP atual é: $IPATUAL.
#Será feita uma nova tentativa de atualização"
#			UPDATE
#		fi
#	done

#}

[ "$IPATUAL" -a -z "`grep "$IPATUAL" /partition/tmp/dnsomatic.txt`" ] && UPDATE || echo "sem necessidade" #&& verificadns_func