У меня есть набор файловых серверов NetApp, через которые я получал доступ ssh
с парами общедоступными с закрытым ключом.
Я хотел бы расширить то, что я делаю - мы неоднократно поражаем ограничения где, например. ssh
сбой состоит в том, чтобы завершить команды (разъединение, прежде чем выполнятся), и форматирование вывода от команд, которые мы выполняем, 'человекочитаемо', что означает, что это является раздражающим к синтаксическому анализу машины.
Таким образом, я хотел бы запросить API, и по различным причинам я хотел бы сделать настолько использующий 'с полки' модули от CPAN, а не SDK NetApp.
Это может быть сделано, и раз так как?
(Я обдумал, было ли это лучшим пригодным для Переполнения стека, но пришло к заключению, что, вероятно, более относилось к системному администратору, чем сценарии жемчуга).
Основы довольно просты - есть две вещи, которые нужно скопировать с:
Из CPAN, есть различные модули, которые могут это сделать. Мне нравится LWP
и XML::Twig
.
DFM
или filer
, а также доступны различные api-запросы. (Возможно, вам понадобится загрузить SDK с: http://mysupport.netapp.com/NOW/download/software/nmsdk/5.3/). Немного так:
#!/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";
}