New Configuration Parameter to set Alien Path for CDB implemented.
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleConfig.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.27  2007/12/17 03:23:32  jgrosseo
19 several bugfixes
20 added "empty preprocessor" as placeholder for Acorde in FDR
21
22 Revision 1.26  2007/12/07 19:14:36  acolla
23 in AliShuttleTrigger:
24
25 Added automatic collection of new runs on a regular time basis (settable from the configuration)
26
27 in AliShuttleConfig: new members
28
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)
31
32 in AliShuttle:
33
34 - logs now stored in logs/#RUN/DET_#RUN.log
35
36 Revision 1.25  2007/11/26 16:58:37  acolla
37 Monalisa configuration added: host and table name
38
39 Revision 1.24  2007/10/24 10:44:08  acolla
40
41 debug AliInfo removed
42
43 Revision 1.23  2007/09/28 15:27:40  acolla
44
45 AliDCSClient "multiSplit" option added in the DCS configuration
46 in AliDCSMessage: variable MAX_BODY_SIZE set to 500000
47
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.
51
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
55
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.
59
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.
61
62 3) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
63
64 4) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
65
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.
68
69 6) The run type has been added to the monitoring page
70
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.
75
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
79 SetShuttleLogDir
80
81 Revision 1.17  2007/01/18 11:17:47  jgrosseo
82 changing spaces to tabs ;-)
83
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.
87
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
91
92 Revision 1.13  2006/12/07 08:51:26  jgrosseo
93 update (alberto):
94 table, db names in ldap configuration
95 added GRP preprocessor
96 DCS data can also be retrieved by data point
97
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 ;-)
101
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
107
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!)
112
113 Revision 1.9  2006/10/02 16:38:39  jgrosseo
114 update (alberto):
115 fixed memory leaks
116 storing of objects that failed to be stored to the grid before
117 interfacing of shuttle status table in daq system
118
119 Revision 1.8  2006/08/15 10:50:00  jgrosseo
120 effc++ corrections (alberto)
121
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.
127
128 Revision 1.6  2006/07/19 10:09:55  jgrosseo
129 new configuration, accesst to DAQ FES (Alberto)
130
131 Revision 1.5  2006/07/10 13:01:41  jgrosseo
132 enhanced storing of last sucessfully processed run (alberto)
133
134 Revision 1.4  2006/06/12 09:11:16  jgrosseo
135 coding conventions (Alberto)
136
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)
140
141 Revision 1.7  2006/05/12 09:07:16  colla
142 12/05/06
143 New configuration complete
144
145 Revision 1.2  2006/03/07 07:52:34  hristov
146 New version (B.Yordanov)
147
148 Revision 1.4  2005/11/19 14:20:31  byordano
149 logbook config added to AliShuttleConfig
150
151 Revision 1.3  2005/11/17 19:24:25  byordano
152 TList changed to TObjArray in AliShuttleConfig
153
154 Revision 1.2  2005/11/17 14:43:23  byordano
155 import to local CVS
156
157 Revision 1.1.1.1  2005/10/28 07:33:58  hristov
158 Initial import as subdirectory in AliRoot
159
160 Revision 1.1.1.1  2005/09/12 22:11:40  byordano
161 SHUTTLE package
162
163 Revision 1.3  2005/08/30 09:13:02  byordano
164 some docs added
165
166 */
167
168
169 //
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).
176 //
177
178 #include <Riostream.h>
179 #include "AliShuttleConfig.h"
180 #include "AliShuttleInterface.h"
181
182 #include "AliLog.h"
183
184 #include <TSystem.h>
185 #include <TObjString.h>
186 #include <TLDAPResult.h>
187 #include <TLDAPEntry.h>
188 #include <TLDAPAttribute.h>
189 #include <TKey.h>
190
191
192 AliShuttleConfig::AliShuttleDCSConfigHolder::AliShuttleDCSConfigHolder(const TLDAPEntry* entry):
193 fDCSHost(""),
194 fDCSPort(0),
195 fMultiSplit(100),
196 fDCSAliases(0),
197 fDCSDataPoints(0),
198 fDCSAliasesComp(0),
199 fDCSDataPointsComp(0),
200 fIsValid(kFALSE)
201 {
202 // constructor of the shuttle DCS configuration holder
203
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);
213
214         
215         anAttribute = entry->GetAttribute("dcsHost"); 
216         if (!anAttribute)
217         {
218                 AliError("Unexpected: no DCS host!");
219                 return;
220         }
221
222         fDCSHost = anAttribute->GetValue();
223
224         anAttribute = entry->GetAttribute("dcsPort");
225         if (!anAttribute)
226         {
227                 AliError("Unexpected: no DCS port!");
228                 return;
229         }
230         TString portStr = anAttribute->GetValue();
231         fDCSPort = portStr.Atoi();
232
233         anAttribute = entry->GetAttribute("multiSplit"); // MAY
234         if (anAttribute)
235         {
236                 TString multiSplitStr = anAttribute->GetValue();
237                 fMultiSplit = multiSplitStr.Atoi();
238                 if(fMultiSplit == 0) {
239                         AliError("MultiSplit must be a positive integer!");
240                         return;
241                 }
242                 
243         }
244         
245         anAttribute = entry->GetAttribute("dcsAlias"); // MAY
246         if (anAttribute)
247         {
248                 const char* anAlias;
249                 while ((anAlias = anAttribute->GetValue()))
250                 {
251                         fDCSAliasesComp->AddLast(new TObjString(anAlias));
252                         ExpandAndAdd(fDCSAliases, anAlias);
253                 }
254         }
255
256         anAttribute = entry->GetAttribute("dcsDP"); // MAY
257         if (anAttribute)
258         {
259                 const char* aDataPoint;
260                 while ((aDataPoint = anAttribute->GetValue()))
261                 {
262                 fDCSDataPointsComp->AddLast(new TObjString(aDataPoint));
263                 ExpandAndAdd(fDCSDataPoints, aDataPoint);
264                 }
265         }
266         
267         fIsValid = kTRUE;
268 }
269
270 //______________________________________________________________________________________________
271 AliShuttleConfig::AliShuttleConfig(const AliShuttleConfig & other):
272         TObject(),
273         fConfigHost(other.fConfigHost),
274         fDAQlbHost(other.fDAQlbHost),
275         fDAQlbPort(other.fDAQlbPort),
276         fDAQlbUser(other.fDAQlbUser),
277         fDAQlbPass(other.fDAQlbPass),
278         fDAQlbDB(other.fDAQlbDB),
279         fDAQlbTable(other.fDAQlbTable),
280         fShuttlelbTable(other.fShuttlelbTable),
281         fRunTypelbTable(other.fRunTypelbTable),
282         fPasswdFilePath(other.fPasswdFilePath),
283         fMaxRetries(other.fMaxRetries),
284         fPPTimeOut(other.fPPTimeOut),
285         fDCSTimeOut(other.fDCSTimeOut),
286         fDCSRetries(other.fDCSRetries),
287         fPPMaxMem(other.fPPMaxMem),
288         fMonitorHost(other.fMonitorHost),
289         fMonitorTable(other.fMonitorTable),
290         fTriggerWait(other.fTriggerWait),
291         fRunMode(other.fRunMode),
292         fDetectorMap(),
293         fDetectorList(other.fDetectorList),
294         fShuttleInstanceHost(other.fShuttleInstanceHost),
295         fProcessedDetectors(other.fProcessedDetectors),
296         fKeepDCSMap(other.fKeepDCSMap),
297         fKeepTempFolder(other.fKeepTempFolder),
298         fSendMail(other.fSendMail),
299         fProcessAll(other.fProcessAll),
300         fIsValid(other.fIsValid)
301 {
302         //
303         // copy ctor
304         //
305         for (Int_t i = 0; i<3; i++){
306                 fFXSHost[i]=other.fFXSHost[i];
307                 fFXSPort[i]=other.fFXSPort[i];
308                 fFXSUser[i]=other.fFXSUser[i];
309                 fFXSPass[i]=other.fFXSPass[i];
310                 fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
311                 fFXSdbHost[i]=other.fFXSdbHost[i];
312                 fFXSdbPort[i]=other.fFXSdbPort[i];
313                 fFXSdbUser[i]=other.fFXSdbUser[i];
314                 fFXSdbPass[i]=other.fFXSdbPass[i];
315                 fFXSdbName[i]=other.fFXSdbName[i];
316                 fFXSdbTable[i]=other.fFXSdbTable[i];
317         }
318         for (Int_t i = 0; i<5; i++){
319                 fAdmin[i] = new TObjArray();
320                 fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
321         }
322
323         TIter iter((other.fDetectorMap).GetTable());
324         TPair* aPair = 0;
325         
326         while ((aPair = (TPair*) iter.Next())) {
327                 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
328                 TKey *key = (TKey*)aPair->Key();
329                 fDetectorMap.Add(key,holder);
330         }
331
332
333
334 //_____________________________________________________________________________________________         
335 AliShuttleConfig& AliShuttleConfig::operator=(const AliShuttleConfig &other) 
336 {
337         //
338         //assignment operator
339         //
340         this->fConfigHost=other.fConfigHost;
341         this->fDAQlbHost=other.fDAQlbHost;
342         this->fDAQlbPort=other.fDAQlbPort;
343         this->fDAQlbUser=other.fDAQlbUser;
344         this->fDAQlbPass=other.fDAQlbPass;
345         this->fDAQlbDB=other.fDAQlbDB;
346         this->fDAQlbTable=other.fDAQlbTable;
347         this->fShuttlelbTable=other.fShuttlelbTable;
348         this->fRunTypelbTable=other.fRunTypelbTable;
349         this->fPasswdFilePath=other.fPasswdFilePath;
350         this->fMaxRetries=other.fMaxRetries;
351         this->fPPTimeOut=other.fPPTimeOut;
352         this->fDCSTimeOut=other.fDCSTimeOut;
353         this->fDCSRetries=other.fDCSRetries;
354         this->fPPMaxMem=other.fPPMaxMem;
355         this->fMonitorHost=other.fMonitorHost;
356         this->fMonitorTable=other.fMonitorTable;
357         this->fTriggerWait=other.fTriggerWait;
358         this->fRunMode=other.fRunMode;
359         this->fDetectorList=other.fDetectorList;
360         this->fShuttleInstanceHost=other.fShuttleInstanceHost;
361         this->fProcessedDetectors=other.fProcessedDetectors;
362         this->fKeepDCSMap=other.fKeepDCSMap;
363         this->fKeepTempFolder=other.fKeepTempFolder;
364         this->fSendMail=other.fSendMail;
365         this->fProcessAll=other.fProcessAll;
366         this->fIsValid=other.fIsValid;
367         for (Int_t i = 0; i<3; i++){
368                 this->fFXSHost[i]=other.fFXSHost[i];
369                 this->fFXSPort[i]=other.fFXSPort[i];
370                 this->fFXSUser[i]=other.fFXSUser[i];
371                 this->fFXSPass[i]=other.fFXSPass[i];
372                 this->fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
373                 this->fFXSdbHost[i]=other.fFXSdbHost[i];
374                 this->fFXSdbPort[i]=other.fFXSdbPort[i];
375                 this->fFXSdbUser[i]=other.fFXSdbUser[i];
376                 this->fFXSdbPass[i]=other.fFXSdbPass[i];
377                 this->fFXSdbName[i]=other.fFXSdbName[i];
378                 this->fFXSdbTable[i]=other.fFXSdbTable[i];
379         }
380         for (Int_t i = 0; i<5; i++){
381                 this->fAdmin[i] = new TObjArray();
382                 this->fAdmin[i]->AddAt(other.fAdmin[i]->At(i),i);
383         }
384
385         TIter iter((other.fDetectorMap).GetTable());
386         TPair* aPair = 0;
387         
388         while ((aPair = (TPair*) iter.Next())) {
389                 AliShuttleDetConfigHolder *holder =(AliShuttleDetConfigHolder *)aPair->Value();
390                 TKey *key = (TKey*)aPair->Key();
391                 this->fDetectorMap.Add(key,holder);
392         }
393         return *this;
394
395 //______________________________________________________________________________________________
396 void AliShuttleConfig::AliShuttleDCSConfigHolder::ExpandAndAdd(TObjArray* target, const char* entry)
397 {
398         //
399         // adds <entry> to <target> applying expanding of the name
400         // [N..M] creates M-N+1 names with the corresponding digits
401         //
402
403         TString entryStr(entry);
404
405         Int_t begin = entryStr.Index("[");
406         Int_t end = entryStr.Index("]");
407         if (begin != -1 && end != -1 && end > begin)
408         {
409                 TString before(entryStr(0, begin));
410                 TString after(entryStr(end+1, entryStr.Length()));
411
412                 AliDebug(2, Form("Found [] pattern. Splitted input string %s %s", before.Data(), after.Data()));
413
414                 Int_t dotdot = entryStr.Index("..");
415
416                 TString nStr(entryStr(begin+1, dotdot-begin-1));
417                 TString mStr(entryStr(dotdot+2, end-dotdot-2));
418
419                 AliDebug(2, Form("Found [N..M] pattern. %s %s", nStr.Data(), mStr.Data()));
420
421                 if (nStr.IsDigit() && mStr.IsDigit())
422                 {
423                         Int_t n = nStr.Atoi();
424                         Int_t m = mStr.Atoi();
425
426                         Int_t nDigits = nStr.Length();
427                         TString formatStr;
428                         formatStr.Form("%%s%%0%dd%%s", nDigits);
429
430                         AliDebug(2, Form("Format string is %s", formatStr.Data()));
431
432                         for (Int_t current = n; current<=m; ++current)
433                         {
434                                 TString newEntry;
435                                 newEntry.Form(formatStr.Data(), before.Data(), current, after.Data());
436
437                                 AliDebug(2, Form("Calling recursive with %s", newEntry.Data()));
438
439                                 // and go recursive
440                                 ExpandAndAdd(target, newEntry);
441                         }
442
443                         // return here because we processed the entries already recursively.
444                         return;
445                 }
446         }
447
448         AliDebug(2, Form("Adding name %s", entry));
449         target->AddLast(new TObjString(entry));
450 }
451
452 //______________________________________________________________________________________________
453 AliShuttleConfig::AliShuttleDCSConfigHolder::~AliShuttleDCSConfigHolder()
454 {
455 // destructor of the shuttle configuration holder
456
457         delete fDCSAliases;
458         delete fDCSDataPoints;
459         delete fDCSAliasesComp;
460         delete fDCSDataPointsComp;      
461 }
462
463 //______________________________________________________________________________________________
464 AliShuttleConfig::AliShuttleDetConfigHolder::AliShuttleDetConfigHolder(const TLDAPEntry* entry):
465 fDetector(""),
466 fDCSConfig(),
467 fResponsibles(0),
468 fIsValid(kFALSE),
469 fSkipDCSQuery(kFALSE),
470 fStrictRunOrder(kFALSE)
471 {
472 // constructor of the shuttle configuration holder
473
474         TLDAPAttribute* anAttribute;
475         
476         fResponsibles = new TObjArray();
477         fResponsibles->SetOwner(1);
478         fDCSConfig = new TObjArray();
479         fDCSConfig->SetOwner(1);
480
481         anAttribute = entry->GetAttribute("det"); // MUST
482         if (!anAttribute)
483         {
484                 AliError(Form("No \"det\" attribute!"));
485                 return;
486         }
487         fDetector = anAttribute->GetValue();
488
489         anAttribute = entry->GetAttribute("strictRunOrder"); // MAY
490         if (!anAttribute)
491         {
492                 AliWarning(Form("%s did not set strictRunOrder flag - the default is FALSE",
493                                 fDetector.Data()));
494         } else {
495                 TString strictRunStr = anAttribute->GetValue();
496                 if (!(strictRunStr == "0" || strictRunStr == "1"))
497                 {
498                         AliError("strictRunOrder flag must be 0 or 1!");
499                         return;
500                 }
501                 fStrictRunOrder = (Bool_t) strictRunStr.Atoi();
502         }
503
504         anAttribute = entry->GetAttribute("responsible"); // MAY
505         if (!anAttribute)
506         {
507                 AliDebug(2, "Warning! No \"responsible\" attribute!");
508         }
509         else
510         {
511                 const char* aResponsible;
512                 while ((aResponsible = anAttribute->GetValue()))
513                 {
514                         fResponsibles->AddLast(new TObjString(aResponsible));
515                 }
516         }
517
518         fIsValid = kTRUE;
519 }
520
521 //______________________________________________________________________________________________
522 AliShuttleConfig::AliShuttleDetConfigHolder::~AliShuttleDetConfigHolder()
523 {
524 // destructor of the shuttle configuration holder
525
526         delete fResponsibles;
527         delete fDCSConfig;
528 }
529
530 //______________________________________________________________________________________________
531 const char* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSHost(Int_t iServ) const
532 {
533         //
534         // returns DCS server host 
535         //
536         
537         if (iServ < 0 || iServ >= GetNServers()) return 0;
538         
539         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
540                                                         (fDCSConfig->At(iServ));
541         
542         return aHolder->GetDCSHost();
543 }
544
545 //______________________________________________________________________________________________
546 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSPort(Int_t iServ) const
547 {
548         //
549         // returns DCS server port 
550         //
551         
552         if (iServ < 0 || iServ >= GetNServers()) return 0;
553         
554         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
555                                                         (fDCSConfig->At(iServ));
556         
557         return aHolder->GetDCSPort();
558 }
559
560 //______________________________________________________________________________________________
561 Int_t AliShuttleConfig::AliShuttleDetConfigHolder::GetMultiSplit(Int_t iServ) const
562 {
563         //
564         // returns DCS "multi split" value
565         //
566         
567         if (iServ < 0 || iServ >= GetNServers()) return 0;
568         
569         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
570                                                         (fDCSConfig->At(iServ));
571         
572         return aHolder->GetMultiSplit();
573 }
574
575 //______________________________________________________________________________________________
576 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSAliases(Int_t iServ) const
577 {
578         //
579         // returns collection of TObjString which represents the set of aliases
580         // which used for data retrieval for particular detector
581         //
582         
583         if (iServ < 0 || iServ >= GetNServers()) return 0;
584         
585         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
586                                                         (fDCSConfig->At(iServ));
587         
588         return aHolder->GetDCSAliases();
589 }
590
591 //______________________________________________________________________________________________
592 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetDCSDataPoints(Int_t iServ) const
593 {
594         //
595         // returns collection of TObjString which represents the set of aliases
596         // which used for data retrieval for particular detector
597         //
598
599         if (iServ < 0 || iServ >= GetNServers()) return 0;
600
601         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
602                                                         (fDCSConfig->At(iServ));
603         
604         return aHolder->GetDCSDataPoints();
605 }
606
607 //______________________________________________________________________________________________
608 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSAliases(Int_t iServ) const
609 {
610         //
611         // returns collection of TObjString which represents the set of aliases
612         // which used for data retrieval for particular detector (Compact style)
613         //
614
615         if (iServ < 0 || iServ >= GetNServers()) return 0;
616
617         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
618                                                         (fDCSConfig->At(iServ));
619         
620         return aHolder->GetCompactDCSAliases();
621 }
622
623 //______________________________________________________________________________________________
624 const TObjArray* AliShuttleConfig::AliShuttleDetConfigHolder::GetCompactDCSDataPoints(Int_t iServ) const
625 {
626         //
627         // returns collection of TObjString which represents the set of aliases
628         // which used for data retrieval for particular detector (Compact style)
629         //
630
631         if (iServ < 0 || iServ >= GetNServers()) return 0;
632
633         AliShuttleDCSConfigHolder *aHolder = dynamic_cast<AliShuttleDCSConfigHolder *> 
634                                                         (fDCSConfig->At(iServ));
635         
636         return aHolder->GetCompactDCSDataPoints();
637 }
638
639 //______________________________________________________________________________________________
640 void AliShuttleConfig::AliShuttleDetConfigHolder::AddDCSConfig(AliShuttleDCSConfigHolder* holder)
641 {
642         //
643         // adds a DCS configuration set in the array of DCS configurations
644         // 
645         
646         if(!holder) return;
647         fDCSConfig->AddLast(holder);
648 }
649
650 ClassImp(AliShuttleConfig)
651
652 //______________________________________________________________________________________________
653 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
654         const char* binddn, const char* password, const char* basedn):
655         fConfigHost(host), 
656         fDAQlbHost(""), 
657         fDAQlbPort(), 
658         fDAQlbUser(""), 
659         fDAQlbPass(""),
660         fDAQlbDB(""), 
661         fDAQlbTable(""), 
662         fShuttlelbTable(""), 
663         fRunTypelbTable(""),
664         fPasswdFilePath(""),
665         fMaxRetries(0), 
666         fPPTimeOut(0), 
667         fDCSTimeOut(0), 
668         fDCSRetries(0), 
669         fPPMaxMem(0), 
670         fMonitorHost(""), 
671         fMonitorTable(""), 
672         fTriggerWait(3600),
673         fRunMode(kTest),
674         fDetectorMap(), 
675         fDetectorList(),
676         fAdmin(),
677         fShuttleInstanceHost(""), 
678         fProcessedDetectors(), 
679         fKeepDCSMap(kFALSE),
680         fKeepTempFolder(kFALSE),
681         fSendMail(kFALSE),
682         fProcessAll(kFALSE), 
683         fIsValid(kFALSE)
684
685 {
686         //
687         // host: ldap server host
688         // port: ldap server port
689         // binddn: binddn used for ldap binding (simple bind is used!).
690         // password: password for binddn
691         // basedn: this is basedn whose childeren entries which have
692         //
693
694         fDetectorMap.SetOwner(1);
695         fDetectorList.SetOwner(0); //fDetectorList and fDetectorMap share the same object!
696         fProcessedDetectors.SetOwner();
697         
698         for (int i=0; i<5; i++)
699         {
700                 fAdmin[i] = new TObjArray(); 
701                 fAdmin[i]->SetOwner();
702         }
703
704         TLDAPServer aServer(host, port, binddn, password, 3);
705
706         if (!aServer.IsConnected()) {
707                 AliError(Form("Can't connect to ldap server %s:%d",
708                                 host, port));
709                 return;
710         }
711
712         // reads configuration for the shuttle running on this machine
713         
714         TLDAPResult* aResult = 0;
715         TLDAPEntry* anEntry = 0;
716         
717         TList dcsList;
718         dcsList.SetOwner(1);
719         TList detList;
720         detList.SetOwner(1);
721         TList globalList;
722         globalList.SetOwner(1);
723         TList sysList;
724         sysList.SetOwner(1);
725         TList hostList;
726         hostList.SetOwner(1);
727         
728         aResult = aServer.Search(basedn, LDAP_SCOPE_SUBTREE, 0, 0);
729         
730         if (!aResult) 
731         {
732                 AliError(Form("Can't find configuration with base DN: %s !", basedn));
733                 return;
734         }
735         
736         while ((anEntry = aResult->GetNext())) 
737         {
738                 TString dn = anEntry->GetDn();
739                 
740                 if (dn.BeginsWith("dcsHost=")) 
741                 {
742                         dcsList.Add(anEntry);
743                 } 
744                 else if (dn.BeginsWith("det="))
745                 {
746                         detList.Add(anEntry);
747                 }
748                 else if (dn.BeginsWith("name=globalConfig"))
749                 {
750                         globalList.Add(anEntry);
751                 }
752                 else if (dn.BeginsWith("system="))
753                 {
754                         sysList.Add(anEntry);
755                 }
756                 else if (dn.BeginsWith("shuttleHost="))
757                 {
758                         hostList.Add(anEntry);
759                 }
760                 else 
761                 {
762                         delete anEntry;
763                 }
764         
765         }
766         delete aResult;
767         
768         Int_t result=0;
769         
770         result += SetGlobalConfig(&globalList);
771         result += SetSysConfig(&sysList);
772         result += SetPasswords();
773         result += SetDetConfig(&detList,&dcsList);
774         result += SetHostConfig(&hostList);
775         
776         if(result) 
777         {
778                 AliError("Configuration is INVALID!");
779         }
780         else 
781         {
782                 fIsValid = kTRUE;
783         }
784 }
785
786 //______________________________________________________________________________________________
787 AliShuttleConfig::~AliShuttleConfig()
788 {
789 // destructor
790
791         fDetectorMap.DeleteAll();
792         fDetectorList.Clear();
793         fProcessedDetectors.Delete();
794 }
795
796 //______________________________________________________________________________________________
797 const TObjArray* AliShuttleConfig::GetDetectors() const
798 {
799         //
800         // returns collection of TObjString which contains the name
801         // of every detector which is in the configuration.
802         //
803
804         return &fDetectorList;
805 }
806
807 //______________________________________________________________________________________________
808 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
809 {
810         //
811         // checks for paricular detector in the configuration.
812         //
813         return fDetectorMap.GetValue(detector) != NULL;
814 }
815
816 //______________________________________________________________________________________________
817 Int_t AliShuttleConfig::GetNServers(const char* detector) const
818 {
819         //
820         // returns number of DCS servers for detector
821         //
822         
823         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
824         if (!aHolder) {
825                 AliError(Form("There isn't configuration for detector: %s",
826                         detector));
827                 return 0;
828         }
829
830         return aHolder->GetNServers();
831 }
832
833
834 //______________________________________________________________________________________________
835 const char* AliShuttleConfig::GetDCSHost(const char* detector, Int_t iServ) const
836 {
837         //
838         // returns i-th DCS server host used by particular detector
839         //
840         
841         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
842         if (!aHolder) {
843                 AliError(Form("There isn't configuration for detector: %s",
844                         detector));
845                 return NULL;
846         }
847
848         return aHolder->GetDCSHost(iServ);
849 }
850
851 //______________________________________________________________________________________________
852 Int_t AliShuttleConfig::GetDCSPort(const char* detector, Int_t iServ) const
853 {
854         //
855         // returns i-th DCS server port used by particular detector
856         //
857
858
859         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
860         if (!aHolder) {
861                 AliError(Form("There isn't configuration for detector: %s",
862                         detector));
863                 return 0;
864         }
865
866         return aHolder->GetDCSPort(iServ);
867 }
868
869 //______________________________________________________________________________________________
870 Int_t AliShuttleConfig::GetMultiSplit(const char* detector, Int_t iServ) const
871 {
872         //
873         // returns i-th DCS "multi split" value
874         //
875
876
877         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
878         if (!aHolder) {
879                 AliError(Form("There isn't configuration for detector: %s",
880                         detector));
881                 return 0;
882         }
883
884         return aHolder->GetMultiSplit(iServ);
885 }
886
887 //______________________________________________________________________________________________
888 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector, Int_t iServ) const
889 {
890         //
891         // returns collection of TObjString which represents the i-th set of aliases
892         // which used for data retrieval for particular detector
893         //
894
895         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
896         if (!aHolder) {
897                 AliError(Form("There isn't configuration for detector: %s",
898                         detector));
899                 return NULL;
900         }
901
902         return aHolder->GetDCSAliases(iServ);
903 }
904
905 //______________________________________________________________________________________________
906 const TObjArray* AliShuttleConfig::GetDCSDataPoints(const char* detector, Int_t iServ) const
907 {
908         //
909         // returns collection of TObjString which represents the set of aliases
910         // which used for data retrieval for particular detector
911         //
912
913         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
914         if (!aHolder) {
915                 AliError(Form("There isn't configuration for detector: %s",
916                         detector));
917                 return NULL;
918         }
919
920         return aHolder->GetDCSDataPoints(iServ);
921 }
922
923 //______________________________________________________________________________________________
924 const TObjArray* AliShuttleConfig::GetCompactDCSAliases(const char* detector, Int_t iServ) const
925 {
926         //
927         // returns collection of TObjString which represents the i-th set of aliases
928         // which used for data retrieval for particular detector (Compact style)
929         //
930
931         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
932         if (!aHolder) {
933                 AliError(Form("There isn't configuration for detector: %s",
934                         detector));
935                 return NULL;
936         }
937
938         return aHolder->GetCompactDCSAliases(iServ);
939 }
940
941 //______________________________________________________________________________________________
942 const TObjArray* AliShuttleConfig::GetCompactDCSDataPoints(const char* detector, Int_t iServ) const
943 {
944         //
945         // returns collection of TObjString which represents the set of aliases
946         // which used for data retrieval for particular detector (Compact style)
947         //
948
949         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
950         if (!aHolder) {
951                 AliError(Form("There isn't configuration for detector: %s",
952                         detector));
953                 return NULL;
954         }
955
956         return aHolder->GetCompactDCSDataPoints(iServ);
957 }
958
959 //______________________________________________________________________________________________
960 const TObjArray* AliShuttleConfig::GetResponsibles(const char* detector) const
961 {
962         //
963         // returns collection of TObjString which represents the list of mail addresses
964         // of the detector's responsible(s)
965         //
966
967         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
968         if (!aHolder) {
969                 AliError(Form("There isn't configuration for detector: %s",
970                         detector));
971                 return NULL;
972         }
973
974         return aHolder->GetResponsibles();
975 }
976
977 //______________________________________________________________________________________________
978 const TObjArray* AliShuttleConfig::GetAdmins(Int_t sys) const
979 {
980         //
981         // returns collection of TObjString which represents the list of mail addresses
982         // of the system's administrator(s) (DAQ, DCS, HLT, Global, Amanda)
983         //
984
985         if (sys < 0 || sys > 4) return 0;
986         return fAdmin[sys];
987 }
988
989 //______________________________________________________________________________________________
990 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
991 {
992         // return TRUE if detector is handled by host or if fProcessAll is TRUE
993
994         if(fProcessAll) return kTRUE;
995         TIter iter(&fProcessedDetectors);
996         TObjString* detName;
997         while((detName = (TObjString*) iter.Next())){
998                 if(detName->String() == detector) return kTRUE;
999         }
1000         return kFALSE;
1001 }
1002
1003 //______________________________________________________________________________________________
1004 Bool_t AliShuttleConfig::StrictRunOrder(const char* detector) const
1005 {
1006         // return TRUE if detector wants strict run ordering of stored data
1007
1008         AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) fDetectorMap.GetValue(detector);
1009         if (!aHolder)
1010         {
1011                 AliError(Form("There isn't configuration for detector: %s",
1012                         detector));
1013                 return kTRUE;
1014         }
1015
1016         return aHolder->StrictRunOrder();
1017 }
1018
1019 //______________________________________________________________________________________________
1020 UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
1021 {
1022         // Set the global configuration (DAQ Logbook + preprocessor monitoring settings)
1023
1024
1025         TLDAPEntry* anEntry = 0;
1026         TLDAPAttribute* anAttribute = 0;
1027         
1028         if (list->GetEntries() == 0) 
1029         {
1030                 AliError("Global configuration not found!");
1031                 return 1;
1032         } 
1033         else if (list->GetEntries() > 1)
1034         {
1035                 AliError("More than one global configuration found!");
1036                 return 2;
1037         }
1038         
1039         anEntry = dynamic_cast<TLDAPEntry*> (list->At(0));
1040         
1041         if (!anEntry)
1042         {
1043                 AliError("Unexpected! Global list does not contain a TLDAPEntry");
1044                 return 3;
1045         } 
1046         
1047         
1048         anAttribute = anEntry->GetAttribute("AlienPath");
1049         if (!anAttribute) {
1050                 AliError("Can't find AlienPath attribute!");
1051                 return 4;
1052         }
1053         fAlienPath = anAttribute->GetValue();
1054
1055         anAttribute = anEntry->GetAttribute("daqLbHost");
1056         if (!anAttribute) {
1057                 AliError("Can't find daqLbHost attribute!");
1058                 return 4;
1059         }
1060         fDAQlbHost = anAttribute->GetValue();
1061
1062         anAttribute = anEntry->GetAttribute("daqLbPort"); // MAY
1063         if (anAttribute)
1064         {
1065                 fDAQlbPort = ((TString) anAttribute->GetValue()).Atoi();
1066         } else {
1067                 fDAQlbPort = 3306; // mysql
1068         }
1069
1070         anAttribute = anEntry->GetAttribute("daqLbUser");
1071         if (!anAttribute) {
1072                 AliError("Can't find daqLbUser attribute!");
1073                 return 4;
1074         }
1075         fDAQlbUser = anAttribute->GetValue();
1076
1077         anAttribute = anEntry->GetAttribute("daqLbDB");
1078         if (!anAttribute) {
1079                 AliError("Can't find daqLbDB attribute!");
1080                 return 4;
1081         }
1082         fDAQlbDB = anAttribute->GetValue();
1083
1084         anAttribute = anEntry->GetAttribute("daqLbTable");
1085         if (!anAttribute) {
1086                 AliError("Can't find daqLbTable attribute!");
1087                 return 4;
1088         }
1089         fDAQlbTable = anAttribute->GetValue();
1090
1091         anAttribute = anEntry->GetAttribute("shuttleLbTable");
1092         if (!anAttribute) {
1093                 AliError("Can't find shuttleLbTable attribute!");
1094                 return 4;
1095         }
1096         fShuttlelbTable = anAttribute->GetValue();
1097
1098         anAttribute = anEntry->GetAttribute("runTypeLbTable");
1099         if (!anAttribute) {
1100                 AliError("Can't find runTypeLbTable attribute!");
1101                 return 4;
1102         }
1103         fRunTypelbTable = anAttribute->GetValue();
1104
1105         anAttribute = anEntry->GetAttribute("ppmaxRetries");
1106         if (!anAttribute) {
1107                 AliError("Can't find ppmaxRetries attribute!");
1108                 return 4;
1109         }
1110         TString tmpStr = anAttribute->GetValue();
1111         fMaxRetries = tmpStr.Atoi();
1112
1113         anAttribute = anEntry->GetAttribute("ppTimeOut");
1114         if (!anAttribute) {
1115                 AliError("Can't find ppTimeOut attribute!");
1116                 return 4;
1117         }
1118         tmpStr = anAttribute->GetValue();
1119         fPPTimeOut = tmpStr.Atoi();
1120
1121         anAttribute = anEntry->GetAttribute("dcsTimeOut");
1122         if (!anAttribute) {
1123                 AliError("Can't find dcsTimeOut attribute!");
1124                 return 4;
1125         }
1126         tmpStr = anAttribute->GetValue();
1127         fDCSTimeOut = tmpStr.Atoi();
1128
1129         anAttribute = anEntry->GetAttribute("nDCSretries");
1130         if (!anAttribute) {
1131                 AliError("Can't find dcsTimeOut attribute!");
1132                 return 4;
1133         }
1134         tmpStr = anAttribute->GetValue();
1135         fDCSRetries = tmpStr.Atoi();
1136
1137         anAttribute = anEntry->GetAttribute("ppMaxMem");
1138         if (!anAttribute) {
1139                 AliError("Can't find ppMaxMem attribute!");
1140                 return 4;
1141         }
1142         tmpStr = anAttribute->GetValue();
1143         fPPMaxMem = tmpStr.Atoi();
1144         
1145         anAttribute = anEntry->GetAttribute("monitorHost");
1146         if (!anAttribute) {
1147                 AliError("Can't find monitorHost attribute!");
1148                 return 4;
1149         }
1150         fMonitorHost = anAttribute->GetValue();
1151         
1152         anAttribute = anEntry->GetAttribute("monitorTable");
1153         if (!anAttribute) {
1154                 AliError("Can't find monitorTable attribute!");
1155                 return 4;
1156         }
1157         fMonitorTable = anAttribute->GetValue();
1158
1159         anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
1160         if (!anAttribute) {
1161                 AliWarning(Form("triggerWait not set! default = ", fTriggerWait));
1162         }
1163         tmpStr = anAttribute->GetValue();
1164         fTriggerWait = tmpStr.Atoi();
1165         
1166         anAttribute = anEntry->GetAttribute("mode");
1167         if (!anAttribute) {
1168                 AliWarning("Run mode not set! Running in test mode.");
1169         } else {
1170           tmpStr = anAttribute->GetValue();
1171           if (tmpStr == "test")
1172           {
1173             fRunMode = kTest;
1174           } else if (tmpStr == "prod") {
1175             fRunMode = kProd;
1176           } else {
1177             AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));                
1178             AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
1179           }
1180         }
1181
1182         anAttribute = anEntry->GetAttribute("keepDCSMap"); // MAY
1183         if (!anAttribute)
1184         {
1185                 AliWarning("keepDCSMap flag not set - default is FALSE");
1186         } else {
1187                 TString keepDCSMapStr = anAttribute->GetValue();
1188                 if (!(keepDCSMapStr == "0" || keepDCSMapStr == "1"))
1189                 {
1190                         AliError("keepDCSMap flag must be 0 or 1!");
1191                         return 4;
1192                 }
1193                 fKeepDCSMap = (Bool_t) keepDCSMapStr.Atoi();
1194         }
1195         
1196         anAttribute = anEntry->GetAttribute("keepTempFolder"); // MAY
1197         if (!anAttribute)
1198         {
1199                 AliWarning("keepTempFolder flag not set - default is FALSE");
1200         } else {
1201                 TString keepTempFolderStr = anAttribute->GetValue();
1202                 if (!(keepTempFolderStr == "0" || keepTempFolderStr == "1"))
1203                 {
1204                         AliError("keepTempFolder flag must be 0 or 1!");
1205                         return 4;
1206                 }
1207                 fKeepTempFolder = (Bool_t) keepTempFolderStr.Atoi();
1208         }
1209         
1210
1211         anAttribute = anEntry->GetAttribute("shuttleAdmin"); // MAY
1212         if (!anAttribute)
1213         {
1214                 AliDebug(2, "Warning! No \"shuttleAdmin\" attribute!");
1215         }
1216         else
1217         {
1218                 const char* anAdmin;
1219                 while ((anAdmin = anAttribute->GetValue()))
1220                 {
1221                         fAdmin[kGlobal]->AddLast(new TObjString(anAdmin));
1222                 }
1223         }
1224
1225         anAttribute = anEntry->GetAttribute("amandaAdmin"); // MAY
1226         if (!anAttribute)
1227         {
1228                 AliDebug(2, "Warning! No \"amandaAdmin\" attribute!");
1229         }
1230         else
1231         {
1232                 const char* anAdmin;
1233                 while ((anAdmin = anAttribute->GetValue()))
1234                 {
1235                         fAdmin[kAmanda]->AddLast(new TObjString(anAdmin));
1236                 }
1237         }
1238         
1239         anAttribute = anEntry->GetAttribute("sendMail"); // MAY
1240         if (!anAttribute)
1241         {
1242                 AliWarning("sendMail flag not set - default is FALSE");
1243         } else {
1244                 TString sendMailStr = anAttribute->GetValue();
1245                 if (!(sendMailStr == "0" || sendMailStr == "1"))
1246                 {
1247                         AliError("sendMail flag must be 0 or 1!");
1248                         return 4;
1249                 }
1250                 fSendMail = (Bool_t) sendMailStr.Atoi();
1251         }
1252                                                 
1253         anAttribute = anEntry->GetAttribute("passwdFilePath");
1254         if (!anAttribute) {
1255                 AliError("Can't find Passwords File Path attribute!");
1256                 return 4;
1257         }
1258         fPasswdFilePath = anAttribute->GetValue();
1259
1260         return 0;
1261 }
1262
1263 //______________________________________________________________________________________________
1264 UInt_t AliShuttleConfig::SetSysConfig(TList* list)
1265 {
1266         // Set the online FXS configuration (DAQ + DCS + HLT)
1267
1268
1269         TLDAPEntry* anEntry = 0;
1270         TLDAPAttribute* anAttribute = 0;
1271         
1272         if (list->GetEntries() != 3) 
1273         {
1274                 AliError(Form("Wrong number of online systems found: %d !", list->GetEntries()));
1275                 return 1;
1276         } 
1277
1278         TIter iter(list);
1279         Int_t count = 0;
1280         SystemCode iSys=kDAQ;
1281         
1282         while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1283         {
1284                 anAttribute = anEntry->GetAttribute("system");
1285                 TString sysName = anAttribute->GetValue();
1286                 
1287                 if (sysName == "DAQ") 
1288                 {
1289                         iSys = kDAQ;
1290                         count += 1;
1291                 }
1292                 else if (sysName == "DCS")
1293                 {
1294                         iSys = kDCS;
1295                         count += 10;
1296                 }
1297                 else if (sysName == "HLT")
1298                 {
1299                         iSys = kHLT;
1300                         count += 100;
1301                 }
1302                 
1303                 anAttribute = anEntry->GetAttribute("dbHost");
1304                 if (!anAttribute) {
1305                         AliError(Form ("Can't find dbHost attribute for %s!!",
1306                                                 AliShuttleInterface::GetSystemName(iSys)));
1307                         return 5;
1308                 }
1309                 fFXSdbHost[iSys] = anAttribute->GetValue();
1310
1311                 anAttribute = anEntry->GetAttribute("dbPort"); // MAY
1312                 if (anAttribute)
1313                 {
1314                         fFXSdbPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1315                 } else {
1316                         fFXSdbPort[iSys] = 3306; // mysql
1317                 }
1318
1319                 anAttribute = anEntry->GetAttribute("dbUser");
1320                 if (!anAttribute) {
1321                         AliError(Form ("Can't find dbUser attribute for %s!!",
1322                                                 AliShuttleInterface::GetSystemName(iSys)));
1323                         return 5;
1324                 }
1325                 fFXSdbUser[iSys] = anAttribute->GetValue();
1326
1327                 anAttribute = anEntry->GetAttribute("dbName");
1328                 if (!anAttribute) {
1329                         AliError(Form ("Can't find dbName attribute for %s!!",
1330                                                 AliShuttleInterface::GetSystemName(iSys)));
1331                         return 5;
1332                 }
1333
1334                 fFXSdbName[iSys] = anAttribute->GetValue();
1335                 anAttribute = anEntry->GetAttribute("dbTable");
1336                 if (!anAttribute) {
1337                         AliError(Form ("Can't find dbTable attribute for %s!!",
1338                                                 AliShuttleInterface::GetSystemName(iSys)));
1339                         return 5;
1340                 }
1341                 fFXSdbTable[iSys] = anAttribute->GetValue();
1342
1343                 anAttribute = anEntry->GetAttribute("fxsHost");
1344                 if (!anAttribute) {
1345                         AliError(Form ("Can't find fxsHost attribute for %s!!",
1346                                                 AliShuttleInterface::GetSystemName(iSys)));
1347                         return 5;
1348                 }
1349                 fFXSHost[iSys] = anAttribute->GetValue();
1350
1351                 anAttribute = anEntry->GetAttribute("fxsPort"); // MAY
1352                 if (anAttribute)
1353                 {
1354                         fFXSPort[iSys] = ((TString) anAttribute->GetValue()).Atoi();
1355                 } else {
1356                         fFXSPort[iSys] = 22; // scp port number
1357                 }
1358
1359                 anAttribute = anEntry->GetAttribute("fxsUser");
1360                 if (!anAttribute) {
1361                         AliError(Form ("Can't find fxsUser attribute for %s!!",
1362                                                 AliShuttleInterface::GetSystemName(iSys)));
1363                         return 5;
1364                 }
1365                 fFXSUser[iSys] = anAttribute->GetValue();
1366
1367                 anAttribute = anEntry->GetAttribute("fxsPasswd");
1368                 if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
1369
1370                 anAttribute = anEntry->GetAttribute("fxsBaseFolder");
1371                 if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
1372         
1373                 anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
1374                 if (!anAttribute)
1375                 {
1376                         AliDebug(2, "Warning! No \"fxsAdmin\" attribute!");
1377                 }
1378                 else
1379                 {
1380                         const char* anAdmin;
1381                         while ((anAdmin = anAttribute->GetValue()))
1382                         {
1383                                 fAdmin[iSys]->AddLast(new TObjString(anAdmin));
1384                         }
1385                 }
1386         
1387         }
1388         
1389         if(count != 111) {
1390                 AliError(Form("Wrong system configuration! (code = %d)", count));
1391                 return 6;
1392         }
1393         
1394         return 0;
1395 }
1396
1397 //______________________________________________________________________________________________
1398 UInt_t AliShuttleConfig::SetPasswords(){
1399         
1400         AliInfo("Setting Passwords");
1401
1402         // Retrieving Passwords for DAQ lb, DAQ/DCS/HLT FXS
1403
1404         ifstream *inputfile = new ifstream(fPasswdFilePath.Data());
1405         if (!*inputfile) {
1406                 AliError(Form("Error opening file %s !", fPasswdFilePath.Data()));
1407                 inputfile->close();
1408                 delete inputfile;
1409                 return 1;
1410         }
1411
1412         TString line;
1413         Int_t nPwd=0;
1414         Int_t nPwdFake=0;
1415         while (line.ReadLine(*inputfile)) {
1416                 TObjArray *tokens = line.Tokenize(" \t");
1417                 TString system = ((TObjString *)tokens->At(0))->String(); 
1418                 TString password = ((TObjString *)tokens->At(1))->String();
1419                 if (system.Contains("DAQ_LB")){
1420                         fDAQlbPass=password;
1421                         nPwd++;
1422                         AliDebug(3,Form("DAQ_LB: Password %s for %s found", password.Data(), system.Data()));
1423                 }
1424                 else if (system.Contains("DAQ_DB")){
1425                         fFXSdbPass[0]=password;
1426                         nPwd++;
1427                         AliDebug(3,Form("DAQ_DB: Password %s for %s found", password.Data(), system.Data()));
1428                 }
1429                 else if (system.Contains("DCS_DB")){
1430                         fFXSdbPass[1]=password;
1431                         nPwd++;
1432                         AliDebug(3,Form("DCS_DB: Password %s for %s found", password.Data(), system.Data()));
1433                 }
1434                 else if (system.Contains("HLT_DB")){
1435                         fFXSdbPass[2]=password;
1436                         nPwd++;
1437                         AliDebug(3,Form("HLT_DB: Password %s for %s found", password.Data(), system.Data()));
1438                 }
1439                 else {
1440                         nPwdFake++;
1441                         AliDebug(3,Form("%i fake line(s) found in file %s", nPwdFake, fPasswdFilePath.Data()));
1442                         continue;
1443                 }
1444                 delete tokens;
1445         }
1446
1447         inputfile->close();
1448         delete inputfile;
1449
1450         if (nPwd!=4){
1451                 AliError(Form("Wrong file for DAQ Logbook password found %s (some passwors missing), please Check!", fPasswdFilePath.Data()));
1452                 return 2;
1453         }
1454
1455         return 0;
1456
1457 }
1458 //______________________________________________________________________________________________
1459 UInt_t AliShuttleConfig::SetDetConfig(TList* detList, TList* dcsList)
1460 {
1461         // Set the detector configuration (general settings + DCS amanda server and alias/DP lists)
1462
1463         TLDAPEntry* anEntry = 0;
1464         
1465         TIter iter(detList);
1466         while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1467         {
1468                 
1469                 AliShuttleDetConfigHolder* detHolder = new AliShuttleDetConfigHolder(anEntry);
1470
1471                 if (!detHolder->IsValid()) {
1472                         AliError("Detector configuration error!");
1473                         delete detHolder;
1474                         return 7;
1475                 }
1476
1477                 TObjString* detStr = new TObjString(detHolder->GetDetector());
1478                 
1479                 // Look for DCS Configuration
1480                 TIter dcsIter(dcsList);
1481                 TLDAPEntry *dcsEntry = 0;
1482                 while ((dcsEntry = dynamic_cast<TLDAPEntry*> (dcsIter.Next())))
1483                 {
1484                         TString dn = dcsEntry->GetDn();
1485                         if(dn.Contains(detStr->GetName())) {
1486                                 AliDebug(2, Form("Found DCS configuration: dn = %s",dn.Data()));
1487                                 AliShuttleDCSConfigHolder* dcsHolder = new AliShuttleDCSConfigHolder(dcsEntry);
1488                                 if (!dcsHolder->IsValid()) {
1489                                         AliError("DCS configuration error!");
1490                                         delete detHolder;
1491                                         delete dcsHolder;
1492                                         return 7;
1493                                 }
1494                                 detHolder->AddDCSConfig(dcsHolder);
1495                         }
1496                 }
1497                 
1498                 
1499                 fDetectorMap.Add(detStr, detHolder);
1500                 fDetectorList.AddLast(detStr);
1501         }
1502         
1503         return 0;
1504 }
1505
1506 //______________________________________________________________________________________________
1507 UInt_t AliShuttleConfig::SetHostConfig(TList* list)
1508 {
1509         // Set the Shuttle machines configuration (which detectors processes each machine)
1510         
1511         TLDAPEntry* anEntry = 0;
1512         TLDAPAttribute* anAttribute = 0;
1513         
1514         fShuttleInstanceHost = gSystem->HostName();
1515         
1516         TIter iter(list);
1517         while ((anEntry = dynamic_cast<TLDAPEntry*> (iter.Next())))
1518         {
1519         
1520                 TString dn(anEntry->GetDn());
1521                 if (!dn.Contains(Form("shuttleHost=%s", fShuttleInstanceHost.Data()))) continue;
1522                 
1523                 if (!fProcessAll)
1524                 {
1525                         anAttribute = anEntry->GetAttribute("detectors");
1526                         const char *detName;
1527                         while((detName = anAttribute->GetValue())){
1528                                 TObjString *objDet= new TObjString(detName);
1529                                 fProcessedDetectors.Add(objDet);
1530                         }
1531                 }
1532         }       
1533         
1534         return 0;
1535 }
1536
1537
1538 //______________________________________________________________________________________________
1539 void AliShuttleConfig::Print(Option_t* option) const
1540 {
1541 // print configuration
1542 // options : "": print configuration for all detectors, aliases and DPs in compacted format
1543 //           "uncompact": print configuration for all detectors, aliases and DPs in uncompacted format
1544 //           "DET": print configuration for DET, aliases and DPs in compacted format
1545 //           "DET, uncompact": print configuration for DET, aliases and DPs in uncompacted format
1546
1547         TString result;
1548         result += '\n';
1549         
1550         TString mode = "test";
1551         if (fRunMode == kProd) mode = "production";
1552
1553         result += "########################################################################\n";
1554         result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n", 
1555                                         fConfigHost.Data(), mode.Data());
1556         result += "########################################################################\n";
1557         result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
1558
1559         if(fProcessAll) {
1560                 result += Form("All detectors will be processed! \n");
1561         } else {
1562                 result += "Detectors processed by this host: ";
1563                 TIter it(&fProcessedDetectors);
1564                 TObjString* aDet;
1565                 while ((aDet = (TObjString*) it.Next())) {
1566                         result += Form("%s ", aDet->String().Data());
1567                 }
1568                 result += "\n";
1569         }
1570
1571         result += Form("PP time out = %d - DCS time out = %d - max PP mem size = %d KB - max retries = %d "
1572                        "- DIM trigger waiting timeout = %d\n", 
1573                                 fPPTimeOut, fDCSTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
1574         result += Form("FLAGS: keepDCSMap = %d - keepTempFolder = %d - SendMail = %d \n", 
1575                                 fKeepDCSMap, fKeepTempFolder, fSendMail);
1576         const TObjArray* shuttleAdmins = GetAdmins(kGlobal);
1577         if (shuttleAdmins->GetEntries() != 0)
1578         {
1579                 result += "SHUTTLE administrator(s): ";
1580                 TIter it(shuttleAdmins);
1581                 TObjString* anAdmin;
1582                 while ((anAdmin = (TObjString*) it.Next()))
1583                 {
1584                         result += Form("%s ", anAdmin->String().Data());
1585                 }
1586                 result += "\n";
1587         }
1588         const TObjArray* amandaAdmins = GetAdmins(kAmanda);
1589         if (amandaAdmins->GetEntries() != 0)
1590         {
1591                 result += "Amanda server administrator(s): ";
1592                 TIter it(amandaAdmins);
1593                 TObjString* anAdmin;
1594                 while ((anAdmin = (TObjString*) it.Next()))
1595                 {
1596                         result += Form("%s ", anAdmin->String().Data());
1597                 }
1598                 result += "\n\n";
1599         }
1600         result += "------------------------------------------------------\n";
1601
1602         result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
1603                 fDAQlbHost.Data(), fDAQlbPort, fDAQlbUser.Data());
1604
1605 //      result += "Password: ";
1606 //      result.Append('*', fDAQlbPass.Length());
1607         result += Form("\tDB: %s; \tTables: %s, %s, %s\n",
1608                 fDAQlbDB.Data(), fDAQlbTable.Data(), fShuttlelbTable.Data(), fRunTypelbTable.Data());
1609
1610         result += "\n\n";
1611         
1612         result += "------------------------------------------------------\n";
1613         result += "FXS configuration\n\n";
1614
1615         for(int iSys=0;iSys<3;iSys++){
1616                 result += Form("*** %s ***\n", AliShuttleInterface::GetSystemName(iSys));
1617                 result += Form("\tDB  host: %s:%d; \tUser: %s; \tName: %s; \tTable: %s\n",
1618                                                 fFXSdbHost[iSys].Data(), fFXSdbPort[iSys], fFXSdbUser[iSys].Data(),
1619                                                 fFXSdbName[iSys].Data(), fFXSdbTable[iSys].Data());
1620                 // result += Form("DB Password:",fFXSdbPass[iSys].Data());
1621                 result += Form("\tFXS host: %s:%d; \tUser: %s\n", fFXSHost[iSys].Data(), fFXSPort[iSys],
1622                                                 fFXSUser[iSys].Data());
1623                 // result += Form("FXS Password:",fFXSPass[iSys].Data());
1624                 const TObjArray* fxsAdmins = GetAdmins(iSys);
1625                 if (fxsAdmins->GetEntries() != 0)
1626                 {
1627                         result += "\tAdministrator(s): ";
1628                         TIter it(fxsAdmins);
1629                         TObjString* anAdmin;
1630                         while ((anAdmin = (TObjString*) it.Next()))
1631                         {
1632                                 result += Form("%s ", anAdmin->String().Data());
1633                         }
1634                         result += "\n\n";
1635                 }
1636         }
1637
1638         result += "------------------------------------------------------\n";
1639         result += "MonaLisa configuration\n\n";
1640         
1641         result += Form("\tHost: %s; \tTable name: %s",
1642                 fMonitorHost.Data(), fMonitorTable.Data());
1643                 
1644         result += "\n\n";
1645                 
1646         TString optStr(option);
1647
1648         result += "------------------------------------------------------\n";
1649         result += "Detector-specific configuration\n\n";
1650         
1651         TIter iter(fDetectorMap.GetTable());
1652         TPair* aPair = 0;
1653         
1654         while ((aPair = (TPair*) iter.Next())) {
1655                 AliShuttleDetConfigHolder* aHolder = (AliShuttleDetConfigHolder*) aPair->Value();
1656                 if (optStr != "" && !optStr.Contains(aHolder->GetDetector()) && 
1657                                 optStr.CompareTo("uncompact",TString::kIgnoreCase) != 0 )
1658                                 continue;
1659                 
1660                 result += Form("*** %s *** \n", aHolder->GetDetector());
1661
1662                 const TObjArray* responsibles = aHolder->GetResponsibles();
1663                 if (responsibles->GetEntries() != 0)
1664                 {
1665                         result += "\tDetector responsible(s): ";
1666                         TIter it(responsibles);
1667                         TObjString* aResponsible;
1668                         while ((aResponsible = (TObjString*) it.Next()))
1669                         {
1670                                 result += Form("%s ", aResponsible->String().Data());
1671                         }
1672                         result += "\n";
1673                 }
1674
1675                 result += Form("\tStrict run ordering: %s \n\n", aHolder->StrictRunOrder() ? "YES" : "NO");
1676                 
1677                 const TObjArray* dcsConfig = aHolder->GetDCSConfig();
1678                 
1679                 AliShuttleDCSConfigHolder* dcsHolder = 0;
1680                 TIter dcsIter(dcsConfig);
1681                 Int_t count=0;
1682                 while ((dcsHolder = dynamic_cast<AliShuttleDCSConfigHolder*> (dcsIter.Next())))
1683                 {
1684                         result += Form("\tAmanda server [%d]: %s:%d - MultiSplit = %d\n", count,
1685                                 dcsHolder->GetDCSHost(), dcsHolder->GetDCSPort(), dcsHolder->GetMultiSplit());
1686
1687                         const TObjArray* aliases = 0;
1688                         if (optStr.Contains("uncompact",TString::kIgnoreCase))
1689                         {
1690                                 aliases = dcsHolder->GetDCSAliases();
1691                         } else {
1692                                 aliases = dcsHolder->GetCompactDCSAliases();
1693                         }
1694
1695                         if (aliases->GetEntries() != 0)
1696                         {
1697                                 result += Form("\tDCS Aliases [%d]: ", count);
1698                                 TIter it(aliases);
1699                                 TObjString* anAlias;
1700                                 while ((anAlias = (TObjString*) it.Next()))
1701                                 {
1702                                         result += Form("%s ", anAlias->String().Data());
1703                                 }
1704                                 result += "\n";
1705                         }
1706
1707                         const TObjArray* dataPoints = 0;
1708                         if (optStr.Contains("uncompact",TString::kIgnoreCase))
1709                         {
1710                                 dataPoints = dcsHolder->GetDCSDataPoints();
1711                         } else {
1712                                 dataPoints = dcsHolder->GetCompactDCSDataPoints();
1713                         }
1714                         if (dataPoints->GetEntries() != 0)
1715                         {
1716                                 result += Form("\tDCS Data Points [%d]: ", count);
1717                                 TIter it(dataPoints);
1718                                 TObjString* aDataPoint;
1719                                 while ((aDataPoint = (TObjString*) it.Next())) {
1720                                         result += Form("%s ", aDataPoint->String().Data());
1721                                 }
1722                                 result += "\n";
1723                         }
1724                         count++;
1725                         result += "\n";
1726                 }
1727         }
1728         if(!fIsValid) result += "\n\n********** !!!!! Configuration is INVALID !!!!! **********\n";
1729
1730         AliInfo(result);
1731 }