version 1.41, 2002/03/07 20:03:08
|
version 1.46, 2002/05/13 21:47:11
|
|
|
#include <iostream> | #include <iostream> |
#include <cassert> | #include <cassert> |
#include <cstdlib> | #include <cstdlib> |
|
#include <fstream> |
#include <Pegasus/Common/FileSystem.h> | #include <Pegasus/Common/FileSystem.h> |
#include <Pegasus/Common/Monitor.h> | #include <Pegasus/Common/Monitor.h> |
#include <Pegasus/Server/CIMServer.h> | #include <Pegasus/Server/CIMServer.h> |
|
|
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Config/ConfigManager.h> | #include <Pegasus/Config/ConfigManager.h> |
#include <Pegasus/Client/CIMClient.h> | #include <Pegasus/Client/CIMClient.h> |
#include <Pegasus/Common/HTTPConnector.h> |
|
#include <Pegasus/Server/ShutdownService.h> | #include <Pegasus/Server/ShutdownService.h> |
#include <Pegasus/Common/Destroyer.h> | #include <Pegasus/Common/Destroyer.h> |
#ifndef PEGASUS_OS_ZOS |
#if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) |
#include <slp/slp.h> | #include <slp/slp.h> |
#endif | #endif |
| |
|
|
| |
static const char OPTION_TIMEOUT = 'T'; | static const char OPTION_TIMEOUT = 'T'; |
| |
static const String NAMESPACE = "root/cimv2"; |
static const String NAMESPACE = "root/PG_Internal"; |
static const String CLASSNAME_SHUTDOWNSERVICE = "PG_ShutdownService"; | static const String CLASSNAME_SHUTDOWNSERVICE = "PG_ShutdownService"; |
static const String PROPERTY_TIMEOUT = "operationTimeout"; | static const String PROPERTY_TIMEOUT = "operationTimeout"; |
|
static const String CIMSERVERSTART_FILE = "/etc/wbem/cimserver_start.conf"; |
| |
ConfigManager* configManager; | ConfigManager* configManager; |
| |
|
|
// | // |
// Create CIMClient object | // Create CIMClient object |
// | // |
Monitor* monitor = new Monitor; |
CIMClient client; |
HTTPConnector* httpConnector = new HTTPConnector(monitor); |
|
CIMClient client(monitor, httpConnector); |
|
| |
// | // |
// Get the port number | // Get the port number |
|
|
// | // |
try | try |
{ | { |
client.connect(hostStr.allocateCString()); |
client.connectLocal(); |
} | } |
catch(Exception& e) |
catch(CIMClientException& e) |
{ | { |
Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, | Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, |
"Failed to connect to $0 $1.", PEGASUS_NAME, e.getMessage()); | "Failed to connect to $0 $1.", PEGASUS_NAME, e.getMessage()); |
| |
PEGASUS_STD(cerr) << "Failed to connect to server: " << e.getMessage() << PEGASUS_STD(endl); |
PEGASUS_STD(cerr) << "Failed to connect to server: "; |
exit(1); |
PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl); |
|
exit(0); |
} | } |
| |
try | try |
|
|
"$0 terminated on port $1.", PEGASUS_NAME, portNumberStr); | "$0 terminated on port $1.", PEGASUS_NAME, portNumberStr); |
| |
} | } |
|
catch(CIMClientCIMException& e) |
|
{ |
|
PEGASUS_STD(cerr) << "Failed to shutdown server: "; |
|
PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl); |
|
exit(1); |
|
} |
|
catch(CIMClientException& e) |
|
{ |
|
// |
|
// This may mean the cimserver has been terminated and returns the |
|
// "Empty HTTP response message" HTTP error response. To be sure, |
|
// we need to check if cimserver is indeed terminated. |
|
// |
|
#ifdef PEGASUS_OS_TYPE_UNIX |
|
System::sleep(1); |
|
int ret = system("ps -ef | grep cimserver | grep -v grep | grep -v cimserverd >/dev/null"); |
|
if (ret == 0) |
|
{ |
|
// cimserver has been terminated |
|
// Put server shutdown message to the logger |
|
Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, |
|
"$0 terminated on port $1.", PEGASUS_NAME, portNumberStr); |
|
} |
|
else |
|
{ |
|
// cimserver is still running |
|
PEGASUS_STD(cerr) << "Failed to shutdown server: "; |
|
PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl); |
|
exit(1); |
|
} |
|
#endif |
|
} |
catch(Exception& e) | catch(Exception& e) |
{ | { |
PEGASUS_STD(cerr) << "Failed to shutdown server: " << e.getMessage() << PEGASUS_STD(endl); |
PEGASUS_STD(cerr) << "Failed to shutdown server: "; |
|
PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl); |
exit(1); | exit(1); |
} | } |
| |
|
|
} | } |
| |
shutdownCIMOM(forceOption, timeoutValue); | shutdownCIMOM(forceOption, timeoutValue); |
|
|
cout << "Pegasus CIM Server terminated." << endl; | cout << "Pegasus CIM Server terminated." << endl; |
exit(0); | exit(0); |
} | } |
|
|
// try loop to bind the address, and run the server | // try loop to bind the address, and run the server |
try | try |
{ | { |
#ifndef PEGASUS_OS_ZOS |
#if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) |
slp_client *discovery = new slp_client() ;; | slp_client *discovery = new slp_client() ;; |
String serviceURL; | String serviceURL; |
serviceURL.assign("service:cim.pegasus://"); | serviceURL.assign("service:cim.pegasus://"); |
|
|
| |
time_t last = 0; | time_t last = 0; |
| |
|
#if defined(PEGASUS_OS_HPUX) |
|
// |
|
// create a file to indicate that the cimserver has started |
|
// |
|
fstream fs; |
|
ArrayDestroyer<char> p(CIMSERVERSTART_FILE.allocateCString()); |
|
fs.open(p.getPointer(), ios::in | ios::out); |
|
if (!fs) |
|
{ |
|
// |
|
// failed to create the file, write an entry to the log file |
|
// and proceed |
|
// |
|
Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, |
|
"Failed to open the $0 file needed by cimserverd.", |
|
CIMSERVERSTART_FILE); |
|
} |
|
else |
|
{ |
|
fs.close(); |
|
} |
|
#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 |
// | // |
while( !server.terminated() ) | while( !server.terminated() ) |
{ | { |
#ifndef PEGASUS_OS_ZOS |
#if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) |
if(useSLP ) | if(useSLP ) |
{ | { |
if( (time(NULL) - last ) > 60 ) | if( (time(NULL) - last ) > 60 ) |
|
|
server.runForever(); | server.runForever(); |
} | } |
| |
// This statement is unrechable! |
|
// | // |
// Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, |
// normal termination |
// "Normal Termination"); |
// |
|
Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION, |
|
"Normal Termination"); |
|
|
|
#if defined(PEGASUS_OS_HPUX) |
|
// |
|
// close the file at startup time to indicate that the cimserver |
|
// has terminated normally. |
|
// |
|
FileSystem::removeFile(CIMSERVERSTART_FILE); |
|
#endif |
} | } |
catch(Exception& e) | catch(Exception& e) |
{ | { |