Search code examples
perl

Getopt::Declare parameter action not invoked


I use Getopt::Declare in a script, but invoking the script and passing -get_ip "test" doesn't do anything. For example, the script executes the "my" statements, and getFirstAvailableIP doesn't get called.

use Getopt::Declare;
use lib "/home/vtsingaras/NicTool/client/lib/";
use NicToolServerAPI;
use strict;
use warnings;
#debug remove
use Data::Dumper;

#NicToolServer settings, edit
my $ntconf = {
    ntuser => 'censored',
    ntpass => 'censored',
    nthost => 'censored',
    ntport => 8082,
};

my ( $zone, $fqdn, $ip, $comment );

my $options_spec = q(+g[et_ip] <zone>   Get the first available IP from the provided reverse <zone>.
                        {getFirstAvailableIP($::zone);} 
+s[et_dns] <fqdn> <ip> <comment>    Create an A record for <fqdn> that points to <ip> and the associated PTR record.
{createFwdAndPtr($::fqdn, $::ip, $::comment);}  
    );
my $args = Getopt::Declare->new($options_spec);
#Setup NicTool
my $nt = new NicToolServerAPI;
$NicToolServerAPI::server_host   = $ntconf->{nthost};
$NicToolServerAPI::server_port   = $ntconf->{ntport};
$NicToolServerAPI::data_protocol = "soap";
#$NicToolServerAPI::use_https_authentication = 0;

sub nt_login {
    #Login to NicTool Server
    my $ntuser = $nt->send_request(
        action   => "login",
        username => $ntconf->{ntuser},
        password => $ntconf->{ntpass},
    );
    if ( $ntuser->{error_code} ) {
        print( "Unable to log in: " . $ntuser->{error_code} . " " . $ntuser->{error_msg} . "\n" );
        exit 1;
    } else {
        print( "Logged in as " . $ntuser->{first_name} . " " . $ntuser->{last_name} . "\n" );
    }
}

sub getFirstAvailableIP {
    my $fqdn = $_[0];
    print $fqdn;
    die "blah";
}

Solution

  • The problem is that you specified + instead of - in $options_spec for get_ip.

    Here is a self-contained runnable example which calls getFirstAvailableIP:

    use strict;
    use warnings;
    use Getopt::Declare;
    
    my $zone;
    
    my $args = Getopt::Declare->new(<<'END_OPTS');
        #               tab
        #               ||||
        #               vvvv
        -g[et_ip] <zone>    Get the first available IP from the provided reverse <zone>.
            { getFirstAvailableIP($zone); }
    END_OPTS
    
    print "hello world\n";
    
    exit;
    
    sub getFirstAvailableIP {
        print "blah - @_\n";
    }
    
    __END__
    

    And executed:

    $ perl declare_test.pl -get_ip test
    blah - test
    hello world
    

    Note that this module requires a tab character in its specification; this makes it difficult to copy'n'paste correctly.