diff --git a/Cargo.lock b/Cargo.lock index 8f31045..608d3a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -466,6 +466,21 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -473,6 +488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -481,6 +497,34 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.32" @@ -499,8 +543,13 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] @@ -1180,13 +1229,15 @@ dependencies = [ [[package]] name = "pt_system_checking" -version = "0.1.5" +version = "0.2.0" dependencies = [ "anyhow", "chrono", "clap", "config", "reqwest", + "reqwest-middleware", + "reqwest-retry", "serde", "sysinfo", "tokio", @@ -1358,6 +1409,50 @@ dependencies = [ "web-sys", ] +[[package]] +name = "reqwest-middleware" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199dda04a536b532d0cc04d7979e39b1c763ea749bf91507017069c00b96056f" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "thiserror 2.0.18", + "tower-service", +] + +[[package]] +name = "reqwest-retry" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe2412db2af7d2268e7a5406be0431f37d9eb67ff390f35b395716f5f06c2eaa" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "getrandom 0.2.17", + "http", + "hyper", + "reqwest", + "reqwest-middleware", + "retry-policies", + "thiserror 2.0.18", + "tokio", + "tracing", + "wasmtimer", +] + +[[package]] +name = "retry-policies" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a4bd6027df676bcb752d3724db0ea3c0c5fc1dd0376fec51ac7dcaf9cc69be" +dependencies = [ + "rand", +] + [[package]] name = "ring" version = "0.17.14" @@ -2177,6 +2272,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.88" diff --git a/Cargo.toml b/Cargo.toml index d5e375b..59a2318 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pt_system_checking" -version = "0.1.5" +version = "0.2.0" edition = "2024" [dependencies] @@ -9,6 +9,8 @@ chrono = "0.4.43" clap = { version = "4.5.60", features = ["derive"] } config = "0.15.19" reqwest = "0.13.2" +reqwest-middleware = "0.5.1" +reqwest-retry = "0.9.1" serde = { version = "1.0.228", features = ["derive"] } sysinfo = "0.38.2" tokio = { version = "1.49.0", features = ["full"] } diff --git a/README.md b/README.md index 1faa1c4..0cc8ea2 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,12 @@ -# PT System Checking - 磁盘状态监控服务 +# PT System Checking -一个轻量级的系统磁盘监控服务,定期检查磁盘可用空间并上报到指定服务器。 +上报硬盘剩余空间到 Uptime Kuma 实例,以 ping 作为空间剩余 -## 功能特性 - -- 自动检测所有非可移动磁盘的可用空间 -- 定期上报磁盘状态到远程服务器 -- 支持通过环境变量或命令行参数配置 -- 支持 amd64 和 arm64 架构(适用于香橙派 Zero3) -- 一键部署脚本,自动配置 systemd 服务 - -## 快速开始 +## 部署 ### 一键部署(推荐) -在目标设备上运行以下命令: - -```bash -curl -fsSL https://gitea.service.jazzwhom.top/Passthem/pt-disk-report/raw/branch/main/install.sh | sudo bash -``` - -或者下载后运行: +下载后运行(因为需要交互脚本): ```bash wget https://gitea.service.jazzwhom.top/Passthem/pt-disk-report/raw/branch/main/install.sh @@ -46,20 +32,13 @@ wget https://gitea.service.jazzwhom.top/Passthem/pt-disk-report/raw/branch/main/ sudo bash update.sh ``` -更新脚本会: -1. 检查当前安装的版本 -2. 获取最新版本信息 -3. 自动备份当前版本 -4. 下载并替换新版本 -5. 重启服务(如果更新失败会自动恢复备份) - ### 卸载服务 ```bash sudo bash install.sh uninstall ``` -## 本地构建 +## 本地构建与发布 ### 安装交叉编译工具链 @@ -85,6 +64,12 @@ make prepare-release - `install.sh` - 一键部署脚本 - `update.sh` - 一键更新脚本 +### 发布 Gitea Release + +```bash +make create-release VERSION=0.1.5 +``` + ## 配置说明 服务支持以下配置项(通过环境变量): @@ -141,6 +126,3 @@ make test make clean ``` -## 许可证 - -根据项目需要添加许可证信息。 diff --git a/src/main.rs b/src/main.rs index e6239b6..9ec13e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,8 @@ use std::{collections::HashSet, time::Duration}; use clap::{Parser}; use config::{Config, ConfigError, Environment}; +use reqwest_middleware::ClientBuilder; +use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff}; use serde::Deserialize; use tokio::time::interval; @@ -59,8 +61,8 @@ async fn task(settings: &Settings) -> anyhow::Result<()> { available += davailable; } - let report = ((available >> 20) * 10) >> 10; - tracing::info!(report = report, "获取剩余硬盘空间(单位 .1GB)"); + let report = ((available >> 20) * 100) >> 10; + tracing::info!(report = report, "获取剩余硬盘空间(单位 .01GB)"); if settings.server_url.is_empty() { tracing::warn!("没有配置服务器地址,不会上报给服务端"); @@ -72,9 +74,14 @@ async fn task(settings: &Settings) -> anyhow::Result<()> { ("ping", &_rep), ]; + let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3); + let client = ClientBuilder::new(reqwest::Client::new()) + .with(RetryTransientMiddleware::new_with_policy(retry_policy)) + .build(); + let url = reqwest::Url::parse_with_params(&settings.server_url, ¶ms)?; let urls: String = url.clone().into(); - let resp = reqwest::get(url).await?.text().await?; + let resp = client.get(url).send().await?.text().await?; tracing::info!(url=urls, resp=resp, "上报了硬盘可用空间"); }