aboutsummaryrefslogtreecommitdiff
path: root/src/rpc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rpc')
-rw-r--r--src/rpc/core_rpc_server.cpp95
-rw-r--r--src/rpc/core_rpc_server.h2
-rw-r--r--src/rpc/core_rpc_server_commands_defs.h35
3 files changed, 132 insertions, 0 deletions
diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp
index b56725515..b114f77ae 100644
--- a/src/rpc/core_rpc_server.cpp
+++ b/src/rpc/core_rpc_server.cpp
@@ -33,6 +33,9 @@ using namespace epee;
#include "core_rpc_server.h"
#include "common/command_line.h"
+#include "common/updates.h"
+#include "common/download.h"
+#include "common/util.h"
#include "cryptonote_basic/cryptonote_format_utils.h"
#include "cryptonote_basic/account.h"
#include "cryptonote_basic/cryptonote_basic_impl.h"
@@ -1485,6 +1488,98 @@ namespace cryptonote
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
+ bool core_rpc_server::on_update(const COMMAND_RPC_UPDATE::request& req, COMMAND_RPC_UPDATE::response& res)
+ {
+ static const char software[] = "monero";
+#ifdef BUILDTAG
+ static const char buildtag[] = BOOST_PP_STRINGIZE(BUILDTAG);
+#else
+ static const char buildtag[] = "source";
+#endif
+
+ if (req.command != "check" && req.command != "download" && req.command != "update")
+ {
+ res.status = std::string("unknown command: '") + req.command + "'";
+ return true;
+ }
+
+ std::string version, hash;
+ if (!tools::check_updates(software, buildtag, version, hash))
+ {
+ res.status = "Error checking for updates";
+ return true;
+ }
+ if (tools::vercmp(version.c_str(), MONERO_VERSION) <= 0)
+ {
+ res.update = false;
+ res.status = CORE_RPC_STATUS_OK;
+ return true;
+ }
+ res.update = true;
+ res.version = version;
+ res.user_uri = tools::get_update_url(software, "cli", buildtag, version, true);
+ res.auto_uri = tools::get_update_url(software, "cli", buildtag, version, false);
+ res.hash = hash;
+ if (req.command == "check")
+ {
+ res.status = CORE_RPC_STATUS_OK;
+ return true;
+ }
+
+ boost::filesystem::path path;
+ if (req.path.empty())
+ {
+ std::string filename;
+ const char *slash = strrchr(res.auto_uri.c_str(), '/');
+ if (slash)
+ filename = slash + 1;
+ else
+ filename = std::string(software) + "-update-" + version;
+ path = epee::string_tools::get_current_module_folder();
+ path /= filename;
+ }
+ else
+ {
+ path = req.path;
+ }
+
+ crypto::hash file_hash;
+ if (!tools::sha256sum(path.string(), file_hash) || (hash != epee::string_tools::pod_to_hex(file_hash)))
+ {
+ MDEBUG("We don't have that file already, downloading");
+ if (!tools::download(path.string(), res.auto_uri))
+ {
+ MERROR("Failed to download " << res.auto_uri);
+ return false;
+ }
+ if (!tools::sha256sum(path.string(), file_hash))
+ {
+ MERROR("Failed to hash " << path);
+ return false;
+ }
+ if (hash != epee::string_tools::pod_to_hex(file_hash))
+ {
+ MERROR("Download from " << res.auto_uri << " does not match the expected hash");
+ return false;
+ }
+ MINFO("New version downloaded to " << path);
+ }
+ else
+ {
+ MDEBUG("We already have " << path << " with expected hash");
+ }
+ res.path = path.string();
+
+ if (req.command == "download")
+ {
+ res.status = CORE_RPC_STATUS_OK;
+ return true;
+ }
+
+ res.status = "'update' not implemented yet";
+ return true;
+ }
+ //------------------------------------------------------------------------------------------------------------------------------
const command_line::arg_descriptor<std::string> core_rpc_server::arg_rpc_bind_port = {
"rpc-bind-port"
diff --git a/src/rpc/core_rpc_server.h b/src/rpc/core_rpc_server.h
index 00db47c2d..900f473a9 100644
--- a/src/rpc/core_rpc_server.h
+++ b/src/rpc/core_rpc_server.h
@@ -98,6 +98,7 @@ namespace cryptonote
MAP_URI_AUTO_JON2_IF("/start_save_graph", on_start_save_graph, COMMAND_RPC_START_SAVE_GRAPH, !m_restricted)
MAP_URI_AUTO_JON2_IF("/stop_save_graph", on_stop_save_graph, COMMAND_RPC_STOP_SAVE_GRAPH, !m_restricted)
MAP_URI_AUTO_JON2("/get_outs", on_get_outs, COMMAND_RPC_GET_OUTPUTS)
+ MAP_URI_AUTO_JON2_IF("/update", on_update, COMMAND_RPC_UPDATE, !m_restricted)
BEGIN_JSON_RPC_MAP("/json_rpc")
MAP_JON_RPC("getblockcount", on_getblockcount, COMMAND_RPC_GETBLOCKCOUNT)
MAP_JON_RPC_WE("on_getblockhash", on_getblockhash, COMMAND_RPC_GETBLOCKHASH)
@@ -148,6 +149,7 @@ namespace cryptonote
bool on_out_peers(const COMMAND_RPC_OUT_PEERS::request& req, COMMAND_RPC_OUT_PEERS::response& res);
bool on_start_save_graph(const COMMAND_RPC_START_SAVE_GRAPH::request& req, COMMAND_RPC_START_SAVE_GRAPH::response& res);
bool on_stop_save_graph(const COMMAND_RPC_STOP_SAVE_GRAPH::request& req, COMMAND_RPC_STOP_SAVE_GRAPH::response& res);
+ bool on_update(const COMMAND_RPC_UPDATE::request& req, COMMAND_RPC_UPDATE::response& res);
//json_rpc
bool on_getblockcount(const COMMAND_RPC_GETBLOCKCOUNT::request& req, COMMAND_RPC_GETBLOCKCOUNT::response& res);
diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h
index d84dab0ba..99aa9815e 100644
--- a/src/rpc/core_rpc_server_commands_defs.h
+++ b/src/rpc/core_rpc_server_commands_defs.h
@@ -1440,4 +1440,39 @@ namespace cryptonote
END_KV_SERIALIZE_MAP()
};
};
+
+ struct COMMAND_RPC_UPDATE
+ {
+ struct request
+ {
+ std::string command;
+ std::string path;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(command);
+ KV_SERIALIZE(path);
+ END_KV_SERIALIZE_MAP()
+ };
+
+ struct response
+ {
+ std::string status;
+ bool update;
+ std::string version;
+ std::string user_uri;
+ std::string auto_uri;
+ std::string hash;
+ std::string path;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(status)
+ KV_SERIALIZE(update)
+ KV_SERIALIZE(version)
+ KV_SERIALIZE(user_uri)
+ KV_SERIALIZE(auto_uri)
+ KV_SERIALIZE(hash)
+ KV_SERIALIZE(path)
+ END_KV_SERIALIZE_MAP()
+ };
+ };
}