2009-06-15 11:23:10 +00:00
|
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
#-------------------------------------------------------
|
|
|
|
=head 1
|
|
|
|
xCAT plugin package to handle webrun command
|
|
|
|
|
|
|
|
=cut
|
|
|
|
#-------------------------------------------------------
|
|
|
|
|
|
|
|
package xCAT_plugin::web;
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
require xCAT::Utils;
|
|
|
|
|
|
|
|
require xCAT::MsgUtils;
|
|
|
|
|
|
|
|
use Getopt::Long;
|
|
|
|
use Data::Dumper;
|
|
|
|
|
|
|
|
|
|
|
|
sub handled_commands
|
|
|
|
{
|
|
|
|
return { webrun => "web",};
|
|
|
|
}
|
|
|
|
|
|
|
|
#sub preprocess_request
|
|
|
|
#{
|
|
|
|
#}
|
|
|
|
|
|
|
|
sub process_request
|
|
|
|
{
|
|
|
|
my $request = shift;
|
|
|
|
my $callback = shift;
|
|
|
|
my $sub_req = shift;
|
|
|
|
my %authorized_cmds = (
|
|
|
|
#command => function
|
|
|
|
'pping' => \&web_pping,
|
|
|
|
'update'=> \&web_update,
|
2009-09-10 07:34:11 +00:00
|
|
|
'chtab'=> \&web_chtab,
|
|
|
|
'lscondition'=> \&web_lscond,
|
|
|
|
'lsresponse'=> \&web_lsresp,
|
|
|
|
'lscondresp' => \&web_lscondresp,
|
|
|
|
'mkcondresp' => \&web_mkcondresp,
|
|
|
|
'startcondresp' => \&web_startcondresp,
|
|
|
|
'stopcondresp' => \&web_stopcondresp,
|
|
|
|
'lsrsrc' => \&web_lsrsrc,
|
|
|
|
'lsrsrcdef-api' => \&web_lsrsrcdef,
|
|
|
|
'gettab' => \&web_gettab,
|
|
|
|
'lsevent' => \&web_lsevent,
|
|
|
|
'lsdef' => \&web_lsdef,
|
2009-06-15 11:23:10 +00:00
|
|
|
#'xdsh' => \&web_xdsh,
|
|
|
|
#THIS list needs to be updated
|
|
|
|
);
|
|
|
|
|
|
|
|
#to check whether the request is authorized or not
|
|
|
|
split ' ', $request->{arg}->[0];
|
|
|
|
my $cmd = $_[0];
|
|
|
|
if(grep { $_ eq $cmd } keys %authorized_cmds) {
|
|
|
|
my $func = $authorized_cmds{$cmd};
|
|
|
|
$func->($request, $callback, $sub_req);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$callback->({error=>"$cmd is not authorizied!\n",errorcode=>[1]});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-10 07:34:11 +00:00
|
|
|
sub web_lsdef {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
print Dumper($request);
|
|
|
|
|
|
|
|
#TODO: web_lsdef works only for "lsdef <noderange> -i nodetype"
|
|
|
|
my $ret = `$request->{arg}->[0]`;
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
|
|
|
|
split '=', $lines[2];
|
|
|
|
my $ntype = $_[1];
|
|
|
|
|
|
|
|
$callback->({data=>"$ntype"});
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lsevent {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my $ret = `$request->{arg}->[0]`;
|
|
|
|
|
|
|
|
#please see the manpage for "lsevent" to see the output format
|
|
|
|
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
|
|
|
|
my $length = scalar @lines;
|
|
|
|
my $line = 0;
|
|
|
|
|
|
|
|
my %data = ();
|
|
|
|
|
|
|
|
while($line < $length) {
|
|
|
|
split "=", $lines[$line];
|
|
|
|
my $time = $_[1];
|
|
|
|
|
|
|
|
split "=", $lines[$line+1];
|
|
|
|
my $cate = $_[1];
|
|
|
|
|
|
|
|
split "=", $lines[$line+2];
|
|
|
|
my $event = $_[1];
|
|
|
|
|
|
|
|
$data{$line} = {
|
|
|
|
"time" => $time,
|
|
|
|
"category" => $cate,
|
|
|
|
"event" => $event
|
|
|
|
};
|
|
|
|
$line +=4;
|
|
|
|
}
|
|
|
|
|
|
|
|
#print Dumper(\%data);
|
|
|
|
|
|
|
|
foreach my $key ( sort keys %data) {
|
|
|
|
$callback->({data => \%{$data{$key}}});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lsrsrcdef {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my $ret = `$request->{arg}->[0]`;
|
|
|
|
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
shift @lines;
|
|
|
|
print Dumper(\@lines);
|
|
|
|
my $data = join("=", @lines);
|
|
|
|
$callback->({data=>"$data"});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lsrsrc {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my $ret = `$request->{arg}->[0]`;
|
|
|
|
my @classes;
|
|
|
|
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
shift @lines;
|
|
|
|
foreach my $line(@lines) {
|
|
|
|
my $index = index($line, '"', 1);
|
|
|
|
push @classes, substr($line, 1, $index-1);
|
|
|
|
}
|
|
|
|
my $data = join("=",@classes);
|
|
|
|
$callback->({data=>"$data"});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sub web_mkcondresp {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
print Dumper($request->{arg}->[0]);#debug
|
|
|
|
my $ret = system($request->{arg}->[0]);
|
|
|
|
#there's no output for "mkcondresp"
|
|
|
|
#TODO
|
|
|
|
if($ret) {
|
|
|
|
#failed
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_startcondresp {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
print Dumper($request->{arg}->[0]);#debug
|
|
|
|
my $ret = system($request->{arg}->[0]);
|
|
|
|
if($ret) {
|
|
|
|
#to handle the failure
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_stopcondresp {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
print Dumper($request->{arg}->[0]);#debug
|
|
|
|
my $ret = system($request->{arg}->[0]);
|
|
|
|
if($ret) {
|
|
|
|
#to handle the failure
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lscond {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my $ret = `lscondition`;
|
|
|
|
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
shift @lines;
|
|
|
|
shift @lines;
|
|
|
|
foreach my $line (@lines) {
|
2009-11-26 07:32:07 +00:00
|
|
|
$callback->({data=>$line});
|
2009-09-10 07:34:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lsresp {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my $ret = `lsresponse`;
|
|
|
|
my @resps;
|
|
|
|
|
|
|
|
my @lines = split '\n', $ret;
|
|
|
|
shift @lines;
|
|
|
|
shift @lines;
|
|
|
|
|
|
|
|
foreach my $line (@lines) {
|
2009-11-26 07:32:07 +00:00
|
|
|
$callback->({data=>$line});
|
2009-09-10 07:34:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_lscondresp {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
my @ret = `lscondresp`;
|
|
|
|
shift @ret;
|
|
|
|
shift @ret;
|
|
|
|
|
|
|
|
foreach my $line (@ret) {
|
|
|
|
chomp $line;
|
2009-11-26 07:32:07 +00:00
|
|
|
$callback->({data=>$line});
|
2009-09-10 07:34:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
# currently, web_chtab only handle chtab for the table "monitoring"
|
|
|
|
sub web_chtab {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
split ' ', $request->{arg}->[0];
|
|
|
|
my $tmp_str = $_[2];
|
|
|
|
split '\.', $tmp_str;
|
|
|
|
my $table = $_[0]; #get the table name
|
|
|
|
if($table == "monitoring") {
|
|
|
|
system("$request->{arg}->[0]");
|
|
|
|
}else {
|
|
|
|
$callback->({error=>"the table $table is not authorized!\n",errorcode=>[1]});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sub web_gettab {
|
|
|
|
#right now, gettab only support the monitoring table
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
split ' ', $request->{arg}->[0];
|
|
|
|
my $tmp_str = $_[2];
|
|
|
|
split '\.', $tmp_str;
|
|
|
|
my $table = $_[0];
|
|
|
|
if($table == "monitoring") {
|
|
|
|
my $val = `$request->{arg}->[0]`;
|
|
|
|
chomp $val;
|
|
|
|
$callback->({data=>$val});
|
|
|
|
}else {
|
|
|
|
$callback->(
|
|
|
|
{error=>"The table $table is not authorized to get!\n",
|
|
|
|
errorcode=>[1]});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-06-15 11:23:10 +00:00
|
|
|
sub web_pping {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
#treat the argument as the commandline, run it and get the return message
|
|
|
|
my $ret = `$request->{arg}->[0]`;
|
|
|
|
|
|
|
|
#parse the message, and use $callback to send back to the web interface
|
|
|
|
|
|
|
|
#the message is like this:
|
|
|
|
# xcat_n02: ping
|
|
|
|
# xcat_n03: ping
|
|
|
|
# xcat_n51: ping
|
|
|
|
# xcat_n52: noping
|
|
|
|
my @total_stat = split '\n', $ret;
|
|
|
|
my $str;
|
|
|
|
foreach $str(@total_stat) {
|
|
|
|
#TODO
|
|
|
|
split ':', $str;
|
|
|
|
$callback->({node=>[{name=>[$_[0]],data=>[{contents=>[$_[1]]}]}]});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub web_update {
|
|
|
|
my ($request, $callback, $sub_req) = @_;
|
|
|
|
#update the xcat-web rpm package
|
|
|
|
#TODO
|
|
|
|
#Note: this is not finished now!
|
|
|
|
my $repo_dir = "/root/svn/xcat-core/trunk/aix-core-snap";
|
|
|
|
my $REPO;
|
|
|
|
my @flist;
|
|
|
|
if( -d $repo_dir) {
|
|
|
|
opendir REPO, $repo_dir;
|
|
|
|
@flist = readdir REPO;
|
|
|
|
}
|
|
|
|
closedir REPO;
|
|
|
|
#get the name of xcat-web package
|
|
|
|
my ($file) = grep(/^xCAT\-web/, @flist);
|
|
|
|
|
|
|
|
system("rpm -Uvh $repo_dir/$file");#TODO:use runcmd() to replace it
|
|
|
|
}
|