3ff815957028d816b1e7f932fa997e3958b50632
[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.4  2006/06/12 09:11:16  jgrosseo
19 coding conventions (Alberto)
20
21 Revision 1.3  2006/06/06 14:26:40  jgrosseo
22 o) removed files that were moved to STEER
23 o) shuttle updated to follow the new interface (Alberto)
24
25 Revision 1.7  2006/05/12 09:07:16  colla
26 12/05/06
27 New configuration complete
28
29 Revision 1.2  2006/03/07 07:52:34  hristov
30 New version (B.Yordanov)
31
32 Revision 1.4  2005/11/19 14:20:31  byordano
33 logbook config added to AliShuttleConfig
34
35 Revision 1.3  2005/11/17 19:24:25  byordano
36 TList changed to TObjArray in AliShuttleConfig
37
38 Revision 1.2  2005/11/17 14:43:23  byordano
39 import to local CVS
40
41 Revision 1.1.1.1  2005/10/28 07:33:58  hristov
42 Initial import as subdirectory in AliRoot
43
44 Revision 1.1.1.1  2005/09/12 22:11:40  byordano
45 SHUTTLE package
46
47 Revision 1.3  2005/08/30 09:13:02  byordano
48 some docs added
49
50 */
51
52
53 //
54 // This class keeps the AliShuttle configuration.
55 // It reads the configuration for LDAP server.
56 // For every child entry in basedn which has schema type 'shuttleConfig'
57 // it creates a detector configuration. This configuration includes:
58 // DCS server host and port and the set of aliases for which data from
59 // will be retrieved (used by AliShuttle).
60 //
61
62
63 #include "AliShuttleConfig.h"
64
65 #include "AliLog.h"
66
67 #include <TSystem.h>
68 #include <TObjString.h>
69 #include <TLDAPResult.h>
70 #include <TLDAPEntry.h>
71 #include <TLDAPAttribute.h>
72
73 AliShuttleConfig::AliShuttleConfigHolder::AliShuttleConfigHolder(const TLDAPEntry* entry):
74         fIsValid(kFALSE)
75 {
76 // constructor of the shuttle configuration holder
77
78         TLDAPAttribute* anAttribute;
79         
80         anAttribute = entry->GetAttribute("det");
81         if (!anAttribute) {
82                 AliError("Invalid configuration! Can't get detector name.");
83                 return;
84         }
85         fDetector = anAttribute->GetValue();
86         if (!fDetector.Length()) {
87                 AliError("Detector name can't be an empty string!")
88                 return;
89         }
90
91         anAttribute = entry->GetAttribute("DCSHost");
92         if (!anAttribute) {
93                 AliError("Invalid configuration! Can't get DCSHost.");
94                 return;
95         }
96         fDCSHost = anAttribute->GetValue();
97         if (!fDCSHost.Length()) {
98                 AliError("Host can't be an empty string!")
99                 return;
100         }
101
102         anAttribute = entry->GetAttribute("DCSPort");
103         if (!anAttribute) {
104                 AliError("Invalid configuration! Can't get DCSPort.");
105                 return;
106         }
107         TString portStr = anAttribute->GetValue();
108         if (!portStr.Length()) {
109                 AliError("port can't be an empty string!")
110                 return;
111         }
112         fDCSPort = portStr.Atoi();
113
114         anAttribute = entry->GetAttribute("DCSAlias");
115         if (!anAttribute) {
116                 AliError("Invalid configuration! Can't get alias attribute.");
117                 return;
118         }
119         const char* anAlias;
120         while ((anAlias = anAttribute->GetValue())) {
121                 fDCSAliases.AddLast(new TObjString(anAlias));
122         }
123
124         anAttribute = entry->GetAttribute("DAQFileIDs");
125         if (!anAttribute) {
126                 AliError("Invalid configuration! Can't get DAQFileIDs attribute.");
127                 return;
128         }
129         const char* aFileID;
130         while ((aFileID = anAttribute->GetValue())) {
131                 fDAQFileIDs.AddLast(new TObjString(aFileID));
132         }
133                 
134         fIsValid = kTRUE;
135 }
136
137 //______________________________________________________________________________________________
138 AliShuttleConfig::AliShuttleConfigHolder::~AliShuttleConfigHolder()
139 {
140 // destructor of the shuttle configuration holder
141
142         fDCSAliases.Delete();
143 }
144
145 ClassImp(AliShuttleConfig)
146
147 //______________________________________________________________________________________________
148 AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
149         const char* binddn, const char* password, const char* basedn):
150         fIsValid(kFALSE),
151         fProcessAll(kFALSE)
152 {
153         //
154         // host: ldap server host
155         // port: ldap server port
156         // binddn: binddn used for ldap binding (simple bind is used!).
157         // password: password for binddn
158         // basedn: this is basedn whose childeren entries which have
159         // (objectClass=shuttleConfig) will be used as detector configurations.
160         //
161
162         TLDAPServer aServer(host, port, binddn, password, 3);
163         
164         if (!aServer.IsConnected()) {
165                 AliError(Form("Can't connect to ldap server %s:%d", 
166                                 host, port));
167                 return;
168         }
169
170         // reads configuration for the shuttle running on this machine
171         
172         fShuttleInstanceHost = gSystem->HostName();
173         TString queryFilter = "(ShuttleHost=";
174         queryFilter += fShuttleInstanceHost;
175         queryFilter += ")";     
176         
177         TLDAPResult* aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
178                         queryFilter.Data());
179
180         if (!aResult) {
181                 AliError(Form("Can't find configuration with base DN: %s",
182                                 basedn));
183                 return;
184         }
185
186         if (aResult->GetCount() == 0) {
187                 AliError(Form("No Shuttle instance for host = %s!",fShuttleInstanceHost.Data()));
188                 AliError(Form("All detectors will be processed."));
189                 fProcessAll=kTRUE;
190         }
191
192         if (aResult->GetCount() > 1) {
193                 AliError(Form("More than one Shuttle instance for host %s!",fShuttleInstanceHost.Data()));
194                 return;
195         }
196         
197         TLDAPEntry* anEntry;
198         TLDAPAttribute* anAttribute;
199
200         if(!fProcessAll){
201                 anEntry = aResult->GetNext();
202                 anAttribute = anEntry->GetAttribute("detectors");
203                 const char *detName;
204                 while((detName = anAttribute->GetValue())){
205                         TObjString *objDet= new TObjString(detName);
206                         fProcessedDetectors.Add(objDet);
207                 }
208         }
209
210         aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
211                         "(objectClass=AliShuttleDetector)");
212         if (!aResult) {
213                 AliError(Form("Can't find configuration with base DN: %s",
214                                 basedn));
215                 return;
216         }
217
218         while ((anEntry = aResult->GetNext())) {
219                 AliShuttleConfigHolder* aHolder = new AliShuttleConfigHolder(anEntry);
220                 delete anEntry;
221
222                 if (!aHolder->IsValid()) {
223                         AliError("This entry is going to be skipped!");
224                         delete aHolder;
225
226                         continue;
227                 }
228
229                 TObjString* detStr = new TObjString(aHolder->GetDetector());
230                 fDetectorMap.Add(detStr, aHolder);
231                 fDetectorList.AddLast(detStr);
232         }       
233         
234         delete aResult;
235
236
237         aResult = aServer.Search(basedn, LDAP_SCOPE_ONELEVEL,
238                         "(objectClass=AliShuttleGlobalConfig)");
239         if (!aResult) {
240                 AliError(Form("Can't find configuration with base DN: %s",
241                                 basedn));
242                 return;
243         }
244
245         if (aResult->GetCount() == 0) {
246                 AliError("Can't find DAQ logbook configuration!");
247                 return;
248         }
249
250         if (aResult->GetCount() > 1) {
251                 AliError("More than one DAQ logbook configuration found!");
252                 return;
253         }
254
255         anEntry = aResult->GetNext();
256         
257         anAttribute = anEntry->GetAttribute("DAQLogbookHost");
258         if (!anAttribute) {
259                 AliError("Can't find DAQLogbookHost attribute!");
260                 return;
261         }
262         fDAQLogBookHost = anAttribute->GetValue();
263
264         anAttribute = anEntry->GetAttribute("DAQLogbookUser");
265         if (!anAttribute) {
266                 AliError("Can't find DAQLogbookUser attribute!");
267                 return;
268         }
269         fDAQLogBookUser = anAttribute->GetValue();
270         
271         anAttribute = anEntry->GetAttribute("DAQLogbookPassword");
272         if (!anAttribute) {
273                 AliError("Can't find DAQLogbookPassword attribute!");
274                 return;
275         }
276         fDAQLogBookPassword = anAttribute->GetValue();
277
278         anAttribute = anEntry->GetAttribute("DAQFileSystemHost");
279         if (!anAttribute) {
280                 AliError("Can't find DAQFileSystemHost attribute!");
281                 return;
282         }
283         fDAQFSHost = anAttribute->GetValue();
284
285         delete anEntry;
286         delete aResult;
287         
288         fIsValid = kTRUE;
289 }
290
291 //______________________________________________________________________________________________
292 AliShuttleConfig::~AliShuttleConfig()
293 {
294 // destructor
295
296         fDetectorMap.DeleteAll();
297 }
298
299 //______________________________________________________________________________________________
300 const TObjArray* AliShuttleConfig::GetDetectors() const
301 {
302         //
303         // returns collection of TObjString which contains the name
304         // of every detector which is in the configuration.
305         //
306
307         return &fDetectorList;
308 }
309
310 //______________________________________________________________________________________________
311 Bool_t AliShuttleConfig::HasDetector(const char* detector) const
312 {
313         //
314         // checks for paricular detector in the configuration.
315         //
316         return fDetectorMap.GetValue(detector) != NULL;
317 }
318
319 //______________________________________________________________________________________________
320 const char* AliShuttleConfig::GetDCSHost(const char* detector) const
321 {
322         //
323         // returns DCS server host used by particular detector
324         //
325         
326         AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
327         if (!aHolder) {
328                 AliError(Form("There isn't configuration for detector: %s",
329                         detector));
330                 return NULL;
331         }
332
333         return aHolder->GetDCSHost();
334 }
335
336 //______________________________________________________________________________________________
337 Int_t AliShuttleConfig::GetDCSPort(const char* detector) const
338 {
339         //
340         // returns DCS server port used by particular detector
341         //
342
343
344         AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
345         if (!aHolder) {
346                 AliError(Form("There isn't configuration for detector: %s",
347                         detector));
348                 return 0;
349         }
350
351         return aHolder->GetDCSPort();
352 }
353
354 //______________________________________________________________________________________________
355 const TObjArray* AliShuttleConfig::GetDCSAliases(const char* detector) const
356 {
357         //
358         // returns collection of TObjString which represents the set of aliases
359         // which used for data retrieval for particular detector
360         //
361
362         AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
363         if (!aHolder) {
364                 AliError(Form("There isn't configuration for detector: %s",
365                         detector));
366                 return NULL;
367         }
368
369         return aHolder->GetDCSAliases();
370 }
371
372 //______________________________________________________________________________________________
373 const TObjArray* AliShuttleConfig::GetDAQFileIDs(const char* detector) const
374 {
375         //
376         // returns collection of TObjString which represents the set of DAQ file IDs
377         // which used for data retrieval for particular detector
378         //
379
380         AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) fDetectorMap.GetValue(detector);
381         if (!aHolder) {
382                 AliError(Form("There isn't configuration for detector: %s",
383                         detector));
384                 return NULL;
385         }
386
387         return aHolder->GetDAQFileIDs();
388 }
389
390 //______________________________________________________________________________________________
391 Bool_t AliShuttleConfig::HostProcessDetector(const char* detector) const
392 {
393         // return TRUE if detector is handled by host or if fProcessAll is TRUE
394
395         if(fProcessAll) return kTRUE;
396         TIter iter(&fProcessedDetectors);
397         TObjString* detName;
398         while((detName = (TObjString*) iter.Next())){
399                 if(detName->String() == detector) return kTRUE;
400         }
401         return kFALSE;
402 }
403
404 //______________________________________________________________________________________________
405 void AliShuttleConfig::Print(Option_t* /*option*/) const 
406 {
407 // print configuration
408         
409         TString result;
410         result += '\n';
411
412         result += "Shuttle running on host: ";
413         result += fShuttleInstanceHost;
414         result += '\n';
415         result += "Detectors handled by this host: ";
416         TIter it(&fProcessedDetectors);
417         TObjString* aDet;
418         while ((aDet = (TObjString*) it.Next())) {
419                 result += aDet->String();
420                 result += ' ';
421         }
422         result += '\n';
423         if(fProcessAll) result += "ProcessAll is ON";
424
425         result += '\n';
426         result += '\n';
427
428         result += "DAQ LogBook Host: ";
429         result += fDAQLogBookHost;
430         result += '\n';
431         result += "DAQ LogBook User: ";
432         result += fDAQLogBookUser;
433         result += '\n';
434         result += "DAQ LogBook Password: ";
435         result.Append('*', fDAQLogBookPassword.Length());
436         result += '\n';
437         result += '\n';
438         result += "DAQ File System Host: ";
439         result += fDAQFSHost;
440         result += '\n';
441
442         TIter iter(fDetectorMap.GetTable());
443         TPair* aPair;
444         while ((aPair = (TPair*) iter.Next())) {
445                 AliShuttleConfigHolder* aHolder = (AliShuttleConfigHolder*) aPair->Value();
446                 result += '\n';
447                 result += " Detector: ";
448                 result += aHolder->GetDetector();
449                 result += '\n'; 
450                 result += " DCS Host: ";
451                 result += aHolder->GetDCSHost();
452                 result += '\n';
453                 result += " DCS Port: ";
454                 result += aHolder->GetDCSPort();
455                 result += '\n';
456
457                 result += " DCS Aliases: ";
458                 const TObjArray* aliases = aHolder->GetDCSAliases();    
459                 TIter it(aliases);
460                 TObjString* anAlias;    
461                 while ((anAlias = (TObjString*) it.Next())) {
462                         result += anAlias->String();
463                         result += ' ';
464                 }       
465                 
466                 result += '\n';
467
468                 result += " DAQ File IDs: ";
469                 const TObjArray* fileIDs = aHolder->GetDAQFileIDs();    
470                 TIter it2(fileIDs);             
471                 TObjString* aFileID;    
472                 while ((aFileID = (TObjString*) it2.Next())) {
473                         result += aFileID->String();
474                         result += ' ';
475                 }       
476                 result += '\n';
477         }
478
479         AliInfo(result);
480 }