#!/usr/bin/perl

# Manon@manon.de (2016)
#
# Script is designed to be added to crontab
# */15      *       *       *       * /usr/bin/perl dynupdate.pl 2>> dynupdate.log
# and run as notroot

use strict;
use IO::Socket::INET6;
use WWW::Curl::Easy;
use File::Basename;
my %config;

## Config defaults
$config{test_server}="ipv6.google.com";
$config{user} = 'user';
$config{pass} = 'password';
$config{verbose} = 0;
$config{hostname}="";

## Config file contins lines
# test_server     =>      "ipv6.google.com",
# user          =>      "myuser",
# ..
# …

%config = do (dirname($0) . '/dynupdate-config.pl');

#######
## Used vars
my $body="";
my $code;
my $url;
my $localaddr;
my $curl = WWW::Curl::Easy->new;

print STDERR scalar localtime, $/;
my $socket = new IO::Socket::INET6 (
PeerHost => $config{test_server},
Domain => AF_INET6,
PeerPort => '80',
Timeout => '5',
Proto => 'tcp',
) or die "ERROR in Socket Creation to $config{test_server} : $!\n";

my $localaddr =  $socket->sockhost, $/;
my $url = sprintf ('https://now-dns.com/update?hostname=%s&myip=%s' , $config{hostname},  $localaddr);
print STDERR "OK IPv6 TCP Connection Success to testserver $config{test_server} from localaddr  $localaddr .\n";

$code = $curl->setopt(CURLOPT_USERPWD, "$config{user}:$config{pass}");
$code = $curl->setopt(CURLOPT_URL, $url);
$code = $curl->setopt(CURLOPT_VERBOSE, $config{verbose});
$code = $curl->setopt(CURLOPT_FILE, \$body);
$curl->perform();

if ($body eq "good" || $body eq "nochg" ) {
        print STDERR sprintf ( "OK Server returned message %s for URL: %s\n\n", $body, $url);
} else {
        print STDERR sprintf ( "ERROR Server returned message %s for URL: %s\n\n", $body, $url);
        print sprintf ( "ERROR Server returned message %s while updating localaddr %s to url: %s\n\n", $body, $localaddr, $url);
        exit 7;
}
