1 #include "otsdaq-utilities/Logbook/LogbookSupervisor.h"
21 const std::string LOGBOOK_PATH = getenv(
"LOGBOOK_DATA_PATH") + std::string(
"/");
22 #define LOGBOOK_EXPERIMENT_LIST_PATH LOGBOOK_PATH + "experiment_list.xml"
23 #define LOGBOOK_EXPERIMENT_DIR_PREFACE "log_"
24 #define LOGBOOK_UPLOADS_PATH "uploads/" //within experiment directory
25 #define LOGBOOK_LOGBOOKS_PATH "logbooks/"
26 #define LOGBOOK_PREVIEWS_PATH "previews/"
27 #define LOGBOOK_FILE_PREFACE "entries_"
28 #define LOGBOOK_FILE_EXTENSION ".xml"
30 #define ACTIVE_EXPERIMENT_PATH LOGBOOK_PATH + "active_experiment.txt"
31 #define REMOVE_EXPERIMENT_LOG_PATH LOGBOOK_PATH + "removed_experiments.log"
33 #define XML_ADMIN_STATUS "logbook_admin_status"
34 #define XML_STATUS "logbook_status"
35 #define XML_MOST_RECENT_DAY "most_recent_day"
36 #define XML_EXPERIMENTS_ROOT "experiments"
37 #define XML_EXPERIMENT "experiment"
38 #define XML_ACTIVE_EXPERIMENT "active_experiment"
39 #define XML_EXPERIMENT_CREATE "create_time"
40 #define XML_EXPERIMENT_CREATOR "creator"
42 #define XML_LOGBOOK_ENTRY "logbook_entry"
43 #define XML_LOGBOOK_ENTRY_SUBJECT "logbook_entry_subject"
44 #define XML_LOGBOOK_ENTRY_TEXT "logbook_entry_text"
45 #define XML_LOGBOOK_ENTRY_FILE "logbook_entry_file"
46 #define XML_LOGBOOK_ENTRY_TIME "logbook_entry_time"
47 #define XML_LOGBOOK_ENTRY_CREATOR "logbook_entry_creator"
48 #define XML_LOGBOOK_ENTRY_HIDDEN "logbook_entry_hidden"
49 #define XML_LOGBOOK_ENTRY_HIDER "logbook_entry_hider"
50 #define XML_LOGBOOK_ENTRY_HIDDEN_TIME "logbook_entry_hidden_time"
52 #define XML_PREVIEW_INDEX "preview_index"
53 #define LOGBOOK_PREVIEW_FILE "preview.xml"
54 #define LOGBOOK_PREVIEW_UPLOAD_PREFACE "upload_"
59 #define __MF_SUBJECT__ "Logbook"
64 int sendmail(
const char *to,
const char *from,
const char *subject,
const char *message)
67 FILE *mailpipe = popen(
"/usr/lib/sendmail -t",
"w");
68 if (mailpipe != NULL) {
69 fprintf(mailpipe,
"To: %s\n", to);
70 fprintf(mailpipe,
"From: %s\n", from);
71 fprintf(mailpipe,
"Subject: %s\n\n", subject);
72 fwrite(message, 1, strlen(message), mailpipe);
73 fwrite(
".\n", 1, 2, mailpipe);
78 perror(
"Failed to invoke sendmail");
86 LogbookSupervisor::LogbookSupervisor(xdaq::ApplicationStub* stub)
87 : CoreSupervisorBase(stub)
88 , allowedFileUploadTypes_({
"image/png",
"image/jpeg",
"image/gif",
"image/bmp",
"application/pdf",
"application/zip",
"text/plain"})
89 , matchingFileUploadTypes_({
"png",
"jpeg",
"gif",
"bmp",
"pdf",
"zip",
"txt"})
91 INIT_MF(
"LogbookSupervisor");
98 xoap::bind(
this, &LogbookSupervisor::MakeSystemLogbookEntry,
"MakeSystemLogbookEntry" , XDAQ_NS_URI);
107 LogbookSupervisor::~LogbookSupervisor(
void)
112 void LogbookSupervisor::init(
void)
120 std::string path = LOGBOOK_PATH;
121 DIR *dir = opendir(path.c_str());
124 else if(-1 == mkdir(path.c_str(),0755))
127 std::stringstream ss;
128 ss << __COUT_HDR_FL__ <<
"Service directory creation failed: " <<
133 path = LOGBOOK_PATH + LOGBOOK_UPLOADS_PATH;
134 dir = opendir(path.c_str());
137 else if(-1 == mkdir((path).c_str(),0755))
140 __SS__ <<
"Service directory creation failed: " <<
145 path = LOGBOOK_PATH + LOGBOOK_LOGBOOKS_PATH;
146 dir = opendir(path.c_str());
149 else if(-1 == mkdir(path.c_str(),0755))
152 __SS__ <<
"Service directory creation failed: " <<
158 getActiveExperiment();
159 __COUT__ <<
"Active Experiment is " << activeExperiment_ << std::endl;
160 mostRecentDayIndex_ = 0;
165 void LogbookSupervisor::destroy(
void)
171 void LogbookSupervisor::defaultPage(xgi::Input * in, xgi::Output * out )
173 __COUT__ <<
" active experiment " << activeExperiment_ << std::endl;
174 *out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame src='/WebPath/html/Logbook.html?urn=" <<
175 this->getApplicationDescriptor()->getLocalId() <<
"&active_experiment=" << activeExperiment_ <<
"'></frameset></html>";
182 void LogbookSupervisor::setSupervisorPropertyDefaults()
184 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold, std::string() +
185 "*=1 | CreateExperiment=-1 | RemoveExperiment=-1 | GetExperimentListAdmin=-1 | SetActiveExperiment=-1" +
186 " | AdminRemoveRestoreEntry=-1");
192 void LogbookSupervisor::forceSupervisorPropertyValues()
194 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
196 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
197 "LogImage | LogReport");
206 void LogbookSupervisor::request(
const std::string& requestType, cgicc::Cgicc& cgiIn,
207 HttpXmlDocument& xmlOut,
const WebUsers::RequestUserInfo& userInfo)
267 if(requestType ==
"CreateExperiment")
285 std::string creator = userInfo.username_;
287 createExperiment(CgiDataUtilities::postData(cgiIn,
"Experiment"), creator, &xmlOut);
289 __COUT__ <<
"Created" << std::endl;
291 else if(requestType ==
"RemoveExperiment")
302 std::string remover = userInfo.username_;
303 removeExperiment(CgiDataUtilities::postData(cgiIn,
"Experiment"), remover, &xmlOut);
305 else if(requestType ==
"GetExperimentList")
308 if(userInfo.permissionLevel_ >=
309 CoreSupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
"GetExperimentListAdmin"))
311 xmlOut.addTextElementToData(
"is_admin",
"0");
316 xmlOut.addTextElementToData(
"is_admin",
"1");
317 getExperiments(&xmlOut);
319 else if(requestType ==
"SetActiveExperiment")
330 webUserSetActiveExperiment(CgiDataUtilities::postData(cgiIn,
"Experiment"), &xmlOut);
332 else if(requestType ==
"RefreshLogbook")
336 std::string Date = CgiDataUtilities::postData(cgiIn,
"Date");
337 std::string Duration = CgiDataUtilities::postData(cgiIn,
"Duration");
340 unsigned char duration;
341 sscanf(Date.c_str(),
"%li",&date);
342 sscanf(Duration.c_str(),
"%hhu",&duration);
344 __COUT__ <<
"date " << date <<
" duration " << (int)duration << std::endl;
345 std::stringstream str;
346 refreshLogbook(date, duration, &xmlOut, (std::ostringstream *)&str);
347 __COUT__ << str.str() << std::endl;
349 else if(requestType ==
"PreviewEntry")
358 std::string EntryText = cgiIn(
"EntryText");
359 __COUT__ <<
"EntryText " << EntryText << std::endl << std::endl;
360 std::string EntrySubject = cgiIn(
"EntrySubject");
361 __COUT__ <<
"EntrySubject " << EntrySubject << std::endl << std::endl;
364 std::string creator = userInfo.username_;
366 savePostPreview(EntrySubject,EntryText,cgiIn.getFiles(),creator,&xmlOut);
369 else if(requestType ==
"ApproveEntry")
374 std::string PreviewNumber = CgiDataUtilities::postData(cgiIn,
"PreviewNumber");
375 std::string Approve = CgiDataUtilities::postData(cgiIn,
"Approve");
377 movePreviewEntry(PreviewNumber,Approve==
"1",&xmlOut);
379 else if(requestType ==
"AdminRemoveRestoreEntry")
387 std::string EntryId = CgiDataUtilities::postData(cgiIn,
"EntryId");
388 bool Hide = CgiDataUtilities::postData(cgiIn,
"Hide")==
"1"?
true:
false;
391 std::string hider = userInfo.username_;
393 hideLogbookEntry(EntryId,Hide,hider);
395 xmlOut.addTextElementToData(XML_ADMIN_STATUS,
"1");
398 __COUT__ <<
"requestType request not recognized." << std::endl;
405 void LogbookSupervisor::nonXmlRequest(
const std::string& requestType, cgicc::Cgicc& cgiIn,
406 std::ostream& out,
const WebUsers::RequestUserInfo& userInfo)
412 if(requestType ==
"LogImage")
414 std::string src = CgiDataUtilities::getData(cgiIn,
"src");
415 __COUT__ <<
" Get Log Image " << src << std::endl;
417 out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame src='/WebPath/html/LogbookImage.html?urn=" <<
418 this->getApplicationDescriptor()->getLocalId() <<
"&src=" << src <<
"'></frameset></html>";
420 else if(requestType ==
"LogReport")
422 std::string activeExperiment = CgiDataUtilities::getData(cgiIn,
"activeExperiment");
423 __COUT__ <<
" Start Log Report for " << activeExperiment << std::endl;
425 out <<
"<!DOCTYPE HTML><html lang='en'><header><title>ots Logbook Reports</title></header><frameset col='100%' row='100%'><frame src='/WebPath/html/LogbookReport.html?urn=" <<
426 this->getApplicationDescriptor()->getLocalId() <<
"&activeExperiment=" << activeExperiment <<
"'></frameset></html>";
429 __COUT__ <<
"requestType request not recognized." << std::endl;
436 xoap::MessageReference LogbookSupervisor::MakeSystemLogbookEntry (xoap::MessageReference msg)
438 SOAPParameters parameters(
"EntryText");
441 SOAPUtilities::receive(msg, parameters);
442 std::string EntryText = parameters.getValue(
"EntryText");
444 __COUT__ <<
"Received External Supervisor System Entry " << EntryText << std::endl;
445 __COUT__ <<
"Active Experiment is " << activeExperiment_ << std::endl;
447 std::string retStr =
"Success";
450 std::string logPath, logDirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
451 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
454 char dayIndexStr[20];
455 HttpXmlDocument logXml;
457 xercesc::DOMElement* entryEl;
460 if(activeExperiment_ ==
"")
462 retStr =
"Warning - Currently, no Active Experiment.";
463 __COUT__ << retStr << std::endl;
468 dir = opendir(logDirPath.c_str());
471 retStr =
"Error - Active Experiment directory missing.";
472 __COUT__ << retStr << std::endl;
477 sprintf(dayIndexStr,
"%6.6lu",time(0)/(60*60*24));
479 logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
"_" + (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
480 __COUT__ <<
"logPath " << logPath << std::endl;
482 logXml.loadXmlDocument(logPath);
493 entryEl = logXml.addTextElementToData(XML_LOGBOOK_ENTRY);
495 sprintf(fileIndex,
"%lu_%lu",time(0),clock());
496 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TIME, fileIndex, entryEl);
497 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_CREATOR,
"SYSTEM LOG", entryEl);
498 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TEXT, EntryText, entryEl);
499 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_SUBJECT,
"System Log", entryEl);
501 logXml.saveXmlDocument(logPath);
506 SOAPParameters retParameters(
"Status",retStr);
511 return SOAPUtilities::makeSOAPMessageReference(
"LogbookEntryStatusResponse",retParameters);
548 std::string LogbookSupervisor::getActiveExperiment()
550 FILE *fp = fopen(std::string((std::string)ACTIVE_EXPERIMENT_PATH).c_str(),
"r");
551 if(!fp) activeExperiment_ =
"";
555 if(!fgets(line,100,fp)) line[0] =
'\0';
559 if(line[strlen(line)-2] ==
'\r')
560 line[strlen(line)-2] =
'\0';
561 else if(line[strlen(line)-1] ==
'\n')
562 line[strlen(line)-1] =
'\0';
564 activeExperiment_ = line;
567 return activeExperiment_;
573 void LogbookSupervisor::setActiveExperiment(std::string experiment)
575 FILE *fp = fopen(std::string((std::string)ACTIVE_EXPERIMENT_PATH).c_str(),
"w");
578 __COUT__ <<
"FATAL ERROR!!! - file write" << std::endl;
582 fprintf(fp,
"%s",experiment.c_str());
585 if(activeExperiment_ !=
"" && activeExperiment_ != experiment)
586 theRemoteWebUsers_.makeSystemLogbookEntry(
587 allSupervisorInfo_.getGatewayDescriptor(),
588 "Experiment was made inactive.");
590 bool entryNeeded =
false;
591 if(experiment !=
"" && activeExperiment_ != experiment)
594 activeExperiment_ = experiment;
595 __COUT__ <<
"Active Experiment set to " << activeExperiment_ << std::endl;
598 theRemoteWebUsers_.makeSystemLogbookEntry(
599 allSupervisorInfo_.getGatewayDescriptor(),
600 "Experiment was made active.");
607 bool LogbookSupervisor::validateExperimentName(std::string &exp)
609 if(exp.length() < EXPERIMENT_NAME_MIN_LENTH || exp.length() > EXPERIMENT_NAME_MAX_LENTH)
return false;
610 for(
int i=0;i<(int)exp.length();++i)
612 (exp[i] >=
'a' && exp[i] <=
'z') ||
613 (exp[i] >=
'A' && exp[i] <=
'Z') ||
614 (exp[i] >=
'0' && exp[i] <=
'9') ||
615 (exp[i] ==
'-' || exp[i] ==
'_') ) )
616 { exp = exp.substr(0,i) + exp.substr(i+1); --i; }
625 void LogbookSupervisor::getExperiments(HttpXmlDocument *xmlOut, std::ostringstream *out)
628 HttpXmlDocument expXml;
629 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
631 __COUT__ <<
"Fatal Error - Experiment database." << std::endl;
632 __COUT__ <<
"Creating empty experiment database." << std::endl;
634 expXml.addTextElementToData((std::string)XML_EXPERIMENTS_ROOT);
635 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
639 std::vector<std::string> exps;
640 expXml.getAllMatchingValues(XML_EXPERIMENT,exps);
642 if(xmlOut) xmlOut->addTextElementToData(XML_ACTIVE_EXPERIMENT, activeExperiment_);
644 for(
unsigned int i=0;i<exps.size();++i)
646 if(xmlOut) xmlOut->addTextElementToData(XML_EXPERIMENT, exps[i]);
647 if(out) *out << exps[i] << std::endl;
653 void LogbookSupervisor::createExperiment(std::string experiment, std::string creator, HttpXmlDocument *xmlOut)
655 if(!validateExperimentName(experiment))
657 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Error - Experiment name must be 3-25 characters.");
661 __COUT__ <<
"experiment " << experiment << std::endl;
664 std::string dirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
665 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + experiment;
667 __COUT__ <<
"dirPath " << dirPath << std::endl;
669 bool directoryExists =
false;
670 DIR *dir = opendir(dirPath.c_str());
674 directoryExists =
true;
678 HttpXmlDocument expXml;
679 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
681 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Fatal Error - Experiment database.");
685 std::vector<std::string> exps;
686 expXml.getAllMatchingValues(XML_EXPERIMENT,exps);
688 for(
unsigned int i=0;i<exps.size();++i)
689 if(experiment == exps[i])
691 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Failed - Experiment, " + experiment +
", already exists.");
694 __COUT__ <<
"experiments count: " << exps.size() << std::endl;
703 xercesc::DOMElement* expEl = expXml.addTextElementToParent(XML_EXPERIMENT, experiment, XML_EXPERIMENTS_ROOT);
705 sprintf(createTime,
"%lu",time(0));
706 expXml.addTextElementToParent(XML_EXPERIMENT_CREATE, createTime, expEl);
707 expXml.addTextElementToParent(XML_EXPERIMENT_CREATOR, creator, expEl);
708 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
715 dirPath +=
"/" + (std::string)LOGBOOK_UPLOADS_PATH;
716 __COUT__ <<
"Checking uploads directory" << std::endl;
718 directoryExists =
false;
719 dir = opendir(dirPath.c_str());
722 __COUT__ <<
"Creating uploads directory" << std::endl;
723 if(-1 == mkdir(dirPath.c_str(),0755))
725 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Failed - uploads directory for " + experiment +
" was not created.");
726 __COUT__ <<
"Uploads directory failure." << std::endl;
733 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Directory already exists for " + experiment +
734 ", re-added to list of experiments.");
737 __COUT__ <<
"Creating experiment and uploads directory at: " <<
738 dirPath << std::endl;
739 if(-1 == mkdir(dirPath.c_str(),0755) ||
740 -1 == mkdir((dirPath +
"/" +
741 (std::string)LOGBOOK_UPLOADS_PATH).c_str(),0755))
743 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Failed - directory, " + experiment +
", could not be created.");
747 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Experiment, " + experiment +
", successfully created.");
754 void LogbookSupervisor::webUserSetActiveExperiment(std::string experiment, HttpXmlDocument *xmlOut)
758 setActiveExperiment(experiment);
759 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Active experiment cleared successfully.");
763 HttpXmlDocument expXml;
764 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
766 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Fatal Error - Experiment database.");
769 std::vector<std::string> exps;
770 expXml.getAllMatchingValues(XML_EXPERIMENT,exps);
773 for(i=0;i<exps.size();++i)
774 if(experiment == exps[i])
break;
778 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Failed - Experiment, " + experiment +
", not found.");
783 setActiveExperiment(experiment);
784 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Active experiment set to " + experiment +
" successfully.");
791 void LogbookSupervisor::removeExperiment(std::string experiment, std::string remover, HttpXmlDocument *xmlOut)
793 __COUT__ <<
"experiment " << experiment << std::endl;
796 HttpXmlDocument expXml;
797 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
799 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Fatal Error - Experiment database.");
802 std::vector<std::string> exps;
803 expXml.getAllMatchingValues(XML_EXPERIMENT,exps);
806 for(i=0;i<exps.size();++i)
807 if(experiment == exps[i])
break;
811 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Failed - Experiment, " + experiment +
", not found.");
818 xercesc::DOMElement* parent = expXml.getMatchingElement(XML_EXPERIMENTS_ROOT);
819 xercesc::DOMElement* child = expXml.getMatchingElement(XML_EXPERIMENT,i);
820 __COUT__ <<
"experiments original count: " << expXml.getChildrenCount(parent) << std::endl;
821 expXml.recursiveRemoveChild(child, parent);
822 __COUT__ <<
"experiments new count: " << expXml.getChildrenCount(parent) << std::endl;
825 FILE *fp = fopen(((std::string)REMOVE_EXPERIMENT_LOG_PATH).c_str(),
"a");
828 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Fatal Error - Remove log.");
831 fprintf(fp,
"%s -- %s Experiment removed by %s.\n",asctime(localtime(&((time_t
const&)(time(0))))),
832 experiment.c_str(), remover.c_str());
835 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
838 if(activeExperiment_ == experiment)
839 setActiveExperiment();
841 if(xmlOut) xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Experiment, " + experiment +
", successfully removed.");
850 void LogbookSupervisor::refreshLogbook(time_t date,
unsigned char duration,
851 HttpXmlDocument *xmlOut, std::ostringstream *out, std::string experiment)
853 if(experiment ==
"") experiment = activeExperiment_;
854 if(xmlOut) xmlOut->addTextElementToData(XML_ACTIVE_EXPERIMENT,experiment);
857 std::string dirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
858 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + experiment;
860 if(out) *out << __COUT_HDR_FL__ <<
"dirPath " << dirPath << std::endl;
862 DIR *dir = opendir(dirPath.c_str());
865 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"Error - Directory for experiment, " + experiment +
", missing.");
866 if(out) *out << __COUT_HDR_FL__ <<
"Error - Directory missing" << std::endl;
870 unsigned int baseDay;
875 unsigned int extractedDay;
878 mostRecentDayIndex_ = 0;
879 while ((drnt=readdir(dir))){
882 if(strcmp(&(drnt->d_name[strlen(drnt->d_name)-4]),
".xml"))
continue;
884 for(finish=strlen(drnt->d_name)-1;finish>0;--finish)
885 if(drnt->d_name[finish] ==
'.')
break;
888 if(out) *out << __COUT_HDR_FL__ <<
"failed to find day index finish " << std::endl;
891 for(start=finish-1;start>0;--start)
892 if(drnt->d_name[start-1] ==
'_')
break;
895 if(out) *out << __COUT_HDR_FL__ <<
"failed to find day index start " << std::endl;
898 drnt->d_name[finish] =
'\0';
899 extractedDay = atoi((
char *)(&(drnt->d_name[start])));
901 if(!mostRecentDayIndex_ || mostRecentDayIndex_ < extractedDay) mostRecentDayIndex_ = extractedDay;
903 if(out) *out << __COUT_HDR_FL__ <<
"dirContents done, found most recent day: " << mostRecentDayIndex_ << std::endl;
905 baseDay = mostRecentDayIndex_;
908 baseDay = (date/(60*60*24));
911 std::string entryPath;
912 char dayIndexStr[20];
918 for(
unsigned char i=duration;i!=0;--i)
920 sprintf(dayIndexStr,
"%6.6u",baseDay-i+1);
921 entryPath = dirPath +
"/" + LOGBOOK_FILE_PREFACE + experiment +
"_" + (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
923 if(out) *out << __COUT_HDR_FL__ <<
"Directory Entry " << entryPath << std::endl;
925 fp = fopen(entryPath.c_str(),
"r");
928 if(out) *out << __COUT_HDR_FL__ <<
"File not found" << std::endl;
935 HttpXmlDocument logXml;
936 if(!logXml.loadXmlDocument(entryPath))
938 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"Critical Failure - log did not load. Notify admins.");
939 if(out) *out << __COUT_HDR_FL__ <<
"Failure - log XML did not load" << std::endl;
943 if(xmlOut) xmlOut->copyDataChildren(logXml);
946 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"1");
947 if(out) *out << __COUT_HDR_FL__ <<
"Today: " << time(0)/(60*60*24) << std::endl;
949 sprintf(dayIndexStr,
"%lu",time(0)/(60*60*24) - mostRecentDayIndex_);
950 if(xmlOut) xmlOut->addTextElementToData(XML_MOST_RECENT_DAY,dayIndexStr);
957 void LogbookSupervisor::cleanUpPreviews()
959 std::string previewPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_PREVIEWS_PATH;
961 DIR *dir = opendir(previewPath.c_str());
964 __COUT__ <<
"Error - Previews directory missing: " << previewPath << std::endl;
968 struct dirent *entry;
969 time_t dirCreateTime;
972 while((entry = readdir(dir)))
974 if( strcmp(entry->d_name,
".") != 0 && strcmp(entry->d_name,
"..") != 0
975 && strcmp(entry->d_name,
".svn") != 0 )
978 for(i=0;i<strlen(entry->d_name);++i)
979 if(entry->d_name[i] ==
'_')
980 { entry->d_name[i] =
' ';
break; }
981 sscanf(entry->d_name,
"%li",&dirCreateTime);
983 if((time(0) - dirCreateTime) > LOGBOOK_PREVIEW_EXPIRATION_TIME)
985 __COUT__ <<
"Expired" << std::endl;
987 entry->d_name[i] =
'_';
989 __COUT__ <<
"rm -rf " << previewPath + (std::string)entry->d_name << std::endl << std::endl;
990 system(((std::string)(
"rm -rf " + previewPath + (std::string)entry->d_name)).c_str());
1002 void LogbookSupervisor::savePostPreview(std::string &subject, std::string &text,
const std::vector<cgicc::FormFile> &files, std::string creator,
1003 HttpXmlDocument *xmlOut)
1005 if(activeExperiment_ ==
"")
1007 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"Failed - no active experiment currently!");
1012 sprintf(fileIndex,
"%lu_%lu",time(0),clock());
1013 std::string previewPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_PREVIEWS_PATH + (std::string)fileIndex;
1015 __COUT__ <<
"previewPath " << previewPath << std::endl;
1016 if(-1 == mkdir(previewPath.c_str(),0755))
1018 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"Failed - preview could not be generated.");
1033 escapeLogbookEntry(text);
1034 escapeLogbookEntry(subject);
1035 __COUT__ <<
"~~subject " << subject << std::endl <<
"~~text " << text << std::endl << std::endl;
1037 HttpXmlDocument previewXml;
1039 previewXml.addTextElementToData(XML_LOGBOOK_ENTRY);
1040 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TIME, fileIndex, XML_LOGBOOK_ENTRY);
1041 if(xmlOut) xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_TIME,fileIndex);
1042 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_CREATOR, creator, XML_LOGBOOK_ENTRY);
1043 if(xmlOut) xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_CREATOR,creator);
1044 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TEXT, text, XML_LOGBOOK_ENTRY);
1045 if(xmlOut) xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_TEXT,text);
1046 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_SUBJECT, subject, XML_LOGBOOK_ENTRY);
1047 if(xmlOut) xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_SUBJECT,subject);
1049 __COUT__ <<
"file size " << files.size() << std::endl;
1051 std::string filename;
1052 std::ofstream myfile;
1053 for (
unsigned int i=0; i<files.size(); ++i)
1056 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_FILE, files[i].getDataType(), XML_LOGBOOK_ENTRY);
1057 if(xmlOut) xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_FILE,files[i].getDataType());
1059 if((filename = validateUploadFileType(files[i].getDataType())) ==
"")
1061 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"Failed - invalid file type, " +
1062 files[i].getDataType() +
".");
1067 sprintf(fileIndex,
"%d",i);
1068 filename = previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE +
1069 (std::string)fileIndex + "." + filename;
1071 __COUT__ << "file " << i << " - " << filename << std::endl;
1072 myfile.open(filename.c_str());
1073 if (myfile.is_open())
1075 files[i].writeToStream(myfile);
1081 previewXml.saveXmlDocument(previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_FILE);
1083 if(xmlOut) xmlOut->addTextElementToData(XML_STATUS,
"1");
1084 if(xmlOut) xmlOut->addTextElementToData(XML_PREVIEW_INDEX,
"1");
1093 void LogbookSupervisor::movePreviewEntry(std::string previewNumber,
bool approve,
1094 HttpXmlDocument *xmlOut)
1097 __COUT__ <<
"previewNumber " << previewNumber << (approve?
" Accepted":
" Cancelled") << std::endl;
1099 std::string sysCmd, previewPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_PREVIEWS_PATH + previewNumber;
1104 HttpXmlDocument previewXml;
1105 previewXml.loadXmlDocument(previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_FILE);
1107 std::string logPath, logDirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
1108 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
1111 DIR *dir = opendir(logDirPath.c_str());
1114 __COUT__ <<
"Error - Active Experiment directory missing: " << logPath << std::endl;
1119 char dayIndexStr[20];
1120 sprintf(dayIndexStr,
"%6.6lu",time(0)/(60*60*24));
1122 logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
"_" + (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
1123 __COUT__ <<
"logPath " << logPath << std::endl;
1125 HttpXmlDocument logXml;
1126 logXml.loadXmlDocument(logPath);
1137 logXml.copyDataChildren(previewXml);
1138 logXml.saveXmlDocument(logPath);
1141 std::vector<std::string> fileTypes;
1142 previewXml.getAllMatchingValues(XML_LOGBOOK_ENTRY_FILE,fileTypes);
1143 std::string entryTimeLabel = previewXml.getMatchingValue(XML_LOGBOOK_ENTRY_TIME);
1144 std::string fileExtension, previewFilename, logFilename;
1146 for(
unsigned int i=0;i<fileTypes.size();++i)
1148 if((fileExtension = validateUploadFileType(fileTypes[i])) ==
"")
1150 __COUT__ <<
"Failed - invalid file type: " << fileTypes[i] << std::endl;
1155 sprintf(fileIndex,
"%d",i);
1156 previewFilename = (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE + (std::string)fileIndex +
"." + fileExtension;
1157 logFilename = (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE + entryTimeLabel +
"_" +
1158 (std::string)fileIndex +
"." + fileExtension;
1160 sysCmd =
"mv " + (previewPath +
"/" + previewFilename) +
" " +
1161 (logDirPath +
"/" + (std::string)LOGBOOK_UPLOADS_PATH + logFilename);
1162 __COUT__ << sysCmd << std::endl;
1163 system(sysCmd.c_str());
1168 sysCmd =
"rm -rf " + previewPath;
1169 __COUT__ << sysCmd << std::endl << std::endl;
1170 system(sysCmd.c_str());
1176 std::string LogbookSupervisor::validateUploadFileType(
const std::string fileType)
1178 for (
unsigned int i=0; i<allowedFileUploadTypes_.size(); ++i)
1179 if (allowedFileUploadTypes_[i] == fileType)
1180 return matchingFileUploadTypes_[i];
1189 void LogbookSupervisor::escapeLogbookEntry(std::string &entry)
1204 void LogbookSupervisor::hideLogbookEntry(
const std::string &entryId,
bool hide,
const std::string &hider)
1206 __COUT__ <<
"Hide=" << hide <<
" for entryid " << entryId << std::endl;
1209 char dayIndexStr[20];
1211 for(i=0;i<entryId.length();++i)
1212 if(entryId[i] ==
'_') { dayIndexStr[i] =
'\0';
break;}
1214 dayIndexStr[i] = entryId[i];
1216 sscanf(dayIndexStr,
"%li",&days);
1218 sprintf(dayIndexStr,
"%6.6lu",days);
1220 std::string logDirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
1221 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
1222 std::string logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
"_" + (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
1224 __COUT__ <<
"logPath=" << logPath << std::endl;
1227 HttpXmlDocument logXml;
1228 if(!logXml.loadXmlDocument(logPath))
1230 __COUT__ <<
"Failure - log XML did not load" << std::endl;
1234 std::vector<std::string> allEntryIds;
1235 logXml.getAllMatchingValues(XML_LOGBOOK_ENTRY_TIME,allEntryIds);
1236 for(i=0;i<allEntryIds.size();++i)
1237 if(allEntryIds[i] == entryId)
break;
1238 if(i == allEntryIds.size())
1240 __COUT__ <<
"Failure - entry not found" << std::endl;
1244 __COUT__ <<
"found " << logXml.getMatchingValue(XML_LOGBOOK_ENTRY_TEXT,i) << std::endl;
1246 xercesc::DOMElement* hiddenParentEl, *entryParentEl = logXml.getMatchingElement(XML_LOGBOOK_ENTRY,i);
1249 hiddenParentEl = logXml.getMatchingElementInSubtree(entryParentEl,XML_LOGBOOK_ENTRY_HIDDEN);
1255 __COUT__ <<
"Hidden tag already applied to entry." << std::endl;
1258 hiddenParentEl = logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_HIDDEN,
"1",entryParentEl);
1259 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_HIDER,hider,hiddenParentEl);
1260 sprintf(dayIndexStr,
"%lu",time(0));
1261 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_HIDDEN_TIME,dayIndexStr,hiddenParentEl);
1267 __COUT__ <<
"Entry already was not hidden." << std::endl;
1271 logXml.recursiveRemoveChild(hiddenParentEl,entryParentEl);
1273 logXml.saveXmlDocument(logPath);
1274 __COUT__ <<
"Success." << std::endl;