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

   1 karl  1.149 //%2005////////////////////////////////////////////////////////////////////////
   2 mike  1.32  //
   3 karl  1.141 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   6 karl  1.121 // IBM Corp.; EMC Corporation, The Open Group.
   7 karl  1.141 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9 karl  1.149 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 mike  1.32  //
  12             // Permission is hereby granted, free of charge, to any person obtaining a copy
  13 kumpf 1.58  // of this software and associated documentation files (the "Software"), to
  14             // deal in the Software without restriction, including without limitation the
  15             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  16 mike  1.32  // sell copies of the Software, and to permit persons to whom the Software is
  17             // furnished to do so, subject to the following conditions:
  18 david.dillard 1.165 //
  19 kumpf         1.58  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  20 mike          1.32  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  21                     // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  22 kumpf         1.58  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  23                     // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  24                     // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  25 mike          1.32  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26                     // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27                     //
  28                     //==============================================================================
  29                     //
  30                     // Author: Mike Brasher (mbrasher@bmc.com)
  31                     //
  32 david.dillard 1.165 // Modified By: Mike Day (mdday@us.ibm.com)
  33                     //              Karl Schopmeyer (k.schopmeyer@opengroup.org)
  34                     //              Nag Boranna (nagaraja_boranna@hp.com)
  35                     //              Jenny Yu (jenny_yu@hp.com)
  36                     //              Sushma Fernandes (sushma_fernandes@hp.com)
  37 kumpf         1.72  //              Carol Ann Krug Graves, Hewlett-Packard Company
  38 david.dillard 1.165 //                  (carolann_graves@hp.com)
  39                     //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
  40                     //              Dave Rosckes (rosckes@us.ibm.com)
  41                     //              Humberto Rivero (hurivero@us.ibm.com)
  42                     //              Steve Hills (steve.hills@ncr.com)
  43 gs.keenan     1.150 //              Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
  44 david.dillard 1.165 //              Amit K Arora, IBM (amitarora@in.ibm.com) - pep 167
  45                     //              Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2555
  46                     //              Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2032
  47                     //              Heather Sterling, IBM (hsterl@us.ibm.com) - PEP#222
  48                     //              Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#3452
  49                     //              David Dillard, VERITAS Software Corp.
  50                     //                  (david.dillard@veritas.com)
  51 joyce.j       1.160 //
  52 mike          1.32  //%/////////////////////////////////////////////////////////////////////////////
  53                     
  54                     
  55                     //////////////////////////////////////////////////////////////////////
  56                     //
  57                     // Notes on deamon operation (Unix) and service operation (Win 32):
  58                     //
  59 david.dillard 1.165 // To run pegasus as a daemon on Unix platforms:
  60 mike          1.32  //
  61 kumpf         1.60  // cimserver
  62 mike          1.32  //
  63 kumpf         1.60  // To NOT run pegasus as a daemon on Unix platforms, set the daemon config
  64                     // property to false:
  65                     //
  66                     // cimserver daemon=false
  67                     //
  68 david.dillard 1.165 // The daemon config property has no effect on windows operation.
  69 mike          1.32  //
  70 mike          1.35  // To shutdown pegasus, use the -s option:
  71 david.dillard 1.165 //
  72                     // cimserver -s
  73 mike          1.35  //
  74 mike          1.32  // To run pegasus as an NT service, there are FOUR  different possibilities:
  75                     //
  76 david.dillard 1.165 // To INSTALL the Pegasus service,
  77 mike          1.32  //
  78                     // cimserver -install
  79                     //
  80 david.dillard 1.165 // To REMOVE the Pegasus service,
  81 mike          1.32  //
  82                     // cimserver -remove
  83                     //
  84 david.dillard 1.165 // To START the Pegasus service,
  85 mike          1.32  //
  86                     // net start cimserver
  87 s.hills       1.117 // or
  88                     // cimserver -start
  89 mike          1.32  //
  90 david.dillard 1.165 // To STOP the Pegasus service,
  91 mike          1.32  //
  92                     // net stop cimserver
  93 s.hills       1.117 // or
  94                     // cimserver -stop
  95 mike          1.32  //
  96 david.dillard 1.165 // Alternatively, you can use the windows service manager. Pegasus shows up
  97 mike          1.32  // in the service database as "Pegasus CIM Object Manager"
  98                     //
  99                     // Mike Day, mdday@us.ibm.com
 100 david.dillard 1.165 //
 101 mike          1.32  //////////////////////////////////////////////////////////////////////
 102                     
 103                     
 104 mike          1.35  #include <Pegasus/Common/Config.h>
 105 kumpf         1.59  #include <Pegasus/Common/Constants.h>
 106 mike          1.35  #include <cassert>
 107 mike          1.32  #include <cstdlib>
 108                     #include <Pegasus/Common/FileSystem.h>
 109 mike          1.35  #include <Pegasus/Common/Monitor.h>
 110 mike          1.32  #include <Pegasus/Common/PegasusVersion.h>
 111                     #include <Pegasus/Common/Logger.h>
 112                     #include <Pegasus/Common/System.h>
 113 mike          1.35  #include <Pegasus/Common/Tracer.h>
 114                     #include <Pegasus/Config/ConfigManager.h>
 115                     #include <Pegasus/Client/CIMClient.h>
 116                     #include <Pegasus/Server/ShutdownService.h>
 117 h.sterling    1.153 #include <Pegasus/Server/CIMServer.h>
 118                     #include <Service/ServerProcess.h>
 119 mike          1.32  
 120 chuck         1.155 #if defined(PEGASUS_OS_OS400)
 121                     #  include "vfyptrs.cinc"
 122                     #  include "OS400ConvertChar.h"
 123                     #endif
 124                     
 125 kumpf         1.119 PEGASUS_USING_PEGASUS;
 126                     PEGASUS_USING_STD;
 127                     
 128 h.sterling    1.153 #define PEGASUS_PROCESS_NAME "cimserver";
 129 mike          1.32  
 130 h.sterling    1.153 //Windows service variables are not defined elsewhere in the product
 131                     //enable ability to override these
 132                     #ifndef PEGASUS_SERVICE_NAME
 133                     #define PEGASUS_SERVICE_NAME "Pegasus CIM Object Manager";
 134 chuck         1.66  #endif
 135 h.sterling    1.153 #ifndef PEGASUS_SERVICE_DESCRIPTION
 136                     #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
 137 mike          1.32  #endif
 138                     
 139 h.sterling    1.153 class CIMServerProcess : public ServerProcess
 140                     {
 141                     public:
 142                     
 143                         CIMServerProcess(void)
 144                         {
 145                             cimserver_set_process(this);
 146                         }
 147                     
 148                         virtual ~CIMServerProcess(void)
 149                         {
 150                         }
 151                     
 152                         //defined in PegasusVersion.h
 153                         virtual const char* getProductName() const
 154                         {
 155                             return PEGASUS_PRODUCT_NAME;
 156                         }
 157                     
 158                         virtual const char* getExtendedName() const
 159                         {
 160 h.sterling    1.153         return PEGASUS_SERVICE_NAME;
 161                         }
 162                     
 163                         virtual const char* getDescription() const
 164                         {
 165                             return PEGASUS_SERVICE_DESCRIPTION;
 166                         }
 167 david.dillard 1.165 
 168 h.sterling    1.153     //defined in PegasusVersion.h
 169                         virtual const char* getVersion() const
 170                         {
 171                             return PEGASUS_PRODUCT_VERSION;
 172                         }
 173                     
 174                         virtual const char* getProcessName() const
 175                         {
 176                             return PEGASUS_PROCESS_NAME;
 177                         }
 178                     
 179                         //defined in ConfigFileDir.h
 180                         virtual const char* getPIDFileName() const
 181                         {
 182                             return CIMSERVER_START_FILE;
 183                         }
 184                     
 185                         int cimserver_run(int argc, char** argv, bool shutdownOption);
 186                     
 187                         void cimserver_stop(void);
 188                     };
 189 h.sterling    1.153 
 190                     AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
 191                     static CIMServer* _cimServer = 0;
 192 konrad.r      1.163 static Monitor* _monitor = 0;
 193 konrad.r      1.166 static Thread* dummyInitialThread = 0;
 194 mike          1.35  //
 195                     //  The command name.
 196                     //
 197                     static const char COMMAND_NAME []    = "cimserver";
 198                     
 199                     //
 200                     //  The constant defining usage string.
 201                     //
 202                     static const char USAGE []           = "Usage: ";
 203                     
 204                     /**
 205                     Constants representing the command line options.
 206                     */
 207                     static const char OPTION_VERSION     = 'v';
 208                     
 209                     static const char OPTION_HELP        = 'h';
 210                     
 211                     static const char OPTION_HOME        = 'D';
 212                     
 213                     static const char OPTION_SHUTDOWN    = 's';
 214                     
 215 a.arora       1.142 static const char   LONG_HELP []  = "help";
 216                     
 217                     static const char   LONG_VERSION []  = "version";
 218                     
 219 kumpf         1.48  #if defined(PEGASUS_OS_HPUX)
 220                     static const char OPTION_BINDVERBOSE = 'X';
 221                     #endif
 222                     
 223 kumpf         1.54  static const String PROPERTY_TIMEOUT = "shutdownTimeout";
 224 mike          1.35  
 225                     ConfigManager*    configManager;
 226                     
 227 mike          1.32  /** GetOptions function - This function defines the Options Table
 228 mike          1.35      and sets up the options from that table using the config manager.
 229 mike          1.32  */
 230                     void GetOptions(
 231 mike          1.35      ConfigManager* cm,
 232 mike          1.32      int& argc,
 233 s.hills       1.117     char** argv)
 234 mike          1.32  {
 235 mike          1.35      try
 236 mike          1.32      {
 237 kumpf         1.38          cm->mergeConfigFiles();
 238 mike          1.33  
 239 mike          1.35          cm->mergeCommandLine(argc, argv);
 240                         }
 241 kumpf         1.122     catch (NoSuchFile&)
 242 mike          1.35      {
 243 kumpf         1.122         throw;
 244 mike          1.35      }
 245 kumpf         1.122     catch (FileNotReadable&)
 246 mike          1.35      {
 247 kumpf         1.122         throw;
 248 mike          1.35      }
 249 kumpf         1.122     catch (CannotRenameFile&)
 250 mike          1.35      {
 251 kumpf         1.122         throw;
 252 mike          1.35      }
 253 kumpf         1.122     catch (ConfigFileSyntaxError&)
 254 mike          1.35      {
 255 kumpf         1.122         throw;
 256 mike          1.35      }
 257 kumpf         1.122     catch(UnrecognizedConfigProperty&)
 258 mike          1.35      {
 259 kumpf         1.122         throw;
 260 mike          1.35      }
 261 kumpf         1.122     catch(InvalidPropertyValue&)
 262 mike          1.35      {
 263 kumpf         1.122         throw;
 264 mike          1.35      }
 265 kumpf         1.123     catch (CannotOpenFile&)
 266                         {
 267                             throw;
 268                         }
 269 mike          1.32  }
 270                     
 271                     /* PrintHelp - This is temporary until we expand the options manager to allow
 272                        options help to be defined with the OptionRow entries and presented from
 273                        those entries.
 274                     */
 275                     void PrintHelp(const char* arg0)
 276                     {
 277 mike          1.35      String usage = String (USAGE);
 278                         usage.append (COMMAND_NAME);
 279                         usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");
 280                         usage.append ("  options\n");
 281 a.arora       1.142     usage.append ("    -v, --version   - displays CIM Server version number\n");
 282                         usage.append ("    -h, --help      - prints this help message\n");
 283 humberto      1.97      usage.append ("    -s              - shuts down CIM Server\n");
 284 kumpf         1.138 #if !defined(PEGASUS_USE_RELEASE_DIRS)
 285                         usage.append ("    -D [home]       - sets pegasus home directory\n");
 286 humberto      1.97  #endif
 287                     #if defined(PEGASUS_OS_TYPE_WINDOWS)
 288 joyce.j       1.148     usage.append ("    -install [name] - installs pegasus as a Windows Service\n");
 289 humberto      1.97      usage.append ("                      [name] is optional and overrides the\n");
 290                         usage.append ("                      default CIM Server Service Name\n");
 291 joyce.j       1.148     usage.append ("    -remove [name]  - removes pegasus as a Windows Service\n");
 292 humberto      1.97      usage.append ("                      [name] is optional and overrides the\n");
 293                         usage.append ("                      default CIM Server Service Name\n");
 294 joyce.j       1.148     usage.append ("    -start [name]   - starts pegasus as a Windows Service\n");
 295 humberto      1.97      usage.append ("                      [name] is optional and overrides the\n");
 296                         usage.append ("                      default CIM Server Service Name\n");
 297 joyce.j       1.148     usage.append ("    -stop [name]    - stops pegasus as a Windows Service\n");
 298 humberto      1.97      usage.append ("                      [name] is optional and overrides the\n");
 299                         usage.append ("                      default CIM Server Service Name\n\n");
 300                     #endif
 301                         usage.append ("  configProperty=value\n");
 302                         usage.append ("                    - sets CIM Server configuration property\n");
 303                     
 304                         cout << endl;
 305 h.sterling    1.153     cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;
 306 humberto      1.97      cout << endl;
 307 david.dillard 1.165 
 308 humberto      1.97  #if defined(PEGASUS_OS_TYPE_WINDOWS)
 309 humberto      1.104     MessageLoaderParms parms("src.Server.cimserver.MENU.WINDOWS", usage);
 310 kumpf         1.152 #elif defined(PEGASUS_USE_RELEASE_DIRS)
 311 kumpf         1.138     MessageLoaderParms parms("src.Server.cimserver.MENU.HPUXLINUXIA64GNU", usage);
 312 humberto      1.97  #else
 313 kumpf         1.138     MessageLoaderParms parms("src.Server.cimserver.MENU.STANDARD", usage);
 314 humberto      1.97  #endif
 315                         cout << MessageLoader::getMessage(parms) << endl;
 316 mike          1.35  }
 317                     
 318 h.sterling    1.156 //This needs to be called at various points in the code depending on the platform and error conditions.
 319                     //We need to delete the _cimServer reference on exit in order for the destructors to get called.
 320                     void deleteCIMServer()
 321                     {
 322                         if (_cimServer)
 323                         {
 324                             delete _cimServer;
 325                             _cimServer = 0;
 326                         }
 327 konrad.r      1.163    if (_monitor)
 328                        {
 329                     	delete _monitor;
 330                        }
 331 konrad.r      1.166    if (dummyInitialThread)
 332                        {
 333                     	Thread::clearLanguages();
 334                     	delete dummyInitialThread;
 335                        }
 336 h.sterling    1.156 }
 337                     
 338 chuck         1.96  // l10n
 339                     //
 340                     // Dummy function for the Thread object associated with the initial thread.
 341                     // Since the initial thread is used to process CIM requests, this is
 342                     // needed to localize the exceptions thrown during CIM request processing.
 343 david.dillard 1.165 // Note: This function should never be called!
 344                     //
 345 chuck         1.96  PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm)
 346                     {
 347 david.dillard 1.165    return((PEGASUS_THREAD_RETURN)0);
 348 chuck         1.96  }
 349                     
 350 kumpf         1.52  void shutdownCIMOM(Uint32 timeoutValue)
 351 mike          1.35  {
 352                         //
 353                         // Create CIMClient object
 354                         //
 355 kumpf         1.42      CIMClient client;
 356 mike          1.35  
 357                         //
 358 kumpf         1.53      // Get local host name
 359 mike          1.35      //
 360                         String hostStr = System::getHostName();
 361                     
 362                         //
 363 david.dillard 1.165     // open connection to CIMOM
 364 mike          1.35      //
 365                         try
 366                         {
 367 kumpf         1.43          client.connectLocal();
 368 kumpf         1.52  
 369                             //
 370 kumpf         1.63          // set client timeout to 2 seconds
 371 kumpf         1.52          //
 372 kumpf         1.71          client.setTimeout(2000);
 373 mike          1.35      }
 374 s.hills       1.117     catch(Exception&)
 375 mike          1.35      {
 376 david         1.85  #ifdef PEGASUS_OS_OS400
 377 h.sterling    1.153     //l10n
 378                         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 379                                 //"Unable to connect to CIM Server.  CIM Server may not be running." );
 380                         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 381                                 "src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",
 382                                 "Unable to connect to CIM Server.  CIM Server may not be running." );
 383                         // The server job may still be active but not responding.
 384                         // Kill the job if it exists.
 385                         if(_cimServerProcess->cimserver_kill(0) == -1)
 386                            _cimServerProcess->cimserver_exitRC(2);
 387                         _cimServerProcess->cimserver_exitRC(1);
 388 david         1.85  #else
 389 humberto      1.97          //l10n
 390                             //PEGASUS_STD(cerr) << "Unable to connect to CIM Server." << PEGASUS_STD(endl);
 391                             //PEGASUS_STD(cerr) << "CIM Server may not be running." << PEGASUS_STD(endl);
 392                             MessageLoaderParms parms("src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",
 393 kumpf         1.105                                                          "Unable to connect to CIM Server.\nCIM Server may not be running.\n");
 394 humberto      1.97          PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);
 395 s.hills       1.117         exit(1);
 396 chuck         1.66  #endif
 397 mike          1.35      }
 398                     
 399                         try
 400                         {
 401                             //
 402 kumpf         1.52          // construct CIMObjectPath
 403 mike          1.35          //
 404                             String referenceStr = "//";
 405                             referenceStr.append(hostStr);
 406 david.dillard 1.165         referenceStr.append("/");
 407 kumpf         1.72          referenceStr.append(PEGASUS_NAMESPACENAME_SHUTDOWN.getString());
 408 kumpf         1.53          referenceStr.append(":");
 409 kumpf         1.72          referenceStr.append(PEGASUS_CLASSNAME_SHUTDOWN.getString());
 410 kumpf         1.50          CIMObjectPath reference(referenceStr);
 411 mike          1.35  
 412                             //
 413                             // issue the invokeMethod request on the shutdown method
 414                             //
 415                             Array<CIMParamValue> inParams;
 416                             Array<CIMParamValue> outParams;
 417                     
 418 kumpf         1.52          // set force option to true for now
 419 kumpf         1.40          inParams.append(CIMParamValue("force",
 420 kumpf         1.52              CIMValue(Boolean(true))));
 421 mike          1.35  
 422 kumpf         1.40          inParams.append(CIMParamValue("timeout",
 423 kumpf         1.39              CIMValue(Uint32(timeoutValue))));
 424 mike          1.35  
 425                             CIMValue retValue = client.invokeMethod(
 426 kumpf         1.59              PEGASUS_NAMESPACENAME_SHUTDOWN,
 427 mike          1.35              reference,
 428                                 "shutdown",
 429                                 inParams,
 430                                 outParams);
 431 kumpf         1.43      }
 432 kumpf         1.65      catch(CIMException& e)
 433 kumpf         1.46      {
 434 david         1.85  #ifdef PEGASUS_OS_OS400
 435                     
 436 h.sterling    1.153     if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
 437                         {
 438                             //l10n
 439                             //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 440                                 //"Failed to shutdown server: $0", "The repository may be empty.");
 441                             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 442                                 "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",
 443                                 "Error in server shutdown: The repository may be empty.");
 444                         }
 445                         else
 446                         {
 447                             //l10n
 448                             //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 449                                 //"Failed to shutdown server: $0", e.getMessage());
 450                             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 451                                 "src.Server.cimserver.SHUTDOWN_FAILED",
 452                                 "Error in server shutdown: $0", e.getMessage());
 453                         }
 454                         // Kill the server job.
 455                         if(_cimServerProcess->cimserver_kill(0) == -1)
 456                            _cimServerProcess->cimserver_exitRC(2);
 457 david         1.85  #else
 458 kumpf         1.105         //l10n - TODO
 459 humberto      1.97          MessageLoaderParms parms("src.Server.cimserver.SHUTDOWN_FAILED",
 460 kumpf         1.105                                  "Error in server shutdown: ");
 461 humberto      1.97          PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);
 462 kumpf         1.63          if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)
 463                             {
 464 kumpf         1.105             //
 465 david.dillard 1.165             // Repository may be empty.
 466 kumpf         1.105             //
 467                                 //l10n - TODO
 468                                 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 469                                     "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",
 470                                     "Error in server shutdown: The repository may be empty.");
 471 humberto      1.97              MessageLoaderParms parms("src.Server.cimserver.REPOSITORY_EMPTY",
 472 kumpf         1.105                                      "The repository may be empty.");
 473                                 PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
 474 kumpf         1.63          }
 475                             else
 476                             {
 477 kumpf         1.105             //l10n - TODO
 478                                 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 479                                     "src.Server.cimserver.SHUTDOWN_FAILED",
 480                                     "Error in server shutdown: $0", e.getMessage());
 481 kumpf         1.63              PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);
 482                             }
 483 kumpf         1.105 
 484 david.dillard 1.165     // Kill the cimserver process
 485 h.sterling    1.153     if (_cimServerProcess->cimserver_kill(0) == 0)
 486 kumpf         1.105         {
 487                                 //l10n - TODO
 488                                 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 489                                     "src.Server.cimserver.SERVER_FORCED_SHUTDOWN",
 490 h.sterling    1.153             "Forced shutdown initiated.");
 491 kumpf         1.105             MessageLoaderParms parms("src.Server.cimserver.SERVER_FORCED_SHUTDOWN",
 492                                                          "Forced shutdown initiated.");
 493                                 PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
 494                             }
 495 s.hills       1.117         exit(1);
 496 chuck         1.66  #endif
 497 kumpf         1.46      }
 498 s.hills       1.117     catch(Exception&)
 499 kumpf         1.45      {
 500                             //
 501 kumpf         1.91          // This may mean that the CIM Server has terminated, causing this
 502                             // client to get a "Empty HTTP response message" exception.  It may
 503 david.dillard 1.165         // also mean that the CIM Server is taking longer than 2 seconds
 504                             // (client timeout value) to terminate, causing this client to
 505 kumpf         1.91          // timeout with a "connection timeout" exception.
 506 kumpf         1.45          //
 507 kumpf         1.91          // Check to see if CIM Server is still running.  If CIM Server
 508 kumpf         1.63          // is still running and the shutdown timeout has not expired,
 509 kumpf         1.91          // loop and wait one second until either the CIM Server is
 510                             // terminated or timeout expires.  If timeout expires and
 511                             // the CIM Server is still running, kill the CIMServer process.
 512 david.dillard 1.165         //
 513 kumpf         1.63          Uint32 maxWaitTime = timeoutValue - 2;
 514 h.sterling    1.153         Boolean running = _cimServerProcess->isCIMServerRunning();
 515 kumpf         1.63          while ( running && maxWaitTime > 0 )
 516                             {
 517                                 System::sleep(1);
 518 h.sterling    1.153             running = _cimServerProcess->isCIMServerRunning();
 519 kumpf         1.63              maxWaitTime = maxWaitTime - 1;
 520                             }
 521                     
 522                             if (running)
 523                             {
 524 h.sterling    1.153        int kill_rc = _cimServerProcess->cimserver_kill(0);
 525 david.dillard 1.165 
 526 humberto      1.90  #ifdef PEGASUS_OS_OS400
 527 h.sterling    1.153         if(kill_rc == -1)
 528                             _cimServerProcess->cimserver_exitRC(2);
 529                             _cimServerProcess->cimserver_exitRC(1);
 530 humberto      1.90  #endif
 531 kumpf         1.91  
 532 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
 533                     || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \
 534                     || defined (PEGASUS_OS_VMS)
 535 h.sterling    1.153         if (kill_rc != -1)
 536 kumpf         1.91              {
 537 kumpf         1.105                 //l10n - TODO
 538                                     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 539                                         "src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",
 540                                         "Shutdown timeout expired.  Forced shutdown initiated.");
 541 humberto      1.97                  MessageLoaderParms parms("src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",
 542 kumpf         1.105                     "Shutdown timeout expired.  Forced shutdown initiated.");
 543 humberto      1.97                  cout << MessageLoader::getMessage(parms) << endl;
 544 kumpf         1.91                  exit(0);
 545                                 }
 546                     #endif
 547 kumpf         1.63          }
 548 kumpf         1.43      }
 549 mike          1.35  
 550 kumpf         1.168     // Make sure the cimserver has time to actually shut down
 551                         Uint32 maxWaitTime = timeoutValue;
 552                         while ((maxWaitTime-- > 0) && _cimServerProcess->isCIMServerRunning())
 553                         {
 554                             System::sleep(1);
 555                         }
 556                     
 557 mike          1.35      return;
 558 mike          1.32  }
 559                     
 560 mike          1.35  
 561 mike          1.33  /////////////////////////////////////////////////////////////////////////
 562 mike          1.32  //  MAIN
 563                     //////////////////////////////////////////////////////////////////////////
 564                     int main(int argc, char** argv)
 565                     {
 566 mike          1.35      String pegasusHome  = String::EMPTY;
 567                         Boolean shutdownOption = false;
 568 mday          1.47  
 569 humberto      1.97  //l10n
 570                     // Set Message loading to process locale
 571 david.dillard 1.165 MessageLoader::_useProcessLocale = true;
 572 humberto      1.97  //l10n
 573                     
 574 kv.le         1.140 //l10n
 575                     #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
 576                     setlocale(LC_ALL, "");
 577                     #endif
 578                     
 579 chuck         1.66  #ifdef PEGASUS_OS_OS400
 580 david         1.120 
 581                       VFYPTRS_INCDCL;               // VFYPTRS local variables
 582                     
 583                       // verify pointers
 584                       #pragma exception_handler (qsyvp_excp_hndlr,qsyvp_excp_comm_area,\
 585                         0,_C2_MH_ESCAPE)
 586                         for( int arg_index = 1; arg_index < argc; arg_index++ ){
 587 h.sterling    1.153     VFYPTRS(VERIFY_SPP_NULL(argv[arg_index]));
 588 david         1.120     }
 589                       #pragma disable_handler
 590                     
 591 david         1.100     // Convert the args to ASCII
 592                         for(Uint32 i = 0;i< argc;++i)
 593                         {
 594 h.sterling    1.153     EtoA(argv[i]);
 595 david         1.100     }
 596                     
 597 chuck         1.66      // Initialize Pegasus home to the shipped OS/400 directory.
 598                         pegasusHome = OS400_DEFAULT_PEGASUS_HOME;
 599                     #endif
 600                     
 601 kv.le         1.134 
 602 tony          1.82  #ifndef PEGASUS_OS_TYPE_WINDOWS
 603 kumpf         1.38      //
 604                         // Get environment variables:
 605                         //
 606 david         1.100 #ifdef PEGASUS_OS_OS400
 607                     #pragma convert(37)
 608                         const char* tmp = getenv("PEGASUS_HOME");
 609                     #pragma convert(0)
 610                         char home[256] = {0};
 611                         if (tmp && strlen(tmp) < 256)
 612                         {
 613 h.sterling    1.153     strcpy(home, tmp);
 614                         EtoA(home);
 615                         pegasusHome = home;
 616 david         1.100     }
 617                     #else
 618 kv.le         1.134   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
 619                         pegasusHome = AIX_RELEASE_PEGASUS_HOME;
 620 kumpf         1.138   #elif !defined(PEGASUS_USE_RELEASE_DIRS)
 621 kumpf         1.38      const char* tmp = getenv("PEGASUS_HOME");
 622                     
 623                         if (tmp)
 624                         {
 625                             pegasusHome = tmp;
 626                         }
 627 kv.le         1.134   #endif
 628 david         1.100 #endif
 629 kumpf         1.38  
 630                         FileSystem::translateSlashes(pegasusHome);
 631 tony          1.82  #else
 632 kumpf         1.38  
 633 tony          1.82    // windows only
 634 h.sterling    1.153   //setHome(pegasusHome);
 635                       pegasusHome = _cimServerProcess->getHome();
 636 tony          1.82  #endif
 637 mike          1.32  
 638 kumpf         1.60          // Get help, version, and shutdown options
 639 mike          1.35  
 640                             for (int i = 1; i < argc; )
 641                             {
 642                                 const char* arg = argv[i];
 643 a.arora       1.142             if(String::equal(arg,"--help"))
 644                                 {
 645                                         PrintHelp(argv[0]);
 646                                         exit(0);
 647                                 }
 648                                 else if(String::equal(arg,"--version"))
 649                                 {
 650 h.sterling    1.153                 cout << _cimServerProcess->getVersion() << endl;
 651 a.arora       1.142                 exit(0);
 652                                 }
 653 mike          1.35              // Check for -option
 654 a.arora       1.142             else if (*arg == '-')
 655 mike          1.35              {
 656                                     // Get the option
 657                                     const char* option = arg + 1;
 658                     
 659                                     //
 660                                     // Check to see if user asked for the version (-v option):
 661                                     //
 662 tony          1.83                  if (*option == OPTION_VERSION &&
 663                                         strlen(option) == 1)
 664 mike          1.35                  {
 665 h.sterling    1.153                     cout << _cimServerProcess->getVersion() << endl;
 666 mike          1.35                      exit(0);
 667                                     }
 668                                     //
 669                                     // Check to see if user asked for help (-h option):
 670                                     //
 671 tony          1.83                  else if (*option == OPTION_HELP &&
 672                                             (strlen(option) == 1))
 673 mike          1.35                  {
 674                                         PrintHelp(argv[0]);
 675                                         exit(0);
 676                                     }
 677 kumpf         1.138 #if !defined(PEGASUS_USE_RELEASE_DIRS)
 678 tony          1.83                  else if (*option == OPTION_HOME &&
 679                                             (strlen(option) == 1))
 680 mike          1.35                  {
 681 kumpf         1.60                      if (i + 1 < argc)
 682 mike          1.35                      {
 683                                             pegasusHome.assign(argv[i + 1]);
 684                                         }
 685                                         else
 686                                         {
 687 humberto      1.97                          //l10n
 688                                             //cout << "Missing argument for option -" << option << endl;
 689 humberto      1.99                          String opt(option);
 690 humberto      1.97                          MessageLoaderParms parms("src.Server.cimserver.MISSING_ARGUMENT",
 691 h.sterling    1.153                                          "Missing argument for option -$0",
 692                                                              opt);
 693                                             cout << MessageLoader::getMessage(parms) << endl;
 694 mike          1.35                          exit(0);
 695                                         }
 696                     
 697                                         memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));
 698                                         argc -= 2;
 699                                     }
 700 kumpf         1.63  #endif
 701 kumpf         1.48  #if defined(PEGASUS_OS_HPUX)
 702                                     //
 703 kumpf         1.49                  // Check to see if user asked for the version (-X option):
 704 kumpf         1.48                  //
 705 tony          1.83                  if (*option == OPTION_BINDVERBOSE &&
 706                                             (strlen(option) == 1))
 707 kumpf         1.48                  {
 708 h.sterling    1.153             System::bindVerbose = true;
 709 humberto      1.97                      //l10n
 710 david.dillard 1.165                     //cout << "Unsupported debug option, BIND_VERBOSE, enabled."
 711 humberto      1.97                           //<< endl;
 712                                         MessageLoaderParms parms("src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
 713 h.sterling    1.153                                          "Unsupported debug option, BIND_VERBOSE, enabled.");
 714                                         cout << MessageLoader::getMessage(parms) << endl;
 715 kumpf         1.48                      // remove the option from the command line
 716                                         memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
 717 david.dillard 1.165                     argc--;
 718 kumpf         1.48                  }
 719                     #endif
 720 mike          1.35                  //
 721                                     // Check to see if user asked for shutdown (-s option):
 722                                     //
 723 tony          1.82                  else if (*option == OPTION_SHUTDOWN &&
 724                                             (strlen(option) == 1))
 725 mike          1.35                  {
 726                                         //
 727 kumpf         1.52                      // Check to see if shutdown has already been specified:
 728 mike          1.35                      //
 729 kumpf         1.52                      if (shutdownOption)
 730 mike          1.35                      {
 731 humberto      1.97                          //l10n
 732                                             //cout << "Duplicate shutdown option specified." << endl;
 733                                             MessageLoaderParms parms("src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",
 734 h.sterling    1.153                                                  "Duplicate shutdown option specified.");
 735 david.dillard 1.165 
 736 humberto      1.97                          cout << MessageLoader::getMessage(parms) << endl;
 737 mike          1.35                          exit(0);
 738                                         }
 739                     
 740 kumpf         1.52                      shutdownOption = true;
 741 david.dillard 1.165 
 742 mike          1.35                      // remove the option from the command line
 743                                         memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
 744 david.dillard 1.165                     argc--;
 745 mike          1.35                  }
 746                                     else
 747                                         i++;
 748                                 }
 749                                 else
 750                                     i++;
 751 mike          1.32          }
 752 mike          1.35  
 753 kumpf         1.38      //
 754                         // Set the value for pegasusHome property
 755                         //
 756                         ConfigManager::setPegasusHome(pegasusHome);
 757 mike          1.32  
 758 mike          1.35      //
 759 s.hills       1.117     // Do the plaform specific run
 760                         //
 761                     
 762 h.sterling    1.153     return _cimServerProcess->platform_run( argc, argv, shutdownOption );
 763 s.hills       1.117 }
 764                     
 765 h.sterling    1.153 void CIMServerProcess::cimserver_stop()
 766                     {
 767                         _cimServer->shutdownSignal();
 768                     }
 769 s.hills       1.117 
 770                     //
 771                     // The main, common, running code
 772                     //
 773 david.dillard 1.165 // NOTE: Do NOT call exit().  Use return(), otherwise some platforms
 774 s.hills       1.117 // will fail to shutdown properly/cleanly.
 775                     //
 776 david.dillard 1.165 // TODO: Current change minimal for platform "service" shutdown bug fixes.
 777                     // Perhpas further extract out common stuff and put into main(), put
 778                     // daemon stuff into platform specific platform_run(), etc.
 779                     // Note: make sure to not put error handling stuff that platform
 780 s.hills       1.117 // specific runs may need to deal with bettter (instead of exit(), etc).
 781                     //
 782                     
 783 h.sterling    1.153 int CIMServerProcess::cimserver_run( int argc, char** argv, Boolean shutdownOption )
 784 s.hills       1.117 {
 785                         String logsDirectory = String::EMPTY;
 786                         Boolean daemonOption = false;
 787                     
 788                         //
 789 mike          1.35      // Get an instance of the Config Manager.
 790                         //
 791                         configManager = ConfigManager::getInstance();
 792 kumpf         1.136     configManager->useConfigFiles = true;
 793 mike          1.35  
 794 lucier        1.130 #ifdef PEGASUS_OS_OS400
 795                         // In a special startup case for IBM OS400, when the server is
 796                         // automatically started when the machine starts up the config
 797                         // file cannot be read because of access restrictions for the
 798                         // user starting the server.  In this case, we need to skip
 799                         // reading the config options and therefore any use of the config
 800                         // manager also.  To make this determinations we will check to see
 801                         // if the daemon flag is set to true.  If so, then there will be a
 802                         // series of checks to bracket all the calls to the configManager
 803                         // which would otherwise fail.  All this will only be done for
 804                         // IBM OS400.
 805                     
 806                         Boolean os400StartupOption = false;
 807                         // loop through args to check for daemon=true
 808                         for (int i=1; i < argc; i++)
 809                           if (strcmp(argv[i], "daemon=true") == 0)
 810                           {
 811                             os400StartupOption = true;
 812                             daemonOption = true;
 813                           }
 814 chuck         1.164 
 815                         if (!os400StartupOption)
 816                         {
 817                             // If this is the server job, then set the job
 818                             // to save the job log.
 819                             system ("QSYS/CHGJOB JOB(*) LOG(4 00 *SECLVL)");
 820                         }
 821 david.dillard 1.165 #endif
 822 lucier        1.130 
 823 mike          1.35      //
 824 mike          1.32      // Get options (from command line and from configuration file); this
 825 mike          1.35      // removes corresponding options and their arguments from the command
 826 mike          1.32      // line.
 827 mike          1.35      //
 828 mike          1.32      try
 829                         {
 830 lucier        1.130 #ifdef PEGASUS_OS_OS400
 831                         if (os400StartupOption == false)
 832 david.dillard 1.165 #endif
 833 s.hills       1.117         GetOptions(configManager, argc, argv);
 834 mike          1.32      }
 835                         catch (Exception& e)
 836                         {
 837 kumpf         1.127         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 838                                 "src.Server.cimserver.SERVER_NOT_STARTED",
 839                                 "cimserver not started:  $0", e.getMessage());
 840                     
 841                     #if !defined(PEGASUS_OS_OS400)
 842                             MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
 843                                 "cimserver not started: $0", e.getMessage());
 844                     
 845                             PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
 846                                 << PEGASUS_STD(endl);
 847 david         1.85  #endif
 848 kumpf         1.127 
 849 s.hills       1.117         return(1);
 850 mike          1.32      }
 851                     
 852 chuck         1.94  // l10n
 853 h.sterling    1.153     // Set the home directory, msg sub-dir, into the MessageLoader.
 854 david.dillard 1.165     // This will be the default directory where the resource bundles
 855                         // are found.
 856 h.sterling    1.153     MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
 857 david.dillard 1.165         ConfigManager::getInstance()->getCurrentValue("messageDir")));
 858 chuck         1.94  
 859 lucier        1.130 #ifdef PEGASUS_OS_OS400
 860                         // Still need to declare and set the connection variables.
 861                         // Will initialize to false since they are fixed at false for OS400.
 862                     
 863                         // NOTE:  OS400 is a LOCAL_DOMAIN_SOCKET, so a few lines down
 864                         // the test will not be compiled in.  If OS400 ever turns off that
 865                         // define, then we will need to change this code path to insure that
 866 david.dillard 1.165     // one of the variables is true.
 867 lucier        1.130     Boolean enableHttpConnection = false;
 868                         Boolean enableHttpsConnection = false;
 869 kumpf         1.135     Boolean enableSSLExportClientVerification = false;
 870 lucier        1.130 
 871                         if (os400StartupOption == false)
 872                         {
 873                           enableHttpConnection = String::equal(
 874                               configManager->getCurrentValue("enableHttpConnection"), "true");
 875                           enableHttpsConnection = String::equal(
 876                               configManager->getCurrentValue("enableHttpsConnection"), "true");
 877 kumpf         1.135       enableSSLExportClientVerification = String::equal(
 878                               configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
 879 lucier        1.130     }
 880                     #else
 881 kumpf         1.87      Boolean enableHttpConnection = String::equal(
 882                             configManager->getCurrentValue("enableHttpConnection"), "true");
 883                         Boolean enableHttpsConnection = String::equal(
 884                             configManager->getCurrentValue("enableHttpsConnection"), "true");
 885 kumpf         1.135     Boolean enableSSLExportClientVerification = String::equal(
 886                             configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
 887 lucier        1.130 #endif
 888 kumpf         1.86  
 889                         // Make sure at least one connection is enabled
 890 h.sterling    1.159 #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
 891 kumpf         1.86      if (!enableHttpConnection && !enableHttpsConnection)
 892                         {
 893 humberto      1.97          //l10n
 894                             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
 895                                 //"Neither HTTP nor HTTPS connection is enabled.  "
 896                                 //"CIMServer will not be started.");
 897                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
 898 h.sterling    1.153             "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
 899 humberto      1.97              "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
 900                             //cerr << "Neither HTTP nor HTTPS connection is enabled.  "
 901                                 //"CIMServer will not be started." << endl;
 902                             MessageLoaderParms parms("src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
 903 h.sterling    1.153                                  "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
 904 humberto      1.97          cerr << MessageLoader::getMessage(parms) << endl;
 905 s.hills       1.117         return(1);
 906 kumpf         1.86      }
 907                     #endif
 908                     
 909 mike          1.35      try
 910 mike          1.32      {
 911 mike          1.35          //
 912                             // Check to see if we should Pegasus as a daemon
 913                             //
 914                     
 915                             if (String::equal(configManager->getCurrentValue("daemon"), "true"))
 916                             {
 917                                 daemonOption = true;
 918                             }
 919 david.dillard 1.165 
 920 lucier        1.130 #ifdef PEGASUS_OS_OS400
 921                         if (os400StartupOption == false)
 922                         {
 923 david.dillard 1.165 #endif
 924 kumpf         1.36          // Get the log file directory definition.
 925                             // We put String into Cstring because
 926                             // Directory functions only handle Cstring.
 927                             // ATTN-KS: create String based directory functions.
 928 konrad.r      1.161 #if !defined(PEGASUS_USE_SYSLOGS)
 929                     		// When using syslog facility. No files anymore.
 930 kumpf         1.36          logsDirectory = configManager->getCurrentValue("logdir");
 931 david.dillard 1.165         logsDirectory =
 932 h.sterling    1.153         ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
 933 konrad.r      1.161 #endif
 934 lucier        1.130 #ifdef PEGASUS_OS_OS400
 935                         }  // end if (os400StartupOption == false)
 936                     #endif
 937 kumpf         1.36  
 938                             // Set up the Logger. This does not open the logs
 939                             // Might be more logical to clean before set.
 940                             // ATTN: Need tool to completely disable logging.
 941                     
 942 david         1.85  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
 943 konrad.r      1.161 !defined(PEGASUS_OS_OS400) && !defined(PEGASUS_USE_SYSLOGS)
 944 kumpf         1.36          Logger::setHomeDirectory(logsDirectory);
 945 kumpf         1.57  #endif
 946 kumpf         1.36  
 947                             //
 948 david.dillard 1.165         // Check to see if we need to shutdown CIMOM
 949 mike          1.35          //
 950                             if (shutdownOption)
 951                             {
 952 david.dillard 1.165             String configTimeout =
 953 kumpf         1.60                  configManager->getCurrentValue("shutdownTimeout");
 954 s.hills       1.117             Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);
 955 david.dillard 1.165 
 956 kumpf         1.52              shutdownCIMOM(timeoutValue);
 957 kumpf         1.45  
 958 david         1.85  #ifdef PEGASUS_OS_OS400
 959 h.sterling    1.153         //l10n
 960                             //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 961 david.dillard 1.165             //"CIM Server stopped.");
 962 h.sterling    1.153         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 963                                 "src.Server.cimserver.SERVER_STOPPED",
 964                                 "CIM Server stopped.");
 965 s.hills       1.117             cimserver_exitRC(0);
 966 david         1.85  #else
 967 h.sterling    1.153             //l10n
 968 humberto      1.97              //cout << "CIM Server stopped." << endl;
 969                                 MessageLoaderParms parms("src.Server.cimserver.SERVER_STOPPED",
 970 h.sterling    1.153                                      "CIM Server stopped.");
 971 humberto      1.106 
 972 humberto      1.97              cout << MessageLoader::getMessage(parms) << endl;
 973 s.hills       1.117             return(0);
 974 diane         1.81  #endif
 975 mike          1.35          }
 976 mike          1.32  
 977 kumpf         1.139 #if defined(PEGASUS_DEBUG)
 978 kumpf         1.36          // Leave this in until people get familiar with the logs.
 979 humberto      1.97          //l10n
 980                             //cout << "Logs Directory = " << logsDirectory << endl;
 981 konrad.r      1.161 #if !defined(PEGASUS_USE_SYSLOGS)
 982 humberto      1.97          MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
 983 h.sterling    1.153                                  "Logs Directory = ");
 984 humberto      1.97          cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
 985 kumpf         1.57  #endif
 986 konrad.r      1.161 #endif
 987 mike          1.32      }
 988 kumpf         1.122     catch (UnrecognizedConfigProperty& e)
 989 mike          1.32      {
 990 david         1.85  
 991                     #ifdef PEGASUS_OS_OS400
 992 h.sterling    1.153     //l10n
 993                         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 994 david.dillard 1.165             //"Error: $0",e.getMessage());
 995 h.sterling    1.153     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 996                                 "src.Server.cimserver.ERROR",
 997 david.dillard 1.165             "Error: $0",e.getMessage());
 998 david         1.85  #else
 999 h.sterling    1.153     //l10n
1000                         //cout << "Error: " << e.getMessage() << endl;
1001                         MessageLoaderParms parms("src.Server.cimserver.ERROR",
1002                                                  "Error: $0",
1003                                                  e.getMessage());
1004                         cout << MessageLoader::getMessage(parms) << endl;
1005 david         1.85  #endif
1006 mike          1.32      }
1007                     
1008 h.sterling    1.158     // Bug 2148 - Here is the order of operations for determining the server HTTP and HTTPS ports.
1009                         // 1) If the user explicitly specified a port, use it.
1010                         // 2) If the user did not specify a port, get the port from the services file.
1011                         // 3) If no value is specified in the services file, use the IANA WBEM default port.
1012                         // Note that 2 and 3 are done within the System::lookupPort method
1013                         // An empty string from the ConfigManager implies that the user did not specify a port.
1014                     
1015 w.otsuka      1.147     Uint32 portNumberHttps=0;
1016                         Uint32 portNumberHttp=0;
1017                         Uint32 portNumberExportHttps=0;
1018 kumpf         1.53  
1019 kumpf         1.86      if (enableHttpsConnection)
1020 kumpf         1.53      {
1021 kumpf         1.86          String httpsPort = configManager->getCurrentValue("httpsPort");
1022 h.sterling    1.158         if (httpsPort == String::EMPTY)
1023 joyce.j       1.144         {
1024 h.sterling    1.158             //
1025                                 // Look up the WBEM-HTTPS port number
1026                                 //
1027                                 portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
1028                     
1029                             } else
1030 david.dillard 1.165         {
1031 h.sterling    1.158             //
1032                                 // user-specified
1033                                 //
1034                                 CString portString = httpsPort.getCString();
1035                                 char* end = 0;
1036                                 portNumberHttps = strtol(portString, &end, 10);
1037                                 if(!(end != 0 && *end == '\0'))
1038                                 {
1039 joyce.j       1.160                 InvalidPropertyValue e("httpsPort", httpsPort);
1040                                     cerr << e.getMessage() << endl;
1041 h.sterling    1.158                 exit(1);
1042                                 }
1043 joyce.j       1.144         }
1044 kumpf         1.53      }
1045 kumpf         1.86  
1046                         if (enableHttpConnection)
1047 kumpf         1.53      {
1048 kumpf         1.86          String httpPort = configManager->getCurrentValue("httpPort");
1049 h.sterling    1.158         if (httpPort == String::EMPTY)
1050 joyce.j       1.144         {
1051 h.sterling    1.158             //
1052                                 // Look up the WBEM-HTTP port number
1053                                 //
1054                                 portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
1055                     
1056                             } else
1057                             {
1058                                 //
1059                                 // user-specified
1060                                 //
1061                                 CString portString = httpPort.getCString();
1062                                 char* end = 0;
1063                                 portNumberHttp = strtol(portString, &end, 10);
1064                                 if(!(end != 0 && *end == '\0'))
1065                                 {
1066 joyce.j       1.160                 InvalidPropertyValue e("httpPort", httpPort);
1067                                     cerr << e.getMessage() << endl;
1068 h.sterling    1.158                 exit(1);
1069                                 }
1070 joyce.j       1.144         }
1071 kumpf         1.53      }
1072 mike          1.32  
1073 h.sterling    1.158 
1074 kumpf         1.135     if (enableSSLExportClientVerification)
1075                         {
1076                             //
1077                             // No config property is looked up to get the default port number.
1078                             // Lookup the port defined in /etc/services for the service name
1079                             // wbem-exp-https and bind to that port. If the service is  not defined
1080                             // then log a warning message and do not start the cimserver.
1081                             //
1082                             Uint32 port = 0;
1083                     
1084                             portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port);
1085                     
1086                             if (portNumberExportHttps == 0)
1087                             {
1088                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1089                                     "src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",
1090                                     "Port not defined for the service wbem-exp-https. CIMServer will not be started.");
1091                     
1092                                 MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",
1093                                     "Port not defined for the service wbem-exp-https. CIMServer will not be started.");
1094                     
1095 kumpf         1.135             cerr << MessageLoader::getMessage(parms) << endl;
1096                     
1097                                 return(1);
1098                             }
1099                         }
1100 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1101 mike          1.32      // Put out startup up message.
1102 h.sterling    1.153     cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;
1103 humberto      1.97      //l10n
1104                         //cout << "Built " << __DATE__ << " " << __TIME__ << endl;
1105                         //cout <<"Starting..."
1106                         MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
1107 h.sterling    1.153                              "Built $0 $1\nStarting...",
1108                                                  __DATE__,
1109                                                  __TIME__);
1110 humberto      1.97  #endif
1111                     
1112                     //l10n
1113                     // reset message loading to NON-process locale
1114 david.dillard 1.165 MessageLoader::_useProcessLocale = false;
1115 humberto      1.97  //l10n
1116 mike          1.32  
1117 kumpf         1.137     // Get the parent's PID before forking
1118 h.sterling    1.154     _cimServerProcess->set_parent_pid(System::getPID());
1119 david.dillard 1.165 
1120 kumpf         1.63      // do we need to run as a daemon ?
1121                         if (daemonOption)
1122                         {
1123 h.sterling    1.153         if(-1 == _cimServerProcess->cimserver_fork())
1124 diane         1.81  #ifndef PEGASUS_OS_OS400
1125 h.sterling    1.153     {
1126                             return(-1);
1127                         }
1128 diane         1.81  #else
1129 h.sterling    1.153     {
1130 david         1.85              return(-1);
1131 h.sterling    1.153     }
1132                         else
1133                         {
1134                             return(0);
1135                         }
1136 diane         1.81  #endif
1137 david.dillard 1.165 
1138 kumpf         1.63      }
1139 chuck         1.66  
1140 chuck         1.96  // l10n
1141                         // Now we are after the fork...
1142                         // Create a dummy Thread object that can be used to store the
1143                         // AcceptLanguages object for CIM requests that are serviced
1144                         // by this thread (initial thread of server).  Need to do this
1145                         // because this thread is not in a ThreadPool, but is used
1146                         // to service CIM requests.
1147                         // The run function for the dummy Thread should never be called,
1148 konrad.r      1.166     dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
1149 david.dillard 1.165     Thread::setCurrent(dummyInitialThread);
1150 humberto      1.108     AcceptLanguages default_al;
1151                         try{
1152 david.dillard 1.165          default_al = AcceptLanguages::getDefaultAcceptLanguages();
1153 h.sterling    1.153          Thread::setLanguages(new AcceptLanguages(default_al));
1154 kumpf         1.122     }catch(InvalidAcceptLanguageHeader& e){
1155 h.sterling    1.153           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1156                                       "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
1157 david.dillard 1.165                   "Could not convert the system process locale into a valid AcceptLanguage format.");
1158 h.sterling    1.153           Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1159 david.dillard 1.165                              e.getMessage());
1160 humberto      1.108     }
1161 david.dillard 1.165 
1162                     
1163 chuck         1.96  
1164 chuck         1.66  #ifdef PEGASUS_OS_OS400
1165                         // Special server initialization code for OS/400.
1166                         if (cimserver_initialize() != 0)
1167                         {
1168 h.sterling    1.153     // do some logging here!
1169                         //l10n
1170                         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1171 david.dillard 1.165             //"CIM Server failed to initialize");
1172 h.sterling    1.153     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1173                                       "src.Server.cimserver.SERVER_FAILED_TO_INITIALIZE",
1174 david.dillard 1.165                   "CIM Server failed to initialize");
1175 h.sterling    1.153     return(-1);
1176 david.dillard 1.165     }
1177 chuck         1.66  #endif
1178 chuck         1.96  
1179 kumpf         1.167 #ifndef PEGASUS_OS_TYPE_WINDOWS
1180                         umask(S_IRWXG|S_IRWXO);
1181                     #endif
1182 mday          1.62  
1183 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
1184                     || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
1185                     || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined (PEGASUS_OS_VMS)
1186 kumpf         1.79  
1187                         //
1188                         // check if CIMServer is already running
1189 david.dillard 1.165     // if CIMServer is already running, print message and
1190 kumpf         1.79      // notify parent process (if there is a parent process) to terminate
1191                         //
1192 h.sterling    1.153     if(_cimServerProcess->isCIMServerRunning())
1193 kumpf         1.79      {
1194 h.sterling    1.153     //l10n
1195                             //cout << "Unable to start CIMServer." << endl;
1196                             //cout << "CIMServer is already running." << endl;
1197                             MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
1198                                          "Unable to start CIMServer.\nCIMServer is already running.");
1199                         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
1200 kumpf         1.79  
1201 h.sterling    1.153     //
1202 kumpf         1.79          // notify parent process (if there is a parent process) to terminate
1203                             //
1204                             if (daemonOption)
1205 h.sterling    1.153                 _cimServerProcess->notify_parent(1);
1206 kumpf         1.79  
1207 s.hills       1.117         return(1);
1208 kumpf         1.79      }
1209 david.dillard 1.165 
1210 kumpf         1.63  #endif
1211 kumpf         1.51  
1212 mike          1.32      // try loop to bind the address, and run the server
1213                         try
1214                         {
1215 mday          1.116 
1216 konrad.r      1.163     _monitor  = new Monitor();
1217 h.sterling    1.153     //PEP#222
1218                         //CIMServer server(&monitor);
1219                         //CimserverHolder cimserverHolder( &server );
1220 konrad.r      1.163     _cimServer = new CIMServer(_monitor);
1221 mday          1.111 
1222 kumpf         1.41  
1223 kumpf         1.86          if (enableHttpConnection)
1224                             {
1225 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberHttp, false, false);
1226 humberto      1.97              //l10n
1227                                 //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1228                                             //"Listening on HTTP port $0.", portNumberHttp);
1229 david.dillard 1.165 
1230 humberto      1.97              Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1231 h.sterling    1.153                             "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
1232                                                 "Listening on HTTP port $0.", portNumberHttp);
1233 kumpf         1.86          }
1234                             if (enableHttpsConnection)
1235                             {
1236 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberHttps, true, false);
1237 humberto      1.97              //l10n
1238                                 //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1239                                             //"Listening on HTTPS port $0.", portNumberHttps);
1240                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1241 h.sterling    1.153                             "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
1242                                                 "Listening on HTTPS port $0.", portNumberHttps);
1243 kumpf         1.86          }
1244 kumpf         1.135         if (enableSSLExportClientVerification)
1245                             {
1246 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberExportHttps, true, true);
1247 kumpf         1.135 
1248                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1249                                     "src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",
1250                                     "Listening on Export HTTPS port $0.", portNumberExportHttps);
1251                             }
1252                     
1253 h.sterling    1.159 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
1254 h.sterling    1.153         _cimServer->addAcceptor(true, 0, false, false);
1255 humberto      1.97          //l10n
1256                             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1257                                         //"Listening on local connection socket.");
1258                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1259 h.sterling    1.153               "src.Server.cimserver.LISTENING_ON_LOCAL",
1260                                   "Listening on local connection socket.");
1261 kumpf         1.41  #endif
1262 kumpf         1.86  
1263 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1264 kumpf         1.86          if (enableHttpConnection)
1265                             {
1266 humberto      1.97              //l10n
1267                                 //cout << "Listening on HTTP port " << portNumberHttp << endl;
1268 h.sterling    1.153       MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTP_PORT",
1269                                        "Listening on HTTP port $0.", portNumberHttp);
1270                                 cout << MessageLoader::getMessage(parms) << endl;
1271 kumpf         1.86          }
1272                             if (enableHttpsConnection)
1273                             {
1274 humberto      1.97              //l10n
1275                                 //cout << "Listening on HTTPS port " << portNumberHttps << endl;
1276 humberto      1.103             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
1277 h.sterling    1.153                      "Listening on HTTPS port $0.", portNumberHttps);
1278                                 cout << MessageLoader::getMessage(parms) << endl;
1279 kumpf         1.86          }
1280 kumpf         1.135         if (enableSSLExportClientVerification)
1281                             {
1282                                 MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",
1283                                     "Listening on Export HTTPS port $0.", portNumberExportHttps);
1284                     
1285                                 cout << MessageLoader::getMessage(parms) << endl;
1286                             }
1287                     
1288 h.sterling    1.159 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
1289 humberto      1.97          //l10n
1290                             //cout << "Listening on local connection socket" << endl;
1291                             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_LOCAL",
1292 h.sterling    1.153                  "Listening on local connection socket.");
1293 humberto      1.97          cout << MessageLoader::getMessage(parms) << endl;
1294 kumpf         1.86  # endif
1295 david         1.85  #endif
1296 mike          1.35  
1297 kumpf         1.86          // bind throws an exception if the bind fails
1298 david.dillard 1.165 	try {
1299 konrad.r      1.163            _cimServer->bind();
1300                     	} catch (const BindFailedException &e)
1301                     	{
1302                     #ifdef PEGASUS_DEBUG
1303                             MessageLoaderParms parms("src.Server.cimserver.BIND_FAILED",
1304                                      "Could not bind: $0.", e.getMessage());
1305                             cout << MessageLoader::getMessage(parms) << endl;
1306                     #endif
1307                             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1308                                 "src.Server.cimserver.BIND.FAILED",
1309                                 "Could not bind:  $0", e.getMessage());
1310 kumpf         1.73  
1311 konrad.r      1.163 	   deleteCIMServer();
1312                     	   return 1;
1313                     	}
1314 david.dillard 1.165     // notify parent process (if there is a parent process) to terminate
1315 konrad.r      1.95          // so user knows that there is cimserver ready to serve CIM requests.
1316 h.sterling    1.153     if (daemonOption)
1317                             _cimServerProcess->notify_parent(0);
1318 mike          1.32  
1319 h.sterling    1.153     time_t last = 0;
1320 mike          1.35  
1321 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) \
1322                         || defined(PEGASUS_OS_AIX) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \
1323                         || defined(PEGASUS_OS_VMS)
1324 kumpf         1.45          //
1325 kumpf         1.56          // create a file to indicate that the cimserver has started and
1326                             // save the process id of the cimserver process in the file
1327 kumpf         1.45          //
1328 kumpf         1.56          // remove the old file if it exists
1329 h.sterling    1.153         System::removeFile(_cimServerProcess->getPIDFileName());
1330 kumpf         1.56  
1331                             // open the file
1332 h.sterling    1.153         FILE *pid_file = fopen(_cimServerProcess->getPIDFileName(), "w");
1333 kumpf         1.91  
1334 kumpf         1.56          if (pid_file)
1335 kumpf         1.45          {
1336 kumpf         1.56              // save the pid in the file
1337 h.sterling    1.153             fprintf(pid_file, "%ld\n", _cimServerProcess->get_server_pid());
1338 kumpf         1.56              fclose(pid_file);
1339 kumpf         1.45          }
1340                     #endif
1341 kumpf         1.91  
1342 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1343 h.sterling    1.153     cout << "Started. " << endl;
1344 kumpf         1.63  #endif
1345 david.dillard 1.165 
1346 kumpf         1.54          // Put server started message to the logger
1347 kumpf         1.143         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
1348                                 Logger::INFORMATION,
1349                                 "src.Server.cimserver.STARTED_VERSION",
1350                                 "Started $0 version $1.",
1351 h.sterling    1.153             _cimServerProcess->getProductName(), _cimServerProcess->getVersion());
1352 kumpf         1.45  
1353 mike          1.35          //
1354                             // Loop to call CIMServer's runForever() method until CIMServer
1355                             // has been shutdown
1356                             //
1357 h.sterling    1.153     while( !_cimServer->terminated() )
1358                         {
1359 mday          1.116 
1360 h.sterling    1.153       _cimServer->runForever();
1361 mday          1.112 
1362 h.sterling    1.153     }
1363 carson.hovey  1.157 
1364 kumpf         1.45          //
1365                             // normal termination
1366 carson.hovey  1.157         //
1367 kumpf         1.143 
1368 kumpf         1.54          // Put server shutdown message to the logger
1369 kumpf         1.143         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
1370                                 Logger::INFORMATION, "src.Server.cimserver.STOPPED",
1371 h.sterling    1.153             "$0 stopped.", _cimServerProcess->getProductName());
1372 kumpf         1.45  
1373 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
1374                     || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
1375                     || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined(PEGASUS_OS_VMS)
1376 kumpf         1.45          //
1377 david.dillard 1.165         // close the file created at startup time to indicate that the
1378 kumpf         1.56          // cimserver has terminated normally.
1379 kumpf         1.45          //
1380 h.sterling    1.153         FileSystem::removeFile(_cimServerProcess->getPIDFileName());
1381 kumpf         1.45  #endif
1382 mike          1.32      }
1383                         catch(Exception& e)
1384                         {
1385 david         1.100 
1386 h.sterling    1.153     //l10n
1387                         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1388 david.dillard 1.165             //"Error: $0", e.getMessage());
1389 h.sterling    1.153     Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1390                                 "src.Server.cimserver.ERROR",
1391 david.dillard 1.165             "Error: $0", e.getMessage());
1392 konrad.r      1.95  
1393                     #ifndef PEGASUS_OS_OS400
1394 h.sterling    1.153     //l10n
1395                         //PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);
1396                         MessageLoaderParms parms("src.Server.cimserver.ERROR",
1397                                                  "Error: $0", e.getMessage());
1398                         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
1399 david         1.100 
1400 david         1.85  #endif
1401 kumpf         1.77  
1402 h.sterling    1.153     //
1403 kumpf         1.77          // notify parent process (if there is a parent process) to terminate
1404                             //
1405                             if (daemonOption)
1406 h.sterling    1.153                 _cimServerProcess->notify_parent(1);
1407 kumpf         1.77  
1408 h.sterling    1.156         deleteCIMServer();
1409 kumpf         1.54          return 1;
1410 mike          1.32      }
1411                     
1412 h.sterling    1.156     deleteCIMServer();
1413 mike          1.32      return 0;
1414                     }
1415 tony          1.128 
1416                     
1417                     
1418                     

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2