Como posso consultar a API NetAPP ONTAP sem usar o SDK?

1

Eu tenho um monte de arquivadores da NetApp, que eu tenho acessado via ssh com pares de chaves públicas-privadas.

Eu gostaria de estender o que estou fazendo - estamos repetidamente atingindo limitações onde, por exemplo. ssh está falhando em completar comandos (desconectar antes de executar) e a formatação da saída dos comandos que estamos executando é 'legível por humanos', o que significa que é irritante analisar a máquina.

Portanto, gostaria de consultar a API e, por vários motivos, gostaria de usar os módulos 'off-the-shelf' do CPAN, em vez do SDK da NetApp.

Isso pode ser feito e, em caso afirmativo, como?

(Eu ponderei se isso era melhor para o Stack Overflow, mas concluímos que ele era provavelmente mais relevante para o sysadmin do que para o script perl).

    
por Sobrique 18.03.2015 / 18:31

1 resposta

1

O básico é bastante simples - há duas coisas que você precisa copiar:

  • XML
  • link

Do CPAN, existem vários módulos que podem fazer isso. Eu gosto de LWP e XML::Twig .

  • Primeiro, você precisa procurar a API que precisa acessar. As opções usuais serão DFM ou filer e várias solicitações de API estarão disponíveis. (Você pode precisar fazer o download do SDK em: link )
  • Monte um pouco de XML como o pedido.
  • Envie a solicitação
  • Decodifique a resposta (XML).

É mais ou menos assim:

#!/usr/local/bin/perl

use strict;
use warnings;

use XML::Twig;
use LWP::UserAgent;

my $filer     = 'filername';
my $vfiler    = 'vfilername';
my $user      = 'api-user';
my $pass      = 'api-pass';
my $api_call  = 'volume-list-info';
my %api_param = ( volume => 'vfiler_vol0' );

my $API = '/servlets/netapp.servlets.admin.XMLrequest_filer';
my $url = "https://$filer/$API";

my $xml_request = XML::Twig->new();
$xml_request->set_root(
    XML::Twig::Elt->new(
        'netapp',
        {   version => '1.7',
            vfiler  => $vfiler,
            xmlns   => 'http://www.netapp.com/filer/admin'
        },
    )
);
my $req = $xml_request->root->insert_new_elt($api_call);

foreach my $key ( keys %api_param ) {
    $req->insert_new_elt( $key, $api_param{$key} );
}

$xml_request->set_doctype('netapp SYSTEM "file:/etc/netapp_filer.dtd"');
$xml_request->set_xml_version('1.0');
$xml_request->set_encoding('utf-8');


my $agent = LWP::UserAgent->new(
    ssl_opts => {
        verify_hostname => 0,
        SSL_version     => 'SSLv3'
    }
);

my $request = HTTP::Request->new( POST => $url );
$request->content( $xml_request->sprint );
$request->authorization_basic( $user, $pass );

my $results = $agent->request($request);
if ( $results->is_success ) {

    #do nothing yet
}
else {
    print "Request error:", $results->status_line;
    die;
}
my $results_twig = XML::Twig->new( pretty_print => 'indented' );
$results_twig->parse( $results->content );

#dump the whole thing
$results_twig->print;

print some values selectively. 
foreach my $vol ( $results_twig -> root -> children('volume-info') ) {
    print $vol -> first_child_text('name'), " "; 
    print $vol -> first_child_text('state'),"\n";
}
    
por 18.03.2015 / 18:31