2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-12 00:00:12 +00:00

Merge pull request #704 from whowutwut/bmcdiscover

Clean up the usage and manpage for bmcdiscover command
This commit is contained in:
zet809
2016-03-22 17:32:49 +08:00
3 changed files with 151 additions and 329 deletions

View File

@ -19,13 +19,15 @@ SYNOPSIS
********
\ **bmcdiscover**\ [\ **-h | -**\ **-help**\ ] [\ **-v | -**\ **-version**\ ]
\ **bmcdiscover**\ [\ **-? | -h | -**\ **-help**\ ]
\ **bmcdiscover**\ [\ **-v | -**\ **-version**\ ]
\ **bmcdiscover**\ [\ **-s**\ \ *scan_method*\ ] \ **-**\ **-range**\ \ *ip_ranges*\ [\ **-z**\ ] [\ **-w**\ ] [\ **-t**\ ]
\ **bmcdiscover**\ \ **-i | -**\ **-bmcip**\ \ *bmc_ip*\ [\ **-u | -**\ **-bmcuser**\ \ *bmcusername*\ ] \ **-p | -**\ **-bmcpwd**\ \ *bmcpassword*\ \ **-c | -**\ **-check**\
\ **bmcdiscover**\ {\ **-i | -**\ **-bmcip**\ } \ *bmc_ip*\ {\ **-u | -**\ **-bmcuser**\ } \ *bmc_username*\ {\ **-p | -**\ **-bmcpasswd**\ } \ *bmc_password*\ \ **-**\ **-check**\
\ **bmcdiscover**\ \ **-i | -**\ **-bmcip**\ \ *bmc_ip*\ [\ **-u | -**\ **-bmcuser**\ \ *bmcusername*\ ] \ **-p | -**\ **-bmcpwd**\ \ *bmcpassword*\ \ **-**\ **-ipsource**\
\ **bmcdiscover**\ {\ **-i | -**\ **-bmcip**\ } \ *bmc_ip*\ {\ **-u | -**\ **-bmcuser**\ } \ *bmc_username*\ {\ **-p | -**\ **-bmcpasswd**\ } \ *bmc_password*\ \ **-**\ **-ipsource**\
***********
@ -56,7 +58,7 @@ OPTIONS
\ **-s**\
Scan method (The only supported scan method at this time is 'nmap')
Scan method (The only supported scan method at this time is \ **nmap**\ )
@ -68,7 +70,7 @@ OPTIONS
\ **-w**\
Write to the xCAT database
Write to the xCAT database.
@ -80,7 +82,7 @@ OPTIONS
\ **-i|-**\ **-bmcip**\
BMC IP
BMC IP address.
@ -90,7 +92,7 @@ OPTIONS
\ **-p|-**\ **-bmcpwd**\
\ **-p|-**\ **-bmcpasswd**\
BMC user password.
@ -136,121 +138,38 @@ EXAMPLES
********
1. To get all bmc from IP range
1. To get all responding BMCs from IP range "10.4.23.100-254" and 50.3.15.1-2":
.. code-block:: perl
bmcdiscover -s nmap --range "10.4.23.100-254 50.3.15.1-2"
bmcdiscover -s nmap --range "10.4.23.100-254 50.3.15.1-2"
Output is similar to:
Note: Input for IP range can be in the form: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254.
2. To get all BMSs in IP range "10.4.22-23.100-254", displayed in xCAT stanza format:
.. code-block:: perl
10.4.23.254
50.3.15.1
bmcdiscover -s nmap --range "10.4.22-23.100-254" -z
Note: input for IP range can also be like scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254.
2. After discover bmc, list the stanza format data
bmcdiscover -s nmap --range "10.4.22-23.100-254" -z
Output is similar to:
3. Discover the BMCs and write the discovered-node definitions into the xCAT database and write out the stanza foramt to the console:
.. code-block:: perl
node10422254:
objtype=node
groups=all
bmc=10.4.22.254
cons=ipmi
mgt=ipmi
node10423254:
objtype=node
groups=all
bmc=10.4.23.254
cons=ipmi
mgt=ipmi
bmcdiscover -s nmap --range "10.4.22-23.100-254" -w -z
3. After discover bmc, write host node definition into the database, and the same time, give out stanza format data
4. To check if the username or password is correct against the BMC:
.. code-block:: perl
bmcdiscover -s nmap --range "10.4.22-23.100-254" -w
Output is similar to:
.. code-block:: perl
node10422254:
objtype=node
groups=all
bmc=10.4.22.254
cons=ipmi
mgt=ipmi
node10423254:
objtype=node
groups=all
bmc=10.4.23.254
cons=ipmi
mgt=ipmi
4. To check if user name or password is correct or not for bmc
.. code-block:: perl
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD -c
Output is similar to:
.. code-block:: perl
Correct ADMINISTRATOR
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD1 -c
Output is similar to:
.. code-block:: perl
Error: Wrong bmc password
bmcdiscover -i 10.4.23.254 -u USERID1 -p PASSW0RD1 -c
Output is similar to:
.. code-block:: perl
Error: Wrong bmc user
bmcdiscover -i 10.4.23.2541234 -u USERID -p PASSW0RD -c
Output is similar to:
.. code-block:: perl
Error: Not bmc
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD -c
5. Get BMC IP Address source, DHCP Address or static Address
@ -258,15 +177,7 @@ Output is similar to:
.. code-block:: perl
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD --ipsource
Output is similar to:
.. code-block:: perl
Static Address
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD --ipsource

View File

@ -4,13 +4,16 @@ B<bmcdiscover> - Discover Baseboard Management Controllers (BMCs) using a scan m
=head1 SYNOPSIS
B<bmcdiscover> [B<-h>|B<--help>] [B<-v>|B<--version>]
B<bmcdiscover> [B<-?>|B<-h>|B<--help>]
B<bmcdiscover> [B<-v>|B<--version>]
B<bmcdiscover> [B<-s> I<scan_method>] B<--range> I<ip_ranges> [B<-z>] [B<-w>] [B<-t>]
B<bmcdiscover> B<-i>|B<--bmcip> I<bmc_ip> [B<-u>|B<--bmcuser> I<bmcusername>] B<-p>|B<--bmcpwd> I<bmcpassword> B<-c>|B<--check>
B<bmcdiscover> {B<-i>|B<--bmcip>} I<bmc_ip> {B<-u>|B<--bmcuser>} I<bmc_username> {B<-p>|B<--bmcpasswd>} I<bmc_password> B<--check>
B<bmcdiscover> {B<-i>|B<--bmcip>} I<bmc_ip> {B<-u>|B<--bmcuser>} I<bmc_username> {B<-p>|B<--bmcpasswd>} I<bmc_password> B<--ipsource>
B<bmcdiscover> B<-i>|B<--bmcip> I<bmc_ip> [B<-u>|B<--bmcuser> I<bmcusername>] B<-p>|B<--bmcpwd> I<bmcpassword> B<--ipsource>
=head1 DESCRIPTION
@ -32,7 +35,7 @@ Specify one or more IP ranges acceptable to nmap. IP rance can be hostnames, IP
=item B<-s>
Scan method (The only supported scan method at this time is 'nmap')
Scan method (The only supported scan method at this time is B<nmap>)
=item B<-z>
@ -40,7 +43,7 @@ List the data returned in xCAT stanza format
=item B<-w>
Write to the xCAT database
Write to the xCAT database.
=item B<-t>
@ -48,13 +51,13 @@ Generate a BMC type node object
=item B<-i|--bmcip>
BMC IP
BMC IP address.
=item B<-u|--bmcuser>
BMC user name.
=item B<-p|--bmcpwd>
=item B<-p|--bmcpasswd>
BMC user password.
@ -84,90 +87,28 @@ Display version information
=head1 EXAMPLES
1. To get all bmc from IP range
bmcdiscover -s nmap --range "10.4.23.100-254 50.3.15.1-2"
1. To get all responding BMCs from IP range "10.4.23.100-254" and 50.3.15.1-2":
Output is similar to:
bmcdiscover -s nmap --range "10.4.23.100-254 50.3.15.1-2"
10.4.23.254
50.3.15.1
Note: Input for IP range can be in the form: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254.
Note: input for IP range can also be like scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254.
2. To get all BMSs in IP range "10.4.22-23.100-254", displayed in xCAT stanza format:
2. After discover bmc, list the stanza format data
bmcdiscover -s nmap --range "10.4.22-23.100-254" -z
bmcdiscover -s nmap --range "10.4.22-23.100-254" -z
3. Discover the BMCs and write the discovered-node definitions into the xCAT database and write out the stanza foramt to the console:
Output is similar to:
bmcdiscover -s nmap --range "10.4.22-23.100-254" -w -z
node10422254:
objtype=node
groups=all
bmc=10.4.22.254
cons=ipmi
mgt=ipmi
4. To check if the username or password is correct against the BMC:
node10423254:
objtype=node
groups=all
bmc=10.4.23.254
cons=ipmi
mgt=ipmi
3. After discover bmc, write host node definition into the database, and the same time, give out stanza format data
bmcdiscover -s nmap --range "10.4.22-23.100-254" -w
Output is similar to:
node10422254:
objtype=node
groups=all
bmc=10.4.22.254
cons=ipmi
mgt=ipmi
node10423254:
objtype=node
groups=all
bmc=10.4.23.254
cons=ipmi
mgt=ipmi
4. To check if user name or password is correct or not for bmc
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD -c
Output is similar to:
Correct ADMINISTRATOR
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD1 -c
Output is similar to:
Error: Wrong bmc password
bmcdiscover -i 10.4.23.254 -u USERID1 -p PASSW0RD1 -c
Output is similar to:
Error: Wrong bmc user
bmcdiscover -i 10.4.23.2541234 -u USERID -p PASSW0RD -c
Output is similar to:
Error: Not bmc
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD -c
5. Get BMC IP Address source, DHCP Address or static Address
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD --ipsource
Output is similar to:
Static Address
bmcdiscover -i 10.4.23.254 -u USERID -p PASSW0RD --ipsource
=head1 SEE ALSO

View File

@ -109,27 +109,13 @@ sub process_request
sub bmcdiscovery_usage {
my $rsp;
push @{ $rsp->{data} },
"\nUsage: bmcdiscover - discover bmc using scan method,now scan_method can be nmap .\n";
push @{ $rsp->{data} },
"\n - check if BMC username or password is correct or not .\n";
push @{ $rsp->{data} },
"\n - get BMC IP Address source, DHCP Address or static Address .\n";
push @{ $rsp->{data} }, "\tbmcdiscover [-h|--help|-?]\n";
push @{ $rsp->{data} }, "\tbmcdiscover [-v|--version]\n ";
push @{ $rsp->{data} }, "\tbmcdiscover [-s] scan_method [--range] ip_range [-z] [-w] [-t]\n ";
push @{ $rsp->{data} }, "\tbmcdiscover [-i|--bmcip] bmc_ip [-u|--bmcuser] bmcusername [-p|--bmcpwd] bmcpassword [-c|--check]\n ";
push @{ $rsp->{data} }, "\tbmcdiscover [-i|--bmcip] bmc_ip [-u|--bmcuser] bmcusername [-p|--bmcpwd] bmcpassword [--ipsource]\n ";
push @{ $rsp->{data} }, "\tFor example: \n ";
push @{ $rsp->{data} }, "\t1, bmcdiscover -s nmap --range \"10.4.23.100-254 50.3.15.1-2\" \n ";
push @{ $rsp->{data} }, "\t Note : ip_range should be a string, can pass hostnames, IP addresses, networks, etc. \n ";
push @{ $rsp->{data} }, "\t If there is bmc,bmcdiscover returns bmc ip, or else, it returns null. \n ";
push @{ $rsp->{data} }, "\t Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254 \n ";
push @{ $rsp->{data} }, "\t2, bmcdiscover -s nmap --range \"10.4.23.100-254 50.3.15.1-2\" -z \n ";
push @{ $rsp->{data} }, "\t3, bmcdiscover -s nmap --range \"10.4.23.100-254 50.3.15.1-2\" -w \n ";
push @{ $rsp->{data} }, "\t4, bmcdiscover -i <bmc_ip> -u <bmcusername> -p <bmcpassword> -c\n ";
push @{ $rsp->{data} }, "\t Note : check if bmc username and password are correct or not. \n";
push @{ $rsp->{data} }, "\t5, bmcdiscover -i <bmc_ip> -u <bmcusername> -p <bmcpassword> --ipsource\n ";
push @{ $rsp->{data} }, "\nbmcdiscover - Discover BMC (Baseboard Management Controller) using the specified scan method\n";
push @{ $rsp->{data} }, "Usage:";
push @{ $rsp->{data} }, "\tbmcdiscover [-?|-h|--help]";
push @{ $rsp->{data} }, "\tbmcdiscover [-v|--version]";
push @{ $rsp->{data} }, "\tbmcdiscover [-s scan_method] --range ip_range [-z] [-w] [-t]";
push @{ $rsp->{data} }, "\tbmcdiscover {-i|--bmcip} bmc_ip {-u|--bmcuser} bmc_user {-p|--bmcpasswd} bmc_password --check";
push @{ $rsp->{data} }, "\tbmcdiscover {-i|--bmcip} bmc_ip {-u|--bmcuser} bmc_user {-p|--bmcpasswd} bmc_password --ipsource";
xCAT::MsgUtils->message( "I", $rsp, $::CALLBACK );
return 0;
@ -171,9 +157,9 @@ sub bmcdiscovery_processargs {
'bmcip|i=s' => \$::opt_I,
'z' => \$::opt_Z,
'w' => \$::opt_W,
'check|c' => \$::opt_C,
'check' => \$::opt_C,
'bmcuser|u=s' => \$::opt_U,
'bmcpwd|p=s' => \$::opt_P,
'bmcpasswd|p=s' => \$::opt_P,
'ipsource' => \$::opt_S,
'version|v' => \$::opt_v,
't' => \$::opt_T,
@ -250,63 +236,59 @@ sub bmcdiscovery_processargs {
return 0;
}
#########################################
# Option -i -u -p -c should be used together
######################################
if ( defined($::opt_C) )
{
if ( defined($::opt_P) && defined($::opt_I) )
{
if ( defined($::opt_U) )
{
my $res=check_auth_process($::opt_I,$::opt_U,$::opt_P);
return $res;
}
else
{
my $res=check_auth_process($::opt_I,"none",$::opt_P);
return $res;
}
}
else
{
my $msg = "bmc_ip or bmcuser or bmcpw is empty.";
my $rsp = {};
push @{ $rsp->{data} }, "$msg";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
if ( defined($::opt_C) && defined($::opt_S) ) {
my $msg = "The 'check' and 'ipsource' option cannot be used together.";
my $rsp = {};
push @{ $rsp->{data} }, "$msg";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
#########################################
# Option -i -u -p -s should be used together
######################################
if ( defined($::opt_S) )
{
if ( defined($::opt_P) && defined($::opt_I) )
{
if ( defined($::opt_U))
{
my $res=get_bmc_ip_source($::opt_I,$::opt_U,$::opt_P);
return $res;
}
else
{
my $res=get_bmc_ip_source($::opt_I,"none",$::opt_P);
return $res;
}
####################################################
# --check option, requires -i and -p to be specified
####################################################
if ( defined($::opt_C) ) {
if ( defined($::opt_P) && defined($::opt_I) ) {
my $option_u = defined $::opt_U ? $::opt_U : "none";
my $res=check_auth_process($::opt_I,$option_u,$::opt_P);
return $res;
}
else
{
my $msg = "Can not get BMC IP Address source.";
my $rsp = {};
push @{ $rsp->{data} }, "$msg";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
else {
my $msg = "";
if (!defined($::opt_I)) {
$msg = "The check option requires a BMC IP. Specify the IP using the -i|--bmcip option.";
} elsif (!defined($::opt_P)) {
$msg = "The check option requires a password. Specify the password with the -p|--bmcpasswd option.";
}
my $rsp = {};
push @{ $rsp->{data} }, "$msg";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
}
####################################################
# --ipsource option, requires -i, -p to be specified
####################################################
if ( defined($::opt_S) ) {
if ( defined($::opt_P) && defined($::opt_I) ) {
my $option_u = defined $::opt_U ? $::opt_U : "none";
my $res=get_bmc_ip_source($::opt_I,$option_u,$::opt_P);
return $res;
}
else {
my $msg = "";
if (!defined($::opt_I)) {
$msg = "The ipsource option requires a BMC IP. Specify the IP using the -i|--bmcip option.";
} elsif (!defined($::opt_P)) {
$msg = "The ipsource option requires a password. Specify the password with the -p|--bmcpasswd option.";
}
my $rsp = {};
push @{ $rsp->{data} }, "$msg";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
}
#########################################
# Other attributes are not allowed
@ -315,6 +297,12 @@ sub bmcdiscovery_processargs {
return 4;
}
my $bmc_str1 = "RAKP 2 message indicates an error : unauthorized name";
my $bmc_resp1 = "Wrong BMC username";
my $bmc_str2 = "RAKP 2 HMAC is invalid";
my $bmc_resp2 = "Wrong BMC password";
#----------------------------------------------------------------------------
=head3 get_bmc_ip_source
@ -328,45 +316,44 @@ sub bmcdiscovery_processargs {
#-----------------------------------------------------------------------------
sub get_bmc_ip_source{
my $bmcip = shift;
my $bmcuser = shift;
my $bmcpw = shift;
my $callback = $::CALLBACK;
my $bmcerror = "Can not find IP Address Source.";
my $ipsource_t = "IP Address Source";
my $pcmd;
if ( $bmcuser eq "none" )
{
$pcmd = "/opt/xcat/bin/ipmitool-xcat -I lanplus -P $bmcpw -H $bmcip lan print ";
if ( $bmcuser eq "none" ) {
$pcmd = "/opt/xcat/bin/ipmitool-xcat -vv -I lanplus -P $bmcpw -H $bmcip lan print ";
}
else
{
$pcmd = "/opt/xcat/bin/ipmitool-xcat -I lanplus -U $bmcuser -P $bmcpw -H $bmcip lan print ";
else {
$pcmd = "/opt/xcat/bin/ipmitool-xcat -vv -I lanplus -U $bmcuser -P $bmcpw -H $bmcip lan print ";
}
my $output = xCAT::Utils->runcmd("$pcmd", -1);
if ( $output !~ $ipsource_t )
{
if ( $output =~ "IP Address Source" ) {
# success case
my $rsp = {};
push @{ $rsp->{data} }, "$bmcerror";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
else
{
my $rsp = {};
my $ipsource=`echo "$output"|grep "IP Address Source"|awk -F":" '{print \$2}'`;
my $ipsource=`echo "$output"|grep "IP Address Source"`;
chomp($ipsource);
push @{ $rsp->{data} }, "$ipsource";
xCAT::MsgUtils->message("I", $rsp, $::CALLBACK);
return 0;
}
else {
my $rsp = {};
if ( $output =~ $bmc_str1 ) {
# Error: RAKP 2 message indicates an error : unauthorized name <== incorrect username
push @{ $rsp->{data} }, "$bmc_resp1";
} elsif ( $output =~ $bmc_str2 ) {
# Error: RAKP 2 HMAC is invalid <== incorrect password
push @{ $rsp->{data} }, "$bmc_resp2";
} else {
# all other errors
push @{ $rsp->{data} }, "Error: Can not find IP Address Source";
}
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
}
@ -386,60 +373,43 @@ sub check_auth_process{
my $bmcip = shift;
my $bmcuser = shift;
my $bmcpw = shift;
my $bmstr1 = "RAKP 2 message indicates an error : unauthorized name";
my $bmstr2 = "RAKP 2 HMAC is invalid";
my $bmstr3 = "Set Session Privilege Level to ADMINISTRATOR";
my $bmstr31 = "Correct ADMINISTRATOR";
my $bmstr21 = "Wrong bmc password";
my $bmstr11 = "Wrong bmc user";
my $bmcerror = "Not bmc";
my $othererror = "Check bmc first";
my $bmstr4 = "BMC Session ID";
my $bmc_str4 = "BMC Session ID";
my $callback = $::CALLBACK;
my $icmd;
if ( $bmcuser eq "none" )
{
if ( $bmcuser eq "none" ) {
$icmd = "/opt/xcat/bin/ipmitool-xcat -vv -I lanplus -P $bmcpw -H $bmcip chassis status ";
}
else
{
else {
$icmd = "/opt/xcat/bin/ipmitool-xcat -vv -I lanplus -U $bmcuser -P $bmcpw -H $bmcip chassis status ";
}
my $output = xCAT::Utils->runcmd("$icmd", -1);
if ( $output =~ $bmstr1 )
{
if ($output =~ "Set Session Privilege Level to ADMINISTRATOR" ) {
# Success case
my $rsp = {};
push @{ $rsp->{data} }, "$bmstr11";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
elsif ( $output =~ $bmstr2 )
{
my $rsp = {};
push @{ $rsp->{data} }, "$bmstr21";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
elsif ( $output =~ $bmstr3 )
{
my $rsp = {};
push @{ $rsp->{data} }, "$bmstr31";
push @{ $rsp->{data} }, "Correct ADMINISTRATOR";
xCAT::MsgUtils->message("I", $rsp, $::CALLBACK);
return 0;
}
elsif ( $output !~ $bmstr4 )
{
} else {
# handle the various error scenarios
my $rsp = {};
push @{ $rsp->{data} }, "$bmcerror";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}
else
{
my $rsp = {};
push @{ $rsp->{data} }, "$othererror";
if ( $output =~ $bmc_str1 ) {
# Error: RAKP 2 message indicates an error : unauthorized name <== incorrect username
push @{ $rsp->{data} }, "$bmc_resp1";
}
elsif ( $output =~ $bmc_str2 ) {
# Error: RAKP 2 HMAC is invalid <== incorrect password
push @{ $rsp->{data} }, "$bmc_resp2";
}
elsif ( $output !~ $bmc_str4 ) {
# Did not find "BMC Session ID" in the response
push @{ $rsp->{data} }, "Not a BMC, please verify the correct IP address";
}
else {
push @{ $rsp->{data} }, "Unknown Error: $output";
}
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return 2;
}