v1.1.0-release (#1)
All checks were successful
Public/monitarr/pipeline/head This commit looks good

## v1.1.0-release

### Changes from v1.0.0-release

* Added labels to log entries
* Detect and remove stalled torrent import
This commit is contained in:
Scott E. Graves 2025-04-13 11:49:16 -05:00
parent 18f5f47321
commit 1c115b2758
51 changed files with 161 additions and 86 deletions

4
.gitattributes vendored Normal file
View File

@ -0,0 +1,4 @@
*.tgz filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text
*.tar.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text

8
CHANGELOG.md Normal file
View File

@ -0,0 +1,8 @@
# Changelog
## v1.1.0-release
### Changes from v1.0.0-release
* Added labels to log entries
* Detect and remove stalled torrent import

View File

@ -1,14 +1,14 @@
set(BINUTILS_HASH b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365)
set(CPP_HTTPLIB_HASH c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608)
set(CURL_HASH 6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f)
set(EXPAT_HASH 372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2)
set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237)
set(CPP_HTTPLIB_HASH 18064587e0cc6a0d5d56d619f4cbbcaba47aa5d84d86013abbd45d95c6653866)
set(CURL_HASH ccc5ba45d9f5320c70ffb24e5411b66ba55ea1f333bf78be0963ed90a9328699)
set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb)
set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293)
set(GTEST_HASH 78c676fc63881529bf97bf9d45948d905a66833fbfa5318ea2cd7478cb98f399)
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406)
set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187)
set(MINGW_HASH cc41898aac4b6e8dd5cffd7331b9d9515b912df4420a3a612b5ea2955bbeed2f)
set(OPENSSL_HASH 002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3)
set(OPENSSL_HASH 344d0a79f1a9b08029b0744e2cc401a43f9c90acd1044d09a530b4885a8e9fc0)
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
set(ROCKSDB_HASH fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724)
set(SPDLOG_HASH 25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc)
set(ROCKSDB_HASH 3fdc9ca996971c4c039959866382c4a3a6c8ade4abf888f3b2ff77153e07bf28)
set(SPDLOG_HASH 7a80896357f3e8e920e85e92633b14ba0f229c506e6f978578bdc35ba09e9a5d)
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)

View File

@ -1,23 +1,23 @@
set(BINUTILS_VERSION 2.43)
set(BOOST_MAJOR_VERSION 1)
set(BOOST_MINOR_VERSION 87)
set(BOOST_PATCH_VERSION 0)
set(BINUTILS_VERSION 2.44)
set(BOOST2_MAJOR_VERSION 1)
set(BOOST2_MINOR_VERSION 76)
set(BOOST2_PATCH_VERSION 0)
set(CPP_HTTPLIB_VERSION 0.19.0)
set(CURL_VERSION 8.12.1)
set(CURL2_VERSION 8_12_1)
set(EXPAT_VERSION 2.6.4)
set(EXPAT2_VERSION 2_6_4)
set(BOOST_MAJOR_VERSION 1)
set(BOOST_MINOR_VERSION 88)
set(BOOST_PATCH_VERSION 0)
set(CPP_HTTPLIB_VERSION 0.20.0)
set(CURL2_VERSION 8_13_0)
set(CURL_VERSION 8.13.0)
set(EXPAT2_VERSION 2_7_1)
set(EXPAT_VERSION 2.7.1)
set(GCC_VERSION 14.2.0)
set(GTEST_VERSION 1.16.0)
set(ICU_VERSION 76-1)
set(JSON_VERSION 3.11.3)
set(JSON_VERSION 3.12.0)
set(MESA_VERSION 23.3.3)
set(MINGW_VERSION 12.0.0)
set(OPENSSL_VERSION 3.4.1)
set(OPENSSL_VERSION 3.5.0)
set(PKG_CONFIG_VERSION 0.29.2)
set(ROCKSDB_VERSION 9.10.0)
set(SPDLOG_VERSION 1.15.1)
set(ROCKSDB_VERSION 10.0.1)
set(SPDLOG_VERSION 1.15.2)
set(ZLIB_VERSION 1.3.1)

View File

@ -8,7 +8,7 @@ PROJECT_DESC="Utility to remove, block and search stalled downloads in lidarr, r
PROJECT_URL="https://git.fifthgrid.com/public/monitarr"
PROJECT_MAJOR_VERSION=1
PROJECT_MINOR_VERSION=0
PROJECT_MINOR_VERSION=1
PROJECT_REVISION_VERSION=0
PROJECT_RELEASE_NUM=0
PROJECT_RELEASE_ITER=release

View File

@ -31,6 +31,7 @@ RUN apk add \
gflags \
gflags-dev \
git \
git-lfs \
icu-dev \
icu-libs \
icu-static \

View File

@ -31,6 +31,7 @@ RUN apk add \
gflags \
gflags-dev \
git \
git-lfs \
icu-dev \
icu-libs \
icu-static \

View File

@ -18,6 +18,7 @@ RUN apk add \
gcc \
gettext \
git \
git-lfs \
gmp \
gmp-dev \
gperf \
@ -350,9 +351,9 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./expat-${MY_EXPAT_VERSION}.tar.gz.sha
ARG FONTCONFIG_VERSION
ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION}
RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz" ]; then \
cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz.sha256 && cd - \
&& tar xvzf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz \
RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz" ]; then \
cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz.sha256 && cd - \
&& tar xvJf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz \
&& cd fontconfig-${MY_FONTCONFIG_VERSION} \
&& meson setup \
--cross-file ${MY_TOOLCHAIN_FILE_MESON} \

View File

@ -40,7 +40,8 @@ auto list_cmd(int argc, char **argv, const app_config &cfg) -> int {
const auto &server = cfg.server_list.at(utils::string::to_uint64(*idx));
utils::error::handle_info(
function_name, fmt::format("list queue|{}|{}", server.id, server.url));
function_name,
fmt::format("list queue|sid|{}|url|{}", server.id, server.url));
return list_queue(server);
}
} // namespace monitarr

View File

@ -40,8 +40,8 @@ monitarr::stop_type stop_requested{false};
void quit_handler(int sig) {
MONITARR_USES_FUNCTION_NAME();
monitarr::utils::error::handle_info(function_name,
fmt::format("stop requested|{}", sig));
monitarr::utils::error::handle_info(
function_name, fmt::format("stop requested|signal|{}", sig));
stop_requested = true;
monitarr::mutex_lock lock(mtx);
@ -53,8 +53,9 @@ namespace monitarr {
static void check_server(const server_cfg &server, data_db &state_db) {
MONITARR_USES_FUNCTION_NAME();
utils::error::handle_info(function_name, fmt::format("checking server|{}|{}",
server.id, server.url));
utils::error::handle_info(
function_name,
fmt::format("checking server|sid|{}|url|{}", server.id, server.url));
auto cli = create_client(server);
@ -69,15 +70,16 @@ static void check_server(const server_cfg &server, data_db &state_db) {
if (not response) {
utils::error::handle_error(
function_name,
fmt::format("check server request failed|{}|{}|no response",
fmt::format("check server request failed|sid|{}|url|{}|no response",
server.id, server.url));
break;
}
if (response->status != httplib::StatusCode::OK_200) {
utils::error::handle_error(
function_name, fmt::format("check server request failed|{}|{}|{}",
server.id, server.url, response->status));
function_name,
fmt::format("check server request failed|sid|{}|url|{}|status|{}",
server.id, server.url, response->status));
break;
}
@ -101,23 +103,29 @@ static void check_server(const server_cfg &server, data_db &state_db) {
auto movie_id = record.contains("movieId")
? record["movieId"].get<std::uint64_t>()
: std::uint64_t{0U};
auto size = record.at("size").get<std::uint64_t>();
auto size_left = record.at("sizeleft").get<std::uint64_t>();
auto title = record.at("title").get<std::string>();
auto is_downloading = utils::string::contains(
record.at("status").get<std::string>(), "downloading");
auto is_downloading =
utils::string::contains(record.at("status").get<std::string>(),
"downloading") ||
size == 0U;
auto data = state_db.get(download_id);
const auto update_entry = [&download_id, &now, server_id = server.id,
&size_left, &state_db, &title,
&size, &size_left, &state_db, &title,
url = server.url](auto last_size_left) {
if (size_left == 0U) {
if (size != 0U && size_left == 0U) {
state_db.remove(download_id);
return;
}
utils::error::handle_info(
function_name, fmt::format("updating {}|{}|{}|{}|{}", download_id,
title, now, size_left, last_size_left));
function_name,
fmt::format(
"updating "
"id|{}|title|{}|now|{}|size|{}|size_left|{}|last_size_left|{}",
download_id, title, now, size, size_left, last_size_left));
state_db.set(data_entry{
download_id,
now,
@ -129,10 +137,12 @@ static void check_server(const server_cfg &server, data_db &state_db) {
if (std::chrono::nanoseconds(now - data->last_check) >=
server.timeout) {
utils::error::handle_info(
function_name,
fmt::format("processing timeout {}|{}|{}|{}|{}", download_id,
title, now, size_left, data->size_left));
if (size_left == data->size_left) {
function_name, fmt::format("processing timeout "
"id|{}|title|{}|now|{}|size|{}|size_"
"left|{}|last_size_left|{}",
download_id, title, now, size,
size_left, data->size_left));
if (size == 0U || size_left == data->size_left) {
remove_stalled(download_id, title, episode_id, movie_id, server,
&state_db);
} else if (size_left == 0U || not is_downloading) {
@ -140,10 +150,10 @@ static void check_server(const server_cfg &server, data_db &state_db) {
} else {
update_entry(data->size_left);
}
} else if (size_left == 0U || not is_downloading) {
} else if ((size != 0U && size_left == 0U) || not is_downloading) {
state_db.remove(download_id);
}
} else if (is_downloading && size_left > 0U) {
} else if (is_downloading && (size == 0U || size_left > 0U)) {
update_entry(0U);
}
}
@ -168,15 +178,15 @@ static void cleanup_entries(const server_cfg &server, data_db &state_db) {
}
utils::error::handle_warn(
function_name, fmt::format("download not found|{}|{}|{}", server.id,
server.url, entry.download_id));
function_name, fmt::format("download not found|sid|{}|url|{}|id|{}",
server.id, server.url, entry.download_id));
if (not is_not_found) {
continue;
}
utils::error::handle_warn(
function_name, fmt::format("removing download|{}|{}|{}", server.id,
server.url, entry.download_id));
function_name, fmt::format("removing download|sid|{}|url|{}|id|{}",
server.id, server.url, entry.download_id));
state_db.remove(entry.download_id);
}
}
@ -222,8 +232,8 @@ auto run_cmd(const app_config &cfg, std::string_view log_dir) -> int {
}
utils::error::handle_info(
function_name,
fmt::format("waiting for next check|{}", cfg.check_interval));
function_name, fmt::format("waiting for next check|interval|{}",
cfg.check_interval));
notify.wait_for(lock, cfg.check_interval);
}
@ -238,7 +248,7 @@ auto run_cmd(const app_config &cfg, std::string_view log_dir) -> int {
}
utils::error::handle_info(function_name,
fmt::format("exiting application|{}", ret));
fmt::format("exiting application|ret|{}", ret));
return ret;
}

View File

@ -15,6 +15,7 @@ if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_STATIC_LINK}" == "OFF" ]; th
/mingw64/bin/libstdc++-6.dll
/mingw64/bin/libwinpthread-1.dll
/mingw64/bin/libzlib1.dll
/mingw64/bin/libzstd.dll
/mingw64/bin/zlib1.dll
)

View File

@ -1,27 +1,27 @@
#!/bin/bash
declare -A PROJECT_VERSIONS
PROJECT_VERSIONS[BINUTILS]="2.43"
PROJECT_VERSIONS[BINUTILS]="2.44"
PROJECT_VERSIONS[BOOST2_MAJOR]="1"
PROJECT_VERSIONS[BOOST2_MINOR]="76"
PROJECT_VERSIONS[BOOST2_PATCH]="0"
PROJECT_VERSIONS[BOOST_MAJOR]="1"
PROJECT_VERSIONS[BOOST_MINOR]="87"
PROJECT_VERSIONS[BOOST_MINOR]="88"
PROJECT_VERSIONS[BOOST_PATCH]="0"
PROJECT_VERSIONS[CPP_HTTPLIB]="0.19.0"
PROJECT_VERSIONS[CURL]="8.12.1"
PROJECT_VERSIONS[CURL2]="8_12_1"
PROJECT_VERSIONS[EXPAT]="2.6.4"
PROJECT_VERSIONS[EXPAT2]="2_6_4"
PROJECT_VERSIONS[CPP_HTTPLIB]="0.20.0"
PROJECT_VERSIONS[CURL]="8.13.0"
PROJECT_VERSIONS[CURL2]="8_13_0"
PROJECT_VERSIONS[EXPAT]="2.7.1"
PROJECT_VERSIONS[EXPAT2]="2_7_1"
PROJECT_VERSIONS[GCC]="14.2.0"
PROJECT_VERSIONS[GTEST]="1.16.0"
PROJECT_VERSIONS[ICU]="76-1"
PROJECT_VERSIONS[JSON]="3.11.3"
PROJECT_VERSIONS[JSON]="3.12.0"
PROJECT_VERSIONS[MESA]="23.3.3"
PROJECT_VERSIONS[MINGW]="12.0.0"
PROJECT_VERSIONS[OPENSSL]="3.4.1"
PROJECT_VERSIONS[OPENSSL]="3.5.0"
PROJECT_VERSIONS[PKG_CONFIG]="0.29.2"
PROJECT_VERSIONS[ROCKSDB]="9.10.0"
PROJECT_VERSIONS[SPDLOG]="1.15.1"
PROJECT_VERSIONS[ROCKSDB]="10.0.1"
PROJECT_VERSIONS[SPDLOG]="1.15.2"
PROJECT_VERSIONS[ZLIB]="1.3.1"
export PROJECT_VERSIONS

Binary file not shown.

View File

@ -1 +0,0 @@
c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608 *cpp-httplib-0.19.0.tar.gz

BIN
support/3rd_party/cpp-httplib-0.20.0.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
18064587e0cc6a0d5d56d619f4cbbcaba47aa5d84d86013abbd45d95c6653866 cpp-httplib-0.20.0.tar.gz

Binary file not shown.

View File

@ -1 +0,0 @@
6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f *curl-8.12.1.tar.gz

BIN
support/3rd_party/curl-8.13.0.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
ccc5ba45d9f5320c70ffb24e5411b66ba55ea1f333bf78be0963ed90a9328699 curl-8.13.0.tar.gz

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406 json-3.11.3.tar.gz

BIN
support/3rd_party/json-3.12.0.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187 json-3.12.0.tar.gz

Binary file not shown.

View File

@ -1 +0,0 @@
b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365 binutils-2.43.tar.xz

BIN
support/3rd_party/mingw64/binutils-2.44.tar.xz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237 binutils-2.44.tar.xz

Binary file not shown.

View File

@ -1 +0,0 @@
372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2 *expat-2.6.4.tar.gz

BIN
support/3rd_party/mingw64/expat-2.7.1.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb expat-2.7.1.tar.gz

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3 *openssl-3.4.1.tar.gz

BIN
support/3rd_party/openssl-3.5.0.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
344d0a79f1a9b08029b0744e2cc401a43f9c90acd1044d09a530b4885a8e9fc0 openssl-3.5.0.tar.gz

BIN
support/3rd_party/rocksdb-10.0.1.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
3fdc9ca996971c4c039959866382c4a3a6c8ade4abf888f3b2ff77153e07bf28 rocksdb-10.0.1.tar.gz

Binary file not shown.

View File

@ -1 +0,0 @@
fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724 *rocksdb-9.10.0.tar.gz

Binary file not shown.

View File

@ -1 +0,0 @@
25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc *spdlog-1.15.1.tar.gz

BIN
support/3rd_party/spdlog-1.15.2.tar.gz (Stored with Git LFS) vendored Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
7a80896357f3e8e920e85e92633b14ba0f229c506e6f978578bdc35ba09e9a5d spdlog-1.15.2.tar.gz

View File

@ -25,8 +25,8 @@
#include "utils/string.hpp"
namespace monitarr::utils {
auto compare_version_strings(std::string version1,
std::string version2) -> std::int32_t {
auto compare_version_strings(std::string version1, std::string version2)
-> std::int32_t {
if (utils::string::contains(version1, "-")) {
version1 = utils::string::split(version1, '-', true)[0U];
@ -131,23 +131,47 @@ auto get_next_available_port(std::uint16_t first_port,
using ip::tcp;
boost::system::error_code error_code{};
while (first_port != 0U) {
io_context ctx{};
tcp::acceptor acceptor(ctx);
acceptor.open(tcp::v4(), error_code) ||
acceptor.bind({tcp::v4(), first_port}, error_code);
if (not error_code) {
break;
std::uint32_t check_port{first_port};
while (check_port <= 65535U) {
{
io_context ctx{};
tcp::socket socket(ctx);
socket.connect(
{
tcp::endpoint(ip::address_v4::loopback(),
static_cast<std::uint16_t>(check_port)),
},
error_code);
if (not error_code) {
++check_port;
continue;
}
}
++first_port;
{
io_context ctx{};
tcp::acceptor acceptor(ctx);
acceptor.open(tcp::v4(), error_code);
if (error_code) {
++check_port;
continue;
}
acceptor.set_option(boost::asio::ip::tcp::acceptor::linger(true, 0));
acceptor.bind({tcp::v4(), static_cast<std::uint16_t>(check_port)},
error_code);
if (error_code) {
++check_port;
continue;
}
}
available_port = static_cast<std::uint16_t>(check_port);
return true;
}
if (not error_code) {
available_port = first_port;
}
return not error_code;
return false;
}
#endif // defined(PROJECT_ENABLE_BOOST)