aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt6
-rw-r--r--src/common/command_line.cpp5
-rw-r--r--src/common/command_line.h1
-rw-r--r--src/common/updates.cpp114
-rw-r--r--src/common/updates.h37
5 files changed, 161 insertions, 2 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index c63d9d0ae..9227e745e 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -35,7 +35,8 @@ set(common_sources
password.cpp
perf_timer.cpp
task_region.cpp
- thread_group.cpp)
+ thread_group.cpp
+ updates.cpp)
if (STACK_TRACE)
list(APPEND common_sources stack_trace.cpp)
@@ -62,7 +63,8 @@ set(common_private_headers
perf_timer.h
stack_trace.h
task_region.h
- thread_group.h)
+ thread_group.h
+ updates.h)
monero_private_headers(common
${common_private_headers})
diff --git a/src/common/command_line.cpp b/src/common/command_line.cpp
index c3df5c096..8739a93cd 100644
--- a/src/common/command_line.cpp
+++ b/src/common/command_line.cpp
@@ -120,4 +120,9 @@ namespace command_line
, "How many blocks to sync at once during chain synchronization."
, BLOCKS_SYNCHRONIZING_DEFAULT_COUNT
};
+ const command_line::arg_descriptor<std::string> arg_check_updates = {
+ "check-updates"
+ , "Check for new versions of monero: [disabled|notify|download|update]"
+ , "notify"
+ };
}
diff --git a/src/common/command_line.h b/src/common/command_line.h
index a09365a6b..f10e68e13 100644
--- a/src/common/command_line.h
+++ b/src/common/command_line.h
@@ -218,4 +218,5 @@ namespace command_line
extern const arg_descriptor<uint64_t> arg_prep_blocks_threads;
extern const arg_descriptor<uint64_t> arg_show_time_stats;
extern const arg_descriptor<size_t> arg_block_sync_size;
+ extern const arg_descriptor<std::string> arg_check_updates;
}
diff --git a/src/common/updates.cpp b/src/common/updates.cpp
new file mode 100644
index 000000000..936106881
--- /dev/null
+++ b/src/common/updates.cpp
@@ -0,0 +1,114 @@
+// Copyright (c) 2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "util.h"
+#include "dns_utils.h"
+#include "updates.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "updates"
+
+namespace tools
+{
+ bool check_updates(const std::string &software, const std::string &buildtag, bool testnet, std::string &version, std::string &hash)
+ {
+ std::vector<std::string> records;
+ bool found = false;
+
+ MDEBUG("Checking updates for " << buildtag << " " << software);
+
+ // All four MoneroPulse domains have DNSSEC on and valid
+ static const std::vector<std::string> dns_urls = {
+ };
+
+ static const std::vector<std::string> testnet_dns_urls = { "testver.moneropulse.net"
+ };
+
+ if (!tools::dns_utils::load_txt_records_from_dns(records, testnet ? testnet_dns_urls : dns_urls))
+ return false;
+
+ for (const auto& record : records)
+ {
+ std::vector<std::string> fields;
+ boost::split(fields, record, boost::is_any_of(":"));
+ if (fields.size() != 4)
+ {
+ MWARNING("Updates record does not have 4 fields: " << record);
+ continue;
+ }
+
+ if (software != fields[0] || buildtag != fields[1])
+ continue;
+
+ bool alnum = true;
+ for (auto c: hash)
+ if (!isalnum(c))
+ alnum = false;
+ if (hash.size() != 64 && !alnum)
+ {
+ MWARNING("Invalid hash: " << hash);
+ continue;
+ }
+
+ // use highest version
+ if (found)
+ {
+ int cmp = vercmp(version.c_str(), fields[2].c_str());
+ if (cmp > 0)
+ continue;
+ if (cmp == 0 && hash != fields[3])
+ MWARNING("Two matches found for " << software << " version " << version << " on " << buildtag);
+ }
+
+ version = fields[2];
+ hash = fields[3];
+
+ MINFO("Found new version " << version << " with hash " << hash);
+ found = true;
+ }
+ return found;
+ }
+
+ std::string get_update_url(const std::string &software, const std::string &subdir, const std::string &buildtag, const std::string &version)
+ {
+ static const char base[] = "https://downloads.getmonero.org/";
+#ifdef _WIN32
+ static const char extension[] = ".zip";
+#else
+ static const char extension[] = ".tar.bz2";
+#endif
+
+ std::string url;
+
+ url = base;
+ if (!subdir.empty())
+ url += subdir + "/";
+ url = url + software + "-" + buildtag + "-v" + version + extension;
+ return url;
+ }
+}
diff --git a/src/common/updates.h b/src/common/updates.h
new file mode 100644
index 000000000..1a70e06fd
--- /dev/null
+++ b/src/common/updates.h
@@ -0,0 +1,37 @@
+// Copyright (c) 2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include <string>
+
+namespace tools
+{
+ bool check_updates(const std::string &software, const std::string &buildtag, bool bestnet, std::string &version, std::string &hash);
+ std::string get_update_url(const std::string &software, const std::string &subdir, const std::string &buildtag, const std::string &version);
+}