#ifndef APPINFO_H #define APPINFO_H #include #include #include #include #include #include #include #include #include class AppInfo { typedef std::unordered_map string_map; public: enum class State { initial, running, exited }; enum class RunMode { script, daemon }; struct AppData { std::string program_name; std::string module_name; std::deque args; std::string working_dir; string_map after; string_map env; std::string run_mode; std::string run_as; bool create_log = false; std::string run_at; std::string run_every; bool run_on_start = false; void printInfo(std::ostream &out); std::string getAfterString() const; std::string getAfterKeys() const; }; private: std::string program_name; std::string module_name; std::deque args; std::string run_as; std::string working_dir; std::string run_at; std::string run_every; bool run_on_start = false; string_map after; string_map env; bool create_log = false; std::unordered_map, State> parents; std::atomic state{State::initial}; RunMode mode = RunMode::script; std::chrono::system_clock::time_point next_time_to_run; bool next_time_to_run_parse_failed = false; bool scheduled = false; std::vector previous_execution_list; public: void setProgramName(std::string name); void setModuleName(std::string name); void setArgs(std::deque args); void setWorkingDir(std::string working_dir); void setAfter(string_map after); void setEnv(string_map env); void setCreateLog(bool create_log); void setRunMode(std::string mode); void setRunAs(std::string run_as); void setScheduled(bool val); void setFinished(); void setRunning(); void addToPreviousExecutionList(pid_t new_process); void insertParent(std::shared_ptr parent, State state); bool isParentDependencyCleared(std::osyncstream &out) const; std::string getModuleName() const; std::string getProgramName() const; std::string getRunAs() const; std::deque getArgs() const; std::string getWorkingDir() const; string_map getEnv() const; string_map getAfter() const; std::string getAfterString() const; std::string getAfterKeys() const; RunMode getRunMode() const; std::string getStringRunMode() const; State getState() const; std::unordered_map, State> getParents() const; void copyFromData(AppInfo::AppData &other); bool getCreateLog(); bool getScheduled(); bool getRunOnStart(); std::vector getPreviousExecutionList() const; std::chrono::system_clock::time_point getNextTimeToRun() const; AppInfo(); ~AppInfo(); AppInfo(const AppInfo &other) = delete; AppInfo(const AppInfo &&other) = delete; AppInfo &operator=(const AppInfo &other) = delete; bool operator==(const AppInfo &other); void printInfo(std::ostream& out); bool checkValidity(); void updateNextTimeToRun(); private: std::optional parseAtTimeFormat(std::string run_every); std::optional parseEveryTimeFormat(std::string run_every); std::string runmodeToString() const; std::vector tokenize(std::string, std::string); std::string stringStrip(const std::string str); int integer(const std::string str); std::string tolower(const std::string str) const; std::string stateToString() const; std::string stateToString(State s) const; }; #endif // APPINFO_H