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