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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2