1 #ifndef LIAISON_UPGRADE_H
2 #define LIAISON_UPGRADE_H
4 #include <Wt/Http/Response>
5 #include <Wt/WFileResource>
10 #include <boost/asio/io_service.hpp>
11 #include <boost/process.hpp>
12 #include <boost/process/pipe.hpp>
14 #include <goby/util/thirdparty/nlohmann/json.hpp>
15 #include <goby/zeromq/liaison/liaison_container.h>
17 #include "config.pb.h"
24 LiaisonUpgrade(
const goby::apps::zeromq::protobuf::LiaisonConfig& cfg,
25 Wt::WContainerWidget* parent = 0);
28 class LogFileResource :
public Wt::WResource
33 void set_last_log(
const std::string& log) { last_log_ = log; }
35 void handleRequest(
const Wt::Http::Request& request, Wt::Http::Response& response)
override
37 suggestFileName(
"jaiabot_upgrade_ansible_log_" + goby::time::file_str() +
".json");
38 response.addHeader(
"Content-Type",
"application/json");
39 response.out() << last_log_;
43 std::string last_log_;
46 class AutoScrollWidget :
public Wt::WContainerWidget
49 AutoScrollWidget(Wt::WContainerWidget* parent =
nullptr) : Wt::WContainerWidget(parent)
51 this->setOverflow(Wt::WContainerWidget::OverflowAuto, Wt::Horizontal | Wt::Vertical);
55 void addText(Wt::WString line)
57 new Wt::WText(line +
"<br/>",
this);
60 std::string jsCode =
"var obj = document.getElementById('" + this->id() +
61 "'); obj.scrollTop = obj.scrollHeight;";
62 Wt::WApplication::instance()->doJavaScript(jsCode);
70 std::size_t playbook_index);
76 std::string stdout_file;
77 std::string json_file;
79 Wt::WGroupBox* group_box;
80 Wt::WContainerWidget* group_div;
81 Wt::WContainerWidget* iv_group_div;
82 Wt::WContainerWidget* run_button_div;
83 Wt::WPushButton* run_button;
84 Wt::WContainerWidget* log_button_div;
85 Wt::WPushButton* log_button;
86 Wt::WContainerWidget* stdout_button_div;
87 Wt::WPushButton* stdout_button;
88 Wt::WContainerWidget* result_div;
89 Wt::WText* result_text;
90 Wt::WTable* result_table;
92 Wt::WGroupBox* stdout_group;
93 AutoScrollWidget* stdout_div;
95 std::vector<std::string>::const_iterator run_text_it;
97 std::map<std::string, std::string> input_var;
99 std::map<std::string, std::string> output_var;
100 std::vector<std::string> output_var_order;
104 ProcessData(
const protobuf::UpgradeConfig& cfg,
const std::string& playbook_file,
105 const jaiabot::protobuf::UpgradeConfig::AnsiblePlaybook& pb_playbook,
106 const std::string& input_vars,
const std::string& ansible_stdout_file,
107 const std::string& ansible_json_file);
110 boost::asio::io_service
io;
116 std::unique_ptr<ProcessData> pdata;
117 std::string last_log;
118 std::shared_ptr<LogFileResource> log_resource;
119 const jaiabot::protobuf::UpgradeConfig::AnsiblePlaybook& pb_playbook;
134 ResultType result{SUCCESS};
135 std::map<std::string, std::string> output_vars;
138 void run_ansible_playbook(std::size_t playbook_index);
139 void set_input_var(
int selection_index, Wt::WComboBox* selection, std::string name,
140 std::size_t playbook_index);
143 void toggle_stdout(std::size_t playbook_index);
146 void focus()
override { timer_.start(); }
147 void unfocus()
override { timer_.stop(); }
150 struct SectionWidgets
153 Wt::WContainerWidget* div;
156 std::map<std::string, SectionWidgets> sections;
158 const protobuf::UpgradeConfig& cfg_;
159 std::vector<AnsiblePlaybookConfig> playbooks_;
161 static const std::vector<std::string> running_;
162 static const Wt::WColor color_success_;
163 static const Wt::WColor color_failure_;