vsoapd

 view release on metacpan or  search on metacpan

sbin/vsoapc  view on Meta::CPAN


print "Keyword: $keyword Action: $action\n" if $DEBUG >= 1;

# Actions cannot start with -
if (defined $action
    and $action =~ /^-/) {
    unshift @ARGV, $action;
    $action = '';
}

$action = '' unless defined $action;

# Ok. Now it's time to do the action.
our $uri = strip_ws($cfg{$c_sec}{'uri'}) || 'urn:/VUser';
our $proxy = strip_ws($cfg{$c_sec}{'proxy'});
our $service = strip_ws($cfg{$c_sec}{'service'});

my $soap;
if ($service) {
    $log->log (LOG_INFO, "Attempting to connect to $service");
    $soap = SOAP::Lite->service($service);
} else {
    $log->log (LOG_INFO, "Attempting to connect to $proxy for $uri");
    $soap = SOAP::Lite
    -> uri ($uri)
    -> proxy ($proxy);
}

$log->log (LOG_DEBUG, "Credentials: %s, %s", $username, defined $password? $password : 'undef');

# Log sends back info in the SOAP headers including a ticket that
# is sent back through the headers for the other task functions
if ($debug) {
    use Data::Dumper; print Dumper $soap;
}
my $authinfo = $soap
    #SOAP::Lite->service($service)
    -> login ($username, $password)
    ;# -> result;
    
if ($debug) {
    use Data::Dumper; print Dumper $authinfo;
    $log->log (LOG_DEBUG, "Login: $authinfo");
}

if (not $authinfo) {
    die "Invalid login\n";
}

if ($keyword eq 'help') {
    show_help($action);
} else {
    my %opts = create_opts($keyword, $action);
    ## Now translate the options into SOAP::Data objects in a magical way
    my @params = hash2soap(%opts);
    if ($debug) {
        print "SOAP params: ";
        use Data::Dumper; print Dumper \@params;
    }
    # Do action
    my $soap_auth = SOAP::Header->name("authinfo", $authinfo);
    #my $soap_auth = SOAP::Data->name("authinfo", $authinfo);
    
    my $call = #$soap
        SOAP::Lite->uri($uri)->proxy($proxy)
	   -> call("$keyword\_$action", $soap_auth, @params);
	if ($debug) {
	    print "\$call: "; use Data::Dumper; print Dumper $call;
	}
	
	my @results = $call->valueof("//results");
	#my @results = $call->paramsout();
	if ($debug > 1) {
	    print "RS: "; use Data::Dumper; print Dumper \@results;
	}
	
	display_resultSet(@results);
}

sub display_resultSet {
    my @results = @_;
    $log->log(LOG_DEBUG, "Displaying ResultSet");
    foreach my $result (@results) {
        if ($debug > 2) {
            print '$result: ';
            use Data::Dumper; print Dumper $result;
        }
        # Psuedo-hashes here ---v
        # {'ResultSet'} is a []
        my $result_sets = $result->{'results'}{'ResultSet'};
        my $sets;
        if (ref $result_sets eq 'ARRAY') {
            $sets = $result_sets;
        } else {
            $sets = [$result_sets];
        }
        foreach my $rs (@$sets) { 
            my $cols = $rs->{'columns'}{'item'};
            my $values = $rs->{'values'}{'item'};
            my @rows = ();
            if ($debug > 2) {
                print '$values: ';
                use Data::Dumper; print Dumper $values;
            }
            if (ref $values eq 'HASH') {
                push @rows, $values;
            } elsif (ref $values eq 'ARRAY') {
                @rows = @{ $values };
            }
            if ($debug > 2) {
                print '$rows: ';
                use Data::Dumper; print Dumper \@rows;
            }
            for (my $i = 0; $i < @rows; $i++) {
                print "\n" if ($i > 0);
                for (my $j = 0; $j < @$cols; $j++) {
                    #use Data::Dumper; print Dumper $rows[$i];
                    printf("%s: %s\n", $cols->[$j], $rows[$i]{'item'}[$j]);
                }
            }
        }
    }
}

sub hash2soap {
    my %opts = @_;
    
    my @params = ();
    
    foreach my $key (keys %opts) {
        my $data = SOAP::Data->name($key => $opts{$key});
        push @params, $data;
    }
    
    return @params;
}

sub show_help
{
    my $keyword = shift;

    if (not $keyword) {
	   my @keywords = #$soap
	       SOAP::Lite->uri($uri)->proxy($proxy)
	       -> call ('get_keywords', SOAP::Header->new(authinfo => $authinfo))
	       -> valueof('//keywords');
	   
	   if ($debug) {
	       print "Keywords: ";
	       use Data::Dumper; print Dumper \@keywords;
	   }
	   
	   foreach my $key (@keywords) {
	       #if ($debug) { print "Key: "; use Data::Dumper; print Dumper $key; }
	       my $descr = $key->{description} || 'No description';
	       printf ("%8s - %s\n", $key->{keyword}, $descr);
	   }
    } else {
	    print "Options marked with '*' are required.\n";

        if ($debug) {
            use Data::Dumper; print Dumper $soap;
            $log->log(LOG_DEBUG, "Service: %s / %s", $service, $soap->service);
        }

	   my @actions = #$soap
	       #SOAP::Lite->service($service)
	       SOAP::Lite->uri($uri)->proxy($proxy)
           -> call ('get_actions', SOAP::Header->name(authinfo => $authinfo),
	                      SOAP::Data->name('keyword' => $keyword))
	       -> valueof('//actions');
	   if ($debug) {
	       print '@actions: ';
	       use Data::Dumper; print Dumper \@actions;
	   }
	   foreach my $action (@actions) {
	       my $descr = $action->{description} || 'No description';
	       printf ("%8s - %s\n", $action->{action}, $descr);
	       my @options = #$soap
	           SOAP::Lite->uri($uri)->proxy($proxy)
		       -> call ('get_options', SOAP::Header->new(authinfo => $authinfo),
		                      SOAP::Data->name('keyword' => $keyword),
		                      SOAP::Data->name('action' => $action->{action}))
		       -> valueof('//options');
	       foreach my $option (@options) {
	           next if $option eq '';
		       my $descr = $option->{description} || 'No description';
		       printf("\t%-16s %s - %s\n",
		              "--".$option->{option},
		              ($option->{required}? '*': ' '),
		              $descr);
	       }
	   }
    }
}

# Create options from meta data and options list.
sub create_opts
{
    my $keyword = shift;
    my $action = shift;

    $log->log(LOG_DEBUG, "Creating options for $keyword | $action");

    my @options = #$soap
        SOAP::Lite->uri($uri)->proxy($proxy)
        -> get_options (SOAP::Header->name('authinfo' => $authinfo),
	                    SOAP::Data->name('keyword' => $keyword),
	                    SOAP::Data->name('action' => $action)
	                    )
        -> valueof('//options');

    if ($debug) {
        print "Raw options: ";
        use Data::Dumper; print Dumper \@options;
    }

    # This should be the same (or very similar to) what's done in
    # VUser::ExtHandler
    my %opts = ();
    my @opt_defs = ();

    foreach my $opt (@options) {
        next if $opt eq '';
	   my $gopt_type = '';

	   my $type = $opt->{type};
	   if ($type eq 'string') {
	       $gopt_type = '=s';
	   } elsif ($type eq 'integer') {
	       $gopt_type = '=i';
	   } elsif ($type eq 'counter') {
	       $gopt_type = '+';
	   } elsif ($type eq 'boolean') {
	       $gopt_type = '!';
	   } elsif ($type eq 'float') {
	       $gopt_type = '=f';
	   }

	   my $def = $opt->{option}.$gopt_type;
	   push @opt_defs , $def;
    }

    if (@opt_defs) {
	   GetOptions(\%opts, @opt_defs);
    }
    return %opts;
}
    
__END__

=head1 NAME

vsoapd - vuser SOAP daemon.

=head1 SYNOPSIS

=head1 OPTIONS

=head1 DESCRIPTION

=head1 CONFIGURATION

 [vsoapc] 
 # Server to connect to. The protocol must match the transport
 # used by the vsoapd server. (vsoapd defaults to HTTP.)
 proxy = http://localhost:8000/



( run in 1.848 second using v1.01-cache-2.11-cpan-437f7b0c052 )