初始提交
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
2722
Cargo.lock
generated
Normal file
2722
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "pt_system_checking"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = { version = "1.0.102", features = ["backtrace"] }
|
||||||
|
chrono = "0.4.43"
|
||||||
|
clap = { version = "4.5.60", features = ["derive"] }
|
||||||
|
config = "0.15.19"
|
||||||
|
reqwest = "0.13.2"
|
||||||
|
serde = { version = "1.0.228", features = ["derive"] }
|
||||||
|
sysinfo = "0.38.2"
|
||||||
|
tokio = { version = "1.49.0", features = ["full"] }
|
||||||
|
tracing = "0.1.44"
|
||||||
|
tracing-subscriber = { version = "0.3.22", features = ["fmt", "env-filter"] }
|
||||||
104
src/main.rs
Normal file
104
src/main.rs
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use clap::{Parser};
|
||||||
|
use config::{Config, ConfigError, Environment};
|
||||||
|
use serde::Deserialize;
|
||||||
|
use tokio::time::interval;
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
|
pub struct Settings {
|
||||||
|
pub log_level: String,
|
||||||
|
pub interval: u64,
|
||||||
|
pub server_url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(author, version, about = "PT 的硬盘状态汇报程序")]
|
||||||
|
struct Args {
|
||||||
|
#[arg(short, long)]
|
||||||
|
interval: Option<u64>,
|
||||||
|
|
||||||
|
#[arg(short = 'l', long)]
|
||||||
|
log_level: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Settings {
|
||||||
|
pub fn new() -> Result<Self, ConfigError> {
|
||||||
|
let s = Config::builder()
|
||||||
|
.set_default("log_level", "info")?
|
||||||
|
.set_default("interval", 300)?
|
||||||
|
.set_default("server_url", "")?
|
||||||
|
.add_source(Environment::with_prefix("PT").separator("__"))
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
s.try_deserialize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument]
|
||||||
|
async fn task(settings: &Settings) -> anyhow::Result<()> {
|
||||||
|
let disks = sysinfo::Disks::new_with_refreshed_list();
|
||||||
|
|
||||||
|
let mut available = 0;
|
||||||
|
|
||||||
|
for disk in disks.list().iter().filter(|d| !d.is_removable()) {
|
||||||
|
available += disk.available_space();
|
||||||
|
}
|
||||||
|
|
||||||
|
let report = (available >> 20) / 100;
|
||||||
|
tracing::info!(report = report, "获取剩余硬盘空间(单位 .1GB)");
|
||||||
|
|
||||||
|
if settings.server_url.is_empty() {
|
||||||
|
tracing::warn!("没有配置服务器地址,不会上报给服务端");
|
||||||
|
} else {
|
||||||
|
let _rep = format!("{}", report);
|
||||||
|
let params = [
|
||||||
|
("status", "up"),
|
||||||
|
("msg", "OK"),
|
||||||
|
("ping", &_rep),
|
||||||
|
];
|
||||||
|
|
||||||
|
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?;
|
||||||
|
tracing::info!(url=urls, resp=resp, "上报了硬盘可用空间");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> anyhow::Result<()> {
|
||||||
|
let args = Args::parse();
|
||||||
|
let mut settings = Settings::new()?;
|
||||||
|
if let Some(i) = args.interval {
|
||||||
|
settings.interval = i;
|
||||||
|
}
|
||||||
|
if let Some(level) = args.log_level {
|
||||||
|
settings.log_level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
tracing_subscriber::fmt()
|
||||||
|
.with_env_filter(&settings.log_level)
|
||||||
|
.with_thread_ids(true)
|
||||||
|
.init();
|
||||||
|
|
||||||
|
tracing::info!("磁盘状态汇报程序启动");
|
||||||
|
let mut ticker = interval(Duration::from_secs(300));
|
||||||
|
|
||||||
|
loop {
|
||||||
|
tokio::select! {
|
||||||
|
_ = ticker.tick() => {
|
||||||
|
if let Err(e) = task(&settings).await {
|
||||||
|
tracing::error!(error = ?e, "执行任务时出错了!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ = tokio::signal::ctrl_c() => {
|
||||||
|
tracing::info!("收到 Ctrl+C 信号,程序退出");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user