/////////////////////////////////////////////////////////////////////////////// // Andrea Castro December 19, 2005 // stores plots and HTML files into $OFFLINE_MON_DIR /////////////////////////////////////////////////////////////////////////////// #include "TSystem.h" #include "TFile.h" #include "TTree.h" #include "TH1.h" #include "TProfile.h" #include "TLine.h" #include "TCanvas.h" #include "TPaveText.h" #include "TStyle.h" #include /* Directory information. */ #include #include "OfflineMon/TGlobalMonitor.hh" ClassImp(TGlobalMonitor) ClassImp(TGlobalMonitor::Data_t) //_____________________________________________________________________________ TGlobalMonitor::TGlobalMonitor(const char* Name): TOfflineMonitor(Name) { fData = new TGlobalMonitor::Data_t(); } //_____________________________________________________________________________ TGlobalMonitor::~TGlobalMonitor() { delete fData; } //_____________________________________________________________________________ int TGlobalMonitor::Init() { printf(" inside TGlobalMonitor::Init()\n"); // AC // Enstore fStatus.fEnstoreStatus=0; // Calibrations fStatus.fCalibrationsStatus=0; // dCache fStatus.fDCacheStatus=0; // Condor CAF fStatus.fCafCondorStatus=0; // Group CAF fStatus.fCafGroupStatus=0; // Production farm fStatus.fFarmStatus=0; // other not implemented return 0; } //_____________________________________________________________________________ int TGlobalMonitor::GetStatus() { printf(" inside TGlobalMonitor::GetStatus()\n"); // AC // first checks if the files are there int stat1, stat2, stat3, stat4, stat5, stat6, stat7, stat8, stat9; int numGroups, numAdmNodes, numPoolNodes; bool exist; struct stat buffer; FILE* f; char sqlDateTime[22]; // date+time in sql format char dummy1[20], dummy2[20]; float timeDiff; TDatime now; bool monDown=false; fStatus.fGlobalTime = now; // look for disabled systems fStatus.fEnstoreEnabled=fStatus.fFarmEnabled=fStatus.fCalibrationsEnabled=fStatus.fDCacheEnabled=fStatus.fCafCondorEnabled=fStatus.fCafGroupEnabled=true; TString parsFile; char dummy[200]; int mask; const char* mon_dir = gSystem->Getenv("OFFLINE_MON_DIR"); parsFile = TString(mon_dir) + "/GlobalMonitor/Enabled.dat"; FILE* fIn = fopen(parsFile.Data(),"r"); while(fscanf(fIn,"%s %d", dummy, &mask)!=EOF) { if(strncmp(dummy,"ENSTORE",7)==0 && mask==1) fStatus.fEnstoreEnabled=false; if(strncmp(dummy,"PRODFARM",8)==0 && mask==1) fStatus.fFarmEnabled=false; if(strncmp(dummy,"CALIBS",6)==0 && mask==1) fStatus.fCalibrationsEnabled=false; if(strncmp(dummy,"ANADCACHE",9)==0 && mask==1) fStatus.fDCacheEnabled=false; if(strncmp(dummy,"CONDORCAF",9)==0 && mask==1) fStatus.fCafCondorEnabled=false; if(strncmp(dummy,"GROUPCAF",8)==0 && mask==1) fStatus.fCafGroupEnabled=false; } // Enstore exist=false; sprintf(fStatus.fEnstoreFileName,"%s/EnstoreMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fEnstoreFileName, &buffer)) { // the file exists exist = true; fStatus.fEnstoreStatus=0; f = fopen(fStatus.fEnstoreFileName,"r"); fscanf(f,"%d %d", &stat1, &stat2); // global status, movers status if(fStatus.fEnstoreEnabled) { if(stat1==1 || stat2==1) fStatus.fEnstoreStatus=1; if(stat1==2 || stat2==2) fStatus.fEnstoreStatus=2; } fscanf(f,"%s %s", dummy1, dummy2); sprintf(sqlDateTime,"%s %s", dummy1, dummy2); fStatus.fEnstoreTime=TDatime(sqlDateTime); } fStatus.fEnstoreExist = exist; timeDiff = now.Convert() - fStatus.fEnstoreTime.Convert(); timeDiff/=60.; if(timeDiff > TIMEDOWN && fStatus.fEnstoreEnabled) monDown=true; // Calibrations exist=false; sprintf(fStatus.fCalibrationsFileName,"%s/CalibrationsMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fCalibrationsFileName, &buffer)) { // the file exists exist = true; fStatus.fCalibrationsStatus=0; f = fopen(fStatus.fCalibrationsFileName,"r"); fscanf(f,"%d %d %d %d %d %d", &stat1, &stat2, &stat3, &stat4, &stat5, &stat6); if(fStatus.fCalibrationsEnabled) { if(stat1==1 || stat2==1 || stat3==1 || stat4==1 || stat5==1 || stat6==1) fStatus.fCalibrationsStatus=1; if(stat1==2 || stat2==2 || stat3==2 || stat4==2 || stat5==2 || stat6==2) fStatus.fCalibrationsStatus=2; if(stat1==3 || stat2==3 || stat3==3 || stat4==3 || stat5==3 || stat6==3) fStatus.fCalibrationsStatus=3; if(stat1==4 || stat2==4 || stat3==4 || stat4==4 || stat5==4 || stat6==4) fStatus.fCalibrationsStatus=4; } fscanf(f,"%s %s", dummy1, dummy2); sprintf(sqlDateTime,"%s %s", dummy1, dummy2); fStatus.fCalibrationsTime=TDatime(sqlDateTime); } fStatus.fCalibrationsExist = exist; timeDiff = now.Convert() - fStatus.fCalibrationsTime.Convert(); timeDiff/=60.; if(timeDiff > TIMEDOWN &&fStatus.fCalibrationsEnabled) monDown=true; // dCache exist=false; sprintf(fStatus.fDCacheFileName,"%s/DCacheMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fDCacheFileName, &buffer)) { // the file exists exist = true; fStatus.fDCacheStatus=0; f = fopen(fStatus.fDCacheFileName,"r"); fscanf(f,"%d", &stat1); if(fStatus.fDCacheEnabled) { fStatus.fDCacheStatus=stat1; } fscanf(f,"%d %d %d", &numGroups, &numAdmNodes, &numPoolNodes); for(int i=0; i TIMEDOWN && fStatus.fDCacheEnabled) monDown=true; // Condor CAF exist=false; sprintf(fStatus.fCafCondorFileName,"%s/CafCondorMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fCafCondorFileName, &buffer)) { // the file exists exist = true; fStatus.fCafCondorStatus=0; f = fopen(fStatus.fCafCondorFileName,"r"); fscanf(f,"%d %d %d %d", &stat1, &stat2, &stat3, &stat4); if(fStatus.fCafCondorEnabled) { if(stat1==1 || stat2==1 || stat3==1 || stat4==1) fStatus.fCafCondorStatus=1; if(stat1==2 || stat2==2 || stat3==2 || stat4==2) fStatus.fCafCondorStatus=2; } fscanf(f,"%s %s", dummy1, dummy2); sprintf(sqlDateTime,"%s %s", dummy1, dummy2); fStatus.fCafCondorTime=TDatime(sqlDateTime); } fStatus.fCafCondorExist = exist; timeDiff = now.Convert() - fStatus.fCafCondorTime.Convert(); timeDiff/=60.; if(timeDiff > TIMEDOWN && fStatus.fCafCondorEnabled) monDown=true; // Group CAF exist=false; sprintf(fStatus.fCafGroupFileName,"%s/CafGroupMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fCafGroupFileName, &buffer)) { // the file exists exist = true; fStatus.fCafGroupStatus=0; f = fopen(fStatus.fCafGroupFileName,"r"); fscanf(f,"%d %d %d %d", &stat1, &stat2, &stat3, &stat4); if(fStatus.fCafGroupEnabled) { if(stat1==1 || stat2==1 || stat3==1 || stat4==1) fStatus.fCafGroupStatus=1; if(stat1==2 || stat2==2 || stat3==2 || stat4==2) fStatus.fCafGroupStatus=2; } fscanf(f,"%s %s", dummy1, dummy2); sprintf(sqlDateTime,"%s %s", dummy1, dummy2); fStatus.fCafGroupTime=TDatime(sqlDateTime); } fStatus.fCafGroupExist = exist; timeDiff = now.Convert() - fStatus.fCafGroupTime.Convert(); timeDiff/=60.; if(timeDiff > TIMEDOWN && fStatus.fCafGroupEnabled) monDown=true; // Prod Farm exist=false; sprintf(fStatus.fFarmFileName,"%s/ProdFarmMonitor/Status.dat", gSystem->Getenv("OFFLINE_MON_DIR")); if (!stat(fStatus.fFarmFileName, &buffer)) { // the file exists exist = true; fStatus.fFarmStatus=0; f = fopen(fStatus.fFarmFileName,"r"); fscanf(f,"%d %d %d %d %d", &stat1, &stat2, &stat3, &stat4, &numGroups); // free space, aveconc, aveencp, global status, number of projects for(int i=0; i TIMEDOWN && fStatus.fFarmEnabled) monDown=true; // now make global status fStatus.fGlobalStatus=0; if(fStatus.fEnstoreStatus==1 || fStatus.fCalibrationsStatus==1 || fStatus.fDCacheStatus==1 || fStatus.fCafCondorStatus==1 || fStatus.fCafGroupStatus==1 || fStatus.fFarmStatus==1) fStatus.fGlobalStatus=1; if(fStatus.fEnstoreStatus==2 || fStatus.fCalibrationsStatus==2 || fStatus.fDCacheStatus==2 || fStatus.fCafCondorStatus==2 || fStatus.fCafGroupStatus==2 || fStatus.fFarmStatus==2) fStatus.fGlobalStatus=2; if(monDown) fStatus.fGlobalStatus=4; // one or more Monitors not updating // // write the status file // TString statusFile; statusFile = fHtmlDirectory + "/Status.dat"; FILE* fOut = fopen(statusFile,"w"); TDatime time; time = TDatime(); fprintf(fOut,"%d\n", fStatus.fGlobalStatus); fprintf(fOut,"%s", time.AsSQLString()); fclose(fOut); // write the enabled flags TString inFile, outFile; if (fStatus.fEnstoreEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/EnstoreMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); if (fStatus.fCalibrationsEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/CalibrationsMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); if (fStatus.fFarmEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/ProdFarmMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); if (fStatus.fDCacheEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/DCacheMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); if (fStatus.fCafCondorEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/CafCondorMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); if (fStatus.fCafGroupEnabled) { inFile = TString(mon_dir) + "/enabled.gif"; } else inFile = TString(mon_dir) + "/disabled.gif"; outFile = TString(mon_dir) + "/CafGroupMonitor/Enabled.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); return 0; } //_____________________________________________________________________________ int TGlobalMonitor::UpdateNtuple() { // read the data file and fills the fStatus class (no ntuple!) //----------------------------------------------------------------------------- printf(" inside TGlobalMonitor::UpdateNtuple()\n"); // AC TDatime thisTime; TDatime now; TFile* ntupleOut; TTree * tree; TBranch* br; FILE* f; char ntuName[200]; int nowyear, nowmonth; int year, month, day, hour, min, sec; float timeDiff; int nFiles; char inFile[200]; int status; nowyear = now.GetYear(); nowmonth = now.GetMonth(); nFiles=1; if(nowmonth==1) { nowyear --; nFiles=2; } sprintf(ntuName,"%s",fNtupleFileName.Data()); ntupleOut = new TFile(ntuName,"recreate"); tree = new TTree("global_monitor","Global Monitor"); br = tree->Branch("GlobalMonitor","TGlobalMonitor::Data_t", &fData); for(int i=0; ifTime = thisTime; fData->fAbsTime = thisTime.Convert(); fData->fStatus = status; timeDiff = now.Convert() - thisTime.Convert(); timeDiff/=60.; // difference in minutes if(timeDiff < TIMESAVE) { tree->Fill(); } } // end of file fclose(f); } // end loop over files ntupleOut->Write(); delete ntupleOut; return 0; } //_____________________________________________________________________________ int TGlobalMonitor::MakePlots(const char* HtmlFile) { #define max(A,B) ((A)>(B)?(A):(B)) printf(" inside TGlobalMonitor::MakePlots()\n"); // AC TH1F *hStatusDay = new TH1F("hStatusDay","Status vs time (TODAY)",NBINS_TIME_DAY, -24, 0); TH1F *hStatusWeek = new TH1F("hStatusWeek","Status vs time (THIS WEEK)",NBINS_TIME_WEEK, -7, 0); TH1F *hStatusMonth = new TH1F("hStatusMonth","Status vs time (THIS Month)",NBINS_TIME_MONTH, -31, 0); int statusDay[NBINS_TIME_DAY], statusWeek[NBINS_TIME_WEEK], statusMonth[NBINS_TIME_MONTH]; TDatime now; UInt_t absNow, absTime; int timeDiff; float timeDay, timeWeek, timeMonth; // absolute time for today/this week/this month int status; int i, tBin, nentries; int hour, min, day, dayPrevM; int hourNow, minNow, dayNow, monthNow, yearNow; char hourMinC[6], dayC[4]; for(i=0; i (tree->GetEntries()); tree->SetBranchAddress("GlobalMonitor", &fData); for(int nev=0; nevGetEvent(nev); absTime = fData->fAbsTime; timeDiff = absTime; timeDiff -=absNow; status = fData->fStatus; timeDay = timeDiff/60. + TMAX_DAY; // (min) because TDatime.Convert() gives the time in seconds timeWeek = timeDiff/60. + TMAX_WEEK; // (min) timeMonth = timeDiff/60. + TMAX_MONTH; // (min) if(timeDay>0 && timeDay < TMAX_DAY) { tBin = static_cast ( (timeDay/TMAX_DAY)*NBINS_TIME_DAY ); statusDay[tBin] = max(statusDay[tBin], status); } if(timeWeek>0 && timeWeek < TMAX_WEEK) { tBin = static_cast ( (timeWeek/TMAX_WEEK)*NBINS_TIME_WEEK ); statusWeek[tBin] = max(statusWeek[tBin], status); } if(timeMonth>0 && timeMonth < TMAX_MONTH) { tBin = static_cast ( (timeMonth/TMAX_MONTH)*NBINS_TIME_MONTH ); statusMonth[tBin] = max(statusMonth[tBin], status); } } //end loop over entries ntuple_file.Close(); for(i=0; iSetBinContent(i+1, 1); if((i%(NBINS_TIME_DAY/8))==0) { hour = (i*24)/NBINS_TIME_DAY -24; hour += hourNow; if(hour <0) hour += 24; if(hour<10 && minNow <10) sprintf(hourMinC,"0%d:0%d", hour, minNow); if(hour>=10 && minNow<10) sprintf(hourMinC,"%d:0%d", hour, minNow); if(hour<10 && minNow>=10) sprintf(hourMinC,"0%d:%d", hour, minNow); if(hour>=10 && minNow>=10) sprintf(hourMinC,"%d:%d", hour, minNow); hStatusDay->GetXaxis()->SetBinLabel(i+1,hourMinC); } if(i==(NBINS_TIME_DAY-1)) { sprintf(hourMinC,"now"); hStatusDay->GetXaxis()->SetBinLabel(i+1,hourMinC); } } for(i=0; iSetBinContent(i+1, 1); if((i%(NBINS_TIME_WEEK/7))==0) { day = (i*7)/NBINS_TIME_WEEK -7; day += dayNow; if(day<=0) day += dayPrevM; sprintf(dayC,"%d", day); hStatusWeek->GetXaxis()->SetBinLabel(i+1,dayC); } if(i==(NBINS_TIME_WEEK-1)) { sprintf(dayC,"now"); hStatusWeek->GetXaxis()->SetBinLabel(i+1,dayC); } } for(i=0; iSetBinContent(i+1, 1); if((i%(NBINS_TIME_MONTH/31))==0) { day = (i*31)/NBINS_TIME_MONTH -31; day += dayNow; if(day<=0) day += dayPrevM; sprintf(dayC,"%d", day); hStatusMonth->GetXaxis()->SetBinLabel(i+1,dayC); } if(i==(NBINS_TIME_MONTH-1)) { sprintf(dayC,"now"); hStatusMonth->GetXaxis()->SetBinLabel(i+1,dayC); } } hStatusDay->GetXaxis()->LabelsOption("h"); hStatusWeek->GetXaxis()->LabelsOption("h"); hStatusMonth->GetXaxis()->LabelsOption("h"); // // now plot histograms // TString psFile, gifFile; char command[200]; // Status gStyle->SetOptStat(0); TCanvas * cStatD = new TCanvas("cStatD"); hStatusDay->DrawCopy(); for(i=0; iSetFillColor(kBlack); if(statusDay[i]==0) hStatusDay->SetFillColor(kGreen); if(statusDay[i]==1) hStatusDay->SetFillColor(kYellow); if(statusDay[i]==2) hStatusDay->SetFillColor(kRed); if(statusDay[i]==3) hStatusDay->SetFillColor(kBlue); hStatusDay->GetXaxis()->SetRange(i,i+1); hStatusDay->DrawCopy("same"); } gPad->RedrawAxis(); psFile = fHtmlDirectory + "/StatusD.eps"; cStatD->Print(psFile); gifFile = fHtmlDirectory + "/StatusD.gif"; if (gROOT->IsBatch()) { sprintf(command,"pstopnm -ppm -xborder 0 -yborder 0 -portrait %s", psFile.Data()); gSystem->Exec(command); sprintf(command,"ppmtogif %s001.ppm > %s", psFile.Data(), gifFile.Data()); gSystem->Exec(command); sprintf(command,"rm -f %s001.ppm", psFile.Data()); gSystem->Exec(command); } else { cStatD->Print(gifFile); } TCanvas * cStatW = new TCanvas("cStatW"); hStatusWeek->DrawCopy(); for(i=0; iSetFillColor(kBlack); if(statusWeek[i]==0) hStatusWeek->SetFillColor(kGreen); if(statusWeek[i]==1) hStatusWeek->SetFillColor(kYellow); if(statusWeek[i]==2) hStatusWeek->SetFillColor(kRed); if(statusWeek[i]==3) hStatusWeek->SetFillColor(kBlue); hStatusWeek->GetXaxis()->SetRange(i,i+1); hStatusWeek->DrawCopy("same"); } gPad->RedrawAxis(); psFile = fHtmlDirectory + "/StatusW.eps"; cStatW->Print(psFile); gifFile = fHtmlDirectory + "/StatusW.gif"; if (gROOT->IsBatch()) { sprintf(command,"pstopnm -ppm -xborder 0 -yborder 0 -portrait %s", psFile.Data()); gSystem->Exec(command); sprintf(command,"ppmtogif %s001.ppm > %s", psFile.Data(), gifFile.Data()); gSystem->Exec(command); sprintf(command,"rm -f %s001.ppm", psFile.Data()); gSystem->Exec(command); } else { cStatW->Print(gifFile); } TCanvas * cStatM = new TCanvas("cStatM"); hStatusMonth->DrawCopy(); for(i=0; iSetFillColor(kBlack); if(statusMonth[i]==0) hStatusMonth->SetFillColor(kGreen); if(statusMonth[i]==1) hStatusMonth->SetFillColor(kYellow); if(statusMonth[i]==2) hStatusMonth->SetFillColor(kRed); if(statusMonth[i]==3) hStatusMonth->SetFillColor(kBlue); hStatusMonth->GetXaxis()->SetRange(i,i+1); hStatusMonth->DrawCopy("same"); } gPad->RedrawAxis(); psFile = fHtmlDirectory + "/StatusM.eps"; cStatM->Print(psFile); gifFile = fHtmlDirectory + "/StatusM.gif"; if (gROOT->IsBatch()) { sprintf(command,"pstopnm -ppm -xborder 0 -yborder 0 -portrait %s", psFile.Data()); gSystem->Exec(command); sprintf(command,"ppmtogif %s001.ppm > %s", psFile.Data(), gifFile.Data()); gSystem->Exec(command); sprintf(command,"rm -f %s001.ppm", psFile.Data()); gSystem->Exec(command); } else { cStatM->Print(gifFile); } return 0; } //_____________________________________________________________________________ int TGlobalMonitor::MakeHtml(const char* HtmlFile) { // input file is always a raw data file... printf(" inside TGlobalMonitor::MakeHtml()\n"); // AC char * wwwBase={"http://www-cdf.fnal.gov/offline/monitoring/"}; TDatime time; FILE* page; TString htmlFile; // first we fill the individual status gif's const char* mon_dir = gSystem->Getenv("OFFLINE_MON_DIR"); TString inFile, outFile; // first the time-stamp file TString psFile, gifFile; char command[400]; char cFileName[200]; TCanvas * ctime = new TCanvas("ctime","ctime",250,80); TPaveText * ptime = new TPaveText(0.,0.,1.,1.); char timeLabel[100]; sprintf(timeLabel, "%s", time.AsString()); TText *txt = ptime->AddText(timeLabel); if(fStatus.fGlobalStatus==0) txt->SetTextColor(kGreen); if(fStatus.fGlobalStatus==1) txt->SetTextColor(kYellow); if(fStatus.fGlobalStatus==2) txt->SetTextColor(kRed); if(fStatus.fGlobalStatus==4) txt->SetTextColor(kBlue); ptime->Draw(); psFile = fHtmlDirectory + "/Time.eps"; gifFile = fHtmlDirectory + "/Time.gif"; ctime->Print(psFile); sprintf(command,"pstopnm -ppm -xborder 0 -yborder 0 -portrait %s", psFile.Data()); gSystem->Exec(command); sprintf(command,"ppmtogif %s001.ppm > %s", psFile.Data(), gifFile.Data()); gSystem->Exec(command); sprintf(command,"rm -f %s001.ppm", psFile.Data()); gSystem->Exec(command); // global status if(fStatus.fGlobalStatus==0) inFile = TString(mon_dir) + "/greenball.gif"; if(fStatus.fGlobalStatus==1) inFile = TString(mon_dir) + "/yelball.gif"; if(fStatus.fGlobalStatus==2) inFile = TString(mon_dir) + "/redball.gif"; if(fStatus.fGlobalStatus==4) inFile = TString(mon_dir) + "/down.gif"; outFile = fHtmlDirectory + "/Status.gif"; gSystem->CopyFile(inFile.Data(), outFile.Data(), kTRUE); // first we fill each single page // Global status htmlFile = fHtmlDirectory + "/Status.html"; page = fopen(htmlFile,"w"); fprintf(page,"\n"); fprintf(page,"\n", wwwBase); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); // fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"
EnstoredCacheAnalysis-dCacheFarmCalibrationsCondor CAFGroup CAFHelp
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"
 
Global Offline Monitoring for CDF/Run II
 
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"

\n"); fprintf(page,"
\n"); if(fStatus.fGlobalStatus==0) fprintf(page,"\n", fStatus.fGlobalTime.AsSQLString()); if(fStatus.fGlobalStatus==1) fprintf(page,"
greenball.gif GLOBAL at %s
\n", fStatus.fGlobalTime.AsSQLString()); if(fStatus.fGlobalStatus==2) fprintf(page,"
yelball.gif GLOBAL at %s
\n", fStatus.fGlobalTime.AsSQLString()); if(fStatus.fGlobalStatus==4) fprintf(page,"
redball.gif GLOBAL at %s
\n", fStatus.fGlobalTime.AsSQLString()); fprintf(page,"\n"); if(fStatus.fEnstoreStatus==0) fprintf(page,"\n"); if(fStatus.fEnstoreStatus==1) fprintf(page,"\n"); if(fStatus.fEnstoreStatus==2) fprintf(page,"\n"); if(fStatus.fFarmStatus==0) fprintf(page,"\n"); if(fStatus.fFarmStatus==1) fprintf(page,"\n"); if(fStatus.fFarmStatus==2) fprintf(page,"\n"); if(fStatus.fCalibrationsStatus==0) fprintf(page,"\n"); if(fStatus.fCalibrationsStatus==1) fprintf(page,"\n"); if(fStatus.fCalibrationsStatus==2) fprintf(page,"\n"); if(fStatus.fCalibrationsStatus==4) fprintf(page,"\n"); fprintf(page,"
down.gif GLOBAL at %s
 
greenball.gifEnstoreyelball.gifEnstoreredball.gifEnstoregreenball.gifProduction Farmyelball.gifProduction Farmredball.gifProduction Farmgreenball.gifCalibrationsyelball.gifCalibrationsredball.gifCalibrationsdown.gifCalibrations
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n", fStatus.fEnstoreTime.AsSQLString()); fprintf(page,"\n", fStatus.fFarmTime.AsSQLString()); fprintf(page,"\n", fStatus.fCalibrationsTime.AsSQLString()); fprintf(page,"\n"); fprintf(page,"
%s %s %s
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page," \n"); if(fStatus.fDCacheStatus==0) fprintf(page,"\n"); if(fStatus.fDCacheStatus==1) fprintf(page,"\n"); if(fStatus.fDCacheStatus==2) fprintf(page,"\n"); if(fStatus.fCafCondorStatus==0) fprintf(page,"\n"); if(fStatus.fCafCondorStatus==1) fprintf(page,"\n"); if(fStatus.fCafCondorStatus==2) fprintf(page,"\n"); if(fStatus.fCafGroupStatus==0) fprintf(page,"\n"); if(fStatus.fCafGroupStatus==1) fprintf(page,"\n"); if(fStatus.fCafGroupStatus==2) fprintf(page,"\n"); fprintf(page,"
 
greenball.gifAnalysis-dCacheyelball.gifAnalysis-dCacheredball.gifAnalysis-dCachegreenball.gif Condor CAFyelball.gif Condor CAFredball.gif Condor CAFgreenball.gif Group CAFyelball.gif Group CAFredball.gif Group CAF
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n", fStatus.fDCacheTime.AsSQLString()); fprintf(page,"\n", fStatus.fCafCondorTime.AsSQLString()); fprintf(page,"\n", fStatus.fCafGroupTime.AsSQLString()); fprintf(page,"\n"); fprintf(page,"
%s %s %s
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"
 

\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); // fprintf(page,"\n"); // fprintf(page,"\n"); fprintf(page,"
redball.gif Major Problemyelball.gif Minor problem
greenball.gif All systems are operationaldown.gif Cron down ?
star.gif Situation under investigation
checkmark.gif Scheduled outage
\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"

\n"); fprintf(page,"
\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n"); fprintf(page,"\n", time.AsSQLString()); fprintf(page,"
Legal Notices
Brought To You By: Global Monitoring
Last updated: %s
\n"); fprintf(page,"\n"); fclose(page); // delete page; return 0; }