#include "mergerfs_webui.hpp" #include "mergerfs_api.hpp" #include "fs_mounts.hpp" #include "fs_exists.hpp" #include "httplib.h" #include "json.hpp" using json = nlohmann::json; static void _get_root(const httplib::Request &req_, httplib::Response &res_) { std::string html; if(fs::exists("index.html")) { res_.set_file_content("index.html"); return; } html = R"html( mergerfs ui
)html"; res_.set_content(html, "text/html"); } static void _get_mounts(const httplib::Request &req_, httplib::Response &res_) { json j; fs::MountVec mounts; fs::mounts(mounts); j = json::array(); for(const auto &mount : mounts) { if(mount.type != "fuse.mergerfs") continue; j.push_back(mount.dir); } res_.set_content(j.dump(), "application/json"); } static void _get_kvs(const httplib::Request &req_, httplib::Response &res_) { if(not req_.has_param("mount")) { res_.status = 400; res_.set_content("mount param not set", "text/plain"); return; } json j; std::string mount; std::map kvs; mount = req_.get_param_value("mount"); mergerfs::api::get_kvs(mount,&kvs); j = kvs; res_.set_content(j.dump(), "application/json"); } static void _get_kv(const httplib::Request &req_, httplib::Response &res_) { if(not req_.has_param("mount")) { res_.status = 400; res_.set_content("mount param not set", "text/plain"); return; } json j; std::string key; std::string val; std::string mount; key = req_.path_params.at("key"); mount = req_.get_param_value("mount"); mergerfs::api::get_kv(mount,key,&val); j = val; res_.set_content(j.dump(), "application/json"); } static void _post_kvs(const httplib::Request &req_, httplib::Response &res_) { if(not req_.has_param("mount")) { res_.status = 400; res_.set_content("mount param not set","text/plain"); return; } try { json j; std::string mount; mount = req_.get_param_value("mount"); j = json::parse(req_.body); for(const auto &[key,val] : j.items()) { std::cout << "mount=" << mount << " | " << key << ": " << val << std::endl; } res_.set_content("{}", "application/json"); } catch (const std::exception& e) { res_.status = 400; res_.set_content("Invalid JSON", "text/plain"); } } int mergerfs::webui::main(const int argc_, char **argv_) { httplib::Server http_server; std::string host; int port; host = "0.0.0.0"; port = 8000; http_server.Get("/",::_get_root); http_server.Get("/mounts",::_get_mounts); http_server.Get("/kvs",::_get_kvs); http_server.Get("/kvs/:key",::_get_kv); http_server.Post("/kvs",::_post_kvs); http_server.listen(host,port); return 0; }