235{
236
237
238
240 Env *DefaultEnv::sEnv = 0;
241 PostMaster *DefaultEnv::sPostMaster = 0;
242 Log *DefaultEnv::sLog = 0;
243 ForkHandler *DefaultEnv::sForkHandler = 0;
244 FileTimer *DefaultEnv::sFileTimer = 0;
245 Monitor *DefaultEnv::sMonitor = 0;
247 bool DefaultEnv::sMonitorInitialized = false;
248 CheckSumManager *DefaultEnv::sCheckSumManager = 0;
249 TransportManager *DefaultEnv::sTransportManager = 0;
250 PlugInManager *DefaultEnv::sPlugInManager = 0;
251
252
253
254
255 DefaultEnv::DefaultEnv()
256 {
258 log->Debug( UtilityMsg, "Initializing xrootd client version: %s", XrdVERSION );
259
260
261
262
263 std::vector<EnvVarHolder<int> > varsInt;
264 std::vector<EnvVarHolder<std::string> > varsStr;
269 REGISTER_VAR_INT( varsInt,
"SubStreamsPerChannel", DefaultSubStreamsPerChannel );
284 REGISTER_VAR_INT( varsInt,
"TCPKeepAliveInterval", DefaultTCPKeepAliveInterval );
288 REGISTER_VAR_INT( varsInt,
"MetalinkProcessing", DefaultMetalinkProcessing );
295 REGISTER_VAR_INT( varsInt,
"PreserveLocateTried", DefaultPreserveLocateTried );
296 REGISTER_VAR_INT( varsInt,
"NotAuthorizedRetryLimit", DefaultNotAuthorizedRetryLimit );
308
310 REGISTER_VAR_STR( varsStr,
"ClientMonitorParam", DefaultClientMonitorParam );
321
322
323
324
325 std::map<std::string, std::string> config, userConfig;
326 Status st = Utils::ProcessConfig( config, "/etc/xrootd/client.conf" );
327
328 if( !st.IsOK() )
329 log->Warning( UtilityMsg, "Unable to process global config file: %s",
330 st.ToString().c_str() );
331
333 passwd *pwd = pwdHandler.
Get( getuid() );
334 if( pwd )
335 {
336 std::string userConfigFile = pwd->pw_dir;
337 userConfigFile += "/.xrootd/client.conf";
338
339 st = Utils::ProcessConfig( userConfig, userConfigFile );
340
341 if( !st.IsOK() )
342 log->Debug( UtilityMsg, "Unable to process user config file: %s",
343 st.ToString().c_str() );
344 }
345 else
346 log->Debug( UtilityMsg, "Unable to find user home directory." );
347
348 char *conffile = getenv( "XRD_CLCONFFILE" );
349 if( conffile )
350 {
351 st = Utils::ProcessConfig( userConfig, conffile );
352 if( !st.IsOK() )
353 log->Debug( UtilityMsg, "Unable to process %s file: %s",
354 conffile, st.ToString().c_str() );
355 }
356
357 char *confdir = getenv( "XRD_CLCONFDIR" );
358 if( confdir )
359 {
360 st = Utils::ProcessConfigDir( userConfig, confdir );
361 if( !st.IsOK() )
362 log->Debug( UtilityMsg, "Unable to process %s file: %s",
363 confdir, st.ToString().c_str() );
364 }
365
366 std::map<std::string, std::string>::iterator it;
367
368 for( it = config.begin(); it != config.end(); ++it )
369 log->Dump( UtilityMsg, "[Global config] \"%s\" = \"%s\"",
370 it->first.c_str(), it->second.c_str() );
371
372 for( it = userConfig.begin(); it != userConfig.end(); ++it )
373 {
374 config[it->first] = it->second;
375 log->Dump( UtilityMsg, "[User config] \"%s\" = \"%s\"",
376 it->first.c_str(), it->second.c_str() );
377 }
378
379 for( it = config.begin(); it != config.end(); ++it )
380 log->Debug( UtilityMsg, "[Effective config] \"%s\" = \"%s\"",
381 it->first.c_str(), it->second.c_str() );
382
383
384
385
387 char *appName = basename( tmp );
388 PutString( "AppName", appName );
389 free( tmp );
390 ImportString( "AppName", "XRD_APPNAME" );
391 PutString( "MonInfo", "" );
392 ImportString( "MonInfo", "XRD_MONINFO" );
393
394
395
396
397 for( size_t i = 0; i < varsInt.size(); ++i )
398 {
399 PutInt( varsInt[i].name, varsInt[i].def );
400
401 it = config.find( varsInt[i].name );
402 if( it != config.end() )
403 {
404 char *endPtr = 0;
405 int value = (int)strtol( it->second.c_str(), &endPtr, 0 );
406 if( *endPtr )
407 log->Warning( UtilityMsg, "Unable to set %s to %s: not a proper "
408 "integer", varsInt[i].name.c_str(),
409 it->second.c_str() );
410 else
411 PutInt( varsInt[i].name, value );
412 }
413
414 std::string name = "XRD_" + varsInt[i].name;
415 std::transform( name.begin(), name.end(), name.begin(), ::toupper );
416 ImportInt( varsInt[i].name, name );
417 }
418
419
420
421
422 for( size_t i = 0; i < varsStr.size(); ++i )
423 {
424 PutString( varsStr[i].name, varsStr[i].def );
425
426 it = config.find( varsStr[i].name );
427 if( it != config.end() )
428 PutString( varsStr[i].name, it->second );
429
430 std::string name = "XRD_" + varsStr[i].name;
431 std::transform( name.begin(), name.end(), name.begin(), ::toupper );
432 ImportString( varsStr[i].name, name );
433 }
434
435
436
437
439 }
440
441
442
443
444 Env *DefaultEnv::GetEnv()
445 {
446 return sEnv;
447 }
448
449
450
451
452 PostMaster *DefaultEnv::GetPostMaster()
453 {
454 PostMaster* postMaster =
AtomicGet(sPostMaster);
455
457 {
460
461 if( postMaster )
462 return postMaster;
463
464 postMaster = new PostMaster();
465
466 if( !postMaster->Initialize() )
467 {
468 delete postMaster;
469 postMaster = 0;
470 return 0;
471 }
472
473 if( !postMaster->Start() )
474 {
475 postMaster->Finalize();
476 delete postMaster;
477 postMaster = 0;
478 return 0;
479 }
480
481 sForkHandler->RegisterPostMaster( postMaster );
482 postMaster->GetTaskManager()->RegisterTask( sFileTimer, time(0), false );
483 AtomicCAS(sPostMaster, sPostMaster, postMaster);
484 }
485
486 return postMaster;
487 }
488
489
490
491
492 Log *DefaultEnv::GetLog()
493 {
494 return sLog;
495 }
496
497
498
499
500 void DefaultEnv::SetLogLevel( const std::string &level )
501 {
503 log->SetLevel( level );
504 }
505
506
507
508
509 bool DefaultEnv::SetLogFile( const std::string &filepath )
510 {
512 LogOutFile *out = new LogOutFile();
513
514 if( out->Open( filepath ) )
515 {
516 log->SetOutput( out );
517 return true;
518 }
519
520 delete out;
521 return false;
522 }
523
524
526
527 void DefaultEnv::SetLogMask( const std::string &level,
528 const std::string &mask )
529 {
531 MaskTranslator translator;
532 uint64_t topicMask = translator.translateMask( mask );
533
534 if( level == "All" )
535 {
536 log->SetMask( Log::ErrorMsg, topicMask );
537 log->SetMask( Log::WarningMsg, topicMask );
538 log->SetMask( Log::InfoMsg, topicMask );
539 log->SetMask( Log::DebugMsg, topicMask );
540 log->SetMask( Log::DumpMsg, topicMask );
541 return;
542 }
543
544 log->SetMask( level, topicMask );
545 }
546
547
548
549
550 ForkHandler *DefaultEnv::GetForkHandler()
551 {
552 return sForkHandler;
553 }
554
555
556
557
558 FileTimer *DefaultEnv::GetFileTimer()
559 {
560 return sFileTimer;
561 }
562
563
564
565
566 Monitor *DefaultEnv::GetMonitor()
567 {
568 if(
unlikely( !sMonitorInitialized ) )
569 {
571 if( !sMonitorInitialized )
572 {
573
574
575
576 Env *env = GetEnv();
578 sMonitorInitialized = true;
580 env->GetString( "ClientMonitor", monitorLib );
581 if( monitorLib.empty() )
582 {
583 log->Debug( UtilityMsg, "Monitor library name not set. No "
584 "monitoring" );
585 return 0;
586 }
587
589 env->GetString( "ClientMonitorParam", monitorParam );
590
591 log->Debug( UtilityMsg, "Initializing monitoring, lib: %s, param: %s",
592 monitorLib.c_str(), monitorParam.c_str() );
593
594
595
596
597 char *errBuffer = new char[4000];
599 errBuffer, 4000, &XrdVERSIONINFOVAR(
XrdCl ),
600 "monitor", monitorLib.c_str() );
601
603 MonLoader loader;
604 loader = (MonLoader)sMonitorLibHandle->Resolve( "XrdClGetMonitor", -1 );
605 if( !loader )
606 {
607 log->Error( UtilityMsg, "Unable to initialize user monitoring: %s",
608 errBuffer );
609 delete [] errBuffer;
610 sMonitorLibHandle->Unload();
611 delete sMonitorLibHandle; sMonitorLibHandle = 0;
612 return 0;
613 }
614
615
616
617
618 const char *param = monitorParam.empty() ? 0 : monitorParam.c_str();
620
621 if( !sMonitor )
622 {
623 log->Error( UtilityMsg, "Unable to initialize user monitoring: %s",
624 errBuffer );
625 delete [] errBuffer;
626 sMonitorLibHandle->Unload();
627 delete sMonitorLibHandle; sMonitorLibHandle = 0;
628 return 0;
629 }
630 log->Debug( UtilityMsg, "Successfully initialized monitoring from: %s",
631 monitorLib.c_str() );
632 delete [] errBuffer;
633 }
634 }
635 return sMonitor;
636 }
637
638
639
640
641 CheckSumManager *DefaultEnv::GetCheckSumManager()
642 {
644 {
646 if( !sCheckSumManager )
647 sCheckSumManager = new CheckSumManager();
648 }
649 return sCheckSumManager;
650 }
651
652
653
654
655 TransportManager *DefaultEnv::GetTransportManager()
656 {
657 if(
unlikely( !sTransportManager ) )
658 {
660 if( !sTransportManager )
661 sTransportManager = new TransportManager();
662 }
663 return sTransportManager;
664 }
665
666
667
668
669 PlugInManager *DefaultEnv::GetPlugInManager()
670 {
671 return sPlugInManager;
672 }
673
674
675
676
677 PlugInFactory *DefaultEnv::GetPlugInFactory( const std::string url )
678 {
679 return sPlugInManager->GetFactory( url );
680 }
681
682
683
684
685 void DefaultEnv::Initialize()
686 {
688 SetUpLog();
689
690 sEnv = new DefaultEnv();
691 sForkHandler = new ForkHandler();
692 sFileTimer = new FileTimer();
693 sPlugInManager = new PlugInManager();
694
695 sPlugInManager->ProcessEnvironmentSettings();
696 sForkHandler->RegisterFileTimer( sFileTimer );
697
698
699
700
701
702
703#ifdef __APPLE__
704 char *errBuff = new char[1024];
705
706 const char *libs[] =
707 {
708 "libXrdSeckrb5.so",
709 "libXrdSecgsi.so",
710 "libXrdSecgsiAuthzVO.so",
711 "libXrdSecgsiGMAPDN.so",
712 "libXrdSecpwd.so",
713 "libXrdSecsss.so",
714 "libXrdSecunix.so",
715 0
716 };
717
718 for( int i = 0; libs[i]; ++i )
719 {
720 sLog->Debug( UtilityMsg, "Attempting to pre-load: %s", libs[i] );
722 if( !ok )
723 sLog->Error( UtilityMsg, "Unable to pre-load %s: %s", libs[i], errBuff );
724 }
725 delete [] errBuff;
726#endif
727 }
728
729
730
731
732 void DefaultEnv::Finalize()
733 {
734 if( sPostMaster )
735 {
736 sPostMaster->Stop();
737 sPostMaster->Finalize();
738 delete sPostMaster;
739 sPostMaster = 0;
740 }
741
742 delete sTransportManager;
743 sTransportManager = 0;
744
745 delete sCheckSumManager;
746 sCheckSumManager = 0;
747
748 delete sMonitor;
749 sMonitor = 0;
750
751 if( sMonitorLibHandle )
752 sMonitorLibHandle->Unload();
753
754 delete sMonitorLibHandle;
755 sMonitorLibHandle = 0;
756
757 delete sForkHandler;
758 sForkHandler = 0;
759
760 delete sFileTimer;
761 sFileTimer = 0;
762
763 delete sPlugInManager;
764 sPlugInManager = 0;
765
766 delete sEnv;
767 sEnv = 0;
768
769 delete sLog;
770 sLog = 0;
771 }
772
773
774
775
776 void DefaultEnv::ReInitializeLogging()
777 {
778 delete sLog;
780 SetUpLog();
781 }
782
783
784
785
786 void DefaultEnv::SetUpLog()
787 {
789
790
791
792
793 char *level = getenv( "XRD_LOGLEVEL" );
794 if( level )
795 log->SetLevel( level );
796
797
798
799
800 char *file = getenv( "XRD_LOGFILE" );
801 if( file )
802 {
803 LogOutFile *out = new LogOutFile();
804 if( out->Open( file ) )
805 log->SetOutput( out );
806 else
807 delete out;
808 }
809
810
811
812
813 MaskTranslator translator;
814 log->SetMask( Log::DumpMsg, translator.translateMask( "All|^PollerMsg" ) );
815
816
817
818
819 char *logMask = getenv( "XRD_LOGMASK" );
820 if( logMask )
821 {
822 uint64_t mask = translator.translateMask( logMask );
823 log->SetMask( Log::ErrorMsg, mask );
824 log->SetMask( Log::WarningMsg, mask );
825 log->SetMask( Log::InfoMsg, mask );
826 log->SetMask( Log::DebugMsg, mask );
827 log->SetMask( Log::DumpMsg, mask );
828 }
829
830 logMask = getenv( "XRD_LOGMASK_ERROR" );
831 if( logMask ) log->SetMask( Log::ErrorMsg, translator.translateMask( logMask ) );
832
833 logMask = getenv( "XRD_LOGMASK_WARNING" );
834 if( logMask ) log->SetMask( Log::WarningMsg, translator.translateMask( logMask ) );
835
836 logMask = getenv( "XRD_LOGMASK_INFO" );
837 if( logMask ) log->SetMask( Log::InfoMsg, translator.translateMask( logMask ) );
838
839 logMask = getenv( "XRD_LOGMASK_DEBUG" );
840 if( logMask ) log->SetMask( Log::DebugMsg, translator.translateMask( logMask ) );
841
842 logMask = getenv( "XRD_LOGMASK_DUMP" );
843 if( logMask ) log->SetMask( Log::DumpMsg, translator.translateMask( logMask ) );
844
845
846
847
848 log->SetTopicName( AppMsg, "App" );
849 log->SetTopicName( UtilityMsg, "Utility" );
850 log->SetTopicName( FileMsg, "File" );
851 log->SetTopicName( PollerMsg, "Poller" );
852 log->SetTopicName( PostMasterMsg, "PostMaster" );
853 log->SetTopicName( XRootDTransportMsg, "XRootDTransport" );
854 log->SetTopicName( TaskMgrMsg, "TaskMgr" );
855 log->SetTopicName( XRootDMsg, "XRootD" );
856 log->SetTopicName( FileSystemMsg, "FileSystem" );
857 log->SetTopicName( AsyncSockMsg, "AsyncSock" );
858 log->SetTopicName( JobMgrMsg, "JobMgr" );
859 log->SetTopicName( PlugInMgrMsg, "PlugInMgr" );
860 log->SetTopicName( ExDbgMsg, "ExDbgMsg" );
861 log->SetTopicName( TlsMsg, "TlsMsg" );
862 log->SetTopicName( ZipMsg, "ZipMsg" );
863 }
864
865}
866
867
868
869
871
872
873
874
875
876
878{
879 if(
counter++ == 0 ) XrdCl::DefaultEnv::Initialize();
880}
881
882
883
884
885
886
888{
889 if( --
counter == 0 ) XrdCl::DefaultEnv::Finalize();
890}
891
#define REGISTER_VAR_INT(array, name, def)
#define REGISTER_VAR_STR(array, name, def)
bool XrdOucPreload(const char *plib, char *eBuff, int eBlen, bool retry)
This include file define a utility function that pre-loads a plugin.
#define AtomicCAS(x, y, z)
An abstract class to describe the client-side monitoring plugin interface.
struct passwd * Get(const char *Usr)
static const char * ExecName()
const char *const DefaultClientMonitorParam
const char *const DefaultClientMonitor