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.27 2007/12/17 03:23:32 jgrosseo
20 added "empty preprocessor" as placeholder for Acorde in FDR
22 Revision 1.26 2007/12/07 19:14:36 acolla
25 Added automatic collection of new runs on a regular time basis (settable from the configuration)
27 in AliShuttleConfig: new members
29 - triggerWait: time to wait for DIM trigger (s) before starting automatic collection of new runs
30 - mode: run mode (test, prod) -> used to build log folder (logs or logs_PROD)
34 - logs now stored in logs/#RUN/DET_#RUN.log
36 Revision 1.25 2007/11/26 16:58:37 acolla
37 Monalisa configuration added: host and table name
39 Revision 1.24 2007/10/24 10:44:08 acolla
43 Revision 1.23 2007/09/28 15:27:40 acolla
45 AliDCSClient "multiSplit" option added in the DCS configuration
46 in AliDCSMessage: variable MAX_BODY_SIZE set to 500000
48 Revision 1.22 2007/09/27 16:53:13 acolla
49 Detectors can have more than one AMANDA server. SHUTTLE queries the servers sequentially,
50 merges the dcs aliases/DPs in one TMap and sends it to the preprocessor.
52 Revision 1.21 2007/04/27 07:06:48 jgrosseo
53 GetFileSources returns empty list in case of no files, but successful query
54 No mails sent in testmode
56 Revision 1.20 2007/04/04 10:33:36 jgrosseo
57 1) Storing of files to the Grid is now done _after_ your preprocessors succeeded. This is transparent, which means that you can still use the same functions (Store, StoreReferenceData) to store files to the Grid. However, the Shuttle first stores them locally and transfers them after the preprocessor finished. The return code of these two functions has changed from UInt_t to Bool_t which gives you the success of the storing.
58 In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
60 2) The meaning of the return code of the preprocessor has changed. 0 is now success and any other value means failure. This value is stored in the log and you can use it to keep details about the error condition.
62 3) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
64 4) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
66 5) New function AliPreprocessor::ProcessDCS(). If you do not need to have DCS data in all cases, you can skip the processing by implemting this function and returning kFALSE under certain conditions. E.g. if there is a certain run type.
67 If you always need DCS data (like before), you do not need to implement it.
69 6) The run type has been added to the monitoring page
71 Revision 1.19 2007/02/28 10:41:56 acolla
72 Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
73 AliPreprocessor::GetRunType() function.
74 Added some ldap definition files.
76 Revision 1.18 2007/01/23 19:20:03 acolla
77 Removed old ldif files, added TOF, MCH ldif files. Added some options in
78 AliShuttleConfig::Print. Added in Ali Shuttle: SetShuttleTempDir and
81 Revision 1.17 2007/01/18 11:17:47 jgrosseo
82 changing spaces to tabs ;-)
84 Revision 1.16 2007/01/18 11:10:35 jgrosseo
85 adding the possibility of defining DCS alias and data points with patterns
86 first pattern introduced: [N..M] to add all names between the two digits, this works also recursively.
88 Revision 1.15 2007/01/15 18:27:11 acolla
89 implementation of sending mail to subdetector expert in case the preprocessor fails.
90 shuttle.schema updated with expert's email entry
92 Revision 1.13 2006/12/07 08:51:26 jgrosseo
94 table, db names in ldap configuration
95 added GRP preprocessor
96 DCS data can also be retrieved by data point
98 Revision 1.12 2006/11/16 16:16:48 jgrosseo
99 introducing strict run ordering flag
100 removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
102 Revision 1.11 2006/11/06 14:23:04 jgrosseo
103 major update (Alberto)
104 o) reading of run parameters from the logbook
105 o) online offline naming conversion
106 o) standalone DCSclient package
108 Revision 1.10 2006/10/20 15:22:59 jgrosseo
109 o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
110 o) Merging Collect, CollectAll, CollectNew function
111 o) Removing implementation of empty copy constructors (declaration still there!)
113 Revision 1.9 2006/10/02 16:38:39 jgrosseo
116 storing of objects that failed to be stored to the grid before
117 interfacing of shuttle status table in daq system
119 Revision 1.8 2006/08/15 10:50:00 jgrosseo
120 effc++ corrections (alberto)
122 Revision 1.7 2006/07/20 09:54:40 jgrosseo
123 introducing status management: The processing per subdetector is divided into several steps,
124 after each step the status is stored on disk. If the system crashes in any of the steps the Shuttle
125 can keep track of the number of failures and skips further processing after a certain threshold is
126 exceeded. These thresholds can be configured in LDAP.
128 Revision 1.6 2006/07/19 10:09:55 jgrosseo
129 new configuration, accesst to DAQ FES (Alberto)
131 Revision 1.5 2006/07/10 13:01:41 jgrosseo
132 enhanced storing of last sucessfully processed run (alberto)
134 Revision 1.4 2006/06/12 09:11:16 jgrosseo
135 coding conventions (Alberto)
137 Revision 1.3 2006/06/06 14:26:40 jgrosseo
138 o) removed files that were moved to STEER
139 o) shuttle updated to follow the new interface (Alberto)
141 Revision 1.7 2006/05/12 09:07:16 colla
143 New configuration complete
145 Revision 1.2 2006/03/07 07:52:34 hristov
146 New version (B.Yordanov)
148 Revision 1.4 2005/11/19 14:20:31 byordano
149 logbook config added to AliShuttleConfig
151 Revision 1.3 2005/11/17 19:24:25 byordano
152 TList changed to TObjArray in AliShuttleConfig
154 Revision 1.2 2005/11/17 14:43:23 byordano
157 Revision 1.1.1.1 2005/10/28 07:33:58 hristov
158 Initial import as subdirectory in AliRoot
160 Revision 1.1.1.1 2005/09/12 22:11:40 byordano
163 Revision 1.3 2005/08/30 09:13:02 byordano
170 // This class keeps the AliShuttle configuration.
171 // It reads the configuration for LDAP server.
172 // For every child entry in basedn which has schema type 'shuttleConfig'
173 // it creates a detector configuration. This configuration includes:
174 // DCS server host and port and the set of aliases for which data from
175 // will be retrieved (used by AliShuttle).
178 #include <Riostream.h>
179 #include "AliShuttleConfig.h"
180 #include "AliShuttleInterface.h"
185 #include <TObjString.h>
186 #include <TLDAPResult.h>
187 #include <TLDAPEntry.h>
188 #include <TLDAPAttribute.h>
192 AliShuttleConfig::AliShuttleDCSConfigHolder::AliShuttleDCSConfigHolder(const TLDAPEntry* entry):
199 fDCSDataPointsComp(0),
202 // constructor of the shuttle DCS configuration holder
204 TLDAPAttribute* anAttribute;
205 fDCSAliases = new TObjArray();
206 fDCSAliases->SetOwner(1);
207 fDCSDataPoints = new TObjArray();
208 fDCSDataPoints->SetOwner(1);
209 fDCSAliasesComp = new TObjArray();
210 fDCSAliasesComp->SetOwner(1);
211 fDCSDataPointsComp = new TObjArray();
212 fDCSDataPointsComp->SetOwner(1);
215 anAttribute = entry->GetAttribute("dcsHost");
218 AliError("Unexpected: no DCS host!");
222 fDCSHost = anAttribute->GetValue();
224 anAttribute = entry->GetAttribute("dcsPort");
227 AliError("Unexpected: no DCS port!");
230 TString portStr = anAttribute->GetValue();
231 fDCSPort = portStr.Atoi();
233 anAttribute = entry->GetAttribute("multiSplit"); // MAY
236 TString multiSplitStr = anAttribute->GetValue();
237 fMultiSplit = multiSplitStr.Atoi();
238 if(fMultiSplit == 0) {
239 AliError("MultiSplit must be a positive integer!");
245 anAttribute = entry->GetAttribute("dcsAlias"); // MAY
249 while ((anAlias = anAttribute->GetValue()))
251 fDCSAliasesComp->AddLast(new TObjString(anAlias));
252 ExpandAndAdd(fDCSAliases, anAlias);
256 anAttribute = entry->GetAttribute("dcsDP"); // MAY
259 const char* aDataPoint;
260 while ((aDataPoint = anAttribute->GetValue()))
262 fDCSDataPointsComp->AddLast(new TObjString(aDataPoint));
263 ExpandAndAdd(fDCSDataPoints, aDataPoint);
269 //______________________________________________________________________________________________
270 void AliShuttleConfig::AliShuttleDCSConfigHolder::ExpandAndAdd(TObjArray* target, const char* entry)
273 // adds <entry> to <target> applying expanding of the name
274 // [N..M] creates M-N+1 names with the corresponding digits
277 TString entryStr(entry);
279 Int_t begin = entryStr.Index("[");
280 Int_t end = entryStr.Index("]");
281 if (begin != -1 && end != -1 && end > begin)
283 TString before(entryStr(0, begin));
284 TString after(entryStr(end+1, entryStr.Length()));
286 AliDebug(2, Form("Found [] pattern. Splitted input string %s %s", before.Data(), after.Data()));
288 Int_t dotdot = entryStr.Index("..");
290 TString nStr(entryStr(begin+1, dotdot-begin-1));
291 TString mStr(entryStr(dotdot+2, end-dotdot-2));
293 AliDebug(2, Form("Found [N..M] pattern. %s %s", nStr.Data(), mStr.Data()));
295 if (nStr.IsDigit() && mStr.IsDigit())
297 Int_t n = nStr.Atoi();
298 Int_t m = mStr.Atoi();
300 Int_t nDigits = nStr.Length();
302 formatStr.Form("%%s%%0%dd%%s", nDigits);
304 AliDebug(2, Form("Format string is %s", formatStr.Data()));
306 for (Int_t current = n; current<=m; ++current)
309 newEntry.Form(formatStr.Data(), before.Data(), current, after.Data());
311 AliDebug(2, Form("Calling recursive with %s", newEntry.Data()));
314 ExpandAndAdd(target, newEntry);
317 // return here because we processed the entries already recursively.
322 AliDebug(2, Form("Adding name %s", entry));
323 target->AddLast(new TObjString(entry));
326 //______________________________________________________________________________________________
327 AliShuttleConfig::AliShuttleDCSConfigHolder::~AliShuttleDCSConfigHolder()
329 // destructor of the shuttle configuration holder
332 delete fDCSDataPoints;
333 delete fDCSAliasesComp;
334 delete fDCSDataPointsComp;
337 //______________________________________________________________________________________________
338 AliShuttleConfig::AliShuttleDetConfigHolder::AliShuttleDetConfigHolder(const TLDAPEntry* entry):
343 fSkipDCSQuery(kFALSE),
344 fStrictRunOrder(kFALSE)
346 // constructor of the shuttle configuration holder
348 TLDAPAttribute* anAttribute;
350 fResponsibles = new TObjArray();
351 fResponsibles->SetOwner(1);
352 fDCSConfig = new TObjArray();
353 fDCSConfig->SetOwner(1);
355 anAttribute = entry->GetAttribute("det"); // MUST
358 AliError(Form("No \"det\" attribute!"));
361 fDetector = anAttribute->GetValue();
363 anAttribute = entry->GetAttribute("strictRunOrder"); // MAY
366 AliWarning(Form("%s did not set strictRunOrder flag - the default is FALSE",
369 TString strictRunStr = anAttribute->GetValue();
370 if (!(strictRunStr == "0" || strictRunStr == "1"))
372 AliError("strictRunOrder flag must be 0 or 1!");
375 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
378 anAttribute = entry->GetAttribute("responsible"); // MAY
381 AliDebug(2, "Warning! No \"responsible\" attribute!");
385 const char* aResponsible;
386 while ((aResponsible = anAttribute->GetValue()))
388 fResponsibles->AddLast(new TObjString(aResponsible));
395 //______________________________________________________________________________________________
396 AliShuttleConfig::AliShuttleDetConfigHolder::~AliShuttleDetConfigHolder()
398 // destructor of the shuttle configuration holder
400 delete fResponsibles;
404 //______________________________________________________________________________________________
405 const char* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSHost(Int_t iServ) const
408 // returns DCS server host
411 if (iServ < 0 || iServ >= GetNServers()) return 0;
413 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
414 (fDCSConfig->At(iServ));
416 return aHolder->GetDCSHost();
419 //______________________________________________________________________________________________
420 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSPort(Int_t iServ) const
423 // returns DCS server port
426 if (iServ < 0 || iServ >= GetNServers()) return 0;
428 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
429 (fDCSConfig->At(iServ));
431 return aHolder->GetDCSPort();
434 //______________________________________________________________________________________________
435 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetMultiSplit(Int_t iServ) const
438 // returns DCS "multi split" value
441 if (iServ < 0 || iServ >= GetNServers()) return 0;
443 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
444 (fDCSConfig->At(iServ));
446 return aHolder->GetMultiSplit();
449 //______________________________________________________________________________________________
450 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSAliases(Int_t iServ) const
453 // returns collection of TObjString which represents the set of aliases
454 // which used for data retrieval for particular detector
457 if (iServ < 0 || iServ >= GetNServers()) return 0;
459 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
460 (fDCSConfig->At(iServ));
462 return aHolder->GetDCSAliases();
465 //______________________________________________________________________________________________
466 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSDataPoints(Int_t iServ) const
469 // returns collection of TObjString which represents the set of aliases
470 // which used for data retrieval for particular detector
473 if (iServ < 0 || iServ >= GetNServers()) return 0;
475 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
476 (fDCSConfig->At(iServ));
478 return aHolder->GetDCSDataPoints();
481 //______________________________________________________________________________________________
482 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSAliases(Int_t iServ) const
485 // returns collection of TObjString which represents the set of aliases
486 // which used for data retrieval for particular detector (Compact style)
489 if (iServ < 0 || iServ >= GetNServers()) return 0;
491 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
492 (fDCSConfig->At(iServ));
494 return aHolder->GetCompactDCSAliases();
497 //______________________________________________________________________________________________
498 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSDataPoints(Int_t iServ) const
501 // returns collection of TObjString which represents the set of aliases
502 // which used for data retrieval for particular detector (Compact style)
505 if (iServ < 0 || iServ >= GetNServers()) return 0;
507 AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *>
508 (fDCSConfig->At(iServ));
510 return aHolder->GetCompactDCSDataPoints();
513 //______________________________________________________________________________________________
514 void AliShuttleConfig::AliShuttleDetConfigHolder::AddDCSConfig(AliShuttleDCSConfigHolder* holder)
517 // adds a DCS configuration set in the array of DCS configurations
521 fDCSConfig->AddLast(holder);
524 ClassImp(AliShuttleConfig)
526 //______________________________________________________________________________________________
527 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
528 const char* binddn, const char* password, const char* basedn):
550 fShuttleFileSystem("/"),
551 fFreeDiskWarningThreshold(20),
552 fFreeDiskFatalThreshold(10),
557 fShuttleInstanceHost(""),
558 fProcessedDetectors(),
560 fKeepTempFolder(kFALSE),
567 // host: ldap server host
568 // port: ldap server port
569 // binddn: binddn used for ldap binding (simple bind is used!).
570 // password: password for binddn
571 // basedn: this is basedn whose childeren entries which have
574 fDetectorMap.SetOwner(1);
575 fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
576 fProcessedDetectors.SetOwner();
578 for (int i=0; i<5; i++)
580 fAdmin[i] = new TObjArray();
581 fAdmin[i]->SetOwner();
584 TLDAPServer aServer(host, port, binddn, password, 3);
586 if (!aServer.IsConnected()) {
587 AliError(Form("Can't connect to ldap server %s:%d",
592 // reads configuration for the shuttle running on this machine
594 TLDAPResult* aResult = 0;
595 TLDAPEntry* anEntry = 0;
602 globalList.SetOwner(1);
606 hostList.SetOwner(1);
608 aResult = aServer.Search(basedn, LDAP_SCOPE_SUBTREE, 0, 0);
612 AliError(Form("Can't find configuration with base DN: %s !", basedn));
616 while ((anEntry = aResult->GetNext()))
618 TString dn = anEntry->GetDn();
620 if (dn.BeginsWith("dcsHost="))
622 dcsList.Add(anEntry);
624 else if (dn.BeginsWith("det="))
626 detList.Add(anEntry);
628 else if (dn.BeginsWith("name=globalConfig"))
630 globalList.Add(anEntry);
632 else if (dn.BeginsWith("system="))
634 sysList.Add(anEntry);
636 else if (dn.BeginsWith("shuttleHost="))
638 hostList.Add(anEntry);
650 result += SetGlobalConfig(&globalList);
651 result += SetSysConfig(&sysList);
652 result += SetPasswords();
653 result += SetDetConfig(&detList,&dcsList);
654 result += SetHostConfig(&hostList);
658 AliError("Configuration is INVALID!");
666 //______________________________________________________________________________________________
667 AliShuttleConfig::~AliShuttleConfig()
671 fDetectorMap.DeleteAll();
672 fDetectorList.Clear();
673 fProcessedDetectors.Delete();
676 //______________________________________________________________________________________________
677 const TObjArray* AliShuttleConfig::GetDetectors() const
680 // returns collection of TObjString which contains the name
681 // of every detector which is in the configuration.
684 return &fDetectorList;
687 //______________________________________________________________________________________________
688 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
691 // checks for paricular detector in the configuration.
693 return fDetectorMap.GetValue(detector) != NULL;
696 //______________________________________________________________________________________________
697 Int_t AliShuttleConfig::GetNServers(const char* detector) const
700 // returns number of DCS servers for detector
703 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
705 AliError(Form("There isn't configuration for detector: %s",
710 return aHolder->GetNServers();
714 //______________________________________________________________________________________________
715 const char* AliShuttleConfig::GetDCSHost(const char* detector, Int_t iServ) const
718 // returns i-th DCS server host used by particular detector
721 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
723 AliError(Form("There isn't configuration for detector: %s",
728 return aHolder->GetDCSHost(iServ);
731 //______________________________________________________________________________________________
732 Int_t AliShuttleConfig::GetDCSPort(const char* detector, Int_t iServ) const
735 // returns i-th DCS server port used by particular detector
739 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
741 AliError(Form("There isn't configuration for detector: %s",
746 return aHolder->GetDCSPort(iServ);
749 //______________________________________________________________________________________________
750 Int_t AliShuttleConfig::GetMultiSplit(const char* detector, Int_t iServ) const
753 // returns i-th DCS "multi split" value
757 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
759 AliError(Form("There isn't configuration for detector: %s",
764 return aHolder->GetMultiSplit(iServ);
767 //______________________________________________________________________________________________
768 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector, Int_t iServ) const
771 // returns collection of TObjString which represents the i-th set of aliases
772 // which used for data retrieval for particular detector
775 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
777 AliError(Form("There isn't configuration for detector: %s",
782 return aHolder->GetDCSAliases(iServ);
785 //______________________________________________________________________________________________
786 const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector, Int_t iServ) const
789 // returns collection of TObjString which represents the set of aliases
790 // which used for data retrieval for particular detector
793 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
795 AliError(Form("There isn't configuration for detector: %s",
800 return aHolder->GetDCSDataPoints(iServ);
803 //______________________________________________________________________________________________
804 const TObjArray* AliShuttleConfig::GetCompactDCSAliases(const char* detector, Int_t iServ) const
807 // returns collection of TObjString which represents the i-th set of aliases
808 // which used for data retrieval for particular detector (Compact style)
811 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
813 AliError(Form("There isn't configuration for detector: %s",
818 return aHolder->GetCompactDCSAliases(iServ);
821 //______________________________________________________________________________________________
822 const TObjArray* AliShuttleConfig::GetCompactDCSDataPoints(const char* detector, Int_t iServ) const
825 // returns collection of TObjString which represents the set of aliases
826 // which used for data retrieval for particular detector (Compact style)
829 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
831 AliError(Form("There isn't configuration for detector: %s",
836 return aHolder->GetCompactDCSDataPoints(iServ);
839 //______________________________________________________________________________________________
840 const TObjArray* AliShuttleConfig::GetResponsibles(const char* detector) const
843 // returns collection of TObjString which represents the list of mail addresses
844 // of the detector's responsible(s)
847 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
849 AliError(Form("There isn't configuration for detector: %s",
854 return aHolder->GetResponsibles();
857 //______________________________________________________________________________________________
858 const TObjArray* AliShuttleConfig::GetAdmins(Int_t sys) const
861 // returns collection of TObjString which represents the list of mail addresses
862 // of the system's administrator(s) (DAQ, DCS, HLT, Global, Amanda)
865 if (sys < 0 || sys > 4) return 0;
869 //______________________________________________________________________________________________
870 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
872 // return TRUE if detector is handled by host or if fProcessAll is TRUE
874 if(fProcessAll) return kTRUE;
875 TIter iter(&fProcessedDetectors);
877 while((detName = (TObjString*) iter.Next())){
878 if(detName->String() == detector) return kTRUE;
883 //______________________________________________________________________________________________
884 Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
886 // return TRUE if detector wants strict run ordering of stored data
888 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
891 AliError(Form("There isn't configuration for detector: %s",
896 return aHolder->StrictRunOrder();
899 //______________________________________________________________________________________________
900 UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
902 // Set the global configuration (DAQ Logbook + preprocessor monitoring settings)
905 TLDAPEntry* anEntry = 0;
906 TLDAPAttribute* anAttribute = 0;
908 if (list->GetEntries() == 0)
910 AliError("Global configuration not found!");
913 else if (list->GetEntries() > 1)
915 AliError("More than one global configuration found!");
919 anEntry = dynamic_cast<TLDAPEntry*> (list->At(0));
923 AliError("Unexpected! Global list does not contain a TLDAPEntry");
928 anAttribute = anEntry->GetAttribute("AlienPath");
930 AliError("Can't find AlienPath attribute!");
933 fAlienPath = anAttribute->GetValue();
935 anAttribute = anEntry->GetAttribute("daqLbHost");
937 AliError("Can't find daqLbHost attribute!");
940 fDAQlbHost = anAttribute->GetValue();
942 anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
945 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
947 fDAQlbPort = 3306; // mysql
950 anAttribute = anEntry->GetAttribute("daqLbUser");
952 AliError("Can't find daqLbUser attribute!");
955 fDAQlbUser = anAttribute->GetValue();
957 anAttribute = anEntry->GetAttribute("daqLbDB");
959 AliError("Can't find daqLbDB attribute!");
962 fDAQlbDB = anAttribute->GetValue();
964 anAttribute = anEntry->GetAttribute("daqLbTable");
966 AliError("Can't find daqLbTable attribute!");
969 fDAQlbTable = anAttribute->GetValue();
971 anAttribute = anEntry->GetAttribute("shuttleLbTable");
973 AliError("Can't find shuttleLbTable attribute!");
976 fShuttlelbTable = anAttribute->GetValue();
978 anAttribute = anEntry->GetAttribute("runTypeLbTable");
980 AliError("Can't find runTypeLbTable attribute!");
983 fRunTypelbTable = anAttribute->GetValue();
985 anAttribute = anEntry->GetAttribute("ppmaxRetries");
987 AliError("Can't find ppmaxRetries attribute!");
990 TString tmpStr = anAttribute->GetValue();
991 fMaxRetries = tmpStr.Atoi();
993 anAttribute = anEntry->GetAttribute("ppTimeOut");
995 AliError("Can't find ppTimeOut attribute!");
998 tmpStr = anAttribute->GetValue();
999 fPPTimeOut = tmpStr.Atoi();
1001 anAttribute = anEntry->GetAttribute("dcsTimeOut");
1003 AliError("Can't find dcsTimeOut attribute!");
1006 tmpStr = anAttribute->GetValue();
1007 fDCSTimeOut = tmpStr.Atoi();
1009 anAttribute = anEntry->GetAttribute("nDCSretries");
1011 AliError("Can't find dcsTimeOut attribute!");
1014 tmpStr = anAttribute->GetValue();
1015 fDCSRetries = tmpStr.Atoi();
1017 anAttribute = anEntry->GetAttribute("DCSQueryOffset");
1019 AliError("Can't find DCSQueryOffset attribute!");
1022 tmpStr = anAttribute->GetValue();
1023 fDCSQueryOffset = tmpStr.Atoi();
1025 anAttribute = anEntry->GetAttribute("DCSDelay");
1027 AliError("Can't find DCSDelay attribute!");
1030 tmpStr = anAttribute->GetValue();
1031 fDCSDelay = tmpStr.Atoi();
1033 anAttribute = anEntry->GetAttribute("ppMaxMem");
1035 AliError("Can't find ppMaxMem attribute!");
1038 tmpStr = anAttribute->GetValue();
1039 fPPMaxMem = tmpStr.Atoi();
1041 anAttribute = anEntry->GetAttribute("monitorHost");
1043 AliError("Can't find monitorHost attribute!");
1046 fMonitorHost = anAttribute->GetValue();
1048 anAttribute = anEntry->GetAttribute("monitorTable");
1050 AliError("Can't find monitorTable attribute!");
1053 fMonitorTable = anAttribute->GetValue();
1055 anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
1057 AliWarning(Form("triggerWait not set! default = %d", fTriggerWait));
1059 tmpStr = anAttribute->GetValue();
1060 fTriggerWait = tmpStr.Atoi();
1062 anAttribute = anEntry->GetAttribute("ShuttleFileSystem");
1064 AliWarning(Form("ShuttleFileSystem not set! default = %s", fShuttleFileSystem.Data()));
1066 fShuttleFileSystem = anAttribute->GetValue();
1068 anAttribute = anEntry->GetAttribute("FreeDiskWarningThreshold"); // MAY
1070 AliWarning(Form("FreeDiskWarningThreshold not set! default = %d", fFreeDiskWarningThreshold));
1072 tmpStr = anAttribute->GetValue();
1073 fFreeDiskWarningThreshold = tmpStr.Atoi();
1075 anAttribute = anEntry->GetAttribute("FreeDiskFatalThreshold"); // MAY
1077 AliWarning(Form("FreeDiskFatalThreshold not set! default = %d", fFreeDiskFatalThreshold));
1079 tmpStr = anAttribute->GetValue();
1080 fFreeDiskFatalThreshold = tmpStr.Atoi();
1082 anAttribute = anEntry->GetAttribute("mode");
1084 AliWarning("Run mode not set! Running in test mode.");
1086 tmpStr = anAttribute->GetValue();
1087 if (tmpStr == "test")
1090 } else if (tmpStr == "prod") {
1093 AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));
1094 AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
1098 anAttribute = anEntry->GetAttribute("keepDCSMap"); // MAY
1101 AliWarning("keepDCSMap flag not set - default is FALSE");
1103 TString keepDCSMapStr = anAttribute->GetValue();
1104 if (!(keepDCSMapStr == "0" || keepDCSMapStr == "1"))
1106 AliError("keepDCSMap flag must be 0 or 1!");
1109 fKeepDCSMap = (Bool_t) keepDCSMapStr.Atoi();
1112 anAttribute = anEntry->GetAttribute("keepTempFolder"); // MAY
1115 AliWarning("keepTempFolder flag not set - default is FALSE");
1117 TString keepTempFolderStr = anAttribute->GetValue();
1118 if (!(keepTempFolderStr == "0" || keepTempFolderStr == "1"))
1120 AliError("keepTempFolder flag must be 0 or 1!");
1123 fKeepTempFolder = (Bool_t) keepTempFolderStr.Atoi();
1127 anAttribute = anEntry->GetAttribute("shuttleAdmin"); // MAY
1130 AliDebug(2, "Warning! No \"shuttleAdmin\" attribute!");
1134 const char* anAdmin;
1135 while ((anAdmin = anAttribute->GetValue()))
1137 fAdmin[kGlobal]->AddLast(new TObjString(anAdmin));
1141 anAttribute = anEntry->GetAttribute("amandaAdmin"); // MAY
1144 AliDebug(2, "Warning! No \"amandaAdmin\" attribute!");
1148 const char* anAdmin;
1149 while ((anAdmin = anAttribute->GetValue()))
1151 fAdmin[kAmanda]->AddLast(new TObjString(anAdmin));
1155 anAttribute = anEntry->GetAttribute("sendMail"); // MAY
1158 AliWarning("sendMail flag not set - default is FALSE");
1160 TString sendMailStr = anAttribute->GetValue();
1161 if (!(sendMailStr == "0" || sendMailStr == "1"))
1163 AliError("sendMail flag must be 0 or 1!");
1166 fSendMail = (Bool_t) sendMailStr.Atoi();
1169 anAttribute = anEntry->GetAttribute("passwdFilePath");
1171 AliError("Can't find Passwords File Path attribute!");
1174 fPasswdFilePath = anAttribute->GetValue();
1179 //______________________________________________________________________________________________
1180 UInt_t AliShuttleConfig::SetSysConfig(TList* list)
1182 // Set the online FXS configuration (DAQ + DCS + HLT)
1185 TLDAPEntry* anEntry = 0;
1186 TLDAPAttribute* anAttribute = 0;
1188 if (list->GetEntries() != 3)
1190 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
1196 SystemCode iSys=kDAQ;
1198 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1200 anAttribute = anEntry->GetAttribute("system");
1201 TString sysName = anAttribute->GetValue();
1203 if (sysName == "DAQ")
1208 else if (sysName == "DCS")
1213 else if (sysName == "HLT")
1219 anAttribute = anEntry->GetAttribute("dbHost");
1221 AliError(Form ("Can't find dbHost attribute for %s!!",
1222 AliShuttleInterface::GetSystemName(iSys)));
1225 fFXSdbHost[iSys] = anAttribute->GetValue();
1227 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
1230 fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1232 fFXSdbPort[iSys] = 3306; // mysql
1235 anAttribute = anEntry->GetAttribute("dbUser");
1237 AliError(Form ("Can't find dbUser attribute for %s!!",
1238 AliShuttleInterface::GetSystemName(iSys)));
1241 fFXSdbUser[iSys] = anAttribute->GetValue();
1243 anAttribute = anEntry->GetAttribute("dbName");
1245 AliError(Form ("Can't find dbName attribute for %s!!",
1246 AliShuttleInterface::GetSystemName(iSys)));
1250 fFXSdbName[iSys] = anAttribute->GetValue();
1251 anAttribute = anEntry->GetAttribute("dbTable");
1253 AliError(Form ("Can't find dbTable attribute for %s!!",
1254 AliShuttleInterface::GetSystemName(iSys)));
1257 fFXSdbTable[iSys] = anAttribute->GetValue();
1259 anAttribute = anEntry->GetAttribute("fxsHost");
1261 AliError(Form ("Can't find fxsHost attribute for %s!!",
1262 AliShuttleInterface::GetSystemName(iSys)));
1265 fFXSHost[iSys] = anAttribute->GetValue();
1267 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1270 fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1272 fFXSPort[iSys] = 22; // scp port number
1275 anAttribute = anEntry->GetAttribute("fxsUser");
1277 AliError(Form ("Can't find fxsUser attribute for %s!!",
1278 AliShuttleInterface::GetSystemName(iSys)));
1281 fFXSUser[iSys] = anAttribute->GetValue();
1283 anAttribute = anEntry->GetAttribute("fxsPasswd");
1284 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1286 anAttribute = anEntry->GetAttribute("fxsBaseFolder");
1287 if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
1289 anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
1292 AliDebug(2, "Warning! No \"fxsAdmin\" attribute!");
1296 const char* anAdmin;
1297 while ((anAdmin = anAttribute->GetValue()))
1299 fAdmin[iSys]->AddLast(new TObjString(anAdmin));
1306 AliError(Form("Wrong system configuration! (code = %d)", count));
1313 //______________________________________________________________________________________________
1314 UInt_t AliShuttleConfig::SetPasswords(){
1316 AliInfo("Setting Passwords");
1318 // Retrieving Passwords for DAQ lb, DAQ/DCS/HLT FXS
1320 ifstream *inputfile = new ifstream(fPasswdFilePath.Data());
1322 AliError(Form("Error opening file %s !", fPasswdFilePath.Data()));
1331 while (line.ReadLine(*inputfile)) {
1332 TObjArray *tokens = line.Tokenize(" \t");
1333 TString system = ((TObjString *)tokens->At(0))->String();
1334 TString password = ((TObjString *)tokens->At(1))->String();
1335 if (system.Contains("DAQ_LB")){
1336 fDAQlbPass=password;
1338 AliDebug(3,Form("DAQ_LB: Password %s for %s found", password.Data(), system.Data()));
1340 else if (system.Contains("DAQ_DB")){
1341 fFXSdbPass[0]=password;
1343 AliDebug(3,Form("DAQ_DB: Password %s for %s found", password.Data(), system.Data()));
1345 else if (system.Contains("DCS_DB")){
1346 fFXSdbPass[1]=password;
1348 AliDebug(3,Form("DCS_DB: Password %s for %s found", password.Data(), system.Data()));
1350 else if (system.Contains("HLT_DB")){
1351 fFXSdbPass[2]=password;
1353 AliDebug(3,Form("HLT_DB: Password %s for %s found", password.Data(), system.Data()));
1357 AliDebug(3,Form("%i fake line(s) found in file %s", nPwdFake, fPasswdFilePath.Data()));
1367 AliError(Form("Wrong file for DAQ Logbook password found %s (some passwors missing), please Check!", fPasswdFilePath.Data()));
1374 //______________________________________________________________________________________________
1375 UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1377 // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1379 TLDAPEntry* anEntry = 0;
1381 TIter iter(detList);
1382 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1385 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1387 if (!detHolder->IsValid()) {
1388 AliError("Detector configuration error!");
1393 TObjString* detStr = new TObjString(detHolder->GetDetector());
1395 // Look for DCS Configuration
1396 TIter dcsIter(dcsList);
1397 TLDAPEntry *dcsEntry = 0;
1398 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1400 TString dn = dcsEntry->GetDn();
1401 if(dn.Contains(detStr->GetName())) {
1402 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1403 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1404 if (!dcsHolder->IsValid()) {
1405 AliError("DCS configuration error!");
1410 detHolder->AddDCSConfig(dcsHolder);
1415 fDetectorMap.Add(detStr, detHolder);
1416 fDetectorList.AddLast(detStr);
1422 //______________________________________________________________________________________________
1423 UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1425 // Set the Shuttle machines configuration (which detectors processes each machine)
1427 TLDAPEntry* anEntry = 0;
1428 TLDAPAttribute* anAttribute = 0;
1430 fShuttleInstanceHost = gSystem->HostName();
1433 while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1436 TString dn(anEntry->GetDn());
1437 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1441 anAttribute = anEntry->GetAttribute("detectors");
1442 const char *detName;
1443 while((detName = anAttribute->GetValue())){
1444 TObjString *objDet= new TObjString(detName);
1445 fProcessedDetectors.Add(objDet);
1454 //______________________________________________________________________________________________
1455 void AliShuttleConfig::Print(Option_t* option) const
1457 // print configuration
1458 // options : "": print configuration for all detectors, aliases and DPs in compacted format
1459 // "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1460 // "DET": print configuration for DET, aliases and DPs in compacted format
1461 // "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1466 TString mode = "test";
1467 if (fRunMode == kProd) mode = "production";
1469 result += "########################################################################\n";
1470 result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n",
1471 fConfigHost.Data(), mode.Data());
1472 result += "########################################################################\n";
1473 result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
1476 result += Form("All detectors will be processed! \n");
1478 result += "Detectors processed by this host: ";
1479 TIter it(&fProcessedDetectors);
1481 while ((aDet = (TObjString*) it.Next())) {
1482 result += Form("%s ", aDet->String().Data());
1487 result += Form("PP time out = %d - DCS time out = %d - max PP mem size = %d KB - max retries = %d "
1488 "- DIM trigger waiting timeout = %d\n",
1489 fPPTimeOut, fDCSTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
1490 result += Form("FLAGS: keepDCSMap = %d - keepTempFolder = %d - SendMail = %d \n",
1491 fKeepDCSMap, fKeepTempFolder, fSendMail);
1492 const TObjArray* shuttleAdmins = GetAdmins(kGlobal);
1493 if (shuttleAdmins->GetEntries() != 0)
1495 result += "SHUTTLE administrator(s): ";
1496 TIter it(shuttleAdmins);
1497 TObjString* anAdmin;
1498 while ((anAdmin = (TObjString*) it.Next()))
1500 result += Form("%s ", anAdmin->String().Data());
1504 const TObjArray* amandaAdmins = GetAdmins(kAmanda);
1505 if (amandaAdmins->GetEntries() != 0)
1507 result += "Amanda server administrator(s): ";
1508 TIter it(amandaAdmins);
1509 TObjString* anAdmin;
1510 while ((anAdmin = (TObjString*) it.Next()))
1512 result += Form("%s ", anAdmin->String().Data());
1516 result += "------------------------------------------------------\n";
1518 result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
1519 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
1521 // result += "Password: ";
1522 // result.Append('*', fDAQlbPass.Length());
1523 result += Form("\tDB: %s; \tTables: %s, %s, %s\n",
1524 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
1528 result += "------------------------------------------------------\n";
1529 result += "FXS configuration\n\n";
1531 for(int iSys=0;iSys<3;iSys++){
1532 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
1533 result += Form("\tDB host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1534 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
1535 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1536 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
1537 result += Form("\tFXS host: %s:%d; \tUser: %s\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1538 fFXSUser[iSys].Data());
1539 // result += Form("FXS Password:",fFXSPass[iSys].Data());
1540 const TObjArray* fxsAdmins = GetAdmins(iSys);
1541 if (fxsAdmins->GetEntries() != 0)
1543 result += "\tAdministrator(s): ";
1544 TIter it(fxsAdmins);
1545 TObjString* anAdmin;
1546 while ((anAdmin = (TObjString*) it.Next()))
1548 result += Form("%s ", anAdmin->String().Data());
1554 result += "------------------------------------------------------\n";
1555 result += "MonaLisa configuration\n\n";
1557 result += Form("\tHost: %s; \tTable name: %s",
1558 fMonitorHost.Data(), fMonitorTable.Data());
1562 TString optStr(option);
1564 result += "------------------------------------------------------\n";
1565 result += "Detector-specific configuration\n\n";
1567 TIter iter(fDetectorMap.GetTable());
1570 while ((aPair = (TPair*) iter.Next())) {
1571 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1572 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) &&
1573 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
1576 result += Form("*** %s *** \n", aHolder->GetDetector());
1578 const TObjArray* responsibles = aHolder->GetResponsibles();
1579 if (responsibles->GetEntries() != 0)
1581 result += "\tDetector responsible(s): ";
1582 TIter it(responsibles);
1583 TObjString* aResponsible;
1584 while ((aResponsible = (TObjString*) it.Next()))
1586 result += Form("%s ", aResponsible->String().Data());
1591 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1593 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1595 AliShuttleDCSConfigHolder* dcsHolder = 0;
1596 TIter dcsIter(dcsConfig);
1598 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
1600 result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1601 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
1603 const TObjArray* aliases = 0;
1604 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1606 aliases = dcsHolder->GetDCSAliases();
1608 aliases = dcsHolder->GetCompactDCSAliases();
1611 if (aliases->GetEntries() != 0)
1613 result += Form("\tDCS Aliases [%d]: ", count);
1615 TObjString* anAlias;
1616 while ((anAlias = (TObjString*) it.Next()))
1618 result += Form("%s ", anAlias->String().Data());
1623 const TObjArray* dataPoints = 0;
1624 if (optStr.Contains("uncompact",TString::kIgnoreCase))
1626 dataPoints = dcsHolder->GetDCSDataPoints();
1628 dataPoints = dcsHolder->GetCompactDCSDataPoints();
1630 if (dataPoints->GetEntries() != 0)
1632 result += Form("\tDCS Data Points [%d]: ", count);
1633 TIter it(dataPoints);
1634 TObjString* aDataPoint;
1635 while ((aDataPoint = (TObjString*) it.Next())) {
1636 result += Form("%s ", aDataPoint->String().Data());
1644 if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";