#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;
}