mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-06-03 10:02:01 +03:00
8989 lines
274 KiB
C++
8989 lines
274 KiB
C++
/* Copyright (C) 2014 InfiniDB, Inc.
|
|
Copyright (C) 2016 MariaDB Corporation
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 of
|
|
the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
|
|
/******************************************************************************************
|
|
* $Id: mcsadmin.cpp 3110 2013-06-20 18:09:12Z dhill $
|
|
*
|
|
******************************************************************************************/
|
|
|
|
#include <clocale>
|
|
#include <netdb.h>
|
|
extern int h_errno;
|
|
|
|
#include "columnstoreversion.h"
|
|
#include "mcsadmin.h"
|
|
#include "boost/filesystem/operations.hpp"
|
|
#include "boost/filesystem/path.hpp"
|
|
#include "boost/scoped_ptr.hpp"
|
|
#include "boost/tokenizer.hpp"
|
|
#include "sessionmanager.h"
|
|
#include "dbrm.h"
|
|
#include "messagequeue.h"
|
|
#include "we_messages.h"
|
|
#include "../../writeengine/redistribute/we_redistributedef.h"
|
|
#include "we_config.h" // for findObjectFile
|
|
#include "we_fileop.h" // for findObjectFile
|
|
namespace fs = boost::filesystem;
|
|
|
|
using namespace alarmmanager;
|
|
using namespace std;
|
|
using namespace oam;
|
|
using namespace config;
|
|
using namespace messageqcpp;
|
|
using namespace redistribute;
|
|
using namespace execplan;
|
|
|
|
#include "installdir.h"
|
|
|
|
// Variables shared in both main and functions
|
|
|
|
Config* fConfig = 0;
|
|
string Section;
|
|
int CmdID = 0;
|
|
string CmdList[cmdNum];
|
|
int CmdListID[cmdNum];
|
|
string cmdName;
|
|
const string SECTION_NAME = "Cmd";
|
|
int serverInstallType;
|
|
string systemName;
|
|
string parentOAMModule;
|
|
string localModule;
|
|
bool rootUser = true;
|
|
string HOME = "/root";
|
|
string SingleServerInstall;
|
|
|
|
bool repeatStop;
|
|
|
|
static void checkPromptThread();
|
|
bool connectToDBRoot1PM(Oam& oam, boost::scoped_ptr<MessageQueueClient>& msgQueueClient);
|
|
bool SendToWES(Oam& oam, ByteStream bs);
|
|
|
|
bool waitForActive()
|
|
{
|
|
Oam oam;
|
|
SystemStatus systemstatus;
|
|
SystemProcessStatus systemprocessstatus;
|
|
bool bfirst = true;
|
|
|
|
for (int i = 0 ; i < 1200 ; i ++)
|
|
{
|
|
sleep (3);
|
|
try
|
|
{
|
|
oam.getSystemStatus(systemstatus);
|
|
if (systemstatus.SystemOpState == ACTIVE)
|
|
{
|
|
return true;
|
|
}
|
|
if (systemstatus.SystemOpState == FAILED)
|
|
{
|
|
return false;
|
|
}
|
|
if (systemstatus.SystemOpState == MAN_OFFLINE)
|
|
{
|
|
return false;
|
|
}
|
|
cout << "." << flush;
|
|
|
|
// Check DMLProc for a switch to BUSY_INIT.
|
|
// In such a case, we need to print a message that rollbacks
|
|
// are occurring and will take some time.
|
|
if (bfirst) // Once we've printed our message, no need to waste cpu looking
|
|
{
|
|
oam.getProcessStatus(systemprocessstatus);
|
|
for (unsigned int i = 0 ; i < systemprocessstatus.processstatus.size(); i++)
|
|
{
|
|
if (systemprocessstatus.processstatus[i].ProcessName == "DMLProc")
|
|
{
|
|
if (systemprocessstatus.processstatus[i].ProcessOpState == oam::ROLLBACK_INIT)
|
|
{
|
|
cout << endl << endl <<" System Not Ready, DMLProc is checking/processing rollback of abandoned transactions. Processing could take some time, please wait..." << flush;
|
|
bfirst = false;
|
|
}
|
|
// At this point, we've found our DMLProc, so there's no need to spin the for loop
|
|
// any further.
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
// At some point, we need to give up, ProcMgr just isn't going to respond.
|
|
if (i > 60) // 3 minutes
|
|
{
|
|
cout << "ProcMgr not responding while waiting for system to start";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool waitForStop()
|
|
{
|
|
Oam oam;
|
|
SystemStatus systemstatus;
|
|
SystemProcessStatus systemprocessstatus;
|
|
|
|
for (int i = 0 ; i < 1200 ; i ++)
|
|
{
|
|
sleep (3);
|
|
try
|
|
{
|
|
oam.getSystemStatus(systemstatus);
|
|
if (systemstatus.SystemOpState == MAN_OFFLINE)
|
|
{
|
|
return true;
|
|
}
|
|
if (systemstatus.SystemOpState == FAILED)
|
|
{
|
|
return false;
|
|
}
|
|
cout << "." << flush;
|
|
}
|
|
catch (...)
|
|
{
|
|
// At some point, we need to give up, ProcMgr just isn't going to respond.
|
|
if (i > 60) // 3 minutes
|
|
{
|
|
cout << "ProcMgr not responding while waiting for system to start";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Signal handler to catch SIGTERM signal to terminate the process
|
|
//------------------------------------------------------------------------------
|
|
void handleSigTerm(int i)
|
|
{
|
|
std::cout << "Received SIGTERM to terminate MariaDB ColumnStore Console..." << std::endl;
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Signal handler to catch Control-C signal to terminate the process
|
|
//------------------------------------------------------------------------------
|
|
void handleControlC(int i)
|
|
{
|
|
std::cout << "Received Control-C to terminate the console..." << std::endl;
|
|
exit(0);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Initialize signal handling
|
|
//------------------------------------------------------------------------------
|
|
void setupSignalHandlers()
|
|
{
|
|
#ifdef _MSC_VER
|
|
//FIXME
|
|
#else
|
|
// Control-C signal to terminate a command
|
|
struct sigaction act;
|
|
memset(&act, 0, sizeof(act));
|
|
act.sa_handler = handleControlC;
|
|
sigaction(SIGINT, &act, 0);
|
|
|
|
// catch SIGTERM signal to terminate the program
|
|
// memset(&act, 0, sizeof(act));
|
|
// act.sa_handler = handleSigTerm;
|
|
// sigaction(SIGTERM, &act, 0);
|
|
#endif
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
#ifndef _MSC_VER
|
|
setuid(0); // set effective ID to root; ignore return status
|
|
#endif
|
|
setlocale(LC_ALL, "");
|
|
|
|
Oam oam;
|
|
char* pcommand = 0;
|
|
string arguments[ArgNum];
|
|
|
|
const char* p = getenv("HOME");
|
|
if (!p)
|
|
p = "";
|
|
else
|
|
HOME = p;
|
|
|
|
string ccHistoryFile = HOME + "/.cc_history";
|
|
|
|
string cf = startup::StartUp::installDir() + "/etc/" + ConsoleCmdsFile;
|
|
fConfig = Config::makeConfig(cf);
|
|
|
|
// setupSignalHandlers();
|
|
|
|
// Get System Name
|
|
try{
|
|
oam.getSystemConfig("SystemName", systemName);
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** Failed : Failed to read systemName Name" << endl;
|
|
exit(-1);
|
|
}
|
|
|
|
//get parentModule Name
|
|
parentOAMModule = getParentOAMModule();
|
|
|
|
// get Local Module Name and Single Server Install Indicator
|
|
oamModuleInfo_t st;
|
|
try {
|
|
st = oam.getModuleInfo();
|
|
localModule = boost::get<0>(st);
|
|
serverInstallType = boost::get<5>(st);
|
|
}
|
|
catch (...) {
|
|
cout << endl << "**** Failed : Failed to read Local Module Name" << endl;
|
|
exit(-1);
|
|
}
|
|
|
|
try {
|
|
oam.getSystemConfig("SingleServerInstall", SingleServerInstall);
|
|
}
|
|
catch(...) {}
|
|
|
|
//check if root-user
|
|
int user;
|
|
user = getuid();
|
|
if (user != 0)
|
|
rootUser = false;
|
|
|
|
// create/open command log file if not created
|
|
|
|
logFile.open(DEFAULT_LOG_FILE.c_str(), ios::app);
|
|
|
|
if (geteuid() == 0 && !logFile)
|
|
{
|
|
cerr << "UI Command log file cannot be opened" << endl;
|
|
}
|
|
writeLog("Start of a command session!!!");
|
|
|
|
// get and sort command list for future help display
|
|
|
|
for(int i=0; i<cmdNum ;i++)
|
|
{
|
|
// get cmd name
|
|
|
|
Section = SECTION_NAME + oam.itoa(i);
|
|
|
|
cmdName = fConfig->getConfig(Section, "Name");
|
|
if (cmdName.empty())
|
|
// no command skip
|
|
continue;
|
|
|
|
CmdList[i] = cmdName;
|
|
CmdListID[i] = i;
|
|
|
|
// sort
|
|
|
|
for(int j=0; j<i ;j++)
|
|
{
|
|
if( CmdList[i] < CmdList[j] )
|
|
{
|
|
cmdName = CmdList[i];
|
|
CmdList[i] = CmdList[j];
|
|
CmdList[j] = cmdName;
|
|
CmdID = CmdListID[i];
|
|
CmdListID[i] = CmdListID[j];
|
|
CmdListID[j] = CmdID;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// issue message informing user they aren't logged into Active OAm Parent
|
|
cout << endl;
|
|
cout << "WARNING: running on non Parent OAM Module, can't make configuration changes in this session." << endl;
|
|
cout << " Access Console from '" << parentOAMModule << "' if you need to make changes." << endl << endl;
|
|
}
|
|
|
|
// check for arguments passed in as a request
|
|
|
|
if(argc > 1)
|
|
{
|
|
int j=0;
|
|
string command;
|
|
for(; argc > 1; j++, argc--)
|
|
{
|
|
arguments[j] = argv[j+1];
|
|
command.append(arguments[j]);
|
|
command.append(" ");
|
|
}
|
|
// add to history and UI command log file
|
|
read_history(ccHistoryFile.c_str());
|
|
add_history (command.c_str());
|
|
writeLog(command.c_str());
|
|
write_history(ccHistoryFile.c_str());
|
|
|
|
checkRepeat(arguments, j);
|
|
}
|
|
else
|
|
{
|
|
cout << endl << "MariaDB ColumnStore Admin Console" << endl;
|
|
cout << " enter 'help' for list of commands" << endl;
|
|
cout << " enter 'exit' to exit the MariaDB ColumnStore Command Console" << endl;
|
|
cout << " use up/down arrows to recall commands" << endl << endl;
|
|
|
|
// output current active alarm stats
|
|
printAlarmSummary();
|
|
printCriticalAlarms();
|
|
|
|
//read readline history file
|
|
read_history(ccHistoryFile.c_str());
|
|
|
|
while (true)
|
|
{
|
|
//get parentModule Name
|
|
parentOAMModule = getParentOAMModule();
|
|
|
|
// flush agument list
|
|
for(int j=0; j < ArgNum; j++)
|
|
{
|
|
arguments[j].clear();
|
|
}
|
|
|
|
// read input
|
|
pcommand = readline("mcsadmin> ");
|
|
|
|
if (!pcommand) // user hit <Ctrl>-D
|
|
pcommand = strdup("exit");
|
|
|
|
else if (!*pcommand)
|
|
{
|
|
// just an enter-key was entered, ignore and reprompt
|
|
continue;
|
|
}
|
|
|
|
// add to history and UI command log file
|
|
add_history (pcommand);
|
|
writeLog(pcommand);
|
|
write_history(ccHistoryFile.c_str());
|
|
|
|
string command = pcommand;
|
|
|
|
//check if a argument was entered as a set of char with quotes around them
|
|
int commandLoc=0;
|
|
int numberArgs=0;
|
|
bool validCMD=true;
|
|
|
|
for(int i=0; i < ArgNum; i++)
|
|
{
|
|
string::size_type pos = command.find(" ", commandLoc);
|
|
string::size_type pos1 = command.find("\"", commandLoc);
|
|
string::size_type pos3 = command.find("\'", commandLoc);
|
|
if ( (pos == string::npos && pos1 == string::npos) ||
|
|
(pos == string::npos && pos3 == string::npos) ) {
|
|
//end of the command
|
|
string argtemp = command.substr(commandLoc,80);
|
|
if ( argtemp != "" ) {
|
|
arguments[numberArgs] = argtemp;
|
|
numberArgs++;
|
|
}
|
|
break;
|
|
}
|
|
if (pos < pos1 && pos < pos3) {
|
|
// hit ' ' first
|
|
string argtemp = command.substr(commandLoc, pos-commandLoc);
|
|
if ( argtemp != "" ) {
|
|
arguments[numberArgs] = argtemp;
|
|
numberArgs++;
|
|
}
|
|
commandLoc = pos+1;
|
|
}
|
|
else
|
|
{
|
|
if ( pos >= pos1 ) {
|
|
//hit " first
|
|
string::size_type pos2 = command.find("\"", pos1+1);
|
|
if (pos2 != string::npos) {
|
|
arguments[numberArgs] = command.substr(pos1+1,pos2-pos1-1);
|
|
numberArgs++;
|
|
commandLoc = pos2+1;
|
|
}
|
|
else
|
|
{
|
|
cout << "Invalid Command, mismatching use of quotes" << endl;
|
|
validCMD=false;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//hit ' first
|
|
string::size_type pos2 = command.find("\'", pos3+1);
|
|
if (pos2 != string::npos) {
|
|
arguments[numberArgs] = command.substr(pos3+1,pos2-pos3-1);
|
|
numberArgs++;
|
|
commandLoc = pos2+1;
|
|
}
|
|
else
|
|
{
|
|
cout << "Invalid Command, mismatching use of quotes" << endl;
|
|
validCMD=false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (validCMD)
|
|
checkRepeat(arguments, numberArgs);
|
|
|
|
free (pcommand);
|
|
}
|
|
}
|
|
}
|
|
|
|
void checkRepeat(string* arguments, int argNumber)
|
|
{
|
|
Oam oam;
|
|
bool repeat = false;
|
|
int repeatCount = 5;
|
|
for ( int i=0; i < argNumber ; i++)
|
|
{
|
|
if( arguments[i].find("-r") == 0) {
|
|
// entered
|
|
if ( arguments[i] != "-r") {
|
|
//strip report count off
|
|
repeatCount = atoi(arguments[i].substr(2,10).c_str());
|
|
if ( repeatCount < 1 || repeatCount > 60 ) {
|
|
cout << "Failed: incorrect repeat count entered, valid range is 1-60, set to default of 5" << endl;
|
|
repeatCount = 5;
|
|
}
|
|
}
|
|
repeat = true;
|
|
arguments[i].clear();
|
|
cout << "repeating the command '" << arguments[0] << "' every " << repeatCount << " seconds, enter CTRL-D to stop" << endl;
|
|
sleep(5);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool threadCreate = false;
|
|
if (repeat) {
|
|
while(true) {
|
|
system("clear");
|
|
if ( processCommand(arguments) )
|
|
return;
|
|
else {
|
|
if ( !threadCreate ) {
|
|
threadCreate = true;
|
|
repeatStop = false;
|
|
pthread_t PromptThread;
|
|
pthread_create (&PromptThread, NULL, (void*(*)(void*)) &checkPromptThread, NULL);
|
|
}
|
|
|
|
for ( int i = 0 ; i < repeatCount ; i ++ )
|
|
{
|
|
if (repeatStop)
|
|
break;
|
|
sleep(1);
|
|
}
|
|
|
|
if (repeatStop)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
processCommand(arguments);
|
|
}
|
|
|
|
int processCommand(string* arguments)
|
|
{
|
|
Oam oam;
|
|
// Possible command line arguments
|
|
GRACEFUL_FLAG gracefulTemp = GRACEFUL;
|
|
ACK_FLAG ackTemp = ACK_YES;
|
|
CC_SUSPEND_ANSWER suspendAnswer = CANCEL;
|
|
bool bNeedsConfirm = true;
|
|
string password;
|
|
string cmd;
|
|
// get command info from Command config file
|
|
CmdID = -1;
|
|
|
|
// put inputted command into lowercase
|
|
string inputCmd = arguments[0];
|
|
transform (inputCmd.begin(), inputCmd.end(), inputCmd.begin(), to_lower());
|
|
|
|
for (int i = 0; i < cmdNum; i++)
|
|
{
|
|
// put table command into lowercase
|
|
string cmdName_LC = CmdList[i];
|
|
transform (cmdName_LC.begin(), cmdName_LC.end(), cmdName_LC.begin(), to_lower());
|
|
|
|
if (cmdName_LC.find(inputCmd) == 0)
|
|
{
|
|
// command found, ECHO command
|
|
cout << cmdName_LC << " " << oam.getCurrentTime() << endl;
|
|
CmdID = CmdListID[i];
|
|
break;
|
|
}
|
|
}
|
|
if (CmdID == -1)
|
|
{
|
|
// get is command in the Support Command list
|
|
for (int i = 0;;i++)
|
|
{
|
|
if (supportCmds[i] == "")
|
|
// end of list
|
|
break;
|
|
if (supportCmds[i].find(inputCmd) == 0) {
|
|
// match found, go process it
|
|
cout << supportCmds[i] << " " << oam.getCurrentTime() << endl;
|
|
int status = ProcessSupportCommand(i, arguments);
|
|
if ( status == -1 )
|
|
// didn't process it for some reason
|
|
break;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// command not valid
|
|
cout << arguments[0] << ": Unknown Command, type help for list of commands" << endl << endl;
|
|
return 1;
|
|
}
|
|
|
|
switch( CmdID )
|
|
{
|
|
case 0: // help
|
|
case 1: // ?
|
|
{
|
|
const string DESC_NAME = "Desc";
|
|
string desc;
|
|
string descName;
|
|
const string ARG_NAME = "Arg";
|
|
string arg;
|
|
string argName;
|
|
|
|
string argument1_LC = arguments[1];
|
|
transform (argument1_LC.begin(), argument1_LC.end(), argument1_LC.begin(), to_lower());
|
|
|
|
if (argument1_LC.find("-a") == 0 || argument1_LC == "")
|
|
{
|
|
// list commands and brief description (Desc1)
|
|
cout << endl << "List of commands:" << endl;
|
|
cout << "Note: the command must be the first entry entered on the command line" << endl << endl;
|
|
cout.setf(ios::left);
|
|
cout.width(34);
|
|
cout << "Command" << "Description" << endl;
|
|
cout.setf(ios::left);
|
|
cout.width(34);
|
|
cout << "------------------------------" << "--------------------------------------------------------" << endl;
|
|
|
|
for(int i=0; i<cmdNum ;i++)
|
|
{
|
|
// get cmd name
|
|
|
|
Section = SECTION_NAME + oam.itoa(CmdListID[i]);
|
|
|
|
cmdName = fConfig->getConfig(Section, "Name");
|
|
if (cmdName.empty() || cmdName == "AVAILABLE")
|
|
// no command skip
|
|
continue;
|
|
cout.setf(ios::left);
|
|
cout.width(34);
|
|
cout << cmdName << fConfig->getConfig(Section, "Desc1") << endl;
|
|
}
|
|
cout << endl << "For help on a command, enter 'help' followed by command name" << endl;
|
|
}
|
|
else
|
|
{
|
|
if (argument1_LC.find("-v") == 0)
|
|
{
|
|
// list of commands with their descriptions
|
|
cout << endl << "List of commands and descriptions:" << endl << endl;
|
|
for(int k=0 ; k < cmdNum ; k++)
|
|
{
|
|
Section = SECTION_NAME + oam.itoa(CmdListID[k]);
|
|
cmdName = fConfig->getConfig(Section, "Name");
|
|
if (cmdName.empty() || cmdName == "AVAILABLE")
|
|
//no command skip
|
|
continue;
|
|
cout << "Command: " << cmdName << endl << endl;
|
|
int i=2;
|
|
cout << " Description: " << fConfig->getConfig(Section, "Desc1") << endl;
|
|
while (true)
|
|
{
|
|
desc = DESC_NAME + oam.itoa(i);
|
|
descName = fConfig->getConfig(Section, desc);
|
|
if (descName.empty())
|
|
//end of Desc list
|
|
break;
|
|
cout << " " << descName << endl;
|
|
i++;
|
|
}
|
|
i=2;
|
|
cout << endl << " Arguments: " << fConfig->getConfig(Section, "Arg1") << endl;
|
|
while (true)
|
|
{
|
|
arg = ARG_NAME + oam.itoa(i);
|
|
argName = fConfig->getConfig(Section, arg);
|
|
if (argName.empty())
|
|
//end of arg list
|
|
break;
|
|
cout << " " << argName << endl;
|
|
i++;
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // description for a single command
|
|
int j=0;
|
|
for (j = 0; j < cmdNum; j++)
|
|
{
|
|
// get cmd description
|
|
|
|
Section = SECTION_NAME + oam.itoa(j);
|
|
|
|
cmdName = fConfig->getConfig(Section, "Name");
|
|
|
|
string cmdName_LC = cmdName;
|
|
transform (cmdName_LC.begin(), cmdName_LC.end(), cmdName_LC.begin(), to_lower());
|
|
|
|
if (cmdName_LC == argument1_LC)
|
|
{
|
|
// command found, output description
|
|
cout << endl << " Command: " << cmdName << endl << endl;
|
|
int i=2;
|
|
cout << " Description: " << fConfig->getConfig(Section, "Desc1") << endl;
|
|
while (true)
|
|
{
|
|
desc = DESC_NAME + oam.itoa(i);
|
|
descName = fConfig->getConfig(Section, desc);
|
|
if (descName.empty())
|
|
//end of Desc list
|
|
break;
|
|
cout << " " << descName << endl;
|
|
i++;
|
|
}
|
|
i=2;
|
|
cout << endl << " Arguments: " << fConfig->getConfig(Section, "Arg1") << endl;
|
|
while (true)
|
|
{
|
|
arg = ARG_NAME + oam.itoa(i);
|
|
argName = fConfig->getConfig(Section, arg);
|
|
if (argName.empty())
|
|
//end of arg list
|
|
break;
|
|
cout << " " << argName << endl;
|
|
i++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (j == cmdNum)
|
|
{
|
|
// command not valid
|
|
cout << arguments[1] << ": Unknown Command, type help for list of commands" << endl << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
cout << endl;
|
|
}
|
|
break;
|
|
|
|
case 2: // exit
|
|
case 3: // quit
|
|
{
|
|
// close the log file
|
|
writeLog("End of a command session!!!");
|
|
logFile.close();
|
|
cout << "Exiting the MariaDB ColumnStore Admin Console" << endl;
|
|
|
|
exit (0);
|
|
}
|
|
break;
|
|
|
|
case 4: // redistributeData
|
|
{
|
|
set<uint32_t> removeDbroots; // set of dbroots we want to leave empty
|
|
vector<uint32_t> srcDbroots; // all of the currently configured dbroots
|
|
vector<uint32_t> destDbroots; // srcDbroots - removeDbroots
|
|
set<int>::iterator dbiter;
|
|
if (arguments[1] == "start")
|
|
{
|
|
// Get a list of all the configured dbroots in the xml file.
|
|
DBRootConfigList dbRootConfigList;
|
|
std::set<int> configuredDBRoots;
|
|
oam.getSystemDbrootConfig(dbRootConfigList);
|
|
for (DBRootConfigList::iterator i = dbRootConfigList.begin(); i != dbRootConfigList.end(); ++i)
|
|
configuredDBRoots.insert(*i);
|
|
|
|
// The user may choose to redistribute in such a way as to
|
|
// leave certain dbroots empty, presumably for later removal.
|
|
if (arguments[2] == "remove")
|
|
{
|
|
int dbroot;
|
|
bool error = false;
|
|
for (int i=3; arguments[i] != ""; ++i)
|
|
{
|
|
dbroot = atoi(arguments[i].c_str());
|
|
if (dbroot == 1)
|
|
{
|
|
cout << "Not allowed to remove dbroot-1" << endl;
|
|
error = true;
|
|
}
|
|
else
|
|
{
|
|
if (configuredDBRoots.find(dbroot) == configuredDBRoots.end())
|
|
{
|
|
ostringstream oss;
|
|
cout << "DBRoot-" << dbroot << " is not configured" << endl;
|
|
error = true;
|
|
}
|
|
else
|
|
{
|
|
removeDbroots.insert((uint32_t)dbroot);
|
|
}
|
|
}
|
|
}
|
|
if (error)
|
|
{
|
|
cout << "Errors encountered. Abort" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Create a list of source dbroots -- where the data currently resides.
|
|
for (dbiter = configuredDBRoots.begin(); dbiter != configuredDBRoots.end(); ++dbiter)
|
|
srcDbroots.push_back((uint32_t)*dbiter);
|
|
|
|
// Create a list of destination dbroots -- where the data is to go.
|
|
for (dbiter = configuredDBRoots.begin(); dbiter != configuredDBRoots.end(); ++dbiter)
|
|
{
|
|
// Only use the dbroots not in the remove list
|
|
if (removeDbroots.find((uint32_t)*dbiter) == removeDbroots.end())
|
|
{
|
|
destDbroots.push_back((uint32_t)*dbiter);
|
|
}
|
|
}
|
|
// Print out what we're about to do
|
|
cout << "redistributeData START ";
|
|
if (removeDbroots.size() > 0)
|
|
{
|
|
cout << " Removing dbroots:";
|
|
set<uint32_t>::iterator iter;
|
|
for (iter = removeDbroots.begin(); iter != removeDbroots.end(); ++iter)
|
|
{
|
|
cout << " " << *iter;
|
|
}
|
|
}
|
|
cout << endl;
|
|
cout << "Source dbroots:";
|
|
vector<uint32_t>::iterator iter;
|
|
for (iter = srcDbroots.begin(); iter != srcDbroots.end(); ++iter)
|
|
cout << " " << *iter;
|
|
cout << endl << "Destination dbroots:";
|
|
for (iter = destDbroots.begin(); iter != destDbroots.end(); ++iter)
|
|
cout << " " << *iter;
|
|
cout << endl << endl;
|
|
|
|
// Connect to PM for dbroot1
|
|
ByteStream bs;
|
|
// message WES ID, sequence #, action id
|
|
uint32_t sequence = time(0);
|
|
bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
|
|
|
|
// Send the CLEAR message to WriteEngineServer (WES). Wipes out previous state.
|
|
RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_CLEAR);
|
|
bs.append((const ByteStream::byte*) &header, sizeof(header));
|
|
SendToWES(oam, bs);
|
|
|
|
// Send the START message
|
|
bs.restart();
|
|
sequence = time(0);
|
|
bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
|
|
header.sequenceNum=sequence;
|
|
header.messageId = RED_CNTL_START;
|
|
bs.append((const ByteStream::byte*) &header, sizeof(header));
|
|
uint32_t options = 0;
|
|
if (removeDbroots.size() > 0)
|
|
{
|
|
options |= RED_OPTN_REMOVE;
|
|
}
|
|
bs << options;
|
|
|
|
// source db roots,
|
|
bs << (uint32_t) srcDbroots.size();
|
|
for (uint64_t i = 0; i < srcDbroots.size(); ++i)
|
|
bs << (uint32_t) srcDbroots[i];
|
|
|
|
// destination db roots,
|
|
bs << (uint32_t) destDbroots.size();
|
|
for (uint64_t i = 0; i < destDbroots.size(); ++i)
|
|
bs << (uint32_t) destDbroots[i];
|
|
|
|
SendToWES(oam, bs);
|
|
}
|
|
else if (arguments[1] == "stop")
|
|
{
|
|
ByteStream bs;
|
|
// message WES ID, sequence #, action id
|
|
uint32_t sequence = time(0);
|
|
bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
|
|
RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_STOP);
|
|
bs.append((const ByteStream::byte*) &header, sizeof(header));
|
|
SendToWES(oam, bs);
|
|
}
|
|
else if (arguments[1] == "status")
|
|
{
|
|
ByteStream bs;
|
|
// message WES ID, sequence #, action id
|
|
uint32_t sequence = time(0);
|
|
bs << (ByteStream::byte) WriteEngine::WE_SVR_REDISTRIBUTE;
|
|
RedistributeMsgHeader header(0, 0, sequence, RED_CNTL_STATUS);
|
|
bs.append((const ByteStream::byte*) &header, sizeof(header));
|
|
SendToWES(oam, bs);
|
|
}
|
|
else
|
|
{
|
|
cout << "redistributeData must have one of START, STOP or STATUS" << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 5: // findObjectFile
|
|
{
|
|
unsigned maxDBRoot = WriteEngine::Config::DBRootCount();
|
|
if (maxDBRoot < 1)
|
|
{
|
|
cout << endl << "findobjectfile fails because there are no dbroots defined for this server" << endl;
|
|
break;;
|
|
}
|
|
if (arguments[1] == "")
|
|
{
|
|
cout << endl << "findobjectfile requires one of" << endl;
|
|
cout << "a) oid of column for which file name is to be retrieved" << endl;
|
|
cout << "b) schema, table and column for which the file name is to be retrieved" << endl;
|
|
cout << "c) oid of table for which the file name of each column is to be retrieved" << endl;
|
|
cout << "d) schema and table for which the file name of each column is to be retrieved" << endl;
|
|
break;
|
|
}
|
|
char* endchar;
|
|
int oid = 0;
|
|
int tableOid = 0; // If a table report
|
|
int dictOid = 0; // If a dictionary oid was given
|
|
std::vector<int> columnOids;
|
|
CalpontSystemCatalog::TableName tableName;
|
|
CalpontSystemCatalog::TableColName columnName;
|
|
boost::shared_ptr<execplan::CalpontSystemCatalog> systemCatalogPtr =
|
|
execplan::CalpontSystemCatalog::makeCalpontSystemCatalog(0);
|
|
systemCatalogPtr->identity(execplan::CalpontSystemCatalog::FE);
|
|
|
|
// Try to get a numeric oid from the argument
|
|
oid = strtol(arguments[1].c_str(), &endchar, 0);
|
|
// test to see if not all numeric
|
|
if (endchar < &(*arguments[1].end())) // endchar from above will not point to the end if not numeric
|
|
{
|
|
oid = 0;
|
|
}
|
|
if (oid == 0) // A table or column name was entered
|
|
{
|
|
// Need to convert the arguments to oid
|
|
columnName.schema = arguments[1];
|
|
if (arguments[2] == "")
|
|
{
|
|
cout << endl << "findobjectfile requires a table for schema " << arguments[1] << endl;
|
|
break;
|
|
}
|
|
columnName.table = arguments[2];
|
|
if (arguments[3] == "")
|
|
{
|
|
// No column was given. Get the list of column oids for the table.
|
|
tableName.schema = arguments[1];
|
|
tableName.table = arguments[2];
|
|
try
|
|
{
|
|
tableOid = systemCatalogPtr->lookupTableOID(tableName);
|
|
if (tableOid)
|
|
{
|
|
CalpontSystemCatalog::RIDList rdlist = systemCatalogPtr->columnRIDs(tableName);
|
|
for (unsigned int i = 0; i < rdlist.size(); ++i)
|
|
{
|
|
columnOids.push_back(rdlist[i].objnum);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cout << arguments[1] << "." << arguments[2] << " is not a columnstore table" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch ( runtime_error& e )
|
|
{
|
|
cout << "error while trying to get the columns for " << tableName.schema << "." << tableName.table << ": " << e.what() << endl;
|
|
break;
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << "error while trying to get the columns for " << tableName.schema << "." << tableName.table << endl;
|
|
break;
|
|
}
|
|
}
|
|
else // A column name was given
|
|
{
|
|
columnName.column = arguments[3];
|
|
oid = systemCatalogPtr->lookupOID(columnName);
|
|
if (oid < 1)
|
|
{
|
|
cout << arguments[1] << "." << arguments[2] << "." << arguments[3] << " is not a columnstore column" << endl;
|
|
break;
|
|
}
|
|
columnOids.push_back(oid);
|
|
}
|
|
}
|
|
else // An oid was given
|
|
{
|
|
try
|
|
{
|
|
// Is oid a column?
|
|
columnName = systemCatalogPtr->colName(oid);
|
|
}
|
|
catch (...){ /* Ignore */ }
|
|
if (columnName.schema.size() == 0 || columnName.table.size() == 0 || columnName.column.size() == 0)
|
|
{
|
|
// Not a column OID
|
|
// check to see if it's a dictionary oid.
|
|
try
|
|
{
|
|
columnName = systemCatalogPtr->dictColName(oid);
|
|
}
|
|
catch (...){ /* Ignore */ }
|
|
if (columnName.schema.size() == 0 || columnName.table.size() == 0 || columnName.column.size() == 0)
|
|
{
|
|
// Not a dictionary oid
|
|
// Check to see if a table oid was given. If so, get the column oid list.
|
|
try
|
|
{
|
|
tableName = systemCatalogPtr->tableName(oid);
|
|
}
|
|
catch (...){ /* Ignore */ }
|
|
if (tableName.schema.size() == 0 || tableName.table.size() == 0)
|
|
{
|
|
// Not a table or a column OID.
|
|
cout << "OID " << oid << " does not represent a table or column in columnstore" << endl;
|
|
break;
|
|
}
|
|
tableOid = oid;
|
|
try
|
|
{
|
|
CalpontSystemCatalog::RIDList rdlist = systemCatalogPtr->columnRIDs(tableName);
|
|
for (unsigned int i = 0; i < rdlist.size(); ++i)
|
|
{
|
|
columnOids.push_back(rdlist[i].objnum);
|
|
}
|
|
}
|
|
catch (...){ /* Ignore */ }
|
|
}
|
|
else
|
|
{
|
|
// This is a dictionary oid
|
|
dictOid = oid;
|
|
columnOids.push_back(oid);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// This is a column oid
|
|
columnOids.push_back(oid);
|
|
}
|
|
}
|
|
|
|
// Use writeengine code to get the filenames
|
|
WriteEngine::FileOp fileOp;
|
|
char fileName[WriteEngine::FILE_NAME_SIZE];
|
|
memset(fileName, 0, WriteEngine::FILE_NAME_SIZE);
|
|
int rc;
|
|
|
|
if (tableOid)
|
|
{
|
|
cout << "for table OID " << tableOid << " "
|
|
<< tableName.schema << "." << tableName.table << ":" << endl;
|
|
}
|
|
for (unsigned int i = 0; i < columnOids.size(); ++i)
|
|
{
|
|
oid = columnOids[i];
|
|
if (oid < 1000)
|
|
{
|
|
rc = fileOp.getVBFileName(oid, fileName);
|
|
}
|
|
else
|
|
{
|
|
rc = fileOp.oid2DirName(oid, fileName);
|
|
}
|
|
if (oid == dictOid)
|
|
{
|
|
columnName = systemCatalogPtr->dictColName(oid);
|
|
cout << "dictionary OID " << oid << " ";
|
|
}
|
|
else
|
|
{
|
|
columnName = systemCatalogPtr->colName(oid);
|
|
cout << "column OID " << oid << " ";
|
|
}
|
|
if (!tableOid)
|
|
{
|
|
cout << columnName.schema << "." << columnName.table << ".";
|
|
}
|
|
cout << columnName.column << "\t";
|
|
if (strlen(fileName) > 0)
|
|
{
|
|
cout << fileName;
|
|
}
|
|
if (rc == WriteEngine::NO_ERROR)
|
|
{
|
|
// Success. No more output.
|
|
cout << endl;
|
|
}
|
|
else if (rc == WriteEngine::ERR_FILE_NOT_EXIST)
|
|
{
|
|
if (strlen(fileName) == 0)
|
|
{
|
|
// We couldn't get a name
|
|
cout << "Error: Filename could not be determined" << endl;
|
|
}
|
|
else
|
|
{
|
|
// We got a name, but the file doesn't exist
|
|
cout << " (directory does not exist on this server)" << endl;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Something broke
|
|
cerr << "WriteEngine::FileOp::oid2DirName() error. rc=" << rc << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 6: // getModuleTypeConfig
|
|
{
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
ModuleConfig moduleconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
string returnValue;
|
|
string Argument;
|
|
|
|
if (arguments[1] == "all" || arguments[1] == "")
|
|
{
|
|
|
|
// get and all display Module config parameters
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
cout << endl << "Module Type Configuration" << endl << endl;
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
|
|
if ( moduleCount < 1 )
|
|
continue;
|
|
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
cout << "ModuleType '" << moduletype << "' Configuration information" << endl << endl;
|
|
|
|
cout << "ModuleDesc = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc << endl;
|
|
cout << "RunType = " << systemmoduletypeconfig.moduletypeconfig[i].RunType << endl;
|
|
cout << "ModuleCount = " << moduleCount << endl;
|
|
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
string ipAddr = (*pt1).IPAddr;
|
|
string servername = (*pt1).HostName;
|
|
cout << "ModuleHostName and ModuleIPAddr for NIC ID " + oam.itoa((*pt1).NicID) + " on module '" << modulename << "' = " << servername << " , " << ipAddr << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
DeviceDBRootList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end() ; pt++)
|
|
{
|
|
if ( (*pt).dbrootConfigList.size() > 0 )
|
|
{
|
|
cout << "DBRootIDs assigned to module 'pm" << (*pt).DeviceID << "' = ";
|
|
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
|
|
for( ; pt1 != (*pt).dbrootConfigList.end() ; )
|
|
{
|
|
cout << *pt1;
|
|
pt1++;
|
|
if (pt1 != (*pt).dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
cout << "ModuleCPUCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUCriticalThreshold << endl;
|
|
cout << "ModuleCPUMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMajorThreshold << endl;
|
|
cout << "ModuleCPUMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMinorThreshold << endl;
|
|
cout << "ModuleCPUMinorClearThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleCPUMinorClearThreshold << endl;
|
|
cout << "ModuleDiskCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskCriticalThreshold << endl;
|
|
cout << "ModuleDiskMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskMajorThreshold << endl;
|
|
cout << "ModuleDiskMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDiskMinorThreshold << endl;
|
|
cout << "ModuleMemCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemCriticalThreshold << endl;
|
|
cout << "ModuleMemMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemMajorThreshold << endl;
|
|
cout << "ModuleMemMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleMemMinorThreshold << endl;
|
|
cout << "ModuleSwapCriticalThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapCriticalThreshold << endl;
|
|
cout << "ModuleSwapMajorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapMajorThreshold << endl;
|
|
cout << "ModuleSwapMinorThreshold % = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleSwapMinorThreshold << endl;
|
|
|
|
DiskMonitorFileSystems::iterator pt2 = systemmoduletypeconfig.moduletypeconfig[i].FileSystems.begin();
|
|
int id=1;
|
|
for( ; pt2 != systemmoduletypeconfig.moduletypeconfig[i].FileSystems.end() ; pt2++)
|
|
{
|
|
string fs = *pt2;
|
|
cout << "ModuleDiskMonitorFileSystem#" << id << " = " << fs << endl;
|
|
++id;
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleTypeConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a single module type config
|
|
if (arguments[2] == "")
|
|
{
|
|
try
|
|
{
|
|
oam.getSystemConfig(arguments[1], moduletypeconfig);
|
|
|
|
cout << endl << "Module Type Configuration for " << arguments[1] << endl << endl;
|
|
|
|
int moduleCount = moduletypeconfig.ModuleCount;
|
|
string moduletype = moduletypeconfig.ModuleType;
|
|
|
|
cout << "ModuleDesc = " << moduletypeconfig.ModuleDesc << endl;
|
|
cout << "ModuleCount = " << moduleCount << endl;
|
|
cout << "RunType = " << moduletypeconfig.RunType << endl;
|
|
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();
|
|
for( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
string ipAddr = (*pt1).IPAddr;
|
|
string servername = (*pt1).HostName;
|
|
cout << "ModuleHostName and ModuleIPAddr for NIC ID " + oam.itoa((*pt1).NicID) + " on module " << modulename << " = " << servername << " , " << ipAddr << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
int dbrootCount = moduletypeconfig.ModuleDBRootList.size();
|
|
|
|
cout << "DBRootCount = " << dbrootCount << endl;
|
|
|
|
if ( dbrootCount > 0 )
|
|
{
|
|
DeviceDBRootList::iterator pt = moduletypeconfig.ModuleDBRootList.begin();
|
|
for( ; pt != moduletypeconfig.ModuleDBRootList.end() ; pt++)
|
|
{
|
|
cout << "DBRoot IDs assigned to 'pm" + oam.itoa((*pt).DeviceID) + "' = ";
|
|
|
|
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
|
|
for( ; pt1 != (*pt).dbrootConfigList.end() ; )
|
|
{
|
|
cout << *pt1;
|
|
pt1++;
|
|
if (pt1 != (*pt).dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
|
|
cout << "ModuleCPUCriticalThreshold % = " << moduletypeconfig.ModuleCPUCriticalThreshold << endl;
|
|
cout << "ModuleCPUMajorThreshold % = " << moduletypeconfig.ModuleCPUMajorThreshold << endl;
|
|
cout << "ModuleCPUMinorThreshold % = " << moduletypeconfig.ModuleCPUMinorThreshold << endl;
|
|
cout << "ModuleCPUMinorClearThreshold % = " << moduletypeconfig.ModuleCPUMinorClearThreshold << endl;
|
|
cout << "ModuleDiskCriticalThreshold % = " << moduletypeconfig.ModuleDiskCriticalThreshold << endl;
|
|
cout << "ModuleDiskMajorThreshold % = " << moduletypeconfig.ModuleDiskMajorThreshold << endl;
|
|
cout << "ModuleDiskMinorThreshold % = " << moduletypeconfig.ModuleDiskMinorThreshold << endl;
|
|
cout << "ModuleMemCriticalThreshold % = " << moduletypeconfig.ModuleMemCriticalThreshold << endl;
|
|
cout << "ModuleMemMajorThreshold % = " << moduletypeconfig.ModuleMemMajorThreshold << endl;
|
|
cout << "ModuleMemMinorThreshold % = " << moduletypeconfig.ModuleMemMinorThreshold << endl;
|
|
cout << "ModuleSwapCriticalThreshold % = " << moduletypeconfig.ModuleSwapCriticalThreshold << endl;
|
|
cout << "ModuleSwapMajorThreshold % = " << moduletypeconfig.ModuleSwapMajorThreshold << endl;
|
|
cout << "ModuleSwapMinorThreshold % = " << moduletypeconfig.ModuleSwapMinorThreshold << endl;
|
|
|
|
DiskMonitorFileSystems::iterator pt = moduletypeconfig.FileSystems.begin();
|
|
int id=1;
|
|
for( ; pt != moduletypeconfig.FileSystems.end() ; pt++)
|
|
{
|
|
string fs = *pt;
|
|
cout << "ModuleDiskMonitorFileSystem#" << id << " = " << fs << endl;
|
|
++id;
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleTypeConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a parameter for a module type
|
|
try {
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
unsigned int i = 0;
|
|
for( i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if(systemmoduletypeconfig.moduletypeconfig[i].ModuleType == arguments[1])
|
|
{
|
|
string argument2 = arguments[2];
|
|
string::size_type pos = arguments[2].rfind("#",200);
|
|
if (pos != string::npos)
|
|
{
|
|
string ID = arguments[2].substr(pos+1,5);
|
|
arguments[2] = arguments[2].substr(0,pos);
|
|
arguments[2] = arguments[2] + ID + "-";
|
|
}
|
|
|
|
Argument = arguments[2] + oam.itoa(i+1);
|
|
try
|
|
{
|
|
oam.getSystemConfig(Argument, returnValue);
|
|
cout << endl << " " << argument2 << " = " << returnValue << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleTypeConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if( i == systemmoduletypeconfig.moduletypeconfig.size() )
|
|
{
|
|
// module type not found
|
|
cout << endl << "**** getModuleTypeConfig Failed : Invalid Module Type" << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 7: // setModuleTypeConfig - parameters: Module type, Parameter name and value
|
|
{
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
string Argument;
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** setModuleTypeConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[3] == "")
|
|
{
|
|
// need 3 arguments
|
|
cout << endl << "**** setModuleTypeConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
if ( arguments[3] == "=" ) {
|
|
cout << endl << "**** setModuleTypeConfig Failed : Invalid Value of '=', please re-enter" << endl;
|
|
break;
|
|
}
|
|
|
|
try {
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
unsigned int i = 0;
|
|
for( i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if(systemmoduletypeconfig.moduletypeconfig[i].ModuleType == arguments[1])
|
|
{
|
|
string argument2 = arguments[2];
|
|
string::size_type pos = arguments[2].rfind("#",200);
|
|
if (pos != string::npos)
|
|
{
|
|
string ID = arguments[2].substr(pos+1,5);
|
|
arguments[2] = arguments[2].substr(0,pos);
|
|
arguments[2] = arguments[2] + ID + "-";
|
|
}
|
|
|
|
Argument = arguments[2] + oam.itoa(i+1);
|
|
try
|
|
{
|
|
oam.setSystemConfig(Argument, arguments[3]);
|
|
cout << endl << " Successfully set " << argument2 << " = " << arguments[3] << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** setModuleTypeConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if( i == systemmoduletypeconfig.moduletypeconfig.size() )
|
|
{
|
|
// module type not found
|
|
cout << endl << "**** setModuleTypeConfig Failed : Invalid Module Type" << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 8: // getProcessConfig
|
|
{
|
|
SystemProcessConfig systemprocessconfig;
|
|
ProcessConfig processconfig;
|
|
string returnValue;
|
|
|
|
if (arguments[1] == "all" || arguments[1] == "")
|
|
{
|
|
// get and all display Process config parameters
|
|
|
|
try
|
|
{
|
|
oam.getProcessConfig(systemprocessconfig);
|
|
|
|
cout << endl << "Process Configuration" << endl << endl;
|
|
|
|
for( unsigned int i = 0 ; i < systemprocessconfig.processconfig.size(); i++)
|
|
{
|
|
cout << "Process #" << i+1 << " Configuration information" << endl;
|
|
|
|
cout << "ProcessName = " << systemprocessconfig.processconfig[i].ProcessName << endl;
|
|
cout << "ModuleType = " << systemprocessconfig.processconfig[i].ModuleType << endl;
|
|
cout << "ProcessLocation = " << systemprocessconfig.processconfig[i].ProcessLocation << endl;
|
|
|
|
for( int j = 0 ; j < oam::MAX_ARGUMENTS; j++)
|
|
{
|
|
if (systemprocessconfig.processconfig[i].ProcessArgs[j].empty())
|
|
break;
|
|
cout << "ProcessArg" << j+1 << " = " << systemprocessconfig.processconfig[i].ProcessArgs[j] << endl;
|
|
}
|
|
cout << "BootLaunch = " << systemprocessconfig.processconfig[i].BootLaunch << endl;
|
|
cout << "LaunchID = " << systemprocessconfig.processconfig[i].LaunchID << endl;
|
|
|
|
for( int j = 0 ; j < MAX_DEPENDANCY; j++)
|
|
{
|
|
if (systemprocessconfig.processconfig[i].DepProcessName[j].empty())
|
|
break;
|
|
cout << "DepModuleName" << j+1 << " = " << systemprocessconfig.processconfig[i].DepModuleName[j] << endl;
|
|
cout << "DepProcessName" << j+1 << " = " << systemprocessconfig.processconfig[i].DepProcessName[j] << endl;
|
|
}
|
|
// display Process Group variables, if they exist
|
|
|
|
cout << "RunType = " << systemprocessconfig.processconfig[i].RunType << endl;
|
|
cout << "LogFile = " << systemprocessconfig.processconfig[i].LogFile << endl;
|
|
|
|
cout << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getProcessConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a single process info - parameters: module-name, process-name
|
|
if (arguments[2] == "")
|
|
{
|
|
cout << endl << "**** getProcessConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
if (arguments[3] == "")
|
|
{
|
|
//**** Add API to get single process info
|
|
try
|
|
{
|
|
oam.getProcessConfig(arguments[1], arguments[2], processconfig);
|
|
|
|
cout << endl << "Process Configuration for " << arguments[1] << " on module " << arguments[2] << endl << endl;
|
|
|
|
cout << "ProcessName = " << processconfig.ProcessName << endl;
|
|
cout << "ModuleType = " << processconfig.ModuleType << endl;
|
|
cout << "ProcessLocation = " << processconfig.ProcessLocation << endl;
|
|
for( int j = 0 ; j < oam::MAX_ARGUMENTS; j++)
|
|
{
|
|
if (processconfig.ProcessArgs[j].empty())
|
|
break;
|
|
cout << "ProcessArg" << j+1 << " = " << processconfig.ProcessArgs[j] << endl;
|
|
}
|
|
cout << "BootLaunch = " << processconfig.BootLaunch << endl;
|
|
cout << "LaunchID = " << processconfig.LaunchID << endl;
|
|
|
|
for( int j = 0 ; j < MAX_DEPENDANCY; j++)
|
|
{
|
|
if (processconfig.DepProcessName[j].empty())
|
|
break;
|
|
cout << "DepProcessName" << j+1 << " = " << processconfig.DepProcessName[j] << endl;
|
|
cout << "DepModuleName" << j+1 << " = " << processconfig.DepModuleName[j] << endl;
|
|
}
|
|
|
|
cout << "RunType = " << processconfig.RunType << endl;
|
|
cout << "LogFile = " << processconfig.LogFile << endl;
|
|
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getProcessConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a parameter for a process - parameters: module-name, process-name,
|
|
// parameter-name
|
|
// get module ID from module name entered, then get parameter
|
|
try
|
|
{
|
|
oam.getProcessConfig(arguments[1], arguments[2], arguments[3], returnValue);
|
|
cout << endl << " " << arguments[3] << " = " << returnValue << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getProcessConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 9: // setProcessConfig - parameters: Module name, Process Name, Parameter name and value
|
|
{
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** setProcessConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[4] == "")
|
|
{
|
|
cout << endl << "**** setProcessConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
try
|
|
{
|
|
if ( arguments[4] == "=" ) {
|
|
cout << endl << "**** setProcessConfig Failed : Invalid Value of '=', please re-enter" << endl;
|
|
break;
|
|
}
|
|
|
|
oam.setProcessConfig(arguments[1], arguments[2], arguments[3], arguments[4]);
|
|
cout << endl << " Successfully set " << arguments[3] << " = " << arguments[4] << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** setProcessConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 10: // getAlarmConfig- parameters: all or AlarmID
|
|
{
|
|
AlarmConfig alarmconfig;
|
|
|
|
if (arguments[1] == "all" || arguments[1] == "")
|
|
{
|
|
|
|
// get and all display Alarm config parameters
|
|
|
|
cout << endl << "Alarm Configuration" << endl << endl;
|
|
|
|
for( int alarmID = 1 ; alarmID < MAX_ALARM_ID; alarmID++)
|
|
{
|
|
try
|
|
{
|
|
oam.getAlarmConfig(alarmID, alarmconfig);
|
|
|
|
cout << "Alarm ID #" << alarmID << " Configuration information" << endl;
|
|
|
|
cout << "BriefDesc = " << alarmconfig.BriefDesc << endl;
|
|
cout << "DetailedDesc = " << alarmconfig.DetailedDesc << endl;
|
|
// cout << "EmailAddr = " << alarmconfig.EmailAddr << endl;
|
|
// cout << "PagerNum = " << alarmconfig.PagerNum << endl;
|
|
|
|
switch(alarmconfig.Severity)
|
|
{
|
|
case CRITICAL:
|
|
cout << "Severity = CRITICAL" << endl;
|
|
break;
|
|
case MAJOR:
|
|
cout << "Severity = MAJOR" << endl;
|
|
break;
|
|
case MINOR:
|
|
cout << "Severity = MINOR" << endl;
|
|
break;
|
|
case WARNING:
|
|
cout << "Severity = WARNING" << endl;
|
|
break;
|
|
default:
|
|
cout << "Severity = INFORMATIONAL" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << "Threshold = " << alarmconfig.Threshold << endl;
|
|
// cout << "Occurrences = " << alarmconfig.Occurrences << endl;
|
|
// cout << "LastIssueTime = " << alarmconfig.LastIssueTime << endl << endl;
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getAlarmConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{ // get a single Alarm info
|
|
try
|
|
{
|
|
oam.getAlarmConfig(atoi(arguments[1].c_str()), alarmconfig);
|
|
|
|
cout << endl << "Alarm ID #" << arguments[1] << " Configuration information" << endl;
|
|
|
|
cout << "BriefDesc = " << alarmconfig.BriefDesc << endl;
|
|
cout << "DetailedDesc = " << alarmconfig.DetailedDesc << endl;
|
|
// cout << "EmailAddr = " << alarmconfig.EmailAddr << endl;
|
|
// cout << "PagerNum = " << alarmconfig.PagerNum << endl;
|
|
|
|
switch(alarmconfig.Severity)
|
|
{
|
|
case CRITICAL:
|
|
cout << "Severity = CRITICAL" << endl;
|
|
break;
|
|
case MAJOR:
|
|
cout << "Severity = MAJOR" << endl;
|
|
break;
|
|
case MINOR:
|
|
cout << "Severity = MINOR" << endl;
|
|
break;
|
|
case WARNING:
|
|
cout << "Severity = WARNING" << endl;
|
|
break;
|
|
default:
|
|
cout << "Severity = INFORMATIONAL" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << "Threshold = " << alarmconfig.Threshold << endl;
|
|
// cout << "Occurrences = " << alarmconfig.Occurrences << endl;
|
|
// cout << "LastIssueTime = " << alarmconfig.LastIssueTime << endl << endl;
|
|
cout << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getAlarmConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 11: // setAlarmConfig - parameters: AlarmID, Parameter name and value
|
|
{
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** setAlarmConfig Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[3] == "")
|
|
{
|
|
// need 3 arguments
|
|
cout << endl << "**** setAlarmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
try
|
|
{
|
|
if ( arguments[3] == "=" ) {
|
|
cout << endl << "**** setAlarmConfig Failed : Invalid Value of '=', please re-enter" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( arguments[2] == "Threshold" && arguments[3] != "0" && atoi(arguments[3].c_str()) == 0 ) {
|
|
cout << endl << "**** setAlarmConfig Failed : New value must be a number" << endl;
|
|
break;
|
|
}
|
|
|
|
oam.setAlarmConfig(atoi(arguments[1].c_str()), arguments[2], atoi(arguments[3].c_str()));
|
|
cout << endl << " Successfully set " << arguments[2] << " = " << arguments[3] << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** setAlarmConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 12: // getActiveAlarms - parameters: none
|
|
{
|
|
AlarmList alarmList;
|
|
try {
|
|
oam.getActiveAlarms(alarmList);
|
|
}
|
|
catch(...)
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** getActiveAlarms Failed : Error in oam.getActiveAlarms" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Active Alarm List:" << endl << endl;
|
|
|
|
AlarmList :: iterator i;
|
|
for (i = alarmList.begin(); i != alarmList.end(); ++i)
|
|
{
|
|
cout << "AlarmID = " << i->second.getAlarmID() << endl;
|
|
cout << "Brief Description = " << i->second.getDesc() << endl;
|
|
cout << "Alarm Severity = ";
|
|
switch (i->second.getSeverity())
|
|
{
|
|
case CRITICAL:
|
|
cout << "CRITICAL" << endl;
|
|
break;
|
|
case MAJOR:
|
|
cout << "MAJOR" << endl;
|
|
break;
|
|
case MINOR:
|
|
cout << "MINOR" << endl;
|
|
break;
|
|
case WARNING:
|
|
cout << "WARNING" << endl;
|
|
break;
|
|
case INFORMATIONAL:
|
|
cout << "INFORMATIONAL" << endl;
|
|
break;
|
|
}
|
|
cout << "Time Issued = " << i->second.getTimestamp() << endl;
|
|
cout << "Reporting Module = " << i->second.getSname() << endl;
|
|
cout << "Reporting Process = " << i->second.getPname() << endl;
|
|
cout << "Reported Device = " << i->second.getComponentID() << endl << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 13: // getStorageConfig
|
|
{
|
|
try
|
|
{
|
|
systemStorageInfo_t t;
|
|
t = oam.getStorageConfig();
|
|
|
|
string cloud;
|
|
try {
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
}
|
|
catch(...) {}
|
|
|
|
string::size_type pos = cloud.find("amazon",0);
|
|
if (pos != string::npos)
|
|
cloud = "amazon";
|
|
|
|
cout << endl << "System Storage Configuration" << endl << endl;
|
|
|
|
cout << "Performance Module (DBRoot) Storage Type = " << boost::get<0>(t) << endl;
|
|
if ( cloud == "amazon" )
|
|
cout << "User Module Storage Type = " << boost::get<3>(t) << endl;
|
|
cout << "System Assigned DBRoot Count = " << boost::get<1>(t) << endl;
|
|
|
|
DeviceDBRootList moduledbrootlist = boost::get<2>(t);
|
|
|
|
typedef std::vector<int> dbrootList;
|
|
dbrootList dbrootlist;
|
|
|
|
DeviceDBRootList::iterator pt = moduledbrootlist.begin();
|
|
for( ; pt != moduledbrootlist.end() ; pt++)
|
|
{
|
|
cout << "DBRoot IDs assigned to 'pm" + oam.itoa((*pt).DeviceID) + "' = ";
|
|
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
|
|
for( ; pt1 != (*pt).dbrootConfigList.end() ;)
|
|
{
|
|
cout << *pt1;
|
|
dbrootlist.push_back(*pt1);
|
|
pt1++;
|
|
if (pt1 != (*pt).dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
//get any unassigned DBRoots
|
|
DBRootConfigList undbrootlist;
|
|
try {
|
|
oam.getUnassignedDbroot(undbrootlist);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( !undbrootlist.empty() )
|
|
{
|
|
cout << endl << "DBRoot IDs unassigned = ";
|
|
DBRootConfigList::iterator pt1 = undbrootlist.begin();
|
|
for( ; pt1 != undbrootlist.end() ;)
|
|
{
|
|
cout << *pt1;
|
|
pt1++;
|
|
if (pt1 != undbrootlist.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
cout << endl;
|
|
// um volumes
|
|
if (cloud == "amazon" && boost::get<3>(t) == "external")
|
|
{
|
|
ModuleTypeConfig moduletypeconfig;
|
|
oam.getSystemConfig("um", moduletypeconfig);
|
|
for ( int id = 1; id < moduletypeconfig.ModuleCount+1 ; id++)
|
|
{
|
|
string volumeNameID = "UMVolumeName" + oam.itoa(id);
|
|
string volumeName = oam::UnassignedName;
|
|
string deviceNameID = "UMVolumeDeviceName" + oam.itoa(id);
|
|
string deviceName = oam::UnassignedName;
|
|
try {
|
|
oam.getSystemConfig( volumeNameID, volumeName);
|
|
oam.getSystemConfig( deviceNameID, deviceName);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
cout << "Amazon EC2 Volume Name/Device Name for 'um" << id << "': " << volumeName << ", " << deviceName << endl;
|
|
}
|
|
}
|
|
|
|
// pm volumes
|
|
if (cloud == "amazon" && boost::get<0>(t) == "external")
|
|
{
|
|
cout << endl;
|
|
|
|
DBRootConfigList dbrootConfigList;
|
|
try
|
|
{
|
|
oam.getSystemDbrootConfig(dbrootConfigList);
|
|
|
|
DBRootConfigList::iterator pt = dbrootConfigList.begin();
|
|
for( ; pt != dbrootConfigList.end() ; pt++)
|
|
{
|
|
string volumeNameID = "PMVolumeName" + oam.itoa(*pt);
|
|
string volumeName = oam::UnassignedName;
|
|
string deviceNameID = "PMVolumeDeviceName" + oam.itoa(*pt);
|
|
string deviceName = oam::UnassignedName;
|
|
string amazonDeviceNameID = "PMVolumeAmazonDeviceName" + oam.itoa(*pt);
|
|
string amazondeviceName = oam::UnassignedName;
|
|
|
|
try {
|
|
oam.getSystemConfig( volumeNameID, volumeName);
|
|
oam.getSystemConfig( deviceNameID, deviceName);
|
|
oam.getSystemConfig( amazonDeviceNameID, amazondeviceName);
|
|
}
|
|
catch(...)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
cout << "Amazon EC2 Volume Name/Device Name/Amazon Device Name for DBRoot" << oam.itoa(*pt) << ": " << volumeName << ", " << deviceName << ", " << amazondeviceName << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemDbrootConfig Failed : " << e.what() << endl;
|
|
}
|
|
|
|
// print un-assigned dbroots
|
|
DBRootConfigList::iterator pt1 = undbrootlist.begin();
|
|
for( ; pt1 != undbrootlist.end() ; pt1++)
|
|
{
|
|
string volumeNameID = "PMVolumeName" + oam.itoa(*pt1);
|
|
string volumeName = oam::UnassignedName;
|
|
string deviceNameID = "PMVolumeDeviceName" + oam.itoa(*pt1);
|
|
string deviceName = oam::UnassignedName;
|
|
string amazonDeviceNameID = "PMVolumeAmazonDeviceName" + oam.itoa(*pt1);
|
|
string amazondeviceName = oam::UnassignedName;
|
|
|
|
try {
|
|
oam.getSystemConfig( volumeNameID, volumeName);
|
|
oam.getSystemConfig( deviceNameID, deviceName);
|
|
oam.getSystemConfig( amazonDeviceNameID, amazondeviceName);
|
|
}
|
|
catch(...)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
cout << "Amazon EC2 Volume Name/Device Name/Amazon Device Name for DBRoot" << oam.itoa(*pt1) << ": " << volumeName << ", " << deviceName << ", " << amazondeviceName << endl;
|
|
}
|
|
}
|
|
|
|
string DataRedundancyConfig;
|
|
int DataRedundancyCopies;
|
|
string DataRedundancyStorageType;
|
|
try {
|
|
oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
|
|
oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
|
|
oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DataRedundancyConfig == "y" )
|
|
{
|
|
cout << endl << "Data Redundant Configuration" << endl << endl;
|
|
cout << "Copies Per DBroot = " << DataRedundancyCopies << endl;
|
|
//cout << "Storage Type = " << DataRedundancyStorageType << endl;
|
|
|
|
oamModuleInfo_t st;
|
|
string moduleType;
|
|
try {
|
|
st = oam.getModuleInfo();
|
|
moduleType = boost::get<1>(st);
|
|
}
|
|
catch (...) {}
|
|
|
|
if ( moduleType != "pm")
|
|
break;
|
|
|
|
try
|
|
{
|
|
DBRootConfigList dbrootConfigList;
|
|
oam.getSystemDbrootConfig(dbrootConfigList);
|
|
|
|
DBRootConfigList::iterator pt = dbrootConfigList.begin();
|
|
for( ; pt != dbrootConfigList.end() ; pt++)
|
|
{
|
|
cout << "DBRoot #" << oam.itoa(*pt) << " has copies on PMs = ";
|
|
|
|
string pmList = "";
|
|
try {
|
|
string errmsg;
|
|
oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*pt), pmList, errmsg);
|
|
}
|
|
catch (...)
|
|
{}
|
|
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
cout << *it << " ";
|
|
}
|
|
|
|
cout << endl;
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemDbrootConfig Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getStorageConfig Failed : " << e.what() << endl;
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
break;
|
|
}
|
|
|
|
case 14: // addDbroot parameters: dbroot-number
|
|
{
|
|
string DataRedundancyConfig = "n";
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if (DataRedundancyConfig == "y") {
|
|
cout << endl << "**** addDbroot Not Supported on Data Redundancy Configured System, use addModule command to expand your capacity" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** addDbroot Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
string cloud;
|
|
bool amazon = false;
|
|
try {
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
}
|
|
catch(...) {}
|
|
|
|
string::size_type pos = cloud.find("amazon",0);
|
|
if (pos != string::npos)
|
|
amazon = true;
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need atleast 1 arguments
|
|
cout << endl << "**** addDbroot Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
int dbrootNumber = atoi(arguments[1].c_str());
|
|
|
|
string DBRootStorageType;
|
|
try {
|
|
oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
string EBSsize = oam::UnassignedName;
|
|
if (amazon && DBRootStorageType == "external" )
|
|
{
|
|
if ( arguments[2] != "")
|
|
EBSsize = arguments[2];
|
|
else
|
|
{
|
|
cout << endl;
|
|
oam.getSystemConfig("PMVolumeSize", EBSsize);
|
|
|
|
string prompt = "Enter EBS storage size in GB, current setting is " + EBSsize + " : ";
|
|
EBSsize = dataPrompt(prompt);
|
|
}
|
|
}
|
|
|
|
//get dbroots ids for reside PM
|
|
try
|
|
{
|
|
DBRootConfigList dbrootlist;
|
|
oam.addDbroot(dbrootNumber, dbrootlist, EBSsize);
|
|
|
|
cout << endl << " New DBRoot IDs added = ";
|
|
|
|
DBRootConfigList::iterator pt = dbrootlist.begin();
|
|
for( ; pt != dbrootlist.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != dbrootlist.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** addDbroot Failed: " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl;
|
|
}
|
|
break;
|
|
|
|
case 15: // removeDbroot parameters: dbroot-list
|
|
{
|
|
|
|
string DataRedundancyConfig = "n";
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if (DataRedundancyConfig == "y") {
|
|
cout << endl << "**** removeDbroot Not Supported on Data Redundancy Configured System, use removeModule command to remove modules and dbroots" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** removeDbroot Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need atleast 1 arguments
|
|
cout << endl << "**** removeDbroot Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
SystemStatus systemstatus;
|
|
try {
|
|
oam.getSystemStatus(systemstatus);
|
|
|
|
if (systemstatus.SystemOpState != oam::ACTIVE ) {
|
|
cout << endl << "**** removeDbroot Failed, System has to be in a ACTIVE state" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** removeDbroot Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** removeDbroot Failed, Failed return from getSystemStatus API" << endl;
|
|
break;
|
|
}
|
|
|
|
systemStorageInfo_t t;
|
|
try
|
|
{
|
|
t = oam.getStorageConfig();
|
|
}
|
|
catch(...) {}
|
|
|
|
string dbrootIDs = arguments[1];
|
|
|
|
DBRootConfigList dbrootlist;
|
|
|
|
bool assign = false;
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
//check if dbroot is assigned to a pm
|
|
DeviceDBRootList moduledbrootlist = boost::get<2>(t);
|
|
|
|
DeviceDBRootList::iterator pt = moduledbrootlist.begin();
|
|
for( ; pt != moduledbrootlist.end() ; pt++)
|
|
{
|
|
DBRootConfigList::iterator pt1 = (*pt).dbrootConfigList.begin();
|
|
for( ; pt1 != (*pt).dbrootConfigList.end() ; pt1++)
|
|
{
|
|
if ( atoi((*it).c_str()) == *pt1 ) {
|
|
cout << endl << "**** removeDbroot Failed, dbroot " << *it << " is assigned to a module, unassign first before removing" << endl;
|
|
assign = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (assign)
|
|
break;
|
|
|
|
dbrootlist.push_back(atoi((*it).c_str()));
|
|
}
|
|
|
|
if (assign)
|
|
break;
|
|
|
|
cout << endl;
|
|
|
|
try
|
|
{
|
|
oam.removeDbroot(dbrootlist);
|
|
|
|
cout << endl << " Successful Removal of DBRoots " << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** removeDbroot Failed: " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 16: // stopSystem - parameters: graceful flag, Ack flag
|
|
{
|
|
BRM::DBRM dbrm;
|
|
bool bDBRMReady = dbrm.isDBRMReady();
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
if ( gracefulTemp == INSTALL )
|
|
{
|
|
cout << endl << "Invalid Parameter, INSTALL option not supported. Please use shutdownSystem Command" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "This command stops the processing of applications on all Modules within the MariaDB ColumnStore System" << endl;
|
|
|
|
try
|
|
{
|
|
cout << endl << " Checking for active transactions" << endl;
|
|
|
|
if (gracefulTemp != GRACEFUL ||
|
|
!bDBRMReady ||
|
|
dbrm.isReadWrite())
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
|
|
if (suspendAnswer == CANCEL) // We don't have an answer from the command line or some other state.
|
|
{
|
|
// If there are bulkloads, ddl or dml happening, Ask what to do.
|
|
bool bIsDbrmUp = true;
|
|
execplan::SessionManager sessionManager;
|
|
BRM::SIDTIDEntry blockingsid;
|
|
std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
|
|
bool bActiveTransactions = false;
|
|
if (!tableLocks.empty())
|
|
{
|
|
oam.DisplayLockedTables(tableLocks, &dbrm);
|
|
bActiveTransactions = true;
|
|
}
|
|
if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
|
|
{
|
|
cout << endl << "There are active transactions being processed" << endl;
|
|
bActiveTransactions = true;
|
|
}
|
|
|
|
if (bActiveTransactions)
|
|
{
|
|
suspendAnswer = AskSuspendQuestion(CmdID);
|
|
// if (suspendAnswer == FORCE)
|
|
// {
|
|
// if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
|
|
// {
|
|
// break;
|
|
// }
|
|
// }
|
|
bNeedsConfirm = false;
|
|
}
|
|
else
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
}
|
|
if (suspendAnswer == CANCEL)
|
|
{
|
|
// We're outa here.
|
|
break;
|
|
}
|
|
|
|
if (bNeedsConfirm)
|
|
{
|
|
if (confirmPrompt(""))
|
|
break;
|
|
}
|
|
|
|
switch (suspendAnswer)
|
|
{
|
|
case WAIT:
|
|
cout << endl << " Waiting for all transactions to complete" << flush;
|
|
dbrm.setSystemShutdownPending(true, false, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case ROLLBACK:
|
|
cout << endl << " Rollback of all transactions" << flush;
|
|
dbrm.setSystemShutdownPending(true, true, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case FORCE:
|
|
cout << endl << " System being stopped now..." << flush;
|
|
if (bDBRMReady)
|
|
{
|
|
dbrm.setSystemShutdownPending(true, false, true);
|
|
}
|
|
break;
|
|
case CANCEL:
|
|
break;
|
|
}
|
|
|
|
oam.stopSystem(gracefulTemp, ackTemp);
|
|
|
|
if ( waitForStop() )
|
|
cout << endl << " Successful stop of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** stopSystem Failed : check log files" << endl;
|
|
|
|
checkForDisabledModules();
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
string Failed = e.what();
|
|
|
|
if (Failed.find("Connection refused") != string::npos)
|
|
{
|
|
cout << endl << "**** stopSystem Failure : ProcessManager not Active" << endl;
|
|
cout << "Retry or Run 'shutdownSystem FORCEFUL' command" << endl << endl;
|
|
}
|
|
else
|
|
{
|
|
cout << endl << "**** stopSystem Failure : " << e.what() << endl;
|
|
cout << "Retry or Run 'shutdownSystem FORCEFUL' command" << endl << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 17: // shutdownSystem - parameters: graceful flag, Ack flag, suspendAnswer
|
|
{
|
|
BRM::DBRM dbrm;
|
|
bool bDBRMReady = dbrm.isDBRMReady();
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
cout << endl << "This command stops the processing of applications on all Modules within the MariaDB ColumnStore System" << endl;
|
|
|
|
try
|
|
{
|
|
cout << endl << " Checking for active transactions" << endl;
|
|
|
|
if (gracefulTemp != GRACEFUL ||
|
|
!bDBRMReady ||
|
|
dbrm.isReadWrite())
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
|
|
if (suspendAnswer == CANCEL) // We don't have an answer from the command line.
|
|
{
|
|
// If there are bulkloads, ddl or dml happening, Ask what to do.
|
|
bool bIsDbrmUp = true;
|
|
execplan::SessionManager sessionManager;
|
|
BRM::SIDTIDEntry blockingsid;
|
|
std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
|
|
bool bActiveTransactions = false;
|
|
if (!tableLocks.empty())
|
|
{
|
|
oam.DisplayLockedTables(tableLocks, &dbrm);
|
|
bActiveTransactions = true;
|
|
}
|
|
if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
|
|
{
|
|
cout << endl << " There are active transactions being processed" << endl;
|
|
bActiveTransactions = true;
|
|
}
|
|
|
|
if (bActiveTransactions)
|
|
{
|
|
suspendAnswer = AskSuspendQuestion(CmdID);
|
|
bNeedsConfirm = false;
|
|
}
|
|
else
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
}
|
|
if (suspendAnswer == CANCEL)
|
|
{
|
|
// We're outa here.
|
|
break;
|
|
}
|
|
|
|
if (bNeedsConfirm)
|
|
{
|
|
if (confirmPrompt(""))
|
|
break;
|
|
}
|
|
|
|
switch (suspendAnswer)
|
|
{
|
|
case WAIT:
|
|
cout << endl << " Waiting for all transactions to complete" << flush;
|
|
dbrm.setSystemShutdownPending(true, false, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case ROLLBACK:
|
|
cout << endl << " Rollback of all transactions" << flush;
|
|
dbrm.setSystemShutdownPending(true, true, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case FORCE:
|
|
cout << endl << " Stopping System..." << flush;
|
|
if (bDBRMReady)
|
|
{
|
|
dbrm.setSystemShutdownPending(true, false, true);
|
|
}
|
|
break;
|
|
case CANCEL:
|
|
break;
|
|
}
|
|
|
|
// This won't return until the system is shutdown. It might take a while to finish what we're working on first.
|
|
|
|
oam.stopSystem(gracefulTemp, ackTemp);
|
|
|
|
if ( waitForStop() )
|
|
cout << endl << " Successful stop of System " << endl;
|
|
else
|
|
cout << endl << "**** stopSystem Failed : check log files" << endl;
|
|
|
|
cout << endl << " Shutting Down System..." << flush;
|
|
|
|
oam.shutdownSystem(gracefulTemp, ackTemp);
|
|
|
|
//hdfs / hadoop config
|
|
string DBRootStorageType;
|
|
try {
|
|
oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DBRootStorageType == "hdfs")
|
|
{
|
|
cmd = "pdsh -a '/" + startup::StartUp::installDir() + "/bin/columnstore stop' > /tmp/cc-stop.pdsh 2>&1";
|
|
system(cmd.c_str());
|
|
if (oam.checkLogStatus("/tmp/cc-stop.pdsh", "exit") ) {
|
|
cout << endl << "ERROR: Stopping MariaDB ColumnStore Service failure, check /tmp/cc-stop.pdsh. exit..." << endl;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/status.log";
|
|
system(cmd.c_str());
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
string Failed = e.what();
|
|
|
|
if ( gracefulTemp == FORCEFUL )
|
|
{
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/status.log";
|
|
system(cmd.c_str());
|
|
cout << endl << " Successful shutdown of System (stopped local columnstore service) " << endl << endl;
|
|
}
|
|
|
|
if (Failed.find("Connection refused") != string::npos)
|
|
{
|
|
cout << endl << "**** shutdownSystem Error : ProcessManager not Active, stopping columnstore service" << endl;
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/status.log";
|
|
system(cmd.c_str());
|
|
cout << endl << " Successful stop of local columnstore service " << endl << endl;
|
|
}
|
|
else
|
|
{
|
|
cout << endl << "**** shutdownSystem Failure : " << e.what() << endl;
|
|
cout << " Retry running command using FORCEFUL option" << endl << endl;
|
|
}
|
|
|
|
//hdfs / hadoop config
|
|
string DBRootStorageType;
|
|
try {
|
|
oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DBRootStorageType == "hdfs")
|
|
{
|
|
cmd = "pdsh -a '" + startup::StartUp::installDir() + "/bin/columnstore stop' > /tmp/cc-stop.pdsh 2>&1";
|
|
system(cmd.c_str());
|
|
if (oam.checkLogStatus("/tmp/cc-stop.pdsh", "exit") ) {
|
|
cout << endl << "ERROR: Stopping MariaDB ColumnStore Service failure, check /tmp/cc-stop.pdsh. exit..." << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//this is here because a customer likes doing a shutdownsystem then startsystem in a script
|
|
sleep(5);
|
|
}
|
|
break;
|
|
|
|
case 18: // startSystem - parameters: Ack flag
|
|
{
|
|
// startSystem Command
|
|
|
|
//don't start if a disable module has a dbroot assigned to it
|
|
if (!checkForDisabledModules()) {
|
|
cout << endl << "Error: startSystem command can't be performed: disabled module has a dbroot assigned to it" << endl;
|
|
break;
|
|
}
|
|
|
|
// if columnstore service is down, then start system by starting all of the columnstore services
|
|
// this would be used after a shutdownSystem command
|
|
// if columnstore service is up, send message to ProcMgr to start system (which starts all processes)
|
|
|
|
if (!oam.checkSystemRunning())
|
|
{
|
|
cout << "startSystem command, 'columnstore' service is down, sending command to" << endl;
|
|
cout << "start the 'columnstore' service on all modules" << endl << endl;
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
ModuleConfig moduleconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
int systemModuleNumber = 0;
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
systemModuleNumber = systemModuleNumber + systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startSystem Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
if ( systemModuleNumber > 1 )
|
|
{
|
|
if (arguments[1] != "")
|
|
password = arguments[1];
|
|
else
|
|
password = "ssh";
|
|
|
|
//
|
|
// perform start of columnstore of other servers in the system
|
|
//
|
|
|
|
DeviceNetworkList::iterator pt;
|
|
string modulename;
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
|
|
++pt)
|
|
{
|
|
modulename = (*pt).DeviceName;
|
|
if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
|
|
(*pt).DisableState == oam::AUTODISABLEDSTATE )
|
|
{
|
|
cout << " Module '" << modulename << "' is disabled and will not be started" << endl;
|
|
}
|
|
}
|
|
}
|
|
cout << endl << " System being started, please wait...";
|
|
cout.flush();
|
|
bool FAILED = false;
|
|
|
|
//hdfs / hadoop config
|
|
string DBRootStorageType;
|
|
try {
|
|
oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DBRootStorageType == "hdfs")
|
|
{
|
|
cmd = "pdsh -a '" + startup::StartUp::installDir() + "/bin/columnstore restart' > /tmp/cc-restart.pdsh 2>&1";
|
|
system(cmd.c_str());
|
|
if (oam.checkLogStatus("/tmp/cc-restart.pdsh", "exit") ) {
|
|
cout << endl << "ERROR: Restart MariaDB ColumnStore Service failure, check /tmp/cc-restart.pdsh. exit..." << endl;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if ( moduleCount == 0 )
|
|
// skip if no modules
|
|
continue;
|
|
|
|
for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
|
|
++pt)
|
|
{
|
|
modulename = (*pt).DeviceName;
|
|
|
|
if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
|
|
(*pt).DisableState == oam::AUTODISABLEDSTATE )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( modulename == localModule )
|
|
{
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore restart > /tmp/start.log 2>&1";
|
|
int rtnCode = system(cmd.c_str());
|
|
if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0)
|
|
{
|
|
cout << endl << "error with running 'columnstore restart' on local module " << endl;
|
|
cout << endl << "**** startSystem Failed" << endl;
|
|
break;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
//run remote command script
|
|
cmd = startup::StartUp::installDir() + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " '" + startup::StartUp::installDir() + "/bin/columnstore restart' 0";
|
|
int rtnCode = system(cmd.c_str());
|
|
if (WEXITSTATUS(rtnCode) < 0) {
|
|
cout << endl << "error with running 'columnstore start' on module " + modulename << endl;
|
|
cout << endl << "**** startSystem Failed" << endl;
|
|
|
|
// stop local columnstore service
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/stop.log 2>&1";
|
|
system(cmd.c_str());
|
|
|
|
FAILED = true;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (rtnCode > 0) {
|
|
cout << endl << "Invalid Password when running 'columnstore start' on module " + modulename << ", can retry by providing password as the second argument" << endl;
|
|
cout << endl << "**** startSystem Failed" << endl;
|
|
|
|
// stop local columnstore service
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/stop.log 2>&1";
|
|
system(cmd.c_str());
|
|
|
|
FAILED = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (FAILED)
|
|
break;
|
|
}
|
|
}
|
|
if (FAILED)
|
|
break;
|
|
}
|
|
|
|
if (FAILED)
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
//just kick off local server
|
|
cout << endl << " System being started, please wait...";
|
|
cout.flush();
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore restart > /tmp/start.log 2>&1";
|
|
int rtnCode = system(cmd.c_str());
|
|
if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0) {
|
|
cout << endl << "error with running 'columnstore restart' on local module " << endl;
|
|
cout << endl << "**** startSystem Failed" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( waitForActive() )
|
|
cout << endl << " Successful start of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** startSystem Failed : check log files" << endl;
|
|
}
|
|
else
|
|
{
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
try
|
|
{
|
|
cout << endl << " System being started, please wait...";
|
|
cout.flush();
|
|
oam.startSystem(ackTemp);
|
|
if ( waitForActive() )
|
|
cout << endl << " Successful start of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** startSystem Failed : check log files" << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startSystem Failed : " << e.what() << endl;
|
|
string Failed = e.what();
|
|
if (Failed.find("Database Test Error") != string::npos)
|
|
cout << "Database Test Error occurred, check Alarm and Logs for addition Information" << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 19: // restartSystem - parameters: graceful flag, Ack flag
|
|
{
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm, &password);
|
|
|
|
//don't start if a disable module has a dbroot assigned to it
|
|
if (!checkForDisabledModules()) {
|
|
cout << endl << "Error: restartSystem command can't be performed: disabled module has a dbroot assigned to it" << endl;
|
|
break;
|
|
}
|
|
|
|
// if columnstore service is down, then start system by starting all of the columnstore services
|
|
// this would be used after a shutdownSystem command
|
|
// if columnstore service is up, send message to ProcMgr to start system (which starts all processes)
|
|
|
|
if (!oam.checkSystemRunning())
|
|
{
|
|
if (bNeedsConfirm)
|
|
{
|
|
if (confirmPrompt("")) // returns true if user wants to quit.
|
|
break;
|
|
}
|
|
cout << "restartSystem command, 'columnstore' service is down, sending command to" << endl;
|
|
cout << "start the 'columnstore' service on all modules" << endl << endl;
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
ModuleConfig moduleconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
int systemModuleNumber = 0;
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
systemModuleNumber = systemModuleNumber + systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartSystem Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
if ( systemModuleNumber > 1 )
|
|
{
|
|
if (password.empty())
|
|
password = "ssh";
|
|
|
|
//
|
|
// perform start of columnstore of other servers in the system
|
|
//
|
|
|
|
DeviceNetworkList::iterator pt;
|
|
string modulename;
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
|
|
++pt)
|
|
{
|
|
modulename = (*pt).DeviceName;
|
|
if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
|
|
(*pt).DisableState == oam::AUTODISABLEDSTATE )
|
|
{
|
|
cout << " Module '" << modulename << "' is disabled and will not be started" << endl;
|
|
}
|
|
}
|
|
}
|
|
cout << endl << " System being started, please wait...";
|
|
cout.flush();
|
|
bool FAILED = false;
|
|
|
|
//hdfs / hadoop config
|
|
string DBRootStorageType;
|
|
try {
|
|
oam.getSystemConfig( "DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DBRootStorageType == "hdfs")
|
|
{
|
|
cmd = "pdsh -a '" + startup::StartUp::installDir() + "/bin/columnstore restart' > /tmp/cc-restart.pdsh 2>&1";
|
|
system(cmd.c_str());
|
|
if (oam.checkLogStatus("/tmp/cc-restart.pdsh", "exit") ) {
|
|
cout << endl << "ERROR: Restart MariaDB ColumnStore Service failue, check /tmp/cc-restart.pdsh. exit..." << endl;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if ( moduleCount == 0 )
|
|
// skip if no modules
|
|
continue;
|
|
|
|
for (pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end();
|
|
++pt)
|
|
{
|
|
modulename = (*pt).DeviceName;
|
|
|
|
if ( (*pt).DisableState == oam::MANDISABLEDSTATE ||
|
|
(*pt).DisableState == oam::AUTODISABLEDSTATE )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( modulename == localModule )
|
|
continue; // do last
|
|
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
//run remote command script
|
|
cmd = startup::StartUp::installDir() + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " '" + startup::StartUp::installDir() + "/bin/columnstore restart' 0";
|
|
|
|
int rtnCode = system(cmd.c_str());
|
|
if (WEXITSTATUS(rtnCode) < 0) {
|
|
cout << endl << "error with running 'columnstore start' on module " + modulename << endl;
|
|
cout << endl << "**** restartSystem Failed" << endl;
|
|
|
|
// stop local columnstore service
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/stop.log 2>&1";
|
|
system(cmd.c_str());
|
|
|
|
FAILED = true;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (rtnCode > 0) {
|
|
cout << endl << "Invalid Password when running 'columnstore start' on module " + modulename << ", can retry by providing password as the second argument" << endl;
|
|
cout << endl << "**** restartSystem Failed" << endl;
|
|
FAILED = true;
|
|
|
|
// stop local columnstore service
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore stop > /tmp/stop.log 2>&1";
|
|
system(cmd.c_str());
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (FAILED)
|
|
break;
|
|
}
|
|
if (FAILED)
|
|
break;
|
|
|
|
//RESTART LOCAL HOST
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore restart > /tmp/start.log 2>&1";
|
|
int rtnCode = system(cmd.c_str());
|
|
if (geteuid() == 0 && WEXITSTATUS(rtnCode) != 0)
|
|
{
|
|
cout << endl << "error with running 'columnstore restart' on local module " << endl;
|
|
cout << endl << "**** restartSystem Failed" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (FAILED)
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//just kick off local server
|
|
cout << " System being restarted, please wait...";
|
|
cout.flush();
|
|
cmd = startup::StartUp::installDir() + "/bin/columnstore restart > /tmp/start.log 2>&1";
|
|
int rtnCode = system(cmd.c_str());
|
|
if (WEXITSTATUS(rtnCode) != 0) {
|
|
cout << endl << "error with running 'columnstore start' on local module " << endl;
|
|
cout << endl << "**** restartSystem Failed" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( waitForActive() )
|
|
cout << endl << " Successful restart of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** restartSystem Failed : check log files" << endl;
|
|
}
|
|
else
|
|
{
|
|
BRM::DBRM dbrm;
|
|
bool bDBRMReady = dbrm.isDBRMReady();
|
|
|
|
try
|
|
{
|
|
if (gracefulTemp != GRACEFUL ||
|
|
!bDBRMReady ||
|
|
dbrm.isReadWrite())
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
|
|
if (suspendAnswer == CANCEL) // We don't have an answer from the command line.
|
|
{
|
|
// If there are bulkloads, ddl or dml happening, Ask what to do.
|
|
bool bIsDbrmUp = true;
|
|
execplan::SessionManager sessionManager;
|
|
BRM::SIDTIDEntry blockingsid;
|
|
std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
|
|
bool bActiveTransactions = false;
|
|
if (!tableLocks.empty())
|
|
{
|
|
oam.DisplayLockedTables(tableLocks, &dbrm);
|
|
bActiveTransactions = true;
|
|
}
|
|
if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
|
|
{
|
|
cout << endl << "There are active transactions being processed" << endl;
|
|
bActiveTransactions = true;
|
|
}
|
|
|
|
if (bActiveTransactions)
|
|
{
|
|
suspendAnswer = AskSuspendQuestion(CmdID);
|
|
// if (suspendAnswer == FORCE)
|
|
// {
|
|
// if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
|
|
// {
|
|
// break;
|
|
// }
|
|
// }
|
|
bNeedsConfirm = false;
|
|
}
|
|
else
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
}
|
|
if (suspendAnswer == CANCEL)
|
|
{
|
|
// We're outa here.
|
|
break;
|
|
}
|
|
if (bNeedsConfirm)
|
|
{
|
|
if (confirmPrompt(""))
|
|
break;
|
|
}
|
|
switch (suspendAnswer)
|
|
{
|
|
case WAIT:
|
|
cout << endl << " Waiting for all transactions to complete" << flush;
|
|
dbrm.setSystemShutdownPending(true, false, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case ROLLBACK:
|
|
cout << endl << " Rollback of all transactions" << flush;
|
|
dbrm.setSystemShutdownPending(true, true, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case FORCE:
|
|
cout << endl << " System being restarted now ..." << flush;
|
|
if (bDBRMReady)
|
|
{
|
|
dbrm.setSystemShutdownPending(true, false, true);
|
|
}
|
|
break;
|
|
case CANCEL:
|
|
break;
|
|
}
|
|
|
|
int returnStatus = oam.restartSystem(gracefulTemp, ackTemp);
|
|
switch (returnStatus)
|
|
{
|
|
case API_SUCCESS:
|
|
if ( waitForActive() )
|
|
cout << endl << " Successful restart of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** restartSystem Failed : check log files" << endl;
|
|
break;
|
|
case API_CANCELLED:
|
|
cout << endl << " Restart of System canceled" << endl << endl;
|
|
break;
|
|
default:
|
|
cout << endl << "**** restartSystem Failed : Check system logs" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartSystem Failed : " << e.what() << endl;
|
|
string Failed = e.what();
|
|
if (Failed.find("Database Test Error") != string::npos)
|
|
cout << "Database Test Error occurred, check Alarm and Logs for additional Information" << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 20: // getSystemStatus - parameters: NONE
|
|
{
|
|
try {
|
|
printSystemStatus();
|
|
}
|
|
catch (...)
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case 21: // getProcessStatus - parameters: NONE
|
|
{
|
|
try {
|
|
printProcessStatus();
|
|
}
|
|
catch (...)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 22: // system - UNIX system command
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** system Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
for(int j=2; j < ArgNum; j++)
|
|
{
|
|
arguments[1].append(" ");
|
|
arguments[1].append(arguments[j]);
|
|
}
|
|
|
|
system (arguments[1].c_str());
|
|
}
|
|
break;
|
|
|
|
case 23: // getAlarmHistory
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** getAlarmHistory Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( arguments[1].size() != 8 ) {
|
|
cout << "date not in correct format, enter MM/DD/YY" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( !(arguments[1].substr(2,1) == "/" && arguments[1].substr(5,1) == "/") ) {
|
|
cout << "date not in correct format, enter MM/DD/YY" << endl;
|
|
break;
|
|
}
|
|
|
|
AlarmList alarmList;
|
|
try {
|
|
oam.getAlarms(arguments[1], alarmList);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getAlarms Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Historical Alarm List for " + arguments[1] + " :" << endl << endl;
|
|
|
|
AlarmList :: iterator i;
|
|
int counter = 0;
|
|
for (i = alarmList.begin(); i != alarmList.end(); ++i)
|
|
{
|
|
switch (i->second.getState())
|
|
{
|
|
case SET:
|
|
cout << "SET" << endl;
|
|
break;
|
|
case CLEAR:
|
|
cout << "CLEAR" << endl;
|
|
break;
|
|
}
|
|
cout << "AlarmID = " << i->second.getAlarmID() << endl;
|
|
cout << "Brief Description = " << i->second.getDesc() << endl;
|
|
cout << "Alarm Severity = ";
|
|
switch (i->second.getSeverity())
|
|
{
|
|
case CRITICAL:
|
|
cout << "CRITICAL" << endl;
|
|
break;
|
|
case MAJOR:
|
|
cout << "MAJOR" << endl;
|
|
break;
|
|
case MINOR:
|
|
cout << "MINOR" << endl;
|
|
break;
|
|
case WARNING:
|
|
cout << "WARNING" << endl;
|
|
break;
|
|
case INFORMATIONAL:
|
|
cout << "INFORMATIONAL" << endl;
|
|
break;
|
|
}
|
|
cout << "Time Issued = " << i->second.getTimestamp() << endl;
|
|
cout << "Reporting Module = " << i->second.getSname() << endl;
|
|
cout << "Reporting Process = " << i->second.getPname() << endl;
|
|
cout << "Reported Device = " << i->second.getComponentID() << endl << endl;
|
|
|
|
counter++;
|
|
if ( counter > 4 ) {
|
|
// continue prompt
|
|
if (confirmPrompt("Displaying Alarm History"))
|
|
break;
|
|
counter=0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 24: // monitorAlarms
|
|
{
|
|
cout << endl << "Monitor for System Alarms" << endl;
|
|
cout << " Enter control-C to return to command line" << endl << endl;
|
|
|
|
cmd = "tail -n 0 -f " + alarmmanager::ALARM_FILE;
|
|
system(cmd.c_str());
|
|
}
|
|
break;
|
|
|
|
case 25: // resetAlarm
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 3 arguments
|
|
cout << endl << "**** resetAlarm Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
try
|
|
{
|
|
// check if requested alarm is Active
|
|
AlarmList alarmList;
|
|
Oam oam;
|
|
try {
|
|
oam.getActiveAlarms(alarmList);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getActiveAlarm Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
bool found = false;
|
|
AlarmList::iterator i;
|
|
for (i = alarmList.begin(); i != alarmList.end(); ++i)
|
|
{
|
|
// check if matching ID
|
|
if ( arguments[1] != "ALL" ) {
|
|
if (atoi(arguments[1].c_str()) != (i->second).getAlarmID() )
|
|
continue;
|
|
|
|
if ( arguments[2] != "ALL") {
|
|
if (arguments[2].compare((i->second).getSname()) != 0)
|
|
continue;
|
|
|
|
if ( arguments[3] != "ALL") {
|
|
if (arguments[3].compare((i->second).getComponentID()) != 0 )
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
ALARMManager aManager;
|
|
aManager.sendAlarmReport((i->second).getComponentID().c_str(),
|
|
(i->second).getAlarmID(),
|
|
CLEAR,
|
|
(i->second).getSname(),
|
|
"mcsadmin");
|
|
|
|
cout << endl << " Alarm Successfully Reset: ";
|
|
cout << "ID = " << oam.itoa((i->second).getAlarmID());
|
|
cout << " / Module = " << (i->second).getSname();
|
|
cout << " / Device = " << (i->second).getComponentID() << endl;
|
|
found = true;
|
|
}
|
|
// check is a SET alarm was found, if not return
|
|
if (!found)
|
|
{
|
|
cout << endl << "**** resetAlarm Failed : Requested Alarm is not Set" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** resetAlarm Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 26: // enableLog
|
|
{
|
|
if (arguments[2] == "")
|
|
{
|
|
// need 2 arguments
|
|
cout << endl << "**** Failed : enableLog Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
// covert second argument (level) into lowercase
|
|
transform (arguments[2].begin(), arguments[2].end(), arguments[2].begin(), to_lower());
|
|
|
|
try
|
|
{
|
|
oam.updateLog(ENABLEDSTATE, arguments[1], arguments[2]);
|
|
cout << endl << " Successful Enabling of Logging " << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** enableLog Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 27: // disableLog
|
|
{
|
|
if (arguments[2] == "")
|
|
{
|
|
// need 2 arguments
|
|
cout << endl << "**** disableLog Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
// covert second argument (level) into lowercase
|
|
transform (arguments[2].begin(), arguments[2].end(), arguments[2].begin(), to_lower());
|
|
|
|
try
|
|
{
|
|
oam.updateLog(MANDISABLEDSTATE, arguments[1], arguments[2]);
|
|
cout << endl << " Successful Disabling of Logging " << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** disableLog Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 28: // switchParentOAMModule
|
|
{
|
|
BRM::DBRM dbrm;
|
|
bool bDBRMReady = dbrm.isDBRMReady();
|
|
string module;
|
|
bool bUseHotStandby = true;
|
|
SystemStatus systemstatus;
|
|
Oam oam;
|
|
|
|
//first check that the system is in a ACTIVE OR MAN_OFFLINE STATE
|
|
try
|
|
{
|
|
oam.getSystemStatus(systemstatus);
|
|
if (systemstatus.SystemOpState == ACTIVE ||
|
|
systemstatus.SystemOpState == MAN_OFFLINE)
|
|
{
|
|
module = "";
|
|
}
|
|
else
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : System Status needs to be ACTIVE or MAN_OFFLINE" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
// First get the values for the standard arguments
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
// Now check for arguments unique to this command. In this case, a valid
|
|
// module name.
|
|
for (int i = 1; i < ArgNum; i++)
|
|
{
|
|
if (arguments[i].size() > 0)
|
|
{
|
|
if (oam.validateModule(arguments[i]) == API_SUCCESS)
|
|
{
|
|
module = arguments[i];
|
|
bUseHotStandby = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//check if there are more than 1 pm modules to start with
|
|
ModuleTypeConfig moduletypeconfig;
|
|
oam.getSystemConfig("pm", moduletypeconfig);
|
|
if ( moduletypeconfig.ModuleCount < 2 )
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : Command only support on systems with Multiple Performance Modules" << endl;
|
|
// break;
|
|
}
|
|
|
|
string DBRootStorageType;
|
|
try
|
|
{
|
|
oam.getSystemConfig("DBRootStorageType", DBRootStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
string DataRedundancyConfig = "n";
|
|
try
|
|
{
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if (DBRootStorageType == "internal" && DataRedundancyConfig == "n")
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : DBRoot Storage type = internal/non-data-replication" << endl;
|
|
break;
|
|
}
|
|
|
|
string ParentOAMModuleName;
|
|
try
|
|
{
|
|
oam.getSystemConfig("ParentOAMModuleName", ParentOAMModuleName);
|
|
}
|
|
catch(...) {}
|
|
|
|
if (bUseHotStandby)
|
|
{
|
|
oam.getSystemConfig("StandbyOAMModuleName", module);
|
|
if ( module.empty() || module == oam::UnassignedName )
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : There's no hot standby defined" << endl << " enter a Performance Module" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Switching to the Hot-Standby Parent OAM Module '" << module << "'" << endl;
|
|
}
|
|
else
|
|
{
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( module == parentOAMModule )
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << module << " is already the Active Parent OAM Module" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Switching to the Performance Module '" << module << "'" << endl;
|
|
}
|
|
|
|
//check for gluster system is do-able
|
|
if (DataRedundancyConfig == "y")
|
|
{
|
|
// get to-module assigned DBRoots and see if current active PM
|
|
// has a copy
|
|
|
|
DBRootConfigList toPMbrootConfigList;
|
|
|
|
try
|
|
{
|
|
string moduleID = module.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
oam.getPmDbrootConfig(atoi(moduleID.c_str()), toPMbrootConfigList);
|
|
|
|
bool match = false;
|
|
DBRootConfigList::iterator pt = toPMbrootConfigList.begin();
|
|
for( ; pt != toPMbrootConfigList.end() ; pt++)
|
|
{
|
|
// check if ACTIVE PM has a copy of Dbroot
|
|
string pmList = "";
|
|
try {
|
|
string errmsg;
|
|
int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*pt), pmList, errmsg);
|
|
if ( ret != 0 )
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
|
|
it1 != tokens.end();
|
|
++it1)
|
|
{
|
|
string pmModule = "pm" + *it1;
|
|
if ( pmModule == ParentOAMModuleName ) {
|
|
match = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!match) {
|
|
cout << endl << "**** switchParentOAMModule Failed : The Current Active PM doesn't have a copy of any DBROOTs that reside on the Siwtching PM " << endl;
|
|
break;
|
|
}
|
|
|
|
//check if switching to PM has DBROOT 1
|
|
string pmList = "";
|
|
try {
|
|
string errmsg;
|
|
int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, "1", pmList, errmsg);
|
|
if ( ret != 0 )
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << module << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
|
|
match = false;
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
|
|
it1 != tokens.end();
|
|
++it1)
|
|
{
|
|
string pmModule = "pm" + *it1;
|
|
if ( pmModule == module ) {
|
|
match = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!match) {
|
|
cout << endl << "**** switchParentOAMModule Failed : The Switching to PM doesn't have a copy of the DBROOT #1" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed for '" << module << "' : " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if (bNeedsConfirm)
|
|
{
|
|
// confirm request
|
|
if (confirmPrompt("This command switches the Active Parent OAM Module and should only be executed on an idle system."))
|
|
break;
|
|
}
|
|
|
|
string MySQLRep;
|
|
try {
|
|
oam.getSystemConfig("MySQLRep", MySQLRep);
|
|
}
|
|
catch(...) {}
|
|
|
|
try
|
|
{
|
|
cout << endl << " Check for active transactions" << endl;
|
|
|
|
if (!bDBRMReady ||
|
|
dbrm.isReadWrite() != 0)
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
|
|
if (suspendAnswer == CANCEL) // We don't have an answer from the command line.
|
|
{
|
|
// If there are bulkloads, ddl or dml happening, Ask what to do.
|
|
bool bIsDbrmUp = true;
|
|
execplan::SessionManager sessionManager;
|
|
BRM::SIDTIDEntry blockingsid;
|
|
std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
|
|
bool bActiveTransactions = false;
|
|
if (!tableLocks.empty())
|
|
{
|
|
oam.DisplayLockedTables(tableLocks, &dbrm);
|
|
bActiveTransactions = true;
|
|
}
|
|
if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
|
|
{
|
|
cout << endl << "There are active transactions being processed" << endl;
|
|
bActiveTransactions = true;
|
|
}
|
|
|
|
if (bActiveTransactions)
|
|
{
|
|
suspendAnswer = AskSuspendQuestion(CmdID);
|
|
// if (suspendAnswer == FORCE)
|
|
// {
|
|
// if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
|
|
// {
|
|
// break;
|
|
// }
|
|
// }
|
|
}
|
|
else
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
}
|
|
if (suspendAnswer == CANCEL)
|
|
{
|
|
// We're outa here.
|
|
break;
|
|
}
|
|
switch (suspendAnswer)
|
|
{
|
|
case WAIT:
|
|
cout << endl << " Waiting for all transactions to complete" << flush;
|
|
dbrm.setSystemShutdownPending(true, false, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case ROLLBACK:
|
|
cout << endl << " Rollback of all transactions" << flush;
|
|
dbrm.setSystemShutdownPending(true, true, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case FORCE:
|
|
cout << endl << " Switch Active Parent OAM Module starting..." << endl;
|
|
if (bDBRMReady)
|
|
{
|
|
dbrm.setSystemShutdownPending(true, false, true);
|
|
}
|
|
break;
|
|
case CANCEL:
|
|
break;
|
|
}
|
|
|
|
if (oam.switchParentOAMModule(module, gracefulTemp))
|
|
{
|
|
if (waitForActive()) {
|
|
// give time for new ProcMgr to go active
|
|
sleep (10);
|
|
cout << endl << " Successful Switch Active Parent OAM Module" << endl << endl;
|
|
}
|
|
else
|
|
cout << endl << "**** Switch Active Parent OAM Module failed : check log files" << endl;
|
|
}
|
|
else
|
|
{
|
|
// give time for new ProcMgr to go active
|
|
sleep (10);
|
|
cout << endl << " Successful Switch Active Parent OAM Module" << endl << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** switchParentOAMModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 29: // getStorageStatus
|
|
{
|
|
SystemStatus systemstatus;
|
|
Oam oam;
|
|
|
|
cout << "System External DBRoot Storage Statuses" << endl << endl;
|
|
cout << "Component Status Last Status Change" << endl;
|
|
cout << "------------ -------------------------- ------------------------" << endl;
|
|
|
|
try
|
|
{
|
|
oam.getSystemStatus(systemstatus, false);
|
|
|
|
if ( systemstatus.systemdbrootstatus.dbrootstatus.size() == 0 )
|
|
{
|
|
cout << " No External DBRoot Storage Configured" << endl;
|
|
break;
|
|
}
|
|
|
|
for( unsigned int i = 0 ; i < systemstatus.systemdbrootstatus.dbrootstatus.size(); i++)
|
|
{
|
|
if( systemstatus.systemdbrootstatus.dbrootstatus[i].Name.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
cout << "DBRoot #";
|
|
cout.setf(ios::left);
|
|
cout.width(6);
|
|
cout << systemstatus.systemdbrootstatus.dbrootstatus[i].Name;
|
|
cout.width(29);
|
|
int state = systemstatus.systemdbrootstatus.dbrootstatus[i].OpState;
|
|
printState(state, " ");
|
|
cout.width(24);
|
|
string stime = systemstatus.systemdbrootstatus.dbrootstatus[i].StateChangeDate ;
|
|
stime = stime.substr (0,24);
|
|
cout << stime << endl;
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemStatus Failed = " << e.what() << endl;
|
|
}
|
|
|
|
string DataRedundancyConfig;
|
|
int DataRedundancyCopies;
|
|
string DataRedundancyStorageType;
|
|
try {
|
|
oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
|
|
oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
|
|
oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DataRedundancyConfig == "y" )
|
|
{
|
|
string arg1 = "";
|
|
string arg2 = "";
|
|
string errmsg = "";
|
|
int ret = oam.glusterctl(oam::GLUSTER_STATUS, arg1, arg2, errmsg);
|
|
if ( ret == 0 )
|
|
{
|
|
cout << arg2 << endl;
|
|
}
|
|
else
|
|
{
|
|
cerr << "FAILURE: Status check error: " + errmsg << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 30: // getLogConfig
|
|
{
|
|
try
|
|
{
|
|
SystemLogConfigData systemconfigdata;
|
|
LogConfigData logconfigdata;
|
|
|
|
oam.getLogConfig(systemconfigdata);
|
|
|
|
string configFileName;
|
|
oam.getSystemConfig("SystemLogConfigFile", configFileName);
|
|
|
|
cout << endl << "MariaDB ColumnStore System Log Configuration Data" << endl << endl;
|
|
|
|
cout << "System Logging Configuration File being used: " << configFileName << endl << endl;
|
|
|
|
cout << "Module Configured Log Levels" << endl;
|
|
cout << "------ ---------------------------------------" << endl;
|
|
|
|
SystemLogConfigData::iterator pt = systemconfigdata.begin();
|
|
for(; pt != systemconfigdata.end() ; pt++)
|
|
{
|
|
logconfigdata = *pt;
|
|
string module = logconfigdata.moduleName;
|
|
int data = logconfigdata.configData;
|
|
if ( data < API_MAX )
|
|
{
|
|
// failure API status returned
|
|
cout.setf(ios::left);
|
|
cout.width(10);
|
|
cout << logconfigdata.moduleName;
|
|
cout << "getLogConfig Failed - Error : " << data << endl;
|
|
}
|
|
else
|
|
{
|
|
cout.setf(ios::left);
|
|
cout.width(10);
|
|
cout << logconfigdata.moduleName;
|
|
|
|
data = data - API_MAX;
|
|
if( data == 0 )
|
|
// no level configured
|
|
cout << "None Configured" << endl;
|
|
else
|
|
{
|
|
if ( ((data & LEVEL_CRITICAL) ? 1 : 0) == 1 )
|
|
cout << "Critical ";
|
|
if ( ((data & LEVEL_ERROR) ? 1 : 0) == 1 )
|
|
cout << "Error ";
|
|
if ( ((data & LEVEL_WARNING) ? 1 : 0) == 1 )
|
|
cout << "Warning ";
|
|
if ( ((data & LEVEL_INFO) ? 1 : 0) == 1 )
|
|
cout << "Info ";
|
|
if ( ((data & LEVEL_DEBUG) ? 1 : 0) == 1 )
|
|
cout << "Debug ";
|
|
cout << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getLogConfig Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case 31: // movePmDbrootConfig parameters: pm-reside dbroot-list pm-to
|
|
{
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** movePmDbrootConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
//check the system status / service status and only allow command when System is MAN_OFFLINE
|
|
if (oam.checkSystemRunning())
|
|
{
|
|
SystemStatus systemstatus;
|
|
try {
|
|
oam.getSystemStatus(systemstatus);
|
|
|
|
if (systemstatus.SystemOpState != oam::MAN_OFFLINE ) {
|
|
cout << endl << "**** movePmDbrootConfig Failed, System has to be in a MAN_OFFLINE state, stop system first" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** movePmDbrootConfig Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** movePmDbrootConfig Failed, Failed return from getSystemStatus API" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (arguments[3] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** movePmDbrootConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
string residePM = arguments[1];
|
|
string dbrootIDs = arguments[2];
|
|
string toPM = arguments[3];
|
|
|
|
string residePMID = residePM.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);;
|
|
string toPMID = toPM.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);;
|
|
|
|
// check module status
|
|
try{
|
|
bool degraded;
|
|
int opState;
|
|
oam.getModuleStatus(toPM, opState, degraded);
|
|
|
|
if (opState == oam::AUTO_DISABLED ||
|
|
opState == oam::MAN_DISABLED)
|
|
{
|
|
cout << "**** movePmDbrootConfig Failed: " << toPM << " is DISABLED." << endl;
|
|
cout << "Run alterSystem-EnableModule to enable module" << endl;
|
|
break;
|
|
}
|
|
|
|
if (opState == oam::FAILED)
|
|
{
|
|
cout << "**** movePmDbrootConfig Failed: " << toPM << " is in a FAILED state." << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& ex)
|
|
{}
|
|
|
|
bool moveDBRoot1 = false;
|
|
bool found = false;
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
if (*it == "1" ) {
|
|
moveDBRoot1 = true;
|
|
break;
|
|
}
|
|
|
|
//if gluster, check if toPM is has a copy
|
|
string DataRedundancyConfig;
|
|
try {
|
|
oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( DataRedundancyConfig == "y" )
|
|
{
|
|
string pmList = "";
|
|
try {
|
|
string errmsg;
|
|
oam.glusterctl(oam::GLUSTER_WHOHAS, *it, pmList, errmsg);
|
|
}
|
|
catch (...)
|
|
{}
|
|
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
|
|
it1 != tokens.end();
|
|
++it1)
|
|
{
|
|
if ( *it1 == toPMID )
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found)
|
|
{
|
|
cout << endl << "**** movePmDbrootConfig Failed : Data Redundancy Configured, DBRoot #" << *it << " doesn't have a copy on " << toPM << endl;
|
|
cout << "Run getStorageConfig to get copy information" << endl << endl;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
found = true;
|
|
}
|
|
|
|
if (moveDBRoot1) {
|
|
cout << endl << "**** movePmDbrootConfig Failed : Can't move dbroot #1" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
if (!found)
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
if (residePM.find("pm") == string::npos ) {
|
|
cout << endl << "**** movePmDbrootConfig Failed : Parmameter 1 is not a Performance Module name, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
if (toPM.find("pm") == string::npos ) {
|
|
cout << endl << "**** movePmDbrootConfig Failed : Parmameter 3 is not a Performance Module name, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
if (residePM == toPM ) {
|
|
cout << endl << "**** movePmDbrootConfig Failed : Reside and To Performance Modules are the same" << endl;
|
|
break;
|
|
}
|
|
|
|
//get dbroots ids for reside PM
|
|
DBRootConfigList residedbrootConfigList;
|
|
|
|
try
|
|
{
|
|
oam.getPmDbrootConfig(atoi(residePMID.c_str()), residedbrootConfigList);
|
|
|
|
cout << endl << "DBRoot IDs currently assigned to '" + residePM + "' = ";
|
|
|
|
DBRootConfigList::iterator pt = residedbrootConfigList.begin();
|
|
for( ; pt != residedbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != residedbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed for '" << residePM << "' : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
//get dbroots ids for reside PM
|
|
DBRootConfigList todbrootConfigList;
|
|
try
|
|
{
|
|
oam.getPmDbrootConfig(atoi(toPMID.c_str()), todbrootConfigList);
|
|
|
|
cout << "DBRoot IDs currently assigned to '" + toPM + "' = ";
|
|
|
|
DBRootConfigList::iterator pt = todbrootConfigList.begin();
|
|
for( ; pt != todbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != todbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "DBroot IDs being moved, please wait..." << endl << endl;
|
|
|
|
try {
|
|
oam.manualMovePmDbroot(residePM, dbrootIDs, toPM);
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** manualMovePmDbroot Failed : API Failure" << endl;
|
|
break;
|
|
}
|
|
|
|
//get dbroots ids for reside PM
|
|
try
|
|
{
|
|
residedbrootConfigList.clear();
|
|
oam.getPmDbrootConfig(atoi(residePMID.c_str()), residedbrootConfigList);
|
|
|
|
cout << "DBRoot IDs newly assigned to '" + residePM + "' = ";
|
|
|
|
DBRootConfigList::iterator pt = residedbrootConfigList.begin();
|
|
for( ; pt != residedbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != residedbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
todbrootConfigList.clear();
|
|
oam.getPmDbrootConfig(atoi(toPMID.c_str()), todbrootConfigList);
|
|
|
|
cout << "DBRoot IDs newly assigned to '" + toPM + "' = ";
|
|
|
|
DBRootConfigList::iterator pt = todbrootConfigList.begin();
|
|
for( ; pt != todbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != todbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed for '" << toPM << "' : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case 32: // suspendDatabaseWrites
|
|
{
|
|
BRM::DBRM dbrm;
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
cout << endl << "This command suspends the DDL/DML writes to the MariaDB ColumnStore Database" << endl;
|
|
try
|
|
{
|
|
|
|
if (!dbrm.isDBRMReady())
|
|
{
|
|
cout << endl << " The Controller Node is not responding.\n The system can't be set into write suspend mode" << endl << flush;
|
|
break;
|
|
}
|
|
else
|
|
if (dbrm.isReadWrite() != 0)
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
|
|
// If there are bulkloads, ddl or dml happening, refuse the request
|
|
if (suspendAnswer == CANCEL) // We don't have an answer from the command line.
|
|
{
|
|
// If there are bulkloads, ddl or dml happening, Ask what to do.
|
|
bool bIsDbrmUp = true;
|
|
execplan::SessionManager sessionManager;
|
|
BRM::SIDTIDEntry blockingsid;
|
|
std::vector<BRM::TableLockInfo> tableLocks = dbrm.getAllTableLocks();
|
|
bool bActiveTransactions = false;
|
|
if (!tableLocks.empty())
|
|
{
|
|
oam.DisplayLockedTables(tableLocks, &dbrm);
|
|
bActiveTransactions = true;
|
|
}
|
|
if (sessionManager.checkActiveTransaction(0, bIsDbrmUp, blockingsid))
|
|
{
|
|
cout << endl << "There are active transactions being processed" << endl;
|
|
bActiveTransactions = true;
|
|
}
|
|
|
|
if (bActiveTransactions)
|
|
{
|
|
suspendAnswer = AskSuspendQuestion(CmdID);
|
|
// if (suspendAnswer == FORCE)
|
|
// {
|
|
// if (confirmPrompt("Force may cause data problems and should only be used in extreme circumstances"))
|
|
// {
|
|
// break;
|
|
// }
|
|
// }
|
|
bNeedsConfirm = false;
|
|
}
|
|
else
|
|
{
|
|
suspendAnswer = FORCE;
|
|
}
|
|
}
|
|
if (suspendAnswer == CANCEL)
|
|
{
|
|
// We're outa here.
|
|
break;
|
|
}
|
|
if (bNeedsConfirm)
|
|
{
|
|
if (confirmPrompt(""))
|
|
break;
|
|
}
|
|
switch (suspendAnswer)
|
|
{
|
|
case WAIT:
|
|
cout << endl << " Waiting for all transactions to complete" << flush;
|
|
dbrm.setSystemSuspendPending(true, false);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case ROLLBACK:
|
|
cout << endl << " Rollback of all transactions" << flush;
|
|
dbrm.setSystemSuspendPending(true, true);
|
|
gracefulTemp = GRACEFUL_WAIT; // Causes procmgr to wait for all table locks to free and all transactions to finish before shutdown
|
|
break;
|
|
case FORCE:
|
|
case CANCEL:
|
|
default:
|
|
gracefulTemp = FORCEFUL;
|
|
break;
|
|
}
|
|
|
|
// stop writes to MariaDB ColumnStore Database
|
|
oam.SuspendWrites(gracefulTemp, ackTemp);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopDatabaseWrites Failed: " << e.what() << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** stopDatabaseWrites Failed" << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 33: // resumeDatabaseWrites
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
if (confirmPrompt("This command resumes the DDL/DML writes to the MariaDB ColumnStore Database"))
|
|
break;
|
|
}
|
|
|
|
// resume writes to MariaDB ColumnStore Database
|
|
|
|
try{
|
|
SystemProcessStatus systemprocessstatus;
|
|
BRM::DBRM dbrm;
|
|
|
|
dbrm.setSystemSuspended(false);
|
|
|
|
oam.getProcessStatus(systemprocessstatus);
|
|
for( unsigned int i = 0 ; i < systemprocessstatus.processstatus.size(); i++)
|
|
{
|
|
if (systemprocessstatus.processstatus[i].ProcessName == "DMLProc")
|
|
{
|
|
oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
|
|
}
|
|
if (systemprocessstatus.processstatus[i].ProcessName == "DDLProc")
|
|
{
|
|
oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
|
|
}
|
|
if (systemprocessstatus.processstatus[i].ProcessName == "WriteEngineServer")
|
|
{
|
|
oam.setProcessStatus(systemprocessstatus.processstatus[i].ProcessName, systemprocessstatus.processstatus[i].Module, ACTIVE, 1);
|
|
}
|
|
}
|
|
oam.setSystemStatus(ACTIVE);
|
|
cout << endl << "Resume MariaDB ColumnStore Database Writes Request successfully completed" << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** resumeDatabaseWrites Failed: " << e.what() << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** resumeDatabaseWrites Failed" << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 34: // unassignDbrootPmConfig parameters: dbroot-list reside-pm
|
|
{
|
|
string DataRedundancyConfig = "n";
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if (DataRedundancyConfig == "y") {
|
|
cout << endl << "**** unassignDbrootPmConfig : command not supported on Data Redundancy configured system. " << endl;
|
|
break;
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** unassignDbrootPmConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
|
|
if (arguments[2] == "")
|
|
{
|
|
// need atleast 2 arguments
|
|
cout << endl << "**** unassignDbrootPmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
string dbrootIDs = arguments[1];
|
|
string residePM = arguments[2];
|
|
|
|
if (arguments[2].find("pm") == string::npos ) {
|
|
cout << endl << "**** unassignDbrootPmConfig Failed : Parmameter 2 is not a Performance Module name, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
// check module status
|
|
try{
|
|
bool degraded;
|
|
int opState;
|
|
oam.getModuleStatus(residePM, opState, degraded);
|
|
|
|
if (opState != oam::MAN_OFFLINE)
|
|
{
|
|
cout << endl << "**** unassignDbrootPmConfig Failed, " + residePM + " has to be in a MAN_OFFLINE state" << endl;
|
|
break;
|
|
}
|
|
|
|
}
|
|
catch (exception& ex)
|
|
{}
|
|
|
|
DBRootConfigList dbrootlist;
|
|
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
dbrootlist.push_back(atoi((*it).c_str()));
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
//get dbroots ids for reside PM
|
|
try
|
|
{
|
|
oam.unassignDbroot(residePM, dbrootlist);
|
|
|
|
cout << endl << " Successfully Unassigned DBRoots " << endl << endl;
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** Failed Unassign of DBRoots: " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 35: // assignDbrootPmConfig parameters: pm dbroot-list
|
|
{
|
|
string DataRedundancyConfig = "n";
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if (DataRedundancyConfig == "y") {
|
|
cout << endl << "**** assignDbrootPmConfig : command not supported on Data Redundancy configured system. " << endl;
|
|
break;
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** assignDbrootPmConfig Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
//check the system status / service status and only allow command when System is MAN_OFFLINE
|
|
if (!oam.checkSystemRunning())
|
|
{
|
|
cout << endl << "**** assignDbrootPmConfig Failed, System is down. Needs to be running" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[2] == "")
|
|
{
|
|
// need atleast 2 arguments
|
|
cout << endl << "**** assignDbrootPmConfig Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
string dbrootIDs = arguments[1];
|
|
string toPM = arguments[2];
|
|
|
|
if (arguments[2].find("pm") == string::npos ) {
|
|
cout << endl << "**** assignDbrootPmConfig Failed : Parmameter 2 is not a Performance Module name, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
// check module status
|
|
try{
|
|
bool degraded;
|
|
int opState;
|
|
oam.getModuleStatus(toPM, opState, degraded);
|
|
|
|
if (opState == oam::AUTO_DISABLED ||
|
|
opState == oam::MAN_DISABLED)
|
|
{
|
|
cout << "**** assignDbrootPmConfig Failed: " << toPM << " is DISABLED." << endl;
|
|
cout << "Run alterSystem-EnableModule to enable module" << endl;
|
|
break;
|
|
}
|
|
|
|
if (!opState == oam::MAN_OFFLINE)
|
|
{
|
|
cout << "**** assignDbrootPmConfig Failed: " << toPM << " needs to be MAN_OFFLINE." << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& ex)
|
|
{}
|
|
|
|
DBRootConfigList dbrootlist;
|
|
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(dbrootIDs, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
dbrootlist.push_back(atoi((*it).c_str()));
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
//get dbroots ids for reside PM
|
|
try
|
|
{
|
|
oam.assignDbroot(toPM, dbrootlist);
|
|
|
|
cout << endl << " Successfully Assigned DBRoots " << endl << endl;
|
|
|
|
try {
|
|
string DBRootStorageType;
|
|
oam.getSystemConfig("DBRootStorageType", DBRootStorageType);
|
|
|
|
if (DBRootStorageType == "external" ){
|
|
string DataRedundancyConfig = "n";
|
|
string cloud = oam::UnassignedName;
|
|
try {
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if ( DataRedundancyConfig == "n" && cloud == oam::UnassignedName)
|
|
cout << " REMINDER: Update the /etc/fstab on " << toPM << " to include these dbroot mounts" << endl << endl;
|
|
break;
|
|
|
|
}
|
|
}
|
|
catch(...) {}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** Failed Assign of DBRoots: " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 36: // getAlarmSummary
|
|
{
|
|
printAlarmSummary();
|
|
}
|
|
break;
|
|
|
|
case 37: // getSystemInfo
|
|
{
|
|
try {
|
|
printSystemStatus();
|
|
}
|
|
catch (...)
|
|
{
|
|
break;
|
|
}
|
|
|
|
try {
|
|
printProcessStatus();
|
|
}
|
|
catch (...)
|
|
{
|
|
break;
|
|
}
|
|
|
|
printAlarmSummary();
|
|
}
|
|
break;
|
|
|
|
case 38: // getModuleConfig
|
|
{
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
ModuleConfig moduleconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
string returnValue;
|
|
string Argument;
|
|
|
|
if (arguments[1] == "all" || arguments[1] == "")
|
|
{
|
|
|
|
// get and all display Module Name config parameters
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
cout << endl << "Module Name Configuration" << endl;
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if ( moduleCount == 0 )
|
|
// skip if no modules
|
|
continue;
|
|
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
string moduleID = modulename.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
cout << endl << "Module '" << modulename << "' Configuration information" << endl << endl;
|
|
|
|
cout << "ModuleType = " << moduletype << endl;
|
|
cout << "ModuleDesc = " << systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc << " #" << moduleID << endl;
|
|
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
|
|
cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
|
|
}
|
|
|
|
DeviceDBRootList::iterator pt3 = systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.begin();
|
|
for( ; pt3 != systemmoduletypeconfig.moduletypeconfig[i].ModuleDBRootList.end() ; pt3++)
|
|
{
|
|
if ( (*pt3).DeviceID == atoi(moduleID.c_str()) ) {
|
|
cout << "DBRootIDs assigned = ";
|
|
DBRootConfigList::iterator pt2 = (*pt3).dbrootConfigList.begin();
|
|
for( ; pt2 != (*pt3).dbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt2);
|
|
pt2++;
|
|
if (pt2 != (*pt3).dbrootConfigList.end() )
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a single module name info
|
|
if (arguments[2] == "")
|
|
{
|
|
try
|
|
{
|
|
oam.getSystemConfig(arguments[1], moduleconfig);
|
|
|
|
cout << endl << "Module Name Configuration for " << arguments[1] << endl << endl;
|
|
|
|
cout << "ModuleType = " << moduleconfig.ModuleType << endl;
|
|
cout << "ModuleDesc = " << moduleconfig.ModuleDesc << endl;
|
|
HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
|
|
for( ; pt1 != moduleconfig.hostConfigList.end() ; pt1++)
|
|
{
|
|
cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
|
|
cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
|
|
}
|
|
|
|
if ( moduleconfig.ModuleType == "pm" )
|
|
{
|
|
|
|
cout << "DBRootIDs assigned = ";
|
|
|
|
DBRootConfigList::iterator pt2 = moduleconfig.dbrootConfigList.begin();
|
|
for( ; pt2 != moduleconfig.dbrootConfigList.end() ; )
|
|
{
|
|
cout << oam.itoa(*pt2);
|
|
pt2++;
|
|
if (pt2 != moduleconfig.dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleConfig Failed = " << e.what() << endl;
|
|
}
|
|
}
|
|
else
|
|
{ // get a parameter for a module
|
|
// get module ID from module name entered, then get parameter
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
cout << endl;
|
|
bool found = false;
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
string moduleType = arguments[1].substr(0,MAX_MODULE_TYPE_SIZE);
|
|
string moduleID = arguments[1].substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if ( moduleCount == 0 )
|
|
// skip if no modules
|
|
continue;
|
|
|
|
if(systemmoduletypeconfig.moduletypeconfig[i].ModuleType == moduleType )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
if ( (*pt).DeviceName != arguments[1] )
|
|
continue;
|
|
|
|
found = true;
|
|
if ( arguments[2] == "ModuleIPAdd" || arguments[2] == "ModuleHostName") {
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
if ( arguments[2] == "ModuleIPAdd" )
|
|
cout << "ModuleIPAdd NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).IPAddr << endl;
|
|
else
|
|
cout << "ModuleHostName NIC ID " + oam.itoa((*pt1).NicID) + " = " << (*pt1).HostName << endl;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Argument = arguments[2] + oam.itoa(i+1);
|
|
try
|
|
{
|
|
oam.getSystemConfig(Argument, returnValue);
|
|
cout << endl << " " << arguments[2] << " = " << returnValue << endl << endl;
|
|
break;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleConfig Failed = " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if( !found )
|
|
{
|
|
// module name not found
|
|
cout << endl << "**** getModuleConfig Failed : Invalid Module Name" << endl;
|
|
break;
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 39:
|
|
{
|
|
}
|
|
break;
|
|
|
|
case 40:
|
|
{
|
|
}
|
|
break;
|
|
|
|
case 41:
|
|
{
|
|
}
|
|
break;
|
|
|
|
case 42:
|
|
{
|
|
}
|
|
break;
|
|
|
|
case 43: // assignElasticIPAddress
|
|
{
|
|
//get cloud configuration data
|
|
string cloud = oam::UnassignedName;
|
|
try{
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( cloud == oam::UnassignedName )
|
|
{
|
|
cout << endl << "**** assignElasticIPAddress Not Supported : For Amazon Systems only" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[2] == "")
|
|
{
|
|
// need 2 arguments
|
|
cout << endl << "**** assignElasticIPAddress Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** assignElasticIPAddress Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
string IPaddress = arguments[1];
|
|
string moduleName = arguments[2];
|
|
|
|
if ( oam.validateModule(moduleName) != API_SUCCESS) {
|
|
cout << endl << "**** assignElasticIPAddress Failed : Invalid Module name" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( moduleName == localModule )
|
|
{
|
|
if ( arguments[3] != "y") {
|
|
string warning = "Warning: Assigning Elastic IP Address to local module will lock up this terminal session.";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
}
|
|
|
|
//check and add Elastic IP Address
|
|
int AmazonElasticIPCount = 0;
|
|
try{
|
|
oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
|
|
}
|
|
catch(...) {
|
|
AmazonElasticIPCount = 0;
|
|
}
|
|
|
|
bool found = false;
|
|
int id = 1;
|
|
for ( ; id < AmazonElasticIPCount+1 ; id++ )
|
|
{
|
|
string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
|
|
string ELmoduleName;
|
|
string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
|
|
string ELIPaddress;
|
|
try{
|
|
oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
|
|
oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( ELmoduleName == moduleName &&
|
|
ELIPaddress == IPaddress)
|
|
{ //assign again incase it got unconnected
|
|
//get instance id
|
|
string instanceName = oam::UnassignedName;
|
|
try
|
|
{
|
|
ModuleConfig moduleconfig;
|
|
oam.getSystemConfig(moduleName, moduleconfig);
|
|
HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
|
|
instanceName = (*pt1).HostName;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
try{
|
|
oam.assignElasticIP(instanceName, IPaddress);
|
|
cout << endl << " Successfully completed Assigning Elastic IP Address " << endl << endl;
|
|
}
|
|
catch(...) {}
|
|
found = true;
|
|
break;
|
|
}
|
|
|
|
if ( ELmoduleName == moduleName )
|
|
{
|
|
cout << endl << "**** assignElasticIPAddress Failed : module already assigned IP Address " << ELIPaddress << endl;
|
|
found = true;
|
|
break;
|
|
}
|
|
|
|
if ( ELIPaddress == IPaddress )
|
|
{
|
|
cout << endl << "**** assignElasticIPAddress Failed : IP Address already assigned to module " << ELmoduleName << endl;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (found)
|
|
break;
|
|
|
|
AmazonElasticIPCount++;
|
|
|
|
//get instance id
|
|
string instanceName = oam::UnassignedName;
|
|
try
|
|
{
|
|
ModuleConfig moduleconfig;
|
|
oam.getSystemConfig(moduleName, moduleconfig);
|
|
HostConfigList::iterator pt1 = moduleconfig.hostConfigList.begin();
|
|
instanceName = (*pt1).HostName;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
try{
|
|
oam.assignElasticIP(instanceName, IPaddress);
|
|
}
|
|
catch(...) {
|
|
cout << endl << "**** assignElasticIPAddress Failed : assignElasticIP API Error" << endl;
|
|
break;
|
|
}
|
|
|
|
//add to configuration
|
|
string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
|
|
string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
|
|
|
|
Config* sysConfig = Config::makeConfig();
|
|
try {
|
|
sysConfig->setConfig("Installation", "AmazonElasticIPCount", oam.itoa(AmazonElasticIPCount));
|
|
sysConfig->setConfig("Installation", AmazonElasticModule, moduleName);
|
|
sysConfig->setConfig("Installation", AmazonElasticIPAddr, IPaddress);
|
|
sysConfig->write();
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << "ERROR: Problem setting AmazonElasticModule in the MariaDB ColumnStore System Configuration file" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << " Successfully completed Assigning Elastic IP Address " << endl << endl;
|
|
}
|
|
break;
|
|
|
|
case 44: // unassignElasticIPAddress
|
|
{
|
|
//get cloud configuration data
|
|
string cloud = oam::UnassignedName;
|
|
try{
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( cloud == oam::UnassignedName )
|
|
{
|
|
cout << endl << "**** unassignElasticIPAddress Not Supported : For Amazon Systems only" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 2 arguments
|
|
cout << endl << "**** unassignElasticIPAddress Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** unassignElasticIPAddress Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
string IPaddress = arguments[1];
|
|
|
|
//check and add Elastic IP Address
|
|
int AmazonElasticIPCount = 0;
|
|
try{
|
|
oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
|
|
}
|
|
catch(...) {
|
|
AmazonElasticIPCount = 0;
|
|
}
|
|
|
|
bool found = false;
|
|
int id = 1;
|
|
for ( ; id < AmazonElasticIPCount+1 ; id++ )
|
|
{
|
|
string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
|
|
string ELmoduleName;
|
|
string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
|
|
string ELIPaddress;
|
|
try{
|
|
oam.getSystemConfig(AmazonElasticIPAddr, ELmoduleName);
|
|
oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( ELIPaddress == IPaddress )
|
|
{
|
|
found = true;
|
|
try{
|
|
oam.deassignElasticIP(IPaddress);
|
|
}
|
|
catch(...) {
|
|
cout << endl << "**** deassignElasticIPAddress Failed : deassignElasticIP API Error";
|
|
break;
|
|
}
|
|
|
|
int oldAmazonElasticIPCount = AmazonElasticIPCount;
|
|
|
|
Config* sysConfig = Config::makeConfig();
|
|
//move up any others
|
|
if ( oldAmazonElasticIPCount > id )
|
|
{
|
|
for ( int newid = id+1 ; newid < oldAmazonElasticIPCount+1 ; newid++ )
|
|
{
|
|
AmazonElasticModule = "AmazonElasticModule" + oam.itoa(newid);
|
|
AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(newid);
|
|
|
|
try{
|
|
oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
|
|
oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
|
|
}
|
|
catch(...) {}
|
|
|
|
AmazonElasticModule = "AmazonElasticModule" + oam.itoa(newid-1);
|
|
AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(newid-1);
|
|
|
|
try{
|
|
oam.setSystemConfig(AmazonElasticModule, ELmoduleName);
|
|
oam.setSystemConfig(AmazonElasticIPAddr, ELIPaddress);
|
|
}
|
|
catch(...) {}
|
|
}
|
|
}
|
|
|
|
AmazonElasticModule = "AmazonElasticModule" + oam.itoa(oldAmazonElasticIPCount);
|
|
AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(oldAmazonElasticIPCount);
|
|
|
|
//delete last entry and update count
|
|
AmazonElasticIPCount--;
|
|
try {
|
|
sysConfig->setConfig("Installation", "AmazonElasticIPCount", oam.itoa(AmazonElasticIPCount));
|
|
sysConfig->delConfig("Installation", AmazonElasticModule);
|
|
sysConfig->delConfig("Installation", AmazonElasticIPAddr);
|
|
sysConfig->write();
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << "ERROR: Problem setting AmazonElasticModule in the MariaDB ColumnStore System Configuration file" << endl;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
cout << endl << " Elastic IP Address " << IPaddress << " not assigned to a module" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << " Successfully completed Unassigning Elastic IP Address " << endl << endl;
|
|
|
|
}
|
|
break;
|
|
|
|
case 45: // getSystemNetworkConfig
|
|
{
|
|
// get and display Module Network Config
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
|
|
//check and add Elastic IP Address
|
|
int AmazonElasticIPCount = 0;
|
|
try{
|
|
oam.getSystemConfig("AmazonElasticIPCount", AmazonElasticIPCount);
|
|
}
|
|
catch(...) {
|
|
AmazonElasticIPCount = 0;
|
|
}
|
|
|
|
// get max length of a host name for header formatting
|
|
|
|
int maxSize = 9;
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
string moduletypedesc = systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc;
|
|
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
if ( maxSize < (int) (*pt1).HostName.size() )
|
|
maxSize = (*pt1).HostName.size();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemNetworkConfig Failed = " << e.what() << endl;
|
|
}
|
|
|
|
cout << endl << "System Network Configuration" << endl << endl;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(15);
|
|
cout << "Module Name";
|
|
cout.width(30);
|
|
cout << "Module Description";
|
|
cout.width(10);
|
|
cout << "NIC ID";
|
|
cout.width(maxSize + 5);
|
|
cout << "Host Name";
|
|
cout.width(20);
|
|
cout << "IP Address";
|
|
cout.width(14);
|
|
if ( AmazonElasticIPCount > 0 )
|
|
{
|
|
cout.width(20);
|
|
cout << "Elastic IP Address";
|
|
}
|
|
cout << endl;
|
|
cout.width(15);
|
|
cout << "-----------";
|
|
cout.width(30);
|
|
cout << "-------------------------";
|
|
cout.width(10);
|
|
cout << "------";
|
|
for ( int i=0 ; i < maxSize ; i++ )
|
|
{
|
|
cout << "-";
|
|
}
|
|
cout << " ";
|
|
cout.width(20);
|
|
cout << "---------------";
|
|
if ( AmazonElasticIPCount > 0 )
|
|
{
|
|
cout.width(20);
|
|
cout << "------------------";
|
|
}
|
|
cout << endl;
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
string moduletypedesc = systemmoduletypeconfig.moduletypeconfig[i].ModuleDesc;
|
|
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
string moduleID = modulename.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
string modulenamedesc = moduletypedesc + " #" + moduleID;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(15);
|
|
cout << modulename;
|
|
cout.width(33);
|
|
cout << modulenamedesc;
|
|
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for ( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
string ipAddr = (*pt1).IPAddr;
|
|
string hostname = (*pt1).HostName;
|
|
string nicID = oam.itoa((*pt1).NicID);
|
|
|
|
if ( nicID != "1" ) {
|
|
cout.width(48);
|
|
cout << " ";
|
|
}
|
|
|
|
cout.width(7);
|
|
cout << nicID;
|
|
cout.width(maxSize + 5);
|
|
cout << hostname;
|
|
cout.width(20);
|
|
cout << ipAddr;
|
|
cout.width(14);
|
|
|
|
if ( nicID == "1" && AmazonElasticIPCount > 0 )
|
|
{
|
|
int id = 1;
|
|
for ( ; id < AmazonElasticIPCount+1 ; id++ )
|
|
{
|
|
string AmazonElasticModule = "AmazonElasticModule" + oam.itoa(id);
|
|
string ELmoduleName;
|
|
string AmazonElasticIPAddr = "AmazonElasticIPAddr" + oam.itoa(id);
|
|
string ELIPaddress;
|
|
try{
|
|
oam.getSystemConfig(AmazonElasticModule, ELmoduleName);
|
|
oam.getSystemConfig(AmazonElasticIPAddr, ELIPaddress);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( modulename == ELmoduleName )
|
|
{
|
|
cout.width(20);
|
|
cout << ELIPaddress;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
cout << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemNetworkConfig Failed = " << e.what() << endl;
|
|
}
|
|
|
|
//get cloud configuration data
|
|
string cloud = oam::UnassignedName;
|
|
try{
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( cloud == "amazon-ec2" || cloud == "amazon-vpc" )
|
|
{
|
|
cout << endl << "Amazon Instance Configuration" << endl << endl;
|
|
|
|
string PMInstanceType = oam::UnassignedName;
|
|
string UMInstanceType = oam::UnassignedName;
|
|
try{
|
|
oam.getSystemConfig("PMInstanceType", PMInstanceType);
|
|
oam.getSystemConfig("UMInstanceType", UMInstanceType);
|
|
|
|
cout << "PMInstanceType = " << PMInstanceType << endl;
|
|
cout << "UMInstanceType = " << UMInstanceType << endl;
|
|
}
|
|
catch(...) {}
|
|
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
break;
|
|
}
|
|
|
|
case 46: // enableReplication
|
|
{
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** enableReplication Failed : not supported on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
|
|
string MySQLRep;
|
|
try {
|
|
oam.getSystemConfig("MySQLRep", MySQLRep);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( MySQLRep == "y" ) {
|
|
string warning = "MariaDB ColumnStore Replication Feature is already enabled";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
string password;
|
|
if ( arguments[1] == "") {
|
|
cout << endl;
|
|
string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
|
|
password = dataPrompt(prompt);
|
|
}
|
|
else
|
|
password = arguments[1];
|
|
|
|
if ( password == "")
|
|
password = oam::UnassignedName;
|
|
|
|
//set flag
|
|
try {
|
|
oam.setSystemConfig("MySQLRep", "y");
|
|
sleep(2);
|
|
}
|
|
catch(...) {}
|
|
|
|
try
|
|
{
|
|
oam.enableMySQLRep(password);
|
|
cout << endl << " Successful Enabling of MariaDB ColumnStore Replication " << endl << endl;
|
|
|
|
//display Primary UM Module / Master Node
|
|
string PrimaryUMModuleName;
|
|
try {
|
|
oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
|
|
}
|
|
catch(...) {}
|
|
|
|
cout << " MariaDB ColumnStore Replication Master Node is " << PrimaryUMModuleName << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** enableRep Failed : " << e.what() << endl;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 47: // getSoftwareInfo
|
|
{
|
|
cout << endl;
|
|
if ( rootUser)
|
|
{
|
|
int rtnCode = system("rpm -qi mariadb-columnstore-platform > /tmp/columnstore.txt 2>&1");
|
|
if (WEXITSTATUS(rtnCode) == 0)
|
|
system("cat /tmp/columnstore.txt");
|
|
else {
|
|
rtnCode = system("dpkg -s mariadb-columnstore-platform > /tmp/columnstore.txt 2>&1");
|
|
if (WEXITSTATUS(rtnCode) == 0)
|
|
system("cat /tmp/columnstore.txt");
|
|
else {
|
|
cout << "SoftwareVersion = " << columnstore_version << endl;
|
|
cout << "SoftwareRelease = " << columnstore_release << endl;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cout << "SoftwareVersion = " << columnstore_version << endl;
|
|
cout << "SoftwareRelease = " << columnstore_release << endl;
|
|
}
|
|
cout << endl;
|
|
break;
|
|
}
|
|
|
|
case 48: // addModule - parameters: Module type/Module Name, Number of Modules, Server Hostnames,
|
|
// Server root password optional
|
|
{
|
|
Config* sysConfig = Config::makeConfig();
|
|
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** addModule Failed : not support on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** addModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need at least arguments
|
|
cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
switch ( serverInstallType ) {
|
|
case (oam::INSTALL_COMBINE_DM_UM_PM):
|
|
{
|
|
if (arguments[1].find("um") != string::npos ) {
|
|
cout << endl << "**** addModule Failed : User Module Types not supported on this Combined Server Installation" << endl;
|
|
return(0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
string DataRedundancyConfig = "n";
|
|
int DataRedundancyCopies;
|
|
string cloud = oam::UnassignedName;
|
|
int DataRedundancyNetworkType;
|
|
int DataRedundancyStorageType;
|
|
string AmazonVPCNextPrivateIP;
|
|
string DistributedInstall = "y";
|
|
try {
|
|
oam.getSystemConfig("Cloud", cloud);
|
|
oam.getSystemConfig("AmazonVPCNextPrivateIP", AmazonVPCNextPrivateIP);
|
|
oam.getSystemConfig("DataRedundancyConfig", DataRedundancyConfig);
|
|
oam.getSystemConfig("DataRedundancyCopies", DataRedundancyCopies);
|
|
oam.getSystemConfig("DataRedundancyNetworkType", DataRedundancyNetworkType);
|
|
oam.getSystemConfig("DataRedundancyStorageType", DataRedundancyStorageType);
|
|
}
|
|
catch(...) {}
|
|
|
|
ModuleTypeConfig moduletypeconfig;
|
|
DeviceNetworkConfig devicenetworkconfig;
|
|
DeviceNetworkList devicenetworklist;
|
|
DeviceNetworkList enabledevicenetworklist;
|
|
HostConfig hostconfig;
|
|
|
|
string moduleType;
|
|
string moduleName;
|
|
int moduleCount;
|
|
string password;
|
|
typedef std::vector<string> inputNames;
|
|
inputNames inputnames;
|
|
typedef std::vector<string> umStorageNames;
|
|
umStorageNames umstoragenames;
|
|
int hostArg;
|
|
int dbrootPerPM = 0;
|
|
|
|
//check if module type or module name was entered
|
|
if ( arguments[1].size() == 2 )
|
|
{ //Module Type was entered
|
|
if (arguments[3] == "" && cloud == oam::UnassignedName)
|
|
{
|
|
// need at least arguments
|
|
cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
//Module Type was entered
|
|
moduleType = arguments[1];
|
|
moduleCount = atoi(arguments[2].c_str());
|
|
hostArg = 3;
|
|
|
|
//check for a non-distrubuted install setup, dont need password
|
|
if ( DistributedInstall == "y" )
|
|
{
|
|
if (arguments[4] != "")
|
|
password = arguments[4];
|
|
else
|
|
{
|
|
cout << endl;
|
|
string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
|
|
password = dataPrompt(prompt);
|
|
}
|
|
}
|
|
|
|
if (arguments[5] != "")
|
|
dbrootPerPM = atoi(arguments[5].c_str());
|
|
}
|
|
else
|
|
{
|
|
//Module Name was entered
|
|
if (arguments[2] == "" && cloud == oam::UnassignedName)
|
|
{
|
|
// need at least arguments
|
|
cout << endl << "**** addModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
moduleName = arguments[1];
|
|
moduleType = arguments[1].substr(0,MAX_MODULE_TYPE_SIZE);
|
|
moduleCount = 1;
|
|
hostArg = 2;
|
|
|
|
//check for a non-distrubuted install setup, dont need password
|
|
if ( DistributedInstall == "y" )
|
|
{
|
|
if (arguments[3] != "")
|
|
password = arguments[3];
|
|
else
|
|
{
|
|
cout << endl;
|
|
string prompt = "Enter the 'User' Password or 'ssh' if configured with ssh-keys";
|
|
password = dataPrompt(prompt);
|
|
}
|
|
}
|
|
|
|
if (arguments[4] != "")
|
|
dbrootPerPM = atoi(arguments[4].c_str());
|
|
}
|
|
|
|
//do we needed this check????
|
|
if ( moduleCount < 1 || moduleCount > 10 ) {
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, invalid number-of-modules entered (1-10)" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( DataRedundancyConfig == "y" && moduleType == "pm" ) {
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on active module
|
|
cout << endl << "**** addModule Failed : Can only run command on Active OAM Parent Module (" << parentOAMModule << ")." << endl;
|
|
break;
|
|
}
|
|
|
|
if ( fmod((float) moduleCount , (float) DataRedundancyCopies) != 0 ) {
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, invalid number-of-modules: must be multiple of Data Redundancy Copies, which is " << DataRedundancyCopies << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//check and parse input Hostname/VPC-IP Addresses
|
|
if (arguments[hostArg] != "") {
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(arguments[hostArg], sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
inputnames.push_back(*it);
|
|
}
|
|
}
|
|
|
|
if ( inputnames.size() < (unsigned) moduleCount ) {
|
|
if ( cloud == oam::UnassignedName )
|
|
{
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, number of hostnames is less than Module Count" << endl;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( cloud == "amazon-ec2" )
|
|
{
|
|
cout << endl << "Launching new Instance(s)" << endl;
|
|
for ( int id = inputnames.size() ; id < moduleCount ; id++ )
|
|
{
|
|
inputnames.push_back(oam::UnassignedName);
|
|
}
|
|
}
|
|
else
|
|
{ // amazon-vpc
|
|
if ( inputnames.size() == 0 )
|
|
{
|
|
if ( AmazonVPCNextPrivateIP == oam::UnassignedName)
|
|
{
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, enter VPC Private IP Address" << endl;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( AmazonVPCNextPrivateIP == "autoassign")
|
|
{
|
|
for ( int id = inputnames.size() ; id < moduleCount ; id++ )
|
|
{
|
|
inputnames.push_back("autoassign");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ( int id = inputnames.size() ; id < moduleCount ; id++ )
|
|
{
|
|
inputnames.push_back(AmazonVPCNextPrivateIP);
|
|
|
|
try
|
|
{
|
|
AmazonVPCNextPrivateIP = oam.incrementIPAddress(AmazonVPCNextPrivateIP);
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "ERROR: incrementIPAddress API error, check logs" << endl;
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//get configured moduleNames
|
|
try{
|
|
oam.getSystemConfig(moduleType, moduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, getSystemConfig API Failed" << endl;
|
|
break;
|
|
}
|
|
|
|
//get module names already in-use and Number of NIC IDs for module
|
|
typedef std::vector<string> moduleNameList;
|
|
moduleNameList modulenamelist;
|
|
int nicNumber=1;
|
|
|
|
DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();
|
|
for( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
|
|
{
|
|
modulenamelist.push_back((*pt).DeviceName);
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
if ( (*pt1).HostName != oam::UnassignedName ) {
|
|
if ( nicNumber < (*pt1).NicID )
|
|
nicNumber = (*pt1).NicID;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ((unsigned) nicNumber * moduleCount) != inputnames.size() && cloud == oam::UnassignedName ) {
|
|
cout << endl << "**** addModule Failed : Failed to Add Module, invalid number of hostNames entered. Enter " + oam.itoa(nicNumber * moduleCount) + " hostname(s), which is the number of NICs times the number of modules" << endl;
|
|
break;
|
|
}
|
|
|
|
int moduleID = 1;
|
|
inputNames::const_iterator listPT1 = inputnames.begin();
|
|
umStorageNames::const_iterator listPT2 = umstoragenames.begin();
|
|
for ( int i = 0 ; i < moduleCount ; i++ )
|
|
{
|
|
string dataDupIPaddr = "ModuleIPAddr"+oam.itoa(moduleID)+"-1-3";
|
|
string dataDupHostName = "ModuleHostName"+oam.itoa(moduleID)+"-1-3";
|
|
//validate or determine module name
|
|
moduleNameList::const_iterator listPT = modulenamelist.begin();
|
|
for( ; listPT != modulenamelist.end() ; listPT++)
|
|
{
|
|
if ( !moduleName.empty() ) {
|
|
//add by moduleName, validate that Entered module name doesn't exist
|
|
if ( moduleName == (*listPT) ) {
|
|
cout << endl << "**** addModule Failed : Module Name already exist" << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//add by moduleType, get available module name
|
|
string newModuleName = moduleType + oam.itoa(moduleID);
|
|
if ( newModuleName == (*listPT) )
|
|
moduleID++;
|
|
else
|
|
{
|
|
moduleName = newModuleName;
|
|
moduleID++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( moduleName.empty() ) {
|
|
moduleName = moduleType + oam.itoa(moduleID);
|
|
moduleID++;
|
|
}
|
|
|
|
// store module name
|
|
devicenetworkconfig.DeviceName = moduleName;
|
|
enabledevicenetworklist.push_back(devicenetworkconfig);
|
|
|
|
for ( int j = 0 ; j < nicNumber ; j ++ )
|
|
{
|
|
//get/check Server Hostnames IP address
|
|
string hostName;
|
|
string IPAddress;
|
|
if ( cloud == "amazon-ec2")
|
|
{
|
|
hostName = *listPT1;
|
|
if ( hostName != oam::UnassignedName )
|
|
{
|
|
IPAddress = oam.getEC2InstanceIpAddress(hostName);
|
|
if (IPAddress == "stopped" || IPAddress == "terminated") {
|
|
cout << "ERROR: Instance " + hostName + " not running, please start and retry" << endl << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
else
|
|
IPAddress = oam::UnassignedName;
|
|
}
|
|
else
|
|
{
|
|
if ( cloud == "amazon-vpc")
|
|
{
|
|
if ( *listPT1 != "autoassign" )
|
|
{
|
|
if ( oam.isValidIP(*listPT1) ) {
|
|
//ip address entered
|
|
hostName = oam::UnassignedName;
|
|
IPAddress = *listPT1;
|
|
}
|
|
else
|
|
{ //instance id entered
|
|
hostName = *listPT1;
|
|
IPAddress = oam.getEC2InstanceIpAddress(hostName);
|
|
if (IPAddress == "stopped" || IPAddress == "terminated") {
|
|
cout << "ERROR: Instance " + hostName + " not running, please start and retry" << endl << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hostName = oam::UnassignedName;
|
|
IPAddress = "autoassign";
|
|
}
|
|
}
|
|
else
|
|
{ // non-amazon
|
|
hostName = *listPT1;
|
|
IPAddress = oam.getIPAddress(hostName);
|
|
if ( IPAddress.empty() ) {
|
|
// prompt for IP Address
|
|
string prompt = "IP Address of " + hostName + " not found, enter IP Address or enter 'abort'";
|
|
IPAddress = dataPrompt(prompt);
|
|
if ( IPAddress == "abort" || !oam.isValidIP(IPAddress))
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( DataRedundancyConfig == "y")
|
|
{
|
|
string errmsg1;
|
|
string errmsg2;
|
|
int ret = oam.glusterctl(oam::GLUSTER_PEERPROBE, IPAddress, password, errmsg2);
|
|
if ( ret != 0 )
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
hostconfig.IPAddr = IPAddress;
|
|
hostconfig.HostName = hostName;
|
|
hostconfig.NicID = j+1;
|
|
devicenetworkconfig.hostConfigList.push_back(hostconfig);
|
|
listPT1++;
|
|
}
|
|
|
|
devicenetworklist.push_back(devicenetworkconfig);
|
|
devicenetworkconfig.hostConfigList.clear();
|
|
moduleName.clear();
|
|
|
|
if ( DataRedundancyConfig == "y" && DataRedundancyNetworkType == 2 && moduleType == "pm")
|
|
{
|
|
string DataRedundancyIPAddress = sysConfig->getConfig("DataRedundancyConfig",dataDupIPaddr);
|
|
string DataRedundancyHostname = sysConfig->getConfig("DataRedundancyConfig",dataDupHostName);
|
|
if (DataRedundancyIPAddress.empty() || DataRedundancyHostname.empty())
|
|
{
|
|
string prompt = "DataRedundancy is configured for dedicated network, enter a hostname";
|
|
DataRedundancyHostname = dataPrompt(prompt);
|
|
DataRedundancyIPAddress = oam.getIPAddress(DataRedundancyHostname);
|
|
if ( DataRedundancyIPAddress.empty() ) {
|
|
// prompt for IP Address
|
|
string prompt = "IP Address of " + DataRedundancyHostname + " not found, enter IP Address";
|
|
DataRedundancyIPAddress = dataPrompt(prompt);
|
|
if (!oam.isValidIP(DataRedundancyIPAddress))
|
|
return 1;
|
|
}
|
|
sysConfig->setConfig("DataRedundancyConfig", dataDupHostName, DataRedundancyHostname);
|
|
sysConfig->setConfig("DataRedundancyConfig", dataDupIPaddr, DataRedundancyIPAddress);
|
|
}
|
|
}
|
|
}
|
|
|
|
DBRootConfigList dbrootlist;
|
|
int dbrootNumber=-1;
|
|
typedef std::vector<string> storageDeviceList;
|
|
storageDeviceList storagedevicelist;
|
|
string deviceType;
|
|
|
|
if ( DataRedundancyConfig == "y" && moduleType == "pm")
|
|
{
|
|
cout << endl << "Data Redundancy storage will be expanded when module(s) are added." << endl;
|
|
|
|
if ( dbrootPerPM == 0) {
|
|
cout << endl;
|
|
// prompt for number of DBRoot
|
|
string prompt = "Number of DBRoots Per Performance Module you want to add";
|
|
dbrootPerPM = atoi(dataPrompt(prompt).c_str());
|
|
}
|
|
else
|
|
cout << endl << "Number of DBRoots Per Performance Module to be added is " << oam.itoa(dbrootPerPM) << endl;
|
|
|
|
dbrootNumber = dbrootPerPM * moduleCount;
|
|
|
|
if ( DataRedundancyStorageType == 2 )
|
|
{
|
|
cout << endl << "Data Redundancy Storage Type is configured for 'storage'" << endl;
|
|
|
|
cout << "You will need " << oam.itoa(dbrootNumber*DataRedundancyCopies);
|
|
cout << " total storage locations and " << oam.itoa(dbrootPerPM*DataRedundancyCopies) << " storage locations per PM. You will now " << endl;
|
|
cout << "be asked to enter the device names for the storage locations. You will enter " << endl;
|
|
cout << "them for each PM, on one line, separated by spaces (" << oam.itoa(dbrootPerPM*DataRedundancyCopies) << " names on each line)." << endl;
|
|
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
string firstPM = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
for( ; pt != devicenetworklist.end() ; pt++)
|
|
{
|
|
cout << endl;
|
|
string prompt = "Storage Device Names for " + (*pt).DeviceName;
|
|
string devices = dataPrompt(prompt);
|
|
storagedevicelist.push_back(devices);
|
|
}
|
|
|
|
cout << endl;
|
|
string prompt = "Filesystem type for these storage locations (ext2,ext3,xfs,etc)";
|
|
deviceType = dataPrompt(prompt);
|
|
}
|
|
|
|
}
|
|
|
|
string mysqlpassword = oam::UnassignedName;
|
|
|
|
try{
|
|
cout << endl << "Adding Modules ";
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
string firstPM = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
for( ; pt != devicenetworklist.end() ; pt++)
|
|
{
|
|
cout << (*pt).DeviceName << ", ";
|
|
}
|
|
|
|
cout << "please wait..." << endl;
|
|
|
|
oam.addModule(devicenetworklist, password, mysqlpassword);
|
|
|
|
cout << "Add Module(s) successfully completed" << endl;
|
|
|
|
if ( DataRedundancyConfig == "y" && moduleType == "pm" ) {
|
|
|
|
{
|
|
//send messages to update fstab to new modules, if needed
|
|
DeviceNetworkList::iterator pt2 = devicenetworklist.begin();
|
|
storageDeviceList::iterator pt3 = storagedevicelist.begin();
|
|
for( ; pt2 != devicenetworklist.end() ; pt2++, pt3++)
|
|
{
|
|
HostConfigList::iterator hostConfigIter = (*pt2).hostConfigList.begin();
|
|
string moduleName = (*pt2).DeviceName;
|
|
int brickID = 1;
|
|
if ( DataRedundancyStorageType == 2 )
|
|
{
|
|
string devices = *pt3;
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(devices, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
string deviceName = *it;
|
|
string entry = deviceName + " " + startup::StartUp::installDir() + "/gluster/brick" + oam.itoa(brickID) + " " + deviceType + " defaults 1 2";
|
|
//send update pm
|
|
oam.distributeFstabUpdates(entry, moduleName);
|
|
}
|
|
}
|
|
string command = startup::StartUp::installDir() + "/bin/remote_command.sh " + (*hostConfigIter).IPAddr + " " + password + " 'mkdir -p " + startup::StartUp::installDir() + "/gluster/brick" + oam.itoa(brickID) + "'";
|
|
// int status = system(command.c_str());
|
|
brickID++;
|
|
}
|
|
}
|
|
|
|
//enable modules
|
|
try
|
|
{
|
|
cout << endl << "Enabling Modules " << endl;
|
|
oam.enableModule(enabledevicenetworklist);
|
|
cout << "Successful Enable of Modules " << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** enableModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Adding DBRoots" << endl;
|
|
|
|
//add dbroots
|
|
string firstDBroot;
|
|
try
|
|
{
|
|
oam.addDbroot(dbrootNumber, dbrootlist);
|
|
|
|
cout << "New DBRoot IDs added = ";
|
|
DBRootConfigList::iterator pt1 = dbrootlist.begin();
|
|
firstDBroot = oam.itoa(*pt1);
|
|
for( ; pt1 != dbrootlist.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt1);
|
|
pt1++;
|
|
if (pt1 != dbrootlist.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** addDbroot Failed: " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Assigning DBRoots" << endl << endl;
|
|
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
DBRootConfigList::iterator pt1 = dbrootlist.begin();
|
|
for( ; pt != devicenetworklist.end() ; pt++)
|
|
{
|
|
string moduleName = (*pt).DeviceName;
|
|
|
|
DBRootConfigList dbrootlist;
|
|
|
|
for( int dbrootNum = 0; dbrootNum < dbrootPerPM ; dbrootNum++)
|
|
{
|
|
dbrootlist.push_back(*pt1);
|
|
pt1++;
|
|
}
|
|
|
|
//assign dbroots to pm
|
|
try
|
|
{
|
|
oam.assignDbroot(moduleName, dbrootlist);
|
|
|
|
cout << endl << "Successfully Assigned DBRoots " << endl;
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** Failed Assign of DBRoots: " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
cout << endl << "Run Data Redundancy Setup for DBRoots" << endl;
|
|
|
|
try {
|
|
int ret = oam.glusterctl(oam::GLUSTER_ADD, firstPM, firstDBroot, password);
|
|
if ( ret != 0 )
|
|
{
|
|
cout << endl << "**** Failed Data Redundancy Add of DBRoots, " << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "Successfully Completed Data Redundancy Add DBRoots " << endl;
|
|
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** glusterctl GLUSTER_ADD Failed" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl << "addModule Command Successfully completed: Run startSystem command to Activate newly added Performance Modules" << endl << endl;
|
|
}
|
|
else
|
|
{
|
|
cout << "addModule Command Successfully completed: Modules are Disabled, run alterSystem-enableModule command to enable them" << endl << endl;
|
|
}
|
|
|
|
try {
|
|
oam.setSystemConfig("AmazonVPCNextPrivateIP", AmazonVPCNextPrivateIP);
|
|
}
|
|
catch(...) {}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** addModule Failed: " << e.what() << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** addModule Failed : Failed to Add Module" << endl;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 49: // removeModule - parameters: Module name/type, number-of-modules
|
|
{
|
|
string DataRedundancyConfig = "n";
|
|
int DataRedundancyCopies;
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
if (DataRedundancyConfig == "y")
|
|
{
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyCopies", DataRedundancyCopies);
|
|
}
|
|
catch(...)
|
|
{}
|
|
}
|
|
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** removeModule Failed : not support on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need atleast 1 arguments
|
|
cout << endl << "**** removeModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( arguments[1] == parentOAMModule ) {
|
|
// exit out since you can't manually remove OAM Parent Module
|
|
cout << endl << "**** removeModule Failed : can't manually remove the Active OAM Parent Module." << endl;
|
|
break;
|
|
}
|
|
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** removeModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
switch ( serverInstallType ) {
|
|
case (oam::INSTALL_COMBINE_DM_UM_PM):
|
|
{
|
|
if (arguments[1].find("um") != string::npos ) {
|
|
cout << endl << "**** removeModule Failed : User Modules not supported on the Combined Server Installation" << endl;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
ModuleTypeConfig moduletypeconfig;
|
|
DeviceNetworkConfig devicenetworkconfig;
|
|
DeviceNetworkList devicenetworklist;
|
|
bool quit = false;
|
|
|
|
string moduleType;
|
|
|
|
//check if module type or module name was entered
|
|
if ( arguments[1].size() == 2 ) {
|
|
//Module Type was entered
|
|
|
|
if ( arguments[3] != "y") {
|
|
cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
|
|
string warning = "This command does a remove a module from the MariaDB ColumnStore System";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
int moduleCount = atoi(arguments[2].c_str());
|
|
if ( moduleCount < 1 || moduleCount > 10 ) {
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, invalid number-of-modules entered (1-10)" << endl;
|
|
break;
|
|
}
|
|
|
|
if ( DataRedundancyConfig == "y" ) {
|
|
cout << endl << "**** removeModule Failed : Data Redundancy requires you to specify modules to remove in groups." << endl;
|
|
break;
|
|
}
|
|
cout << endl;
|
|
|
|
moduleType = arguments[1];
|
|
|
|
//store moduleNames
|
|
try{
|
|
oam.getSystemConfig(moduleType, moduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, getSystemConfig API Failed" << endl;
|
|
break;
|
|
}
|
|
|
|
int currentModuleCount = moduletypeconfig.ModuleCount;
|
|
|
|
if ( moduleCount > currentModuleCount ) {
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, mount count entered to larger than configured" << endl;
|
|
break;
|
|
}
|
|
if ( moduleCount == currentModuleCount ) {
|
|
if ( moduleType == "pm" ) {
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last Director Module" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//get module names in-use
|
|
typedef std::vector<string> moduleNameList;
|
|
moduleNameList modulenamelist;
|
|
|
|
DeviceNetworkList::iterator pt = moduletypeconfig.ModuleNetworkList.begin();
|
|
for( ; pt != moduletypeconfig.ModuleNetworkList.end() ; pt++)
|
|
{
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
if ( (*pt1).HostName != oam::UnassignedName )
|
|
modulenamelist.push_back((*pt).DeviceName);
|
|
}
|
|
|
|
moduleNameList::reverse_iterator pt1 = modulenamelist.rbegin();
|
|
for ( int i=0 ; i < moduleCount ; i++)
|
|
{
|
|
devicenetworkconfig.DeviceName = *pt1;
|
|
pt1++;
|
|
devicenetworklist.push_back(devicenetworkconfig);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Module Name was entered
|
|
|
|
if ( arguments[2] != "y") {
|
|
cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
|
|
string warning = "This command removes module(s) from the MariaDB ColumnStore System";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
//parse module names
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
devicenetworkconfig.DeviceName = *it;
|
|
devicenetworklist.push_back(devicenetworkconfig);
|
|
|
|
moduleType = (*it).substr(0,MAX_MODULE_TYPE_SIZE);
|
|
|
|
try{
|
|
oam.getSystemConfig(moduleType, moduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, getSystemConfig API Failed" << endl;
|
|
quit = true;
|
|
break;
|
|
}
|
|
|
|
int currentModuleCount = moduletypeconfig.ModuleCount;
|
|
|
|
if ( moduleType == "pm" && currentModuleCount == 1) {
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last Performance Module" << endl;
|
|
quit = true;
|
|
break;
|
|
}
|
|
|
|
if ( moduleType == "um" && currentModuleCount == 1) {
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module, you can't remove last User Module" << endl;
|
|
quit = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( DataRedundancyConfig == "y" && devicenetworklist.size() != (size_t)DataRedundancyCopies) {
|
|
cout << endl << "**** removeModule Failed : Data Redundancy requires you to remove modules in groups equal to number of copies" << endl;
|
|
quit = true;
|
|
}
|
|
if (quit)
|
|
break;
|
|
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
DeviceNetworkList::iterator endpt = devicenetworklist.end();
|
|
|
|
// check for module status and if any dbroots still assigned
|
|
for( ; pt != endpt ; pt++)
|
|
{
|
|
// check module status
|
|
try{
|
|
bool degraded;
|
|
int opState;
|
|
oam.getModuleStatus((*pt).DeviceName, opState, degraded);
|
|
|
|
if (opState == oam::MAN_OFFLINE ||
|
|
opState == oam::MAN_DISABLED ||
|
|
opState == oam::FAILED)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
cout << "**** removeModule Failed : " << (*pt).DeviceName << " is not MAN_OFFLINE, DISABLED, or FAILED state.";
|
|
quit = true;
|
|
cout << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (exception& ex)
|
|
{}
|
|
|
|
// check dbrootlist should be empty on non data redundancy setups and remove dbroots if dataredundancy removal check passes
|
|
if ( moduleType == "pm" ) {
|
|
// check for dbroots assigned
|
|
DBRootConfigList dbrootConfigList;
|
|
string moduleID = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
try {
|
|
oam.getPmDbrootConfig(atoi(moduleID.c_str()), dbrootConfigList);
|
|
}
|
|
catch(...)
|
|
{}
|
|
if ( !dbrootConfigList.empty() && DataRedundancyConfig == "n") {
|
|
cout << "**** removeModule Failed : " << (*pt).DeviceName << " has dbroots still assigned. Please run movePmDbrootConfig or unassignDbrootPmConfig.";
|
|
quit = true;
|
|
cout << endl;
|
|
break;
|
|
}
|
|
else if (DataRedundancyConfig == "y" && !dbrootConfigList.empty())
|
|
{
|
|
bool PMlistError = true;
|
|
cout << "Removing DBRoot(s)" << endl;
|
|
DBRootConfigList::iterator dbrootListPt = dbrootConfigList.begin();
|
|
for( ; dbrootListPt != dbrootConfigList.end() ; dbrootListPt++)
|
|
{
|
|
// check if ACTIVE PM has a copy of Dbroot
|
|
string pmList = "";
|
|
try {
|
|
string errmsg;
|
|
int ret = oam.glusterctl(oam::GLUSTER_WHOHAS, oam.itoa(*dbrootListPt), pmList, errmsg);
|
|
if ( ret != 0 )
|
|
{
|
|
cout << endl << "**** removeModule Failed : " << (*pt).DeviceName << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** removeModule Failed : " << (*pt).DeviceName << " glusterctl error" << endl;
|
|
break;
|
|
}
|
|
boost::char_separator<char> sep(" ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(pmList, sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it1 = tokens.begin();
|
|
it1 != tokens.end();
|
|
++it1)
|
|
{
|
|
PMlistError = true;
|
|
DeviceNetworkList::iterator deviceNetListStartPt = devicenetworklist.begin();
|
|
string pmWithThisdbrootCopy = (*it1);
|
|
// walk the list of PMs that have copies of this dbroot
|
|
// and be sure they are in the list of nodes to be removed
|
|
for( ; deviceNetListStartPt != endpt ; deviceNetListStartPt++)
|
|
{
|
|
string thisModuleID = (*deviceNetListStartPt).DeviceName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
//cout << "pmWithThisDBRoot: " << pmWithThisdbrootCopy << " thisModuleID: " << thisModuleID << endl;
|
|
if (pmWithThisdbrootCopy == thisModuleID)
|
|
{
|
|
PMlistError = false;
|
|
}
|
|
}
|
|
if (PMlistError)
|
|
{
|
|
cout << "**** removeModule Failed : Attempting to remove PMs: "<< arguments[1] << " -- DBRoot" << oam.itoa(*dbrootListPt) << " has copies on PMs " << pmList << endl;
|
|
quit = true;
|
|
}
|
|
}
|
|
}
|
|
if (!quit)
|
|
{
|
|
try
|
|
{
|
|
if (!dbrootConfigList.empty())
|
|
{
|
|
oam.removeDbroot(dbrootConfigList);
|
|
}
|
|
|
|
cout << endl << " Successful Removal of DBRoots " << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** removeModule : Removal of DBRoots Failed: " << e.what() << endl;
|
|
quit = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (quit) {
|
|
cout << endl;
|
|
break;
|
|
}
|
|
|
|
try{
|
|
cout << endl << "Removing Module(s) ";
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
for( ; pt != devicenetworklist.end() ; pt++)
|
|
{
|
|
cout << (*pt).DeviceName << ", ";
|
|
}
|
|
cout << "please wait..." << endl;
|
|
|
|
oam.removeModule(devicenetworklist);
|
|
cout << endl << "Remove Module successfully completed" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to Remove Module: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** removeModule Failed : Failed to Remove Module" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 50: // getModuleHostNames
|
|
{
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
ModuleConfig moduleconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
string returnValue;
|
|
string Argument;
|
|
|
|
// get and all display Module HostNames (NIC 1)
|
|
// No other data will be displayed, only the hostnames.
|
|
// This feature is designed for use by other processes.
|
|
// It was specifically installed for the sqoop import feature (version 4.5)
|
|
// If arguments[1] == PM, display only PMs, UM, display only UMs, else all.
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if ( moduleCount == 0 )
|
|
// skip if no modules
|
|
continue;
|
|
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
if (arguments[1] == "pm" && moduletype != "pm")
|
|
continue;
|
|
if (arguments[1] == "um" && moduletype != "um")
|
|
continue;
|
|
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
for( ; pt1 != (*pt).hostConfigList.end() ; pt1++)
|
|
{
|
|
// Only print for NIC 1
|
|
if ((*pt1).NicID == 1)
|
|
{
|
|
// We need the name with domain and everything.
|
|
if ((*pt1).HostName == "localhost")
|
|
{
|
|
char hostName[128] = {0};
|
|
gethostname(hostName, 128);
|
|
cout << hostName << endl;
|
|
}
|
|
else
|
|
{
|
|
struct hostent* hentName = gethostbyname((*pt1).HostName.c_str());
|
|
if (hentName)
|
|
{
|
|
cout << hentName->h_name << endl;
|
|
}
|
|
else
|
|
{
|
|
cout << (*pt1).HostName.c_str() << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getModuleHostNames Failed = " << e.what() << endl;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 51: // disableReplication
|
|
{
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** disableReplication Failed : not supported on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
|
|
string MySQLRep;
|
|
try {
|
|
oam.getSystemConfig("MySQLRep", MySQLRep);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( MySQLRep == "n" ) {
|
|
string warning = "MariaDB ColumnStore Replication Feature is already disable";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
//set flag
|
|
try {
|
|
oam.setSystemConfig("MySQLRep", "n");
|
|
sleep(2);
|
|
}
|
|
catch(...) {}
|
|
|
|
try
|
|
{
|
|
oam.disableMySQLRep();
|
|
cout << endl << " Successful Disable of MariaDB ColumnStore Replication " << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** disableRep Failed : " << e.what() << endl;
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
break;
|
|
}
|
|
|
|
case 52: // getModuleCpuUsers
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleCpuUsers Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
int topNumber = 5;
|
|
|
|
if (arguments[2] != "")
|
|
{
|
|
topNumber = atoi(arguments[2].c_str());
|
|
if ( topNumber < 1 || topNumber > 10 ) {
|
|
cout << endl << "**** getModuleCpuUsers Failed : Invalid top Number entered" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
TopProcessCpuUsers topprocesscpuusers;
|
|
try{
|
|
oam.getTopProcessCpuUsers(arguments[1], topNumber, topprocesscpuusers);
|
|
|
|
printModuleCpuUsers(topprocesscpuusers);
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 53: // getSystemCpuUsers
|
|
{
|
|
int topNumber = 5;
|
|
|
|
if (arguments[1] != "")
|
|
{
|
|
topNumber = atoi(arguments[1].c_str());
|
|
if ( topNumber < 1 || topNumber > 10 ) {
|
|
cout << endl << "**** getSystemCpuUsers Failed : Invalid top Number entered" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
cout << endl << "System Process Top CPU Users per Module" << endl << endl;
|
|
|
|
SystemTopProcessCpuUsers systemtopprocesscpuusers;
|
|
TopProcessCpuUsers topprocesscpuusers;
|
|
try{
|
|
oam.getTopProcessCpuUsers(topNumber, systemtopprocesscpuusers);
|
|
|
|
for( unsigned int i = 0 ; i < systemtopprocesscpuusers.topprocesscpuusers.size(); i++)
|
|
{
|
|
printModuleCpuUsers(systemtopprocesscpuusers.topprocesscpuusers[i]);
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getSystemCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 54: // getModuleCpu
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleCpu Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleCpu modulecpu;
|
|
try{
|
|
oam.getModuleCpuUsage(arguments[1], modulecpu);
|
|
|
|
printModuleCpu(modulecpu);
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 55: // getSystemCpu
|
|
{
|
|
cout << endl << "System CPU Usage per Module" << endl << endl;
|
|
|
|
SystemCpu systemcpu;
|
|
|
|
try{
|
|
oam.getSystemCpuUsage(systemcpu);
|
|
|
|
for( unsigned int i = 0 ; i < systemcpu.modulecpu.size(); i++)
|
|
{
|
|
printModuleCpu(systemcpu.modulecpu[i]);
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getSystemCpu Failed : Failed to get CPU Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 56: // getModuleMemoryUsers
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleMemoryUsers Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
int topNumber = 5;
|
|
|
|
if (arguments[2] != "")
|
|
{
|
|
topNumber = atoi(arguments[2].c_str());
|
|
if ( topNumber < 1 || topNumber > 10 ) {
|
|
cout << endl << "**** getModuleMemoryUsers Failed : Invalid top Number entered" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
TopProcessMemoryUsers topprocessmemoryusers;
|
|
try{
|
|
oam.getTopProcessMemoryUsers(arguments[1], topNumber, topprocessmemoryusers);
|
|
|
|
printModuleMemoryUsers(topprocessmemoryusers);
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 57: // getSystemMemoryUsers
|
|
{
|
|
int topNumber = 5;
|
|
|
|
if (arguments[1] != "")
|
|
{
|
|
topNumber = atoi(arguments[1].c_str());
|
|
if ( topNumber < 1 || topNumber > 10 ) {
|
|
cout << endl << "**** getSystemMemoryUsers Failed : Invalid top Number entered" << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
cout << endl << "System Process Top Memory Users per Module" << endl << endl;
|
|
|
|
SystemTopProcessMemoryUsers systemtopprocessmemoryusers;
|
|
TopProcessMemoryUsers topprocessmemoryusers;
|
|
try{
|
|
oam.getTopProcessMemoryUsers(topNumber, systemtopprocessmemoryusers);
|
|
|
|
for( unsigned int i = 0 ; i < systemtopprocessmemoryusers.topprocessmemoryusers.size(); i++)
|
|
{
|
|
printModuleMemoryUsers(systemtopprocessmemoryusers.topprocessmemoryusers[i]);
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getSystemMemoryUsers Failed : Failed to get Top CPU Users" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 58: // getModuleMemory
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleMemory Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleMemory modulememory;
|
|
try{
|
|
oam.getModuleMemoryUsage(arguments[1], modulememory);
|
|
|
|
cout << endl << "Module Memory Usage (in K bytes)" << endl << endl;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(8);
|
|
cout << "Module";
|
|
cout.width(11);
|
|
cout << "Mem Total";
|
|
cout.width(9);
|
|
cout << "Mem Used";
|
|
cout.width(9);
|
|
cout << "cache";
|
|
cout.width(12);
|
|
cout << "Mem Usage %";
|
|
cout.width(11);
|
|
cout << "Swap Total";
|
|
cout.width(10);
|
|
cout << "Swap Used";
|
|
cout.width(13);
|
|
cout << "Swap Usage %";
|
|
cout << endl;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(8);
|
|
cout << "------";
|
|
cout.width(11);
|
|
cout << "---------";
|
|
cout.width(9);
|
|
cout << "-------";
|
|
cout.width(9);
|
|
cout << "-------";
|
|
cout.width(12);
|
|
cout << "----------";
|
|
cout.width(11);
|
|
cout << "----------";
|
|
cout.width(10);
|
|
cout << "---------";
|
|
cout.width(13);
|
|
cout << "-----------";
|
|
cout << endl;
|
|
|
|
printModuleMemory(modulememory);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 59: // getSystemMemory
|
|
{
|
|
cout << endl << "System Memory Usage per Module (in K bytes)" << endl << endl;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(8);
|
|
cout << "Module";
|
|
cout.width(11);
|
|
cout << "Mem Total";
|
|
cout.width(10);
|
|
cout << "Mem Used";
|
|
cout.width(9);
|
|
cout << "Cache";
|
|
cout.width(13);
|
|
cout << "Mem Usage %";
|
|
cout.width(12);
|
|
cout << "Swap Total";
|
|
cout.width(11);
|
|
cout << "Swap Used";
|
|
cout.width(14);
|
|
cout << "Swap Usage %";
|
|
cout << endl;
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(8);
|
|
cout << "------";
|
|
cout.width(11);
|
|
cout << "---------";
|
|
cout.width(10);
|
|
cout << "--------";
|
|
cout.width(9);
|
|
cout << "-------";
|
|
cout.width(13);
|
|
cout << "-----------";
|
|
cout.width(12);
|
|
cout << "----------";
|
|
cout.width(11);
|
|
cout << "---------";
|
|
cout.width(14);
|
|
cout << "------------";
|
|
cout << endl;
|
|
|
|
SystemMemory systemmemory;
|
|
|
|
try{
|
|
oam.getSystemMemoryUsage(systemmemory);
|
|
|
|
for( unsigned int i = 0 ; i < systemmemory.modulememory.size(); i++)
|
|
{
|
|
printModuleMemory(systemmemory.modulememory[i]);
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getSystemCpu Failed : Failed to get Memory Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 60: // getModuleDisk
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleDisk Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleDisk moduledisk;
|
|
try{
|
|
oam.getModuleDiskUsage(arguments[1], moduledisk);
|
|
|
|
printModuleDisk(moduledisk);
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 61: // getSystemDisk
|
|
{
|
|
cout << endl << "System Disk Usage per Module" << endl << endl;
|
|
|
|
SystemDisk systemdisk;
|
|
|
|
try{
|
|
oam.getSystemDiskUsage(systemdisk);
|
|
|
|
for( unsigned int i = 0 ; i < systemdisk.moduledisk.size(); i++)
|
|
{
|
|
printModuleDisk(systemdisk.moduledisk[i]);
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getSystemCpu Failed : Failed to get Memory Usage" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 62: // getModuleResources
|
|
{
|
|
if (arguments[1] == "")
|
|
{
|
|
// need 1 arguments
|
|
cout << endl << "**** getModuleResources Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
int topNumber = 5;
|
|
|
|
TopProcessCpuUsers topprocesscpuusers;
|
|
try{
|
|
oam.getTopProcessCpuUsers(arguments[1], topNumber, topprocesscpuusers);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleCpu modulecpu;
|
|
try{
|
|
oam.getModuleCpuUsage(arguments[1], modulecpu);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
TopProcessMemoryUsers topprocessmemoryusers;
|
|
try{
|
|
oam.getTopProcessMemoryUsers(arguments[1], topNumber, topprocessmemoryusers);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleMemory modulememory;
|
|
try{
|
|
oam.getModuleMemoryUsage(arguments[1], modulememory);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleDisk moduledisk;
|
|
try{
|
|
oam.getModuleDiskUsage(arguments[1], moduledisk);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
printModuleResources(topprocesscpuusers, modulecpu, topprocessmemoryusers, modulememory, moduledisk);
|
|
|
|
break;
|
|
}
|
|
|
|
case 63: // getSystemResources
|
|
{
|
|
cout << endl << "System Resource Usage per Module" << endl << endl;
|
|
|
|
int topNumber = 5;
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
continue;
|
|
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
|
|
if ( moduleCount == 0 )
|
|
continue;
|
|
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
if ( modulename == "unknown" )
|
|
continue;
|
|
|
|
TopProcessCpuUsers topprocesscpuusers;
|
|
try{
|
|
oam.getTopProcessCpuUsers(modulename, topNumber, topprocesscpuusers);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top CPU Users: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpuUsers Failed : Failed to get Top CPU Users" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleCpu modulecpu;
|
|
try{
|
|
oam.getModuleCpuUsage(modulename, modulecpu);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get CPU Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleCpu Failed : Failed to get Module CPU Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
TopProcessMemoryUsers topprocessmemoryusers;
|
|
try{
|
|
oam.getTopProcessMemoryUsers(modulename, topNumber, topprocessmemoryusers);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Top Memory Users: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemoryUsers Failed : Failed to get Top Memory Users" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleMemory modulememory;
|
|
try{
|
|
oam.getModuleMemoryUsage(modulename, modulememory);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Memory Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleMemory Failed : Failed to get Module Memory Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
ModuleDisk moduledisk;
|
|
try{
|
|
oam.getModuleDiskUsage(modulename, moduledisk);
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get Disk Usage: " << e.what() << endl << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** getModuleDisk Failed : Failed to get Module Disk Usage" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
printModuleResources(topprocesscpuusers, modulecpu, topprocessmemoryusers, modulememory, moduledisk);
|
|
}
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemResources Failed : " << e.what() << endl;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 64: // getActiveSQLStatements
|
|
{
|
|
cout << endl << "Get List of Active SQL Statements" << endl;
|
|
cout << "=================================" << endl << endl;
|
|
|
|
ActiveSqlStatements activesqlstatements;
|
|
|
|
try
|
|
{
|
|
oam.getActiveSQLStatements(activesqlstatements);
|
|
|
|
if ( activesqlstatements.size() == 0 )
|
|
{
|
|
cout << "No Active SQL Statements at this time" << endl << endl;
|
|
break;
|
|
}
|
|
|
|
cout << "Start Time Time (hh:mm:ss) Session ID SQL Statement" << endl;
|
|
cout << "---------------- ---------------- -------------------- ------------------------------------------------------------" << endl;
|
|
|
|
for ( unsigned int i = 0 ; i < activesqlstatements.size(); i++)
|
|
{
|
|
struct tm tmStartTime;
|
|
char timeBuf[36];
|
|
time_t startTime = activesqlstatements[i].starttime;
|
|
localtime_r(&startTime, &tmStartTime);
|
|
(void)strftime(timeBuf, 36, "%b %d %H:%M:%S", &tmStartTime);
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(21);
|
|
cout << timeBuf;
|
|
|
|
//get current time in Epoch
|
|
time_t cal;
|
|
time (&cal);
|
|
|
|
int runTime = cal - activesqlstatements[i].starttime;
|
|
int runHours = runTime/3600;
|
|
int runMinutes = (runTime - (runHours*3600))/60;
|
|
int runSeconds = runTime - (runHours*3600) - (runMinutes*60);
|
|
|
|
cout.width(15);
|
|
string hours = oam.itoa(runHours);
|
|
string minutes = oam.itoa(runMinutes);
|
|
string seconds = oam.itoa(runSeconds);
|
|
|
|
string run;
|
|
if ( hours.size() == 1 )
|
|
run = "0" + hours + ":";
|
|
else
|
|
run = hours + ":";
|
|
|
|
if ( minutes.size() == 1 )
|
|
run = run + "0" + minutes + ":";
|
|
else
|
|
run = run + minutes + ":";
|
|
|
|
if ( seconds.size() == 1 )
|
|
run = run + "0" + seconds;
|
|
else
|
|
run = run + seconds;
|
|
|
|
cout << run;
|
|
|
|
cout.width(23);
|
|
cout << activesqlstatements[i].sessionid;
|
|
|
|
string SQLStatement = activesqlstatements[i].sqlstatement;
|
|
int pos=0;
|
|
for ( ;; )
|
|
{
|
|
string printSQL = SQLStatement.substr(pos, 60);
|
|
pos=pos+60;
|
|
cout << printSQL << endl;
|
|
|
|
if ( printSQL.size() < 60 )
|
|
break;
|
|
|
|
cout.width(59);
|
|
cout << " ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "Failed to get List of Active SQL Statements: " << e.what() << endl << endl;
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << endl << "**** getActiveSQLStatements Failed : Failed to get List of Active SQL Statements" << endl << endl;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 65: // alterSystem-disableModule
|
|
{
|
|
|
|
string DataRedundancyConfig = "n";
|
|
try {
|
|
oam.getSystemConfig( "DataRedundancyConfig", DataRedundancyConfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** alterSystem-disableModule Failed : not support on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
//exit out since not on Parent OAM Module
|
|
cout << endl << "**** alterSystem-disableModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** alterSystem-disableModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( arguments[1] == parentOAMModule ) {
|
|
// exit out since you can't manually remove OAM Parent Module
|
|
cout << endl << "**** alterSystem-disableModule Failed : can't manually disable the Active OAM Parent Module." << endl;
|
|
break;
|
|
}
|
|
|
|
string moduleType = arguments[1].substr(0,MAX_MODULE_TYPE_SIZE);
|
|
|
|
gracefulTemp = INSTALL;
|
|
|
|
//display Primary UM Module
|
|
string PrimaryUMModuleName;
|
|
try {
|
|
oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
|
|
}
|
|
catch(...) {}
|
|
|
|
bool primUM = false;
|
|
if ( PrimaryUMModuleName == arguments[1] )
|
|
{
|
|
cout << endl << "This command stops the processing of applications on the Primary User Module, which is where DDL/DML are performed";
|
|
if (confirmPrompt("If there is another module that can be changed to a new Primary User Module, this will be done"))
|
|
break;
|
|
primUM = true;
|
|
}
|
|
else
|
|
{
|
|
// confirm request
|
|
if ( arguments[2] != "y" ) {
|
|
if (confirmPrompt("This command stops the processing of applications on a Module within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
}
|
|
|
|
//parse module names
|
|
DeviceNetworkConfig devicenetworkconfig;
|
|
DeviceNetworkList devicenetworklist;
|
|
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
devicenetworkconfig.DeviceName = *it;
|
|
devicenetworklist.push_back(devicenetworkconfig);
|
|
}
|
|
|
|
DeviceNetworkList::iterator pt = devicenetworklist.begin();
|
|
DeviceNetworkList::iterator endpt = devicenetworklist.end();
|
|
|
|
bool quit = false;
|
|
|
|
// check for module status and if any dbroots still assigned
|
|
if ( moduleType == "pm" ) {
|
|
for( ; pt != endpt ; pt++)
|
|
{
|
|
// check for dbroots assigned
|
|
DBRootConfigList dbrootConfigList;
|
|
string moduleID = (*pt).DeviceName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);
|
|
try {
|
|
oam.getPmDbrootConfig(atoi(moduleID.c_str()), dbrootConfigList);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if ( !dbrootConfigList.empty() && DataRedundancyConfig == "n") {
|
|
cout << endl << "**** alterSystem-disableModule Failed : " << (*pt).DeviceName << " has dbroots still assigned and will not be disabled. Please run movePmDbrootConfig or unassignDbrootPmConfig.";
|
|
quit = true;
|
|
cout << endl;
|
|
break;
|
|
}
|
|
else if (!dbrootConfigList.empty() && DataRedundancyConfig == "y")
|
|
{
|
|
//check if dbroot requested to be removed is empty and dboot #1 is requested to be removed
|
|
DBRootConfigList::iterator pt = dbrootConfigList.begin();
|
|
for( ; pt != dbrootConfigList.end() ; pt++)
|
|
{
|
|
int dbrootID = *pt;
|
|
|
|
//check if dbroot is empty
|
|
bool isEmpty = false;
|
|
string errMsg;
|
|
try
|
|
{
|
|
BRM::DBRM dbrm;
|
|
if ( dbrm.isDBRootEmpty(dbrootID, isEmpty, errMsg) != 0)
|
|
{
|
|
cout << endl << "**** alterSystem-disableModule Failed : Data Redundancy detected DBRoots must be empty to be disabled. Remove data from DBRoot #" << oam.itoa(dbrootID) << " to continue."<< endl;
|
|
cout << "ERROR: isDBRootEmpty API error, dbroot #" << oam.itoa(dbrootID) << " :" << errMsg << endl;
|
|
quit = true;
|
|
}
|
|
}
|
|
catch (...)
|
|
{}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (quit) {
|
|
cout << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( devicenetworklist.empty() ) {
|
|
cout << endl << "quiting, no modules to remove." << endl << endl;
|
|
break;
|
|
}
|
|
|
|
// stop module
|
|
try
|
|
{
|
|
cout << endl << " Stopping Modules" << endl;
|
|
oam.stopModule(devicenetworklist, gracefulTemp, ackTemp);
|
|
cout << " Successful stop of Modules " << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
|
|
string Failed = e.what();
|
|
if (Failed.find("Disabled") != string::npos)
|
|
cout << endl << " Successful stop of Modules " << endl;
|
|
else {
|
|
cout << endl << "**** stopModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// disable module
|
|
try
|
|
{
|
|
cout << endl << " Disabling Modules" << endl;
|
|
oam.disableModule(devicenetworklist);
|
|
cout << " Successful disable of Modules " << endl;
|
|
|
|
//display Primary UM Module
|
|
string PrimaryUMModuleName;
|
|
try {
|
|
oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( primUM &&
|
|
PrimaryUMModuleName != arguments[1] )
|
|
cout << endl << " New Primary User Module = " << PrimaryUMModuleName << endl;
|
|
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** disableModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl;
|
|
break;
|
|
}
|
|
|
|
case 66: // alterSystem-enableModule
|
|
{
|
|
if ( SingleServerInstall == "y" ) {
|
|
// exit out since not on single-server install
|
|
cout << endl << "**** alterSystem-enableModule Failed : not support on a Single-Server type installs " << endl;
|
|
break;
|
|
}
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
//exit out since not on Parent OAM Module
|
|
cout << endl << "**** alterSystem-enableModule Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** alterSystem-enableModule Failed : Missing a required Parameter, enter 'help' for additional information" << endl;
|
|
break;
|
|
}
|
|
|
|
string moduleType = arguments[1].substr(0,MAX_MODULE_TYPE_SIZE);
|
|
|
|
ACK_FLAG ackTemp = ACK_YES;
|
|
|
|
// confirm request
|
|
if ( arguments[2] != "y" ) {
|
|
if (confirmPrompt("This command starts the processing of applications on a Module within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
//parse module names
|
|
DeviceNetworkConfig devicenetworkconfig;
|
|
DeviceNetworkList devicenetworklist;
|
|
boost::char_separator<char> sep(", ");
|
|
boost::tokenizer< boost::char_separator<char> > tokens(arguments[1], sep);
|
|
for ( boost::tokenizer< boost::char_separator<char> >::iterator it = tokens.begin();
|
|
it != tokens.end();
|
|
++it)
|
|
{
|
|
devicenetworkconfig.DeviceName = *it;
|
|
devicenetworklist.push_back(devicenetworkconfig);
|
|
}
|
|
|
|
//get the system status, enable modules and startmodules if system is ACTIVE
|
|
SystemStatus systemstatus;
|
|
try {
|
|
oam.getSystemStatus(systemstatus);
|
|
|
|
// enable module
|
|
try
|
|
{
|
|
cout << endl << " Enabling Modules " << endl;
|
|
oam.enableModule(devicenetworklist);
|
|
cout << " Successful enable of Modules " << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** enableModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
|
|
if ( moduleType == "pm" )
|
|
{
|
|
cout << endl << " Performance Module(s) Enabled, run movePmDbrootConfig or assignDbrootPmConfig to assign dbroots, if needed" << endl << endl;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (systemstatus.SystemOpState == oam::ACTIVE ) {
|
|
try
|
|
{
|
|
cout << endl << " Starting Modules" << endl;
|
|
oam.startModule(devicenetworklist, ackTemp);
|
|
|
|
//reload DBRM with new configuration, needs to be done here after startModule
|
|
cmd = startup::StartUp::installDir() + "/bin/dbrmctl reload > /dev/null 2>&1";
|
|
system(cmd.c_str());
|
|
sleep(15);
|
|
|
|
cout << " Successful start of Modules " << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
cout << endl << " System not Active, run 'startSystem' to start system if needed" << endl;
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** alterSystem-enableModule Failed : " << e.what() << endl;
|
|
break;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** alterSystem-enableModule Failed, Failed return from getSystemStatus API" << endl;
|
|
break;
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
break;
|
|
}
|
|
|
|
case 67: // AVAILABLE
|
|
{
|
|
}
|
|
|
|
|
|
default:
|
|
{
|
|
cout << arguments[0] << ": Unknown Command, type help for list of commands" << endl << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief ProcessSupportCommand
|
|
*
|
|
* purpose: Process Support commands
|
|
*
|
|
******************************************************************************************/
|
|
int ProcessSupportCommand(int CommandID, std::string arguments[])
|
|
{
|
|
Oam oam;
|
|
GRACEFUL_FLAG gracefulTemp = GRACEFUL;
|
|
ACK_FLAG ackTemp = ACK_YES;
|
|
CC_SUSPEND_ANSWER suspendAnswer = WAIT;
|
|
bool bNeedsConfirm = true;
|
|
string cmd;
|
|
|
|
switch( CommandID )
|
|
{
|
|
case 0: // helpsupport
|
|
{
|
|
// display commands in the Support Command list
|
|
cout << endl << "List of Support commands" << endl << endl;
|
|
|
|
for (int i = 1;;i++)
|
|
{
|
|
if (supportCmds[i] == "")
|
|
// end of list
|
|
break;
|
|
cout << " " << supportCmds[i] << endl;
|
|
}
|
|
cout << endl;
|
|
}
|
|
break;
|
|
|
|
case 1: // stopprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
|
|
{
|
|
if (arguments[2] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** stopprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
|
|
break;
|
|
}
|
|
|
|
// don't allow stopping of Process-Monitor
|
|
if ( arguments[1] == "ProcessMonitor" ) {
|
|
cout << "ProcessMonitor is controlled by 'init' and can not be stopped" << endl;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// give warning for Process-Monitor
|
|
if ( arguments[1] == "ProcessManager" ) {
|
|
if (confirmPrompt("ProcessManager is the Interface for the Console and should only be removed as part of a MariaDB ColumnStore Package installation"))
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( arguments[3] != "y" ) {
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
// confirm request
|
|
if (confirmPrompt("This command stops the processing of an application on a Module within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.stopProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
|
|
cout << endl << " Successful stop of Process " << arguments[1] << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2: // startprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
|
|
{
|
|
if (arguments[2] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** startprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
|
|
break;
|
|
}
|
|
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
try
|
|
{
|
|
oam.startProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
|
|
cout << endl << " Successful start of Process " << arguments[1] << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 3: // restartprocess - parameters: Process-name, Module-name, Graceful flag, Ack flag
|
|
{
|
|
if (arguments[2] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** restartprocess Failed : Missing a required Parameter, Enter Process and Module names" << endl;
|
|
break;
|
|
}
|
|
|
|
getFlags(arguments, gracefulTemp, ackTemp, suspendAnswer, bNeedsConfirm);
|
|
|
|
if (arguments[3] != "y")
|
|
{
|
|
// confirm request
|
|
if (confirmPrompt("This command restarts the processing of an application on a Module within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
|
|
try
|
|
{
|
|
oam.restartProcess(arguments[2], arguments[1], gracefulTemp, ackTemp);
|
|
cout << endl << " Successful restart of Process " << arguments[1] << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 4: // killpid
|
|
{
|
|
if (arguments[1] == "" || arguments[2] != "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** killpid Failed : Invalid or Missing Parameter, Enter local Process-ID" << endl;
|
|
break;
|
|
}
|
|
|
|
pid_t PID = atoi(arguments[1].c_str());
|
|
if ( PID <= 0 ) {
|
|
cout << endl << "**** killpid Failed : Invalid Process-ID Entered" << endl;
|
|
break;
|
|
}
|
|
|
|
int status = kill( PID, SIGTERM);
|
|
if ( status != API_SUCCESS)
|
|
cout << endl << " Failure in kill of Process-ID " << arguments[1] << ", Failed: " << errno << endl << endl;
|
|
else
|
|
cout << endl << " Successful kill of Process-ID " << arguments[1] << endl << endl;
|
|
}
|
|
break;
|
|
|
|
case 5: // rebootsystem - parameters: password
|
|
{
|
|
if ( !rootUser)
|
|
{
|
|
cout << endl << "**** rebootsystem Failed : command not available when running as non-root user" << endl;
|
|
break;
|
|
}
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** rebootsystem Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "" || arguments[1] == "y")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** rebootsystem Failed : Invalid or Missing Parameter, Provide root-password" << endl;
|
|
break;
|
|
}
|
|
|
|
string password = arguments[1];
|
|
if ( arguments[2] != "y") {
|
|
cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
|
|
string warning = "This command stops the Processing of applications and reboots all modules within the MariaDB ColumnStore System";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
cout << endl << " Stop System being performed, please wait..." << endl;
|
|
|
|
try
|
|
{
|
|
cout << endl << " System being stopped, please wait... " << endl;
|
|
oam.stopSystem(GRACEFUL, ACK_YES);
|
|
|
|
if ( waitForStop() )
|
|
cout << endl << " Successful stop of System " << endl << endl;
|
|
else
|
|
cout << endl << "**** stopSystem Failed : check log files" << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopSystem Failed : " << e.what() << endl;
|
|
string warning = "stopSystem command failed,";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
|
|
bool FAILED = false;
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() )
|
|
// end of list
|
|
break;
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
if (modulename == parentOAMModule ) {
|
|
//do me last
|
|
continue;
|
|
}
|
|
|
|
//skip modules in MAN_DISABLED state
|
|
try{
|
|
int opState;
|
|
bool degraded;
|
|
oam.getModuleStatus(modulename, opState, degraded);
|
|
|
|
if (opState == oam::MAN_DISABLED )
|
|
//skip
|
|
continue;
|
|
}
|
|
catch (exception& ex)
|
|
{}
|
|
|
|
//run remote command script
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
cmd = startup::StartUp::installDir() + "/bin/remote_command.sh " + (*pt1).IPAddr + " " + password + " reboot " ;
|
|
int rtnCode = system(cmd.c_str());
|
|
if (WEXITSTATUS(rtnCode) != 0) {
|
|
cout << "Failed with running remote_command.sh" << endl;
|
|
FAILED = true;
|
|
}
|
|
else
|
|
cout << endl << " Successful reboot request of Module " << modulename << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( FAILED )
|
|
break;
|
|
|
|
//reboot local module
|
|
int rtnCode = system("reboot");
|
|
if (WEXITSTATUS(rtnCode) != 0)
|
|
cout << "Failed rebooting local module" << endl;
|
|
else
|
|
{
|
|
cout << endl << " Successful reboot request of local Module" << endl;
|
|
// close the log file
|
|
writeLog("End of a command session!!!");
|
|
logFile.close();
|
|
cout << endl << "Exiting the MariaDB ColumnStore Command Console" << endl;
|
|
exit (0);
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** rebootsystem Failed : Failed on getSystemConfig API" << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 6: // rebootnode - parameters: module-name password
|
|
{
|
|
if ( !rootUser)
|
|
{
|
|
cout << endl << "**** rebootnode Failed : command not available when running as non-root user" << endl;
|
|
break;
|
|
}
|
|
|
|
if (arguments[1] == "" || arguments[2] == "")
|
|
{
|
|
// need arguments
|
|
cout << endl << "**** rebootnode Failed : Invalid or Missing Parameter, Enter module-name and root-password" << endl;
|
|
break;
|
|
}
|
|
|
|
string inputModuleName = arguments[1];
|
|
string password = arguments[2];
|
|
if ( arguments[3] != "y") {
|
|
cout << endl << "!!!!! DESTRUCTIVE COMMAND !!!!!" << endl;
|
|
string warning = "This command reboots a node within the MariaDB ColumnStore System";
|
|
// confirm request
|
|
if (confirmPrompt(warning))
|
|
break;
|
|
}
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
systemmoduletypeconfig.moduletypeconfig.clear();
|
|
|
|
try
|
|
{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
unsigned int i = 0;
|
|
for( ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
if( systemmoduletypeconfig.moduletypeconfig[i].ModuleType.empty() ) {
|
|
// end of list
|
|
break;
|
|
}
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
string moduletype = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
if ( moduleCount > 0 )
|
|
{
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end() ; pt++)
|
|
{
|
|
string modulename = (*pt).DeviceName;
|
|
if (inputModuleName == modulename ) {
|
|
if (inputModuleName == localModule ) {
|
|
//reboot local module
|
|
int rtnCode = system("reboot");
|
|
if (WEXITSTATUS(rtnCode) != 0)
|
|
cout << "Failed rebooting local node" << endl;
|
|
else
|
|
{
|
|
cout << endl << " Successful reboot request of Node " << modulename << endl;
|
|
// close the log file
|
|
writeLog("End of a command session!!!");
|
|
logFile.close();
|
|
cout << endl << "Exiting the MariaDB ColumnStore Command Console" << endl;
|
|
exit (0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
HostConfigList::iterator pt1 = (*pt).hostConfigList.begin();
|
|
string ipAddr = (*pt1).IPAddr;
|
|
//run remote command script
|
|
cmd = startup::StartUp::installDir() + "/bin/remote_command.sh " + ipAddr + " " + password + " reboot " ;
|
|
int rtnCode = system(cmd.c_str());
|
|
if (WEXITSTATUS(rtnCode) != 0)
|
|
cout << "Failed with running remote_command.sh" << endl;
|
|
else
|
|
cout << endl << " Successful reboot request of Node " << modulename << endl;
|
|
return(0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** rebootnode Failed : Failed on getSystemConfig API" << endl;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 7: // stopdbrmprocess
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command stops the dbrm processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.stopProcessType("DBRM");
|
|
cout << endl << " Successful stop of DBRM Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopdbrmprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 8: // startdbrmprocess
|
|
{
|
|
try
|
|
{
|
|
oam.startProcessType("DBRM");
|
|
cout << endl << " Successful Start of DBRM Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startdbrmprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 9: // restartdbrmprocess
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command restarts the dbrm processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.restartProcessType("DBRM");
|
|
cout << endl << " Successful Restart of DBRM Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartdbrmprocess Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 10: // setsystemstartupstate
|
|
{
|
|
Config* sysConfig = Config::makeConfig();
|
|
|
|
parentOAMModule = getParentOAMModule();
|
|
if ( localModule != parentOAMModule ) {
|
|
// exit out since not on Parent OAM Module
|
|
cout << endl << "**** setsystemstartupstate Failed : only should be run on the Parent OAM Module, which is '" << parentOAMModule << "'" << endl;
|
|
break;
|
|
}
|
|
|
|
string systemStartupOffline;
|
|
try {
|
|
systemStartupOffline = sysConfig->getConfig("Installation", "SystemStartupOffline");
|
|
cout << "SystemStartupOffline currently set to '" + systemStartupOffline + "'" << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << "ERROR: Problem getting systemStartupOffline from the MariaDB ColumnStore System Configuration file" << endl;
|
|
return 1;
|
|
}
|
|
|
|
while(true)
|
|
{
|
|
char* pcommand = 0;
|
|
string prompt;
|
|
string temp = "cancel";
|
|
prompt = "Set system startup state to offline: (y,n,cancel) [cancel]: ";
|
|
pcommand = readline(prompt.c_str());
|
|
if (pcommand)
|
|
{
|
|
if (strlen(pcommand) > 0) temp = pcommand;
|
|
free(pcommand);
|
|
pcommand = 0;
|
|
}
|
|
if ( temp == "cancel" )
|
|
return 0;
|
|
if ( temp == "n" || temp == "y") {
|
|
systemStartupOffline = temp;
|
|
break;
|
|
}
|
|
cout << "Invalid Option, please re-enter" << endl;
|
|
}
|
|
|
|
try {
|
|
sysConfig->setConfig("Installation", "SystemStartupOffline", systemStartupOffline);
|
|
sysConfig->write();
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << "ERROR: Problem setting systemStartupOffline in the MariaDB ColumnStore System Configuration file" << endl;
|
|
exit(-1);
|
|
}
|
|
cout << endl << " Successful setting of systemStartupOffline to '" << systemStartupOffline << "'" << endl << endl;
|
|
}
|
|
break;
|
|
|
|
case 11: // stopPrimProcs
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command stops the PrimProc processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.stopProcessType("PrimProc");
|
|
cout << endl << " Successful stop of PrimProc Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopPrimProcs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 12: // startPrimProcs
|
|
{
|
|
try
|
|
{
|
|
oam.startProcessType("PrimProc");
|
|
cout << endl << " Successful Start of PrimProc Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startPrimProcs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 13: // restartPrimProcs
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command restarts the PrimProc processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.restartProcessType("PrimProc");
|
|
cout << endl << " Successful Restart of PrimProc Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartPrimProcs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 14: // stopExeMgrs
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command stops the ExeMgr processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.stopProcessType("ExeMgr");
|
|
cout << endl << " Successful stop of ExeMgr Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** stopExeMgrs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 15: // startExeMgrs
|
|
{
|
|
try
|
|
{
|
|
oam.startProcessType("ExeMgr");
|
|
cout << endl << " Successful Start of ExeMgr Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** startExeMgrs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 16: // restartExeMgrs
|
|
{
|
|
if ( arguments[1] != "y" ) {
|
|
// confirm request
|
|
if (confirmPrompt("This command restarts the ExeMgr processes within the MariaDB ColumnStore System"))
|
|
break;
|
|
}
|
|
|
|
try
|
|
{
|
|
oam.restartProcessType("ExeMgr");
|
|
cout << endl << " Successful Restart of ExeMgr Processes" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** restartExeMgrs Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 17: // getProcessStatusStandby - parameters: NONE
|
|
{
|
|
printProcessStatus("ProcStatusControlStandby");
|
|
}
|
|
break;
|
|
|
|
case 18: // distributeconfigfile - parameters: option, moduleName
|
|
{
|
|
string name = "system";
|
|
|
|
if ( arguments[1] != "" )
|
|
name = arguments[1];
|
|
|
|
try
|
|
{
|
|
oam.distributeConfigFile(name);
|
|
cout << endl << " Successful Distribution of MariaDB ColumnStore Config File" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** Distribution of MariaDB ColumnStore Config File Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 19: // getPmDbrootConfig - paramaters: pm id
|
|
{
|
|
string pmID;
|
|
if (arguments[1] == "") {
|
|
cout << endl;
|
|
string prompt = "Enter the Performance Module ID";
|
|
pmID = dataPrompt(prompt);
|
|
}
|
|
else
|
|
pmID = arguments[1];
|
|
|
|
try
|
|
{
|
|
DBRootConfigList dbrootConfigList;
|
|
oam.getPmDbrootConfig(atoi(pmID.c_str()), dbrootConfigList);
|
|
|
|
cout << "DBRoot IDs assigned to 'pm" + pmID + "' = ";
|
|
|
|
DBRootConfigList::iterator pt = dbrootConfigList.begin();
|
|
for( ; pt != dbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getPmDbrootConfig Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 20: // getDbrootPmConfig - parameters dbroot id
|
|
{
|
|
string dbrootID;
|
|
if (arguments[1] == "") {
|
|
cout << endl;
|
|
string prompt = "Enter the DBRoot ID";
|
|
dbrootID = dataPrompt(prompt);
|
|
}
|
|
else
|
|
dbrootID = arguments[1];
|
|
|
|
try
|
|
{
|
|
int pmID;
|
|
oam.getDbrootPmConfig(atoi(dbrootID.c_str()), pmID);
|
|
|
|
cout << endl << " DBRoot ID " << dbrootID << " is assigned to 'pm" << pmID << "'" << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getDbrootPmConfig Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 21: // getSystemDbrootConfig
|
|
{
|
|
cout << endl << "System DBroot Configuration" << endl << endl;
|
|
|
|
try
|
|
{
|
|
DBRootConfigList dbrootConfigList;
|
|
oam.getSystemDbrootConfig(dbrootConfigList);
|
|
|
|
cout << "System DBRoot IDs = ";
|
|
DBRootConfigList::iterator pt = dbrootConfigList.begin();
|
|
for( ; pt != dbrootConfigList.end() ;)
|
|
{
|
|
cout << oam.itoa(*pt);
|
|
pt++;
|
|
if (pt != dbrootConfigList.end())
|
|
cout << ", ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** getSystemDbrootConfig Failed : " << e.what() << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 22: // checkDBFunctional
|
|
{
|
|
try {
|
|
oam.checkDBFunctional(false);
|
|
cout << endl << " checkDBFunctional Successful" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** checkDBFunctional Failed : " << e.what() << endl;
|
|
cout << endl << " can check UM /tmp/dbfunctional.log for possible additional information" << endl << endl;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << " checkDBFunctional Failed: check UM /tmp/dbfunctional.log" << endl << endl;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 23: // getsystemreadflags
|
|
{
|
|
|
|
cout << " Print the DB System Flags. 1 = set and ready, 0 = clear and not ready" << endl;
|
|
|
|
BRM::DBRM dbrm;
|
|
|
|
cout << endl;
|
|
try {
|
|
cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
try {
|
|
cout << "getSystemReady = " << dbrm.getSystemReady() << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
try {
|
|
cout << "getSystemSuspended = " << dbrm.getSystemSuspended() << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
}
|
|
break;
|
|
|
|
case 24: // setsystemqueryready
|
|
{
|
|
BRM::DBRM dbrm;
|
|
|
|
string set = "0";
|
|
if (arguments[1] == "") {
|
|
cout << endl;
|
|
string prompt = "Enter 1 for set and 0 for clear";
|
|
set = dataPrompt(prompt);
|
|
}
|
|
else
|
|
set = arguments[1];
|
|
|
|
bool flag = true;
|
|
if ( set == "0" )
|
|
flag = false;
|
|
|
|
cout << endl;
|
|
try {
|
|
cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
cout << endl;
|
|
try {
|
|
dbrm.setSystemQueryReady(flag);
|
|
cout << "setSystemQueryReady = " << flag << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
cout << endl;
|
|
try {
|
|
cout << "getSystemQueryReady = " << dbrm.getSystemQueryReady() << endl;
|
|
}
|
|
catch(...)
|
|
{}
|
|
}
|
|
|
|
default: // shouldn't get here, but...
|
|
return 1;
|
|
|
|
} // end of switch
|
|
|
|
return 0;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief getFlags
|
|
*
|
|
* purpose: get and convert Graceful and Ack flags
|
|
*
|
|
******************************************************************************************/
|
|
void getFlags(const string* arguments, GRACEFUL_FLAG& gracefulTemp, ACK_FLAG& ackTemp, oam::CC_SUSPEND_ANSWER& suspendAnswer, bool& bNeedsConfirm, string* password)
|
|
{
|
|
gracefulTemp = GRACEFUL; // default
|
|
ackTemp = ACK_YES; // default
|
|
suspendAnswer = CANCEL;
|
|
bNeedsConfirm = true;
|
|
for( int i = 1; i < ArgNum; i++)
|
|
{
|
|
if (strcasecmp(arguments[i].c_str(), "Y") == 0)
|
|
bNeedsConfirm = false;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "N") == 0)
|
|
bNeedsConfirm = true;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "GRACEFUL") == 0)
|
|
gracefulTemp = oam::GRACEFUL;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "FORCEFUL") == 0)
|
|
gracefulTemp = FORCEFUL;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "INSTALL") == 0)
|
|
gracefulTemp = INSTALL;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "ACK_YES") == 0 || strcasecmp(arguments[i].c_str(), "YES_ACK") == 0)
|
|
ackTemp = ACK_YES;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "ACK_NO") == 0 || strcasecmp(arguments[i].c_str(), "NO_ACK") == 0)
|
|
ackTemp = ACK_NO;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "WAIT") == 0)
|
|
suspendAnswer = WAIT;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "ROLLBACK") == 0)
|
|
suspendAnswer = ROLLBACK;
|
|
else
|
|
if (strcasecmp(arguments[i].c_str(), "FORCE") == 0)
|
|
suspendAnswer = FORCE;
|
|
else
|
|
if (password && arguments[i].length() > 0)
|
|
*password = arguments[i];
|
|
}
|
|
}
|
|
|
|
|
|
/******************************************************************************************
|
|
* @brief confirmPrompt
|
|
*
|
|
* purpose: Confirmation prompt
|
|
*
|
|
******************************************************************************************/
|
|
int confirmPrompt(std::string warningCommand)
|
|
{
|
|
char* pcommand = 0;
|
|
char *p;
|
|
string argument = "n";
|
|
|
|
while(true)
|
|
{
|
|
// read input
|
|
if (warningCommand.size() > 0)
|
|
{
|
|
cout << endl << warningCommand << endl;
|
|
}
|
|
pcommand = readline(" Do you want to proceed: (y or n) [n]: ");
|
|
|
|
if (pcommand && *pcommand) {
|
|
p = strtok(pcommand," ");
|
|
argument = p;
|
|
free(pcommand);
|
|
pcommand = 0;
|
|
}
|
|
|
|
if (pcommand) {
|
|
free(pcommand);
|
|
pcommand = 0;
|
|
}
|
|
|
|
// covert argument into lowercase
|
|
transform (argument.begin(), argument.end(), argument.begin(), to_lower());
|
|
|
|
if( argument == "y")
|
|
return 0;
|
|
else if( argument == "n")
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief dataPrompt
|
|
*
|
|
* purpose: Prompt for additional data
|
|
*
|
|
******************************************************************************************/
|
|
std::string dataPrompt(std::string promptCommand)
|
|
{
|
|
char data[CmdSize];
|
|
char* pdata = data;
|
|
char *pd;
|
|
string argument;
|
|
|
|
while(true)
|
|
{
|
|
// read input
|
|
cout << promptCommand << endl;
|
|
pdata = readline(" Please enter: ");
|
|
|
|
if (!pdata) // user hit <Ctrl>-D
|
|
pdata = strdup("exit");
|
|
|
|
else if (!*pdata)
|
|
// just an enter-key was entered, ignore and reprompt
|
|
continue;
|
|
|
|
pd = pdata;
|
|
argument = pd;
|
|
|
|
return argument;
|
|
}
|
|
}
|
|
|
|
|
|
/******************************************************************************************
|
|
* @brief writeLog for command
|
|
*
|
|
* purpose: write command to the log file
|
|
*
|
|
******************************************************************************************/
|
|
void writeLog(string command)
|
|
{
|
|
Oam oam;
|
|
|
|
//filter off password on reboot commands
|
|
|
|
logFile << oam.getCurrentTime() << ": " << command << endl;
|
|
logFile.flush();
|
|
return;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printAlarmSummary
|
|
*
|
|
* purpose: get active alarms and produce a summary
|
|
*
|
|
******************************************************************************************/
|
|
void printAlarmSummary()
|
|
{
|
|
AlarmList alarmList;
|
|
Oam oam;
|
|
try {
|
|
oam.getActiveAlarms(alarmList);
|
|
}
|
|
catch(...)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int critical = 0, major = 0, minor = 0, warning = 0, info = 0;
|
|
AlarmList :: iterator i;
|
|
for (i = alarmList.begin(); i != alarmList.end(); ++i)
|
|
{
|
|
switch (i->second.getSeverity())
|
|
{
|
|
case CRITICAL:
|
|
++critical;
|
|
break;
|
|
case MAJOR:
|
|
++major;
|
|
break;
|
|
case MINOR:
|
|
++minor;
|
|
break;
|
|
case WARNING:
|
|
++warning;
|
|
break;
|
|
case INFORMATIONAL:
|
|
++info;
|
|
break;
|
|
}
|
|
}
|
|
cout << endl << "Active Alarm Counts: ";
|
|
cout << "Critical = " << critical;
|
|
cout << ", Major = " << major;
|
|
cout << ", Minor = " << minor;
|
|
cout << ", Warning = " << warning;
|
|
cout << ", Info = " << info;
|
|
cout << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printCriticalAlarms
|
|
*
|
|
* purpose: get active Critical alarms
|
|
*
|
|
******************************************************************************************/
|
|
void printCriticalAlarms()
|
|
{
|
|
AlarmList alarmList;
|
|
Oam oam;
|
|
try {
|
|
oam.getActiveAlarms(alarmList);
|
|
}
|
|
catch(...)
|
|
{
|
|
return;
|
|
}
|
|
|
|
cout << endl << "Critical Active Alarms:" << endl << endl;
|
|
|
|
AlarmList :: iterator i;
|
|
for (i = alarmList.begin(); i != alarmList.end(); ++i)
|
|
{
|
|
switch (i->second.getSeverity())
|
|
{
|
|
case CRITICAL:
|
|
cout << "AlarmID = " << i->second.getAlarmID() << endl;
|
|
cout << "Brief Description = " << i->second.getDesc() << endl;
|
|
cout << "Alarm Severity = ";
|
|
cout << "CRITICAL" << endl;
|
|
cout << "Time Issued = " << i->second.getTimestamp() << endl;
|
|
cout << "Reporting Module = " << i->second.getSname() << endl;
|
|
cout << "Reporting Process = " << i->second.getPname() << endl;
|
|
cout << "Reported Device = " << i->second.getComponentID() << endl << endl;
|
|
break;
|
|
case MAJOR:
|
|
case MINOR:
|
|
case WARNING:
|
|
case INFORMATIONAL:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printSystemStatus
|
|
*
|
|
* purpose: get and Display System and Module Statuses
|
|
*
|
|
******************************************************************************************/
|
|
void printSystemStatus()
|
|
{
|
|
SystemStatus systemstatus;
|
|
Oam oam;
|
|
BRM::DBRM dbrm(true);
|
|
|
|
cout << endl << "System " << systemName << endl << endl;
|
|
cout << "System and Module statuses" << endl << endl;
|
|
cout << "Component Status Last Status Change" << endl;
|
|
cout << "------------ -------------------------- ------------------------" << endl;
|
|
|
|
try
|
|
{
|
|
oam.getSystemStatus(systemstatus, false);
|
|
cout << "System ";
|
|
cout.setf(ios::left);
|
|
cout.width(29);
|
|
int state = systemstatus.SystemOpState;
|
|
string extraInfo = " ";
|
|
bool bRollback = false;
|
|
bool bForce = false;
|
|
|
|
if (dbrm.isDBRMReady())
|
|
{
|
|
if (dbrm.getSystemSuspended() > 0)
|
|
{
|
|
extraInfo = " WRITE SUSPENDED";
|
|
}
|
|
else
|
|
if (dbrm.getSystemSuspendPending(bRollback) > 0)
|
|
{
|
|
extraInfo = " WRITE SUSPEND PENDING";
|
|
}
|
|
else
|
|
if (dbrm.getSystemShutdownPending(bRollback, bForce) > 0)
|
|
{
|
|
extraInfo = " SHUTDOWN PENDING";
|
|
}
|
|
}
|
|
printState(state, extraInfo);
|
|
cout.width(24);
|
|
string stime = systemstatus.StateChangeDate;
|
|
stime = stime.substr (0,24);
|
|
cout << stime << endl << endl;
|
|
|
|
for( unsigned int i = 0 ; i < systemstatus.systemmodulestatus.modulestatus.size(); i++)
|
|
{
|
|
if( systemstatus.systemmodulestatus.modulestatus[i].Module.empty() )
|
|
// end of list
|
|
break;
|
|
|
|
cout << "Module ";
|
|
cout.setf(ios::left);
|
|
cout.width(7);
|
|
cout << systemstatus.systemmodulestatus.modulestatus[i].Module;
|
|
cout.width(29);
|
|
state = systemstatus.systemmodulestatus.modulestatus[i].ModuleOpState;
|
|
|
|
// get NIC functional state (degraded or not)
|
|
bool degraded = false;
|
|
try {
|
|
int state;
|
|
oam.getModuleStatus(systemstatus.systemmodulestatus.modulestatus[i].Module, state, degraded);
|
|
}
|
|
catch (...)
|
|
{}
|
|
|
|
string nicFun = " ";
|
|
if (degraded)
|
|
nicFun = "/" + DEGRADEDSTATE;
|
|
|
|
printState(state, nicFun);
|
|
|
|
cout.width(24);
|
|
string stime = systemstatus.systemmodulestatus.modulestatus[i].StateChangeDate ;
|
|
stime = stime.substr (0,24);
|
|
cout << stime << endl;
|
|
}
|
|
cout << endl;
|
|
|
|
if ( systemstatus.systemmodulestatus.modulestatus.size() > 1) {
|
|
// get and display Parent OAM Module
|
|
cout << "Active Parent OAM Performance Module is '" << getParentOAMModule() << "'" << endl;
|
|
|
|
//display Primary UM Module
|
|
string PrimaryUMModuleName;
|
|
try {
|
|
oam.getSystemConfig("PrimaryUMModuleName", PrimaryUMModuleName);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( serverInstallType != oam::INSTALL_COMBINE_DM_UM_PM )
|
|
{
|
|
ModuleTypeConfig moduletypeconfig;
|
|
try{
|
|
oam.getSystemConfig("um", moduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{}
|
|
|
|
if ( moduletypeconfig.ModuleCount > 1 )
|
|
{
|
|
if ( PrimaryUMModuleName != oam::UnassignedName )
|
|
cout << "Primary Front-End MariaDB ColumnStore Module is '" << PrimaryUMModuleName << "'" << endl;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( PrimaryUMModuleName != oam::UnassignedName )
|
|
cout << "Primary Front-End MariaDB ColumnStore Module is '" << PrimaryUMModuleName << "'" << endl;
|
|
}
|
|
}
|
|
|
|
//display local Query / PMwithUM feature, if enabled
|
|
string PMwithUM;
|
|
try {
|
|
oam.getSystemConfig("PMwithUM", PMwithUM);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( PMwithUM == "y" )
|
|
cout << "Local Query Feature is enabled" << endl;
|
|
|
|
//display MySQL replication feature, if enabled
|
|
string MySQLRep;
|
|
try {
|
|
oam.getSystemConfig("MySQLRep", MySQLRep);
|
|
}
|
|
catch(...) {}
|
|
|
|
if ( MySQLRep == "y" )
|
|
cout << "MariaDB ColumnStore Replication Feature is enabled" << endl << endl;
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** printSystemStatus Failed = " << e.what() << endl;
|
|
throw runtime_error("");
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printProcessStatus
|
|
*
|
|
* purpose: get and Display Process Statuses
|
|
*
|
|
******************************************************************************************/
|
|
void printProcessStatus(std::string port)
|
|
{
|
|
SystemProcessStatus systemprocessstatus;
|
|
ProcessStatus processstatus;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
Oam oam;
|
|
BRM::DBRM dbrm(true);
|
|
|
|
int state;
|
|
string extraInfo = " ";
|
|
bool bRollback = false;
|
|
bool bForce = false;
|
|
bool bSuspend = false;
|
|
if (dbrm.isDBRMReady())
|
|
{
|
|
if (dbrm.getSystemSuspended() > 0)
|
|
{
|
|
bSuspend = true;
|
|
extraInfo = "WRITE_SUSPEND";
|
|
}
|
|
else
|
|
if (dbrm.getSystemSuspendPending(bRollback) > 0)
|
|
{
|
|
bSuspend = true;
|
|
if (bRollback)
|
|
{
|
|
extraInfo = "ROLLBACK";
|
|
}
|
|
else
|
|
{
|
|
extraInfo = "SUSPEND_PENDING";
|
|
}
|
|
}
|
|
else
|
|
if (dbrm.getSystemShutdownPending(bRollback, bForce) > 0)
|
|
{
|
|
bSuspend = true;
|
|
if (bRollback)
|
|
{
|
|
extraInfo = "ROLLBACK";
|
|
}
|
|
else
|
|
{
|
|
extraInfo = "SHUTDOWN_PENDING";
|
|
}
|
|
}
|
|
}
|
|
|
|
cout << endl << "MariaDB ColumnStore Process statuses" << endl << endl;
|
|
cout << "Process Module Status Last Status Change Process ID" << endl;
|
|
cout << "------------------ ------ --------------- ------------------------ ----------" << endl;
|
|
try
|
|
{
|
|
oam.getProcessStatus(systemprocessstatus, port);
|
|
|
|
string prevModule = systemprocessstatus.processstatus[0].Module;
|
|
|
|
for( unsigned int i = 0 ; i < systemprocessstatus.processstatus.size(); i++)
|
|
{
|
|
if( prevModule != systemprocessstatus.processstatus[i].Module)
|
|
cout << endl; //added a space line between different modules
|
|
|
|
cout.setf(ios::left);
|
|
cout.width(20);
|
|
cout << systemprocessstatus.processstatus[i].ProcessName;
|
|
cout.width(10);
|
|
cout << systemprocessstatus.processstatus[i].Module;
|
|
cout.width(18);
|
|
state = systemprocessstatus.processstatus[i].ProcessOpState;
|
|
// For these processes, if state is ACTIVE and we're in write
|
|
// suspend, then we want to display the extra data instead of state.
|
|
// Otherwise, we ignore extra data and display state.
|
|
if (state == ACTIVE && bSuspend &&
|
|
( systemprocessstatus.processstatus[i].ProcessName == "DMLProc"
|
|
|| systemprocessstatus.processstatus[i].ProcessName == "DDLProc"
|
|
|| systemprocessstatus.processstatus[i].ProcessName == "WriteEngineServer"))
|
|
{
|
|
printState(LEAVE_BLANK, extraInfo);
|
|
}
|
|
else
|
|
{
|
|
state = systemprocessstatus.processstatus[i].ProcessOpState;
|
|
printState(state, " ");
|
|
}
|
|
cout.width(24);
|
|
string stime = systemprocessstatus.processstatus[i].StateChangeDate ;
|
|
stime = stime.substr (0,24);
|
|
cout << stime;
|
|
if ( state == COLD_STANDBY ) {
|
|
cout << endl;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
cout.setf(ios::right);
|
|
cout.width(12);
|
|
if ( systemprocessstatus.processstatus[i].ProcessID != 0 )
|
|
cout << systemprocessstatus.processstatus[i].ProcessID << endl;
|
|
else
|
|
cout << endl;
|
|
}
|
|
cout.unsetf(ios::right);
|
|
|
|
prevModule = systemprocessstatus.processstatus[i].Module;
|
|
|
|
}
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << endl << "**** printProcessStatus Failed = " << e.what() << endl;
|
|
throw runtime_error("");
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleCpuUsers
|
|
*
|
|
* purpose: get and Display Module TOP CPU users
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleCpuUsers(TopProcessCpuUsers topprocesscpuusers)
|
|
{
|
|
cout << "Module '" + topprocesscpuusers.ModuleName + "' Top CPU Users" << endl << endl;
|
|
cout << "Process CPU Usage %" << endl;
|
|
cout << "----------------- -----------" << endl;
|
|
|
|
for( unsigned int i = 0 ; i < topprocesscpuusers.processcpuuser.size(); i++)
|
|
{
|
|
cout.setf(ios::left);
|
|
cout.width(25);
|
|
cout << topprocesscpuusers.processcpuuser[i].ProcessName;
|
|
cout.width(10);
|
|
cout << topprocesscpuusers.processcpuuser[i].CpuUsage << endl;
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleCpu
|
|
*
|
|
* purpose: get and Display Module CPU Usage
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleCpu(ModuleCpu modulecpu)
|
|
{
|
|
Oam oam;
|
|
|
|
cout << endl << "Module '" + modulecpu.ModuleName + "' CPU Usage % = " + oam.itoa(modulecpu.CpuUsage) << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleMemoryUsers
|
|
*
|
|
* purpose: get and Display Module TOP Memory users
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleMemoryUsers(TopProcessMemoryUsers topprocessmemoryusers)
|
|
{
|
|
cout << "Module '" + topprocessmemoryusers.ModuleName + "' Top Memory Users (in bytes)" << endl << endl;
|
|
cout << "Process Memory Used Memory Usage %" << endl;
|
|
cout << "----------------- ----------- --------------" << endl;
|
|
|
|
for( unsigned int i = 0 ; i < topprocessmemoryusers.processmemoryuser.size(); i++)
|
|
{
|
|
cout.setf(ios::left);
|
|
cout.width(20);
|
|
cout << topprocessmemoryusers.processmemoryuser[i].ProcessName;
|
|
cout.width(19);
|
|
cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsed;
|
|
cout.width(3);
|
|
cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsage << endl;
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleMemory
|
|
*
|
|
* purpose: get and Display Module Memory Usage
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleMemory(ModuleMemory modulememory)
|
|
{
|
|
Oam oam;
|
|
cout.setf(ios::left);
|
|
cout.width(8);
|
|
cout << modulememory.ModuleName;
|
|
cout.width(11);
|
|
cout << oam.itoa(modulememory.MemoryTotal);
|
|
cout.width(10);
|
|
cout << oam.itoa(modulememory.MemoryUsed);
|
|
cout.width(13);
|
|
cout << oam.itoa(modulememory.cache);
|
|
cout.width(9);
|
|
cout << oam.itoa(modulememory.MemoryUsage);
|
|
cout.width(12);
|
|
cout << oam.itoa(modulememory.SwapTotal);
|
|
cout.width(16);
|
|
cout << oam.itoa(modulememory.SwapUsed);
|
|
cout.width(7);
|
|
cout << oam.itoa(modulememory.SwapUsage);
|
|
cout << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleDisk
|
|
*
|
|
* purpose: get and Display Module disk usage
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleDisk(ModuleDisk moduledisk)
|
|
{
|
|
Oam oam;
|
|
|
|
cout << "Module '" + moduledisk.ModuleName + "' Disk Usage (in 1K blocks)" << endl << endl;
|
|
cout << "Mount Point Total Blocks Used Blocks Usage %" << endl;
|
|
cout << "----------------------------- ------------ ------------ -------" << endl;
|
|
|
|
string etcdir = startup::StartUp::installDir() + "/etc";
|
|
for( unsigned int i = 0 ; i < moduledisk.diskusage.size(); i++)
|
|
{
|
|
//skip mounts to other server disk
|
|
if ( moduledisk.diskusage[i].DeviceName.find("/mnt", 0) == string::npos &&
|
|
moduledisk.diskusage[i].DeviceName.find(etcdir, 0) == string::npos ) {
|
|
cout.setf(ios::left);
|
|
cout.width(31);
|
|
if (moduledisk.diskusage[i].DeviceName.length() > 29) {
|
|
cout << "..." + moduledisk.diskusage[i].DeviceName.substr(moduledisk.diskusage[i].DeviceName.length()-26);
|
|
} else {
|
|
cout << moduledisk.diskusage[i].DeviceName;
|
|
}
|
|
cout.width(14);
|
|
cout << moduledisk.diskusage[i].TotalBlocks;
|
|
cout.width(17);
|
|
cout << moduledisk.diskusage[i].UsedBlocks;
|
|
cout.width(2);
|
|
cout << moduledisk.diskusage[i].DiskUsage << endl;
|
|
}
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleResources
|
|
*
|
|
* purpose: get and Display Module resource usage
|
|
*
|
|
******************************************************************************************/
|
|
void printModuleResources(TopProcessCpuUsers topprocesscpuusers, ModuleCpu modulecpu, TopProcessMemoryUsers topprocessmemoryusers, ModuleMemory modulememory, ModuleDisk moduledisk)
|
|
{
|
|
Oam oam;
|
|
string etcdir = startup::StartUp::installDir() + "/etc";
|
|
|
|
cout << endl << "Module '" + topprocesscpuusers.ModuleName + "' Resource Usage" << endl << endl;
|
|
|
|
cout << "CPU: " + oam.itoa(modulecpu.CpuUsage) << "% Usage" << endl;
|
|
|
|
cout << "Mem: " << oam.itoa(modulememory.MemoryTotal) << "k total, " << oam.itoa(modulememory.MemoryUsed);
|
|
cout << "k used, " << oam.itoa(modulememory.cache) << "k cache, " << oam.itoa(modulememory.MemoryUsage) << "% Usage" << endl;
|
|
cout << "Swap: " << oam.itoa(modulememory.SwapTotal) << " k total, " << oam.itoa(modulememory.SwapUsed);
|
|
cout << "k used, " << oam.itoa(modulememory.SwapUsage) << "% Usage" << endl;
|
|
|
|
cout << "Top CPU Process Users: ";
|
|
|
|
for( unsigned int i = 0 ; i < topprocesscpuusers.processcpuuser.size(); i++)
|
|
{
|
|
cout << topprocesscpuusers.processcpuuser[i].ProcessName << " ";
|
|
cout << topprocesscpuusers.processcpuuser[i].CpuUsage;
|
|
if ( i+1 != topprocesscpuusers.processcpuuser.size() )
|
|
cout << "%, ";
|
|
else
|
|
cout << "%";
|
|
}
|
|
cout << endl;
|
|
|
|
cout << "Top Memory Process Users: ";
|
|
|
|
for( unsigned int i = 0 ; i < topprocessmemoryusers.processmemoryuser.size(); i++)
|
|
{
|
|
cout << topprocessmemoryusers.processmemoryuser[i].ProcessName << " ";
|
|
cout << topprocessmemoryusers.processmemoryuser[i].MemoryUsage;
|
|
if ( i+1 != topprocessmemoryusers.processmemoryuser.size() )
|
|
cout << "%, ";
|
|
else
|
|
cout << "%";
|
|
}
|
|
cout << endl;
|
|
|
|
cout << "Disk Usage: ";
|
|
|
|
for( unsigned int i = 0 ; i < moduledisk.diskusage.size(); i++)
|
|
{
|
|
//skip mounts to other server disk
|
|
if ( moduledisk.diskusage[i].DeviceName.find("/mnt", 0) == string::npos &&
|
|
moduledisk.diskusage[i].DeviceName.find(etcdir, 0) == string::npos ) {
|
|
cout << moduledisk.diskusage[i].DeviceName << " ";
|
|
cout << moduledisk.diskusage[i].DiskUsage;
|
|
if ( i+1 != moduledisk.diskusage.size() )
|
|
cout << "%, ";
|
|
else
|
|
cout << "%";
|
|
}
|
|
}
|
|
cout << endl << endl;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief printModuleResources
|
|
*
|
|
* purpose: get and Display Module resource usage
|
|
*
|
|
******************************************************************************************/
|
|
void printState(int state, std::string addInfo)
|
|
{
|
|
switch (state) {
|
|
case MAN_OFFLINE:
|
|
cout << MANOFFLINE + addInfo;
|
|
break;
|
|
case AUTO_OFFLINE:
|
|
cout << AUTOOFFLINE + addInfo;
|
|
break;
|
|
case MAN_INIT:
|
|
cout << MANINIT + addInfo;
|
|
break;
|
|
case AUTO_INIT:
|
|
cout << AUTOINIT + addInfo;
|
|
break;
|
|
case ACTIVE:
|
|
cout << ACTIVESTATE + addInfo;
|
|
break;
|
|
case LEAVE_BLANK:
|
|
cout << addInfo;
|
|
break;
|
|
case STANDBY:
|
|
cout << STANDBYSTATE + addInfo;
|
|
break;
|
|
case FAILED:
|
|
cout << FAILEDSTATE + addInfo;
|
|
break;
|
|
case UP:
|
|
cout << UPSTATE + addInfo;
|
|
break;
|
|
case DOWN:
|
|
cout << DOWNSTATE + addInfo;
|
|
break;
|
|
case COLD_STANDBY:
|
|
cout << COLDSTANDBYSTATE + addInfo;
|
|
break;
|
|
case INITIAL:
|
|
cout << INITIALSTATE + addInfo;
|
|
break;
|
|
case MAN_DISABLED:
|
|
cout << MANDISABLEDSTATE + addInfo;
|
|
break;
|
|
case AUTO_DISABLED:
|
|
cout << AUTODISABLEDSTATE + addInfo;
|
|
break;
|
|
case STANDBY_INIT:
|
|
cout << STANDBYINIT + addInfo;
|
|
break;
|
|
case BUSY_INIT:
|
|
cout << BUSYINIT + addInfo;
|
|
break;
|
|
case DEGRADED:
|
|
cout << DEGRADEDSTATE + addInfo;
|
|
break;
|
|
default:
|
|
cout << INITIALSTATE + addInfo;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief checkPromptThread
|
|
*
|
|
* purpose: check for exit out of repeat command
|
|
*
|
|
******************************************************************************************/
|
|
static void checkPromptThread()
|
|
{
|
|
char* pcommand = 0;
|
|
|
|
while(true)
|
|
{
|
|
// check input
|
|
pcommand = readline("");
|
|
|
|
if (!pcommand) { // user hit <Ctrl>-D
|
|
repeatStop = true;
|
|
break;
|
|
}
|
|
free(pcommand);
|
|
pcommand = 0;
|
|
}
|
|
pthread_exit(0);
|
|
return;
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief getParentOAMModule
|
|
*
|
|
* purpose: get Parent OAm Module name
|
|
*
|
|
******************************************************************************************/
|
|
std::string getParentOAMModule()
|
|
{
|
|
Oam oam;
|
|
|
|
// Get Parent OAM module Name
|
|
try{
|
|
string parentOAMModule;
|
|
oam.getSystemConfig("ParentOAMModuleName", parentOAMModule);
|
|
return parentOAMModule;
|
|
}
|
|
catch(...)
|
|
{
|
|
cout << endl << "**** Failed : Failed to read Parent OAM Module Name" << endl;
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
/******************************************************************************************
|
|
* @brief checkForDisabledModules
|
|
*
|
|
* purpose: Chcek and report any modules in a disabled state
|
|
*
|
|
******************************************************************************************/
|
|
bool checkForDisabledModules()
|
|
{
|
|
|
|
SystemModuleTypeConfig systemmoduletypeconfig;
|
|
Oam oam;
|
|
|
|
try{
|
|
oam.getSystemConfig(systemmoduletypeconfig);
|
|
}
|
|
catch(...)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool found = false;
|
|
bool dbroot = false;
|
|
for( unsigned int i = 0 ; i < systemmoduletypeconfig.moduletypeconfig.size(); i++)
|
|
{
|
|
int moduleCount = systemmoduletypeconfig.moduletypeconfig[i].ModuleCount;
|
|
if( moduleCount == 0)
|
|
continue;
|
|
|
|
string moduleType = systemmoduletypeconfig.moduletypeconfig[i].ModuleType;
|
|
|
|
DeviceNetworkList::iterator pt = systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.begin();
|
|
for ( ; pt != systemmoduletypeconfig.moduletypeconfig[i].ModuleNetworkList.end(); pt++)
|
|
{
|
|
string moduleName = (*pt).DeviceName;
|
|
|
|
// report DISABLED modules
|
|
try{
|
|
int opState;
|
|
bool degraded;
|
|
oam.getModuleStatus(moduleName, opState, degraded);
|
|
|
|
if (opState == oam::MAN_DISABLED || opState == oam::AUTO_DISABLED) {
|
|
if (!found) {
|
|
cout << " NOTE: These module(s) are DISABLED: ";
|
|
found = true;
|
|
}
|
|
cout << moduleName << " ";
|
|
|
|
if ( moduleType == "um" )
|
|
continue;
|
|
|
|
//check if module has any dbroots assigned to it
|
|
string PMID = moduleName.substr(MAX_MODULE_TYPE_SIZE,MAX_MODULE_ID_SIZE);;
|
|
DBRootConfigList dbrootConfigList;
|
|
try
|
|
{
|
|
oam.getPmDbrootConfig(atoi(PMID.c_str()), dbrootConfigList);
|
|
|
|
if ( dbrootConfigList.size() != 0 )
|
|
dbroot = true;
|
|
}
|
|
catch (exception& e)
|
|
{}
|
|
}
|
|
}
|
|
catch(...)
|
|
{}
|
|
}
|
|
}
|
|
|
|
if(found)
|
|
cout << endl << endl;
|
|
|
|
if(dbroot)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
/** @brief Ask the user for cancel/wait/rollback/force
|
|
*
|
|
* When a Shutdown, stop, restart or suspend operation is
|
|
* requested but there are active transactions of some sort,
|
|
* we ask the user what to do.
|
|
*/
|
|
CC_SUSPEND_ANSWER AskSuspendQuestion(int CmdID)
|
|
{
|
|
char* szAnswer = 0;
|
|
char *p;
|
|
string argument = "cancel";
|
|
|
|
const char* szCommand = "Unknown";
|
|
switch (CmdID)
|
|
{
|
|
case 16:
|
|
szCommand = "stop";
|
|
break;
|
|
case 17:
|
|
szCommand = "shutdown";
|
|
break;
|
|
case 19:
|
|
szCommand = "restart";
|
|
break;
|
|
case 28:
|
|
szCommand = "switch parent oam";
|
|
break;
|
|
case 32:
|
|
szCommand = "suspend";
|
|
break;
|
|
default:
|
|
return CANCEL;
|
|
break;
|
|
}
|
|
cout << "Your options are:" << endl
|
|
<< " Cancel -- Cancel the " << szCommand << " request" << endl
|
|
<< " Wait -- Wait for write operations to end and then " << szCommand << endl;
|
|
// << " Rollback -- Rollback all transactions and then " << szCommand << endl;
|
|
if (CmdID != 28 && CmdID != 32)
|
|
{
|
|
cout << " Force -- Force a " << szCommand << endl;
|
|
}
|
|
|
|
while(true)
|
|
{
|
|
argument = "cancel";
|
|
// read input
|
|
szAnswer = readline("What would you like to do: [Cancel]: ");
|
|
|
|
if (szAnswer && *szAnswer)
|
|
{
|
|
p = strtok(szAnswer," ");
|
|
argument = p;
|
|
free(szAnswer);
|
|
szAnswer = 0;
|
|
}
|
|
|
|
// In case they just hit return.
|
|
if (szAnswer)
|
|
{
|
|
free(szAnswer);
|
|
szAnswer = 0;
|
|
}
|
|
|
|
// convert argument into lowercase
|
|
transform(argument.begin(), argument.end(), argument.begin(), to_lower());
|
|
|
|
if( argument == "cancel")
|
|
{
|
|
return CANCEL;
|
|
}
|
|
else if( argument == "wait")
|
|
{
|
|
return WAIT;
|
|
}
|
|
// else if( argument == "rollback")
|
|
// {
|
|
// return ROLLBACK;
|
|
// }
|
|
else if( argument == "force" && (CmdID == 16 || CmdID == 17 || CmdID == 19))
|
|
{
|
|
return FORCE;
|
|
}
|
|
else
|
|
{
|
|
cout << argument << " is an invalid response" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Make a connection to the PM that uses DBRoot1. Used in redistribute
|
|
// return true if successful, false if fail.
|
|
bool connectToDBRoot1PM(Oam& oam, boost::scoped_ptr<MessageQueueClient>& msgQueueClient)
|
|
{
|
|
int pmId = 0;
|
|
ModuleTypeConfig moduletypeconfig;
|
|
|
|
try
|
|
{
|
|
oam.getDbrootPmConfig(1, pmId);
|
|
oam.getSystemConfig("pm", moduletypeconfig);
|
|
}
|
|
catch (const std::exception& ex)
|
|
{
|
|
cerr << "Caught exception when getting DBRoot1" << ex.what() << endl;
|
|
return false;
|
|
}
|
|
catch (...)
|
|
{
|
|
cerr << "Caught exception when getting DBRoot1 -- unknown" << endl;
|
|
return false;
|
|
}
|
|
|
|
// Find the PM that has dbroot1, then make connection to its WES.
|
|
ostringstream oss;
|
|
oss << "pm" << pmId << "_WriteEngineServer";
|
|
try
|
|
{
|
|
msgQueueClient.reset(new MessageQueueClient(oss.str()));
|
|
}
|
|
catch (const std::exception& ex)
|
|
{
|
|
cerr << "Caught exception when connecting to " << oss.str() << " : " << ex.what() << endl;
|
|
return false;
|
|
}
|
|
catch (...)
|
|
{
|
|
cerr << "Caught exception when connecting to " << oss.str() << " : unknown" << endl;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool SendToWES(Oam& oam, ByteStream bs)
|
|
{
|
|
boost::scoped_ptr<MessageQueueClient> msgQueueClient;
|
|
if (!connectToDBRoot1PM(oam, msgQueueClient))
|
|
return false;
|
|
uint32_t status = RED_STATE_UNDEF;
|
|
msgQueueClient->write(bs);
|
|
|
|
SBS sbs;
|
|
sbs = msgQueueClient->read();
|
|
if (sbs->length() == 0)
|
|
{
|
|
cerr << "WriteEngineServer returned an empty stream. Might be a network error" << endl;
|
|
}
|
|
else if (sbs->length() < 5)
|
|
{
|
|
cerr << "WriteEngineServer returned too few bytes. Refistribute status is unknown" << endl;
|
|
}
|
|
else
|
|
{
|
|
ByteStream::byte wesMsgId;
|
|
*sbs >> wesMsgId;
|
|
*sbs >> status;
|
|
|
|
string msg;
|
|
*sbs >> msg;
|
|
cout << "WriteEngineServer returned status " << status << ": "<< msg << endl;
|
|
}
|
|
return true;
|
|
}
|
|
// vim:ts=4 sw=4:
|
|
|