(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                         return;
 551 mike          1.32  }
 552                     
 553 mike          1.35  
 554 mike          1.33  /////////////////////////////////////////////////////////////////////////
 555 mike          1.32  //  MAIN
 556                     //////////////////////////////////////////////////////////////////////////
 557                     int main(int argc, char** argv)
 558                     {
 559 mike          1.35      String pegasusHome  = String::EMPTY;
 560                         Boolean shutdownOption = false;
 561 mday          1.47  
 562 humberto      1.97  //l10n
 563                     // Set Message loading to process locale
 564 david.dillard 1.165 MessageLoader::_useProcessLocale = true;
 565 humberto      1.97  //l10n
 566                     
 567 kv.le         1.140 //l10n
 568                     #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
 569                     setlocale(LC_ALL, "");
 570                     #endif
 571                     
 572 chuck         1.66  #ifdef PEGASUS_OS_OS400
 573 david         1.120 
 574                       VFYPTRS_INCDCL;               // VFYPTRS local variables
 575                     
 576                       // verify pointers
 577                       #pragma exception_handler (qsyvp_excp_hndlr,qsyvp_excp_comm_area,\
 578                         0,_C2_MH_ESCAPE)
 579                         for( int arg_index = 1; arg_index < argc; arg_index++ ){
 580 h.sterling    1.153     VFYPTRS(VERIFY_SPP_NULL(argv[arg_index]));
 581 david         1.120     }
 582                       #pragma disable_handler
 583                     
 584 david         1.100     // Convert the args to ASCII
 585                         for(Uint32 i = 0;i< argc;++i)
 586                         {
 587 h.sterling    1.153     EtoA(argv[i]);
 588 david         1.100     }
 589                     
 590 chuck         1.66      // Initialize Pegasus home to the shipped OS/400 directory.
 591                         pegasusHome = OS400_DEFAULT_PEGASUS_HOME;
 592                     #endif
 593                     
 594 kv.le         1.134 
 595 tony          1.82  #ifndef PEGASUS_OS_TYPE_WINDOWS
 596 kumpf         1.38      //
 597                         // Get environment variables:
 598                         //
 599 david         1.100 #ifdef PEGASUS_OS_OS400
 600                     #pragma convert(37)
 601                         const char* tmp = getenv("PEGASUS_HOME");
 602                     #pragma convert(0)
 603                         char home[256] = {0};
 604                         if (tmp && strlen(tmp) < 256)
 605                         {
 606 h.sterling    1.153     strcpy(home, tmp);
 607                         EtoA(home);
 608                         pegasusHome = home;
 609 david         1.100     }
 610                     #else
 611 kv.le         1.134   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
 612                         pegasusHome = AIX_RELEASE_PEGASUS_HOME;
 613 kumpf         1.138   #elif !defined(PEGASUS_USE_RELEASE_DIRS)
 614 kumpf         1.38      const char* tmp = getenv("PEGASUS_HOME");
 615                     
 616                         if (tmp)
 617                         {
 618                             pegasusHome = tmp;
 619                         }
 620 kv.le         1.134   #endif
 621 david         1.100 #endif
 622 kumpf         1.38  
 623                         FileSystem::translateSlashes(pegasusHome);
 624 tony          1.82  #else
 625 kumpf         1.38  
 626 tony          1.82    // windows only
 627 h.sterling    1.153   //setHome(pegasusHome);
 628                       pegasusHome = _cimServerProcess->getHome();
 629 tony          1.82  #endif
 630 mike          1.32  
 631 kumpf         1.60          // Get help, version, and shutdown options
 632 mike          1.35  
 633                             for (int i = 1; i < argc; )
 634                             {
 635                                 const char* arg = argv[i];
 636 a.arora       1.142             if(String::equal(arg,"--help"))
 637                                 {
 638                                         PrintHelp(argv[0]);
 639                                         exit(0);
 640                                 }
 641                                 else if(String::equal(arg,"--version"))
 642                                 {
 643 h.sterling    1.153                 cout << _cimServerProcess->getVersion() << endl;
 644 a.arora       1.142                 exit(0);
 645                                 }
 646 mike          1.35              // Check for -option
 647 a.arora       1.142             else if (*arg == '-')
 648 mike          1.35              {
 649                                     // Get the option
 650                                     const char* option = arg + 1;
 651                     
 652                                     //
 653                                     // Check to see if user asked for the version (-v option):
 654                                     //
 655 tony          1.83                  if (*option == OPTION_VERSION &&
 656                                         strlen(option) == 1)
 657 mike          1.35                  {
 658 h.sterling    1.153                     cout << _cimServerProcess->getVersion() << endl;
 659 mike          1.35                      exit(0);
 660                                     }
 661                                     //
 662                                     // Check to see if user asked for help (-h option):
 663                                     //
 664 tony          1.83                  else if (*option == OPTION_HELP &&
 665                                             (strlen(option) == 1))
 666 mike          1.35                  {
 667                                         PrintHelp(argv[0]);
 668                                         exit(0);
 669                                     }
 670 kumpf         1.138 #if !defined(PEGASUS_USE_RELEASE_DIRS)
 671 tony          1.83                  else if (*option == OPTION_HOME &&
 672                                             (strlen(option) == 1))
 673 mike          1.35                  {
 674 kumpf         1.60                      if (i + 1 < argc)
 675 mike          1.35                      {
 676                                             pegasusHome.assign(argv[i + 1]);
 677                                         }
 678                                         else
 679                                         {
 680 humberto      1.97                          //l10n
 681                                             //cout << "Missing argument for option -" << option << endl;
 682 humberto      1.99                          String opt(option);
 683 humberto      1.97                          MessageLoaderParms parms("src.Server.cimserver.MISSING_ARGUMENT",
 684 h.sterling    1.153                                          "Missing argument for option -$0",
 685                                                              opt);
 686                                             cout << MessageLoader::getMessage(parms) << endl;
 687 mike          1.35                          exit(0);
 688                                         }
 689                     
 690                                         memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));
 691                                         argc -= 2;
 692                                     }
 693 kumpf         1.63  #endif
 694 kumpf         1.48  #if defined(PEGASUS_OS_HPUX)
 695                                     //
 696 kumpf         1.49                  // Check to see if user asked for the version (-X option):
 697 kumpf         1.48                  //
 698 tony          1.83                  if (*option == OPTION_BINDVERBOSE &&
 699                                             (strlen(option) == 1))
 700 kumpf         1.48                  {
 701 h.sterling    1.153             System::bindVerbose = true;
 702 humberto      1.97                      //l10n
 703 david.dillard 1.165                     //cout << "Unsupported debug option, BIND_VERBOSE, enabled."
 704 humberto      1.97                           //<< endl;
 705                                         MessageLoaderParms parms("src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
 706 h.sterling    1.153                                          "Unsupported debug option, BIND_VERBOSE, enabled.");
 707                                         cout << MessageLoader::getMessage(parms) << endl;
 708 kumpf         1.48                      // remove the option from the command line
 709                                         memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
 710 david.dillard 1.165                     argc--;
 711 kumpf         1.48                  }
 712                     #endif
 713 mike          1.35                  //
 714                                     // Check to see if user asked for shutdown (-s option):
 715                                     //
 716 tony          1.82                  else if (*option == OPTION_SHUTDOWN &&
 717                                             (strlen(option) == 1))
 718 mike          1.35                  {
 719                                         //
 720 kumpf         1.52                      // Check to see if shutdown has already been specified:
 721 mike          1.35                      //
 722 kumpf         1.52                      if (shutdownOption)
 723 mike          1.35                      {
 724 humberto      1.97                          //l10n
 725                                             //cout << "Duplicate shutdown option specified." << endl;
 726                                             MessageLoaderParms parms("src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",
 727 h.sterling    1.153                                                  "Duplicate shutdown option specified.");
 728 david.dillard 1.165 
 729 humberto      1.97                          cout << MessageLoader::getMessage(parms) << endl;
 730 mike          1.35                          exit(0);
 731                                         }
 732                     
 733 kumpf         1.52                      shutdownOption = true;
 734 david.dillard 1.165 
 735 mike          1.35                      // remove the option from the command line
 736                                         memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
 737 david.dillard 1.165                     argc--;
 738 mike          1.35                  }
 739                                     else
 740                                         i++;
 741                                 }
 742                                 else
 743                                     i++;
 744 mike          1.32          }
 745 mike          1.35  
 746 kumpf         1.38      //
 747                         // Set the value for pegasusHome property
 748                         //
 749                         ConfigManager::setPegasusHome(pegasusHome);
 750 mike          1.32  
 751 mike          1.35      //
 752 s.hills       1.117     // Do the plaform specific run
 753                         //
 754                     
 755 h.sterling    1.153     return _cimServerProcess->platform_run( argc, argv, shutdownOption );
 756 s.hills       1.117 }
 757                     
 758 h.sterling    1.153 void CIMServerProcess::cimserver_stop()
 759                     {
 760                         _cimServer->shutdownSignal();
 761                     }
 762 s.hills       1.117 
 763                     //
 764                     // The main, common, running code
 765                     //
 766 david.dillard 1.165 // NOTE: Do NOT call exit().  Use return(), otherwise some platforms
 767 s.hills       1.117 // will fail to shutdown properly/cleanly.
 768                     //
 769 david.dillard 1.165 // TODO: Current change minimal for platform "service" shutdown bug fixes.
 770                     // Perhpas further extract out common stuff and put into main(), put
 771                     // daemon stuff into platform specific platform_run(), etc.
 772                     // Note: make sure to not put error handling stuff that platform
 773 s.hills       1.117 // specific runs may need to deal with bettter (instead of exit(), etc).
 774                     //
 775                     
 776 h.sterling    1.153 int CIMServerProcess::cimserver_run( int argc, char** argv, Boolean shutdownOption )
 777 s.hills       1.117 {
 778                         String logsDirectory = String::EMPTY;
 779                         Boolean daemonOption = false;
 780                     
 781                         //
 782 mike          1.35      // Get an instance of the Config Manager.
 783                         //
 784                         configManager = ConfigManager::getInstance();
 785 kumpf         1.136     configManager->useConfigFiles = true;
 786 mike          1.35  
 787 lucier        1.130 #ifdef PEGASUS_OS_OS400
 788                         // In a special startup case for IBM OS400, when the server is
 789                         // automatically started when the machine starts up the config
 790                         // file cannot be read because of access restrictions for the
 791                         // user starting the server.  In this case, we need to skip
 792                         // reading the config options and therefore any use of the config
 793                         // manager also.  To make this determinations we will check to see
 794                         // if the daemon flag is set to true.  If so, then there will be a
 795                         // series of checks to bracket all the calls to the configManager
 796                         // which would otherwise fail.  All this will only be done for
 797                         // IBM OS400.
 798                     
 799                         Boolean os400StartupOption = false;
 800                         // loop through args to check for daemon=true
 801                         for (int i=1; i < argc; i++)
 802                           if (strcmp(argv[i], "daemon=true") == 0)
 803                           {
 804                             os400StartupOption = true;
 805                             daemonOption = true;
 806                           }
 807 chuck         1.164 
 808                         if (!os400StartupOption)
 809                         {
 810                             // If this is the server job, then set the job
 811                             // to save the job log.
 812                             system ("QSYS/CHGJOB JOB(*) LOG(4 00 *SECLVL)");
 813                         }
 814 david.dillard 1.165 #endif
 815 lucier        1.130 
 816 mike          1.35      //
 817 mike          1.32      // Get options (from command line and from configuration file); this
 818 mike          1.35      // removes corresponding options and their arguments from the command
 819 mike          1.32      // line.
 820 mike          1.35      //
 821 mike          1.32      try
 822                         {
 823 lucier        1.130 #ifdef PEGASUS_OS_OS400
 824                         if (os400StartupOption == false)
 825 david.dillard 1.165 #endif
 826 s.hills       1.117         GetOptions(configManager, argc, argv);
 827 mike          1.32      }
 828                         catch (Exception& e)
 829                         {
 830 kumpf         1.127         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 831                                 "src.Server.cimserver.SERVER_NOT_STARTED",
 832                                 "cimserver not started:  $0", e.getMessage());
 833                     
 834                     #if !defined(PEGASUS_OS_OS400)
 835                             MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
 836                                 "cimserver not started: $0", e.getMessage());
 837                     
 838                             PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
 839                                 << PEGASUS_STD(endl);
 840 david         1.85  #endif
 841 kumpf         1.127 
 842 s.hills       1.117         return(1);
 843 mike          1.32      }
 844                     
 845 chuck         1.94  // l10n
 846 h.sterling    1.153     // Set the home directory, msg sub-dir, into the MessageLoader.
 847 david.dillard 1.165     // This will be the default directory where the resource bundles
 848                         // are found.
 849 h.sterling    1.153     MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
 850 david.dillard 1.165         ConfigManager::getInstance()->getCurrentValue("messageDir")));
 851 chuck         1.94  
 852 lucier        1.130 #ifdef PEGASUS_OS_OS400
 853                         // Still need to declare and set the connection variables.
 854                         // Will initialize to false since they are fixed at false for OS400.
 855                     
 856                         // NOTE:  OS400 is a LOCAL_DOMAIN_SOCKET, so a few lines down
 857                         // the test will not be compiled in.  If OS400 ever turns off that
 858                         // define, then we will need to change this code path to insure that
 859 david.dillard 1.165     // one of the variables is true.
 860 lucier        1.130     Boolean enableHttpConnection = false;
 861                         Boolean enableHttpsConnection = false;
 862 kumpf         1.135     Boolean enableSSLExportClientVerification = false;
 863 lucier        1.130 
 864                         if (os400StartupOption == false)
 865                         {
 866                           enableHttpConnection = String::equal(
 867                               configManager->getCurrentValue("enableHttpConnection"), "true");
 868                           enableHttpsConnection = String::equal(
 869                               configManager->getCurrentValue("enableHttpsConnection"), "true");
 870 kumpf         1.135       enableSSLExportClientVerification = String::equal(
 871                               configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
 872 lucier        1.130     }
 873                     #else
 874 kumpf         1.87      Boolean enableHttpConnection = String::equal(
 875                             configManager->getCurrentValue("enableHttpConnection"), "true");
 876                         Boolean enableHttpsConnection = String::equal(
 877                             configManager->getCurrentValue("enableHttpsConnection"), "true");
 878 kumpf         1.135     Boolean enableSSLExportClientVerification = String::equal(
 879                             configManager->getCurrentValue("enableSSLExportClientVerification"), "true");
 880 lucier        1.130 #endif
 881 kumpf         1.86  
 882                         // Make sure at least one connection is enabled
 883 h.sterling    1.159 #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
 884 kumpf         1.86      if (!enableHttpConnection && !enableHttpsConnection)
 885                         {
 886 humberto      1.97          //l10n
 887                             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
 888                                 //"Neither HTTP nor HTTPS connection is enabled.  "
 889                                 //"CIMServer will not be started.");
 890                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
 891 h.sterling    1.153             "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
 892 humberto      1.97              "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
 893                             //cerr << "Neither HTTP nor HTTPS connection is enabled.  "
 894                                 //"CIMServer will not be started." << endl;
 895                             MessageLoaderParms parms("src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
 896 h.sterling    1.153                                  "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");
 897 humberto      1.97          cerr << MessageLoader::getMessage(parms) << endl;
 898 s.hills       1.117         return(1);
 899 kumpf         1.86      }
 900                     #endif
 901                     
 902 mike          1.35      try
 903 mike          1.32      {
 904 mike          1.35          //
 905                             // Check to see if we should Pegasus as a daemon
 906                             //
 907                     
 908                             if (String::equal(configManager->getCurrentValue("daemon"), "true"))
 909                             {
 910                                 daemonOption = true;
 911                             }
 912 david.dillard 1.165 
 913 lucier        1.130 #ifdef PEGASUS_OS_OS400
 914                         if (os400StartupOption == false)
 915                         {
 916 david.dillard 1.165 #endif
 917 kumpf         1.36          // Get the log file directory definition.
 918                             // We put String into Cstring because
 919                             // Directory functions only handle Cstring.
 920                             // ATTN-KS: create String based directory functions.
 921 konrad.r      1.161 #if !defined(PEGASUS_USE_SYSLOGS)
 922                     		// When using syslog facility. No files anymore.
 923 kumpf         1.36          logsDirectory = configManager->getCurrentValue("logdir");
 924 david.dillard 1.165         logsDirectory =
 925 h.sterling    1.153         ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
 926 konrad.r      1.161 #endif
 927 lucier        1.130 #ifdef PEGASUS_OS_OS400
 928                         }  // end if (os400StartupOption == false)
 929                     #endif
 930 kumpf         1.36  
 931                             // Set up the Logger. This does not open the logs
 932                             // Might be more logical to clean before set.
 933                             // ATTN: Need tool to completely disable logging.
 934                     
 935 david         1.85  #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
 936 konrad.r      1.161 !defined(PEGASUS_OS_OS400) && !defined(PEGASUS_USE_SYSLOGS)
 937 kumpf         1.36          Logger::setHomeDirectory(logsDirectory);
 938 kumpf         1.57  #endif
 939 kumpf         1.36  
 940                             //
 941 david.dillard 1.165         // Check to see if we need to shutdown CIMOM
 942 mike          1.35          //
 943                             if (shutdownOption)
 944                             {
 945 david.dillard 1.165             String configTimeout =
 946 kumpf         1.60                  configManager->getCurrentValue("shutdownTimeout");
 947 s.hills       1.117             Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);
 948 david.dillard 1.165 
 949 kumpf         1.52              shutdownCIMOM(timeoutValue);
 950 kumpf         1.45  
 951 david         1.85  #ifdef PEGASUS_OS_OS400
 952 h.sterling    1.153         //l10n
 953                             //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 954 david.dillard 1.165             //"CIM Server stopped.");
 955 h.sterling    1.153         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 956                                 "src.Server.cimserver.SERVER_STOPPED",
 957                                 "CIM Server stopped.");
 958 s.hills       1.117             cimserver_exitRC(0);
 959 david         1.85  #else
 960 h.sterling    1.153             //l10n
 961 humberto      1.97              //cout << "CIM Server stopped." << endl;
 962                                 MessageLoaderParms parms("src.Server.cimserver.SERVER_STOPPED",
 963 h.sterling    1.153                                      "CIM Server stopped.");
 964 humberto      1.106 
 965 humberto      1.97              cout << MessageLoader::getMessage(parms) << endl;
 966 s.hills       1.117             return(0);
 967 diane         1.81  #endif
 968 mike          1.35          }
 969 mike          1.32  
 970 kumpf         1.139 #if defined(PEGASUS_DEBUG)
 971 kumpf         1.36          // Leave this in until people get familiar with the logs.
 972 humberto      1.97          //l10n
 973                             //cout << "Logs Directory = " << logsDirectory << endl;
 974 konrad.r      1.161 #if !defined(PEGASUS_USE_SYSLOGS)
 975 humberto      1.97          MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
 976 h.sterling    1.153                                  "Logs Directory = ");
 977 humberto      1.97          cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
 978 kumpf         1.57  #endif
 979 konrad.r      1.161 #endif
 980 mike          1.32      }
 981 kumpf         1.122     catch (UnrecognizedConfigProperty& e)
 982 mike          1.32      {
 983 david         1.85  
 984                     #ifdef PEGASUS_OS_OS400
 985 h.sterling    1.153     //l10n
 986                         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 987 david.dillard 1.165             //"Error: $0",e.getMessage());
 988 h.sterling    1.153     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
 989                                 "src.Server.cimserver.ERROR",
 990 david.dillard 1.165             "Error: $0",e.getMessage());
 991 david         1.85  #else
 992 h.sterling    1.153     //l10n
 993                         //cout << "Error: " << e.getMessage() << endl;
 994                         MessageLoaderParms parms("src.Server.cimserver.ERROR",
 995                                                  "Error: $0",
 996                                                  e.getMessage());
 997                         cout << MessageLoader::getMessage(parms) << endl;
 998 david         1.85  #endif
 999 mike          1.32      }
1000                     
1001 h.sterling    1.158     // Bug 2148 - Here is the order of operations for determining the server HTTP and HTTPS ports.
1002                         // 1) If the user explicitly specified a port, use it.
1003                         // 2) If the user did not specify a port, get the port from the services file.
1004                         // 3) If no value is specified in the services file, use the IANA WBEM default port.
1005                         // Note that 2 and 3 are done within the System::lookupPort method
1006                         // An empty string from the ConfigManager implies that the user did not specify a port.
1007                     
1008 w.otsuka      1.147     Uint32 portNumberHttps=0;
1009                         Uint32 portNumberHttp=0;
1010                         Uint32 portNumberExportHttps=0;
1011 kumpf         1.53  
1012 kumpf         1.86      if (enableHttpsConnection)
1013 kumpf         1.53      {
1014 kumpf         1.86          String httpsPort = configManager->getCurrentValue("httpsPort");
1015 h.sterling    1.158         if (httpsPort == String::EMPTY)
1016 joyce.j       1.144         {
1017 h.sterling    1.158             //
1018                                 // Look up the WBEM-HTTPS port number
1019                                 //
1020                                 portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
1021                     
1022                             } else
1023 david.dillard 1.165         {
1024 h.sterling    1.158             //
1025                                 // user-specified
1026                                 //
1027                                 CString portString = httpsPort.getCString();
1028                                 char* end = 0;
1029                                 portNumberHttps = strtol(portString, &end, 10);
1030                                 if(!(end != 0 && *end == '\0'))
1031                                 {
1032 joyce.j       1.160                 InvalidPropertyValue e("httpsPort", httpsPort);
1033                                     cerr << e.getMessage() << endl;
1034 h.sterling    1.158                 exit(1);
1035                                 }
1036 joyce.j       1.144         }
1037 kumpf         1.53      }
1038 kumpf         1.86  
1039                         if (enableHttpConnection)
1040 kumpf         1.53      {
1041 kumpf         1.86          String httpPort = configManager->getCurrentValue("httpPort");
1042 h.sterling    1.158         if (httpPort == String::EMPTY)
1043 joyce.j       1.144         {
1044 h.sterling    1.158             //
1045                                 // Look up the WBEM-HTTP port number
1046                                 //
1047                                 portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
1048                     
1049                             } else
1050                             {
1051                                 //
1052                                 // user-specified
1053                                 //
1054                                 CString portString = httpPort.getCString();
1055                                 char* end = 0;
1056                                 portNumberHttp = strtol(portString, &end, 10);
1057                                 if(!(end != 0 && *end == '\0'))
1058                                 {
1059 joyce.j       1.160                 InvalidPropertyValue e("httpPort", httpPort);
1060                                     cerr << e.getMessage() << endl;
1061 h.sterling    1.158                 exit(1);
1062                                 }
1063 joyce.j       1.144         }
1064 kumpf         1.53      }
1065 mike          1.32  
1066 h.sterling    1.158 
1067 kumpf         1.135     if (enableSSLExportClientVerification)
1068                         {
1069                             //
1070                             // No config property is looked up to get the default port number.
1071                             // Lookup the port defined in /etc/services for the service name
1072                             // wbem-exp-https and bind to that port. If the service is  not defined
1073                             // then log a warning message and do not start the cimserver.
1074                             //
1075                             Uint32 port = 0;
1076                     
1077                             portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port);
1078                     
1079                             if (portNumberExportHttps == 0)
1080                             {
1081                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1082                                     "src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",
1083                                     "Port not defined for the service wbem-exp-https. CIMServer will not be started.");
1084                     
1085                                 MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",
1086                                     "Port not defined for the service wbem-exp-https. CIMServer will not be started.");
1087                     
1088 kumpf         1.135             cerr << MessageLoader::getMessage(parms) << endl;
1089                     
1090                                 return(1);
1091                             }
1092                         }
1093 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1094 mike          1.32      // Put out startup up message.
1095 h.sterling    1.153     cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;
1096 humberto      1.97      //l10n
1097                         //cout << "Built " << __DATE__ << " " << __TIME__ << endl;
1098                         //cout <<"Starting..."
1099                         MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
1100 h.sterling    1.153                              "Built $0 $1\nStarting...",
1101                                                  __DATE__,
1102                                                  __TIME__);
1103 humberto      1.97  #endif
1104                     
1105                     //l10n
1106                     // reset message loading to NON-process locale
1107 david.dillard 1.165 MessageLoader::_useProcessLocale = false;
1108 humberto      1.97  //l10n
1109 mike          1.32  
1110 kumpf         1.137     // Get the parent's PID before forking
1111 h.sterling    1.154     _cimServerProcess->set_parent_pid(System::getPID());
1112 david.dillard 1.165 
1113 kumpf         1.63      // do we need to run as a daemon ?
1114                         if (daemonOption)
1115                         {
1116 h.sterling    1.153         if(-1 == _cimServerProcess->cimserver_fork())
1117 diane         1.81  #ifndef PEGASUS_OS_OS400
1118 h.sterling    1.153     {
1119                             return(-1);
1120                         }
1121 diane         1.81  #else
1122 h.sterling    1.153     {
1123 david         1.85              return(-1);
1124 h.sterling    1.153     }
1125                         else
1126                         {
1127                             return(0);
1128                         }
1129 diane         1.81  #endif
1130 david.dillard 1.165 
1131 kumpf         1.63      }
1132 chuck         1.66  
1133 chuck         1.96  // l10n
1134                         // Now we are after the fork...
1135                         // Create a dummy Thread object that can be used to store the
1136                         // AcceptLanguages object for CIM requests that are serviced
1137                         // by this thread (initial thread of server).  Need to do this
1138                         // because this thread is not in a ThreadPool, but is used
1139                         // to service CIM requests.
1140                         // The run function for the dummy Thread should never be called,
1141 konrad.r      1.166     dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
1142 david.dillard 1.165     Thread::setCurrent(dummyInitialThread);
1143 humberto      1.108     AcceptLanguages default_al;
1144                         try{
1145 david.dillard 1.165          default_al = AcceptLanguages::getDefaultAcceptLanguages();
1146 h.sterling    1.153          Thread::setLanguages(new AcceptLanguages(default_al));
1147 kumpf         1.122     }catch(InvalidAcceptLanguageHeader& e){
1148 h.sterling    1.153           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1149                                       "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
1150 david.dillard 1.165                   "Could not convert the system process locale into a valid AcceptLanguage format.");
1151 h.sterling    1.153           Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1152 david.dillard 1.165                              e.getMessage());
1153 humberto      1.108     }
1154 david.dillard 1.165 
1155                     
1156 chuck         1.96  
1157 chuck         1.66  #ifdef PEGASUS_OS_OS400
1158                         // Special server initialization code for OS/400.
1159                         if (cimserver_initialize() != 0)
1160                         {
1161 h.sterling    1.153     // do some logging here!
1162                         //l10n
1163                         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1164 david.dillard 1.165             //"CIM Server failed to initialize");
1165 h.sterling    1.153     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1166                                       "src.Server.cimserver.SERVER_FAILED_TO_INITIALIZE",
1167 david.dillard 1.165                   "CIM Server failed to initialize");
1168 h.sterling    1.153     return(-1);
1169 david.dillard 1.165     }
1170 chuck         1.66  #endif
1171 chuck         1.96  
1172 kumpf         1.167 #ifndef PEGASUS_OS_TYPE_WINDOWS
1173                         umask(S_IRWXG|S_IRWXO);
1174                     #endif
1175 mday          1.62  
1176 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
1177                     || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
1178                     || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined (PEGASUS_OS_VMS)
1179 kumpf         1.79  
1180                         //
1181                         // check if CIMServer is already running
1182 david.dillard 1.165     // if CIMServer is already running, print message and
1183 kumpf         1.79      // notify parent process (if there is a parent process) to terminate
1184                         //
1185 h.sterling    1.153     if(_cimServerProcess->isCIMServerRunning())
1186 kumpf         1.79      {
1187 h.sterling    1.153     //l10n
1188                             //cout << "Unable to start CIMServer." << endl;
1189                             //cout << "CIMServer is already running." << endl;
1190                             MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
1191                                          "Unable to start CIMServer.\nCIMServer is already running.");
1192                         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
1193 kumpf         1.79  
1194 h.sterling    1.153     //
1195 kumpf         1.79          // notify parent process (if there is a parent process) to terminate
1196                             //
1197                             if (daemonOption)
1198 h.sterling    1.153                 _cimServerProcess->notify_parent(1);
1199 kumpf         1.79  
1200 s.hills       1.117         return(1);
1201 kumpf         1.79      }
1202 david.dillard 1.165 
1203 kumpf         1.63  #endif
1204 kumpf         1.51  
1205 mike          1.32      // try loop to bind the address, and run the server
1206                         try
1207                         {
1208 mday          1.116 
1209 konrad.r      1.163     _monitor  = new Monitor();
1210 h.sterling    1.153     //PEP#222
1211                         //CIMServer server(&monitor);
1212                         //CimserverHolder cimserverHolder( &server );
1213 konrad.r      1.163     _cimServer = new CIMServer(_monitor);
1214 mday          1.111 
1215 kumpf         1.41  
1216 kumpf         1.86          if (enableHttpConnection)
1217                             {
1218 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberHttp, false, false);
1219 humberto      1.97              //l10n
1220                                 //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1221                                             //"Listening on HTTP port $0.", portNumberHttp);
1222 david.dillard 1.165 
1223 humberto      1.97              Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1224 h.sterling    1.153                             "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
1225                                                 "Listening on HTTP port $0.", portNumberHttp);
1226 kumpf         1.86          }
1227                             if (enableHttpsConnection)
1228                             {
1229 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberHttps, true, false);
1230 humberto      1.97              //l10n
1231                                 //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1232                                             //"Listening on HTTPS port $0.", portNumberHttps);
1233                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1234 h.sterling    1.153                             "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
1235                                                 "Listening on HTTPS port $0.", portNumberHttps);
1236 kumpf         1.86          }
1237 kumpf         1.135         if (enableSSLExportClientVerification)
1238                             {
1239 h.sterling    1.153             _cimServer->addAcceptor(false, portNumberExportHttps, true, true);
1240 kumpf         1.135 
1241                                 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1242                                     "src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",
1243                                     "Listening on Export HTTPS port $0.", portNumberExportHttps);
1244                             }
1245                     
1246 h.sterling    1.159 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
1247 h.sterling    1.153         _cimServer->addAcceptor(true, 0, false, false);
1248 humberto      1.97          //l10n
1249                             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1250                                         //"Listening on local connection socket.");
1251                             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1252 h.sterling    1.153               "src.Server.cimserver.LISTENING_ON_LOCAL",
1253                                   "Listening on local connection socket.");
1254 kumpf         1.41  #endif
1255 kumpf         1.86  
1256 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1257 kumpf         1.86          if (enableHttpConnection)
1258                             {
1259 humberto      1.97              //l10n
1260                                 //cout << "Listening on HTTP port " << portNumberHttp << endl;
1261 h.sterling    1.153       MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTP_PORT",
1262                                        "Listening on HTTP port $0.", portNumberHttp);
1263                                 cout << MessageLoader::getMessage(parms) << endl;
1264 kumpf         1.86          }
1265                             if (enableHttpsConnection)
1266                             {
1267 humberto      1.97              //l10n
1268                                 //cout << "Listening on HTTPS port " << portNumberHttps << endl;
1269 humberto      1.103             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
1270 h.sterling    1.153                      "Listening on HTTPS port $0.", portNumberHttps);
1271                                 cout << MessageLoader::getMessage(parms) << endl;
1272 kumpf         1.86          }
1273 kumpf         1.135         if (enableSSLExportClientVerification)
1274                             {
1275                                 MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",
1276                                     "Listening on Export HTTPS port $0.", portNumberExportHttps);
1277                     
1278                                 cout << MessageLoader::getMessage(parms) << endl;
1279                             }
1280                     
1281 h.sterling    1.159 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
1282 humberto      1.97          //l10n
1283                             //cout << "Listening on local connection socket" << endl;
1284                             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_LOCAL",
1285 h.sterling    1.153                  "Listening on local connection socket.");
1286 humberto      1.97          cout << MessageLoader::getMessage(parms) << endl;
1287 kumpf         1.86  # endif
1288 david         1.85  #endif
1289 mike          1.35  
1290 kumpf         1.86          // bind throws an exception if the bind fails
1291 david.dillard 1.165 	try {
1292 konrad.r      1.163            _cimServer->bind();
1293                     	} catch (const BindFailedException &e)
1294                     	{
1295                     #ifdef PEGASUS_DEBUG
1296                             MessageLoaderParms parms("src.Server.cimserver.BIND_FAILED",
1297                                      "Could not bind: $0.", e.getMessage());
1298                             cout << MessageLoader::getMessage(parms) << endl;
1299                     #endif
1300                             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
1301                                 "src.Server.cimserver.BIND.FAILED",
1302                                 "Could not bind:  $0", e.getMessage());
1303 kumpf         1.73  
1304 konrad.r      1.163 	   deleteCIMServer();
1305                     	   return 1;
1306                     	}
1307 david.dillard 1.165     // notify parent process (if there is a parent process) to terminate
1308 konrad.r      1.95          // so user knows that there is cimserver ready to serve CIM requests.
1309 h.sterling    1.153     if (daemonOption)
1310                             _cimServerProcess->notify_parent(0);
1311 mike          1.32  
1312 h.sterling    1.153     time_t last = 0;
1313 mike          1.35  
1314 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) \
1315                         || defined(PEGASUS_OS_AIX) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \
1316                         || defined(PEGASUS_OS_VMS)
1317 kumpf         1.45          //
1318 kumpf         1.56          // create a file to indicate that the cimserver has started and
1319                             // save the process id of the cimserver process in the file
1320 kumpf         1.45          //
1321 kumpf         1.56          // remove the old file if it exists
1322 h.sterling    1.153         System::removeFile(_cimServerProcess->getPIDFileName());
1323 kumpf         1.56  
1324                             // open the file
1325 h.sterling    1.153         FILE *pid_file = fopen(_cimServerProcess->getPIDFileName(), "w");
1326 kumpf         1.91  
1327 kumpf         1.56          if (pid_file)
1328 kumpf         1.45          {
1329 kumpf         1.56              // save the pid in the file
1330 h.sterling    1.153             fprintf(pid_file, "%ld\n", _cimServerProcess->get_server_pid());
1331 kumpf         1.56              fclose(pid_file);
1332 kumpf         1.45          }
1333                     #endif
1334 kumpf         1.91  
1335 kumpf         1.139 #if defined(PEGASUS_DEBUG)
1336 h.sterling    1.153     cout << "Started. " << endl;
1337 kumpf         1.63  #endif
1338 david.dillard 1.165 
1339 kumpf         1.54          // Put server started message to the logger
1340 kumpf         1.143         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
1341                                 Logger::INFORMATION,
1342                                 "src.Server.cimserver.STARTED_VERSION",
1343                                 "Started $0 version $1.",
1344 h.sterling    1.153             _cimServerProcess->getProductName(), _cimServerProcess->getVersion());
1345 kumpf         1.45  
1346 mike          1.35          //
1347                             // Loop to call CIMServer's runForever() method until CIMServer
1348                             // has been shutdown
1349                             //
1350 h.sterling    1.153     while( !_cimServer->terminated() )
1351                         {
1352 mday          1.116 
1353 h.sterling    1.153       _cimServer->runForever();
1354 mday          1.112 
1355 h.sterling    1.153     }
1356 carson.hovey  1.157 
1357 kumpf         1.45          //
1358                             // normal termination
1359 carson.hovey  1.157         //
1360 kumpf         1.143 
1361 kumpf         1.54          // Put server shutdown message to the logger
1362 kumpf         1.143         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
1363                                 Logger::INFORMATION, "src.Server.cimserver.STOPPED",
1364 h.sterling    1.153             "$0 stopped.", _cimServerProcess->getProductName());
1365 kumpf         1.45  
1366 gs.keenan     1.150 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
1367                     || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
1368                     || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined(PEGASUS_OS_VMS)
1369 kumpf         1.45          //
1370 david.dillard 1.165         // close the file created at startup time to indicate that the
1371 kumpf         1.56          // cimserver has terminated normally.
1372 kumpf         1.45          //
1373 h.sterling    1.153         FileSystem::removeFile(_cimServerProcess->getPIDFileName());
1374 kumpf         1.45  #endif
1375 mike          1.32      }
1376                         catch(Exception& e)
1377                         {
1378 david         1.100 
1379 h.sterling    1.153     //l10n
1380                         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1381 david.dillard 1.165             //"Error: $0", e.getMessage());
1382 h.sterling    1.153     Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
1383                                 "src.Server.cimserver.ERROR",
1384 david.dillard 1.165             "Error: $0", e.getMessage());
1385 konrad.r      1.95  
1386                     #ifndef PEGASUS_OS_OS400
1387 h.sterling    1.153     //l10n
1388                         //PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);
1389                         MessageLoaderParms parms("src.Server.cimserver.ERROR",
1390                                                  "Error: $0", e.getMessage());
1391                         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
1392 david         1.100 
1393 david         1.85  #endif
1394 kumpf         1.77  
1395 h.sterling    1.153     //
1396 kumpf         1.77          // notify parent process (if there is a parent process) to terminate
1397                             //
1398                             if (daemonOption)
1399 h.sterling    1.153                 _cimServerProcess->notify_parent(1);
1400 kumpf         1.77  
1401 h.sterling    1.156         deleteCIMServer();
1402 kumpf         1.54          return 1;
1403 mike          1.32      }
1404                     
1405 h.sterling    1.156     deleteCIMServer();
1406 mike          1.32      return 0;
1407                     }
1408 tony          1.128 
1409                     
1410                     
1411                     

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2