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.7 2006/07/20 09:54:40 jgrosseo
19 introducing status management: The processing per subdetector is divided into several steps,
20 after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
21 can keep track of the number of failures and skips further processing after a certain threshold is
22 exceeded. These thresholds can be configured in LDAP.
24 Revision 1.6 2006/07/19 10:09:55 jgrosseo
25 new configuration, accesst to DAQ FES (Alberto)
27 Revision 1.5 2006/07/10 13:01:41 jgrosseo
28 enhanced storing of last sucessfully processed run (alberto)
30 Revision 1.4 2006/06/12 09:11:16 jgrosseo
31 coding conventions (Alberto)
33 Revision 1.3 2006/06/06 14:26:40 jgrosseo
34 o) removed files that were moved to STEER
35 o) shuttle updated to follow the new interface (Alberto)
37 Revision 1.7 2006/05/12 09:07:16 colla
39 New configuration complete
41 Revision 1.2 2006/03/07 07:52:34 hristov
42 New version (B.Yordanov)
44 Revision 1.4 2005/11/19 14:20:31 byordano
45 logbook config added to AliShuttleConfig
47 Revision 1.3 2005/11/17 19:24:25 byordano
48 TList changed to TObjArray in AliShuttleConfig
50 Revision 1.2 2005/11/17 14:43:23 byordano
53 Revision 1.1.1.1 2005/10/28 07:33:58 hristov
54 Initial import as subdirectory in AliRoot
56 Revision 1.1.1.1 2005/09/12 22:11:40 byordano
59 Revision 1.3 2005/08/30 09:13:02 byordano
66 // This class keeps the AliShuttle configuration.
67 // It reads the configuration for LDAP server.
68 // For every child entry in basedn which has schema type 'shuttleConfig'
69 // it creates a detector configuration. This configuration includes:
70 // DCS server host and port and the set of aliases for which data from
71 // will be retrieved (used by AliShuttle).
75 #include "AliShuttleConfig.h"
76 #include "AliShuttleInterface.h"
81 #include <TObjString.h>
82 #include <TLDAPResult.h>
83 #include <TLDAPEntry.h>
84 #include <TLDAPAttribute.h>
87 AliShuttleConfig::AliShuttleConfigHolder::AliShuttleConfigHolder(const TLDAPEntry* entry):
95 // constructor of the shuttle configuration holder
97 TLDAPAttribute* anAttribute;
99 anAttribute = entry->GetAttribute("det"); // MUST
100 fDetector = anAttribute->GetValue();
102 anAttribute = entry->GetAttribute("DCSHost"); // MAY
105 Form("%s has not DCS host entry - Shuttle will skip DCS data query!",
108 fSkipDCSQuery = kTRUE;
112 fDCSHost = anAttribute->GetValue();
114 anAttribute = entry->GetAttribute("DCSPort"); // MAY
116 AliError(Form("Invalid configuration! %s has DCS Host but no port number!",
120 TString portStr = anAttribute->GetValue();
121 fDCSPort = portStr.Atoi();
123 anAttribute = entry->GetAttribute("DCSAlias"); // MAY
125 AliError(Form("Invalid configuration! %s has DCS host settings but no DCSAlias entries!",
131 while ((anAlias = anAttribute->GetValue())) {
132 fDCSAliases.AddLast(new TObjString(anAlias));
140 //______________________________________________________________________________________________
141 AliShuttleConfig::AliShuttleConfigHolder::~AliShuttleConfigHolder()
143 // destructor of the shuttle configuration holder
145 fDCSAliases.Delete();
148 ClassImp(AliShuttleConfig)
150 //______________________________________________________________________________________________
151 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
152 const char* binddn, const char* password, const char* basedn):
154 fDAQlbHost(""), fDAQlbUser(""), fDAQlbPass(""),
155 fMaxPPRetries(0), fMaxRetries(0),
156 fDetectorMap(), fDetectorList(),
157 fShuttleInstanceHost(""), fProcessedDetectors(),
161 // host: ldap server host
162 // port: ldap server port
163 // binddn: binddn used for ldap binding (simple bind is used!).
164 // password: password for binddn
165 // basedn: this is basedn whose childeren entries which have
166 // (objectClass=shuttleConfig) will be used as detector configurations.
169 TLDAPServer aServer(host, port, binddn, password, 3);
171 if (!aServer.IsConnected()) {
172 AliError(Form("Can't connect to ldap server %s:%d",
177 // reads configuration for the shuttle running on this machine
179 fShuttleInstanceHost = gSystem->HostName();
180 TString queryFilter = "(ShuttleHost=";
181 queryFilter += fShuttleInstanceHost;
184 TLDAPResult* aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
188 AliError(Form("Can't find configuration with base DN: %s",
193 if (aResult->GetCount() == 0) {
194 AliError(Form("No Shuttle instance for host = %s!",
195 fShuttleInstanceHost.Data()));
196 AliError(Form("All detectors will be processed."));
200 if (aResult->GetCount() > 1) {
201 AliError(Form("More than one Shuttle instance for host %s!",
202 fShuttleInstanceHost.Data()));
207 TLDAPAttribute* anAttribute;
210 anEntry = aResult->GetNext();
211 anAttribute = anEntry->GetAttribute("detectors");
213 while((detName = anAttribute->GetValue())){
214 TObjString *objDet= new TObjString(detName);
215 fProcessedDetectors.Add(objDet);
219 // Detector configuration (DCS Archive DB settings)
221 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
222 "(objectClass=AliShuttleDetector)");
224 AliError(Form("Can't find configuration with base DN: %s",
230 while ((anEntry = aResult->GetNext())) {
231 AliShuttleConfigHolder* aHolder = new AliShuttleConfigHolder(anEntry);
234 if (!aHolder->IsValid()) {
235 AliError("Detector configuration error!");
240 TObjString* detStr = new TObjString(aHolder->GetDetector());
241 fDetectorMap.Add(detStr, aHolder);
242 fDetectorList.AddLast(detStr);
247 // Global configuration (DAQ logbook)
249 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
250 "(objectClass=AliShuttleGlobalConfig)");
252 AliError(Form("Can't find configuration with base DN: %s",
257 if (aResult->GetCount() == 0) {
258 AliError("Can't find DAQ logbook configuration!");
262 if (aResult->GetCount() > 1) {
263 AliError("More than one DAQ logbook configuration found!");
267 anEntry = aResult->GetNext();
269 anAttribute = anEntry->GetAttribute("DAQLogbookHost");
271 AliError("Can't find DAQLogbookHost attribute!");
274 fDAQlbHost = anAttribute->GetValue();
276 anAttribute = anEntry->GetAttribute("DAQLogbookUser");
278 AliError("Can't find DAQLogbookUser attribute!");
281 fDAQlbUser = anAttribute->GetValue();
283 anAttribute = anEntry->GetAttribute("DAQLogbookPassword");
285 AliError("Can't find DAQLogbookPassword attribute!");
288 fDAQlbPass = anAttribute->GetValue();
290 anAttribute = anEntry->GetAttribute("MaxPPRetries");
292 AliError("Can't find MaxPPRetries attribute!");
295 TString tmpStr = anAttribute->GetValue();
296 fMaxPPRetries = tmpStr.Atoi();
298 anAttribute = anEntry->GetAttribute("MaxRetries");
300 AliError("Can't find MaxRetries attribute!");
303 tmpStr = anAttribute->GetValue();
304 fMaxRetries = tmpStr.Atoi();
309 // FES configuration (FES logbook and hosts)
312 for(int iSys=0;iSys<3;iSys++){
313 queryFilter = Form("(system=%s)", AliShuttleInterface::fkSystemNames[iSys]);
314 aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL, queryFilter.Data());
316 AliError(Form("Can't find configuration for system: %s",
317 AliShuttleInterface::fkSystemNames[iSys]));
321 if (aResult->GetCount() != 1 ) {
322 AliError("Error in FES configuration!");
326 anEntry = aResult->GetNext();
328 anAttribute = anEntry->GetAttribute("LogbookHost");
330 AliError(Form ("Can't find LogbookHost attribute for %s!!",
331 AliShuttleInterface::fkSystemNames[iSys]));
334 fFESlbHost[iSys] = anAttribute->GetValue();
336 anAttribute = anEntry->GetAttribute("LogbookUser");
338 AliError(Form ("Can't find LogbookUser attribute for %s!!",
339 AliShuttleInterface::fkSystemNames[iSys]));
342 fFESlbUser[iSys] = anAttribute->GetValue();
344 anAttribute = anEntry->GetAttribute("LogbookPassword");
346 AliError(Form ("Can't find LogbookPassword attribute for %s!!",
347 AliShuttleInterface::fkSystemNames[iSys]));
350 fFESlbPass[iSys] = anAttribute->GetValue();
352 anAttribute = anEntry->GetAttribute("FSHost");
354 AliError(Form ("Can't find FSHost attribute for %s!!",
355 AliShuttleInterface::fkSystemNames[iSys]));
358 fFESHost[iSys] = anAttribute->GetValue();
360 anAttribute = anEntry->GetAttribute("FSUser");
362 AliError(Form ("Can't find FSUser attribute for %s!!",
363 AliShuttleInterface::fkSystemNames[iSys]));
366 fFESUser[iSys] = anAttribute->GetValue();
368 anAttribute = anEntry->GetAttribute("FSPassword");
369 if (anAttribute) fFESPass[iSys] = anAttribute->GetValue();
378 //______________________________________________________________________________________________
379 AliShuttleConfig::~AliShuttleConfig()
383 fDetectorMap.DeleteAll();
386 //______________________________________________________________________________________________
387 const TObjArray* AliShuttleConfig::GetDetectors() const
390 // returns collection of TObjString which contains the name
391 // of every detector which is in the configuration.
394 return &fDetectorList;
397 //______________________________________________________________________________________________
398 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
401 // checks for paricular detector in the configuration.
403 return fDetectorMap.GetValue(detector) != NULL;
406 //______________________________________________________________________________________________
407 const char* AliShuttleConfig::GetDCSHost(const char* detector) const
410 // returns DCS server host used by particular detector
413 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
415 AliError(Form("There isn't configuration for detector: %s",
420 return aHolder->GetDCSHost();
423 //______________________________________________________________________________________________
424 Int_t AliShuttleConfig::GetDCSPort(const char* detector) const
427 // returns DCS server port used by particular detector
431 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
433 AliError(Form("There isn't configuration for detector: %s",
438 return aHolder->GetDCSPort();
441 //______________________________________________________________________________________________
442 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector) const
445 // returns collection of TObjString which represents the set of aliases
446 // which used for data retrieval for particular detector
449 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
451 AliError(Form("There isn't configuration for detector: %s",
456 return aHolder->GetDCSAliases();
459 //______________________________________________________________________________________________
460 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
462 // return TRUE if detector is handled by host or if fProcessAll is TRUE
464 if(fProcessAll) return kTRUE;
465 TIter iter(&fProcessedDetectors);
467 while((detName = (TObjString*) iter.Next())){
468 if(detName->String() == detector) return kTRUE;
473 //______________________________________________________________________________________________
474 void AliShuttleConfig::Print(Option_t* /*option*/) const
476 // print configuration
481 result += Form("\nShuttle running on %s \n\n", fShuttleInstanceHost.Data());
484 result += Form("All detectors will be processed! \n\n");
486 result += "Detectors processed by this host: ";
487 TIter it(&fProcessedDetectors);
489 while ((aDet = (TObjString*) it.Next())) {
490 result += Form("%s ", aDet->String().Data());
495 result += Form("DAQ Logbook Configuration \n \tHost: %s - User: %s - ",
496 fDAQlbHost.Data(), fDAQlbUser.Data());
498 result += "Password: ";
499 result.Append('*', fDAQlbPass.Length());
502 for(int iSys=0;iSys<3;iSys++){
503 result += Form("FES Configuration for %s system\n", AliShuttleInterface::fkSystemNames[iSys]);
504 result += Form("\tLogbook host: \t%s - \tUser: %s\n",
505 fFESlbHost[iSys].Data(), fFESlbUser[iSys].Data());
506 // result += Form("Logbook Password:",fFESlbPass[iSys].Data());
507 result += Form("\tFES host: \t%s - \tUser: %s\n\n", fFESHost[iSys].Data(), fFESUser[iSys].Data());
508 // result += Form("FES Password:",fFESPass[iSys].Data());
511 TIter iter(fDetectorMap.GetTable());
513 while ((aPair = (TPair*) iter.Next())) {
514 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) aPair->Value();
515 if(aHolder->SkipDCSQuery()) continue;
516 result += Form("DCS archive DB configuration for *** %s *** \n", aHolder->GetDetector());
517 result += Form("\tAmanda server: %s:%d \n", aHolder->GetDCSHost(), aHolder->GetDCSPort());
519 result += "\tDCS Aliases: ";
520 const TObjArray* aliases = aHolder->GetDCSAliases();
523 while ((anAlias = (TObjString*) it.Next())) {
524 result += Form("%s ", anAlias->String().Data());
531 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";