# xnameArec.pl - A Perl script to update Xname.org zone records using XMLRPC.
# Written by Robert G. Schaffrath  

use RPC::XML;
use RPC::XML::Client;
use Getopt::Long;

# Set some defaults
my $server = 'http://www.xname.org/xmlrpc.php';
my $oldaddress = '*';
my $ttl = 600;

$result = GetOptions(
           'help|?' => \$help,
           'u|user=s' => \$user,
           'p|password=s' => \$password,
           'z|zone=s' => \$zone,
           'h|host=s' => \$host,
           'o|oldaddress=s' => \$oldaddress,
           'n|newaddress=s' => \$newaddress,
           't|ttl=i' => \$ttl,
           'm|methods' => \$methods,
           's|server=s' => \$server
);

if ($result == 1 && !$help)
{
  if (defined($methods))
  {
    DisplayMethods(RPC::XML::Client->new( $server ));
  }
  elsif (!defined($user) || !defined($password) || !defined($zone) || !defined($host))
  {
    Usage();
  }
  else
  {
    $cli = RPC::XML::Client->new( $server );
    my $req = RPC::XML::struct->new(
      user => $user,
      password => $password,
      zone => $zone,
      name => $host,
      oldaddress => $oldaddress,
      newaddress => $newaddress,
      ttl => $ttl );

    $resp = $cli->send_request( 'xname.updateArecord', $req );
    if (ref($resp))
    {
      if (${$resp->value}{'faultString'} eq "")
      {
        #For address display, ${$resp->value}{'addresses'} = HASH(0x1d9585c)
        print "${$resp->value}{'name'}.${$resp->value}{'zone'} has been updated.\nSerial number ${$resp->value}{'serial'}.\n";
      }
      else
      {
        print "Error: ", ${$resp->value}{'faultString'}, " (", ${$resp->value}{'faultCode'}, ")\n";
      }
    }
  }
}
else
{
  Usage();
}

sub Usage()
{
  print qq(
      Usage:

      xnameArec -u|--user        (REQUIRED)
                -p|--password    (REQUIRED)
                -z|--zone        (REQUIRED)
                -h|--host        (REQUIRED)
                [-?|--help]
                [-o|--oldaddress  (use "*" for all)]
                [-n|--newaddress ]
                [-t|--ttl ]
                [-s|--server ]);
}

sub DisplayMethods()
{
  $cli = shift @_;

  my $resp = $cli->send_request('system.listMethods');
  print ref $resp ? "Methods: " . join(', ', @{$resp->value}) : "Error: $resp";
}

__END__