]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTHOMERProxyHandler.cxx
A little task for checking the c*tau of the strange particles
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTHOMERProxyHandler.cxx
1 //-*- Mode: C++ -*-
2 // $Id: AliHLTHOMERProxyHandler.cxx  $
3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project        * 
5 //* ALICE Experiment at CERN, All rights reserved.                         *
6 //*                                                                        *
7 //* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
8 //*                  for The ALICE HLT Project.                            *
9 //*                                                                        *
10 //* Permission to use, copy, modify and distribute this software and its   *
11 //* documentation strictly for non-commercial purposes is hereby granted   *
12 //* without fee, provided that the above copyright notice appears in all   *
13 //* copies and that both the copyright notice and this permission notice   *
14 //* appear in the supporting documentation. The authors make no claims     *
15 //* about the suitability of this software for any purpose. It is          *
16 //* provided "as is" without express or implied warranty.                  *
17 //**************************************************************************
18
19 /** @file   AliHLTHOMERProxyHandler.cxx
20     @author Jochen Thaeder
21     @date
22     @brief  HOMER proxy handler for HomerManger
23 */
24
25 // see header file for class documentation
26 // or
27 // refer to README to build package
28 // or
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
30
31 #if __GNUC__>= 3
32    using namespace std;
33 #endif
34
35 #include "TDOMParser.h"
36 #include "TSocket.h"
37 #include "TSystem.h"
38 // -- -- -- -- -- -- -- 
39 #include "AliHLTHOMERProxyHandler.h"
40 // -- -- -- -- -- -- -- 
41
42 ClassImp(AliHLTHOMERProxyHandler)
43
44 /*
45  * ---------------------------------------------------------------------------------
46  *                            Constructor / Destructor
47  * ---------------------------------------------------------------------------------
48  */
49
50 //##################################################################################
51 AliHLTHOMERProxyHandler::AliHLTHOMERProxyHandler() :
52   fRealm(kHLT),
53   fXmlRpcResponse(""),
54   fSourceList(NULL) {
55   // see header file for class documentation
56   // or
57   // refer to README to build package
58   // or
59   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
60 }
61
62 //##################################################################################
63 AliHLTHOMERProxyHandler::~AliHLTHOMERProxyHandler() {
64   // see header file for class documentation
65
66 }
67
68 //##################################################################################
69 Int_t AliHLTHOMERProxyHandler::Initialize() {
70   // see header file for class documentation
71
72   Int_t iResult = 0 ;
73
74   IdentifyRealm();
75
76   return iResult;
77 }
78
79 /*
80  * ---------------------------------------------------------------------------------
81  *                             Source List - public
82  * ---------------------------------------------------------------------------------
83  */
84
85 //##################################################################################
86 Int_t AliHLTHOMERProxyHandler::FillSourceList(TList *srcList) {
87   // see header file for class documentation
88
89   Int_t iResult = 0;
90
91   fSourceList = srcList;
92
93   iResult = RequestXmlRpcResponse();
94
95   if (!iResult)
96     iResult = ProcessXmlRpcResponse();
97
98   if (iResult < 0) {
99     HLTError(Form("Filling SourceList failed."));
100   }
101
102   return iResult;
103 }
104
105 /*
106  * ---------------------------------------------------------------------------------
107  *                        Realms - private
108  * ---------------------------------------------------------------------------------
109  */
110
111 //##################################################################################
112 const Char_t *AliHLTHOMERProxyHandler::fgkHOMERProxyNode[] = { 
113   "portal-dcs0.internal", 
114   "alihlt-dcs0.cern.ch",
115   "alihlt-vobox0.cern.ch",
116   "alihlt-gw0.kip.uni-heidelberg.de",
117   "localhost",
118   "portal-dcs1.internal", 
119   "alihlt-dcs1.cern.ch",
120   "alihlt-vobox1.cern.ch",
121   "alihlt-gw1.kip.uni-heidelberg.de",
122   "localhost"
123 };
124
125 //##################################################################################
126 void AliHLTHOMERProxyHandler::IdentifyRealm() {
127   // see header file for class documentation
128
129   TString hostIP(gSystem->GetHostByName(gSystem->HostName()).GetHostAddress());
130
131   if ( hostIP.Contains("10.162.") )
132     fRealm = kHLT;
133   else if ( hostIP.Contains("10.160.") || hostIP.Contains("10.161.") )
134     fRealm = kACR;
135   else if ( hostIP.Contains("129.206.") )
136     fRealm = kKIP;
137   else  if ( hostIP.Contains("137.138") 
138              || hostIP.Contains("128.141") 
139              || hostIP.Contains("127.0.") 
140              )
141     fRealm = kGPN;
142   else {
143     fRealm = kLoc;
144   }
145
146   return;
147 }
148
149 /*
150  * ---------------------------------------------------------------------------------
151  *                        Proxy Communication - private
152  * ---------------------------------------------------------------------------------
153  */
154
155 //##################################################################################
156 Int_t AliHLTHOMERProxyHandler::RequestXmlRpcResponse() {
157   // see header file for class documentation
158
159   Int_t iResult = 0;
160
161   // -- open socket
162   // ----------------
163
164   Int_t proxyPort = 19999;
165
166   TSocket *socket = new TSocket(fgkHOMERProxyNode[fRealm], proxyPort);
167   if ( ! socket->IsValid() ) {
168     HLTWarning(Form("Failed to create socket to %s:%d,",fgkHOMERProxyNode[fRealm], proxyPort));
169     HLTWarning(Form("trying %s:%d now.", fgkHOMERProxyNode[fRealm+kHOMERRealmsMax],proxyPort));
170
171     socket = new TSocket(fgkHOMERProxyNode[fRealm+kHOMERRealmsMax], proxyPort);
172     if ( ! socket->IsValid() ) {
173       HLTError(Form("Failed to create socket to %s:%d and %s:%d.",
174                     fgkHOMERProxyNode[fRealm], proxyPort,
175                     fgkHOMERProxyNode[fRealm+kHOMERRealmsMax],proxyPort));
176
177       fRealm = -1;
178       return -1;
179     }
180     else
181       fRealm = fRealm+kHOMERRealmsMax;
182   }
183
184   // -- send request
185   // -----------------
186
187   Char_t reqMsg[] = "PUT / HTTP/1.1\r\n\
188 User-Agent: curl/7.18.0 (x86_64-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n\
189 Host: localhost:10000\r\n\
190 Accept: */*\r\n\
191 Content-type: text/xml\r\n\
192 Content-Length: 68\r\n\
193 \r\n<methodCall><methodName>getTcpDumpServices</methodName></methodCall>\r\n";
194
195   iResult = socket->SendRaw( reqMsg, strlen(reqMsg) );
196   if ( iResult < 1 || 
197        iResult !=  static_cast<Int_t>(strlen(reqMsg))) {
198     HLTError(Form("Error sending! -- send length %d  -- msg length %d.", iResult, static_cast<Int_t>(strlen(reqMsg)) ));
199     socket->Close();
200     return iResult;
201   }
202   
203   // -- receive answer
204   // -------------------
205
206   const Int_t bufferSize = 1024;
207   Char_t buffer[bufferSize];
208
209   Bool_t isXmlRpc = kFALSE;
210
211   fXmlRpcResponse = "";
212
213   // -- loop for getting full xmlRPC response
214   while(1) {
215
216     Int_t bufferLength = 0;
217     
218     // -- loop for reading until end of line
219     while (1) {
220
221       iResult = socket->RecvRaw(&buffer[bufferLength], 1);
222       if ( iResult < 0) {
223         HLTError(Form("Error reading form socket."));
224         socket->Close();
225         return iResult;
226       }
227             
228       // -- Checking for  end of line
229       if ( buffer[bufferLength] == 10 ) {
230         buffer[bufferLength] = 0;
231         break;
232       }
233       
234       ++bufferLength;
235     }
236
237     TString bufferString(buffer);
238
239     // -- Checking for start of XML response
240     if ( bufferString.BeginsWith("<?xml") )
241       isXmlRpc = kTRUE;
242
243     // -- Append the xml response
244     if (isXmlRpc) {
245       fXmlRpcResponse.Append(bufferString);
246     }
247
248     // -- Checking for end of XML response
249     if( ! bufferString.CompareTo("</methodResponse>") ) 
250       break;
251   }
252   
253   // -- close socket
254   socket->Close();
255
256   return 0;
257 }
258
259 //##################################################################################
260 Int_t AliHLTHOMERProxyHandler::ProcessXmlRpcResponse() {
261   // see header file for class documentation
262
263   Int_t iResult = 0;
264
265   // -- Parse XML RPC Response
266   // ---------------------------
267
268   TDOMParser xmlParser;
269   xmlParser.SetValidate(kFALSE);
270
271   HLTDebug(Form("XMLResponse: %s",fXmlRpcResponse.Data()));
272   
273   iResult = xmlParser.ParseBuffer(fXmlRpcResponse.Data(), fXmlRpcResponse.Length());
274   if ( iResult < 0 ) {
275     HLTError(Form("Parsing buffer with error: %s", 
276                   xmlParser.GetParseCodeMessage(xmlParser.GetParseCode()) ));
277     
278
279     return iResult;
280   }
281
282   TXMLNode * node = xmlParser.GetXMLDocument()->GetRootNode()->
283     GetChildren()->GetChildren()->GetChildren()->GetChildren();
284   
285   if ( strcmp( node->GetNodeName(), "string" ) ) {
286     HLTError(Form("No node 'string' in XmlRpcResponse."));
287     return -1;
288   }
289
290   // -- Parse Content
291   // ------------------
292
293   // -- Get Content
294   TString xmlContent(node->GetText() );
295
296   HLTDebug(Form("XMLContent: %s",xmlContent.Data()));
297
298   iResult = xmlParser.ParseBuffer(xmlContent.Data(), xmlContent.Length());
299   if ( iResult < 0 ) {
300     HLTError(Form("Parsing buffer with error: %s", 
301                   xmlParser.GetParseCodeMessage(xmlParser.GetParseCode()) ));
302
303     return iResult;
304   }
305   
306   if ( !xmlParser.GetXMLDocument()->GetRootNode()->HasChildren() ) {
307     HLTWarning(Form("No Services active."));
308     return 1;
309   }
310
311   // -- Loop over all service nodes
312   TXMLNode* serviceNode = xmlParser.GetXMLDocument()->GetRootNode()->GetChildren();
313   TXMLNode* prevServiceNode = NULL;
314   
315   do {
316     prevServiceNode = serviceNode;
317
318     // -- Add service to list
319     iResult = AddService( serviceNode->GetChildren() );
320     if ( iResult > 0 ) {
321       HLTWarning(Form("Incomplete Service not added."));
322       iResult = 0;
323     }
324   } while ( ( serviceNode = prevServiceNode->GetNextNode() ) && !iResult );
325
326
327
328   return iResult;
329 }
330
331 /*
332  * ---------------------------------------------------------------------------------
333  *                            Source Resolving - private
334  * ---------------------------------------------------------------------------------
335  */
336
337 //##################################################################################
338 Int_t AliHLTHOMERProxyHandler::AddService(TXMLNode *innerNode) {
339   // see header file for class documentation
340
341   Int_t iResult = 0;
342
343   HLTInfo(Form(">> New service"));    
344
345   TXMLNode* serviceNode = innerNode;
346
347   // -- Loop over all service properties and 
348   //    read them from the service tag
349   // -----------------------------------------
350
351   TString hostname          = "";
352   Int_t   port              = 0;
353   TString dataType          = "";
354   TString dataOrigin        = "";
355   TString dataSpecification = "";
356
357   TXMLNode* prevInnerNode = NULL;
358
359   // -- Retrieve hostname and port
360   // -------------------------------
361
362   do {
363     prevInnerNode = innerNode;
364     
365     if ( ! strcmp(innerNode->GetNodeName(), "text" ) )
366       continue;
367         
368     // -- hostname
369     if ( ! strcmp( innerNode->GetNodeName(), "address") ) {
370       HLTInfo(Form("  > %s ++ %s", innerNode->GetNodeName(), innerNode->GetText() ));
371       hostname = innerNode->GetText();
372     }
373     else if ( ! strcmp( innerNode->GetNodeName(), "port") ) {
374       HLTInfo(Form("  > %s ++ %s", innerNode->GetNodeName(), innerNode->GetText() ));
375       TString portS(innerNode->GetText());
376       if ( portS.IsDigit() )
377         port = portS.Atoi();
378       else {
379         HLTError(Form("Port %s is not a digit.", portS.Data()));
380         iResult = -1;
381       }
382     }
383   } while ( ( innerNode = prevInnerNode->GetNextNode() ) && !iResult );
384
385
386   // -- Change hostame from service with proxy, if outside HLT
387   if ( fRealm != kHLT && fRealm != kHLT+kHOMERRealmsMax )
388     hostname = fgkHOMERProxyNode[fRealm];
389
390
391   // -- Get Data Specifications from blocks
392   // ----------------------------------------
393
394   do {
395     prevInnerNode = serviceNode;
396
397     if ( strcmp( serviceNode->GetNodeName(), "blocks") )
398       continue;
399  
400     TXMLNode* blocks = serviceNode->GetChildren();
401
402     if ( ! blocks ) {
403       HLTError(Form("No blocks present"));
404       return 1;
405     }
406       
407     TXMLNode* blockNode = blocks->GetNextNode();
408     TXMLNode* prevBlockNode = NULL;
409
410     if ( ! blockNode ) {
411       HLTError(Form("No block present in the blocks tag"));
412       return 1;
413     }
414       
415     // -- blocks loop 
416     
417     do {
418       prevBlockNode = blockNode;
419       
420       if ( strcmp( blockNode->GetNodeName(), "block") )
421         continue;
422
423       TXMLNode *dataNode = blockNode->GetChildren();
424       TXMLNode *prevDataNode = NULL;
425
426       if ( ! dataNode ) {
427         HLTError(Form("No data specification tags present in block tag."));
428         return 1;
429       }
430       // -- data spec loop
431       
432       do {
433         prevDataNode = dataNode;
434
435         if ( ! strcmp(dataNode->GetNodeName(), "text" ) )
436           continue;
437
438         HLTInfo(Form(" %s ++ %s", dataNode->GetNodeName(), dataNode->GetText() ));      
439
440         if ( ! strcmp( dataNode->GetNodeName(), "dataorigin") ) {
441           dataOrigin = dataNode->GetText();
442         }
443         else if ( ! strcmp( dataNode->GetNodeName(), "datatype") ) {
444           dataType = dataNode->GetText();
445         }
446         else if ( ! strcmp( dataNode->GetNodeName(), "dataspecification") ) {
447           dataSpecification = dataNode->GetText();    
448         }
449       } while ( ( dataNode = prevDataNode->GetNextNode() ) && !iResult );
450       
451       // -- data spec loop
452
453       // -- Check the service properties
454       // ---------------------------------
455       
456       // -- Check for completeness of the source properties
457       if ( hostname.IsNull() || !port || dataOrigin.IsNull() ||
458            dataType.IsNull() || dataSpecification.IsNull() ) {
459         HLTWarning(Form("Service provides not all values:\n\thostname\t\t %s\n\tport\t\t\t %d\n\tdataorigin\t\t %s\n\tdatatype\t\t %s\n\tdataspecification\t 0x%08X", 
460                         hostname.Data(), port, dataOrigin.Data(), dataType.Data(), dataSpecification.Atoi()));
461         
462         return 1;
463       }
464
465       // -- Create new source
466       // ----------------------
467       
468       AliHLTHOMERSourceDesc * source = new AliHLTHOMERSourceDesc();
469       source->SetService( hostname, port, dataOrigin, dataType, dataSpecification );
470       
471       fSourceList->Add( source );
472       
473       HLTInfo(Form( "New Source added : %s", source->GetSourceName().Data()));
474
475     } while ( ( blockNode = prevBlockNode->GetNextNode() ) && !iResult );
476
477
478     // -- blocks loop
479     
480   } while ( ( serviceNode = prevInnerNode->GetNextNode() ) && !iResult );
481   
482   return iResult;
483 }
484
485