Newer
Older
using ftl::Configurable;
using ftl::net::Universe;
using std::mutex;
using std::unique_lock;
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...";
//exit(1);
ftl::exit_code = 1;
ftl::running = false;
});
net->bind("shutdown", []() {
LOG(WARNING) << "Remote shutdown...";
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);
void Slave::sendLog(const loguru::Message& message) {
unique_lock<recursive_mutex> lk(mutex_);
if (in_log_) return;
in_log_ = true;
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...
}
}