Skip to content
Snippets Groups Projects
slave.cpp 1.81 KiB
Newer Older
#include <ftl/slave.hpp>

using ftl::Configurable;
using ftl::net::Universe;
using ftl::ctrl::Slave;
using std::string;
using std::mutex;
using std::unique_lock;
using std::recursive_mutex;

static void netLog(void* user_data, const loguru::Message& message) {
	Slave *slave = static_cast<Slave*>(user_data);
	slave->sendLog(message);
Slave::Slave(Universe *net, ftl::Configurable *root) : net_(net), in_log_(false) {
	net->bind("restart", []() {
		LOG(WARNING) << "Remote restart...";
Nicolas Pope's avatar
Nicolas Pope committed
		//exit(1);
		ftl::exit_code = 1;
		ftl::running = false;
	});

	net->bind("shutdown", []() {
		LOG(WARNING) << "Remote shutdown...";
Nicolas Pope's avatar
Nicolas Pope committed
		//exit(0);
		ftl::running = false;
Nicolas Pope's avatar
Nicolas Pope committed
	net->bind("update_cfg", [](const std::string &uri, const std::string &value) {
		ftl::config::update(uri, nlohmann::json::parse(value));
	});

	net->bind("get_cfg", [](const std::string &uri) -> std::string {
		return ftl::config::resolve(uri);
	});

	net->bind("slave_details", [net,root]() -> std::vector<std::string> {
		ftl::config::json_t json {
			{"id", net->id().to_string()},
			{"title", root->value("title", *root->get<string>("$id"))}
		};
		return {json.dump()};
	});

	net->bind("log_subscribe", [this](const ftl::UUID &peer) {
		unique_lock<recursive_mutex> lk(mutex_);
		log_peers_.push_back(peer);
	});

	loguru::add_callback("net_log", netLog, this, loguru::Verbosity_INFO);
}

Slave::~Slave() {

}

void Slave::sendLog(const loguru::Message& message) {
	unique_lock<recursive_mutex> lk(mutex_);
	if (in_log_) return;
	in_log_ = true;

	for (auto &p : log_peers_) {
		auto peer = net_->getPeer(p);
		if (!peer || !peer->isConnected()) continue;

		std::cout << "sending log to master..." << std::endl;
		if (!net_->send(p, "log", message.verbosity, message.preamble, message.message)) {
			// TODO(Nick) Remove peer from loggers list...
		}
	}

	in_log_ = false;