#!/usr/bin/env perl # IBM(c) 2014 EPL license http://www.eclipse.org/legal/epl-v10.html # This is a command which can be used to access the rest api of xCAT use strict; use Getopt::Long; use LWP; use JSON; require HTTP::Request; # set the usage message my $usage_string = "Usage: restapi -u url -m GET|PUT|POST|DELETE [-f html|json|xml] [-V] -u The url of the action. .e.g to get the power status of node \'nodename\' https://httpserver/xcatws/nodes/nodename/power -m The method of the request -h The hostname of the xCAT web server -o Target object -f The output format of the requested action -V Display the verbose message\n"; #todo: make the code below into functions so that this file can be used for 2 purposes: # 1. contain all the test cases that can all be run at once # 2. if arguments are passed in, run the one api call passed in # Parse the argument $Getopt::Long::ignorecase = 0; Getopt::Long::Configure("bundling"); if (!GetOptions('u=s' => \$::URL, 'f=s' => \$::FORMAT, 'h=s' => \$::HOST, 'o=s' => \$::OBJ, 'm=s' => \$::METHOD, 'V' => \$::VERBOSE)) { print $usage_string; exit 1; } if (defined($::FORMAT)) { if ($::FORMAT eq "") { $::FORMAT = "html"; } elsif ($::FORMAT !~ /^(html|json|xml)$/) { print $usage_string; exit 1; } } else { $::FORMAT = "html"; } if (defined($::METHOD)) { if ($::METHOD !~ /^(GET|PUT|POST|DELETE)$/) { print $usage_string; exit 1; } } else { print $usage_string; exit 1; } if (!$::URL) { if ($::HOST && $::OBJ) { $::URL = "https://$::HOST/xcatws/$::OBJ?format=$::FORMAT"; } else { print $usage_string; exit 1; } } else { if ($::URL =~ /\?/) { $::URL .= "&format=$::FORMAT"; } else { $::URL .= "?format=$::FORMAT"; } } my @updatearray; my $fieldname; my $fieldvalue; my %entryhash; if (scalar(@ARGV) > 0) { foreach my $tempstr (@ARGV) { push @updatearray, split(/=/, $tempstr); } } %entryhash = @updatearray; my $request; my $ua = LWP::UserAgent->new(); my $response; if (($::METHOD eq 'PUT') || ($::METHOD eq 'POST')) { my $tempstr = encode_json \%entryhash; $request = HTTP::Request->new($::METHOD => $::URL); $request->header('content-type' => 'text/plain'); $request->header('content-length' => length($tempstr)); $request->content($tempstr); } elsif (($::METHOD eq 'GET' || ($::METHOD eq 'DELETE'))) { $request = HTTP::Request->new($::METHOD => $::URL); } my $response = $ua->request($request); print $response->content . "\n"; print $response->code . "\n"; print $response->message . "\n";