(file) Return to cimserver.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Server

Diff for /pegasus/src/Server/cimserver.cpp between version 1.79 and 1.198

version 1.79, 2002/10/15 21:41:03 version 1.198, 2007/05/08 18:30:53
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%2006////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // The Open Group, Tivoli Systems  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation, The Open Group.
   // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; Symantec Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 21 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Mike Day (mdday@us.ibm.com)  
 //  
 // Modified By: Karl Schopmeyer (k.schopmeyer@opengroup.org)  
 //  
 // Modified By: Nag Boranna (nagaraja_boranna@hp.com)  
 //  
 // Modified By: Jenny Yu (jenny_yu@hp.com)  
 //  
 // Modified By: 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)  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
 // //
 // Notes on deamon operation (Unix) and service operation (Win 32):  // Notes on daemon operation (Unix) and service operation (Win 32):
 // //
 // To run pegasus as a daemon on Unix platforms: // To run pegasus as a daemon on Unix platforms:
 // //
Line 71 
Line 64 
 // To START the Pegasus service, // To START the Pegasus service,
 // //
 // net start cimserver // net start cimserver
   // or
   // cimserver -start
 // //
 // To STOP the Pegasus service, // To STOP the Pegasus service,
 // //
 // net stop cimserver // net stop cimserver
   // or
   // cimserver -stop
 // //
 // Alternatively, you can use the windows service manager. Pegasus shows up // Alternatively, you can use the windows service manager. Pegasus shows up
 // in the service database as "Pegasus CIM Object Manager" // in the service database as "Pegasus CIM Object Manager"
 // //
 // Mike Day, mdday@us.ibm.com  
 //  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
  
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
 #include <Pegasus/Common/Constants.h> #include <Pegasus/Common/Constants.h>
 #include <iostream>  #include <Pegasus/Common/PegasusAssert.h>
 #include <cassert>  
 #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/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
 #include <Pegasus/Common/System.h> #include <Pegasus/Common/System.h>
 #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/Tracer.h>
   #include <Pegasus/Common/LanguageParser.h>
 #include <Pegasus/Config/ConfigManager.h> #include <Pegasus/Config/ConfigManager.h>
 #include <Pegasus/Client/CIMClient.h> #include <Pegasus/Client/CIMClient.h>
 #include <Pegasus/Server/ShutdownService.h>  #include <Pegasus/Server/CIMServer.h>
 #include <Pegasus/Common/Destroyer.h>  #include <Service/ServerProcess.h>
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)  #include <Service/ServerShutdownClient.h>
 #include <slp/slp.h>  #include <Service/ServerRunStatus.h>
   
   #if defined(PEGASUS_OS_OS400)
   #  include "vfyptrs.cinc"
   #  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_WINDOWS)  #if defined(PEGASUS_OS_TYPE_UNIX)
 # include "cimserver_windows.cpp"  
 #elif defined(PEGASUS_OS_TYPE_UNIX)  
 # if defined(PEGASUS_OS_OS400) # if defined(PEGASUS_OS_OS400)
 #  include "cimserver_os400.cpp"  #  include <unistd.cleinc>
 # else # else
 #  include "cimserver_unix.cpp"  #  include <unistd.h>
 #endif #endif
 #else  # include <sys/types.h>
 # error "Unsupported platform"  # include <sys/stat.h>
   # include <fcntl.h>
 #endif #endif
  
 PEGASUS_USING_PEGASUS; PEGASUS_USING_PEGASUS;
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
   #define PEGASUS_PROCESS_NAME "cimserver"
   
   //Windows service variables are not defined elsewhere in the product
   //enable ability to override these
   #ifndef PEGASUS_SERVICE_NAME
   #define PEGASUS_SERVICE_NAME "Pegasus CIM Object Manager";
   #endif
   #ifndef PEGASUS_SERVICE_DESCRIPTION
   #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
   #endif
   
   class CIMServerProcess : public ServerProcess
   {
   public:
   
       CIMServerProcess(void)
       {
           cimserver_set_process(this);
       }
   
       virtual ~CIMServerProcess(void)
       {
       }
   
       //defined in PegasusVersion.h
       virtual const char* getProductName() const
       {
           return PEGASUS_PRODUCT_NAME;
       }
   
       virtual const char* getExtendedName() const
       {
           return PEGASUS_SERVICE_NAME;
       }
   
       virtual const char* getDescription() const
       {
           return PEGASUS_SERVICE_DESCRIPTION;
       }
   
       //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
       {
           return PEGASUS_PRODUCT_VERSION;
       }
   
       virtual const char* getProcessName() const
       {
           return PEGASUS_PROCESS_NAME;
       }
   
       //defined in Constants.h
       virtual const char* getPIDFileName() const
       {
           return PEGASUS_CIMSERVER_START_FILE;
       }
   
       int cimserver_run(
           int argc,
           char** argv,
           Boolean shutdownOption,
           Boolean debugOutputOption);
   
       void cimserver_stop(void);
   };
   
   ServerRunStatus _serverRunStatus(
       PEGASUS_PROCESS_NAME, PEGASUS_CIMSERVER_START_FILE);
   AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
   static CIMServer* _cimServer = 0;
   static Monitor* _monitor = 0;
   static Thread* dummyInitialThread = 0;
 // //
 //  The command name. //  The command name.
 // //
Line 142 
Line 226 
  
 static const char OPTION_SHUTDOWN    = 's'; static const char OPTION_SHUTDOWN    = 's';
  
 #if defined(PEGASUS_OS_HPUX)  static const char   LONG_HELP []  = "help";
 static const char OPTION_BINDVERBOSE = 'X';  
 #endif  static const char   LONG_VERSION []  = "version";
   
   static const char OPTION_DEBUGOUTPUT = 'X';
  
 static const String PROPERTY_TIMEOUT = "shutdownTimeout"; static const String PROPERTY_TIMEOUT = "shutdownTimeout";
 static const String CIMSERVERSTART_FILE = "/etc/opt/wbem/cimserver_start.conf";  
  
 ConfigManager*    configManager; ConfigManager*    configManager;
  
 /** GetOptions function - This function defines the Options Table /** GetOptions function - This function defines the Options Table
     and sets up the options from that table using the config manager.     and sets up the options from that table using the config manager.
   
       Some possible exceptions:  NoSuchFile, FileNotReadable, CannotRenameFile,
       ConfigFileSyntaxError, UnrecognizedConfigProperty, InvalidPropertyValue,
       CannotOpenFile.
 */ */
 void GetOptions( void GetOptions(
     ConfigManager* cm,     ConfigManager* cm,
     int& argc,     int& argc,
     char** argv,     char** argv,
     const String& pegasusHome)      Boolean shutdownOption)
 {  
     try  
     {  
         cm->mergeConfigFiles();  
   
         cm->mergeCommandLine(argc, argv);  
     }  
     catch (NoSuchFile nsf)  
     {  
         throw nsf;  
     }  
     catch (FileNotReadable fnr)  
     {  
         throw fnr;  
     }  
     catch (CannotRenameFile ftrf)  
     {  
         throw ftrf;  
     }  
     catch (ConfigFileSyntaxError cfse)  
     {     {
         throw cfse;      if (shutdownOption)
     }  
     catch(UnrecognizedConfigProperty ucp)  
     {     {
         throw ucp;          cm->loadConfigFiles();
     }     }
     catch(InvalidPropertyValue ipv)      else
     {     {
         throw ipv;          cm->mergeConfigFiles();
     }     }
   
       // Temporarily disable updates to the current configuration
       // file if shutdownOption is true
       cm->useConfigFiles = (shutdownOption==false);
   
       cm->mergeCommandLine(argc, argv);
   
       // Enable updates again
       cm->useConfigFiles = true;
 } }
  
 /* PrintHelp - This is temporary until we expand the options manager to allow /* PrintHelp - This is temporary until we expand the options manager to allow
Line 198 
Line 274 
 */ */
 void PrintHelp(const char* arg0) void PrintHelp(const char* arg0)
 { {
     /**  
         Build the usage string for the config command.  
     */  
     String usage = String (USAGE);     String usage = String (USAGE);
     usage.append (COMMAND_NAME);     usage.append (COMMAND_NAME);
     usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");     usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");
     usage.append ("  options\n");     usage.append ("  options\n");
     usage.append ("    -v          - displays CIM Server version number\n");      usage.append ("    -v, --version   - displays CIM Server version number\n");
     usage.append ("    -h          - prints this help message\n");      usage.append ("    -h, --help      - prints this help message\n");
     usage.append ("    -s          - shuts down CIM Server\n");     usage.append ("    -s          - shuts down CIM Server\n");
 #ifndef PEGASUS_OS_HPUX  #if !defined(PEGASUS_USE_RELEASE_DIRS)
     usage.append ("    -D [home]   - sets pegasus home directory\n");     usage.append ("    -D [home]   - sets pegasus home directory\n");
 #endif #endif
 #if defined(PEGASUS_OS_TYPE_WINDOWS) #if defined(PEGASUS_OS_TYPE_WINDOWS)
     usage.append ("    -install    - installs pegasus as a Windows NT Service\n");      usage.append ("    -install [name] - installs pegasus as a Windows Service\n");
     usage.append ("    -remove     - removes pegasus as a Windows NT Service\n");      usage.append ("                      [name] is optional and overrides the\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 ("                      [name] is optional and overrides the\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 ("                      [name] is optional and overrides the\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 ("                      [name] is optional and overrides the\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;
 #if defined(PEGASUS_OS_HPUX)      cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getCompleteVersion() << endl;
     cout << PLATFORM_PRODUCT_NAME << " " << PLATFORM_PRODUCT_VERSION << endl;      cout << endl;
   
   #if defined(PEGASUS_OS_TYPE_WINDOWS)
       MessageLoaderParms parms("src.Server.cimserver.MENU.WINDOWS", usage);
   #elif defined(PEGASUS_USE_RELEASE_DIRS)
       MessageLoaderParms parms("src.Server.cimserver.MENU.HPUXLINUXIA64GNU", usage);
 #else #else
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;      MessageLoaderParms parms("src.Server.cimserver.MENU.STANDARD", usage);
 #endif #endif
     cout << endl;      cout << MessageLoader::getMessage(parms) << endl;
     cout << usage << endl;  
 } }
  
 void shutdownCIMOM(Uint32 timeoutValue)  //This needs to be called at various points in the code depending on the platform and error conditions.
   //We need to delete the _cimServer reference on exit in order for the destructors to get called.
   void deleteCIMServer()
 { {
     //      if (_cimServer)
     // Create CIMClient object  
     //  
     CIMClient client;  
   
     //  
     // Get local host name  
     //  
     String hostStr = System::getHostName();  
   
     //  
     // open connection to CIMOM  
     //  
     try  
     {     {
         client.connectLocal();          delete _cimServer;
           _cimServer = 0;
  
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // set client timeout to 2 seconds          //  Remove the PID file to indicate CIMServer termination
         //         //
         client.setTimeout(2000);          FileSystem::removeFile(_cimServerProcess->getPIDFileName());
     }  
     catch(Exception& e)  
     {  
         PEGASUS_STD(cerr) << "Unable to connect to CIM Server." << PEGASUS_STD(endl);  
         PEGASUS_STD(cerr) << "CIM Server may not be running." << PEGASUS_STD(endl);  
 #ifdef PEGASUS_OS_OS400  
         // The server job may still be active but not responding.  
         // Kill the job if it exists.  
         cimserver_kill();  
 #endif #endif
         exit(0);  
     }  
   
     try  
     {  
         //  
         // construct CIMObjectPath  
         //  
         String referenceStr = "//";  
         referenceStr.append(hostStr);  
         referenceStr.append("/");  
         referenceStr.append(PEGASUS_NAMESPACENAME_SHUTDOWN.getString());  
         referenceStr.append(":");  
         referenceStr.append(PEGASUS_CLASSNAME_SHUTDOWN.getString());  
         CIMObjectPath reference(referenceStr);  
   
         //  
         // issue the invokeMethod request on the shutdown method  
         //  
         Array<CIMParamValue> inParams;  
         Array<CIMParamValue> outParams;  
   
         // set force option to true for now  
         inParams.append(CIMParamValue("force",  
             CIMValue(Boolean(true))));  
   
         inParams.append(CIMParamValue("timeout",  
             CIMValue(Uint32(timeoutValue))));  
   
         CIMValue retValue = client.invokeMethod(  
             PEGASUS_NAMESPACENAME_SHUTDOWN,  
             reference,  
             "shutdown",  
             inParams,  
             outParams);  
     }  
     catch(CIMException& e)  
     {  
         PEGASUS_STD(cerr) << "Failed to shutdown server: ";  
         if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)  
         {  
             PEGASUS_STD(cerr) << "The repository may be empty.";  
             PEGASUS_STD(cerr) << PEGASUS_STD(endl);  
         }         }
         else      delete _monitor;
      if (dummyInitialThread)
         {         {
             PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);          Thread::clearLanguages();
           delete dummyInitialThread;
         }         }
 #ifdef PEGASUS_OS_OS400  
         // Kill the server job.  
         cimserver_kill();  
 #endif  
         exit(1);  
     }     }
     catch(Exception& e)  
     {  
         //  
         // This may mean the CIM Server has been terminated and returns a  
         // "Empty HTTP response message" HTTP error response.  To be sure  
         // CIM Server gets shutdown, if CIM Server is still running at  
         // this time, we will kill the cimserver process.  
         //  
         // give CIM Server some time to finish up  
         //  
         //System::sleep(1);  
         //cimserver_kill();  
  
   // l10n
         //         //
         // Check to see if CIMServer is still running.  If CIMServer  // Dummy function for the Thread object associated with the initial thread.
         // is still running and the shutdown timeout has not expired,  // Since the initial thread is used to process CIM requests, this is
         // loop and wait one second until either CIM Server is  // needed to localize the exceptions thrown during CIM request processing.
         // terminated or until timeout expires.  If timeout expires  // Note: This function should never be called!
         // and CIMServer is still running, kill the CIMServer  
         // process.  
         //         //
         Uint32 maxWaitTime = timeoutValue - 2;  ThreadReturnType PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm)
         Boolean running = isCIMServerRunning();  
         while ( running && maxWaitTime > 0 )  
         {         {
             System::sleep(1);     return((ThreadReturnType)0);
             running = isCIMServerRunning();  
             maxWaitTime = maxWaitTime - 1;  
         }  
   
         if (running)  
         {  
             cimserver_kill();  
         }  
     }  
     //catch(Exception& e)  
     //{  
     //    PEGASUS_STD(cerr) << "Error occurred while stopping the CIM Server: ";  
     //    PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);  
     //    exit(1);  
     //}  
   
     return;  
 } }
  
  
Line 366 
Line 363 
 ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
 int main(int argc, char** argv) int main(int argc, char** argv)
 { {
     String pegasusHome  = String::EMPTY;      String pegasusHome;
     Boolean pegasusIOLog = false;  
     String httpPort = String::EMPTY;  
     String httpsPort = String::EMPTY;  
     String logsDirectory = String::EMPTY;  
     Boolean useSLP = false;  
     Boolean useSSL = false;  
     Boolean daemonOption = false;  
     Boolean shutdownOption = false;     Boolean shutdownOption = false;
     Uint32 timeoutValue  = 0;      Boolean debugOutputOption = false;
   
   //l10n
   // Set Message loading to process locale
   MessageLoader::_useProcessLocale = true;
   //l10n
   
   //l10n
   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
   setlocale(LC_ALL, "");
   #endif
  
 #ifdef PEGASUS_OS_OS400 #ifdef PEGASUS_OS_OS400
   
     VFYPTRS_INCDCL;               // VFYPTRS local variables
   
     // verify pointers
     #pragma exception_handler (qsyvp_excp_hndlr,qsyvp_excp_comm_area,\
       0,_C2_MH_ESCAPE)
       for( int arg_index = 1; arg_index < argc; arg_index++ ){
       VFYPTRS(VERIFY_SPP_NULL(argv[arg_index]));
       }
     #pragma disable_handler
   
       // Convert the args to ASCII
       for(Uint32 i = 0;i< argc;++i)
       {
       EtoA(argv[i]);
       }
   
     // Initialize Pegasus home to the shipped OS/400 directory.     // Initialize Pegasus home to the shipped OS/400 directory.
     pegasusHome = OS400_DEFAULT_PEGASUS_HOME;     pegasusHome = OS400_DEFAULT_PEGASUS_HOME;
 #endif #endif
  
   
   #ifndef PEGASUS_OS_TYPE_WINDOWS
     //     //
     // Get environment variables:     // Get environment variables:
     //     //
   #ifdef PEGASUS_OS_OS400
   #pragma convert(37)
       const char* tmp = getenv("PEGASUS_HOME");
   #pragma convert(0)
       char home[256] = {0};
       if (tmp && strlen(tmp) < 256)
       {
       strcpy(home, tmp);
       EtoA(home);
       pegasusHome = home;
       }
   #else
     #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
       pegasusHome = AIX_RELEASE_PEGASUS_HOME;
     #elif !defined(PEGASUS_USE_RELEASE_DIRS) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
     const char* tmp = getenv("PEGASUS_HOME");     const char* tmp = getenv("PEGASUS_HOME");
  
     if (tmp)     if (tmp)
     {     {
         pegasusHome = tmp;         pegasusHome = tmp;
     }     }
     #endif
   #endif
  
     FileSystem::translateSlashes(pegasusHome);     FileSystem::translateSlashes(pegasusHome);
   #else
  
     // on Windows NT if there are no command-line options, run as a service    // windows only
     //setHome(pegasusHome);
     pegasusHome = _cimServerProcess->getHome();
   #endif
  
     if (argc == 1 )  
     {  
       cim_server_service(argc, argv);  
     }  
     else  
     {  
         // Get help, version, and shutdown options         // Get help, version, and shutdown options
  
         for (int i = 1; i < argc; )         for (int i = 1; i < argc; )
         {         {
             const char* arg = argv[i];             const char* arg = argv[i];
               if(String::equal(arg,"--help"))
               {
                       PrintHelp(argv[0]);
                       exit(0);
               }
               else if(String::equal(arg,"--version"))
               {
                   cout << _cimServerProcess->getCompleteVersion() << endl;
                   exit(0);
               }
             // Check for -option             // Check for -option
             if (*arg == '-')              else if (*arg == '-')
             {             {
                 // Get the option                 // Get the option
                 const char* option = arg + 1;                 const char* option = arg + 1;
Line 417 
Line 460 
                 //                 //
                 // Check to see if user asked for the version (-v option):                 // Check to see if user asked for the version (-v option):
                 //                 //
                 if (*option == OPTION_VERSION)                  if (*option == OPTION_VERSION &&
                       strlen(option) == 1)
                 {                 {
 #if defined(PEGASUS_OS_HPUX)                      cout << _cimServerProcess->getCompleteVersion() << endl;
                     cout << PLATFORM_PRODUCT_VERSION << endl;  
 #else  
                     cout << PEGASUS_VERSION << endl;  
 #endif  
                     exit(0);                     exit(0);
                 }                 }
                 //                 //
                 // Check to see if user asked for help (-h option):                 // Check to see if user asked for help (-h option):
                 //                 //
                 else if (*option == OPTION_HELP)                  else if (*option == OPTION_HELP &&
                           (strlen(option) == 1))
                 {                 {
                     PrintHelp(argv[0]);                     PrintHelp(argv[0]);
                     exit(0);                     exit(0);
                 }                 }
 #ifndef PEGASUS_OS_HPUX  #if !defined(PEGASUS_USE_RELEASE_DIRS)
                 else if (*option == OPTION_HOME)                  else if (*option == OPTION_HOME &&
                           (strlen(option) == 1))
                 {                 {
                     if (i + 1 < argc)                     if (i + 1 < argc)
                     {                     {
Line 443 
Line 485 
                     }                     }
                     else                     else
                     {                     {
                         cout << "Missing argument for option -" << option << endl;                          //l10n
                           //cout << "Missing argument for option -" << option << endl;
                           String opt(option);
                           MessageLoaderParms parms("src.Server.cimserver.MISSING_ARGUMENT",
                                            "Missing argument for option -$0",
                                            opt);
                           cout << MessageLoader::getMessage(parms) << endl;
                         exit(0);                         exit(0);
                     }                     }
  
Line 451 
Line 499 
                     argc -= 2;                     argc -= 2;
                 }                 }
 #endif #endif
 #if defined(PEGASUS_OS_HPUX)  
                 //                 //
                 // Check to see if user asked for the version (-X option):                  // Check to see if user asked for debug output (-X option):
                 //                 //
                 if (*option == OPTION_BINDVERBOSE)                  else if (*option == OPTION_DEBUGOUTPUT &&
                           (strlen(option) == 1))
                 {                 {
                       MessageLoaderParms parms(
                           "src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
                           "Unsupported debug output option is enabled.");
                       cout << MessageLoader::getMessage(parms) << endl;
   
                       debugOutputOption = true;
   
   #if defined(PEGASUS_OS_HPUX)
                     System::bindVerbose = true;                     System::bindVerbose = true;
                     cout << "Unsupported debug option, BIND_VERBOSE, enabled."  #endif
                          << endl;  
                     // remove the option from the command line                     // remove the option from the command line
                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
                     argc--;                     argc--;
                 }                 }
 #endif  
                 //                 //
                 // Check to see if user asked for shutdown (-s option):                 // Check to see if user asked for shutdown (-s option):
                 //                 //
                 else if (*option == OPTION_SHUTDOWN)                  else if (*option == OPTION_SHUTDOWN &&
                           (strlen(option) == 1))
                 {                 {
                     //                     //
                     // check to see if user is root  
                     //  
 #ifndef PEGASUS_OS_OS400  
                     if (!System::isPrivilegedUser(System::getEffectiveUserName()))  
                     {  
                         cout << "You must have superuser privilege to run ";  
                         cout << "cimserver." << endl;  
                         exit(0);  
                     }  
 #endif  
   
                     //  
                     // Check to see if shutdown has already been specified:                     // Check to see if shutdown has already been specified:
                     //                     //
                     if (shutdownOption)                     if (shutdownOption)
                     {                     {
                         cout << "Duplicate shutdown option specified." << endl;                          //l10n
                           //cout << "Duplicate shutdown option specified." << endl;
                           MessageLoaderParms parms("src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",
                                                    "Duplicate shutdown option specified.");
   
                           cout << MessageLoader::getMessage(parms) << endl;
                         exit(0);                         exit(0);
                     }                     }
  
Line 503 
Line 552 
             else             else
                 i++;                 i++;
         }         }
     }  
  
     //     //
     // Set the value for pegasusHome property     // Set the value for pegasusHome property
Line 511 
Line 559 
     ConfigManager::setPegasusHome(pegasusHome);     ConfigManager::setPegasusHome(pegasusHome);
  
     //     //
     // Get an instance of the Config Manager.      // Do the platform specific run
     //     //
     configManager = ConfigManager::getInstance();  
  
     //      return _cimServerProcess->platform_run(
     // Get options (from command line and from configuration file); this          argc, argv, shutdownOption, debugOutputOption);
     // removes corresponding options and their arguments from the command  
     // line.  
     //  
     try  
     {  
         GetOptions(configManager, argc, argv, pegasusHome);  
     }     }
     catch (Exception& e)  
   void CIMServerProcess::cimserver_stop()
     {     {
         cerr << argv[0] << ": " << e.getMessage() << endl;      _cimServer->shutdownSignal();
         exit(1);  
     }     }
  
     try  
     {  
         //         //
         // Check to see if we should (can) install as a NT service  // The main, common, running code
   //
   // NOTE: Do NOT call exit().  Use return(), otherwise some platforms
   // will fail to shutdown properly/cleanly.
   //
   // TODO: Current change minimal for platform "service" shutdown bug fixes.
   // Perhaps further extract out common stuff and put into main(), put
   // daemon stuff into platform specific platform_run(), etc.
   // Note: make sure to not put error handling stuff that platform
   // specific runs may need to deal with better (instead of exit(), etc).
         //         //
  
         if (String::equal(configManager->getCurrentValue("install"), "true"))  int CIMServerProcess::cimserver_run(
         {      int argc,
             if( 0 != cimserver_install_nt_service( pegasusHome ))      char** argv,
       Boolean shutdownOption,
       Boolean debugOutputOption)
             {             {
                 cout << "\nPegasus installed as NT Service";      String logsDirectory;
                 exit(0);      Boolean daemonOption = false;
             }  
         }  
  
         //         //
         // Check to see if we should (can) remove Pegasus as an NT service      // Get an instance of the Config Manager.
         //         //
       configManager = ConfigManager::getInstance();
       configManager->useConfigFiles = true;
  
         if (String::equal(configManager->getCurrentValue("remove"), "true"))  #ifdef PEGASUS_OS_OS400
         {      // In a special startup case for IBM OS400, when the server is
             if( 0 != cimserver_remove_nt_service() )      // automatically started when the machine starts up the config
       // file cannot be read because of access restrictions for the
       // user starting the server.  In this case, we need to skip
       // reading the config options and therefore any use of the config
       // manager also.  To make this determinations we will check to see
       // if the daemon flag is set to true.  If so, then there will be a
       // series of checks to bracket all the calls to the configManager
       // which would otherwise fail.  All this will only be done for
       // IBM OS400.
   
       Boolean os400StartupOption = false;
       // loop through args to check for daemon=true
       for (int i=1; i < argc; i++)
         if (strcmp(argv[i], "daemon=true") == 0)
             {             {
                 cout << "\nPegasus removed as NT Service";          os400StartupOption = true;
                 exit(0);          daemonOption = true;
             }             }
   
       if (!os400StartupOption)
       {
           // If this is the server job, then set the job
           // to save the job log.
           system ("QSYS/CHGJOB JOB(*) LOG(4 00 *SECLVL)");
         }         }
   #endif
  
         //         //
         // Check to see if we should Pegasus as a daemon      // Get options (from command line and from configuration file); this
       // removes corresponding options and their arguments from the command
       // line.
         //         //
       try
         if (String::equal(configManager->getCurrentValue("daemon"), "true"))  
         {         {
             daemonOption = true;  #ifdef PEGASUS_OS_OS400
       if (os400StartupOption == false)
   #endif
           // If current process is "cimserver -s" (shutdown option = true) the contents
           // of current config should not be overwriten by planned config
           GetOptions(configManager, argc, argv, shutdownOption);
         }         }
       catch (Exception& e)
       {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started:  $0", e.getMessage());
  
         //  #if !defined(PEGASUS_OS_OS400)
         // Check the log trace options and set global variable          MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
         //              "cimserver not started: $0", e.getMessage());
  
         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))          PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
         {              << PEGASUS_STD(endl);
             pegasusIOLog = true;  #endif
   
           return(1);
         }         }
  
         // Get the log file directory definition.  // l10n
         // We put String into Cstring because      // Set the home directory, msg sub-dir, into the MessageLoader.
         // Directory functions only handle Cstring.      // This will be the default directory where the resource bundles
         // ATTN-KS: create String based directory functions.      // are found.
       MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
           ConfigManager::getInstance()->getCurrentValue("messageDir")));
  
         logsDirectory = configManager->getCurrentValue("logdir");  #ifdef PEGASUS_OS_OS400
       // Still need to declare and set the connection variables.
       // Will initialize to false since they are fixed at false for OS400.
   
       // NOTE:  OS400 is a LOCAL_DOMAIN_SOCKET, so a few lines down
       // the test will not be compiled in.  If OS400 ever turns off that
       // define, then we will need to change this code path to insure that
       // one of the variables is true.
       Boolean enableHttpConnection = false;
       Boolean enableHttpsConnection = false;
   
       if (os400StartupOption == false)
       {
         enableHttpConnection = ConfigManager::parseBooleanValue(
             configManager->getCurrentValue("enableHttpConnection"));
         enableHttpsConnection = ConfigManager::parseBooleanValue(
             configManager->getCurrentValue("enableHttpsConnection"));
       }
   #else
       Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
           configManager->getCurrentValue("enableHttpConnection"));
       Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
           configManager->getCurrentValue("enableHttpsConnection"));
   #endif
   
       // Make sure at least one connection is enabled
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
       if (!enableHttpConnection && !enableHttpsConnection)
       {
           //l10n
           //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               //"Neither HTTP nor HTTPS connection is enabled.  "
               //"CIMServer will not be started.");
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
               "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
           //cerr << "Neither HTTP nor HTTPS connection is enabled.  "
               //"CIMServer will not be started." << endl;
           MessageLoaderParms parms("src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
                                    "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
           cerr << MessageLoader::getMessage(parms) << endl;
           return(1);
       }
   #endif
   
       try
       {
           //
           // Check to see if we should start Pegasus as a daemon
           //
   
           daemonOption = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("daemon"));
   
   #ifdef PEGASUS_OS_OS400
       if (os400StartupOption == false)
       {
   #endif
   #if !defined(PEGASUS_USE_SYSLOGS)
         logsDirectory =         logsDirectory =
             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
   #endif
   #ifdef PEGASUS_OS_OS400
       }  // end if (os400StartupOption == false)
   #endif
  
         // Set up the Logger. This does not open the logs         // Set up the Logger. This does not open the logs
         // Might be more logical to clean before set.         // Might be more logical to clean before set.
         // ATTN: Need tool to completely disable logging.         // ATTN: Need tool to completely disable logging.
  
 #ifndef PEGASUS_OS_HPUX  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
   !defined(PEGASUS_OS_OS400) && !defined(PEGASUS_USE_SYSLOGS)
         Logger::setHomeDirectory(logsDirectory);         Logger::setHomeDirectory(logsDirectory);
 #endif #endif
  
Line 600 
Line 748 
         {         {
             String configTimeout =             String configTimeout =
                 configManager->getCurrentValue("shutdownTimeout");                 configManager->getCurrentValue("shutdownTimeout");
             timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);              Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);
   // To deregister Pegasus with SLP
             shutdownCIMOM(timeoutValue);  #ifdef PEGASUS_SLP_REG_TIMEOUT
               unregisterPegasusFromSLP();
             cout << "CIM Server stopped." << endl;  #endif
             exit(0);  
         }  
  
         //              ServerShutdownClient serverShutdownClient(&_serverRunStatus);
         // Get the port numbers              serverShutdownClient.shutdown(timeoutValue);
         //  
  
         httpPort = configManager->getCurrentValue("httpPort");  #ifdef PEGASUS_OS_OS400
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
               "src.Server.cimserver.SERVER_STOPPED",
               "CIM Server stopped.");
               cimserver_exitRC(0);
   #else
               MessageLoaderParms parms(
                   "src.Server.cimserver.SERVER_STOPPED",
                   "CIM Server stopped.");
  
         httpsPort = configManager->getCurrentValue("httpsPort");              cout << MessageLoader::getMessage(parms) << endl;
               return(0);
   #endif
           }
  
   #if defined(PEGASUS_DEBUG) && !defined(PEGASUS_USE_SYSLOGS)
         // Leave this in until people get familiar with the logs.         // Leave this in until people get familiar with the logs.
 #ifndef PEGASUS_OS_HPUX          MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
         cout << "Logs Directory = " << logsDirectory << endl;                                   "Logs Directory = ");
           cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
 #endif #endif
   
         if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))  
         {  
             Logger::clean(logsDirectory);;  
         }         }
       catch (UnrecognizedConfigProperty& e)
         if (String::equal(configManager->getCurrentValue("slp"), "true"))      {
           // UnrecognizedConfigProperty is already translated
           // thus, just output the message
           Logger::put(Logger::ERROR_LOG,
                       System::CIMSERVER,
                       Logger::SEVERE,
                       e.getMessage());
   #ifndef PEGASUS_OS_OS400
           cout << e.getMessage() << endl;
   #endif
       }
       catch (Exception& ex)
         {         {
             useSLP =  true;          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_USE_RELEASE_CONFIG_OPTIONS)  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) && defined(PEGASUS_ZOS_SECURITY)
         Boolean enableHttpConnection = String::equal(      startupCheckBPXServer(true);
             configManager->getCurrentValue("enableHttpConnection"), "true");      startupCheckProfileCIMSERVclassWBEM();
         Boolean enableHttpsConnection = String::equal(      startupEnableMSC();
             configManager->getCurrentValue("enableHttpsConnection"), "true");  #endif
   
       // 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.
       // 2) If the user did not specify a port, get the port from the services file.
       // 3) If no value is specified in the services file, use the IANA WBEM default port.
       // Note that 2 and 3 are done within the System::lookupPort method
       // An empty string from the ConfigManager implies that the user did not specify a port.
   
       Uint32 portNumberHttps=0;
       Uint32 portNumberHttp=0;
       Uint32 portNumberExportHttps=0;
  
         if (enableHttpConnection && enableHttpsConnection)      if (enableHttpsConnection)
         {         {
             Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::WARNING,          String httpsPort = configManager->getCurrentValue("httpsPort");
                 "Enabling both HTTP and HTTPS connections is unsupported.  "          if (httpsPort == String::EMPTY)
                 "Only the HTTPS connection is enabled.");  
             cerr << "Enabling both HTTP and HTTPS connections is unsupported.  "  
                 "Only the HTTPS connection is enabled." << endl;  
         }  
         else if (!enableHttpConnection && !enableHttpsConnection)  
         {         {
             Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::WARNING,              //
                 "Neither HTTP nor HTTPS connection is enabled.  "              // Look up the WBEM-HTTPS port number
                 "CIMServer will not be started.");              //
             cerr << "Neither HTTP nor HTTPS connection is enabled.  "              portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
                 "CIMServer will not be started." << endl;  
             exit(1);  
         }  
   
         useSSL = enableHttpsConnection;  
  
 #else          } else
         if (String::equal(configManager->getCurrentValue("SSL"), "true"))  
         {         {
             useSSL =  true;              //
         }              // user-specified
               //
               CString portString = httpsPort.getCString();
               char* end = 0;
               portNumberHttps = strtol(portString, &end, 10);
               if(!(end != 0 && *end == '\0'))
               {
                   InvalidPropertyValue e("httpsPort", httpsPort);
                   Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                                 "src.Server.cimserver.SERVER_NOT_STARTED",
                                 "cimserver not started:  $0", e.getMessage());
   #if !defined(PEGASUS_OS_OS400)
                   MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
                                            "cimserver not started: $0", e.getMessage());
                   PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
                                     << PEGASUS_STD(endl);
 #endif #endif
                   exit(1);
               }
     }     }
     catch (UnrecognizedConfigProperty e)  
     {  
         cout << "Error: " << e.getMessage() << endl;  
     }     }
  
     Uint32 portNumber;      if (enableHttpConnection)
       {
     char address[32];          String httpPort = configManager->getCurrentValue("httpPort");
           if (httpPort == String::EMPTY)
     if (useSSL)  
     {     {
         char* end = 0;  
         CString portString = httpsPort.getCString();  
         Uint32 port = strtol(portString, &end, 10);  
         assert(end != 0 && *end == '\0');  
   
         //         //
         // Look up the WBEM-HTTPS port number              // Look up the WBEM-HTTP port number
         //         //
         portNumber = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, port);              portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
         sprintf(address, "%u", portNumber);  
     }  
     else  
     {  
         char* end = 0;  
         CString portString = httpPort.getCString();  
         Uint32 port = strtol(portString, &end, 10);  
         assert(end != 0 && *end == '\0');  
  
           } else
           {
         //         //
         // Look up the WBEM-HTTP port number              // user-specified
         //         //
         portNumber = System::lookupPort(WBEM_HTTP_SERVICE_NAME, port);              CString portString = httpPort.getCString();
         sprintf(address, "%u", portNumber);              char* end = 0;
               portNumberHttp = strtol(portString, &end, 10);
               if(!(end != 0 && *end == '\0'))
               {
                   InvalidPropertyValue e("httpPort", httpPort);
                   Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                                 "src.Server.cimserver.SERVER_NOT_STARTED",
                                 "cimserver not started:  $0", e.getMessage());
   #if !defined(PEGASUS_OS_OS400)
                   MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
                                                "cimserver not started: $0", e.getMessage());
                   PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
                                     << PEGASUS_STD(endl);
   #endif
                   exit(1);
     }     }
           }
       }
   #if defined(PEGASUS_DEBUG)
     // Put out startup up message.     // Put out startup up message.
 #ifndef PEGASUS_OS_HPUX      cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getCompleteVersion() << endl;
     cout << PEGASUS_NAME << PEGASUS_VERSION <<      //l10n
          " on port " << address << endl;      //cout << "Built " << __DATE__ << " " << __TIME__ << endl;
     cout << "Built " << __DATE__ << " " << __TIME__ << endl;      //cout <<"Starting..."
     cout <<"Starting..."      MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
          << (pegasusIOLog ? " Tracing to Log ": " ")                               "Built $0 $1\nStarting...",
          << (useSLP ? " SLP reg. " : " No SLP ")                               __DATE__,
          << (useSSL ? " Use SSL " : " No SSL ")                               __TIME__);
         << endl;  #endif
 #endif  
   //l10n
   // reset message loading to NON-process locale
   MessageLoader::_useProcessLocale = false;
   //l10n
   
       // Get the parent's PID before forking
       _serverRunStatus.setParentPid(System::getPID());
  
     // do we need to run as a daemon ?     // do we need to run as a daemon ?
     if (daemonOption)     if (daemonOption)
     {     {
         if(-1 == cimserver_fork())          if(-1 == _cimServerProcess->cimserver_fork())
           exit(-1);  #ifndef PEGASUS_OS_OS400
       {
           return(-1);
       }
   #else
       {
               return(-1);
       }
       else
       {
           return(0);
       }
   #endif
   
     }     }
  
   // l10n
       // Now we are after the fork...
       // Create a dummy Thread object that can be used to store the
       // AcceptLanguageList object for CIM requests that are serviced
       // by this thread (initial thread of server).  Need to do this
       // because this thread is not in a ThreadPool, but is used
       // to service CIM requests.
       // The run function for the dummy Thread should never be called,
       dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
       Thread::setCurrent(dummyInitialThread);
       AcceptLanguageList default_al;
       try{
            default_al = LanguageParser::getDefaultAcceptLanguages();
            Thread::setLanguages(new AcceptLanguageList(default_al));
       }catch(InvalidAcceptLanguageHeader& e){
             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                     "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
                     "Could not convert the system process locale into a valid AcceptLanguage format.");
             Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                                e.getMessage());
       }
   
   
   
 #ifdef PEGASUS_OS_OS400 #ifdef PEGASUS_OS_OS400
     // Special server initialization code for OS/400.     // Special server initialization code for OS/400.
     if (cimserver_initialize() != 0)     if (cimserver_initialize() != 0)
     {     {
        // do some logging here!        // do some logging here!
        exit(-1);      //l10n
       //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               //"CIM Server failed to initialize");
       Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                     "src.Server.cimserver.SERVER_FAILED_TO_INITIALIZE",
                     "CIM Server failed to initialize");
       return(-1);
     }     }
 #endif #endif
  
 #ifdef PEGASUS_OS_HPUX  #ifndef PEGASUS_OS_TYPE_WINDOWS
     umask(S_IWGRP|S_IWOTH);      umask(S_IRWXG|S_IRWXO);
   #endif
   
   
   #if defined(PEGASUS_OS_TYPE_UNIX)
     //
     // CRITICAL SECTION BEGIN
     //
     // This is the beginning of the critical section regarding the
     // access to pidfile (file to indicate that the cimserver has started).
     // Sometimes, when 2 or more cimserver processes are started at the same
     // time, they can't detect the concurrent process execution because the
     // logic fails when pidfile is accessed concurrently.
   
     FILE *startupLockFile;
   
     if ((startupLockFile = fopen(ConfigManager::getHomedPath(
             CIMSERVER_LOCK_FILE).getCString(), "w")) != 0)
     {
         lockf(fileno(startupLockFile), F_LOCK, 0);
     }
   #endif
   
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_OS_SOLARIS) || defined (PEGASUS_OS_VMS)
  
     //     //
     // check if CIMServer is already running     // check if CIMServer is already running
     // if CIMServer is already running, print message and     // if CIMServer is already running, print message and
     // notify parent process (if there is a parent process) to terminate     // notify parent process (if there is a parent process) to terminate
     //     //
     if(isCIMServerRunning())      if (_serverRunStatus.isServerRunning())
     {     {
         cout << "Unable to start CIMServer." << endl;          MessageLoaderParms parms(
         cout << "CIMServer is already running." << endl;              "src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
               "Unable to start CIMServer. CIMServer is already running.");
           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 (daemonOption)         if (daemonOption)
                 notify_parent();          {
               _cimServerProcess->notify_parent(1);
           }
  
         exit(1);          return 1;
     }     }
  
 #endif #endif
Line 755 
Line 1027 
     // try loop to bind the address, and run the server     // try loop to bind the address, and run the server
     try     try
     {     {
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)          _monitor = new Monitor();
         slp_client *discovery = new slp_client() ;;          _cimServer = new CIMServer(_monitor);
         String serviceURL;  
         serviceURL.assign("service:cim.pegasus://");          if (enableHttpConnection)
         String host_name = slp_get_host_name();          {
         serviceURL.append(host_name);              _cimServer->addAcceptor(false, portNumberHttp, false);
         serviceURL.append(":");  
         serviceURL.append(address);              Logger::put_l(
 #endif                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
         Monitor monitor(true);                  "Listening on HTTP port $0.", portNumberHttp);
         CIMServer server(&monitor, useSSL);          }
   
         // bind throws an exception if the bind fails          if (enableHttpsConnection)
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET          {
         cout << "Binding to domain socket" << endl;              _cimServer->addAcceptor(false, portNumberHttps, true);
 #elif !defined(PEGASUS_OS_HPUX)  
         cout << "Binding to " << address << endl;              Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                   "Listening on HTTPS port $0.", portNumberHttps);
           }
   
   #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           _cimServer->addAcceptor(true, 0, false);
   
           Logger::put_l(
               Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
               "src.Server.cimserver.LISTENING_ON_LOCAL",
               "Listening on local connection socket.");
 #endif #endif
  
         server.bind(portNumber);  #if defined(PEGASUS_DEBUG)
           if (enableHttpConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                   "Listening on HTTP port $0.", portNumberHttp);
               cout << MessageLoader::getMessage(parms) << endl;
           }
           if (enableHttpsConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                   "Listening on HTTPS port $0.", portNumberHttps);
               cout << MessageLoader::getMessage(parms) << endl;
           }
   
   # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           MessageLoaderParms parms(
               "src.Server.cimserver.LISTENING_ON_LOCAL",
               "Listening on local connection socket.");
           cout << MessageLoader::getMessage(parms) << endl;
   # endif
   #endif
  
           _cimServer->bind();
         // notify parent process (if there is a parent process) to terminate         // notify parent process (if there is a parent process) to terminate
         // so user knows that cimserver is ready to serve CIM requests.          // so user knows that there is cimserver ready to serve CIM requests.
         if (daemonOption)         if (daemonOption)
                 notify_parent();          {
               _cimServerProcess->notify_parent(0);
         time_t last = 0;          }
  
 #if defined(PEGASUS_OS_HPUX)  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) || \
       defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // create a file to indicate that the cimserver has started and         // create a file to indicate that the cimserver has started and
         // save the process id of the cimserver process in the file         // save the process id of the cimserver process in the file
         //         //
           _serverRunStatus.setServerRunning();
   #endif
  
         // remove the old file if it exists  #if defined(PEGASUS_DEBUG)
         System::removeFile(fname);      cout << "Started. " << endl;
   #endif
  
         // open the file  #if defined(PEGASUS_OS_TYPE_UNIX)
         FILE *pid_file = fopen(fname, "w");      //
         if (pid_file)      // CRITICAL SECTION END
       //
       // Here is the unlock of file 'lock_file'. It closes the
       // the critical section that guarantees the non concurrent access to
       // pid file (file to indicate that the cimserver has started).
       //
   
       if (startupLockFile)
         {         {
             // save the pid in the file         lockf(fileno(startupLockFile), F_ULOCK, 0);
             fprintf(pid_file, "%ld\n", (long)server_pid);         fclose(startupLockFile);
             fclose(pid_file);  
         }         }
 #endif #endif
 #ifndef PEGASUS_OS_HPUX  
         cout << "Started. " << endl;  
 #endif  
  
         // Put server started message to the logger         // Put server started message to the logger
 #ifdef PEGASUS_OS_HPUX          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,              Logger::INFORMATION,
                     "Started $0 version $1 on port $2.",              "src.Server.cimserver.STARTED_VERSION",
                     PLATFORM_PRODUCT_NAME, PLATFORM_PRODUCT_VERSION, address);              "Started $0 version $1.",
 #else                        _cimServerProcess->getProductName(), _cimServerProcess->getCompleteVersion());
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
                     "Started $0 version $1 on port $2.",  #if defined(PEGASUS_OS_TYPE_UNIX) && !defined(PEGASUS_OS_ZOS)
                     PEGASUS_NAME, PEGASUS_VERSION, address);          if (daemonOption && !debugOutputOption)
           {
               // Direct standard input, output, and error to /dev/null,
               // since we are running as a daemon.
               close(0);
               open("/dev/null", O_RDONLY);
               close(1);
               open("/dev/null", O_RDWR);
               close(2);
               open("/dev/null", O_RDWR);
           }
 #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
         //         //
         while( !server.terminated() )      while( !_cimServer->terminated() )
         {         {
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)  
           if(useSLP  )  
           {  
             if(  (time(NULL) - last ) > 60 )  
             {  
               if( discovery != NULL && serviceURL.size() )  
                 discovery->srv_reg_all(serviceURL.getCString(),  
                                        "(namespace=root/cimv2)",  
                                        "service:cim.pegasus",  
                                        "DEFAULT",  
                                        70) ;  
               time(&last);  
             }  
  
             discovery->service_listener();        _cimServer->runForever();
           }  
 #endif  
           server.runForever();  
         }         }
  
         //         //
         // 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(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
             "$0 stopped.", PEGASUS_NAME);              Logger::INFORMATION, "src.Server.cimserver.STOPPED",
               "$0 stopped.", _cimServerProcess->getProductName());
  
 #if defined(PEGASUS_OS_HPUX)  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // close the file created at startup time to indicate that the          //  Note: do not remove the PID file created at startup time, since
         // cimserver has terminated normally.          //  shutdown is not complete until the CIMServer destructor completes.
         //         //
         FileSystem::removeFile(CIMSERVERSTART_FILE);  
 #endif #endif
     }     }
     catch(Exception& e)      catch(BindFailedException& e)
     {     {
         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);          Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started:  $0", e.getMessage());
   
   #if !defined(PEGASUS_OS_OS400)
           MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started: $0", e.getMessage());
   
           cerr << MessageLoader::getMessage(parms) << endl;
   #endif
  
         //         //
         // notify parent process (if there is a parent process) to terminate         // notify parent process (if there is a parent process) to terminate
         //         //
         if (daemonOption)         if (daemonOption)
                 notify_parent();                  _cimServerProcess->notify_parent(1);
  
           deleteCIMServer();
           return 1;
       }
       catch(Exception& e)
       {
       Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               "src.Server.cimserver.ERROR",
               "Error: $0", e.getMessage());
   #ifndef PEGASUS_OS_OS400
       MessageLoaderParms parms("src.Server.cimserver.ERROR",
                                "Error: $0", e.getMessage());
       PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
   #endif
           //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
                   _cimServerProcess->notify_parent(1);
   
           deleteCIMServer();
         return 1;         return 1;
     }     }
  
       deleteCIMServer();
     return 0;     return 0;
 } }
   


Legend:
Removed from v.1.79  
changed lines
  Added in v.1.198

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2