1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.13 2006/12/07 08:51:26 jgrosseo
20 table, db names in ldap configuration
21 added GRP preprocessor
22 DCS data can also be retrieved by data point
24 Revision 1.12 2006/11/16 16:16:48 jgrosseo
25 introducing strict run ordering flag
26 removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
28 Revision 1.11 2006/11/06 14:23:04 jgrosseo
29 major update (Alberto)
30 o) reading of run parameters from the logbook
31 o) online offline naming conversion
32 o) standalone DCSclient package
34 Revision 1.10 2006/10/20 15:22:59 jgrosseo
35 o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
36 o) Merging Collect, CollectAll, CollectNew function
37 o) Removing implementation of empty copy constructors (declaration still there!)
39 Revision 1.9 2006/10/02 16:38:39 jgrosseo
42 storing of objects that failed to be stored to the grid before
43 interfacing of shuttle status table in daq system
45 Revision 1.8 2006/08/15 10:50:00 jgrosseo
46 effc++ corrections (alberto)
48 Revision 1.7 2006/07/20 09:54:40 jgrosseo
49 introducing status management: The processing per subdetector is divided into several steps,
50 after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
51 can keep track of the number of failures and skips further processing after a certain threshold is
52 exceeded. These thresholds can be configured in LDAP.
54 Revision 1.6 2006/07/19 10:09:55 jgrosseo
55 new configuration, accesst to DAQ FES (Alberto)
57 Revision 1.5 2006/07/10 13:01:41 jgrosseo
58 enhanced storing of last sucessfully processed run (alberto)
60 Revision 1.4 2006/06/12 09:11:16 jgrosseo
61 coding conventions (Alberto)
63 Revision 1.3 2006/06/06 14:26:40 jgrosseo
64 o) removed files that were moved to STEER
65 o) shuttle updated to follow the new interface (Alberto)
67 Revision 1.7 2006/05/12 09:07:16 colla
69 New configuration complete
71 Revision 1.2 2006/03/07 07:52:34 hristov
72 New version (B.Yordanov)
74 Revision 1.4 2005/11/19 14:20:31 byordano
75 logbook config added to AliShuttleConfig
77 Revision 1.3 2005/11/17 19:24:25 byordano
78 TList changed to TObjArray in AliShuttleConfig
80 Revision 1.2 2005/11/17 14:43:23 byordano
83 Revision 1.1.1.1 2005/10/28 07:33:58 hristov
84 Initial import as subdirectory in AliRoot
86 Revision 1.1.1.1 2005/09/12 22:11:40 byordano
89 Revision 1.3 2005/08/30 09:13:02 byordano
96 // This class keeps the AliShuttle configuration.
97 // It reads the configuration for LDAP server.
98 // For every child entry in basedn which has schema type 'shuttleConfig'
99 // it creates a detector configuration. This configuration includes:
100 // DCS server host and port and the set of aliases for which data from
101 // will be retrieved (used by AliShuttle).
105 #include "AliShuttleConfig.h"
106 #include "AliShuttleInterface.h"
111 #include <TObjString.h>
112 #include <TLDAPResult.h>
113 #include <TLDAPEntry.h>
114 #include <TLDAPAttribute.h>
117 AliShuttleConfig::AliShuttleConfigHolder::AliShuttleConfigHolder(const TLDAPEntry* entry):
124 fSkipDCSQuery(kFALSE),
125 fStrictRunOrder(kFALSE)
127 // constructor of the shuttle configuration holder
129 TLDAPAttribute* anAttribute;
130 fDCSAliases = new TObjArray();
131 fDCSAliases->SetOwner(1);
132 fDCSDataPoints = new TObjArray();
133 fDCSDataPoints->SetOwner(1);
135 anAttribute = entry->GetAttribute("det"); // MUST
138 AliError(Form("Invalid configuration! No \"det\" attribute!"));
141 fDetector = anAttribute->GetValue();
143 anAttribute = entry->GetAttribute("StrictRunOrder"); // MAY
146 AliWarning(Form("%s did not set StrictRunOrder flag - the default is FALSE",
149 TString strictRunStr = anAttribute->GetValue();
150 if (!(strictRunStr == "0" || strictRunStr == "1"))
152 AliError("Invalid configuration! StrictRunOrder flag must be 0 or 1!");
155 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
158 anAttribute = entry->GetAttribute("DCSHost"); // MAY
162 Form("%s has not DCS host entry - Shuttle will skip DCS data query!",
165 fSkipDCSQuery = kTRUE;
169 fDCSHost = anAttribute->GetValue();
171 anAttribute = entry->GetAttribute("DCSPort"); // MAY
174 AliError(Form("Invalid configuration! %s has DCS Host but no port number!",
178 TString portStr = anAttribute->GetValue();
179 fDCSPort = portStr.Atoi();
181 anAttribute = entry->GetAttribute("DCSalias"); // MAY
185 while ((anAlias = anAttribute->GetValue()))
187 fDCSAliases->AddLast(new TObjString(anAlias));
191 anAttribute = entry->GetAttribute("DCSdatapoint"); // MAY
194 const char* aDataPoint;
195 while ((aDataPoint = anAttribute->GetValue()))
197 fDCSDataPoints->AddLast(new TObjString(aDataPoint));
206 //______________________________________________________________________________________________
207 AliShuttleConfig::AliShuttleConfigHolder::~AliShuttleConfigHolder()
209 // destructor of the shuttle configuration holder
212 delete fDCSDataPoints;
215 ClassImp(AliShuttleConfig)
217 //______________________________________________________________________________________________
218 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
219 const char* binddn, const char* password, const char* basedn):
221 fDAQlbHost(""), fDAQlbPort(), fDAQlbUser(""), fDAQlbPass(""),
222 fDAQlbDB(""), fDAQlbTable(""),
223 fMaxRetries(0), fPPTimeOut(0), fDetectorMap(), fDetectorList(),
224 fShuttleInstanceHost(""), fProcessedDetectors(), fProcessAll(kFALSE)
227 // host: ldap server host
228 // port: ldap server port
229 // binddn: binddn used for ldap binding (simple bind is used!).
230 // password: password for binddn
231 // basedn: this is basedn whose childeren entries which have
232 // (objectClass=shuttleConfig) will be used as detector configurations.
235 fDetectorMap.SetOwner();
236 fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
237 fProcessedDetectors.SetOwner();
239 TLDAPServer aServer(host, port, binddn, password, 3);
241 if (!aServer.IsConnected()) {
242 AliError(Form("Can't connect to ldap server %s:%d",
247 // reads configuration for the shuttle running on this machine
249 fShuttleInstanceHost = gSystem->HostName();
250 TString queryFilter = Form("(ShuttleHost=%s)", fShuttleInstanceHost.Data());
252 TLDAPResult* aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL, queryFilter.Data());
255 AliError(Form("Can't find configuration with base DN: %s",
260 if (aResult->GetCount() == 0) {
261 AliError(Form("No Shuttle instance for host = %s!",
262 fShuttleInstanceHost.Data()));
263 AliError(Form("All detectors will be processed."));
267 if (aResult->GetCount() > 1) {
268 AliError(Form("More than one Shuttle instance for host %s!",
269 fShuttleInstanceHost.Data()));
274 TLDAPEntry* anEntry = 0;
275 TLDAPAttribute* anAttribute = 0;
278 anEntry = aResult->GetNext();
279 anAttribute = anEntry->GetAttribute("detectors");
281 while((detName = anAttribute->GetValue())){
282 TObjString *objDet= new TObjString(detName);
283 fProcessedDetectors.Add(objDet);
287 delete anEntry; delete aResult;
289 // Detector configuration (DCS Archive DB settings)
291 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL, "(objectClass=AliShuttleDetector)");
293 AliError(Form("Can't find configuration with base DN: %s", basedn));
298 while ((anEntry = aResult->GetNext())) {
299 AliShuttleConfigHolder* aHolder = new AliShuttleConfigHolder(anEntry);
302 if (!aHolder->IsValid()) {
303 AliError("Detector configuration error!");
309 TObjString* detStr = new TObjString(aHolder->GetDetector());
310 fDetectorMap.Add(detStr, aHolder);
311 fDetectorList.AddLast(detStr);
316 // Global configuration (DAQ logbook)
318 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
319 "(objectClass=AliShuttleGlobalConfig)");
321 AliError(Form("Can't find configuration with base DN: %s",
326 if (aResult->GetCount() == 0) {
327 AliError("Can't find DAQ logbook configuration!");
332 if (aResult->GetCount() > 1) {
333 AliError("More than one DAQ logbook configuration found!");
338 anEntry = aResult->GetNext();
340 anAttribute = anEntry->GetAttribute("DAQLogbookHost");
342 AliError("Can't find DAQLogbookHost attribute!");
343 delete anEntry; delete aResult;
346 fDAQlbHost = anAttribute->GetValue();
348 anAttribute = anEntry->GetAttribute("DAQLogbookPort"); // MAY
351 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
353 fDAQlbPort = 3306; // mysql
356 anAttribute = anEntry->GetAttribute("DAQLogbookUser");
358 AliError("Can't find DAQLogbookUser attribute!");
359 delete aResult; delete anEntry;
362 fDAQlbUser = anAttribute->GetValue();
364 anAttribute = anEntry->GetAttribute("DAQLogbookPassword");
366 AliError("Can't find DAQLogbookPassword attribute!");
367 delete aResult; delete anEntry;
370 fDAQlbPass = anAttribute->GetValue();
372 anAttribute = anEntry->GetAttribute("DAQLogbookDB");
374 AliError("Can't find DAQLogbookDB attribute!");
375 delete aResult; delete anEntry;
378 fDAQlbDB = anAttribute->GetValue();
380 anAttribute = anEntry->GetAttribute("DAQLogbookTable");
382 AliError("Can't find DAQLogbookTable attribute!");
383 delete aResult; delete anEntry;
386 fDAQlbTable = anAttribute->GetValue();
389 anAttribute = anEntry->GetAttribute("MaxRetries");
391 AliError("Can't find MaxRetries attribute!");
392 delete aResult; delete anEntry;
395 TString tmpStr = anAttribute->GetValue();
396 fMaxRetries = tmpStr.Atoi();
398 anAttribute = anEntry->GetAttribute("PPTimeOut");
400 AliError("Can't find PPTimeOut attribute!");
401 delete aResult; delete anEntry;
404 tmpStr = anAttribute->GetValue();
405 fPPTimeOut = tmpStr.Atoi();
407 delete aResult; delete anEntry;
409 // FXS configuration (FXS logbook and hosts)
411 for(int iSys=0;iSys<3;iSys++){
412 queryFilter = Form("(system=%s)", AliShuttleInterface::GetSystemName(iSys));
413 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL, queryFilter.Data());
415 AliError(Form("Can't find configuration for system: %s",
416 AliShuttleInterface::GetSystemName(iSys)));
420 if (aResult->GetCount() != 1 ) {
421 AliError("Error in FXS configuration!");
426 anEntry = aResult->GetNext();
428 anAttribute = anEntry->GetAttribute("DBHost");
430 AliError(Form ("Can't find DBHost attribute for %s!!",
431 AliShuttleInterface::GetSystemName(iSys)));
432 delete aResult; delete anEntry;
435 fFXSdbHost[iSys] = anAttribute->GetValue();
437 anAttribute = anEntry->GetAttribute("DBPort"); // MAY
440 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
442 fFXSdbPort[iSys] = 3306; // mysql
445 anAttribute = anEntry->GetAttribute("DBUser");
447 AliError(Form ("Can't find DBUser attribute for %s!!",
448 AliShuttleInterface::GetSystemName(iSys)));
449 delete aResult; delete anEntry;
452 fFXSdbUser[iSys] = anAttribute->GetValue();
454 anAttribute = anEntry->GetAttribute("DBPassword");
456 AliError(Form ("Can't find DBPassword attribute for %s!!",
457 AliShuttleInterface::GetSystemName(iSys)));
458 delete aResult; delete anEntry;
461 fFXSdbPass[iSys] = anAttribute->GetValue();
463 anAttribute = anEntry->GetAttribute("DBName");
465 AliError(Form ("Can't find DBName attribute for %s!!",
466 AliShuttleInterface::GetSystemName(iSys)));
467 delete aResult; delete anEntry;
471 fFXSdbName[iSys] = anAttribute->GetValue();
472 anAttribute = anEntry->GetAttribute("DBTable");
474 AliError(Form ("Can't find DBTable attribute for %s!!",
475 AliShuttleInterface::GetSystemName(iSys)));
476 delete aResult; delete anEntry;
479 fFXSdbTable[iSys] = anAttribute->GetValue();
481 anAttribute = anEntry->GetAttribute("FSHost");
483 AliError(Form ("Can't find FSHost attribute for %s!!",
484 AliShuttleInterface::GetSystemName(iSys)));
485 delete aResult; delete anEntry;
488 fFXSHost[iSys] = anAttribute->GetValue();
490 anAttribute = anEntry->GetAttribute("FSPort"); // MAY
493 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
495 fFXSPort[iSys] = 22; // scp port number
498 anAttribute = anEntry->GetAttribute("FSUser");
500 AliError(Form ("Can't find FSUser attribute for %s!!",
501 AliShuttleInterface::GetSystemName(iSys)));
502 delete aResult; delete anEntry;
505 fFXSUser[iSys] = anAttribute->GetValue();
507 anAttribute = anEntry->GetAttribute("FSPassword");
508 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
510 delete aResult; delete anEntry;
516 //______________________________________________________________________________________________
517 AliShuttleConfig::~AliShuttleConfig()
521 fDetectorMap.DeleteAll();
522 fDetectorList.Clear();
523 fProcessedDetectors.Delete();
526 //______________________________________________________________________________________________
527 const TObjArray* AliShuttleConfig::GetDetectors() const
530 // returns collection of TObjString which contains the name
531 // of every detector which is in the configuration.
534 return &fDetectorList;
537 //______________________________________________________________________________________________
538 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
541 // checks for paricular detector in the configuration.
543 return fDetectorMap.GetValue(detector) != NULL;
546 //______________________________________________________________________________________________
547 const char* AliShuttleConfig::GetDCSHost(const char* detector) const
550 // returns DCS server host used by particular detector
553 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
555 AliError(Form("There isn't configuration for detector: %s",
560 return aHolder->GetDCSHost();
563 //______________________________________________________________________________________________
564 Int_t AliShuttleConfig::GetDCSPort(const char* detector) const
567 // returns DCS server port used by particular detector
571 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
573 AliError(Form("There isn't configuration for detector: %s",
578 return aHolder->GetDCSPort();
581 //______________________________________________________________________________________________
582 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector) const
585 // returns collection of TObjString which represents the set of aliases
586 // which used for data retrieval for particular detector
589 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
591 AliError(Form("There isn't configuration for detector: %s",
596 return aHolder->GetDCSAliases();
599 //______________________________________________________________________________________________
600 const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector) const
603 // returns collection of TObjString which represents the set of aliases
604 // which used for data retrieval for particular detector
607 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
609 AliError(Form("There isn't configuration for detector: %s",
614 return aHolder->GetDCSDataPoints();
617 //______________________________________________________________________________________________
618 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
620 // return TRUE if detector is handled by host or if fProcessAll is TRUE
622 if(fProcessAll) return kTRUE;
623 TIter iter(&fProcessedDetectors);
625 while((detName = (TObjString*) iter.Next())){
626 if(detName->String() == detector) return kTRUE;
631 //______________________________________________________________________________________________
632 Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
634 // return TRUE if detector wants strict run ordering of stored data
636 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
639 AliError(Form("There isn't configuration for detector: %s",
644 return aHolder->StrictRunOrder();
647 //______________________________________________________________________________________________
648 void AliShuttleConfig::Print(Option_t* /*option*/) const
650 // print configuration
655 result += Form("\nShuttle running on %s \n\n", fShuttleInstanceHost.Data());
658 result += Form("All detectors will be processed! \n\n");
660 result += "Detectors processed by this host: ";
661 TIter it(&fProcessedDetectors);
663 while ((aDet = (TObjString*) it.Next())) {
664 result += Form("%s ", aDet->String().Data());
669 result += Form("PP time out = %d - Max total retries = %d\n\n", fPPTimeOut, fMaxRetries);
671 result += Form("DAQ Logbook Configuration \n \tHost: %s:%d; \tUser: %s; ",
672 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
674 // result += "Password: ";
675 // result.Append('*', fDAQlbPass.Length());
676 result += Form("\tDB: %s; \tTable: %s",
677 fDAQlbDB.Data(), fDAQlbTable.Data());
681 for(int iSys=0;iSys<3;iSys++){
682 result += Form("FXS Configuration for %s system\n", AliShuttleInterface::GetSystemName(iSys));
683 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
684 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
685 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
686 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
687 result += Form("\tFXS host: %s:%d; \tUser: %s\n\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
688 fFXSUser[iSys].Data());
689 // result += Form("FXS Password:",fFXSPass[iSys].Data());
692 TIter iter(fDetectorMap.GetTable());
694 while ((aPair = (TPair*) iter.Next())) {
695 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) aPair->Value();
696 result += Form("Detector-specific configuration: *** %s *** \n", aHolder->GetDetector());
697 result += Form("\tStrict run ordering flag: %s \n", aHolder->StrictRunOrder() ? "TRUE" : "FALSE");
698 if(aHolder->SkipDCSQuery())
703 result += Form("\tAmanda server: %s:%d \n", aHolder->GetDCSHost(), aHolder->GetDCSPort());
705 const TObjArray* aliases = aHolder->GetDCSAliases();
706 if (aliases->GetEntries() != 0)
708 result += "\tDCS Aliases: ";
711 while ((anAlias = (TObjString*) it.Next()))
713 result += Form("%s ", anAlias->String().Data());
719 const TObjArray* dataPoints = aHolder->GetDCSDataPoints();
720 if (dataPoints->GetEntries() != 0)
722 result += "\tDCS Data Points: ";
723 TIter it(dataPoints);
724 TObjString* aDataPoint;
725 while ((aDataPoint = (TObjString*) it.Next())) {
726 result += Form("%s ", aDataPoint->String().Data());
734 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";