version 1.179, 2006/01/30 16:19:33
|
version 1.192, 2007/02/23 18:56:32
|
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// Author: Mike Brasher (mbrasher@bmc.com) |
|
// |
|
// Modified By: Mike Day (mdday@us.ibm.com) |
|
// Karl Schopmeyer (k.schopmeyer@opengroup.org) |
|
// Nag Boranna (nagaraja_boranna@hp.com) |
|
// Jenny Yu (jenny_yu@hp.com) |
|
// Sushma Fernandes (sushma_fernandes@hp.com) |
|
// Carol Ann Krug Graves, Hewlett-Packard Company |
|
// (carolann_graves@hp.com) |
|
// Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com) |
|
// Dave Rosckes (rosckes@us.ibm.com) |
|
// Humberto Rivero (hurivero@us.ibm.com) |
|
// Steve Hills (steve.hills@ncr.com) |
|
// Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com) |
|
// Amit K Arora, IBM (amitarora@in.ibm.com) - pep 167 |
|
// Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2555 |
|
// Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2032 |
|
// Heather Sterling, IBM (hsterl@us.ibm.com) - PEP#222 |
|
// Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#3452 |
|
// David Dillard, VERITAS Software Corp. |
|
// (david.dillard@veritas.com) |
|
// Aruran, IBM (ashanmug@in.ibm.com) for Bug# 4183 |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
| |
|
|
# include "OS400ConvertChar.h" | # include "OS400ConvertChar.h" |
#endif | #endif |
| |
|
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) |
|
#include <Service/ARM_zOS.h> |
|
# ifdef PEGASUS_ZOS_SECURITY |
|
// This include file will not be provided in the OpenGroup CVS for now. |
|
// Do NOT try to include it in your compile |
|
# include <Pegasus/Common/safCheckzOS_inline.h> |
|
# endif |
|
#endif |
|
|
#if defined(PEGASUS_OS_TYPE_UNIX) | #if defined(PEGASUS_OS_TYPE_UNIX) |
# if defined(PEGASUS_OS_OS400) | # if defined(PEGASUS_OS_OS400) |
# include <unistd.cleinc> | # include <unistd.cleinc> |
|
|
} | } |
| |
//defined in PegasusVersion.h | //defined in PegasusVersion.h |
|
virtual const char* getCompleteVersion() const |
|
{ |
|
if (*PEGASUS_PRODUCT_STATUS == '\0' ) |
|
return PEGASUS_PRODUCT_VERSION; |
|
else |
|
return PEGASUS_PRODUCT_VERSION " " PEGASUS_PRODUCT_STATUS; |
|
} |
|
|
|
//defined in PegasusVersion.h |
virtual const char* getVersion() const | virtual const char* getVersion() const |
{ | { |
return PEGASUS_PRODUCT_VERSION; | return PEGASUS_PRODUCT_VERSION; |
|
|
return PEGASUS_PROCESS_NAME; | return PEGASUS_PROCESS_NAME; |
} | } |
| |
//defined in ConfigFileDir.h |
//defined in Constants.h |
virtual const char* getPIDFileName() const | virtual const char* getPIDFileName() const |
{ | { |
return CIMSERVER_START_FILE; |
return PEGASUS_CIMSERVER_START_FILE; |
} | } |
| |
int cimserver_run( | int cimserver_run( |
|
|
usage.append (" -install [name] - installs pegasus as a Windows Service\n"); | usage.append (" -install [name] - installs pegasus as a Windows Service\n"); |
usage.append (" [name] is optional and overrides the\n"); | usage.append (" [name] is optional and overrides the\n"); |
usage.append (" default CIM Server Service Name\n"); | usage.append (" default CIM Server Service Name\n"); |
|
usage.append (" by appending [name]\n"); |
usage.append (" -remove [name] - removes pegasus as a Windows Service\n"); | usage.append (" -remove [name] - removes pegasus as a Windows Service\n"); |
usage.append (" [name] is optional and overrides the\n"); | usage.append (" [name] is optional and overrides the\n"); |
usage.append (" default CIM Server Service Name\n"); | usage.append (" default CIM Server Service Name\n"); |
|
usage.append (" by appending [name]\n"); |
usage.append (" -start [name] - starts pegasus as a Windows Service\n"); | usage.append (" -start [name] - starts pegasus as a Windows Service\n"); |
usage.append (" [name] is optional and overrides the\n"); | usage.append (" [name] is optional and overrides the\n"); |
usage.append (" default CIM Server Service Name\n"); | usage.append (" default CIM Server Service Name\n"); |
|
usage.append (" by appending [name]\n"); |
usage.append (" -stop [name] - stops pegasus as a Windows Service\n"); | usage.append (" -stop [name] - stops pegasus as a Windows Service\n"); |
usage.append (" [name] is optional and overrides the\n"); | usage.append (" [name] is optional and overrides the\n"); |
usage.append (" default CIM Server Service Name\n\n"); |
usage.append (" default CIM Server Service Name\n"); |
|
usage.append (" by appending [name]\n\n"); |
#endif | #endif |
usage.append (" configProperty=value\n"); | usage.append (" configProperty=value\n"); |
usage.append (" - sets CIM Server configuration property\n"); | usage.append (" - sets CIM Server configuration property\n"); |
| |
cout << endl; | cout << endl; |
cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl; |
cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getCompleteVersion() << endl; |
cout << endl; | cout << endl; |
| |
#if defined(PEGASUS_OS_TYPE_WINDOWS) | #if defined(PEGASUS_OS_TYPE_WINDOWS) |
|
|
FileSystem::removeFile(_cimServerProcess->getPIDFileName()); | FileSystem::removeFile(_cimServerProcess->getPIDFileName()); |
#endif | #endif |
} | } |
if (_monitor) |
|
{ |
|
delete _monitor; | delete _monitor; |
} |
|
if (dummyInitialThread) | if (dummyInitialThread) |
{ | { |
Thread::clearLanguages(); | Thread::clearLanguages(); |
|
|
// needed to localize the exceptions thrown during CIM request processing. | // needed to localize the exceptions thrown during CIM request processing. |
// Note: This function should never be called! | // Note: This function should never be called! |
// | // |
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm) |
ThreadReturnType PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm) |
{ | { |
return((PEGASUS_THREAD_RETURN)0); |
return((ThreadReturnType)0); |
} | } |
| |
// | // |
|
|
} | } |
else if(String::equal(arg,"--version")) | else if(String::equal(arg,"--version")) |
{ | { |
cout << _cimServerProcess->getVersion() << endl; |
cout << _cimServerProcess->getCompleteVersion() << endl; |
exit(0); | exit(0); |
} | } |
// Check for -option | // Check for -option |
|
|
if (*option == OPTION_VERSION && | if (*option == OPTION_VERSION && |
strlen(option) == 1) | strlen(option) == 1) |
{ | { |
cout << _cimServerProcess->getVersion() << endl; |
cout << _cimServerProcess->getCompleteVersion() << endl; |
exit(0); | exit(0); |
} | } |
// | // |
|
|
// one of the variables is true. | // one of the variables is true. |
Boolean enableHttpConnection = false; | Boolean enableHttpConnection = false; |
Boolean enableHttpsConnection = false; | Boolean enableHttpsConnection = false; |
Boolean enableSSLExportClientVerification = false; |
|
| |
if (os400StartupOption == false) | if (os400StartupOption == false) |
{ | { |
enableHttpConnection = String::equal( |
enableHttpConnection = ConfigManager::parseBooleanValue( |
configManager->getCurrentValue("enableHttpConnection"), "true"); |
configManager->getCurrentValue("enableHttpConnection")); |
enableHttpsConnection = String::equal( |
enableHttpsConnection = ConfigManager::parseBooleanValue( |
configManager->getCurrentValue("enableHttpsConnection"), "true"); |
configManager->getCurrentValue("enableHttpsConnection")); |
enableSSLExportClientVerification = String::equal( |
|
configManager->getCurrentValue("enableSSLExportClientVerification"), "true"); |
|
} | } |
#else | #else |
Boolean enableHttpConnection = String::equal( |
Boolean enableHttpConnection = ConfigManager::parseBooleanValue( |
configManager->getCurrentValue("enableHttpConnection"), "true"); |
configManager->getCurrentValue("enableHttpConnection")); |
Boolean enableHttpsConnection = String::equal( |
Boolean enableHttpsConnection = ConfigManager::parseBooleanValue( |
configManager->getCurrentValue("enableHttpsConnection"), "true"); |
configManager->getCurrentValue("enableHttpsConnection")); |
Boolean enableSSLExportClientVerification = String::equal( |
|
configManager->getCurrentValue("enableSSLExportClientVerification"), "true"); |
|
#endif | #endif |
| |
// Make sure at least one connection is enabled | // Make sure at least one connection is enabled |
|
|
try | try |
{ | { |
// | // |
// Check to see if we should Pegasus as a daemon |
// Check to see if we should start Pegasus as a daemon |
// | // |
| |
if (String::equal(configManager->getCurrentValue("daemon"), "true")) |
daemonOption = ConfigManager::parseBooleanValue( |
{ |
configManager->getCurrentValue("daemon")); |
daemonOption = true; |
|
} |
|
| |
#ifdef PEGASUS_OS_OS400 | #ifdef PEGASUS_OS_OS400 |
if (os400StartupOption == false) | if (os400StartupOption == false) |
|
|
String configTimeout = | String configTimeout = |
configManager->getCurrentValue("shutdownTimeout"); | configManager->getCurrentValue("shutdownTimeout"); |
Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10); | Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10); |
|
// To deregister Pegasus with SLP |
|
#ifdef PEGASUS_SLP_REG_TIMEOUT |
|
unregisterPegasusFromSLP(); |
|
#endif |
| |
shutdownCIMOM(timeoutValue); | shutdownCIMOM(timeoutValue); |
| |
|
|
} | } |
catch (UnrecognizedConfigProperty& e) | catch (UnrecognizedConfigProperty& e) |
{ | { |
|
// UnrecognizedConfigProperty is already translated |
#ifdef PEGASUS_OS_OS400 |
// thus, just output the message |
//l10n |
Logger::put(Logger::ERROR_LOG, |
//Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE, |
System::CIMSERVER, |
//"Error: $0",e.getMessage()); |
Logger::SEVERE, |
Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE, |
|
"src.Server.cimserver.ERROR", |
|
"Error: $0",e.getMessage()); |
|
#else |
|
//l10n |
|
//cout << "Error: " << e.getMessage() << endl; |
|
MessageLoaderParms parms("src.Server.cimserver.ERROR", |
|
"Error: $0", |
|
e.getMessage()); | e.getMessage()); |
cout << MessageLoader::getMessage(parms) << endl; |
#ifndef PEGASUS_OS_OS400 |
|
cout << e.getMessage() << endl; |
#endif | #endif |
} | } |
|
catch (Exception& ex) |
|
{ |
|
Logger::put(Logger::ERROR_LOG, |
|
System::CIMSERVER, |
|
Logger::SEVERE, |
|
ex.getMessage()); |
|
#ifndef PEGASUS_OS_OS400 |
|
cout << ex.getMessage() << endl; |
|
#endif |
|
exit(1); |
|
} |
|
|
|
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) && defined(PEGASUS_ZOS_SECURITY) |
|
startupCheckBPXServer(true); |
|
startupCheckProfileCIMSERVclassWBEM(); |
|
startupEnableMSC(); |
|
#endif |
| |
// Bug 2148 - Here is the order of operations for determining the server HTTP and HTTPS ports. | // Bug 2148 - Here is the order of operations for determining the server HTTP and HTTPS ports. |
// 1) If the user explicitly specified a port, use it. | // 1) If the user explicitly specified a port, use it. |
|
|
} | } |
} | } |
} | } |
|
|
|
|
if (enableSSLExportClientVerification) |
|
{ |
|
// |
|
// No config property is looked up to get the default port number. |
|
// Lookup the port defined in /etc/services for the service name |
|
// wbem-exp-https and bind to that port. If the service is not defined |
|
// then log a warning message and do not start the cimserver. |
|
// |
|
Uint32 port = 0; |
|
|
|
portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port); |
|
|
|
if (portNumberExportHttps == 0) |
|
{ |
|
Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING, |
|
"src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED", |
|
"Port not defined for the service wbem-exp-https. CIMServer will not be started."); |
|
|
|
MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED", |
|
"Port not defined for the service wbem-exp-https. CIMServer will not be started."); |
|
|
|
cerr << MessageLoader::getMessage(parms) << endl; |
|
|
|
return(1); |
|
} |
|
} |
|
#if defined(PEGASUS_DEBUG) | #if defined(PEGASUS_DEBUG) |
// Put out startup up message. | // Put out startup up message. |
cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl; |
cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getCompleteVersion() << endl; |
//l10n | //l10n |
//cout << "Built " << __DATE__ << " " << __TIME__ << endl; | //cout << "Built " << __DATE__ << " " << __TIME__ << endl; |
//cout <<"Starting..." | //cout <<"Starting..." |
|
|
//cout << "Unable to start CIMServer." << endl; | //cout << "Unable to start CIMServer." << endl; |
//cout << "CIMServer is already running." << endl; | //cout << "CIMServer is already running." << endl; |
MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING", | MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING", |
"Unable to start CIMServer.\nCIMServer is already running."); |
"Unable to start CIMServer. CIMServer is already running."); |
PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl); | PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl); |
|
Logger::put(Logger::ERROR_LOG,System::CIMSERVER,Logger::INFORMATION, |
|
MessageLoader::getMessage(parms)); |
| |
// | // |
// notify parent process (if there is a parent process) to terminate | // notify parent process (if there is a parent process) to terminate |
|
|
| |
if (enableHttpConnection) | if (enableHttpConnection) |
{ | { |
_cimServer->addAcceptor(false, portNumberHttp, false, false); |
_cimServer->addAcceptor(false, portNumberHttp, false); |
//l10n | //l10n |
//Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, | //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, |
//"Listening on HTTP port $0.", portNumberHttp); | //"Listening on HTTP port $0.", portNumberHttp); |
|
|
} | } |
if (enableHttpsConnection) | if (enableHttpsConnection) |
{ | { |
_cimServer->addAcceptor(false, portNumberHttps, true, false); |
_cimServer->addAcceptor(false, portNumberHttps, true); |
//l10n | //l10n |
//Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, | //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, |
//"Listening on HTTPS port $0.", portNumberHttps); | //"Listening on HTTPS port $0.", portNumberHttps); |
|
|
"src.Server.cimserver.LISTENING_ON_HTTPS_PORT", | "src.Server.cimserver.LISTENING_ON_HTTPS_PORT", |
"Listening on HTTPS port $0.", portNumberHttps); | "Listening on HTTPS port $0.", portNumberHttps); |
} | } |
if (enableSSLExportClientVerification) |
|
{ |
|
_cimServer->addAcceptor(false, portNumberExportHttps, true, true); |
|
|
|
Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, |
|
"src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT", |
|
"Listening on Export HTTPS port $0.", portNumberExportHttps); |
|
} |
|
| |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
_cimServer->addAcceptor(true, 0, false, false); |
_cimServer->addAcceptor(true, 0, false); |
//l10n | //l10n |
//Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, | //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION, |
//"Listening on local connection socket."); | //"Listening on local connection socket."); |
|
|
"Listening on HTTPS port $0.", portNumberHttps); | "Listening on HTTPS port $0.", portNumberHttps); |
cout << MessageLoader::getMessage(parms) << endl; | cout << MessageLoader::getMessage(parms) << endl; |
} | } |
if (enableSSLExportClientVerification) |
|
{ |
|
MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT", |
|
"Listening on Export HTTPS port $0.", portNumberExportHttps); |
|
|
|
cout << MessageLoader::getMessage(parms) << endl; |
|
} |
|
| |
# ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
//l10n | //l10n |
|
|
Logger::INFORMATION, | Logger::INFORMATION, |
"src.Server.cimserver.STARTED_VERSION", | "src.Server.cimserver.STARTED_VERSION", |
"Started $0 version $1.", | "Started $0 version $1.", |
_cimServerProcess->getProductName(), _cimServerProcess->getVersion()); |
_cimServerProcess->getProductName(), _cimServerProcess->getCompleteVersion()); |
| |
#if defined(PEGASUS_OS_TYPE_UNIX) |
#if defined(PEGASUS_OS_TYPE_UNIX) && !defined(PEGASUS_OS_ZOS) |
if (daemonOption && !debugOutputOption) | if (daemonOption && !debugOutputOption) |
{ | { |
// Direct standard input, output, and error to /dev/null, | // Direct standard input, output, and error to /dev/null, |
|
|
} | } |
#endif | #endif |
| |
|
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) |
|
|
|
// ARM is a z/OS internal restart facility. |
|
// This is a z/OS specific change. |
|
|
|
// Instatiating the automatic restart manager for zOS |
|
ARM_zOS automaticRestartManager; |
|
|
|
// register to zOS ARM |
|
automaticRestartManager.Register(); |
|
|
|
#endif |
|
|
|
|
|
|
// | // |
// Loop to call CIMServer's runForever() method until CIMServer | // Loop to call CIMServer's runForever() method until CIMServer |
// has been shutdown | // has been shutdown |
|
|
// | // |
// normal termination | // normal termination |
// | // |
|
#if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) |
|
|
|
// ARM is a z/OS internal restart facility. |
|
// This is a z/OS specific change. |
|
|
|
// register to zOS ARM |
|
automaticRestartManager.DeRegister(); |
|
|
|
#endif |
| |
// Put server shutdown message to the logger | // Put server shutdown message to the logger |
Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, | Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, |