1 #include "otsdaq-utilities/Logbook/LogbookSupervisor.h"
20 const std::string LOGBOOK_PATH = __ENV__(
"LOGBOOK_DATA_PATH") + std::string(
"/");
21 #define LOGBOOK_EXPERIMENT_LIST_PATH LOGBOOK_PATH + "experiment_list.xml"
22 #define LOGBOOK_EXPERIMENT_DIR_PREFACE "log_"
23 #define LOGBOOK_UPLOADS_PATH "uploads/" // within experiment directory
24 #define LOGBOOK_LOGBOOKS_PATH "logbooks/"
25 #define LOGBOOK_PREVIEWS_PATH "previews/"
26 #define LOGBOOK_FILE_PREFACE "entries_"
27 #define LOGBOOK_FILE_EXTENSION ".xml"
29 #define ACTIVE_EXPERIMENT_PATH LOGBOOK_PATH + "active_experiment.txt"
30 #define REMOVE_EXPERIMENT_LOG_PATH LOGBOOK_PATH + "removed_experiments.log"
32 #define XML_ADMIN_STATUS "logbook_admin_status"
33 #define XML_STATUS "logbook_status"
34 #define XML_MOST_RECENT_DAY "most_recent_day"
35 #define XML_EXPERIMENTS_ROOT "experiments"
36 #define XML_EXPERIMENT "experiment"
37 #define XML_ACTIVE_EXPERIMENT "active_experiment"
38 #define XML_EXPERIMENT_CREATE "create_time"
39 #define XML_EXPERIMENT_CREATOR "creator"
41 #define XML_LOGBOOK_ENTRY "logbook_entry"
42 #define XML_LOGBOOK_ENTRY_SUBJECT "logbook_entry_subject"
43 #define XML_LOGBOOK_ENTRY_TEXT "logbook_entry_text"
44 #define XML_LOGBOOK_ENTRY_FILE "logbook_entry_file"
45 #define XML_LOGBOOK_ENTRY_TIME "logbook_entry_time"
46 #define XML_LOGBOOK_ENTRY_CREATOR "logbook_entry_creator"
47 #define XML_LOGBOOK_ENTRY_HIDDEN "logbook_entry_hidden"
48 #define XML_LOGBOOK_ENTRY_HIDER "logbook_entry_hider"
49 #define XML_LOGBOOK_ENTRY_HIDDEN_TIME "logbook_entry_hidden_time"
51 #define XML_PREVIEW_INDEX "preview_index"
52 #define LOGBOOK_PREVIEW_FILE "preview.xml"
53 #define LOGBOOK_PREVIEW_UPLOAD_PREFACE "upload_"
58 #define __MF_SUBJECT__ "Logbook"
63 int sendmail(
const char* to,
const char* from,
const char* subject,
const char* message)
66 FILE* mailpipe = popen(
"/usr/lib/sendmail -t",
"w");
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);
79 perror(
"Failed to invoke sendmail");
85 LogbookSupervisor::LogbookSupervisor(xdaq::ApplicationStub* stub)
86 : CoreSupervisorBase(stub)
87 , allowedFileUploadTypes_({
"image/png",
94 , matchingFileUploadTypes_({
"png",
102 INIT_MF(
"LogbookSupervisor");
110 &LogbookSupervisor::MakeSystemLogbookEntry,
111 "MakeSystemLogbookEntry",
122 LogbookSupervisor::~LogbookSupervisor(
void) { destroy(); }
124 void LogbookSupervisor::init(
void)
131 std::string path = LOGBOOK_PATH;
132 DIR* dir = opendir(path.c_str());
135 else if(-1 == mkdir(path.c_str(), 0755))
138 std::stringstream ss;
139 ss << __COUT_HDR_FL__ <<
"Service directory creation failed: " << path
144 path = LOGBOOK_PATH + LOGBOOK_UPLOADS_PATH;
145 dir = opendir(path.c_str());
148 else if(-1 == mkdir((path).c_str(), 0755))
151 __SS__ <<
"Service directory creation failed: " << path << std::endl;
155 path = LOGBOOK_PATH + LOGBOOK_LOGBOOKS_PATH;
156 dir = opendir(path.c_str());
159 else if(-1 == mkdir(path.c_str(), 0755))
162 __SS__ <<
"Service directory creation failed: " << path << std::endl;
167 getActiveExperiment();
168 __COUT__ <<
"Active Experiment is " << activeExperiment_ << std::endl;
169 mostRecentDayIndex_ = 0;
173 void LogbookSupervisor::destroy(
void)
179 void LogbookSupervisor::defaultPage(xgi::Input* in, xgi::Output* out)
181 __COUT__ <<
" active experiment " << activeExperiment_ << std::endl;
182 *out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame "
183 "src='/WebPath/html/Logbook.html?urn="
184 << this->getApplicationDescriptor()->getLocalId()
185 <<
"&active_experiment=" << activeExperiment_ <<
"'></frameset></html>";
192 void LogbookSupervisor::setSupervisorPropertyDefaults()
194 CorePropertySupervisorBase::setSupervisorProperty(
195 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
197 "*=1 | CreateExperiment=-1 | RemoveExperiment=-1 | GetExperimentListAdmin=-1 "
198 "| SetActiveExperiment=-1" +
199 " | AdminRemoveRestoreEntry=-1");
205 void LogbookSupervisor::forceSupervisorPropertyValues()
207 CorePropertySupervisorBase::setSupervisorProperty(
208 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
210 CorePropertySupervisorBase::setSupervisorProperty(
211 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
212 "LogImage | LogReport");
222 void LogbookSupervisor::request(
const std::string& requestType,
224 HttpXmlDocument& xmlOut,
225 const WebUsers::RequestUserInfo& userInfo)
292 if(requestType ==
"CreateExperiment")
310 std::string creator = userInfo.username_;
313 CgiDataUtilities::postData(cgiIn,
"Experiment"), creator, &xmlOut);
315 __COUT__ <<
"Created" << std::endl;
317 else if(requestType ==
"RemoveExperiment")
329 std::string remover = userInfo.username_;
331 CgiDataUtilities::postData(cgiIn,
"Experiment"), remover, &xmlOut);
333 else if(requestType ==
"GetExperimentList")
337 if(userInfo.permissionLevel_ >=
338 CoreSupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
339 "GetExperimentListAdmin"))
341 xmlOut.addTextElementToData(
"is_admin",
"0");
346 xmlOut.addTextElementToData(
"is_admin",
"1");
347 getExperiments(&xmlOut);
349 else if(requestType ==
"SetActiveExperiment")
360 webUserSetActiveExperiment(CgiDataUtilities::postData(cgiIn,
"Experiment"),
363 else if(requestType ==
"RefreshLogbook")
368 std::string Date = CgiDataUtilities::postData(cgiIn,
"Date");
369 std::string Duration = CgiDataUtilities::postData(cgiIn,
"Duration");
372 unsigned char duration;
373 sscanf(Date.c_str(),
"%li", &date);
374 sscanf(Duration.c_str(),
"%hhu", &duration);
376 __COUT__ <<
"date " << date <<
" duration " << (int)duration << std::endl;
377 std::stringstream str;
378 refreshLogbook(date, duration, &xmlOut, (std::ostringstream*)&str);
379 __COUT__ << str.str() << std::endl;
381 else if(requestType ==
"PreviewEntry")
390 std::string EntryText = cgiIn(
"EntryText");
391 __COUT__ <<
"EntryText " << EntryText << std::endl << std::endl;
392 std::string EntrySubject = cgiIn(
"EntrySubject");
393 __COUT__ <<
"EntrySubject " << EntrySubject << std::endl << std::endl;
396 std::string creator = userInfo.username_;
398 savePostPreview(EntrySubject, EntryText, cgiIn.getFiles(), creator, &xmlOut);
402 else if(requestType ==
"ApproveEntry")
407 std::string PreviewNumber = CgiDataUtilities::postData(cgiIn,
"PreviewNumber");
408 std::string Approve = CgiDataUtilities::postData(cgiIn,
"Approve");
410 movePreviewEntry(PreviewNumber, Approve ==
"1", &xmlOut);
412 else if(requestType ==
"AdminRemoveRestoreEntry")
420 std::string EntryId = CgiDataUtilities::postData(cgiIn,
"EntryId");
421 bool Hide = CgiDataUtilities::postData(cgiIn,
"Hide") ==
"1" ?
true :
false;
424 std::string hider = userInfo.username_;
426 hideLogbookEntry(EntryId, Hide, hider);
428 xmlOut.addTextElementToData(XML_ADMIN_STATUS,
"1");
431 __COUT__ <<
"requestType request not recognized." << std::endl;
438 void LogbookSupervisor::nonXmlRequest(
const std::string& requestType,
441 const WebUsers::RequestUserInfo& userInfo)
447 if(requestType ==
"LogImage")
449 std::string src = CgiDataUtilities::getData(cgiIn,
"src");
450 __COUT__ <<
" Get Log Image " << src << std::endl;
452 out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame "
453 "src='/WebPath/html/LogbookImage.html?urn="
454 << this->getApplicationDescriptor()->getLocalId() <<
"&src=" << src
455 <<
"'></frameset></html>";
457 else if(requestType ==
"LogReport")
459 std::string activeExperiment =
460 CgiDataUtilities::getData(cgiIn,
"activeExperiment");
461 __COUT__ <<
" Start Log Report for " << activeExperiment << std::endl;
463 out <<
"<!DOCTYPE HTML><html lang='en'><header><title>ots Logbook "
464 "Reports</title></header><frameset col='100%' row='100%'><frame "
465 "src='/WebPath/html/LogbookReport.html?urn="
466 << this->getApplicationDescriptor()->getLocalId()
467 <<
"&activeExperiment=" << activeExperiment <<
"'></frameset></html>";
470 __COUT__ <<
"requestType request not recognized." << std::endl;
477 xoap::MessageReference LogbookSupervisor::MakeSystemLogbookEntry(
478 xoap::MessageReference msg)
480 SOAPParameters parameters(
"EntryText");
483 SOAPUtilities::receive(msg, parameters);
484 std::string EntryText = parameters.getValue(
"EntryText");
486 __COUT__ <<
"Received External Supervisor System Entry " << EntryText << std::endl;
487 __COUT__ <<
"Active Experiment is " << activeExperiment_ << std::endl;
489 std::string retStr =
"Success";
492 logDirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
493 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
495 char dayIndexStr[20];
496 HttpXmlDocument logXml;
498 xercesc::DOMElement* entryEl;
501 if(activeExperiment_ ==
"")
503 retStr =
"Warning - Currently, no Active Experiment.";
504 __COUT__ << retStr << std::endl;
509 dir = opendir(logDirPath.c_str());
512 retStr =
"Error - Active Experiment directory missing.";
513 __COUT__ << retStr << std::endl;
518 sprintf(dayIndexStr,
"%6.6lu", time(0) / (60 * 60 * 24));
520 logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
"_" +
521 (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
522 __COUT__ <<
"logPath " << logPath << std::endl;
524 logXml.loadXmlDocument(logPath);
535 entryEl = logXml.addTextElementToData(XML_LOGBOOK_ENTRY);
541 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TIME, fileIndex, entryEl);
542 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_CREATOR,
"SYSTEM LOG", entryEl);
543 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TEXT, EntryText, entryEl);
544 logXml.addTextElementToParent(XML_LOGBOOK_ENTRY_SUBJECT,
"System Log", entryEl);
546 logXml.saveXmlDocument(logPath);
551 SOAPParameters retParameters(
"Status", retStr);
556 return SOAPUtilities::makeSOAPMessageReference(
"LogbookEntryStatusResponse",
601 std::string LogbookSupervisor::getActiveExperiment()
603 FILE* fp = fopen(std::string((std::string)ACTIVE_EXPERIMENT_PATH).c_str(),
"r");
605 activeExperiment_ =
"";
609 if(!fgets(line, 100, fp))
615 if(line[strlen(line) - 2] ==
'\r')
616 line[strlen(line) - 2] =
'\0';
617 else if(line[strlen(line) - 1] ==
'\n')
618 line[strlen(line) - 1] =
'\0';
620 activeExperiment_ = line;
623 return activeExperiment_;
629 void LogbookSupervisor::setActiveExperiment(std::string experiment)
631 FILE* fp = fopen(std::string((std::string)ACTIVE_EXPERIMENT_PATH).c_str(),
"w");
634 __COUT__ <<
"FATAL ERROR!!! - file write" << std::endl;
638 fprintf(fp,
"%s", experiment.c_str());
641 if(activeExperiment_ !=
"" &&
642 activeExperiment_ != experiment)
643 theRemoteWebUsers_.makeSystemLogbookEntry(
644 allSupervisorInfo_.getGatewayDescriptor(),
645 "Experiment was made inactive.");
647 bool entryNeeded =
false;
648 if(experiment !=
"" &&
649 activeExperiment_ != experiment)
652 activeExperiment_ = experiment;
653 __COUT__ <<
"Active Experiment set to " << activeExperiment_ << std::endl;
656 theRemoteWebUsers_.makeSystemLogbookEntry(
657 allSupervisorInfo_.getGatewayDescriptor(),
658 "Experiment was made active.");
664 bool LogbookSupervisor::validateExperimentName(std::string& exp)
666 if(exp.length() < EXPERIMENT_NAME_MIN_LENTH ||
667 exp.length() > EXPERIMENT_NAME_MAX_LENTH)
669 for(
int i = 0; i < (int)exp.length(); ++i)
670 if(!((exp[i] >=
'a' && exp[i] <=
'z') || (exp[i] >=
'A' && exp[i] <=
'Z') ||
671 (exp[i] >=
'0' && exp[i] <=
'9') || (exp[i] ==
'-' || exp[i] ==
'_')))
673 exp = exp.substr(0, i) + exp.substr(i + 1);
684 void LogbookSupervisor::getExperiments(HttpXmlDocument* xmlOut, std::ostringstream* out)
687 HttpXmlDocument expXml;
688 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
690 __COUT__ <<
"Fatal Error - Experiment database." << std::endl;
691 __COUT__ <<
"Creating empty experiment database." << std::endl;
693 expXml.addTextElementToData((std::string)XML_EXPERIMENTS_ROOT);
694 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
698 std::vector<std::string> exps;
699 expXml.getAllMatchingValues(XML_EXPERIMENT, exps);
702 xmlOut->addTextElementToData(XML_ACTIVE_EXPERIMENT, activeExperiment_);
704 for(
unsigned int i = 0; i < exps.size(); ++i)
707 xmlOut->addTextElementToData(XML_EXPERIMENT, exps[i]);
709 *out << exps[i] << std::endl;
715 void LogbookSupervisor::createExperiment(std::string experiment,
717 HttpXmlDocument* xmlOut)
719 if(!validateExperimentName(experiment))
722 xmlOut->addTextElementToData(
723 XML_ADMIN_STATUS,
"Error - Experiment name must be 3-25 characters.");
727 __COUT__ <<
"experiment " << experiment << std::endl;
730 std::string dirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
731 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + experiment;
733 __COUT__ <<
"dirPath " << dirPath << std::endl;
735 bool directoryExists =
false;
736 DIR* dir = opendir(dirPath.c_str());
740 directoryExists =
true;
744 HttpXmlDocument expXml;
745 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
748 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
749 "Fatal Error - Experiment database.");
753 std::vector<std::string> exps;
754 expXml.getAllMatchingValues(XML_EXPERIMENT, exps);
756 for(
unsigned int i = 0; i < exps.size(); ++i)
757 if(experiment == exps[i])
760 xmlOut->addTextElementToData(
762 "Failed - Experiment, " + experiment +
", already exists.");
765 __COUT__ <<
"experiments count: " << exps.size() << std::endl;
773 xercesc::DOMElement* expEl =
774 expXml.addTextElementToParent(XML_EXPERIMENT, experiment, XML_EXPERIMENTS_ROOT);
776 sprintf(createTime,
"%lu", time(0));
777 expXml.addTextElementToParent(XML_EXPERIMENT_CREATE, createTime, expEl);
778 expXml.addTextElementToParent(XML_EXPERIMENT_CREATOR, creator, expEl);
779 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
785 dirPath +=
"/" + (std::string)LOGBOOK_UPLOADS_PATH;
786 __COUT__ <<
"Checking uploads directory" << std::endl;
788 directoryExists =
false;
789 dir = opendir(dirPath.c_str());
792 __COUT__ <<
"Creating uploads directory" << std::endl;
793 if(-1 == mkdir(dirPath.c_str(), 0755))
796 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
797 "Failed - uploads directory for " +
798 experiment +
" was not created.");
799 __COUT__ <<
"Uploads directory failure." << std::endl;
806 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
807 "Directory already exists for " + experiment +
808 ", re-added to list of experiments.");
811 __COUT__ <<
"Creating experiment and uploads directory at: " << dirPath << std::endl;
812 if(-1 == mkdir(dirPath.c_str(), 0755) ||
813 -1 == mkdir((dirPath +
"/" + (std::string)LOGBOOK_UPLOADS_PATH).c_str(), 0755))
816 xmlOut->addTextElementToData(
818 "Failed - directory, " + experiment +
", could not be created.");
823 xmlOut->addTextElementToData(
824 XML_ADMIN_STATUS,
"Experiment, " + experiment +
", successfully created.");
831 void LogbookSupervisor::webUserSetActiveExperiment(std::string experiment,
832 HttpXmlDocument* xmlOut)
836 setActiveExperiment(experiment);
838 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
839 "Active experiment cleared successfully.");
843 HttpXmlDocument expXml;
844 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
847 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
848 "Fatal Error - Experiment database.");
851 std::vector<std::string> exps;
852 expXml.getAllMatchingValues(XML_EXPERIMENT, exps);
855 for(i = 0; i < exps.size(); ++i)
856 if(experiment == exps[i])
862 xmlOut->addTextElementToData(
863 XML_ADMIN_STATUS,
"Failed - Experiment, " + experiment +
", not found.");
868 setActiveExperiment(experiment);
870 xmlOut->addTextElementToData(
872 "Active experiment set to " + experiment +
" successfully.");
879 void LogbookSupervisor::removeExperiment(std::string experiment,
881 HttpXmlDocument* xmlOut)
883 __COUT__ <<
"experiment " << experiment << std::endl;
886 HttpXmlDocument expXml;
887 if(!expXml.loadXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH))
890 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
891 "Fatal Error - Experiment database.");
894 std::vector<std::string> exps;
895 expXml.getAllMatchingValues(XML_EXPERIMENT, exps);
898 for(i = 0; i < exps.size(); ++i)
899 if(experiment == exps[i])
905 xmlOut->addTextElementToData(
906 XML_ADMIN_STATUS,
"Failed - Experiment, " + experiment +
", not found.");
913 xercesc::DOMElement* parent = expXml.getMatchingElement(XML_EXPERIMENTS_ROOT);
914 xercesc::DOMElement* child = expXml.getMatchingElement(XML_EXPERIMENT, i);
915 __COUT__ <<
"experiments original count: " << expXml.getChildrenCount(parent)
917 expXml.recursiveRemoveChild(child, parent);
918 __COUT__ <<
"experiments new count: " << expXml.getChildrenCount(parent) << std::endl;
921 FILE* fp = fopen(((std::string)REMOVE_EXPERIMENT_LOG_PATH).c_str(),
"a");
925 xmlOut->addTextElementToData(XML_ADMIN_STATUS,
"Fatal Error - Remove log.");
929 "%s -- %s Experiment removed by %s.\n",
930 asctime(localtime(&((time_t
const&)(time(0))))),
935 expXml.saveXmlDocument((std::string)LOGBOOK_EXPERIMENT_LIST_PATH);
938 if(activeExperiment_ == experiment)
939 setActiveExperiment();
942 xmlOut->addTextElementToData(
943 XML_ADMIN_STATUS,
"Experiment, " + experiment +
", successfully removed.");
952 void LogbookSupervisor::refreshLogbook(time_t date,
953 unsigned char duration,
954 HttpXmlDocument* xmlOut,
955 std::ostringstream* out,
956 std::string experiment)
959 experiment = activeExperiment_;
961 xmlOut->addTextElementToData(XML_ACTIVE_EXPERIMENT, experiment);
964 std::string dirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
965 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + experiment;
968 *out << __COUT_HDR_FL__ <<
"dirPath " << dirPath << std::endl;
970 DIR* dir = opendir(dirPath.c_str());
974 xmlOut->addTextElementToData(
976 "Error - Directory for experiment, " + experiment +
", missing.");
978 *out << __COUT_HDR_FL__ <<
"Error - Directory missing" << std::endl;
982 unsigned int baseDay;
987 unsigned int extractedDay;
990 mostRecentDayIndex_ = 0;
991 while((drnt = readdir(dir)))
996 if(strcmp(&(drnt->d_name[strlen(drnt->d_name) - 4]),
".xml"))
999 for(finish = strlen(drnt->d_name) - 1; finish > 0; --finish)
1000 if(drnt->d_name[finish] ==
'.')
1005 *out << __COUT_HDR_FL__ <<
"failed to find day index finish "
1009 for(start = finish - 1; start > 0; --start)
1010 if(drnt->d_name[start - 1] ==
'_')
1015 *out << __COUT_HDR_FL__ <<
"failed to find day index start "
1019 drnt->d_name[finish] =
'\0';
1020 extractedDay = atoi((
char*)(&(drnt->d_name[start])));
1023 if(!mostRecentDayIndex_ || mostRecentDayIndex_ < extractedDay)
1024 mostRecentDayIndex_ = extractedDay;
1027 *out << __COUT_HDR_FL__
1028 <<
"dirContents done, found most recent day: " << mostRecentDayIndex_
1031 baseDay = mostRecentDayIndex_;
1034 baseDay = (date / (60 * 60 * 24));
1037 std::string entryPath;
1038 char dayIndexStr[20];
1044 for(
unsigned char i = duration; i != 0; --i)
1046 sprintf(dayIndexStr,
"%6.6u", baseDay - i + 1);
1047 entryPath = dirPath +
"/" + LOGBOOK_FILE_PREFACE + experiment +
"_" +
1048 (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
1051 *out << __COUT_HDR_FL__ <<
"Directory Entry " << entryPath << std::endl;
1053 fp = fopen(entryPath.c_str(),
"r");
1057 *out << __COUT_HDR_FL__ <<
"File not found" << std::endl;
1064 HttpXmlDocument logXml;
1065 if(!logXml.loadXmlDocument(entryPath))
1068 xmlOut->addTextElementToData(
1069 XML_STATUS,
"Critical Failure - log did not load. Notify admins.");
1071 *out << __COUT_HDR_FL__ <<
"Failure - log XML did not load" << std::endl;
1076 xmlOut->copyDataChildren(logXml);
1080 xmlOut->addTextElementToData(XML_STATUS,
"1");
1082 *out << __COUT_HDR_FL__ <<
"Today: " << time(0) / (60 * 60 * 24) << std::endl;
1084 sprintf(dayIndexStr,
"%lu", time(0) / (60 * 60 * 24) - mostRecentDayIndex_);
1086 xmlOut->addTextElementToData(XML_MOST_RECENT_DAY,
1094 void LogbookSupervisor::cleanUpPreviews()
1096 std::string previewPath =
1097 (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_PREVIEWS_PATH;
1099 DIR* dir = opendir(previewPath.c_str());
1102 __COUT__ <<
"Error - Previews directory missing: " << previewPath << std::endl;
1106 struct dirent* entry;
1107 time_t dirCreateTime;
1114 if(strcmp(entry->d_name,
".") != 0 && strcmp(entry->d_name,
"..") != 0 &&
1115 strcmp(entry->d_name,
".svn") != 0)
1118 for(i = 0; i < strlen(entry->d_name); ++i)
1119 if(entry->d_name[i] ==
'_')
1121 entry->d_name[i] =
' ';
1124 sscanf(entry->d_name,
"%li", &dirCreateTime);
1126 if((time(0) - dirCreateTime) > LOGBOOK_PREVIEW_EXPIRATION_TIME)
1128 __COUT__ <<
"Expired" << std::endl;
1130 entry->d_name[i] =
'_';
1132 __COUT__ <<
"rm -rf " << previewPath + (std::string)entry->d_name
1136 ((std::string)(
"rm -rf " + previewPath + (std::string)entry->d_name))
1148 void LogbookSupervisor::savePostPreview(std::string& subject,
1150 const std::vector<cgicc::FormFile>& files,
1151 std::string creator,
1152 HttpXmlDocument* xmlOut)
1154 if(activeExperiment_ ==
"")
1157 xmlOut->addTextElementToData(XML_STATUS,
1158 "Failed - no active experiment currently!");
1167 std::string previewPath = (std::string)LOGBOOK_PATH +
1168 (std::string)LOGBOOK_PREVIEWS_PATH + (std::string)fileIndex;
1170 __COUT__ <<
"previewPath " << previewPath << std::endl;
1171 if(-1 == mkdir(previewPath.c_str(), 0755))
1174 xmlOut->addTextElementToData(XML_STATUS,
1175 "Failed - preview could not be generated.");
1190 escapeLogbookEntry(text);
1191 escapeLogbookEntry(subject);
1192 __COUT__ <<
"~~subject " << subject << std::endl
1193 <<
"~~text " << text << std::endl
1196 HttpXmlDocument previewXml;
1198 previewXml.addTextElementToData(XML_LOGBOOK_ENTRY);
1199 previewXml.addTextElementToParent(
1200 XML_LOGBOOK_ENTRY_TIME, fileIndex, XML_LOGBOOK_ENTRY);
1202 xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_TIME, fileIndex);
1203 previewXml.addTextElementToParent(
1204 XML_LOGBOOK_ENTRY_CREATOR, creator, XML_LOGBOOK_ENTRY);
1206 xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_CREATOR,
1208 previewXml.addTextElementToParent(XML_LOGBOOK_ENTRY_TEXT, text, XML_LOGBOOK_ENTRY);
1210 xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_TEXT, text);
1211 previewXml.addTextElementToParent(
1212 XML_LOGBOOK_ENTRY_SUBJECT, subject, XML_LOGBOOK_ENTRY);
1214 xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_SUBJECT,
1217 __COUT__ <<
"file size " << files.size() << std::endl;
1219 std::string filename;
1220 std::ofstream myfile;
1221 for(
unsigned int i = 0; i < files.size(); ++i)
1223 previewXml.addTextElementToParent(
1224 XML_LOGBOOK_ENTRY_FILE, files[i].getDataType(), XML_LOGBOOK_ENTRY);
1226 xmlOut->addTextElementToData(XML_LOGBOOK_ENTRY_FILE,
1227 files[i].getDataType());
1229 if((filename = validateUploadFileType(files[i].getDataType())) ==
1233 xmlOut->addTextElementToData(
1235 "Failed - invalid file type, " + files[i].getDataType() +
".");
1240 sprintf(fileIndex,
"%d", i);
1241 filename = previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE +
1242 (std::string)fileIndex + "." + filename;
1244 __COUT__ << "file " << i << " - " << filename << std::endl;
1245 myfile.open(filename.c_str());
1246 if(myfile.is_open())
1248 files[i].writeToStream(myfile);
1254 previewXml.saveXmlDocument(previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_FILE);
1257 xmlOut->addTextElementToData(XML_STATUS,
"1");
1259 xmlOut->addTextElementToData(XML_PREVIEW_INDEX,
1269 void LogbookSupervisor::movePreviewEntry(std::string previewNumber,
1271 HttpXmlDocument* xmlOut)
1273 __COUT__ <<
"previewNumber " << previewNumber
1274 << (approve ?
" Accepted" :
" Cancelled") << std::endl;
1276 std::string sysCmd, previewPath = (std::string)LOGBOOK_PATH +
1277 (std::string)LOGBOOK_PREVIEWS_PATH + previewNumber;
1283 HttpXmlDocument previewXml;
1284 previewXml.loadXmlDocument(previewPath +
"/" + (std::string)LOGBOOK_PREVIEW_FILE);
1286 std::string logPath,
1287 logDirPath = (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
1288 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
1291 DIR* dir = opendir(logDirPath.c_str());
1294 __COUT__ <<
"Error - Active Experiment directory missing: " << logPath
1300 char dayIndexStr[20];
1301 sprintf(dayIndexStr,
"%6.6lu", time(0) / (60 * 60 * 24));
1303 logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
"_" +
1304 (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
1305 __COUT__ <<
"logPath " << logPath << std::endl;
1307 HttpXmlDocument logXml;
1308 logXml.loadXmlDocument(logPath);
1319 logXml.copyDataChildren(previewXml);
1320 logXml.saveXmlDocument(logPath);
1323 std::vector<std::string> fileTypes;
1324 previewXml.getAllMatchingValues(XML_LOGBOOK_ENTRY_FILE, fileTypes);
1325 std::string entryTimeLabel = previewXml.getMatchingValue(XML_LOGBOOK_ENTRY_TIME);
1326 std::string fileExtension, previewFilename, logFilename;
1328 for(
unsigned int i = 0; i < fileTypes.size(); ++i)
1330 if((fileExtension = validateUploadFileType(fileTypes[i])) ==
1333 __COUT__ <<
"Failed - invalid file type: " << fileTypes[i] << std::endl;
1338 sprintf(fileIndex,
"%d", i);
1339 previewFilename = (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE +
1340 (std::string)fileIndex +
"." + fileExtension;
1341 logFilename = (std::string)LOGBOOK_PREVIEW_UPLOAD_PREFACE + entryTimeLabel +
1342 "_" + (std::string)fileIndex +
"." + fileExtension;
1344 sysCmd =
"mv " + (previewPath +
"/" + previewFilename) +
" " +
1345 (logDirPath +
"/" + (std::string)LOGBOOK_UPLOADS_PATH + logFilename);
1346 __COUT__ << sysCmd << std::endl;
1347 system(sysCmd.c_str());
1352 sysCmd =
"rm -rf " + previewPath;
1353 __COUT__ << sysCmd << std::endl << std::endl;
1354 system(sysCmd.c_str());
1360 std::string LogbookSupervisor::validateUploadFileType(
const std::string fileType)
1362 for(
unsigned int i = 0; i < allowedFileUploadTypes_.size(); ++i)
1363 if(allowedFileUploadTypes_[i] == fileType)
1364 return matchingFileUploadTypes_[i];
1373 void LogbookSupervisor::escapeLogbookEntry(std::string& entry)
1387 void LogbookSupervisor::hideLogbookEntry(
const std::string& entryId,
1389 const std::string& hider)
1391 __COUT__ <<
"Hide=" << hide <<
" for entryid " << entryId << std::endl;
1394 char dayIndexStr[20];
1396 for(i = 0; i < entryId.length(); ++i)
1397 if(entryId[i] ==
'_')
1399 dayIndexStr[i] =
'\0';
1403 dayIndexStr[i] = entryId[i];
1405 sscanf(dayIndexStr,
"%li", &days);
1406 days /= 60 * 60 * 24;
1407 sprintf(dayIndexStr,
"%6.6lu", days);
1409 std::string logDirPath =
1410 (std::string)LOGBOOK_PATH + (std::string)LOGBOOK_LOGBOOKS_PATH +
1411 (std::string)LOGBOOK_EXPERIMENT_DIR_PREFACE + activeExperiment_;
1412 std::string logPath = logDirPath +
"/" + LOGBOOK_FILE_PREFACE + activeExperiment_ +
1413 "_" + (std::string)dayIndexStr + LOGBOOK_FILE_EXTENSION;
1415 __COUT__ <<
"logPath=" << logPath << std::endl;
1418 HttpXmlDocument logXml;
1419 if(!logXml.loadXmlDocument(logPath))
1421 __COUT__ <<
"Failure - log XML did not load" << std::endl;
1425 std::vector<std::string> allEntryIds;
1426 logXml.getAllMatchingValues(XML_LOGBOOK_ENTRY_TIME, allEntryIds);
1427 for(i = 0; i < allEntryIds.size(); ++i)
1428 if(allEntryIds[i] == entryId)
1430 if(i == allEntryIds.size())
1432 __COUT__ <<
"Failure - entry not found" << std::endl;
1436 __COUT__ <<
"found " << logXml.getMatchingValue(XML_LOGBOOK_ENTRY_TEXT, i)
1439 xercesc::DOMElement *hiddenParentEl, *entryParentEl = logXml.getMatchingElement(
1440 XML_LOGBOOK_ENTRY, i);
1444 logXml.getMatchingElementInSubtree(entryParentEl, XML_LOGBOOK_ENTRY_HIDDEN);
1450 __COUT__ <<
"Hidden tag already applied to entry." << std::endl;
1453 hiddenParentEl = logXml.addTextElementToParent(
1454 XML_LOGBOOK_ENTRY_HIDDEN,
1457 logXml.addTextElementToParent(
1458 XML_LOGBOOK_ENTRY_HIDER, hider, hiddenParentEl);
1459 sprintf(dayIndexStr,
"%lu", time(0));
1460 logXml.addTextElementToParent(
1461 XML_LOGBOOK_ENTRY_HIDDEN_TIME, dayIndexStr, hiddenParentEl);
1467 __COUT__ <<
"Entry already was not hidden." << std::endl;
1471 logXml.recursiveRemoveChild(hiddenParentEl,
1474 logXml.saveXmlDocument(logPath);
1475 __COUT__ <<
"Success." << std::endl;