Skip to content
Open
Next Next commit
initial changes
  • Loading branch information
suruchimalewar committed Mar 28, 2019
commit dbb2eff187adcfaeb880dd1095171902fcbbcd5e
17 changes: 17 additions & 0 deletions recipes/perl/storageAPI/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
### NetBackup API Code Samples for perl

This directory contains code samples to invoke NetBackup REST APIs using perl.

#### Disclaimer

These scripts are only meant to be used as a reference. If you intend to use them in production, use it at your own risk.

#### Pre-requisites:

- NetBackup 8.2 or higher
- Perl 5.20.2 or higher

#### Executing the recipes in perl

Use the following commands to run the perl samples.
- `perl configure_storage_unit_cloud_end_to_end.pl -nbmaster <masterServer> -username <username> -password <password> -sts_payload <pathToInputPayloadForStorageServer> -dp_payload <pathToInputPayloadForDiskPool> -stu_payload <pathToInputPayloadForStorageUnit> [-domainName <domainName>] [-domainType <domainType>]`
103 changes: 103 additions & 0 deletions recipes/perl/storageAPI/configure_storage_unit_end_to_end.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#!/usr/bin/env perl

use LWP::UserAgent;
use LWP::Protocol::https;
print "LWP::UserAgent: ".LWP::UserAgent->VERSION,"\n";
print "LWP::Protocol::https: ".LWP::Protocol::https->VERSION,"\n";
use JSON;
use Getopt::Long qw(GetOptions);
use storage;

#
# The token is the key to the NetBackup AuthN/AuthZ scheme. You must login and get a token
# and use this token in your Authorization header for all subsequent requests. Token validity
# is fixed at 24 hours
#
my $token;

my $protocol = "https";
my $port = "1556";
my $nbmaster;
my $username;
my $password;
my $sts_payload;
my $dp_payload;
my $stu_payload;
my $domainName;
my $domainType;
my $base_url;


# subroutines for printing usage and library information required to run the script.
sub print_usage {
print("\n\nUsage:");
print("\nperl configure_storage_unit_cloud_end_to_end.pl -nbmaster <masterServer> -username <username> -password <password> -sts_payload <pathToInputPayloadForStorageServer> -dp_payload <pathToInputPayloadForDiskPool> -stu_payload <pathToInputPayloadForStorageUnit> [-domainName <domainName>] [-domainType <domainType>]\n\n\n");
}

sub print_disclaimer {
print("--------------------------------------------------------\n");
print("-- This script requires Perl 5.20.2 or later --\n");
print("--------------------------------------------------------\n");
print("Executing this library requires some additional libraries like \n\t'LWP' \n\t'JSON'\ \n\t'Getopt'\ \n\n");
print("You can specify the 'nbmaster', 'username', 'password', 'sts_payload', 'dp_payload', 'stu_payload', 'domainName' and 'domainType' as command-line parameters\n");
print_usage();
}

# subroutine to process user input
sub user_input {
GetOptions(
'nbmaster=s' => \$nbmaster,
'username=s' => \$username,
'password=s' => \$password,
'sts_payload=s' => \$sts_payload,
'dp_payload=s' => \$dp_payload,
'stu_payload=s' => \$stu_payload,
'domainName=s' => \$domainName,
'domainType=s' => \$domainType,
) or die print_usage();

if ($nbmaster eq "") {
print("Please provide the value for 'nbmaster'");
exit;
}

if ($username eq "") {
print("Please provide the value for 'username'");
exit;
}

if ($password eq "") {
print("Please provide the value for 'password'");
exit;
}
if ($sts_payload eq "") {
print("Please provide the value for 'sts_payload'");
exit;
}

if ($dp_payload eq "") {
print("Please provide the value for 'dp_payload'");
exit;
}

if ($stu_payload eq "") {
print("Please provide the value for 'stu_payload'");
exit;
}

$base_url = "$protocol://$nbmaster:$port/netbackup";
}

sub storage_api_automation {
my $token = storage::perform_login($nbmaster, $username, $password, $domain_name, $domain_type);
storage::post_storage_server($nbmaster, $token, $sts_payload);
storage::post_disk_pool($nbmaster, $token, $dp_payload);
storage::post_storage_unit($nbmaster, $token, $stu_payload);

}

print_disclaimer();

user_input();

storage_api_automation();
244 changes: 244 additions & 0 deletions recipes/perl/storageAPI/storage.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
#!/usr/bin/env perl

package storage;

use JSON;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use LWP::Protocol::https;

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
$CONTENT_TYPE = "application/vnd.netbackup+json;version=3.0";
$PROTOCOL = "https://";
$NB_PORT = 1556;

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, verify_peer => 0});


sub send_http_request {
my $url = $_[0];
my $request_type = $_[1];
my $token = $_[2];
my $body = $_[3];
my $accept = $_[4];
my $content_type = $_[5];

if (not defined $url or not defined $request_type){
print "Error: url and request type are required fields";
return undef;
}

print "Unencoded URL is $url\n";
# assume string is un-encoded, and '%' is a literal that needs to be replaced by '%25'.
# All other types of encoding are handled gracefully by the LWP module except literal percent
$url =~ s/%/%25/;

# determine correct request type
my $req;
if (uc($request_type) eq "GET" ){
$req = HTTP::Request->new(GET => $url);
}
elsif ((uc($request_type) eq "POST")){
$req = HTTP::Request->new(POST => $url);
}
elsif ((uc($request_type) eq "DELETE")){
$req = HTTP::Request->new(DELETE => $url);
}
elsif ((uc($request_type) eq "PUT")) {
$req = HTTP::Request->new(PUT => $url);
}
elsif ((uc($request_type) eq "PATCH")){
$req = HTTP::Request->new(PATCH => $url);
}
else {
print "Unrecognized request type [$request_type]. If this is a valid HTTP request type, please update me";
return undef;
}

# print encoded url to the screen
print "Encoded URL is ${$req->uri}\n";

if (defined $token) {
$req->header('Authorization' => $token);
}
if (defined $accept) {
$req->header('Accept' => $accept);
}
if (defined $content_type){
$req->header('Content-Type' => $content_type);
}
if (defined $body){
$req->content($body);
}

my $resp = $ua->request($req);
if ($resp->is_success) {
my $json_results;
if (defined($resp->content) && $resp->content ne "") {
$json_results = decode_json($resp->content);
}
else {
$json_results = "";
}
return $json_results;
}
else {
print "HTTP error code: ", $resp->code, "\n";
print "HTTP response content: ", $resp->content, "\n";
return undef;
}
}

sub perform_login {
my @argument_list = @_;
my $master_server = $argument_list[0];
my $username = $argument_list[1];
my $password = $argument_list[2];

my $token;

# domainName and domainType are optional
my $domainName = "";
my $domainType = "";
if (@argument_list >= 4) {
$domainName = $argument_list[3];
}
if (@argument_list == 5) {
$domainType = $argument_list[4];
}

# Construct url
my $url = "https://$master_server:1556/netbackup/login";

# Construct request body
my $post_data;
if (not $domainName and not $domainType) {
$post_data = qq({ "userName": "$username", "password": "$password" });
}
else {
$post_data = qq({ "domainType": "$domainType", "domainName": "$domainName", "userName": "$username", "password": "$password" });
}

print "\n\n**************************************************************";
print "\n\n Making POST Request to login to get token \n\n";

my $json_results = send_http_request($url, "post", undef, $post_data, undef, "application/json");

if (defined $json_results){
$token = $json_results->{"token"};
}
return $token;
}

# Create a storage server
sub post_storage_server {
my $arguments_count = scalar(@_);
if ($arguments_count != 3) {
print "ERROR :: Incorrect number of arguments passed to post_storage_server()\n";
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
return;
}

my $master_server = $_[0];
my $token = $_[1];
my $filename = $_[2];
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/storage-servers";
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";

my $payload = "";
while (my $row = <$fh>) {
chomp $row;
$payload .= $row;
}
print "payload: $payload\n";

my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);

if (defined $json) {
print "Successfully completed POST Storage Server Request.\n";

my $pretty = JSON->new->pretty->encode($json);
return $pretty;
}
else {
print "ERROR :: POST Storage Server Request Failed!\n";
}
}


# Create a storage unit
sub post_storage_unit {
my $arguments_count = scalar(@_);
if ($arguments_count != 3) {
print "ERROR :: Incorrect number of arguments passed to post_storage_unit()\n";
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
return;
}

my $master_server = $_[0];
my $token = $_[1];
my $filename = $_[2];
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/storage-units";
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";

my $payload = "";
while (my $row = <$fh>) {
chomp $row;
$payload .= $row;
}
print "payload: $payload\n";

my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);

if (defined $json) {
print "Successfully completed POST Storage Unit Request.\n";

my $pretty = JSON->new->pretty->encode($json);
return $pretty;
}
else {
print "ERROR :: POST Storage Unit Request Failed!\n";
}
}

# Create a Disk Pool
sub post_disk_pool {
my $arguments_count = scalar(@_);
if ($arguments_count != 3) {
print "ERROR :: Incorrect number of arguments passed to post_disk_pool()\n";
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
return;
}

my $master_server = $_[0];
my $token = $_[1];
my $filename = $_[2];
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/disk-pools";
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";

my $payload = "";
while (my $row = <$fh>) {
chomp $row;
$payload .= $row;
}
print "payload: $payload\n";

my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);

if (defined $json) {
print "Successfully completed POST Disk Pool Request.\n";

my $pretty = JSON->new->pretty->encode($json);
return $pretty;
}
else {
print "ERROR :: POST Disk Pool Request Failed!\n";
}
}

1;

3 changes: 2 additions & 1 deletion recipes/powershell/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ These scripts are only meant to be used as a reference. If you intend to use the
#### Executing the recipes in PowerShell

Pre-requisites:
- NetBackup 8.1.2 or higher
- NetBackup 8.2 or higher
- PowerShell 4.0 or higher

Use the following commands to run the PowerShell samples.
- `.\create_policy_in_one_step.ps1 -nbmaster <masterServer> -username <username> -password <password> [-domainName <domainName>] [-domainType <domainType>]`
- `.\rbac_filtering_in_policy.ps1 -nbmaster <masterServer> -username <username> -password <password> [-domainName <domainName>] [-domainType <domainType>]`
- `.\configure_storage_unit_end_to_end.ps1 -nbmaster <masterServer> -username <username> -password <password> [-domainName <domainName> -domainType <domainType>]`
Loading