(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.46 and 1.202

version 1.46, 2002/05/13 21:47:11 version 1.202, 2007/06/19 17:58:04
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%2006////////////////////////////////////////////////////////////////////////
 // //
 // 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.
   // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; Symantec Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 20 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Mike Day (mdday@us.ibm.com)  
 //  
 // Modified By: Karl Schopmeyer (k.schopmeyer@opengroup.org)  
 //  
 // Modified By: Nag Boranna (nagaraja_boranna@hp.com)  
 //  
 // Modified By: Jenny Yu (jenny_yu@hp.com)  
 //  
 // Modified By: Sushma Fernandes (sushma_fernandes@hp.com)  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
 // //
 // 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.
 // //
 // 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 62 
Line 64 
 // To START the Pegasus service, // To START the Pegasus service,
 // //
 // net start cimserver // net start cimserver
   // or
   // cimserver -start
 // //
 // To STOP the Pegasus service, // To STOP the Pegasus service,
 // //
 // net stop cimserver // net stop cimserver
   // or
   // cimserver -stop
 // //
 // Alternatively, you can use the windows service manager. Pegasus shows up // Alternatively, you can use the windows service manager. Pegasus shows up
 // in the service database as "Pegasus CIM Object Manager" // in the service database as "Pegasus CIM Object Manager"
 // //
 // Mike Day, mdday@us.ibm.com  
 //  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
  
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
 #include <iostream>  #include <Pegasus/Common/Constants.h>
 #include <cassert>  #include <Pegasus/Common/PegasusAssert.h>
 #include <cstdlib>  
 #include <fstream>  
 #include <Pegasus/Common/FileSystem.h> #include <Pegasus/Common/FileSystem.h>
 #include <Pegasus/Common/Monitor.h> #include <Pegasus/Common/Monitor.h>
 #include <Pegasus/Server/CIMServer.h>  
 #include <Pegasus/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
 #include <Pegasus/Common/System.h> #include <Pegasus/Common/System.h>
 #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/Tracer.h>
   #include <Pegasus/Common/LanguageParser.h>
 #include <Pegasus/Config/ConfigManager.h> #include <Pegasus/Config/ConfigManager.h>
 #include <Pegasus/Client/CIMClient.h> #include <Pegasus/Client/CIMClient.h>
 #include <Pegasus/Server/ShutdownService.h>  #include <Pegasus/Server/CIMServer.h>
 #include <Pegasus/Common/Destroyer.h>  #include <Service/ServerProcess.h>
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX)  #include <Service/ServerShutdownClient.h>
 #include <slp/slp.h>  #include <Service/ServerRunStatus.h>
   
   #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
   #include <Service/ARM_zOS.h>
   # ifdef PEGASUS_ZOS_SECURITY
   // This include file will not be provided in the OpenGroup CVS for now.
   // Do NOT try to include it in your compile
   #  include <Pegasus/Common/safCheckzOS_inline.h>
   # endif
 #endif #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 #endif
  
   #include <Pegasus/Common/Executor.h>
   
 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_SERVICE_NAME
   #define PEGASUS_SERVICE_NAME "Pegasus CIM Object Manager";
   #endif
   #ifndef PEGASUS_SERVICE_DESCRIPTION
   #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
   #endif
   
   class CIMServerProcess : public ServerProcess
   {
   public:
   
       CIMServerProcess(void)
       {
           cimserver_set_process(this);
       }
   
       virtual ~CIMServerProcess(void)
       {
       }
   
       //defined in PegasusVersion.h
       virtual const char* getProductName() const
       {
           return PEGASUS_PRODUCT_NAME;
       }
   
       virtual const char* getExtendedName() const
       {
           return PEGASUS_SERVICE_NAME;
       }
   
       virtual const char* getDescription() const
       {
           return PEGASUS_SERVICE_DESCRIPTION;
       }
   
       //defined in PegasusVersion.h
       virtual const char* getCompleteVersion() const
       {
         if (*PEGASUS_PRODUCT_STATUS == '\0' )
           return PEGASUS_PRODUCT_VERSION;
         else
           return PEGASUS_PRODUCT_VERSION " " PEGASUS_PRODUCT_STATUS;
       }
   
       //defined in PegasusVersion.h
       virtual const char* getVersion() const
       {
           return PEGASUS_PRODUCT_VERSION;
       }
   
       virtual const char* getProcessName() const
       {
           return PEGASUS_PROCESS_NAME;
       }
   
       //defined in Constants.h
       virtual const char* getPIDFileName() const
       {
           return PEGASUS_CIMSERVER_START_FILE;
       }
   
       int cimserver_run(
           int argc,
           char** argv,
           Boolean shutdownOption,
           Boolean debugOutputOption);
   
       void cimserver_stop(void);
   };
   
   ServerRunStatus _serverRunStatus(
       PEGASUS_PROCESS_NAME, PEGASUS_CIMSERVER_START_FILE);
   AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
   static CIMServer* _cimServer = 0;
   static Monitor* _monitor = 0;
   static Thread* dummyInitialThread = 0;
 // //
 //  The command name. //  The command name.
 // //
Line 128 
Line 223 
  
 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   LONG_VERSION []  = "version";
  
 static const char OPTION_TIMEOUT     = 'T';  static const char OPTION_DEBUGOUTPUT = 'X';
  
 static const String NAMESPACE = "root/PG_Internal";  static const String PROPERTY_TIMEOUT = "shutdownTimeout";
 static const String CLASSNAME_SHUTDOWNSERVICE = "PG_ShutdownService";  
 static const String PROPERTY_TIMEOUT = "operationTimeout";  
 static const String CIMSERVERSTART_FILE = "/etc/wbem/cimserver_start.conf";  
  
 ConfigManager*    configManager; ConfigManager*    configManager;
  
 /** GetOptions function - This function defines the Options Table /** GetOptions function - This function defines the Options Table
     and sets up the options from that table using the config manager.     and sets up the options from that table using the config manager.
   
       Some possible exceptions:  NoSuchFile, FileNotReadable, CannotRenameFile,
       ConfigFileSyntaxError, UnrecognizedConfigProperty, InvalidPropertyValue,
       CannotOpenFile.
 */ */
 void GetOptions( void GetOptions(
     ConfigManager* cm,     ConfigManager* cm,
     int& argc,     int& argc,
     char** argv,     char** argv,
     const String& pegasusHome)      Boolean shutdownOption)
 {  
     try  
     {  
         cm->mergeConfigFiles();  
   
         cm->mergeCommandLine(argc, argv);  
     }  
     catch (NoSuchFile nsf)  
     {  
         throw nsf;  
     }  
     catch (FileNotReadable fnr)  
     {  
         throw fnr;  
     }  
     catch (CannotRenameFile ftrf)  
     {  
         throw ftrf;  
     }  
     catch (ConfigFileSyntaxError cfse)  
     {     {
         throw cfse;      if (shutdownOption)
     }  
     catch(UnrecognizedConfigProperty ucp)  
     {     {
         throw ucp;          cm->loadConfigFiles();
     }     }
     catch(InvalidPropertyValue ipv)      else
     {     {
         throw ipv;          cm->mergeConfigFiles();
     }     }
   
       // Temporarily disable updates to the current configuration
       // file if shutdownOption is true
       cm->useConfigFiles = (shutdownOption==false);
   
       cm->mergeCommandLine(argc, argv);
   
       // Enable updates again
       cm->useConfigFiles = true;
 } }
  
 /* PrintHelp - This is temporary until we expand the options manager to allow /* PrintHelp - This is temporary until we expand the options manager to allow
Line 186 
Line 271 
 */ */
 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 "
     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 ("    logdir=/pegasus/logs - directory for log files\n");          "property\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, Uint32 timeoutValue)  // This needs to be called at various points in the code depending on the
   // platform and error conditions.
   // We need to delete the _cimServer reference on exit in order for the
   // destructors to get called.
   void deleteCIMServer()
 { {
     //      if (_cimServer)
     // Create CIMClient object      {
     //          delete _cimServer;
     CIMClient client;          _cimServer = 0;
  
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) || \
       defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
     //     //
     // Get the port number          //  Remove the PID file to indicate CIMServer termination
     //     //
     String portNumberStr = configManager->getCurrentValue("port");          FileSystem::removeFile(_cimServerProcess->getPIDFileName());
   #endif
       }
  
     String hostStr = System::getHostName();      delete _monitor;
     hostStr.append(":");  
     hostStr.append(portNumberStr);  
  
     // Put server shutdown message to the logger      if (dummyInitialThread)
     Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,      {
         "Shutdown $0 on port $1.", PEGASUS_NAME, portNumberStr);          Thread::clearLanguages();
           delete dummyInitialThread;
       }
   }
  
     //     //
     // 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.connectLocal();      return (ThreadReturnType)0;
     }     }
     catch(CIMClientException& e)  
     {  
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
             "Failed to connect to $0 $1.", PEGASUS_NAME, e.getMessage());  
  
         PEGASUS_STD(cerr) << "Failed to connect to server: ";  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
         PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);  
         exit(0);  
     }  
  
     try  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;      for (int i = 1; i < argc; i++)
         Array<CIMParamValue> outParams;      {
           if (strcmp(argv[i], OPT) == 0)
           {
               // Check for missing option argument.
  
         inParams.append(CIMParamValue("force",              if (i + 1 == argc)
             CIMValue(Boolean(forceOption))));              {
                   MessageLoaderParms parms(
                       "src.Server.cimserver.MISSING_OPTION_ARGUMENT",
                       "Missing argument for $0 option.",
                       OPT);
                   cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                       endl;
                   exit(1);
               }
  
         inParams.append(CIMParamValue("timeout",              // Convert argument to positive integer.
             CIMValue(Uint32(timeoutValue))));  
  
         CIMValue retValue = client.invokeMethod(              char* end;
             NAMESPACE,              unsigned long x = strtoul(argv[i+1], &end, 10);
             reference,  
             "shutdown",  
             inParams,  
             outParams);  
  
         // Put server shutdown message to the logger              // Check whether option argument will fit in a signed integer.
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
             "$0 terminated on port $1.", PEGASUS_NAME, portNumberStr);  
  
     }              if (*end != '\0' || x > 2147483647)
     catch(CIMClientCIMException& e)  
     {     {
         PEGASUS_STD(cerr) << "Failed to shutdown server: ";                  MessageLoaderParms parms(
         PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);                      "src.Server.cimserver.BAD_OPTION_ARGUMENT",
                       "Bad $0 option argument: $1.",
                       OPT,
                       argv[i+1]);
                   cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                       endl;
         exit(1);         exit(1);
     }     }
     catch(CIMClientException& e)  
     {              sock = int(x);
         //  
         // This may mean the cimserver has been terminated and returns the              // Remove "-x <sock>" from argv-argc.
         // "Empty HTTP response message" HTTP error response.  To be sure,  
         // we need to check if cimserver is indeed terminated.              memmove(argv + i, argv + i + 2, sizeof(char*) * (argc - i - 1));
         //              argc -= 2;
 #ifdef PEGASUS_OS_TYPE_UNIX              break;
         System::sleep(1);  
         int ret = system("ps -ef | grep cimserver | grep -v grep | grep -v cimserverd >/dev/null");  
         if (ret == 0)  
         {  
             // cimserver has been terminated  
             // Put server shutdown message to the logger  
             Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  
                 "$0 terminated on port $1.", PEGASUS_NAME, portNumberStr);  
         }  
         else  
         {  
             // cimserver is still running  
             PEGASUS_STD(cerr) << "Failed to shutdown server: ";  
             PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);  
             exit(1);  
         }         }
 #endif  
     }     }
     catch(Exception& e)  
       if (sock == -1)
     {     {
         PEGASUS_STD(cerr) << "Failed to shutdown server: ";          MessageLoaderParms parms(
         PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);              "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 */
  
 ///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
 //  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;
   
   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
       setlocale(LC_ALL, "");
   #endif
  
   #ifndef PEGASUS_OS_TYPE_WINDOWS
     //     //
     // Get environment variables:     // Get environment variables:
     //     //
   # if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
       pegasusHome = AIX_RELEASE_PEGASUS_HOME;
   # elif !defined(PEGASUS_USE_RELEASE_DIRS) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
     const char* tmp = getenv("PEGASUS_HOME");     const char* tmp = getenv("PEGASUS_HOME");
  
     if (tmp)     if (tmp)
     {     {
         pegasusHome = tmp;         pegasusHome = tmp;
     }     }
   # endif
  
     FileSystem::translateSlashes(pegasusHome);     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.
  
     // on Windows NT if there are no command-line options, run as a service      Executor::setSock(_extractExecutorSockOpt(argc, argv));
  
     if (argc == 1 )      // Ping executor to verify the specified socket is valid.
   
       if (Executor::ping() != 0)
     {     {
       cim_server_service(argc, argv);          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);
     }     }
     else  
     {  #endif /* !defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */
         // Get help, version and home options  
           // Get help, version, and shutdown options
  
         for (int i = 1; i < argc; )         for (int i = 1; i < argc; )
         {         {
             const char* arg = argv[i];             const char* arg = argv[i];
               if (String::equal(arg,"--help"))
               {
                       PrintHelp(argv[0]);
                       exit(0);
               }
               else if (String::equal(arg,"--version"))
               {
                   cout << _cimServerProcess->getCompleteVersion() << endl;
                   exit(0);
               }
             // Check for -option             // Check for -option
             if (*arg == '-')              else if (*arg == '-')
             {             {
                 // Get the option                 // Get the option
                 const char* option = arg + 1;                 const char* option = arg + 1;
Line 386 
Line 523 
                 //                 //
                 // 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;
                     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)
                     {                     {
Line 407 
Line 548 
                     }                     }
                     else                     else
                     {                     {
                         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
                 //                 //
                 // Check to see if user asked for shutdown (-s option):                  // Check to see if user asked for debug output (-X option):
                 //  
                 else if (*option == OPTION_SHUTDOWN)  
                 {  
                     //  
                     // Check to see if shutdown has already been specified:  
                     //                     //
                     if (shutdownOption)                  else if (*option == OPTION_DEBUGOUTPUT &&
                           (strlen(option) == 1))
                     {                     {
                         cout << "Duplicate shutdown option specified." << endl;                      MessageLoaderParms parms(
                         exit(0);                          "src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
                     }                          "Unsupported debug output option is enabled.");
                     shutdownOption = true;                      cout << MessageLoader::getMessage(parms) << endl;
   
                       debugOutputOption = true;
   
   #if defined(PEGASUS_OS_HPUX)
                       System::bindVerbose = true;
   #endif
  
                     // 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)  
                 {  
                     //                     //
                     // 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;                          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)  
                 {  
                     //  
                     // Check to see if shutdown has been specified:  
                     //  
                     if (!shutdownOption)  
                     {  
                         cout << "Invalid option -" << option << endl;  
                         exit(0);  
                     }  
   
                     if (timeoutOption)  
                     {  
                         cout << "Duplicate timeout option specified." << endl;  
                         exit(0);  
                     }  
   
                     timeoutOption = true;  
   
                     if (i + 1 < argc)  
                     {  
                         // get timeout value  
                         timeoutStr.assign(argv[i + 1]);  
   
                         // validate timeout value string  
                         char* tmp = timeoutStr.allocateCString();  
                         char* end = 0;  
                         timeoutValue  = strtol(tmp, &end, 10);  
   
                         if (!end || *end != '\0')  
                         {  
                             cout << "invalid timeout value specified: ";  
                             cout << timeoutStr << endl;  
                             delete [] tmp;  
                             exit(0);  
                         }  
                     }  
                     else  
                     {  
                         cout << "Missing argument for option -";  
                         cout << option << endl;  
                         exit(0);  
                     }  
   
                     // remove the option from the command line  
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));  
                     argc -= 2;  
                 }  
                 else                 else
                     i++;                     i++;
             }             }
             else             else
                 i++;                 i++;
         }         }
     }  
  
     //     //
     // Set the value for pegasusHome property     // Set the value for pegasusHome property
Line 521 
Line 620 
     ConfigManager::setPegasusHome(pegasusHome);     ConfigManager::setPegasusHome(pegasusHome);
  
     //     //
     // Get an instance of the Config Manager.      // Do the platform specific run
     //     //
     configManager = ConfigManager::getInstance();  
  
     //      return _cimServerProcess->platform_run(
     // Get options (from command line and from configuration file); this          argc, argv, shutdownOption, debugOutputOption);
     // removes corresponding options and their arguments from the command  
     // line.  
     //  
     try  
     {  
         GetOptions(configManager, argc, argv, pegasusHome);  
     }     }
     catch (Exception& e)  
   void CIMServerProcess::cimserver_stop()
     {     {
         cerr << argv[0] << ": " << e.getMessage() << endl;      _cimServer->shutdownSignal();
         exit(1);  
     }     }
  
   
     try  
     {  
         //         //
         // Check to see if we should (can) install as a NT service  // The main, common, running code
         //         //
   // NOTE: Do NOT call exit().  Use return(), otherwise some platforms
         if (String::equal(configManager->getCurrentValue("install"), "true"))  // will fail to shutdown properly/cleanly.
         {  
             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  // TODO: Current change minimal for platform "service" shutdown bug fixes.
   // Perhaps further extract out common stuff and put into main(), put
   // daemon stuff into platform specific platform_run(), etc.
   // Note: make sure to not put error handling stuff that platform
   // specific runs may need to deal with better (instead of exit(), etc).
         //         //
  
         if (String::equal(configManager->getCurrentValue("remove"), "true"))  int CIMServerProcess::cimserver_run(
         {      int argc,
             if( 0 != cimserver_remove_nt_service() )      char** argv,
       Boolean shutdownOption,
       Boolean debugOutputOption)
             {             {
                 cout << "\nPegasus removed as NT Service";      String logsDirectory;
                 exit(0);      Boolean daemonOption = false;
             }  
         }  
  
         //         //
         // Check to see if we should Pegasus as a daemon      // Get an instance of the Config Manager.
         //         //
       configManager = ConfigManager::getInstance();
       configManager->useConfigFiles = true;
  
         if (String::equal(configManager->getCurrentValue("daemon"), "true"))      //
       // Get options (from command line and from configuration file); this
       // removes corresponding options and their arguments from the command
       // line.
       //
       try
       {
           // If current process is "cimserver -s" (shutdown option = true) the
           // contents of current config should not be overwritten by planned
           // config
           GetOptions(configManager, argc, argv, shutdownOption);
       }
       catch (Exception& e)
         {         {
             daemonOption = true;          Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started:  $0", e.getMessage());
   
           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);
   
           return(1);
       }
   
       // Set the home directory, msg sub-dir, into the MessageLoader.
       // This will be the default directory where the resource bundles
       // are found.
       MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
           ConfigManager::getInstance()->getCurrentValue("messageDir")));
   
       Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
           configManager->getCurrentValue("enableHttpConnection"));
       Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
           configManager->getCurrentValue("enableHttpsConnection"));
   
       // Make sure at least one connection is enabled
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
       if (!enableHttpConnection && !enableHttpsConnection)
       {
           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.");
           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 the log trace options and set global variable          // Check to see if we should start Pegasus as a daemon
         //         //
  
         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))          daemonOption = ConfigManager::parseBooleanValue(
         {              configManager->getCurrentValue("daemon"));
             pegasusIOLog = true;  
         }  
   
         // 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");  #if !defined(PEGASUS_USE_SYSLOGS)
         logsDirectory =         logsDirectory =
             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
   #endif
  
         // Set up the Logger. This does not open the logs         // Set up the Logger. This does not open the logs
         // Might be more logical to clean before set.         // Might be more logical to clean before set.
         // ATTN: Need tool to completely disable logging.         // ATTN: Need tool to completely disable logging.
  
   #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
       !defined(PEGASUS_USE_SYSLOGS)
         Logger::setHomeDirectory(logsDirectory);         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 =
                   configManager->getCurrentValue("shutdownTimeout");
               Uint32 timeoutValue =
                   strtol(configTimeout.getCString(), (char **)0, 10);
   #ifdef PEGASUS_SLP_REG_TIMEOUT
               // To deregister Pegasus with SLP
               unregisterPegasusFromSLP();
   #endif
   
               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
       }
       catch (UnrecognizedConfigProperty& e)
       {
           // UnrecognizedConfigProperty is already translated
           // thus, just output the message
           Logger::put(Logger::ERROR_LOG,
                       System::CIMSERVER,
                       Logger::SEVERE,
                       e.getMessage());
           cout << e.getMessage() << endl;
       }
       catch (Exception& ex)
       {
           Logger::put(Logger::ERROR_LOG,
                         System::CIMSERVER,
                         Logger::SEVERE,
                         ex.getMessage());
           cout << ex.getMessage() << endl;
           exit(1);
       }
   
   #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) && defined(PEGASUS_ZOS_SECURITY)
       startupCheckBPXServer(true);
       startupCheckProfileCIMSERVclassWBEM();
       startupEnableMSC();
   #endif
   
       // Bug 2148 - Here is the order of operations for determining the server
       // HTTP and HTTPS ports.
       // 1) If the user explicitly specified a port, use it.
       // 2) If the user did not specify a port, get the port from the services
       //    file.
       // 3) If no value is specified in the services file, use the IANA WBEM
       //    default port.
       // Note that 2 and 3 are done within the System::lookupPort method
       // An empty string from the ConfigManager implies that the user did not
       // specify a port.
   
       Uint32 portNumberHttps = 0;
       Uint32 portNumberHttp = 0;
       Uint32 portNumberExportHttps = 0;
   
       if (enableHttpsConnection)
       {
           String httpsPort = configManager->getCurrentValue("httpsPort");
           if (httpsPort == String::EMPTY)
           {
             //             //
             // if timeout was specified, validate the timeout value              // Look up the WBEM-HTTPS port number
             //             //
             if (timeoutOption)              portNumberHttps = System::lookupPort(
                   WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
           }
           else
             {             {
                 Boolean valid = configManager->validatePropertyValue(              //
                                              PROPERTY_TIMEOUT,              // user-specified
                                              timeoutStr);              //
                 if (!valid)              CString portString = httpsPort.getCString();
               char* end = 0;
               portNumberHttps = strtol(portString, &end, 10);
               if (!(end != 0 && *end == '\0'))
                 {                 {
                     cout << "Invalid timeout value specified: " << timeoutValue;                  InvalidPropertyValue e("httpsPort", httpsPort);
                     cout << endl;                  Logger::put_l(
                       Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                       "src.Server.cimserver.SERVER_NOT_STARTED",
                       "cimserver not started:  $0",
                       e.getMessage());
                   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);
                     exit(1);                     exit(1);
                 }                 }
             }             }
   
             shutdownCIMOM(forceOption, timeoutValue);  
   
             cout << "Pegasus CIM Server terminated." << endl;  
             exit(0);  
         }         }
  
       if (enableHttpConnection)
       {
           String httpPort = configManager->getCurrentValue("httpPort");
           if (httpPort == String::EMPTY)
           {
         //         //
         // Grab the port option:              // Look up the WBEM-HTTP port number
         //         //
               portNumberHttp = System::lookupPort(
         portOption = configManager->getCurrentValue("port");                  WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
           }
           else
           {
         //         //
         // Check the trace options and set global variable              // user-specified
         //         //
               CString portString = httpPort.getCString();
         if (String::equal(configManager->getCurrentValue("trace"), "true"))              char* end = 0;
               portNumberHttp = strtol(portString, &end, 10);
               if (!(end != 0 && *end == '\0'))
         {         {
             pegasusIOTrace = true;                  InvalidPropertyValue e("httpPort", httpPort);
             cout << "Trace Set" << endl;                  Logger::put_l(
                       Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                       "src.Server.cimserver.SERVER_NOT_STARTED",
                       "cimserver not started:  $0",
                       e.getMessage());
                   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);
                   exit(1);
               }
           }
         }         }
  
         // Leave this in until people get familiar with the logs.  #if defined(PEGASUS_DEBUG)
         cout << "Logs Directory = " << logsDirectory << endl;      // Put out startup up message.
       cout << _cimServerProcess->getProductName() << " " <<
           _cimServerProcess->getCompleteVersion() << endl;
       MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
                                "Built $0 $1\nStarting...",
                                __DATE__,
                                __TIME__);
   #endif
  
         if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))      // reset message loading to NON-process locale
         {      MessageLoader::_useProcessLocale = false;
             Logger::clean(logsDirectory);;  
         }  
  
         if (String::equal(configManager->getCurrentValue("slp"), "true"))      // 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)
         {         {
             useSLP =  true;          if (-1 == _cimServerProcess->cimserver_fork())
               return -1;
         }         }
  
         if (String::equal(configManager->getCurrentValue("SSL"), "true"))      // Now we are after the fork...
       // Create a dummy Thread object that can be used to store the
       // AcceptLanguageList object for CIM requests that are serviced
       // by this thread (initial thread of server).  Need to do this
       // because this thread is not in a ThreadPool, but is used
       // to service CIM requests.
       // The run function for the dummy Thread should never be called,
       dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
       Thread::setCurrent(dummyInitialThread);
       AcceptLanguageList default_al;
       try
         {         {
             useSSL =  true;           default_al = LanguageParser::getDefaultAcceptLanguages();
            Thread::setLanguages(new AcceptLanguageList(default_al));
         }         }
       catch (InvalidAcceptLanguageHeader& e)
       {
            Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
                "Could not convert the system process locale into a valid "
                    "AcceptLanguage format.");
            Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                e.getMessage());
     }     }
     catch (UnrecognizedConfigProperty e)  
   #ifndef PEGASUS_OS_TYPE_WINDOWS
       umask(S_IRWXG|S_IRWXO);
   #endif
   
   
   #if defined(PEGASUS_OS_TYPE_UNIX)
       //
       // CRITICAL SECTION BEGIN
       //
       // This is the beginning of the critical section regarding the
       // access to pidfile (file to indicate that the cimserver has started).
       // Sometimes, when 2 or more cimserver processes are started at the same
       // time, they can't detect the concurrent process execution because the
       // logic fails when pidfile is accessed concurrently.
   
       FILE* startupLockFile;
   
       if ((startupLockFile = fopen(ConfigManager::getHomedPath(
               CIMSERVER_LOCK_FILE).getCString(), "w")) != 0)
     {     {
         cout << "Error: " << e.getMessage() << endl;          lockf(fileno(startupLockFile), F_LOCK, 0);
     }     }
   #endif
  
     char* address = portOption.allocateCString();  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
       || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
       || defined(PEGASUS_OS_SOLARIS) || defined (PEGASUS_OS_VMS)
  
     // Put out startup up message.      //
     cout << PEGASUS_NAME << PEGASUS_VERSION <<      // check if CIMServer is already running
          " on port " << address << endl;      // if CIMServer is already running, print message and
     cout << "Built " << __DATE__ << " " << __TIME__ << endl;      // notify parent process (if there is a parent process) to terminate
     cout <<"Started..."      //
          << (pegasusIOTrace ? " Tracing to Display ": " ")      if (_serverRunStatus.isServerRunning())
          << (pegasusIOLog ? " Tracing to Log ": " ")      {
          << (useSLP ? " SLP reg. " : " No SLP ")          MessageLoaderParms parms(
          << (useSSL ? " Use SSL " : " No SSL ")              "src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
         << endl;              "Unable to start CIMServer. CIMServer is already running.");
           PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) <<
     // Put server start message to the logger              PEGASUS_STD(endl);
     Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          Logger::put(Logger::ERROR_LOG,System::CIMSERVER,Logger::INFORMATION,
         "Start $0 $1 port $2 $3 $4 $5",              MessageLoader::getMessage(parms));
                 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)
     {     {
         if(-1 == cimserver_fork())              _cimServerProcess->notify_parent(1);
           exit(-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
     {     {
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX)          _monitor = new Monitor();
         slp_client *discovery = new slp_client() ;;          _cimServer = new CIMServer(_monitor);
         String serviceURL;  
         serviceURL.assign("service:cim.pegasus://");          if (enableHttpConnection)
         String host_name = slp_get_host_name();          {
         serviceURL += host_name;              _cimServer->addAcceptor(false, portNumberHttp, false);
         serviceURL += ":";  
         serviceURL += address;              Logger::put_l(
         char *url = serviceURL.allocateCString();                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
         //      free(host_name);                  "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
 #endif                  "Listening on HTTP port $0.", portNumberHttp);
           }
         Monitor monitor;  
         CIMServer server(&monitor, useSSL);          if (enableHttpsConnection)
           {
         // bind throws an exception if the bind fails              _cimServer->addAcceptor(false, portNumberHttps, true);
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  
         cout << "Binding to domain socket" << endl;              Logger::put_l(
 #else                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
         cout << "Binding to " << address << endl;                  "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                   "Listening on HTTPS port $0.", portNumberHttps);
           }
   
   #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           _cimServer->addAcceptor(true, 0, false);
   
           Logger::put_l(
               Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
               "src.Server.cimserver.LISTENING_ON_LOCAL",
               "Listening on local connection socket.");
 #endif #endif
  
         char* end = 0;  #if defined(PEGASUS_DEBUG)
         long portNumber = strtol(address, &end, 10);          if (enableHttpConnection)
         assert(end != 0 && *end == '\0');          {
         server.bind(portNumber);              MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                   "Listening on HTTP port $0.", portNumberHttp);
               cout << MessageLoader::getMessage(parms) << endl;
           }
           if (enableHttpsConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                   "Listening on HTTPS port $0.", portNumberHttps);
               cout << MessageLoader::getMessage(parms) << endl;
           }
   
   # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           MessageLoaderParms parms(
               "src.Server.cimserver.LISTENING_ON_LOCAL",
               "Listening on local connection socket.");
           cout << MessageLoader::getMessage(parms) << endl;
   # endif
   #endif
  
         delete [] address;          _cimServer->bind();
  
         time_t last = 0;          // 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)
           {
   #if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION)
               Executor::daemonizeExecutor();
   #else
               _cimServerProcess->notify_parent(0);
   #endif
           }
  
 #if defined(PEGASUS_OS_HPUX)  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) || \
       defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // create a file to indicate that the cimserver has started          // create a file to indicate that the cimserver has started and
           // save the process id of the cimserver process in the file
         //         //
         fstream fs;          _serverRunStatus.setServerRunning();
         ArrayDestroyer<char> p(CIMSERVERSTART_FILE.allocateCString());  #endif
         fs.open(p.getPointer(), ios::in | ios::out);  
         if (!fs)  #if defined(PEGASUS_DEBUG)
         {          cout << "Started. " << endl;
   #endif
   
   #if defined(PEGASUS_OS_TYPE_UNIX)
             //             //
             // failed to create the file, write an entry to the log file          // CRITICAL SECTION END
             // and proceed  
             //             //
             Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          // Here is the unlock of file 'lock_file'. It closes the
                 "Failed to open the $0 file needed by cimserverd.",          // the critical section that guarantees the non concurrent access to
                 CIMSERVERSTART_FILE);          // pid file (file to indicate that the cimserver has started).
         }          //
         else  
           if (startupLockFile)
         {         {
             fs.close();              lockf(fileno(startupLockFile), F_ULOCK, 0);
               fclose(startupLockFile);
           }
   #endif
   
   
           // 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->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(0);
               open("/dev/null", O_RDONLY);
               close(1);
               open("/dev/null", O_RDWR);
               close(2);
               open("/dev/null", O_RDWR);
         }         }
 #endif #endif
  
   #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
   
           // ARM is a z/OS internal restart facility.
           // This is a z/OS specific change.
   
           // Instatiating the automatic restart manager for zOS
           ARM_zOS automaticRestartManager;
   
           // register to zOS ARM
           automaticRestartManager.Register();
   
   #endif
   
         //         //
         // Loop to call CIMServer's runForever() method until CIMServer         // Loop to call CIMServer's runForever() method until CIMServer
         // has been shutdown         // has been shutdown
         //         //
         while( !server.terminated() )          while (!_cimServer->terminated())
         {         {
 #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX)              _cimServer->runForever();
           if(useSLP  )  
           {  
             if(  (time(NULL) - last ) > 60 )  
             {  
               if( discovery != NULL && url != NULL )  
                 discovery->srv_reg_all(url,  
                                        "(namespace=root/cimv2)",  
                                        "service:cim.pegasus",  
                                        "DEFAULT",  
                                        70) ;  
               time(&last);  
             }  
   
             discovery->service_listener();  
           }  
 #endif  
           server.runForever();  
         }         }
  
         //         //
         // normal termination         // normal termination
         //         //
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
             "Normal Termination");  
  
 #if defined(PEGASUS_OS_HPUX)          // ARM is a z/OS internal restart facility.
           // This is a z/OS specific change.
   
           // register to zOS ARM
           automaticRestartManager.DeRegister();
   
   #endif
   
           // Put server shutdown message to the logger
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
               Logger::INFORMATION, "src.Server.cimserver.STOPPED",
               "$0 stopped.", _cimServerProcess->getProductName());
   
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // close the file at startup time to indicate that the cimserver          //  Note: do not remove the PID file created at startup time, since
         // has terminated normally.          //  shutdown is not complete until the CIMServer destructor completes.
         //         //
         FileSystem::removeFile(CIMSERVERSTART_FILE);  
 #endif #endif
     }     }
       catch (BindFailedException& e)
       {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started:  $0", e.getMessage());
           MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started: $0", e.getMessage());
   
           cerr << MessageLoader::getMessage(parms) << endl;
   
           //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
               _cimServerProcess->notify_parent(1);
   
           deleteCIMServer();
           return 1;
       }
     catch(Exception& e)     catch(Exception& e)
     {     {
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
             "Abnormal Termination $0", e.getMessage());              "src.Server.cimserver.ERROR",
               "Error: $0",
               e.getMessage());
           MessageLoaderParms parms(
               "src.Server.cimserver.ERROR",
               "Error: $0",
               e.getMessage());
           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);
  
         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);          deleteCIMServer();
           return 1;
     }     }
  
       deleteCIMServer();
     return 0;     return 0;
 } }


Legend:
Removed from v.1.46  
changed lines
  Added in v.1.202

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2