(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.35 and 1.153

version 1.35, 2001/12/13 14:54:56 version 1.153, 2005/03/03 03:09:40
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%2005////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   // 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.
 // //
 // 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 30 
Line 37 
 // //
 // Modified By: Jenny Yu (jenny_yu@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)
   //
   // Modified By: Dave Rosckes (rosckes@us.ibm.com)
   //
   // Modified By: Humberto Rivero (hurivero@us.ibm.com)
   //
   // Modified By: Steve Hills (steve.hills@ncr.com)
   //              Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
   //
   // Modified By: Amit K Arora, IBM (amitarora@in.ibm.com) - pep 167
   //
   // Modified By: Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2555
   //
   // Modified By: Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2032
   //
   // Modified By: Heather Sterling, IBM (hsterl@us.ibm.com) - PEP#222
   //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
Line 37 
Line 64 
 // //
 // Notes on deamon operation (Unix) and service operation (Win 32): // Notes on deamon operation (Unix) and service operation (Win 32):
 // //
 // To run pegasus as a daemon on Unix platforms, use the -d option:  // To run pegasus as a daemon on Unix platforms:
   //
   // cimserver
 // //
 // cimserver -d  // To NOT run pegasus as a daemon on Unix platforms, set the daemon config
   // property to false:
 // //
 // The -d option has no effect on windows operation.  // cimserver daemon=false
   //
   // The daemon config property has no effect on windows operation.
 // //
 // To shutdown pegasus, use the -s option: // To shutdown pegasus, use the -s option:
 // //
 // cimserver -s [-f] [-T timeout_value]  // cimserver -s
 // //
 // To run pegasus as an NT service, there are FOUR  different possibilities: // To run pegasus as an NT service, there are FOUR  different possibilities:
 // //
Line 60 
Line 92 
 // 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"
Line 74 
Line 110 
  
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
   #include <Pegasus/Common/Constants.h>
 #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/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Protocol/Handler.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/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>
 #ifndef PEGASUS_OS_ZOS  #include <Pegasus/Server/CIMServer.h>
 #include <slp/slp.h>  #include <Service/ServerProcess.h>
 #endif  
  
   PEGASUS_USING_PEGASUS;
   PEGASUS_USING_STD;
  
 #if defined(PEGASUS_OS_TYPE_WINDOWS)  #define PEGASUS_PROCESS_NAME "cimserver";
 # include "cimserver_windows.cpp"  
 #elif defined(PEGASUS_OS_TYPE_UNIX)  //Windows service variables are not defined elsewhere in the product
 # include "cimserver_unix.cpp"  //enable ability to override these
 #else  #ifndef PEGASUS_SERVICE_NAME
 # error "Unsupported platform"  #define PEGASUS_SERVICE_NAME "Pegasus CIM Object Manager";
   #endif
   #ifndef PEGASUS_SERVICE_DESCRIPTION
   #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
 #endif #endif
  
 PEGASUS_USING_PEGASUS;  class CIMServerProcess : public ServerProcess
 PEGASUS_USING_STD;  {
   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* getVersion() const
       {
           return PEGASUS_PRODUCT_VERSION;
       }
   
       virtual const char* getProcessName() const
       {
           return PEGASUS_PROCESS_NAME;
       }
   
       //defined in ConfigFileDir.h
       virtual const char* getPIDFileName() const
       {
           return CIMSERVER_START_FILE;
       }
   
       int cimserver_run(int argc, char** argv, bool shutdownOption);
   
       void cimserver_stop(void);
   };
   
   AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
   static CIMServer* _cimServer = 0;
  
 // //
 //  The command name. //  The command name.
Line 126 
Line 216 
  
 static const char OPTION_SHUTDOWN    = 's'; static const char OPTION_SHUTDOWN    = 's';
  
 static const char OPTION_FORCE       = 'f';  static const char   LONG_HELP []  = "help";
   
 static const char OPTION_TIMEOUT     = 'T';  
  
 static const String NAMESPACE = "root/cimv2";  static const char   LONG_VERSION []  = "version";
 static const String CLASSNAME_SHUTDOWNSERVICE = "PG_ShutdownService";  
 static const String PROPERTY_TIMEOUT = "timeout";  
  
 ConfigManager*    configManager;  #if defined(PEGASUS_OS_HPUX)
   static const char OPTION_BINDVERBOSE = 'X';
 void GetEnvironmentVariables(  #endif
     const char* arg0,  
     String& pegasusHome)  
 {  
     // Get environment variables:  
   
     const char* tmp = getenv("PEGASUS_HOME");  
   
     if (!tmp)  
     {  
         cerr << arg0 << ": PEGASUS_HOME environment variable undefined" << endl;  
         exit(1);  
     }  
   
     pegasusHome = tmp;  
     FileSystem::translateSlashes(pegasusHome);  
 }  
   
 void SetEnvironmentVariables(  
     const char* arg0)  
 {  
     cout << "PEGASUS_HOME is now " << arg0 << endl;  
  
     String str = "PEGASUS_HOME=";  static const String PROPERTY_TIMEOUT = "shutdownTimeout";
     str += arg0;  
     char* tmp = str.allocateCString();  
     putenv(tmp);  
  
     // Note: don't delete tmp! putenv() uses it.  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.
Line 173 
Line 234 
 void GetOptions( void GetOptions(
     ConfigManager* cm,     ConfigManager* cm,
     int& argc,     int& argc,
     char** argv,      char** argv)
     const String& pegasusHome)  
 { {
     String currentFile = pegasusHome + "/" + CURRENT_CONFIG_FILE;  
     String plannedFile = pegasusHome + "/" + PLANNED_CONFIG_FILE;  
   
     try     try
     {     {
         cm->mergeConfigFiles(currentFile, plannedFile);          cm->mergeConfigFiles();
  
         cm->mergeCommandLine(argc, argv);         cm->mergeCommandLine(argc, argv);
     }     }
     catch (NoSuchFile nsf)      catch (NoSuchFile&)
     {     {
         throw nsf;          throw;
     }     }
     catch (FileNotReadable fnr)      catch (FileNotReadable&)
     {     {
         throw fnr;          throw;
     }     }
     catch (CannotRenameFile ftrf)      catch (CannotRenameFile&)
     {     {
         throw ftrf;          throw;
     }     }
     catch (ConfigFileSyntaxError cfse)      catch (ConfigFileSyntaxError&)
     {     {
         throw cfse;          throw;
     }     }
     catch(UnrecognizedConfigProperty ucp)      catch(UnrecognizedConfigProperty&)
     {     {
         throw ucp;          throw;
     }     }
     catch(InvalidPropertyValue ipv)      catch(InvalidPropertyValue&)
     {     {
         throw ipv;          throw;
       }
       catch (CannotOpenFile&)
       {
           throw;
     }     }
 } }
  
Line 217 
Line 278 
 */ */
 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 pegasus 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");
   #if !defined(PEGASUS_USE_RELEASE_DIRS)
     usage.append ("    -D [home]   - sets pegasus home directory\n");     usage.append ("    -D [home]   - sets pegasus home directory\n");
     usage.append ("    -t          - turns tracing on\n");  #endif
     usage.append ("    -t          - turns on trace of client IO to console\n");  #if defined(PEGASUS_OS_TYPE_WINDOWS)
     usage.append ("    -l          - turns on trace of client IO to trace file\n");      usage.append ("    -install [name] - installs pegasus as a Windows Service\n");
     usage.append ("    -d          - runs pegasus as a daemon\n");      usage.append ("                      [name] is optional and overrides the\n");
     usage.append ("    -s [-f] [-T timeout] \n");      usage.append ("                      default CIM Server Service Name\n");
     usage.append ("                - shuts down pegasus\n");      usage.append ("    -remove [name]  - removes pegasus as a Windows Service\n");
     usage.append ("    -cleanlogs  - clears the log files at startup\n");      usage.append ("                      [name] is optional and overrides the\n");
     usage.append ("    -install    - installs pegasus as a Windows NT Service\n");      usage.append ("                      default CIM Server Service Name\n");
     usage.append ("    -remove     - removes pegasus as a Windows NT Service\n");      usage.append ("    -start [name]   - starts pegasus as a Windows Service\n");
     usage.append ("    -slp        - registers pegasus as a service with SLP\n\n");      usage.append ("                      [name] is optional and overrides the\n");
     usage.append ("    -SSL        - uses SSL\n\n");      usage.append ("                      default CIM Server Service 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\n");
   #endif
     usage.append ("  configProperty=value\n");     usage.append ("  configProperty=value\n");
     usage.append ("    port=nnnn            - sets port number to listen on\n");      usage.append ("                    - sets CIM Server configuration property\n");
     usage.append ("    home=/pegasus/bin    - sets pegasus home directory\n");  
     usage.append ("    logdir=/pegasus/logs - directory for log files\n");  
  
     cout << endl;     cout << endl;
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;      cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;
     cout << endl;     cout << endl;
     cout << usage << 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
       MessageLoaderParms parms("src.Server.cimserver.MENU.STANDARD", usage);
   #endif
       cout << MessageLoader::getMessage(parms) << endl;
 } }
  
 void shutdownCIMOM(Boolean forceOption, String timeoutStr)  // l10n
   //
   // Dummy function for the Thread object associated with the initial thread.
   // Since the initial thread is used to process CIM requests, this is
   // needed to localize the exceptions thrown during CIM request processing.
   // Note: This function should never be called!
   //
   PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm)
   {
      return((PEGASUS_THREAD_RETURN)0);
   }
   
   void shutdownCIMOM(Uint32 timeoutValue)
 { {
     //     //
     // 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 local host name
     //     //
     String portNumberStr = configManager->getCurrentValue("port");  
   
     String hostStr = System::getHostName();     String hostStr = System::getHostName();
     hostStr.append(":");  
     hostStr.append(portNumberStr);  
  
     //     //
     // open connection to CIMOM     // open connection to CIMOM
     //     //
     try     try
     {     {
         client.connect(hostStr.allocateCString());          client.connectLocal();
   
           //
           // set client timeout to 2 seconds
           //
           client.setTimeout(2000);
     }     }
     catch(Exception& e)      catch(Exception&)
     {     {
         PEGASUS_STD(cerr) << "Failed to connect to server: " << e.getMessage() << PEGASUS_STD(endl);  #ifdef PEGASUS_OS_OS400
       //l10n
       //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               //"Unable to connect to CIM Server.  CIM Server may not be running." );
       Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",
               "Unable to connect to CIM Server.  CIM Server may not be running." );
       // The server job may still be active but not responding.
       // Kill the job if it exists.
       if(_cimServerProcess->cimserver_kill(0) == -1)
          _cimServerProcess->cimserver_exitRC(2);
       _cimServerProcess->cimserver_exitRC(1);
   #else
           //l10n
           //PEGASUS_STD(cerr) << "Unable to connect to CIM Server." << PEGASUS_STD(endl);
           //PEGASUS_STD(cerr) << "CIM Server may not be running." << PEGASUS_STD(endl);
           MessageLoaderParms parms("src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",
                                                            "Unable to connect to CIM Server.\nCIM Server may not be running.\n");
           PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);
         exit(1);         exit(1);
   #endif
     }     }
  
     try     try
     {     {
         //         //
         // construct CIMReference          // construct CIMObjectPath
         //         //
         String referenceStr = "//";         String referenceStr = "//";
         referenceStr.append(hostStr);         referenceStr.append(hostStr);
         referenceStr.append("/root/cimv2:PG_ShutdownService");          referenceStr.append("/");
         CIMReference reference(referenceStr);          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         // issue the invokeMethod request on the shutdown method
Line 297 
Line 399 
         Array<CIMParamValue> inParams;         Array<CIMParamValue> inParams;
         Array<CIMParamValue> outParams;         Array<CIMParamValue> outParams;
  
         if (forceOption)          // set force option to true for now
         {          inParams.append(CIMParamValue("force",
             inParams.append(CIMParamValue(              CIMValue(Boolean(true))));
                 CIMParameter("force", CIMType::STRING),  
                 CIMValue("TRUE")));  
         }  
         else  
         {  
             inParams.append(CIMParamValue(  
                 CIMParameter("force", CIMType::STRING),  
                 CIMValue("FALSE")));  
         }  
  
         inParams.append(CIMParamValue(          inParams.append(CIMParamValue("timeout",
             CIMParameter("timeout", CIMType::STRING),              CIMValue(Uint32(timeoutValue))));
             CIMValue(timeoutStr)));  
  
         CIMValue retValue = client.invokeMethod(         CIMValue retValue = client.invokeMethod(
             NAMESPACE,              PEGASUS_NAMESPACENAME_SHUTDOWN,
             reference,             reference,
             "shutdown",             "shutdown",
             inParams,             inParams,
             outParams);             outParams);
     }     }
     catch(Exception& e)      catch(CIMException& e)
     {     {
         PEGASUS_STD(cerr) << "Failed to shutdown server: " << e.getMessage() << PEGASUS_STD(endl);  #ifdef PEGASUS_OS_OS400
   
       if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
       {
           //l10n
           //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               //"Failed to shutdown server: $0", "The repository may be empty.");
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",
               "Error in server shutdown: The repository may be empty.");
       }
       else
       {
           //l10n
           //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               //"Failed to shutdown server: $0", e.getMessage());
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SHUTDOWN_FAILED",
               "Error in server shutdown: $0", e.getMessage());
       }
       // Kill the server job.
       if(_cimServerProcess->cimserver_kill(0) == -1)
          _cimServerProcess->cimserver_exitRC(2);
   #else
           //l10n - TODO
           MessageLoaderParms parms("src.Server.cimserver.SHUTDOWN_FAILED",
                                    "Error in server shutdown: ");
           PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);
           if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
           {
               //
               // Repository may be empty.
               //
               //l10n - TODO
               Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                   "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",
                   "Error in server shutdown: The repository may be empty.");
               MessageLoaderParms parms("src.Server.cimserver.REPOSITORY_EMPTY",
                                        "The repository may be empty.");
               PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
           }
           else
           {
               //l10n - TODO
               Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                   "src.Server.cimserver.SHUTDOWN_FAILED",
                   "Error in server shutdown: $0", e.getMessage());
               PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);
           }
   
       // Kill the cimserver process
       if (_cimServerProcess->cimserver_kill(0) == 0)
           {
               //l10n - TODO
               Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                   "src.Server.cimserver.SERVER_FORCED_SHUTDOWN",
               "Forced shutdown initiated.");
               MessageLoaderParms parms("src.Server.cimserver.SERVER_FORCED_SHUTDOWN",
                                        "Forced shutdown initiated.");
               PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
           }
         exit(1);         exit(1);
   #endif
       }
       catch(Exception&)
       {
           //
           // This may mean that the CIM Server has terminated, causing this
           // client to get a "Empty HTTP response message" exception.  It may
           // also mean that the CIM Server is taking longer than 2 seconds
           // (client timeout value) to terminate, causing this client to
           // timeout with a "connection timeout" exception.
           //
           // Check to see if CIM Server is still running.  If CIM Server
           // is still running and the shutdown timeout has not expired,
           // loop and wait one second until either the CIM Server is
           // terminated or timeout expires.  If timeout expires and
           // the CIM Server is still running, kill the CIMServer process.
           //
           Uint32 maxWaitTime = timeoutValue - 2;
           Boolean running = _cimServerProcess->isCIMServerRunning();
           while ( running && maxWaitTime > 0 )
           {
               System::sleep(1);
               running = _cimServerProcess->isCIMServerRunning();
               maxWaitTime = maxWaitTime - 1;
           }
   
           if (running)
           {
          int kill_rc = _cimServerProcess->cimserver_kill(0);
   
   #ifdef PEGASUS_OS_OS400
           if(kill_rc == -1)
           _cimServerProcess->cimserver_exitRC(2);
           _cimServerProcess->cimserver_exitRC(1);
   #endif
   
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \
   || defined (PEGASUS_OS_VMS)
           if (kill_rc != -1)
               {
                   //l10n - TODO
                   Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                       "src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",
                       "Shutdown timeout expired.  Forced shutdown initiated.");
                   MessageLoaderParms parms("src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",
                       "Shutdown timeout expired.  Forced shutdown initiated.");
                   cout << MessageLoader::getMessage(parms) << endl;
                   exit(0);
               }
   #endif
           }
     }     }
  
     return;     return;
Line 337 
Line 541 
 int main(int argc, char** argv) int main(int argc, char** argv)
 { {
     String pegasusHome  = String::EMPTY;     String pegasusHome  = String::EMPTY;
     Boolean pegasusIOTrace = false;  
     Boolean pegasusIOLog = false;  
     String portOption = String::EMPTY;  
     String logsDirectory = String::EMPTY;  
     Boolean useSLP = false;  
     Boolean useSSL = false;  
     Boolean daemonOption = false;  
     Boolean shutdownOption = false;     Boolean shutdownOption = false;
     Boolean forceOption = false;  
     Boolean timeoutOption = false;  
     String  timeoutStr  = String::EMPTY;  
     long timeoutValue  = 0;  
  
     // on Windows NT if there are no command-line options, run as a service  //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
   
     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
  
     if (argc == 1 )      // Convert the args to ASCII
       for(Uint32 i = 0;i< argc;++i)
     {     {
       cim_server_service(argc, argv);      EtoA(argv[i]);
     }     }
     else  
       // Initialize Pegasus home to the shipped OS/400 directory.
       pegasusHome = OS400_DEFAULT_PEGASUS_HOME;
   #endif
   
   
   #ifndef PEGASUS_OS_TYPE_WINDOWS
       //
       // 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)
       const char* tmp = getenv("PEGASUS_HOME");
   
       if (tmp)
     {     {
         // Get help, version and home options          pegasusHome = tmp;
       }
     #endif
   #endif
   
       FileSystem::translateSlashes(pegasusHome);
   #else
   
     // windows only
     //setHome(pegasusHome);
     pegasusHome = _cimServerProcess->getHome();
   #endif
   
           // 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->getVersion() << 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 373 
Line 636 
                 //                 //
                 // 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)
                 {                 {
                     cout << PEGASUS_VERSION << endl;                      cout << _cimServerProcess->getVersion() << endl;
                     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);
                 }                 }
                 else if (*option == OPTION_HOME)  #if !defined(PEGASUS_USE_RELEASE_DIRS)
                   else if (*option == OPTION_HOME &&
                           (strlen(option) == 1))
                 {                 {
                     if (i + 1 < argc)                     if (i + 1 < argc)
                     {                     {
                         pegasusHome.assign(argv[i + 1]);                         pegasusHome.assign(argv[i + 1]);
                         SetEnvironmentVariables(argv[i + 1]);  
                     }                     }
                     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);
                     }                     }
  
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));
                     argc -= 2;                     argc -= 2;
                 }                 }
   #endif
   #if defined(PEGASUS_OS_HPUX)
                 //                 //
                 // Check to see if user asked for shutdown (-s option):                  // Check to see if user asked for the version (-X option):
                 //  
                 else if (*option == OPTION_SHUTDOWN)  
                 {  
                     //  
                     // Check to see if shutdown has already been specified:  
                     //                     //
                     if (shutdownOption)                  if (*option == OPTION_BINDVERBOSE &&
                           (strlen(option) == 1))
                     {                     {
                         cout << "Duplicate shutdown option specified." << endl;              System::bindVerbose = true;
                         exit(0);                      //l10n
                     }                      //cout << "Unsupported debug option, BIND_VERBOSE, enabled."
                     shutdownOption = true;                           //<< endl;
                       MessageLoaderParms parms("src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
                                            "Unsupported debug option, BIND_VERBOSE, enabled.");
                       cout << MessageLoader::getMessage(parms) << 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--;
                 }                 }
                 else if (*option == OPTION_FORCE)  #endif
                 {  
                     //                     //
                     // Check to see if shutdown has been specified:                  // Check to see if user asked for shutdown (-s option):
                     //                     //
                     if (!shutdownOption)                  else if (*option == OPTION_SHUTDOWN &&
                           (strlen(option) == 1))
                     {                     {
                         cout << "Invalid option -" << option << endl;  
                         exit(0);  
                     }  
   
                     //                     //
                     // Check to see if force has already been specified:                      // Check to see if shutdown has already been specified:
                     //                     //
                     if (forceOption)                      if (shutdownOption)
                     {                     {
                         cout << "Duplicate force 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);
                     }                     }
  
                     forceOption = true;                      shutdownOption = true;
  
                     // 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--;
                 }                 }
                 else if (*option == OPTION_TIMEOUT)                  else
                 {                      i++;
                     //  
                     // Check to see if shutdown has been specified:  
                     //  
                     if (!shutdownOption)  
                     {  
                         cout << "Invalid option -" << option << endl;  
                         exit(0);  
                     }                     }
               else
                     if (timeoutOption)                  i++;
                     {  
                         cout << "Duplicate timeout option specified." << endl;  
                         exit(0);  
                     }                     }
  
                     timeoutOption = true;      //
       // Set the value for pegasusHome property
                     if (i + 1 < argc)      //
                     {      ConfigManager::setPegasusHome(pegasusHome);
                         // get timeout value  
                         timeoutStr.assign(argv[i + 1]);  
  
                         // validate timeout value string      //
                         char* tmp = timeoutStr.allocateCString();      // Do the plaform specific run
                         char* end = 0;      //
                         timeoutValue  = strtol(tmp, &end, 10);  
  
                         if (!end || *end != '\0')      return _cimServerProcess->platform_run( argc, argv, shutdownOption );
                         {  
                             cout << "invalid timeout value specified: ";  
                             cout << timeoutStr << endl;  
                             delete [] tmp;  
                             exit(0);  
                         }  
                     }                     }
                     else  
   void CIMServerProcess::cimserver_stop()
                     {                     {
                         cout << "Missing argument for option -";      _cimServer->shutdownSignal();
                         cout << option << endl;  
                         exit(0);  
                     }                     }
  
                     // remove the option from the command line  //
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));  // The main, common, running code
                     argc -= 2;  //
                 }  // NOTE: Do NOT call exit().  Use return(), otherwise some platforms
                 else  // will fail to shutdown properly/cleanly.
                     i++;  //
             }  // TODO: Current change minimal for platform "service" shutdown bug fixes.
             else  // Perhpas further extract out common stuff and put into main(), put
                 i++;  // 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 bettter (instead of exit(), etc).
   //
  
     if (pegasusHome.size() == 0)  int CIMServerProcess::cimserver_run( int argc, char** argv, Boolean shutdownOption )
         GetEnvironmentVariables(argv[0], pegasusHome);  {
       String logsDirectory = String::EMPTY;
       Boolean daemonOption = false;
  
     //     //
     // Get an instance of the Config Manager.     // Get an instance of the Config Manager.
     //     //
     configManager = ConfigManager::getInstance();     configManager = ConfigManager::getInstance();
       configManager->useConfigFiles = true;
   
   #ifdef PEGASUS_OS_OS400
       // In a special startup case for IBM OS400, when the server is
       // 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)
         {
           os400StartupOption = true;
           daemonOption = true;
         }
   #endif
  
     //     //
     // Get options (from command line and from configuration file); this     // Get options (from command line and from configuration file); this
Line 518 
Line 797 
     //     //
     try     try
     {     {
         GetOptions(configManager, argc, argv, pegasusHome);  #ifdef PEGASUS_OS_OS400
       if (os400StartupOption == false)
   #endif
           GetOptions(configManager, argc, argv);
     }     }
     catch (Exception& e)     catch (Exception& e)
     {     {
         cerr << argv[0] << ": " << e.getMessage() << endl;          Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
         exit(1);              "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
  
     try          return(1);
     {  
         //  
         // Check to see if we should (can) install as a NT service  
         //  
   
         if (String::equal(configManager->getCurrentValue("install"), "true"))  
         {  
             if( 0 != cimserver_install_nt_service( pegasusHome ))  
             {  
                 cout << "\nPegasus installed as NT Service";  
                 exit(0);  
             }             }
         }  
   
         //  
         // Check to see if we should (can) remove Pegasus as an NT service  
         //  
  
         if (String::equal(configManager->getCurrentValue("remove"), "true"))  // l10n
         {      // Set the home directory, msg sub-dir, into the MessageLoader.
             if( 0 != cimserver_remove_nt_service() )      // This will be the default directory where the resource bundles
             {      // are found.
                 cout << "\nPegasus removed as NT Service";      MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
                 exit(0);          ConfigManager::getInstance()->getCurrentValue("messageDir")));
   
   #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;
       Boolean enableSSLExportClientVerification = false;
   
       if (os400StartupOption == false)
       {
         enableHttpConnection = String::equal(
             configManager->getCurrentValue("enableHttpConnection"), "true");
         enableHttpsConnection = String::equal(
             configManager->getCurrentValue("enableHttpsConnection"), "true");
         enableSSLExportClientVerification = String::equal(
             configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
             }             }
   #else
       Boolean enableHttpConnection = String::equal(
           configManager->getCurrentValue("enableHttpConnection"), "true");
       Boolean enableHttpsConnection = String::equal(
           configManager->getCurrentValue("enableHttpsConnection"), "true");
       Boolean enableSSLExportClientVerification = String::equal(
           configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
   #endif
   
       // Make sure at least one connection is enabled
   #ifndef PEGASUS_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 Pegasus as a daemon         // Check to see if we should Pegasus as a daemon
         //         //
Line 564 
Line 887 
             daemonOption = true;             daemonOption = true;
         }         }
  
   #ifdef PEGASUS_OS_OS400
       if (os400StartupOption == false)
       {
   #endif
           // Get the log file directory definition.
           // We put String into Cstring because
           // Directory functions only handle Cstring.
           // ATTN-KS: create String based directory functions.
   
           logsDirectory = configManager->getCurrentValue("logdir");
           logsDirectory =
           ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
   #ifdef PEGASUS_OS_OS400
       }  // end if (os400StartupOption == false)
   #endif
   
           // Set up the Logger. This does not open the logs
           // Might be more logical to clean before set.
           // ATTN: Need tool to completely disable logging.
   
   #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
   !defined(PEGASUS_OS_OS400)
           Logger::setHomeDirectory(logsDirectory);
   #endif
   
         //         //
         // Check to see if we need to shutdown CIMOM         // Check to see if we need to shutdown CIMOM
         //         //
         if (shutdownOption)         if (shutdownOption)
         {         {
             //              String configTimeout =
             // if timeout was specified, validate the timeout value                  configManager->getCurrentValue("shutdownTimeout");
             //              Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);
             if (timeoutOption)  
             {              shutdownCIMOM(timeoutValue);
                 Boolean valid = configManager->validatePropertyValue(  
                                              PROPERTY_TIMEOUT,  #ifdef PEGASUS_OS_OS400
                                              timeoutStr);          //l10n
                 if (!valid)          //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
                 {              //"CIM Server stopped.");
                     cout << "Invalid timeout value specified: " << timeoutValue;          Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
                     cout << endl;              "src.Server.cimserver.SERVER_STOPPED",
                     exit(1);              "CIM Server stopped.");
               cimserver_exitRC(0);
   #else
               //l10n
               //cout << "CIM Server stopped." << endl;
               MessageLoaderParms parms("src.Server.cimserver.SERVER_STOPPED",
                                        "CIM Server stopped.");
   
               cout << MessageLoader::getMessage(parms) << endl;
               return(0);
   #endif
                 }                 }
   
   #if defined(PEGASUS_DEBUG)
           // Leave this in until people get familiar with the logs.
           //l10n
           //cout << "Logs Directory = " << logsDirectory << endl;
           MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
                                    "Logs Directory = ");
           cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
   #endif
             }             }
       catch (UnrecognizedConfigProperty& e)
       {
  
             shutdownCIMOM(forceOption, timeoutStr);  #ifdef PEGASUS_OS_OS400
             cout << "Pegasus CIM Server terminated." << endl;      //l10n
             exit(0);      //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               //"Error: $0",e.getMessage());
       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());
       cout << MessageLoader::getMessage(parms) << endl;
   #endif
         }         }
  
         //      Uint32 portNumberHttps=0;
         // Grab the port option:      Uint32 portNumberHttp=0;
         //      Uint32 portNumberExportHttps=0;
   
       if (enableHttpsConnection)
       {
           String httpsPort = configManager->getCurrentValue("httpsPort");
           CString portString = httpsPort.getCString();
           char* end = 0;
           Uint32 port = strtol(portString, &end, 10);
           if(!(end != 0 && *end == '\0'))
           {
               PEGASUS_STD(cerr) << "Bad HTTPS Port Value" << PEGASUS_STD(endl);
               exit(1);
           }
  
         portOption = configManager->getCurrentValue("port");  
  
         //         //
         // Check the trace options and set global variable          // Look up the WBEM-HTTPS port number
         //         //
           portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, port);
       }
  
         if (String::equal(configManager->getCurrentValue("trace"), "true"))      if (enableHttpConnection)
       {
           String httpPort = configManager->getCurrentValue("httpPort");
           CString portString = httpPort.getCString();
           char* end = 0;
           Uint32 port = strtol(portString, &end, 10);
           if(!(end != 0 && *end == '\0'))
         {         {
             Handler::setMessageTrace(true);              PEGASUS_STD(cerr) << "Bad HTTP Port Value" << PEGASUS_STD(endl);
             pegasusIOTrace = true;              exit(1);
             cout << "Trace Set" << endl;  
         }         }
         //         //
         // Check the log trace options and set global variable          // Look up the WBEM-HTTP port number
         //         //
           portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, port);
       }
  
         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))      if (enableSSLExportClientVerification)
         {         {
             Handler::setMessageLogTrace(true);          //
             pegasusIOLog = true;          // 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;
  
         // Get the log file directory definition.          portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port);
         // We put String into Cstring because  
         // Directory functions only handle Cstring.  
         // ATTN-KS: create String based directory functions.  
  
         logsDirectory = configManager->getCurrentValue("logdir");          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.");
  
         // Set up the Logger. This does not open the logs              MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",
         // Might be more logical to clean before set.                  "Port not defined for the service wbem-exp-https. CIMServer will not be started.");
         // ATTN: Need tool to completely disable logging.  
  
         Logger::setHomeDirectory(logsDirectory);              cerr << MessageLoader::getMessage(parms) << endl;
  
         if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))              return(1);
         {          }
             Logger::clean(logsDirectory);;  
         }         }
   #if defined(PEGASUS_DEBUG)
       // Put out startup up message.
       cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;
       //l10n
       //cout << "Built " << __DATE__ << " " << __TIME__ << endl;
       //cout <<"Starting..."
       MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
                                "Built $0 $1\nStarting...",
                                __DATE__,
                                __TIME__);
   #endif
  
         // Leave this in until people get familiar with the logs.  //l10n
         cout << "Logs Directory = " << logsDirectory << endl;  // reset message loading to NON-process locale
   MessageLoader::_useProcessLocale = false;
   //l10n
  
         if (String::equal(configManager->getCurrentValue("slp"), "true"))      // Get the parent's PID before forking
         {      parentPid = System::getPID();
             useSLP =  true;  
         }  
  
         if (String::equal(configManager->getCurrentValue("SSL"), "true"))      // do we need to run as a daemon ?
       if (daemonOption)
       {
           if(-1 == _cimServerProcess->cimserver_fork())
   #ifndef PEGASUS_OS_OS400
         {         {
             useSSL =  true;          return(-1);
         }         }
   #else
       {
               return(-1);
     }     }
     catch (UnrecognizedConfigProperty e)      else
     {     {
         cout << "Error: " << e.getMessage() << endl;          return(0);
     }     }
   #endif
  
     char* address = portOption.allocateCString();      }
  
     // Put out startup up message.  // l10n
     cout << PEGASUS_NAME << PEGASUS_VERSION <<      // Now we are after the fork...
          " on port " << address << endl;      // Create a dummy Thread object that can be used to store the
     cout << "Built " << __DATE__ << " " << __TIME__ << endl;      // AcceptLanguages object for CIM requests that are serviced
     cout <<"Started..."      // by this thread (initial thread of server).  Need to do this
          << (pegasusIOTrace ? " Tracing to Display ": " ")      // because this thread is not in a ThreadPool, but is used
          << (pegasusIOLog ? " Tracing to Log ": " ")      // to service CIM requests.
          << (useSLP ? " SLP reg. " : " No SLP ")      // The run function for the dummy Thread should never be called,
          << (useSSL ? " Use SSL " : " No SSL ")      Thread *dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
         << endl;      Thread::setCurrent(dummyInitialThread);
       AcceptLanguages default_al;
     // Put server start message to the logger      try{
     Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,           default_al = AcceptLanguages::getDefaultAcceptLanguages();
         "Start $0 $1 port $2 $3 $4 $5",           Thread::setLanguages(new AcceptLanguages(default_al));
                 PEGASUS_NAME,      }catch(InvalidAcceptLanguageHeader& e){
                 PEGASUS_VERSION,            Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                 address,                    "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
                 (pegasusIOTrace ? " Tracing": " "),                    "Could not convert the system process locale into a valid AcceptLanguage format.");
                 (useSLP ? " SLP on " : " SLP off "),            Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                 (useSSL ? " Use SSL " : " No SSL "));                               e.getMessage());
       }
  
     // do we need to run as a daemon ?  
     if (daemonOption)  
   #ifdef PEGASUS_OS_OS400
       // Special server initialization code for OS/400.
       if (cimserver_initialize() != 0)
       {
       // do some logging here!
       //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
   
   
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined (PEGASUS_OS_VMS)
       umask(S_IWGRP|S_IWOTH);
   
       //
       // check if CIMServer is already running
       // if CIMServer is already running, print message and
       // notify parent process (if there is a parent process) to terminate
       //
       if(_cimServerProcess->isCIMServerRunning())
     {     {
         if(-1 == cimserver_fork())      //l10n
           exit(-1);          //cout << "Unable to start CIMServer." << endl;
           //cout << "CIMServer is already running." << endl;
           MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
                        "Unable to start CIMServer.\nCIMServer is already running.");
       PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
   
       //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
                   _cimServerProcess->notify_parent(1);
   
           return(1);
     }     }
  
   #endif
   
     // 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  
         slp_client *discovery = new slp_client() ;;  
         String serviceURL;  
         serviceURL.assign("service:cim.pegasus://");  
         String host_name = slp_get_host_name();  
         serviceURL += host_name;  
         serviceURL += ":";  
         serviceURL += address;  
         char *url = serviceURL.allocateCString();  
         //      free(host_name);  
 #endif  
  
         Monitor monitor;         Monitor monitor;
         CIMServer server(&monitor, pegasusHome, useSSL);      //PEP#222
       //CIMServer server(&monitor);
       //CimserverHolder cimserverHolder( &server );
       _cimServer = new CIMServer(&monitor);
   
   
           if (enableHttpConnection)
           {
               _cimServer->addAcceptor(false, portNumberHttp, false, false);
               //l10n
               //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                           //"Listening on HTTP port $0.", portNumberHttp);
   
               Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                               "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                               "Listening on HTTP port $0.", portNumberHttp);
           }
           if (enableHttpsConnection)
           {
               _cimServer->addAcceptor(false, portNumberHttps, true, false);
               //l10n
               //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                           //"Listening on HTTPS port $0.", portNumberHttps);
               Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                               "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                               "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);
           }
   
   #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
           _cimServer->addAcceptor(true, 0, false, false);
           //l10n
           //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                       //"Listening on local connection socket.");
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                 "src.Server.cimserver.LISTENING_ON_LOCAL",
                 "Listening on local connection socket.");
   #endif
  
         // bind throws an exception of the bind fails  #if defined(PEGASUS_DEBUG)
         cout << "Binding to " << address << endl;          if (enableHttpConnection)
           {
               //l10n
               //cout << "Listening on HTTP port " << portNumberHttp << endl;
         MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                      "Listening on HTTP port $0.", portNumberHttp);
               cout << MessageLoader::getMessage(parms) << endl;
           }
           if (enableHttpsConnection)
           {
               //l10n
               //cout << "Listening on HTTPS port " << portNumberHttps << endl;
               MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                        "Listening on HTTPS port $0.", portNumberHttps);
               cout << MessageLoader::getMessage(parms) << endl;
           }
           if (enableSSLExportClientVerification)
           {
               MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",
                   "Listening on Export HTTPS port $0.", portNumberExportHttps);
  
         char* end = 0;              cout << MessageLoader::getMessage(parms) << endl;
         long portNumber = strtol(address, &end, 10);          }
         assert(end != 0 && *end == '\0');  
         server.bind(portNumber);  
  
         delete [] address;  # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
           //l10n
           //cout << "Listening on local connection socket" << endl;
           MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_LOCAL",
                    "Listening on local connection socket.");
           cout << MessageLoader::getMessage(parms) << endl;
   # endif
   #endif
   
           // bind throws an exception if the bind fails
           _cimServer->bind();
   
       // notify parent process (if there is a parent process) to terminate
           // so user knows that there is cimserver ready to serve CIM requests.
       if (daemonOption)
           _cimServerProcess->notify_parent(0);
  
         time_t last = 0;         time_t last = 0;
  
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) \
       || defined(PEGASUS_OS_AIX) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \
       || defined(PEGASUS_OS_VMS)
         //         //
         // Loop to call CIMServer's runForever() method until CIMServer          // create a file to indicate that the cimserver has started and
         // has been shutdown          // save the process id of the cimserver process in the file
         //         //
         while( !server.terminated() )          // remove the old file if it exists
         {          System::removeFile(_cimServerProcess->getPIDFileName());
 #ifndef PEGASUS_OS_ZOS  
           if(useSLP  )          // open the file
           {          FILE *pid_file = fopen(_cimServerProcess->getPIDFileName(), "w");
             if(  (time(NULL) - last ) > 60 )  
           if (pid_file)
             {             {
               if( discovery != NULL && url != NULL )              // save the pid in the file
                 discovery->srv_reg_all(url,              fprintf(pid_file, "%ld\n", _cimServerProcess->get_server_pid());
                                        "(namespace=root/cimv2)",              fclose(pid_file);
                                        "service:cim.pegasus",  
                                        "DEFAULT",  
                                        70) ;  
               time(&last);  
             }             }
   #endif
  
             discovery->service_listener();  #if defined(PEGASUS_DEBUG)
           }      cout << "Started. " << endl;
 #endif #endif
           server.runForever();  
           // Put server started message to the logger
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
               Logger::INFORMATION,
               "src.Server.cimserver.STARTED_VERSION",
               "Started $0 version $1.",
               _cimServerProcess->getProductName(), _cimServerProcess->getVersion());
   
           //
           // Loop to call CIMServer's runForever() method until CIMServer
           // has been shutdown
           //
       while( !_cimServer->terminated() )
       {
   
         _cimServer->runForever();
   
         }         }
       MessageQueueService::force_shutdown(true);
           //
           // normal termination
       //
   
           // Put server shutdown message to the logger
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
               Logger::INFORMATION, "src.Server.cimserver.STOPPED",
               "$0 stopped.", _cimServerProcess->getProductName());
  
         // This statement is unrechable!  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined(PEGASUS_OS_VMS)
           //
           // close the file created at startup time to indicate that the
           // cimserver has terminated normally.
         //         //
         // Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          FileSystem::removeFile(_cimServerProcess->getPIDFileName());
         //   "Normal Termination");  #endif
     }     }
     catch(Exception& e)     catch(Exception& e)
     {     {
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
             "Abnormal Termination $0", e.getMessage());  
  
         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);      //l10n
       //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               //"Error: $0", e.getMessage());
       Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               "src.Server.cimserver.ERROR",
               "Error: $0", e.getMessage());
   
   #ifndef PEGASUS_OS_OS400
       //l10n
       //PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);
       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);
   
           return 1;
     }     }
  
     return 0;     return 0;
 } }
   
   
   
   


Legend:
Removed from v.1.35  
changed lines
  Added in v.1.153

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2