(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.245

version 1.35, 2001/12/13 14:54:56 version 1.245, 2014/01/15 13:32:31
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 //  
 // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM  
 //  
 // Permission is hereby granted, free of charge, to any person obtaining a copy  
 // of this software and associated documentation files (the "Software"), to  
 // deal in the Software without restriction, including without limitation the  
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  
 // sell copies of the Software, and to permit persons to whom the Software is  
 // furnished to do so, subject to the following conditions:  
 //  
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT  
 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR  
 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN  
 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
 //  
 //==============================================================================  
 //  
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Mike Day (mdday@us.ibm.com)  
 // //
 // Modified By: Karl Schopmeyer (k.schopmeyer@opengroup.org)  // Licensed to The Open Group (TOG) under one or more contributor license
   // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   // this work for additional information regarding copyright ownership.
   // Each contributor licenses this file to you under the OpenPegasus Open
   // Source License; you may not use this file except in compliance with the
   // License.
   //
   // Permission is hereby granted, free of charge, to any person obtaining a
   // copy of this software and associated documentation files (the "Software"),
   // to deal in the Software without restriction, including without limitation
   // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   // and/or sell copies of the Software, and to permit persons to whom the
   // Software is furnished to do so, subject to the following conditions:
   //
   // The above copyright notice and this permission notice shall be included
   // in all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // //
 // Modified By: Nag Boranna (nagaraja_boranna@hp.com)  //////////////////////////////////////////////////////////////////////////
 //  
 // Modified By: Jenny Yu (jenny_yu@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:
   //
   // cimserver
 // //
 // To run pegasus as a daemon on Unix platforms, use the -d option:  // To NOT run pegasus as a daemon on Unix platforms, set the daemon config
   // property to false:
 // //
 // cimserver -d  // cimserver daemon=false
 // //
 // The -d option has no effect on windows operation.  // The daemon config property has no effect on windows operation or when
   // privilege separation is enabled.
 // //
 // 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 63 
 // 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 <iostream>  #include <Pegasus/Common/Constants.h>
 #include <cassert>  #include <Pegasus/Common/PegasusAssert.h>
 #include <cstdlib>  
 #include <Pegasus/Common/FileSystem.h> #include <Pegasus/Common/FileSystem.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/StringConversion.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/Common/HTTPConnector.h>  #include <Pegasus/Server/CIMServer.h>
 #include <Pegasus/Server/ShutdownService.h>  #include <Service/ServerProcess.h>
 #ifndef PEGASUS_OS_ZOS  #include <Service/ServerShutdownClient.h>
 #include <slp/slp.h>  #include <Service/ServerRunStatus.h>
   
   #if defined(PEGASUS_OS_ZOS)
   #include <Pegasus/General/SetFileDescriptorToEBCDICEncoding.h>
   #include <Service/ARM_zOS.h>
   #include <Service/TimeZone_zOS.h>
   #include <Service/WaitForTCPIP_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 #endif
  
   #if defined(PEGASUS_OS_TYPE_UNIX)
   # include <unistd.h>
   # include <sys/types.h>
   # include <sys/stat.h>
   # include <fcntl.h>
   #endif
  
 #if defined(PEGASUS_OS_TYPE_WINDOWS)  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
 # include "cimserver_windows.cpp"  # define PEGASUS_PROCESS_NAME "cimservermain"
 #elif defined(PEGASUS_OS_TYPE_UNIX)  
 # include "cimserver_unix.cpp"  
 #else #else
 # error "Unsupported platform"  # define PEGASUS_PROCESS_NAME "cimserver"
   #endif
   
   #include <Pegasus/Common/Executor.h>
   
   #ifdef PEGASUS_OS_PASE
   # include <ILEWrapper/ILEUtilities2.h>
   # include <ILEWrapper/qumemultiutil.h>
 #endif #endif
  
 PEGASUS_USING_PEGASUS; PEGASUS_USING_PEGASUS;
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
   //Windows service variables are not defined elsewhere in the product
   //enable ability to override these
   #ifndef PEGASUS_FLAVOR
   #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
   #else
   #ifndef PEGASUS_SERVICE_NAME
   #define PEGASUS_SERVICE_NAME PEGASUS_FLAVOR " Pegasus CIM Object Manager"
   #endif
   #ifndef PEGASUS_SERVICE_DESCRIPTION
   #define PEGASUS_SERVICE_DESCRIPTION PEGASUS_FLAVOR \
               " Pegasus CIM Object Manager Service";
   #endif
   #endif
   
   #ifdef PEGASUS_OS_PASE
   #include <as400_protos.h> //for _SETCCSID
   #endif
   
   class CIMServerProcess : public ServerProcess
   {
   public:
   
       CIMServerProcess()
       {
           cimserver_set_process(this);
       }
   
       virtual ~CIMServerProcess()
       {
       }
   
       //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;
       }
   
       int cimserver_run(
           int argc,
           char** argv,
           Boolean shutdownOption,
           Boolean debugOutputOption);
   
       void cimserver_stop();
   };
   
   ServerRunStatus _serverRunStatus(
       PEGASUS_PROCESS_NAME, PEGASUS_CIMSERVER_START_FILE);
   AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
   static CIMServer* _cimServer = 0;
   static Thread* dummyInitialThread = 0;
   
 // //
 //  The command name. //  The command name.
 // //
Line 126 
Line 238 
  
 static const char OPTION_SHUTDOWN    = 's'; static const char OPTION_SHUTDOWN    = 's';
  
 static const char OPTION_FORCE       = 'f';  static const char OPTION_DEBUGOUTPUT = 'X';
   
 static const char OPTION_TIMEOUT     = 'T';  
   
 static const String NAMESPACE = "root/cimv2";  
 static const String CLASSNAME_SHUTDOWNSERVICE = "PG_ShutdownService";  
 static const String PROPERTY_TIMEOUT = "timeout";  
   
 ConfigManager*    configManager;  
   
 void GetEnvironmentVariables(  
     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=";  
     str += arg0;  
     char* tmp = str.allocateCString();  
     putenv(tmp);  
   
     // Note: don't delete tmp! putenv() uses it.  
 }  
  
 /** 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)
 { {
     String currentFile = pegasusHome + "/" + CURRENT_CONFIG_FILE;      if (shutdownOption)
     String plannedFile = pegasusHome + "/" + PLANNED_CONFIG_FILE;  
   
     try  
     {  
         cm->mergeConfigFiles(currentFile, plannedFile);  
   
         cm->mergeCommandLine(argc, argv);  
     }  
     catch (NoSuchFile nsf)  
     {  
         throw nsf;  
     }  
     catch (FileNotReadable fnr)  
     {  
         throw fnr;  
     }  
     catch (CannotRenameFile ftrf)  
     {  
         throw ftrf;  
     }  
     catch (ConfigFileSyntaxError cfse)  
     {  
         throw cfse;  
     }  
     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 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("    --status        - displays the running status of"
           " the CIM Server\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 "
     usage.append ("    -d          - runs pegasus as a daemon\n");          "Service\n");
     usage.append ("    -s [-f] [-T timeout] \n");      usage.append("                      [name] is optional and overrides "
     usage.append ("                - shuts down pegasus\n");          "the\n");
     usage.append ("    -cleanlogs  - clears the log files at startup\n");      usage.append("                      default CIM Server Service Name\n");
     usage.append ("    -install    - installs pegasus as a Windows NT Service\n");      usage.append("                      by appending [name]\n");
     usage.append ("    -remove     - removes pegasus as a Windows NT Service\n");      usage.append("    -remove [name]  - removes pegasus as a Windows "
     usage.append ("    -slp        - registers pegasus as a service with SLP\n\n");          "Service\n");
     usage.append ("    -SSL        - uses SSL\n\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
     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 "
     usage.append ("    home=/pegasus/bin    - sets pegasus home directory\n");          "property\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->getCompleteVersion() << 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)  // 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()
 { {
     //      delete _cimServer;
     // Create CIMClient object      _cimServer = 0;
     //  
     Monitor* monitor = new Monitor;  
     HTTPConnector* httpConnector = new HTTPConnector(monitor);  
     CIMClient client(monitor, httpConnector);  
   
     //  
     // Get the port number  
     //  
     String portNumberStr = configManager->getCurrentValue("port");  
  
     String hostStr = System::getHostName();      if (dummyInitialThread)
     hostStr.append(":");      {
     hostStr.append(portNumberStr);          Thread::clearLanguages();
           delete dummyInitialThread;
       }
       _serverRunStatus.setServerNotRunning();
   }
  
     //     //
     // open connection to CIMOM  // 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!
     //     //
     try  ThreadReturnType PEGASUS_THREAD_CDECL dummyThreadFunc(void* parm)
     {  
         client.connect(hostStr.allocateCString());  
     }  
     catch(Exception& e)  
     {     {
         PEGASUS_STD(cerr) << "Failed to connect to server: " << e.getMessage() << PEGASUS_STD(endl);      return (ThreadReturnType)0;
         exit(1);  
     }     }
  
     try  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
   
   static int _extractExecutorSockOpt(int& argc, char**& argv)
     {     {
         //      // Extract the "--executor-socket <sock>" option if any. This indicates
         // construct CIMReference      // that the e[x]ecutor is running. The option argument is the socket used
         //      // to communicate with the executor. Remove the option from the
         String referenceStr = "//";      // argv list and decrease argc by two.
         referenceStr.append(hostStr);  
         referenceStr.append("/root/cimv2:PG_ShutdownService");  
         CIMReference reference(referenceStr);  
  
         //      int sock = -1;
         // issue the invokeMethod request on the shutdown method      const char OPT[] = "--executor-socket";
         //  
         Array<CIMParamValue> inParams;  
         Array<CIMParamValue> outParams;  
  
         if (forceOption)      for (int i = 1; i < argc; i++)
         {         {
             inParams.append(CIMParamValue(          if (strcmp(argv[i], OPT) == 0)
                 CIMParameter("force", CIMType::STRING),          {
                 CIMValue("TRUE")));              // Check for missing option argument.
   
               if (i + 1 == argc)
               {
                   MessageLoaderParms parms(
                       "src.Server.cimserver.MISSING_OPTION_ARGUMENT",
                       "Missing argument for $0 option.",
                       OPT);
                   cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                       endl;
                   exit(1);
         }         }
         else  
               // Convert argument to positive integer.
   
               char* end;
               unsigned long x = strtoul(argv[i+1], &end, 10);
   
               // Check whether option argument will fit in a signed integer.
   
               if (*end != '\0' || x > 2147483647)
         {         {
             inParams.append(CIMParamValue(                  MessageLoaderParms parms(
                 CIMParameter("force", CIMType::STRING),                      "src.Server.cimserver.BAD_OPTION_ARGUMENT",
                 CIMValue("FALSE")));                      "Bad $0 option argument: $1.",
                       OPT,
                       argv[i+1]);
                   cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                       endl;
                   exit(1);
         }         }
  
         inParams.append(CIMParamValue(              sock = int(x);
             CIMParameter("timeout", CIMType::STRING),  
             CIMValue(timeoutStr)));              // Remove "-x <sock>" from argv-argc.
   
         CIMValue retValue = client.invokeMethod(              memmove(argv + i, argv + i + 2, sizeof(char*) * (argc - i - 1));
             NAMESPACE,              argc -= 2;
             reference,              break;
             "shutdown",  
             inParams,  
             outParams);  
     }     }
     catch(Exception& e)      }
   
       if (sock == -1)
     {     {
         PEGASUS_STD(cerr) << "Failed to shutdown server: " << e.getMessage() << PEGASUS_STD(endl);          MessageLoaderParms parms(
               "src.Server.cimserver.MISSING_OPTION",
               "Missing $0 option.",
               OPT);
           cerr << argv[0] << ": " << MessageLoader::getMessage(parms) << endl;
         exit(1);         exit(1);
     }     }
  
     return;      return sock;
 } }
  
   #endif /* PEGASUS_ENABLE_PRIVILEGE_SEPARATION */
   
   static void _initConfigProperty(const String &propName, Uint32 value)
   {
       char strValue[22];
       Uint32 n;
       const char *startP = Uint32ToString(
           strValue,
           value,
           n);
       ConfigManager::getInstance()->initCurrentValue(propName, String(startP, n));
   }
   static void _restrictListening(
       ConfigManager* configManager,
       const String &listenOn,
       const Uint32 &portNumberHttp,
       const Boolean useSSL)
   {
       static Array<HostAddress> laddr = configManager ->getListenAddress(
                                             listenOn);
       for(Uint32 i = 0, n = laddr.size(); i < n; ++i)
       {
           if(laddr[i].getAddressType() == HostAddress::AT_IPV6)
           {
   #ifdef PEGASUS_ENABLE_IPV6
               _cimServer->addAcceptor(HTTPAcceptor::IPV6_CONNECTION,
                       portNumberHttp, useSSL,
                       &laddr[i]);
   #endif
           }
           else if(laddr[i].getAddressType() == HostAddress::AT_IPV4)
           {
               _cimServer->addAcceptor(HTTPAcceptor::IPV4_CONNECTION,
                       portNumberHttp, useSSL,
                       &laddr[i]);
           }
       }
   }
  
 ///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
 //  MAIN //  MAIN
 ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
   
 int main(int argc, char** argv) int main(int argc, char** argv)
 { {
     String pegasusHome  = String::EMPTY;      String pegasusHome;
     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 debugOutputOption = false;
     Boolean timeoutOption = false;  
     String  timeoutStr  = String::EMPTY;      // Set Message loading to process locale
     long timeoutValue  = 0;      MessageLoader::_useProcessLocale = true;
  
     // on Windows NT if there are no command-line options, run as a service  #ifdef PEGASUS_OS_ZOS
       // Direct standard input to /dev/null,
       close(STDIN_FILENO);
       open("/dev/null", O_RDONLY);
  
     if (argc == 1 )      if ( setEBCDICEncoding(STDOUT_FILENO)==-1 ||
            setEBCDICEncoding(STDERR_FILENO)==-1 )
     {     {
       cim_server_service(argc, argv);         PEG_TRACE_CSTRING(TRC_SERVER,Tracer::LEVEL1,
              "Coud not set stdout or stderr to EBCDIC encoding.");
     }     }
     else      // Need to initialize timezone information in the
       // initial processing thread (IPT)
       initialize_zOS_timezone();
   #endif
   
   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
       setlocale(LC_ALL, "");
   #endif
   
   #ifndef PEGASUS_OS_TYPE_WINDOWS
       //
       // Get environment variables:
       //
   # if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
       pegasusHome = AIX_RELEASE_PEGASUS_HOME;
   # elif defined(PEGASUS_OS_PASE)
       const char *tmp = getenv("PEGASUS_HOME");
       pegasusHome = (tmp == 0) ? PASE_DEFAULT_PEGASUS_HOME : tmp;
   # elif !defined(PEGASUS_USE_RELEASE_DIRS) || \
       defined(PEGASUS_OS_ZOS)
       const char* tmp = getenv("PEGASUS_HOME");
   
       if (tmp)
       {
           pegasusHome = tmp;
       }
   # endif
   
       FileSystem::translateSlashes(pegasusHome);
   #else
   
       // windows only
       //setHome(pegasusHome);
       pegasusHome = _cimServerProcess->getHome();
   #endif
   
   #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
   
       // If invoked with "--executor-socket <socket>" option, then use executor.
   
       Executor::setSock(_extractExecutorSockOpt(argc, argv));
   
       // Ping executor to verify the specified socket is valid.
   
       if (Executor::ping() != 0)
     {     {
         // Get help, version and home options          MessageLoaderParms parms("src.Server.cimserver.EXECUTOR_PING_FAILED",
               "Failed to ping the executor on the specified socket.");
           cerr << argv[0] << ": " << MessageLoader::getMessage(parms) << endl;
           exit(1);
       }
   
   #endif /* !defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */
   
           // Get help, version, status 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 (strcmp(arg, "--help") == 0)
               {
                   PrintHelp(argv[0]);
                   Executor::daemonizeExecutor();
                   exit(0);
               }
               if (strcmp(arg, "--status") == 0)
               {
                   int retValue = 0;
                   if (_serverRunStatus.isServerRunning())
                   {
                       MessageLoaderParms parms(
                           "src.Server.cimserver.CIMSERVER_RUNNING",
                           "The CIM Server is running.");
                       cout << MessageLoader::getMessage(parms) << endl;
                   }
                   else
                   {
                       MessageLoaderParms parms(
                           "src.Server.cimserver.CIMSERVER_NOT_RUNNING",
                           "The CIM Server is not running.");
                       cout << MessageLoader::getMessage(parms) << endl;
                       retValue = 2;
                   }
                   Executor::daemonizeExecutor();
                   exit(retValue);
               }
               else if (strcmp(arg, "--version") == 0)
               {
                   cout << _cimServerProcess->getCompleteVersion() << endl;
                   Executor::daemonizeExecutor();
                   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 598 
                 //                 //
                 // 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->getCompleteVersion() << endl;
                       Executor::daemonizeExecutor();
                     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]);
                       Executor::daemonizeExecutor();
                     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;                          String opt(option);
                         exit(0);                          MessageLoaderParms parms(
                               "src.Server.cimserver.MISSING_ARGUMENT",
                               "Missing argument for option -$0",
                               opt);
                           cout << MessageLoader::getMessage(parms) << endl;
                           exit(1);
                     }                     }
  
                     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
                   //
                   // Check to see if user asked for debug output (-X option):
                   //
                   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;
   #endif
   
                       // remove the option from the command line
                       memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
                       argc--;
                   }
                 //                 //
                 // 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 shutdown has already been specified:                     // Check to see if shutdown has already been specified:
                     //                     //
                     if (shutdownOption)                     if (shutdownOption)
                     {                     {
                         cout << "Duplicate shutdown option specified." << endl;                          MessageLoaderParms parms(
                         exit(0);                              "src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",
                               "Duplicate shutdown option specified.");
   
                           cout << MessageLoader::getMessage(parms) << endl;
                           exit(1);
                     }                     }
   
                     shutdownOption = 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_FORCE)                  else
                 {                      i++;
               }
               else
                   i++;
           }
   
       //
       // Set the value for pegasusHome property
       //
       ConfigManager::setPegasusHome(pegasusHome);
   
                     //                     //
                     // Check to see if shutdown has been specified:      // Do the platform specific run
                     //                     //
                     if (!shutdownOption)  
       return _cimServerProcess->platform_run(
           argc, argv, shutdownOption, debugOutputOption);
   }
   
   void CIMServerProcess::cimserver_stop()
                     {                     {
                         cout << "Invalid option -" << option << endl;      _cimServer->shutdownSignal();
                         exit(0);  
                     }                     }
  
                     //                     //
                     // Check to see if force has already been specified:  // 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 (forceOption)  
   int CIMServerProcess::cimserver_run(
       int argc,
       char** argv,
       Boolean shutdownOption,
       Boolean debugOutputOption)
                     {                     {
                         cout << "Duplicate force option specified." << endl;      Boolean daemonOption = false;
                         exit(0);  
   #if defined (PEGASUS_OS_PASE) && !defined (PEGASUS_DEBUG)
       // PASE have itself regular for checking privileged user
       if (!System::isPrivilegedUser("*CURRENT  "))
       {
           MessageLoaderParms parms(
                   "src.Server.cimserver.NO_AUTHORITY.PEGASUS_OS_PASE",
                   "The caller should be a privileged user,"
                   " or the server will not run.");
           cerr << MessageLoader::getMessage(parms) << endl;
           exit (1);
       }
       char jobName[11];
       // this function only can be found in PASE environment
       umeGetJobName(jobName, false);
       if (strncmp("QUMECIMOM ", jobName, 10) != 0
               && strncmp("QUMEENDCIM", jobName, 10) != 0)
       {
           MessageLoaderParms parms(
                   "src.Server.cimserver.NOT_OFFICIAL_START.PEGASUS_OS_PASE",
                   "cimserver can not be started by user.\nServer will not run.");
           cerr << MessageLoader::getMessage(parms) << endl;
           exit (1);
                     }                     }
  
                     forceOption = true;      // Direct standard input, output, and error to /dev/null,
       // PASE run this job in background, any output in not allowed
       freopen("/dev/null", "r", stdin);
       freopen("/dev/null", "w", stdout);
       freopen("/dev/null", "w", stderr);
   #endif
  
                     // remove the option from the command line  
                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));  
                     argc--;  
                 }  
                 else if (*option == OPTION_TIMEOUT)  
                 {  
                     //                     //
                     // Check to see if shutdown has been specified:      // Get an instance of the Config Manager.
                     //                     //
                     if (!shutdownOption)      ConfigManager* configManager = ConfigManager::getInstance();
       configManager->useConfigFiles = true;
   
       try
                     {                     {
                         cout << "Invalid option -" << option << endl;          //
                         exit(0);          // Get options (from command line and from configuration file); this
           // removes corresponding options and their arguments from the command
           // line.  NOTE: If shutdownOption=true, the contents of current config
           // file are not overwritten by the planned config file.
           //
           GetOptions(configManager, argc, argv, shutdownOption);
   
           //
           // Initialize the message home directory in the MessageLoader.
           // This is the default directory where the resource bundles are found.
           //
           MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
               ConfigManager::getInstance()->getCurrentValue("messageDir")));
   
   #if !defined(PEGASUS_USE_SYSLOGS)
           String logsDirectory = ConfigManager::getHomedPath(
               configManager->getCurrentValue("logdir"));
   
           // Set up the Logger.  This does not open the logs.
           // Might be more logical to clean before set.
           Logger::setHomeDirectory(logsDirectory);
   #endif
   
   
   #ifdef PEGASUS_OS_PASE
           /* write job log to tell where pegasus log is.*/
           if(logsDirectory.size() > 0)
               // this function only can be found in PASE environment
               logPegasusDir2joblog(logsDirectory.getCString());
           else
               logPegasusDir2joblog(".");
   
           // set ccsid to unicode for entire job
           // ccsid is globolization mechanism in PASE environment
           if (_SETCCSID(1208) == -1)
           {
               MessageLoaderParms parms(
                       "src.Server.cimserver.SET_CCSID_ERROR.PEGASUS_OS_PASE",
                       "Failed to set CCSID, server will stop.");
               cerr << MessageLoader::getMessage(parms) << endl;
               Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::FATAL,
                       parms);
               exit (1);
                     }                     }
  
                     if (timeoutOption)          char fullJobName[29];
                     {          umeGetJobName(fullJobName, true);
                         cout << "Duplicate timeout option specified." << endl;          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
                         exit(0);                  Logger::INFORMATION,
                   MessageLoaderParms(
                       "src.Server.cimserver.SERVER_JOB_NAME.PEGASUS_OS_PASE",
                       "CIM Server's Job Name is: $0", fullJobName));
   #endif
   
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           // Make sure at least one connection is enabled
   
           Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpConnection"));
           Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpsConnection"));
   
           if (!enableHttpConnection && !enableHttpsConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
                   "Neither HTTP nor HTTPS connection is enabled."
                       "  CIMServer will not be started.");
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
                   parms);
               cerr << MessageLoader::getMessage(parms) << endl;
               return 1;
                     }                     }
   #endif
  
                     timeoutOption = true;          //
           // Check to see if we should start Pegasus as a daemon
           //
           daemonOption = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("daemon"));
  
                     if (i + 1 < argc)          if ((Executor::detectExecutor() == 0) && (daemonOption == false))
                     {                     {
                         // get timeout value              MessageLoaderParms parms(
                         timeoutStr.assign(argv[i + 1]);                  "src.Server.cimserver.PRIVSEP_REQUIRES_DAEMON",
                   "Warning: The configuration setting daemon=false is ignored "
                       "with privilege separation enabled.");
               cerr << MessageLoader::getMessage(parms) << endl;
               daemonOption = true;
           }
  
                         // validate timeout value string          //
                         char* tmp = timeoutStr.allocateCString();          // Check to see if we need to shutdown CIMOM
                         char* end = 0;          //
                         timeoutValue  = strtol(tmp, &end, 10);          if (shutdownOption)
           {
                         if (!end || *end != '\0')  #if defined(PEGASUS_OS_ZOS) && defined(PEGASUS_ZOS_SECURITY)
                         {              // This checks whether user is authorized to stop the
                             cout << "invalid timeout value specified: ";              // CIM Server. When unauthorized a message is logged to
                             cout << timeoutStr << endl;              // to the user and program exits.
                             delete [] tmp;              shutdownCheckProfileCIMSERVclassWBEM();
                             exit(0);              // Depending on the success of the previous check we may not
               // reach this code!!!
   #endif
               String configTimeout =
                   configManager->getCurrentValue("shutdownTimeout");
               Uint32 timeoutValue =
                   strtol(configTimeout.getCString(), (char **)0, 10);
   
               ServerShutdownClient serverShutdownClient(&_serverRunStatus);
               serverShutdownClient.shutdown(timeoutValue);
   
               MessageLoaderParms parms(
                   "src.Server.cimserver.SERVER_STOPPED",
                   "CIM Server stopped.");
   
               cout << MessageLoader::getMessage(parms) << endl;
               return 0;
                         }                         }
   
   #if defined(PEGASUS_DEBUG) && !defined(PEGASUS_USE_SYSLOGS)
           // Leave this in until people get familiar with the logs.
           MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
                                    "Logs Directory = ");
           cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
   #endif
                     }                     }
                     else      catch (Exception& e)
                     {                     {
                         cout << "Missing argument for option -";          MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
                         cout << option << endl;              "cimserver not started: $0", e.getMessage());
                         exit(0);          Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               parms);
           cerr << MessageLoader::getMessage(parms) << endl;
   
           return 1;
                     }                     }
  
                     // remove the option from the command line  #if defined(PEGASUS_OS_ZOS)
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));  #  if defined(PEGASUS_ZOS_SECURITY)
                     argc -= 2;      startupCheckBPXServer(true);
                 }      startupCheckProfileCIMSERVclassWBEM();
                 else      startupEnableMSC();
                     i++;  #  endif
       startupWaitForTCPIP();
   #endif
   
   #if defined(PEGASUS_DEBUG)
       // Put out startup up message.
       cout << _cimServerProcess->getProductName() << " " <<
           _cimServerProcess->getCompleteVersion() << endl;
   #endif
   
       // Force initialization of hostname and fullyQualifiedHostName through
       // retrieving current value from Configuration Manager
       // - this will run getCurrentValue() in DefaultPropertyOwner.cpp
       configManager->getCurrentValue("hostname");
       configManager->getCurrentValue("fullyQualifiedHostName");
   
       // reset message loading to NON-process locale
       MessageLoader::_useProcessLocale = false;
   
       // Get the parent's PID before forking
       _serverRunStatus.setParentPid(System::getPID());
   
       // Do not fork when using privilege separation (executor will daemonize
       // itself later).
       if (daemonOption)
       {
           if (-1 == _cimServerProcess->cimserver_fork())
               return -1;
             }             }
             else  
                 i++;      // 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);
       try
       {
           Thread::setLanguages(LanguageParser::getDefaultAcceptLanguages());
         }         }
       catch (InvalidAcceptLanguageHeader& e)
       {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               MessageLoaderParms(
                   "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());
     }     }
  
     if (pegasusHome.size() == 0)  #ifndef PEGASUS_OS_TYPE_WINDOWS
         GetEnvironmentVariables(argv[0], pegasusHome);      umask(S_IRWXG|S_IRWXO);
   #endif
  
     //      // Start up the CIM Server
     // Get an instance of the Config Manager.  
     //  
     configManager = ConfigManager::getInstance();  
  
   #if defined(PEGASUS_OS_TYPE_UNIX)
     //     //
     // Get options (from command line and from configuration file); this      // Lock the CIMSERVER_LOCK_FILE during CIM Server start-up to prevent
     // removes corresponding options and their arguments from the command      // concurrent writes to this file by multiple cimserver processes
     // line.      // starting at the same time.
     //     //
       CString startupLockFileName = ConfigManager::getHomedPath(
          PEGASUS_CIMSERVER_START_LOCK_FILE).getCString();
   
     try     try
     {     {
         GetOptions(configManager, argc, argv, pegasusHome);  
     }          // Make sure the start-up lock file exists
     catch (Exception& e)          FILE* startupLockFile;
           if ((startupLockFile = fopen(startupLockFileName, "w")) != 0)
     {     {
         cerr << argv[0] << ": " << e.getMessage() << endl;              fclose(startupLockFile);
         exit(1);  
     }     }
  
           AutoFileLock fileLock(startupLockFileName);
   #else
     try     try
     {     {
   #endif
   
   #if defined(PEGASUS_OS_TYPE_UNIX) || defined(PEGASUS_OS_VMS)
         //         //
         // Check to see if we should (can) install as a NT service          // Check if a CIM Server is already running.  If so, print an error
           // message and notify the parent process (if there is one) to terminate
         //         //
           if (_serverRunStatus.isServerRunning())
         if (String::equal(configManager->getCurrentValue("install"), "true"))  
         {         {
             if( 0 != cimserver_install_nt_service( pegasusHome ))              MessageLoaderParms parms(
                   "src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
                   "Unable to start CIMServer. CIMServer is already running.");
               Logger::put_l(
                   Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
               cerr << MessageLoader::getMessage(parms) << endl;
   
               if (daemonOption)
             {             {
                 cout << "\nPegasus installed as NT Service";                  _cimServerProcess->notify_parent(1);
                 exit(0);  
             }             }
   
               return 1;
         }         }
  
         //         //
         // Check to see if we should (can) remove Pegasus as an NT service          // Declare ourselves as the running CIM Server process, and write our
           // PID to the PID file.
         //         //
           _serverRunStatus.setServerRunning();
   #endif
   
           // Create and initialize the CIMServer object
   
           _cimServer = new CIMServer();
   
           Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpConnection"));
           Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpsConnection"));
   
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           // Make sure at least one connection is enabled
           if (!enableHttpConnection && !enableHttpsConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
                   "Neither HTTP nor HTTPS connection is enabled.");
               throw Exception(parms);
           }
   #endif
  
         if (String::equal(configManager->getCurrentValue("remove"), "true"))          Boolean addIP6Acceptor = false;
           Boolean addIP4Acceptor = false;
   
   #ifdef PEGASUS_OS_TYPE_WINDOWS
           addIP4Acceptor = true;
   #endif
   
   #ifdef PEGASUS_ENABLE_IPV6
           // If IPv6 stack is disabled swicth to IPv4 stack.
           if (System::isIPv6StackActive())
         {         {
             if( 0 != cimserver_remove_nt_service() )              addIP6Acceptor = true;
           }
           else
             {             {
                 cout << "\nPegasus removed as NT Service";              PEG_TRACE_CSTRING(TRC_SERVER,Tracer::LEVEL4,
                 exit(0);                  "IPv6 stack is not active, using IPv4 socket.");
             }             }
   #endif
           if (!addIP6Acceptor)
           {
               addIP4Acceptor = true;
         }         }
  
           // The server HTTP and HTTPS ports are determined via this algorithm:
           // 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.
   
           if (enableHttpConnection)
           {
               Uint32 portNumberHttp = 0;
               String httpPort = configManager->getCurrentValue("httpPort");
               if (httpPort.size() == 0)
               {
         //         //
         // Check to see if we should Pegasus as a daemon                  // Look up the WBEM-HTTP port number
         //         //
                   portNumberHttp = System::lookupPort(
         if (String::equal(configManager->getCurrentValue("daemon"), "true"))                      WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
                   _initConfigProperty("httpPort", portNumberHttp);
               }
               else
         {         {
             daemonOption = true;                  Uint64 longNumber;
                   // use the current value which has been checked for validity at
                   // load(fct. GetOptions), see DefaultPropertyOwner::isValid()
                   StringConversion::decimalStringToUint64(
                       httpPort.getCString(),
                       longNumber);
                   portNumberHttp = longNumber & 0xffff;
         }         }
  
         //              String listenOn = configManager->getCurrentValue("listenAddress");
         // Check to see if we need to shutdown CIMOM              if(String::equalNoCase(listenOn, "All"))
         //  
         if (shutdownOption)  
         {         {
             //                  if (addIP6Acceptor)
             // if timeout was specified, validate the timeout value  
             //  
             if (timeoutOption)  
             {             {
                 Boolean valid = configManager->validatePropertyValue(                      _cimServer->addAcceptor(HTTPAcceptor::IPV6_CONNECTION,
                                              PROPERTY_TIMEOUT,                          portNumberHttp, false);
                                              timeoutStr);                  }
                 if (!valid)                  if (addIP4Acceptor)
                 {                 {
                     cout << "Invalid timeout value specified: " << timeoutValue;                      _cimServer->addAcceptor(HTTPAcceptor::IPV4_CONNECTION,
                     cout << endl;                          portNumberHttp, false);
                     exit(1);  
                 }                 }
             }             }
               else // Restricted listening
             shutdownCIMOM(forceOption, timeoutStr);              {
             cout << "Pegasus CIM Server terminated." << endl;                  _restrictListening(
             exit(0);                      configManager, listenOn, portNumberHttp, false);
         }         }
  
         //              // The port number is converted to a string to avoid the
         // Grab the port option:              //  addition of localized characters (e.g., "5,988").
         //              char scratchBuffer[22];
               Uint32 n;
         portOption = configManager->getCurrentValue("port");              const char * portNumberHttpStr = Uint32ToString(
                   scratchBuffer, portNumberHttp, n);
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                   "Listening on HTTP port $0.", portNumberHttpStr);
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
   #if defined(PEGASUS_DEBUG)
               cout << MessageLoader::getMessage(parms) << endl;
   #endif
           }
  
           if (enableHttpsConnection)
           {
               Uint32 portNumberHttps = 0;
               String httpsPort = configManager->getCurrentValue("httpsPort");
               if (httpsPort.size() == 0)
               {
         //         //
         // Check the trace options and set global variable                  // Look up the WBEM-HTTPS port number
         //         //
                   portNumberHttps = System::lookupPort(
         if (String::equal(configManager->getCurrentValue("trace"), "true"))                      WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
                   _initConfigProperty("httpsPort", portNumberHttps);
               }
               else
         {         {
             Handler::setMessageTrace(true);                  Uint64 longNumber;
             pegasusIOTrace = true;                  // use the current value which has been checked for validity at
             cout << "Trace Set" << endl;                  // load(fct. GetOptions), see DefaultPropertyOwner::isValid()
                   StringConversion::decimalStringToUint64(
                       httpsPort.getCString(),
                       longNumber);
                   portNumberHttps = longNumber & 0xffff;
         }         }
         //  
         // Check the log trace options and set global variable  
         //  
  
         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))              String listenOn = configManager->getCurrentValue("listenAddress");
               if(String::equalNoCase(listenOn, "All"))
               {
                   if (addIP6Acceptor)
         {         {
             Handler::setMessageLogTrace(true);                      _cimServer->addAcceptor(HTTPAcceptor::IPV6_CONNECTION,
             pegasusIOLog = true;                          portNumberHttps, true);
                   }
                   if (addIP4Acceptor)
                   {
                       _cimServer->addAcceptor(HTTPAcceptor::IPV4_CONNECTION,
                           portNumberHttps, true);
                   }
               }
               else //Restricted
               {
                   _restrictListening(
                       configManager, listenOn, portNumberHttps, true);
         }         }
  
         // Get the log file directory definition.              // The port number is converted to a string to avoid the
         // We put String into Cstring because              //  addition of localized characters (e.g., "5,989").
         // Directory functions only handle Cstring.              char scratchBuffer[22];
         // ATTN-KS: create String based directory functions.              Uint32 n;
               const char * portNumberHttpsStr = Uint32ToString(
         logsDirectory = configManager->getCurrentValue("logdir");                  scratchBuffer, portNumberHttps, n);
               MessageLoaderParms parms(
         // Set up the Logger. This does not open the logs                  "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
         // Might be more logical to clean before set.                  "Listening on HTTPS port $0.", portNumberHttpsStr);
         // ATTN: Need tool to completely disable logging.              Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
         Logger::setHomeDirectory(logsDirectory);                  parms);
   #if defined(PEGASUS_DEBUG)
               cout << MessageLoader::getMessage(parms) << endl;
   #endif
           }
  
         if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))  #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
         {         {
             Logger::clean(logsDirectory);;              _cimServer->addAcceptor(HTTPAcceptor::LOCAL_CONNECTION, 0, false);
   
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_LOCAL",
                   "Listening on local connection socket.");
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
   # if defined(PEGASUS_DEBUG)
               cout << MessageLoader::getMessage(parms) << endl;
   # endif
         }         }
   #endif
  
         // Leave this in until people get familiar with the logs.          _cimServer->bind();
         cout << "Logs Directory = " << logsDirectory << endl;  
  
         if (String::equal(configManager->getCurrentValue("slp"), "true"))          // 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)
         {         {
             useSLP =  true;              _cimServerProcess->notify_parent(0);
         }         }
  
         if (String::equal(configManager->getCurrentValue("SSL"), "true"))  #if defined(PEGASUS_DEBUG)
         {          cout << "Started. " << endl;
             useSSL =  true;  #endif
   
           // Put server started message to the logger
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
               Logger::INFORMATION,
               MessageLoaderParms(
                   "src.Server.cimserver.STARTED_VERSION",
                   "Started $0 version $1.",
                   _cimServerProcess->getProductName(),
                   _cimServerProcess->getCompleteVersion()));
   
   #if defined(PEGASUS_OS_TYPE_UNIX) && !defined(PEGASUS_OS_ZOS)
           if (daemonOption && !debugOutputOption)
           {
               // Direct standard input, output, and error to /dev/null,
               // since we are running as a daemon.
               close(STDIN_FILENO);
               open("/dev/null", O_RDONLY);
               close(STDOUT_FILENO);
               open("/dev/null", O_RDWR);
               close(STDERR_FILENO);
               open("/dev/null", O_RDWR);
         }         }
   #endif
     }     }
     catch (UnrecognizedConfigProperty e)      catch (Exception& e)
     {     {
         cout << "Error: " << e.getMessage() << endl;          MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
     }              "cimserver not started: $0", e.getMessage());
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
     char* address = portOption.allocateCString();              parms);
           cerr << MessageLoader::getMessage(parms) << endl;
  
     // Put out startup up message.          deleteCIMServer();
     cout << PEGASUS_NAME << PEGASUS_VERSION <<  
          " on port " << address << endl;  
     cout << "Built " << __DATE__ << " " << __TIME__ << endl;  
     cout <<"Started..."  
          << (pegasusIOTrace ? " Tracing to Display ": " ")  
          << (pegasusIOLog ? " Tracing to Log ": " ")  
          << (useSLP ? " SLP reg. " : " No SLP ")  
          << (useSSL ? " Use SSL " : " No SSL ")  
         << endl;  
   
     // Put server start message to the logger  
     Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
         "Start $0 $1 port $2 $3 $4 $5",  
                 PEGASUS_NAME,  
                 PEGASUS_VERSION,  
                 address,  
                 (pegasusIOTrace ? " Tracing": " "),  
                 (useSLP ? " SLP on " : " SLP off "),  
                 (useSSL ? " Use SSL " : " No SSL "));  
  
     // do we need to run as a daemon ?          //
           // notify parent process (if there is a parent process) to terminate
           //
     if (daemonOption)     if (daemonOption)
     {              _cimServerProcess->notify_parent(1);
         if(-1 == cimserver_fork())  
           exit(-1);          return 1;
     }     }
  
     // try loop to bind the address, and run the server      // Run the main CIM Server loop
   
     try     try
     {     {
 #ifndef PEGASUS_OS_ZOS  #if defined(PEGASUS_OS_ZOS)
         slp_client *discovery = new slp_client() ;;  
         String serviceURL;          // ARM is a z/OS internal restart facility.
         serviceURL.assign("service:cim.pegasus://");          // This is a z/OS specific change.
         String host_name = slp_get_host_name();  
         serviceURL += host_name;  
         serviceURL += ":";  
         serviceURL += address;  
         char *url = serviceURL.allocateCString();  
         //      free(host_name);  
 #endif  
   
         Monitor monitor;  
         CIMServer server(&monitor, pegasusHome, useSSL);  
   
         // bind throws an exception of the bind fails  
         cout << "Binding to " << address << endl;  
   
         char* end = 0;  
         long portNumber = strtol(address, &end, 10);  
         assert(end != 0 && *end == '\0');  
         server.bind(portNumber);  
  
         delete [] address;          // Instatiating the automatic restart manager for zOS
           ARM_zOS automaticRestartManager;
  
         time_t last = 0;          // register to zOS ARM
           automaticRestartManager.Register();
   
   #endif
   
   #ifdef PEGASUS_ENABLE_SLP
           _cimServer->startSLPProvider();
   #endif
           _cimServer->initComplete();
  
         //         //
         // 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())
         {  
 #ifndef PEGASUS_OS_ZOS  
           if(useSLP  )  
           {           {
             if(  (time(NULL) - last ) > 60 )              _cimServer->runForever();
             {  
               if( discovery != NULL && url != NULL )  
                 discovery->srv_reg_all(url,  
                                        "(namespace=root/cimv2)",  
                                        "service:cim.pegasus",  
                                        "DEFAULT",  
                                        70) ;  
               time(&last);  
             }             }
  
             discovery->service_listener();          //
           }          // normal termination
           //
   
   #if defined(PEGASUS_OS_ZOS)
   
           // ARM is a z/OS internal restart facility.
           // This is a z/OS specific change.
   
           // register to zOS ARM
           automaticRestartManager.DeRegister();
   
 #endif #endif
           server.runForever();  
         }  
  
         // This statement is unrechable!          // Put server shutdown message to the logger
         //          Logger::put_l(
         // Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,              Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
         //   "Normal Termination");              MessageLoaderParms(
                   "src.Server.cimserver.STOPPED",
                   "$0 stopped.", _cimServerProcess->getProductName()));
     }     }
     catch(Exception& e)     catch(Exception& e)
     {     {
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          MessageLoaderParms parms(
             "Abnormal Termination $0", e.getMessage());              "src.Server.cimserver.ERROR",
               "Error: $0",
         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);              e.getMessage());
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               parms);
           cerr << MessageLoader::getMessage(parms) << endl;
   
       //delete the start up lock file
   #if defined(PEGASUS_OS_TYPE_UNIX)
       System::removeFile(startupLockFileName);
   #endif
           deleteCIMServer();
           return 1;
     }     }
  
       //delete the start up lock file
   #if defined(PEGASUS_OS_TYPE_UNIX)
       System::removeFile(startupLockFileName);
   #endif
       deleteCIMServer();
     return 0;     return 0;
 } }


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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2