Seding mails to FXS experts in case of error, FXS base path in LDAP.
authorzampolli <zampolli@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 18 Mar 2008 17:22:48 +0000 (17:22 +0000)
committerzampolli <zampolli@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 18 Mar 2008 17:22:48 +0000 (17:22 +0000)
SHUTTLE/AliShuttle.cxx
SHUTTLE/AliShuttle.h
SHUTTLE/AliShuttleConfig.cxx
SHUTTLE/AliShuttleConfig.h
SHUTTLE/schema/shuttle.schema

index d5f2538..92f160c 100644 (file)
@@ -78,7 +78,7 @@ fPreprocessorMap(),
 fLogbookEntry(0),
 fCurrentDetector(),
 fFirstProcessing(0),
-fFXSError(kFALSE),
+fFXSError(-1),
 fStatusEntry(0),
 fMonitoringMutex(0),
 fLastActionTime(0),
@@ -1151,7 +1151,7 @@ Bool_t AliShuttle::ContinueProcessing()
                // Send mail to detector expert!
                Log("SHUTTLE", Form("ContinueProcessing - Sending mail to %s expert...", 
                                    fCurrentDetector.Data()));
-               if (!SendMail())
+               if (!SendMail(kPPEMail))
                        Log("SHUTTLE", Form("ContinueProcessing - Could not send mail to %s expert",
                                            fCurrentDetector.Data()));
 
@@ -1190,8 +1190,17 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        GetCurrentRun()));
 
        // Send the information to ML
+       CountOpenRuns();
+       
        TMonaLisaText  mlStatus("SHUTTLE_status", "Processing");
-       TMonaLisaText  mlRunType("SHUTTLE_runtype", Form("%s (%s)", entry->GetRunType(), entry->GetRunParameter("log")));
+       TString runType(entry->GetRunType());
+       if (strlen(entry->GetRunParameter("log")) > 0){
+
+               runType += "(";
+               runType += entry->GetRunParameter("log");
+               runType += ")";
+       }
+       TMonaLisaText  mlRunType("SHUTTLE_runtype", runType);
 
        TList mlList;
        mlList.Add(&mlStatus);
@@ -1525,6 +1534,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        fFirstUnprocessed[iDet] = kFALSE;
                                }
                        }
+                       TMonaLisaText  mlStatusPending("SHUTTLE_status", "Pending");
+                       mlList.Clear();
+                       mlList.Add(&mlStatusPending);
+                       fMonaLisa->SendParameters(&mlList, mlID);
                }
        }
 
@@ -1610,7 +1623,7 @@ Bool_t AliShuttle::ProcessCurrentDetector()
                                                        " Sending mail to DCS experts!", host.Data()));
                                        UpdateShuttleStatus(AliShuttleStatus::kDCSError);
                                        
-                                       if (!SendMailToDCS())
+                                       if (!SendMail(kDCSEMail))
                                                Log("SHUTTLE", Form("ProcessCurrentDetector - "
                                                                    "Could not send mail to DCS experts!"));
 
@@ -1632,7 +1645,7 @@ Bool_t AliShuttle::ProcessCurrentDetector()
                                                        " Sending mail to DCS experts!", host.Data()));
                                        UpdateShuttleStatus(AliShuttleStatus::kDCSError);
                                        
-                                       if (!SendMailToDCS())
+                                       if (!SendMail(kDCSEMail))
                                                Log("SHUTTLE", Form("ProcessCurrentDetector - "
                                                                    "Could not send mail to DCS experts!"));
                                        
@@ -1675,12 +1688,13 @@ Bool_t AliShuttle::ProcessCurrentDetector()
        // DCS Archive DB processing successful. Call Preprocessor!
        UpdateShuttleStatus(AliShuttleStatus::kPPStarted);
 
-       fFXSError = kFALSE; // this variable is kTRUE after ::Process if an FXS error occured
+       fFXSError = -1; // this variable is kTRUE after ::Process if an FXS error occured
        
        UInt_t returnValue = aPreprocessor->Process(dcsMap);
        
-       if (fFXSError) {
+       if (fFXSError!=-1) {
                UpdateShuttleStatus(AliShuttleStatus::kFXSError);
+               SendMail(kFXSEMail, fFXSError);
                dcsMap->DeleteAll();
                delete dcsMap;
                return kFALSE;
@@ -2040,7 +2054,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
        if (!Connect(system))
        {
                Log(detector, Form("GetFile - Couldn't connect to %s FXS database", GetSystemName(system)));
-               fFXSError = kTRUE;
+               fFXSError = system;
                return 0;
        }
 
@@ -2075,7 +2089,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
        if (!aResult) {
                Log(detector, Form("GetFile - Can't execute SQL query to %s database for: id = %s, source = %s",
                                GetSystemName(system), id, sourceName.Data()));
-               fFXSError = kTRUE;
+               fFXSError = system;
                return 0;
        }
 
@@ -2092,7 +2106,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
                Log(detector,
                        Form("GetFile - More than one entry in %s FXS db for: id = %s, source = %s",
                                GetSystemName(system), id, sourceName.Data()));
-               fFXSError = kTRUE;
+               fFXSError = system;
                delete aResult;
                return 0;
        }
@@ -2101,7 +2115,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
                Log(detector,
                        Form("GetFileName - Wrong field count in %s FXS db for: id = %s, source = %s",
                                GetSystemName(system), id, sourceName.Data()));
-               fFXSError = kTRUE;
+               fFXSError = system;
                delete aResult;
                return 0;
        }
@@ -2111,7 +2125,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
        if (!aRow){
                Log(detector, Form("GetFile - Empty set result in %s FXS db from query: id = %s, source = %s",
                                GetSystemName(system), id, sourceName.Data()));
-               fFXSError = kTRUE;
+               fFXSError = system;
                delete aResult;
                return 0;
        }
@@ -2172,7 +2186,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
                {
                        // compare md5sum of local file with the one stored in the FXS DB
                        if(fileChecksum.Contains(' ')) fileChecksum.Resize(fileChecksum.First(' '));
-                       Int_t md5Comp = gSystem->Exec(Form("md5sum %s |grep %s 2>&1 > /dev/null",
+                       Int_t md5Comp = gSystem->Exec(Form("md5sum %s |grep %s > /dev/null 2> /dev/null",
                                                localFileName.Data(), fileChecksum.Data()));
 
                        if (md5Comp != 0)
@@ -2191,7 +2205,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
 
        if (!result) 
        {
-               fFXSError = kTRUE;
+               fFXSError = system;
                return 0;
        }
 
@@ -2234,26 +2248,11 @@ Bool_t AliShuttle::RetrieveFile(UInt_t system, const char* fxsFileName, const ch
                }
        }
 
-       TString baseFXSFolder;
-       if (system == kDAQ)
-       {
-               baseFXSFolder = "FES/";
-       }
-       else if (system == kDCS)
-       {
-               baseFXSFolder = "";
-       }
-       else if (system == kHLT)
-       {
-               baseFXSFolder = "/opt/FXS/";
-       }
-
-
-       TString command = Form("scp -oPort=%d -2 %s@%s:%s%s %s",
+       TString command = Form("scp -oPort=%d -2 %s@%s:%s/%s %s",
                fConfig->GetFXSPort(system),
                fConfig->GetFXSUser(system),
                fConfig->GetFXSHost(system),
-               baseFXSFolder.Data(),
+               fConfig->GetFXSBaseFolder(system),
                fxsFileName,
                localFileName);
 
@@ -2299,7 +2298,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char
        if (!Connect(system))
        {
                Log(detector, Form("GetFileSources - Couldn't connect to %s FXS database", GetSystemName(system)));
-               fFXSError = kTRUE;
+               fFXSError = system;
                return NULL;
        }
 
@@ -2327,7 +2326,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char
        if (!aResult) {
                Log(detector, Form("GetFileSources - Can't execute SQL query to %s database for id: %s",
                                GetSystemName(system), id));
-               fFXSError = kTRUE;
+               fFXSError = system;
                return 0;
        }
 
@@ -3039,7 +3038,7 @@ AliCDBEntry* AliShuttle::GetFromOCDB(const char* detector, const AliCDBPath& pat
 }
 
 //______________________________________________________________________________________________
-Bool_t AliShuttle::SendMail()
+Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system)
 {
        //
        // sends a mail to the subdetector expert in case of preprocessor error
@@ -3051,20 +3050,9 @@ Bool_t AliShuttle::SendMail()
        if (!fConfig->SendMail()) 
                return kTRUE;
 
-       TString to="";
-       TIter iterExperts(fConfig->GetResponsibles(fCurrentDetector));
-       TObjString *anExpert=0;
-       while ((anExpert = (TObjString*) iterExperts.Next()))
-       {
-               to += Form("%s,", anExpert->GetName());
-       }
-       if (to.Length() > 0)
-         to.Remove(to.Length()-1);
-       AliDebug(2, Form("to: %s",to.Data()));
-
-       if (to.IsNull()) {
-               Log("SHUTTLE", "List of detector responsibles not set!");
-               return kFALSE;
+       if (target == kDCSEMail || target == kFXSEMail) {
+               if (!fFirstProcessing)
+               return kTRUE;
        }
 
        void* dir = gSystem->OpenDirectory(GetShuttleLogDir());
@@ -3080,19 +3068,34 @@ Bool_t AliShuttle::SendMail()
                gSystem->FreeDirectory(dir);
        }
 
-       TString bodyFileName;
-       bodyFileName.Form("%s/mail.body", GetShuttleLogDir());
-       gSystem->ExpandPathName(bodyFileName);
-
-       ofstream mailBody;
-       mailBody.open(bodyFileName, ofstream::out);
-
-       if (!mailBody.is_open())
+       // det experts in to
+       TString to="";
+       TIter *iterExperts;
+       if (target == kDCSEMail) {
+               iterExperts = new TIter(fConfig->GetAdmins(AliShuttleConfig::kAmanda));
+       }
+       else if (target == kFXSEMail) {
+               iterExperts = new TIter(fConfig->GetAdmins(system));
+       }
+       else {
+               iterExperts = new TIter(fConfig->GetResponsibles(fCurrentDetector));
+       }
+       TObjString *anExpert=0;
+       while ((anExpert = (TObjString*) iterExperts->Next()))
        {
-               Log("SHUTTLE", Form("Could not open mail body file %s", bodyFileName.Data()));
-               return kFALSE;
-       }
+               to += Form("%s,", anExpert->GetName());
+       }
+       delete iterExperts;
+       if (to.Length() > 0)
+         to.Remove(to.Length()-1);
+       AliDebug(2, Form("to: %s",to.Data()));
 
+       if (to.IsNull()) {
+               Log("SHUTTLE", Form("List of %d responsibles not set!", (Int_t) target));
+               return kFALSE;
+       }
+
+       // SHUTTLE responsibles in cc
        TString cc="";
        TIter iterAdmins(fConfig->GetAdmins(AliShuttleConfig::kGlobal));
        TObjString *anAdmin=0;
@@ -3104,102 +3107,7 @@ Bool_t AliShuttle::SendMail()
          cc.Remove(cc.Length()-1);
        AliDebug(2, Form("cc: %s",to.Data()));
 
-       TString subject = Form("%s Shuttle preprocessor FAILED in run %d (run type = %s)!",
-                               fCurrentDetector.Data(), GetCurrentRun(), GetRunType());
-       AliDebug(2, Form("subject: %s", subject.Data()));
-
-       TString body = Form("Dear %s expert(s), \n\n", fCurrentDetector.Data());
-       body += Form("SHUTTLE just detected that your preprocessor "
-                       "failed processing run %d (run type = %s)!!\n\n", 
-                                       GetCurrentRun(), GetRunType());
-       body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", 
-                               fCurrentDetector.Data());
-       if (fConfig->GetRunMode() == AliShuttleConfig::kTest)
-       {
-               body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \n\n");
-       } else {
-               body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD&time=168 \n\n");
-       }
-       
-       
-       TString logFolder = "logs";
-       if (fConfig->GetRunMode() == AliShuttleConfig::kProd) 
-               logFolder += "_PROD";
-       
-       
-       body += Form("Find the %s log for the current run on \n\n"
-               "\thttp://pcalishuttle01.cern.ch:8880/%s/%d/%s_%d.log \n\n", 
-               fCurrentDetector.Data(), logFolder.Data(), GetCurrentRun(), 
-                               fCurrentDetector.Data(), GetCurrentRun());
-       body += Form("The last 10 lines of %s log file are following:\n\n", fCurrentDetector.Data());
-
-       AliDebug(2, Form("Body begin: %s", body.Data()));
-
-       mailBody << body.Data();
-       mailBody.close();
-       mailBody.open(bodyFileName, ofstream::out | ofstream::app);
-
-       TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(), 
-               GetCurrentRun(), fCurrentDetector.Data(), GetCurrentRun());
-       TString tailCommand = Form("tail -n 10 %s >> %s", logFileName.Data(), bodyFileName.Data());
-       if (gSystem->Exec(tailCommand.Data()))
-       {
-               mailBody << Form("%s log file not found ...\n\n", fCurrentDetector.Data());
-       }
-
-       TString endBody = Form("------------------------------------------------------\n\n");
-       endBody += Form("In case of problems please contact the SHUTTLE core team.\n\n");
-       endBody += "Please do not answer this message directly, it is automatically generated.\n\n";
-       endBody += "Greetings,\n\n \t\t\tthe SHUTTLE\n";
-
-       AliDebug(2, Form("Body end: %s", endBody.Data()));
-
-       mailBody << endBody.Data();
-
-       mailBody.close();
-
-       // send mail!
-       TString mailCommand = Form("mail -s \"%s\" -c %s %s < %s",
-                                               subject.Data(),
-                                               cc.Data(),
-                                               to.Data(),
-                                               bodyFileName.Data());
-       AliDebug(2, Form("mail command: %s", mailCommand.Data()));
-
-       Bool_t result = gSystem->Exec(mailCommand.Data());
-
-       return result == 0;
-}
-
-//______________________________________________________________________________________________
-Bool_t AliShuttle::SendMailToDCS()
-{
-       //
-       // sends a mail to the DCS Amanda experts in case of DCS data point retrieval error
-       //
-       
-       if (fTestMode != kNone)
-               return kTRUE;
-
-       if (!fConfig->SendMail()) 
-               return kTRUE;
-
-       if (!fFirstProcessing)
-               return kTRUE;
-
-       void* dir = gSystem->OpenDirectory(GetShuttleLogDir());
-       if (dir == NULL)
-       {
-               if (gSystem->mkdir(GetShuttleLogDir(), kTRUE))
-               {
-                       Log("SHUTTLE", Form("SendMailToDCS - Can't open directory <%s>", GetShuttleLogDir()));
-                       return kFALSE;
-               }
-
-       } else {
-               gSystem->FreeDirectory(dir);
-       }
-
+       // mail body 
        TString bodyFileName;
        bodyFileName.Form("%s/mail.body", GetShuttleLogDir());
        gSystem->ExpandPathName(bodyFileName);
@@ -3209,53 +3117,57 @@ Bool_t AliShuttle::SendMailToDCS()
 
        if (!mailBody.is_open())
        {
-               Log("SHUTTLE", Form("SendMailToDCS - Could not open mail body file %s", bodyFileName.Data()));
+               Log("SHUTTLE", Form("Could not open mail body file %s", bodyFileName.Data()));
                return kFALSE;
        }
 
-       TString to="";
-       TIter iterExperts(fConfig->GetAdmins(AliShuttleConfig::kAmanda));
-       TObjString *anExpert=0;
-       while ((anExpert = (TObjString*) iterExperts.Next()))
-       {
-               to += Form("%s,", anExpert->GetName());
-       }
-       if (to.Length() > 0)
-         to.Remove(to.Length()-1);
-       AliDebug(2, Form("to: %s",to.Data()));
 
-       if (to.IsNull()) {
-               Log("SHUTTLE", "List of Amanda server administrators not set!");
-               return kFALSE;
-       }
+       TString subject;
+       TString body;
 
-       TString cc="";
-       TIter iterAdmins(fConfig->GetAdmins(AliShuttleConfig::kGlobal));
-       TObjString *anAdmin=0;
-       while ((anAdmin = (TObjString*) iterAdmins.Next()))
-       {
-               cc += Form("%s,", anAdmin->GetName());
+       if (target == kDCSEMail){
+               subject = Form("Retrieval of data points for %s FAILED in run %d !",
+                               fCurrentDetector.Data(), GetCurrentRun());
+               AliDebug(2, Form("subject: %s", subject.Data()));
+               
+               body = Form("Dear DCS experts, \n\n");
+               body += Form("SHUTTLE couldn\'t retrieve the data points for detector %s "
+                            "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun());
        }
-       if (cc.Length() > 0)
-         cc.Remove(cc.Length()-1);
-       AliDebug(2, Form("cc: %s",to.Data()));
-
-       TString subject = Form("Retrieval of data points for %s FAILED in run %d !",
+       else if (target == kFXSEMail){
+               subject = Form("FXS communication for %s FAILED in run %d !",
                                fCurrentDetector.Data(), GetCurrentRun());
-       AliDebug(2, Form("subject: %s", subject.Data()));
+               AliDebug(2, Form("subject: %s", subject.Data()));
+               TString sys;
+               if (system == kDAQ) sys="DAQ";
+               else if (system == kDCS) sys="DCS";
+               else if (system == kHLT) sys="HLT";
+               else return kFALSE;
+               body = Form("Dear  %s FXS experts, \n\n");
+               body += Form("SHUTTLE couldn\'t retrieve data from the FXS for detector %s "
+                            "in run %d!!\n\n", sys.Data(),fCurrentDetector.Data(), GetCurrentRun());
+       }
+       else {
+               subject = Form("%s Shuttle preprocessor FAILED in run %d (run type = %s)!",
+                                      fCurrentDetector.Data(), GetCurrentRun(), GetRunType());
+               AliDebug(2, Form("subject: %s", subject.Data()));
+       
+               body = Form("Dear %s expert(s), \n\n", fCurrentDetector.Data());
+               body += Form("SHUTTLE just detected that your preprocessor "
+                            "failed processing run %d (run type = %s)!!\n\n", 
+                            GetCurrentRun(), GetRunType());
+       }
 
-       TString body = Form("Dear DCS experts, \n\n");
-       body += Form("SHUTTLE couldn\'t retrieve the data points for detector %s "
-                       "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun());
        body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", 
                                fCurrentDetector.Data());
        if (fConfig->GetRunMode() == AliShuttleConfig::kTest)
        {
                body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \n\n");
        } else {
-               body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD?time=168 \n\n");
+               body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD&time=168 \n\n");
        }
-
+       
+       
        TString logFolder = "logs";
        if (fConfig->GetRunMode() == AliShuttleConfig::kProd) 
                logFolder += "_PROD";
@@ -3273,8 +3185,8 @@ Bool_t AliShuttle::SendMailToDCS()
        mailBody.close();
        mailBody.open(bodyFileName, ofstream::out | ofstream::app);
 
-       TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(), GetCurrentRun(),
-               fCurrentDetector.Data(), GetCurrentRun());
+       TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(), 
+               GetCurrentRun(), fCurrentDetector.Data(), GetCurrentRun());
        TString tailCommand = Form("tail -n 10 %s >> %s", logFileName.Data(), bodyFileName.Data());
        if (gSystem->Exec(tailCommand.Data()))
        {
index a0ebbf5..73d8a07 100644 (file)
@@ -33,6 +33,7 @@ class AliShuttle: public AliShuttleInterface {
 public:
        enum DCSType {kAlias=0, kDP};
        enum TestMode { kNone = 0, kSkipDCS = 1, kErrorDCS = 2, kErrorFXSSources = 4, kErrorFXSFiles = 8, kErrorOCDB = 16, kErrorStorage = 32, kErrorGrid = 64 };
+       enum EMailTarget { kDCSEMail = 0, kFXSEMail, kPPEMail };
 
        AliShuttle(const AliShuttleConfig* config, UInt_t timeout = 5000, Int_t retries = 5);
        virtual ~AliShuttle();
@@ -121,8 +122,7 @@ private:
        Bool_t ContinueProcessing();
        void UpdateShuttleStatus(AliShuttleStatus::Status newStatus, Bool_t increaseCount = kFALSE);
        Bool_t UpdateShuttleLogbook(const char* detector, const char* status=0);
-       Bool_t SendMail();
-       Bool_t SendMailToDCS();
+       Bool_t SendMail(EMailTarget target, Int_t system = -1);
        
        TString GetLogFileName(const char* detector) const;
 
@@ -145,7 +145,7 @@ private:
        TSQLServer *fServer[4];         // pointer to the three FXS + Run & Shuttle logbook servers
        Bool_t fFXSCalled[3];           // FXS call status
        TList  fFXSlist[3];             // List of files retrieved from each FXS
-       Bool_t fFXSError;               // Bool to keep track of any FXS errors
+       Int_t  fFXSError;               // Variable to keep track of any FXS errors; contains -1 for no error, kDAQ, kDCS, kHLT otherwise
 
        AliCDBEntry* fStatusEntry; // last CDB entry containing a AliShuttleStatus retrieved
 
index b707e9e..ebc0ecf 100644 (file)
@@ -306,6 +306,7 @@ AliShuttleConfig::AliShuttleConfig(const AliShuttleConfig & other):
                fFXSPort[i]=other.fFXSPort[i];
                fFXSUser[i]=other.fFXSUser[i];
                fFXSPass[i]=other.fFXSPass[i];
+               fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
                fFXSdbHost[i]=other.fFXSdbHost[i];
                fFXSdbPort[i]=other.fFXSdbPort[i];
                fFXSdbUser[i]=other.fFXSdbUser[i];
@@ -366,6 +367,7 @@ AliShuttleConfig& AliShuttleConfig::operator=(const AliShuttleConfig &other)
                this->fFXSPort[i]=other.fFXSPort[i];
                this->fFXSUser[i]=other.fFXSUser[i];
                this->fFXSPass[i]=other.fFXSPass[i];
+               this->fFXSBaseFolder[i]=other.fFXSBaseFolder[i];
                this->fFXSdbHost[i]=other.fFXSdbHost[i];
                this->fFXSdbPort[i]=other.fFXSdbPort[i];
                this->fFXSdbUser[i]=other.fFXSdbUser[i];
@@ -1362,6 +1364,9 @@ UInt_t AliShuttleConfig::SetSysConfig(TList* list)
 
                anAttribute = anEntry->GetAttribute("fxsPasswd");
                if (anAttribute) fFXSPass[iSys] = anAttribute->GetValue();
+
+               anAttribute = anEntry->GetAttribute("fxsBaseFolder");
+               if (anAttribute) fFXSBaseFolder[iSys] = anAttribute->GetValue();
        
                anAttribute = anEntry->GetAttribute("fxsAdmin"); // MAY
                if (!anAttribute)
index e905221..e77746c 100644 (file)
@@ -47,6 +47,7 @@ public:
        UInt_t      GetFXSPort(Int_t sys) const {return fFXSPort[sys];}
        const char* GetFXSUser(Int_t sys) const {return fFXSUser[sys].Data();}
        const char* GetFXSPass(Int_t sys) const {return fFXSPass[sys].Data();}
+       const char* GetFXSBaseFolder(Int_t sys) const {return fFXSBaseFolder[sys].Data();}
 
        const char* GetFXSdbHost(Int_t sys) const {return fFXSdbHost[sys].Data();}
        UInt_t      GetFXSdbPort(Int_t sys) const {return fFXSdbPort[sys];}
@@ -198,6 +199,7 @@ private:
        UInt_t  fFXSPort[3];            // Port of the [DAQ, DCS, HLT] File eXchange Server
        TString fFXSUser[3];            // username of the [DAQ, DCS, HLT] File eXchange Server
        TString fFXSPass[3];            // password of the [DAQ, DCS, HLT] File eXchange Server
+       TString fFXSBaseFolder[3];      // base folder of the [DAQ, DCS, HLT] File eXchange Server
 
        TString fFXSdbHost[3];          // Host of the [DAQ, DCS, HLT] FXS database
        UInt_t  fFXSdbPort[3];          // Port of the [DAQ, DCS, HLT] FXS database
index bec4bf8..aa80c5e 100644 (file)
@@ -30,24 +30,25 @@ objectclass ( DCS_CONFIG
 
 objectidentifier FXS_CONFIG SHUTTLE_BASE:3
 
-attributetype ( FXS_CONFIG:1  NAME 'system'     DESC 'System name (DAQ, DCS, HLT)'  EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:2  NAME 'dbHost'     DESC 'FXS MySQL DB host'            EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:3  NAME 'dbPort'     DESC 'FXS MySQL DB port'                                      SUP ipServicePort SINGLE-VALUE )
-attributetype ( FXS_CONFIG:4  NAME 'dbUser'     DESC 'FXS MySQL DB user'            EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:5  NAME 'dbPasswd'    DESC 'FXS MySQL DB passwd'         EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:6  NAME 'dbName'     DESC 'FXS MySQL DB name'            EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:7  NAME 'dbTable'    DESC 'FXS MySQL DB table'           EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:8  NAME 'fxsHost'    DESC 'FXS host'                     EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:9  NAME 'fxsPort'    DESC 'FXS port'                                               SUP ipServicePort SINGLE-VALUE )
-attributetype ( FXS_CONFIG:10 NAME 'fxsUser'    DESC 'FXS user'                     EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:11 NAME 'fxsPasswd'   DESC 'FXS Password'                EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
-attributetype ( FXS_CONFIG:12 NAME 'fxsAdmin'    DESC 'FXS admin(s) email address' EQUALITY caseIgnoreIA5Match SUP mail )
+attributetype ( FXS_CONFIG:1  NAME 'system'            DESC 'System name (DAQ, DCS, HLT)'  EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:2  NAME 'dbHost'            DESC 'FXS MySQL DB host'             EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:3  NAME 'dbPort'            DESC 'FXS MySQL DB port'                                       SUP ipServicePort SINGLE-VALUE )
+attributetype ( FXS_CONFIG:4  NAME 'dbUser'            DESC 'FXS MySQL DB user'             EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:5  NAME 'dbPasswd'          DESC 'FXS MySQL DB passwd'           EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:6  NAME 'dbName'            DESC 'FXS MySQL DB name'             EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:7  NAME 'dbTable'           DESC 'FXS MySQL DB table'            EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:8  NAME 'fxsHost'           DESC 'FXS host'                      EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:9  NAME 'fxsPort'           DESC 'FXS port'                                                SUP ipServicePort SINGLE-VALUE )
+attributetype ( FXS_CONFIG:10 NAME 'fxsUser'           DESC 'FXS user'              EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:11 NAME 'fxsPasswd'         DESC 'FXS Password'                  EQUALITY caseIgnoreMatch  SUP name SINGLE-VALUE )
+attributetype ( FXS_CONFIG:12 NAME 'fxsAdmin'          DESC 'FXS admin(s) email address' EQUALITY caseIgnoreIA5Match SUP mail )
+attributetype ( FXS_CONFIG:13 NAME 'fxsBaseFolder'     DESC 'FXS Base Folder'               EQUALITY caseIgnoreMatch SUP name SINGLE-VALUE )
 
 objectclass ( FXS_CONFIG
         NAME 'fxsConfig'
         DESC 'ALICE: Configuration of the Shuttle for access to the File Exchange Servers'
         SUP top
-        MUST (system $ dbHost $ dbUser $ dbPasswd $ dbName $ dbTable $ fxsHost $ fxsUser )
+        MUST (system $ dbHost $ dbUser $ dbPasswd $ dbName $ dbTable $ fxsHost $ fxsUser $ fxsBaseFolder)
         MAY ( dbPort $ fxsPasswd $ fxsPort $ fxsAdmin) )