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

version 1.35, 2001/12/13 14:54:56 version 1.86, 2003/03/11 21:26:54
Line 1 
Line 1 
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM  // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   // The Open Group, Tivoli Systems
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 30 
Line 31 
 // //
 // Modified By: Jenny Yu (jenny_yu@hp.com) // Modified By: Jenny Yu (jenny_yu@hp.com)
 // //
   // Modified By: Sushma Fernandes (sushma_fernandes@hp.com)
   //              Carol Ann Krug Graves, Hewlett-Packard Company
   //                (carolann_graves@hp.com)
   //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
   //
   // Modified By: Dave Rosckes (rosckes@us.ibm.com)
   //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
Line 37 
Line 45 
 // //
 // Notes on deamon operation (Unix) and service operation (Win 32): // Notes on deamon operation (Unix) and service operation (Win 32):
 // //
 // To run pegasus as a daemon on Unix platforms, use the -d option:  // To run pegasus as a daemon on Unix platforms:
   //
   // cimserver
 // //
 // cimserver -d  // To NOT run pegasus as a daemon on Unix platforms, set the daemon config
   // property to false:
 // //
 // The -d option has no effect on windows operation.  // cimserver daemon=false
   //
   // The daemon config property has no effect on windows operation.
 // //
 // To shutdown pegasus, use the -s option: // To shutdown pegasus, use the -s option:
 // //
 // cimserver -s [-f] [-T timeout_value]  // cimserver -s
 // //
 // To run pegasus as an NT service, there are FOUR  different possibilities: // To run pegasus as an NT service, there are FOUR  different possibilities:
 // //
Line 74 
Line 87 
  
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
   #include <Pegasus/Common/Constants.h>
 #include <iostream> #include <iostream>
 #include <cassert> #include <cassert>
 #include <cstdlib> #include <cstdlib>
   #include <fstream>
 #include <Pegasus/Common/FileSystem.h> #include <Pegasus/Common/FileSystem.h>
 #include <Pegasus/Common/Monitor.h> #include <Pegasus/Common/Monitor.h>
 #include <Pegasus/Server/CIMServer.h> #include <Pegasus/Server/CIMServer.h>
 #include <Pegasus/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Protocol/Handler.h>  
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
 #include <Pegasus/Common/System.h> #include <Pegasus/Common/System.h>
 #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/Tracer.h>
 #include <Pegasus/Config/ConfigManager.h> #include <Pegasus/Config/ConfigManager.h>
 #include <Pegasus/Client/CIMClient.h> #include <Pegasus/Client/CIMClient.h>
 #include <Pegasus/Common/HTTPConnector.h>  
 #include <Pegasus/Server/ShutdownService.h> #include <Pegasus/Server/ShutdownService.h>
 #ifndef PEGASUS_OS_ZOS  #include <Pegasus/Common/Destroyer.h>
   #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)
 #include <slp/slp.h> #include <slp/slp.h>
 #endif #endif
  
Line 97 
Line 111 
 #if defined(PEGASUS_OS_TYPE_WINDOWS) #if defined(PEGASUS_OS_TYPE_WINDOWS)
 # include "cimserver_windows.cpp" # include "cimserver_windows.cpp"
 #elif defined(PEGASUS_OS_TYPE_UNIX) #elif defined(PEGASUS_OS_TYPE_UNIX)
   # if defined(PEGASUS_OS_OS400)
   #  include "cimserver_os400.cpp"
   # else
 # include "cimserver_unix.cpp" # include "cimserver_unix.cpp"
   #endif
 #else #else
 # error "Unsupported platform" # error "Unsupported platform"
 #endif #endif
Line 126 
Line 144 
  
 static const char OPTION_SHUTDOWN    = 's'; static const char OPTION_SHUTDOWN    = 's';
  
 static const char OPTION_FORCE       = 'f';  static const char OPTION_INSTALL[]   = "install";
   
 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");  static const char OPTION_REMOVE[]   = "remove";
  
     if (!tmp)  static const char OPTION_START[]   = "start";
     {  
         cerr << arg0 << ": PEGASUS_HOME environment variable undefined" << endl;  
         exit(1);  
     }  
  
     pegasusHome = tmp;  static const char OPTION_STOP[]   = "stop";
     FileSystem::translateSlashes(pegasusHome);  
 }  
  
 void SetEnvironmentVariables(  #if defined(PEGASUS_OS_HPUX)
     const char* arg0)  static const char OPTION_BINDVERBOSE = 'X';
 {  #endif
     cout << "PEGASUS_HOME is now " << arg0 << endl;  
  
     String str = "PEGASUS_HOME=";  static const String PROPERTY_TIMEOUT = "shutdownTimeout";
     str += arg0;  static const String CIMSERVERSTART_FILE = "/etc/opt/wbem/cimserver_start.conf";
     char* tmp = str.allocateCString();  
     putenv(tmp);  
  
     // Note: don't delete tmp! putenv() uses it.  ConfigManager*    configManager;
 }  
  
 /** GetOptions function - This function defines the Options Table /** GetOptions function - This function defines the Options Table
     and sets up the options from that table using the config manager.     and sets up the options from that table using the config manager.
Line 176 
Line 170 
     char** argv,     char** argv,
     const String& pegasusHome)     const String& pegasusHome)
 { {
     String currentFile = pegasusHome + "/" + CURRENT_CONFIG_FILE;  
     String plannedFile = pegasusHome + "/" + PLANNED_CONFIG_FILE;  
   
     try     try
     {     {
         cm->mergeConfigFiles(currentFile, plannedFile);          cm->mergeConfigFiles();
  
         cm->mergeCommandLine(argc, argv);         cm->mergeCommandLine(argc, argv);
     }     }
Line 224 
Line 215 
     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          - displays CIM Server version number\n");
     usage.append ("    -h          - prints this help message\n");     usage.append ("    -h          - prints this help message\n");
       usage.append ("    -s          - shuts down CIM Server\n");
   #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
     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 ("    -d          - runs pegasus as a daemon\n");  
     usage.append ("    -s [-f] [-T timeout] \n");  
     usage.append ("                - shuts down pegasus\n");  
     usage.append ("    -cleanlogs  - clears the log files at startup\n");  
     usage.append ("    -install    - installs pegasus as a Windows NT Service\n");     usage.append ("    -install    - installs pegasus as a Windows NT Service\n");
     usage.append ("    -remove     - removes pegasus as a Windows NT Service\n");     usage.append ("    -remove     - removes pegasus as a Windows NT Service\n");
     usage.append ("    -slp        - registers pegasus as a service with SLP\n\n");      usage.append ("    -start    - starts pegasus as a Windows NT Service\n");
     usage.append ("    -SSL        - uses SSL\n\n");      usage.append ("    -stop     - stops pegasus as a Windows NT Service\n");
   #endif
     usage.append ("  configProperty=value\n");     usage.append ("  configProperty=value\n");
     usage.append ("    port=nnnn            - sets port number to listen on\n");      usage.append ("                - sets CIM Server configuration property\n");
     usage.append ("    home=/pegasus/bin    - sets pegasus home directory\n");  
     usage.append ("    logdir=/pegasus/logs - directory for log files\n");  
  
     cout << endl;     cout << endl;
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
       cout << PLATFORM_PRODUCT_NAME << " " << PLATFORM_PRODUCT_VERSION << endl;
   #else
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;
   #endif
     cout << endl;     cout << endl;
     cout << usage << endl;     cout << usage << endl;
 } }
  
 void shutdownCIMOM(Boolean forceOption, String timeoutStr)  void shutdownCIMOM(Uint32 timeoutValue)
 { {
     //     //
     // Create CIMClient object     // Create CIMClient object
     //     //
     Monitor* monitor = new Monitor;      CIMClient client;
     HTTPConnector* httpConnector = new HTTPConnector(monitor);  
     CIMClient client(monitor, httpConnector);  
  
     //     //
     // Get the port number      // Get local host name
     //     //
     String portNumberStr = configManager->getCurrentValue("port");  
   
     String hostStr = System::getHostName();     String hostStr = System::getHostName();
     hostStr.append(":");  
     hostStr.append(portNumberStr);  
  
     //     //
     // open connection to CIMOM     // open connection to CIMOM
     //     //
     try     try
     {     {
         client.connect(hostStr.allocateCString());          client.connectLocal();
   
           //
           // set client timeout to 2 seconds
           //
           client.setTimeout(2000);
     }     }
     catch(Exception& e)     catch(Exception& e)
     {     {
         PEGASUS_STD(cerr) << "Failed to connect to server: " << e.getMessage() << PEGASUS_STD(endl);  #ifdef PEGASUS_OS_OS400
           Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                       "Unable to connect to CIM Server.  CIM Server may not be running." );
           // The server job may still be active but not responding.
           // Kill the job if it exists.
           cimserver_kill();
         exit(1);         exit(1);
   #else
           PEGASUS_STD(cerr) << "Unable to connect to CIM Server." << PEGASUS_STD(endl);
           PEGASUS_STD(cerr) << "CIM Server may not be running." << PEGASUS_STD(endl);
   #endif
           exit(0);
     }     }
  
     try     try
     {     {
         //         //
         // construct CIMReference          // construct CIMObjectPath
         //         //
         String referenceStr = "//";         String referenceStr = "//";
         referenceStr.append(hostStr);         referenceStr.append(hostStr);
         referenceStr.append("/root/cimv2:PG_ShutdownService");          referenceStr.append("/");
         CIMReference reference(referenceStr);          referenceStr.append(PEGASUS_NAMESPACENAME_SHUTDOWN.getString());
           referenceStr.append(":");
           referenceStr.append(PEGASUS_CLASSNAME_SHUTDOWN.getString());
           CIMObjectPath reference(referenceStr);
  
         //         //
         // issue the invokeMethod request on the shutdown method         // issue the invokeMethod request on the shutdown method
Line 297 
Line 299 
         Array<CIMParamValue> inParams;         Array<CIMParamValue> inParams;
         Array<CIMParamValue> outParams;         Array<CIMParamValue> outParams;
  
         if (forceOption)          // set force option to true for now
         {          inParams.append(CIMParamValue("force",
             inParams.append(CIMParamValue(              CIMValue(Boolean(true))));
                 CIMParameter("force", CIMType::STRING),  
                 CIMValue("TRUE")));  
         }  
         else  
         {  
             inParams.append(CIMParamValue(  
                 CIMParameter("force", CIMType::STRING),  
                 CIMValue("FALSE")));  
         }  
  
         inParams.append(CIMParamValue(          inParams.append(CIMParamValue("timeout",
             CIMParameter("timeout", CIMType::STRING),              CIMValue(Uint32(timeoutValue))));
             CIMValue(timeoutStr)));  
  
         CIMValue retValue = client.invokeMethod(         CIMValue retValue = client.invokeMethod(
             NAMESPACE,              PEGASUS_NAMESPACENAME_SHUTDOWN,
             reference,             reference,
             "shutdown",             "shutdown",
             inParams,             inParams,
             outParams);             outParams);
     }     }
     catch(Exception& e)      catch(CIMException& e)
       {
   #ifdef PEGASUS_OS_OS400
   
           if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
           {
               Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                       "Failed to shutdown server: $0", "The repository may be empty.");
           }
           else
           {
               Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                           "Failed to shutdown server: $0", e.getMessage());
           }
           // Kill the server job.
           cimserver_kill();
   #else
           PEGASUS_STD(cerr) << "Failed to shutdown server: ";
           if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
           {
               PEGASUS_STD(cerr) << "The repository may be empty.";
               PEGASUS_STD(cerr) << PEGASUS_STD(endl);
           }
           else
     {     {
         PEGASUS_STD(cerr) << "Failed to shutdown server: " << e.getMessage() << PEGASUS_STD(endl);              PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);
           }
   #endif
         exit(1);         exit(1);
   
       }
       catch(Exception& e)
       {
           //
           // This may mean the CIM Server has been terminated and returns a
           // "Empty HTTP response message" HTTP error response.  To be sure
           // CIM Server gets shutdown, if CIM Server is still running at
           // this time, we will kill the cimserver process.
           //
           // give CIM Server some time to finish up
           //
           //System::sleep(1);
           //cimserver_kill();
   
           //
           // Check to see if CIMServer is still running.  If CIMServer
           // is still running and the shutdown timeout has not expired,
           // loop and wait one second until either CIM Server is
           // terminated or until timeout expires.  If timeout expires
           // and CIMServer is still running, kill the CIMServer
           // process.
           //
           Uint32 maxWaitTime = timeoutValue - 2;
           Boolean running = isCIMServerRunning();
           while ( running && maxWaitTime > 0 )
           {
               System::sleep(1);
               running = isCIMServerRunning();
               maxWaitTime = maxWaitTime - 1;
     }     }
  
           if (running)
           {
               cimserver_kill();
           }
       }
       //catch(Exception& e)
       //{
       //    PEGASUS_STD(cerr) << "Error occurred while stopping the CIM Server: ";
       //    PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);
       //    exit(1);
       //}
   
     return;     return;
 } }
  
Line 337 
Line 396 
 int main(int argc, char** argv) int main(int argc, char** argv)
 { {
     String pegasusHome  = String::EMPTY;     String pegasusHome  = String::EMPTY;
     Boolean pegasusIOTrace = false;  
     Boolean pegasusIOLog = false;     Boolean pegasusIOLog = false;
     String portOption = String::EMPTY;  
     String logsDirectory = String::EMPTY;     String logsDirectory = String::EMPTY;
     Boolean useSLP = false;     Boolean useSLP = false;
     Boolean useSSL = false;  
     Boolean daemonOption = false;     Boolean daemonOption = false;
     Boolean shutdownOption = false;     Boolean shutdownOption = false;
     Boolean forceOption = false;      Uint32 timeoutValue  = 0;
     Boolean timeoutOption = false;  
     String  timeoutStr  = String::EMPTY;  #ifdef PEGASUS_OS_OS400
     long timeoutValue  = 0;      // Initialize Pegasus home to the shipped OS/400 directory.
       pegasusHome = OS400_DEFAULT_PEGASUS_HOME;
   #endif
   
   #ifndef PEGASUS_OS_TYPE_WINDOWS
       //
       // Get environment variables:
       //
       const char* tmp = getenv("PEGASUS_HOME");
  
       if (tmp)
       {
           pegasusHome = tmp;
       }
   
       FileSystem::translateSlashes(pegasusHome);
   #else
   
     // windows only
     setHome(pegasusHome);
   #endif
     // on Windows NT if there are no command-line options, run as a service     // on Windows NT if there are no command-line options, run as a service
  
     if (argc == 1 )     if (argc == 1 )
Line 358 
Line 433 
     }     }
     else     else
     {     {
         // Get help, version and home options          // Get help, version, and shutdown options
  
         for (int i = 1; i < argc; )         for (int i = 1; i < argc; )
         {         {
Line 373 
Line 448 
                 //                 //
                 // Check to see if user asked for the version (-v option):                 // Check to see if user asked for the version (-v option):
                 //                 //
                 if (*option == OPTION_VERSION)                  if (*option == OPTION_VERSION &&
                       strlen(option) == 1)
                 {                 {
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
                       cout << PLATFORM_PRODUCT_VERSION << endl;
   #else
                     cout << PEGASUS_VERSION << endl;                     cout << PEGASUS_VERSION << endl;
   #endif
                     exit(0);                     exit(0);
                 }                 }
                 //                 //
                 // Check to see if user asked for help (-h option):                 // Check to see if user asked for help (-h option):
                 //                 //
                 else if (*option == OPTION_HELP)                  else if (*option == OPTION_HELP &&
                           (strlen(option) == 1))
                 {                 {
                     PrintHelp(argv[0]);                     PrintHelp(argv[0]);
                     exit(0);                     exit(0);
                 }                 }
                 else if (*option == OPTION_HOME)  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
                   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
                     {                     {
Line 402 
Line 484 
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));
                     argc -= 2;                     argc -= 2;
                 }                 }
   #endif
   #if defined(PEGASUS_OS_HPUX)
                   //
                   // Check to see if user asked for the version (-X option):
                   //
                   if (*option == OPTION_BINDVERBOSE &&
                           (strlen(option) == 1))
                   {
                       System::bindVerbose = true;
                       cout << "Unsupported debug option, BIND_VERBOSE, enabled."
                            << endl;
                       // remove the option from the command line
                       memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
                       argc--;
                   }
   #endif
                 //                 //
                 // Check to see if user asked for shutdown (-s option):                 // Check to see if user asked for shutdown (-s option):
                 //                 //
                 else if (*option == OPTION_SHUTDOWN)                  else if (*option == OPTION_SHUTDOWN &&
                           (strlen(option) == 1))
                 {                 {
                     //                     //
                       // check to see if user is root
                       //
   #ifndef PEGASUS_OS_OS400
                       if (!System::isPrivilegedUser(System::getEffectiveUserName()))
                       {
                           cout << "You must have superuser privilege to run ";
                           cout << "cimserver." << endl;
                           exit(0);
                       }
   #endif
   
                       //
                     // Check to see if shutdown has already been specified:                     // Check to see if shutdown has already been specified:
                     //                     //
                     if (shutdownOption)                     if (shutdownOption)
Line 415 
Line 526 
                         cout << "Duplicate shutdown option specified." << endl;                         cout << "Duplicate shutdown option specified." << endl;
                         exit(0);                         exit(0);
                     }                     }
   
                     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)  #ifdef PEGASUS_OS_TYPE_WINDOWS
                   else if (strcmp(option, OPTION_INSTALL) == 0)
                 {                 {
                     //                     //
                     // Check to see if shutdown has been specified:                    // Install as a NT service
                     //                     //
                     if (!shutdownOption)                    if(cimserver_install_nt_service())
                     {                     {
                         cout << "Invalid option -" << option << endl;                        cout << "\nPegasus installed as NT Service";
                         exit(0);                         exit(0);
                     }                     }
                     else
                     {
                         exit(0);
                     }
                   }
                   else if (strcmp(option, OPTION_REMOVE) == 0)
                   {
                     //                     //
                     // Check to see if force has already been specified:                    // Remove Pegasus as an NT service
                     //                     //
                     if (forceOption)                    if(cimserver_remove_nt_service())
                     {
                         cout << "\nPegasus removed as NT Service";
                         exit(0);
                     }
                     else
                     {                     {
                         cout << "Duplicate force option specified." << endl;  
                         exit(0);                         exit(0);
                     }                     }
  
                     forceOption = true;  
   
                     // remove the option from the command line  
                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));  
                     argc--;  
                 }                 }
                 else if (*option == OPTION_TIMEOUT)                  else if (strcmp(option, OPTION_START) == 0)
                 {                 {
                     //                     //
                     // Check to see if shutdown has been specified:                    // Start as a NT service
                     //                     //
                     if (!shutdownOption)                    if(cimserver_start_nt_service())
                     {                     {
                         cout << "Invalid option -" << option << endl;                        cout << "\nPegasus started as NT Service";
                         exit(0);                         exit(0);
                     }                     }
                     else
                     if (timeoutOption)  
                     {                     {
                         cout << "Duplicate timeout option specified." << endl;  
                         exit(0);                         exit(0);
                     }                     }
                   }
                     timeoutOption = true;                  else if (strcmp(option, OPTION_STOP) == 0)
   
                     if (i + 1 < argc)  
                     {                     {
                         // get timeout value                    //
                         timeoutStr.assign(argv[i + 1]);                    // Stop as a NT service
                     //
                         // validate timeout value string                    if(cimserver_stop_nt_service())
                         char* tmp = timeoutStr.allocateCString();  
                         char* end = 0;  
                         timeoutValue  = strtol(tmp, &end, 10);  
   
                         if (!end || *end != '\0')  
                         {                         {
                             cout << "invalid timeout value specified: ";                        cout << "\nPegasus stopped as NT Service";
                             cout << timeoutStr << endl;  
                             delete [] tmp;  
                             exit(0);                             exit(0);
                         }                         }
                     }  
                     else                     else
                     {                     {
                         cout << "Missing argument for option -";  
                         cout << option << endl;  
                         exit(0);                         exit(0);
                     }                     }
   
                     // remove the option from the command line  
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));  
                     argc -= 2;  
                 }                 }
   #endif
                 else                 else
                     i++;                     i++;
             }             }
Line 503 
Line 604 
         }         }
     }     }
  
     if (pegasusHome.size() == 0)      //
         GetEnvironmentVariables(argv[0], pegasusHome);      // Set the value for pegasusHome property
       //
       ConfigManager::setPegasusHome(pegasusHome);
  
     //     //
     // Get an instance of the Config Manager.     // Get an instance of the Config Manager.
Line 522 
Line 625 
     }     }
     catch (Exception& e)     catch (Exception& e)
     {     {
   #ifdef PEGASUS_OS_OS400
           Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                           "$0: $1",argv[0] ,e.getMessage());
   #else
         cerr << argv[0] << ": " << e.getMessage() << endl;         cerr << argv[0] << ": " << e.getMessage() << endl;
   #endif
         exit(1);         exit(1);
     }     }
  
       // The "SSL" property overrides the enableHttp*Connection properties and
     try      // enables only the HTTPS connection.
     {      Boolean enableHttpConnection = (String::equal(
         //          configManager->getCurrentValue("enableHttpConnection"), "true") &&
         // Check to see if we should (can) install as a NT service          !String::equal(configManager->getCurrentValue("SSL"), "true"));
         //      Boolean enableHttpsConnection = (String::equal(
           configManager->getCurrentValue("enableHttpsConnection"), "true") ||
         if (String::equal(configManager->getCurrentValue("install"), "true"))          String::equal(configManager->getCurrentValue("SSL"), "true"));
         {  
             if( 0 != cimserver_install_nt_service( pegasusHome ))      // Make sure at least one connection is enabled
             {  #ifndef PEGASUS_LOCAL_DOMAIN_SOCKET
                 cout << "\nPegasus installed as NT Service";      if (!enableHttpConnection && !enableHttpsConnection)
                 exit(0);      {
             }          Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::WARNING,
               "Neither HTTP nor HTTPS connection is enabled.  "
               "CIMServer will not be started.");
           cerr << "Neither HTTP nor HTTPS connection is enabled.  "
               "CIMServer will not be started." << endl;
           exit(1);
         }         }
   #endif
  
         //      try
         // Check to see if we should (can) remove Pegasus as an NT service  
         //  
   
         if (String::equal(configManager->getCurrentValue("remove"), "true"))  
         {  
             if( 0 != cimserver_remove_nt_service() )  
             {             {
                 cout << "\nPegasus removed as NT Service";  
                 exit(0);  
             }  
         }  
   
         //         //
         // Check to see if we should Pegasus as a daemon         // Check to see if we should Pegasus as a daemon
         //         //
Line 565 
Line 668 
         }         }
  
         //         //
         // Check to see if we need to shutdown CIMOM  
         //  
         if (shutdownOption)  
         {  
             //  
             // if timeout was specified, validate the timeout value  
             //  
             if (timeoutOption)  
             {  
                 Boolean valid = configManager->validatePropertyValue(  
                                              PROPERTY_TIMEOUT,  
                                              timeoutStr);  
                 if (!valid)  
                 {  
                     cout << "Invalid timeout value specified: " << timeoutValue;  
                     cout << endl;  
                     exit(1);  
                 }  
             }  
   
             shutdownCIMOM(forceOption, timeoutStr);  
             cout << "Pegasus CIM Server terminated." << endl;  
             exit(0);  
         }  
   
         //  
         // Grab the port option:  
         //  
   
         portOption = configManager->getCurrentValue("port");  
   
         //  
         // Check the trace options and set global variable  
         //  
   
         if (String::equal(configManager->getCurrentValue("trace"), "true"))  
         {  
             Handler::setMessageTrace(true);  
             pegasusIOTrace = true;  
             cout << "Trace Set" << endl;  
         }  
         //  
         // Check the log trace options and set global variable         // Check the log trace options and set global variable
         //         //
  
         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))         if (String::equal(configManager->getCurrentValue("logtrace"), "true"))
         {         {
             Handler::setMessageLogTrace(true);  
             pegasusIOLog = true;             pegasusIOLog = true;
         }         }
  
Line 622 
Line 682 
         // ATTN-KS: create String based directory functions.         // ATTN-KS: create String based directory functions.
  
         logsDirectory = configManager->getCurrentValue("logdir");         logsDirectory = configManager->getCurrentValue("logdir");
           logsDirectory =
               ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
  
         // 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_OS_OS400)
         Logger::setHomeDirectory(logsDirectory);         Logger::setHomeDirectory(logsDirectory);
   #endif
  
         if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))          //
           // Check to see if we need to shutdown CIMOM
           //
           if (shutdownOption)
         {         {
             Logger::clean(logsDirectory);;              String configTimeout =
                   configManager->getCurrentValue("shutdownTimeout");
               timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);
   
               shutdownCIMOM(timeoutValue);
   
   #ifdef PEGASUS_OS_OS400
               Logger::put(Logger::ERROR_LOG, "", Logger::INFORMATION,
                           "CIM Server stopped.");
   #else
               cout << "CIM Server stopped." << endl;
   #endif
               exit(0);
         }         }
  
         // Leave this in until people get familiar with the logs.         // Leave this in until people get familiar with the logs.
   #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
   !defined(PEGASUS_OS_OS400)
         cout << "Logs Directory = " << logsDirectory << endl;         cout << "Logs Directory = " << logsDirectory << endl;
   #endif
  
         if (String::equal(configManager->getCurrentValue("slp"), "true"))          if (String::equal(configManager->getCurrentValue("cleanlogs"), "true"))
         {         {
             useSLP =  true;              Logger::clean(logsDirectory);;
         }         }
  
         if (String::equal(configManager->getCurrentValue("SSL"), "true"))          if (String::equal(configManager->getCurrentValue("slp"), "true"))
         {         {
             useSSL =  true;              useSLP =  true;
         }         }
     }     }
     catch (UnrecognizedConfigProperty e)     catch (UnrecognizedConfigProperty e)
     {     {
   
   #ifdef PEGASUS_OS_OS400
           Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                       "Error: $0",e.getMessage());
   #else
         cout << "Error: " << e.getMessage() << endl;         cout << "Error: " << e.getMessage() << endl;
   #endif
     }     }
  
     char* address = portOption.allocateCString();      Uint32 portNumberHttps;
       Uint32 portNumberHttp;
   
       if (enableHttpsConnection)
       {
           String httpsPort = configManager->getCurrentValue("httpsPort");
           CString portString = httpsPort.getCString();
           char* end = 0;
           Uint32 port = strtol(portString, &end, 10);
           assert(end != 0 && *end == '\0');
   
           //
           // Look up the WBEM-HTTPS port number
           //
           portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, port);
       }
   
       if (enableHttpConnection)
       {
           String httpPort = configManager->getCurrentValue("httpPort");
           CString portString = httpPort.getCString();
           char* end = 0;
           Uint32 port = strtol(portString, &end, 10);
           assert(end != 0 && *end == '\0');
   
           //
           // Look up the WBEM-HTTP port number
           //
           portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, port);
       }
  
     // Put out startup up message.     // Put out startup up message.
     cout << PEGASUS_NAME << PEGASUS_VERSION <<  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
          " on port " << address << endl;  !defined(PEGASUS_OS_OS400)
       cout << PEGASUS_NAME << PEGASUS_VERSION << endl;
     cout << "Built " << __DATE__ << " " << __TIME__ << endl;     cout << "Built " << __DATE__ << " " << __TIME__ << endl;
     cout <<"Started..."      cout <<"Starting..."
          << (pegasusIOTrace ? " Tracing to Display ": " ")  
          << (pegasusIOLog ? " Tracing to Log ": " ")          << (pegasusIOLog ? " Tracing to Log ": " ")
          << (useSLP ? " SLP reg. " : " No SLP ")          << (useSLP ? " SLP reg. " : " No SLP ")
          << (useSSL ? " Use SSL " : " No SSL ")  
         << endl;         << endl;
   #endif
     // 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 ?     // do we need to run as a daemon ?
     if (daemonOption)     if (daemonOption)
     {     {
         if(-1 == cimserver_fork())         if(-1 == cimserver_fork())
   #ifndef PEGASUS_OS_OS400
           {
           exit(-1);           exit(-1);
     }     }
   #else
           {
               return(-1);
           }
           else
           {
               return(0);
           }
   #endif
   
       }
   
   #ifdef PEGASUS_OS_OS400
       // Special server initialization code for OS/400.
       if (cimserver_initialize() != 0)
       {
           // do some logging here!
           Logger::put(Logger::ERROR_LOG, "", Logger::SEVERE,
                       "CIM Server failed to initialize");
           exit(-1);
       }
   #endif
   
   #ifdef PEGASUS_OS_HPUX
       umask(S_IWGRP|S_IWOTH);
   
       //
       // check if CIMServer is already running
       // if CIMServer is already running, print message and
       // notify parent process (if there is a parent process) to terminate
       //
       if(isCIMServerRunning())
       {
           cout << "Unable to start CIMServer." << endl;
           cout << "CIMServer is already running." << endl;
   
           //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
                   notify_parent();
   
           exit(1);
       }
   
   #endif
  
     // try loop to bind the address, and run the server     // try loop to bind the address, and run the server
     try     try
     {     {
 #ifndef PEGASUS_OS_ZOS  #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)
           char slp_address[32];
         slp_client *discovery = new slp_client() ;;         slp_client *discovery = new slp_client() ;;
         String serviceURL;         String serviceURL;
         serviceURL.assign("service:cim.pegasus://");         serviceURL.assign("service:cim.pegasus://");
         String host_name = slp_get_host_name();         String host_name = slp_get_host_name();
         serviceURL += host_name;          serviceURL.append(host_name);
         serviceURL += ":";          serviceURL.append(":");
         serviceURL += address;          // ATTN: Fix this to work for multiple connections
         char *url = serviceURL.allocateCString();          sprintf(slp_address, "%u",
         //      free(host_name);                  enableHttpConnection ? portNumberHttp : portNumberHttps);
           serviceURL.append(slp_address);
 #endif #endif
  
         Monitor monitor;          Monitor monitor(true);
         CIMServer server(&monitor, pegasusHome, useSSL);          CIMServer server(&monitor);
  
         // bind throws an exception of the bind fails          if (enableHttpConnection)
         cout << "Binding to " << address << endl;          {
               server.addAcceptor(false, portNumberHttp, false);
               Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
                           "Listening on HTTP port $0.", portNumberHttp);
           }
           if (enableHttpsConnection)
           {
               server.addAcceptor(false, portNumberHttps, true);
               Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
                           "Listening on HTTPS port $0.", portNumberHttps);
           }
   #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
           server.addAcceptor(true, 0, false);
           Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
                       "Listening on local connection socket.");
   #endif
  
         char* end = 0;  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && !defined(PEGASUS_OS_OS400)
         long portNumber = strtol(address, &end, 10);          if (enableHttpConnection)
         assert(end != 0 && *end == '\0');          {
         server.bind(portNumber);              cout << "Listening on HTTP port " << portNumberHttp << endl;
           }
           if (enableHttpsConnection)
           {
               cout << "Listening on HTTPS port " << portNumberHttps << endl;
           }
   # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
           cout << "Listening on local connection socket" << endl;
   # endif
   #endif
   
           // bind throws an exception if the bind fails
           server.bind();
  
         delete [] address;          // notify parent process (if there is a parent process) to terminate
           // so user knows that cimserver is ready to serve CIM requests.
           if (daemonOption)
                   notify_parent();
  
         time_t last = 0;         time_t last = 0;
  
   #if defined(PEGASUS_OS_HPUX)
           //
           // create a file to indicate that the cimserver has started and
           // save the process id of the cimserver process in the file
           //
   
           // remove the old file if it exists
           System::removeFile(fname);
   
           // open the file
           FILE *pid_file = fopen(fname, "w");
           if (pid_file)
           {
               // save the pid in the file
               fprintf(pid_file, "%ld\n", (long)server_pid);
               fclose(pid_file);
           }
   #endif
   #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
   !defined(PEGASUS_OS_OS400)
           cout << "Started. " << endl;
   #endif
   
           // Put server started message to the logger
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
           Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
                       "Started $0 version $1.",
                       PLATFORM_PRODUCT_NAME, PLATFORM_PRODUCT_VERSION);
   #else
           Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
                       "Started $0 version $1.",
                       PEGASUS_NAME, PEGASUS_VERSION);
   #endif
   
   
         //         //
         // Loop to call CIMServer's runForever() method until CIMServer         // Loop to call CIMServer's runForever() method until CIMServer
         // has been shutdown         // has been shutdown
         //         //
         while( !server.terminated() )         while( !server.terminated() )
         {         {
 #ifndef PEGASUS_OS_ZOS  #if !defined(PEGASUS_OS_ZOS) && ! defined(PEGASUS_OS_HPUX) && ! defined(PEGASUS_NO_SLP)
           if(useSLP  )           if(useSLP  )
           {           {
             if(  (time(NULL) - last ) > 60 )             if(  (time(NULL) - last ) > 60 )
             {             {
               if( discovery != NULL && url != NULL )                if( discovery != NULL && serviceURL.size() )
                 discovery->srv_reg_all(url,                  discovery->srv_reg_all(serviceURL.getCString(),
                                        "(namespace=root/cimv2)",                                        "(namespace=root/cimv2)",
                                        "service:cim.pegasus",                                        "service:cim.pegasus",
                                        "DEFAULT",                                        "DEFAULT",
Line 738 
Line 961 
           server.runForever();           server.runForever();
         }         }
  
         // This statement is unrechable!  
         //         //
         // Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,          // normal termination
         //   "Normal Termination");          //
           // Put server shutdown message to the logger
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)
           Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
               "$0 stopped.", PLATFORM_PRODUCT_NAME);
   #else
           Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,
               "$0 stopped.", PEGASUS_NAME);
   #endif
   
   #if defined(PEGASUS_OS_HPUX)
           //
           // close the file created at startup time to indicate that the
           // cimserver has terminated normally.
           //
           FileSystem::removeFile(CIMSERVERSTART_FILE);
   #endif
     }     }
     catch(Exception& e)     catch(Exception& e)
     {     {
         Logger::put(Logger::STANDARD_LOG, "CIMServer", Logger::INFORMATION,  #ifdef PEGASUS_OS_OS400
             "Abnormal Termination $0", e.getMessage());          Logger::put(Logger::STANDARD_LOG, "", Logger::WARNING,
                       "Error: $0", e.getMessage());
   #else
         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);         PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);
   #endif
   
           //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
                   notify_parent();
   
           return 1;
     }     }
  
     return 0;     return 0;


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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2