mirror of
https://codeberg.org/icewind/log-archiver.git
synced 2026-06-03 17:44:06 +02:00
backdownload
This commit is contained in:
parent
5868f998bd
commit
cda4744106
1 changed files with 47 additions and 12 deletions
61
src/main.rs
61
src/main.rs
|
|
@ -4,6 +4,7 @@ use reqwest::{Client, Response};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use sqlx::postgres::PgPool;
|
use sqlx::postgres::PgPool;
|
||||||
|
use std::env::args;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
@ -16,13 +17,29 @@ async fn main() -> Result<(), MainError> {
|
||||||
let api_host = dotenv::var("API_HOST").unwrap_or_else(|_| "https://logs.tf".to_string());
|
let api_host = dotenv::var("API_HOST").unwrap_or_else(|_| "https://logs.tf".to_string());
|
||||||
let log_target = PathBuf::from(dotenv::var("LOG_TARGET")?);
|
let log_target = PathBuf::from(dotenv::var("LOG_TARGET")?);
|
||||||
|
|
||||||
loop {
|
let args = args();
|
||||||
if let Err(e) = archive(&database_url, &api_host, &log_target).await {
|
|
||||||
eprintln!("{:?}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
sleep(Duration::from_secs(60)).await;
|
if args.len() > 1 {
|
||||||
|
let mut args = args.skip(1);
|
||||||
|
let from: i32 = args.next().unwrap().parse()?;
|
||||||
|
let to: i32 = args.next().unwrap().parse()?;
|
||||||
|
let client = reqwest::Client::new();
|
||||||
|
for id in from..=to {
|
||||||
|
println!("downloading {}", id);
|
||||||
|
|
||||||
|
download_log(&api_host, &log_target, &client, id).await?;
|
||||||
|
sleep(Duration::from_millis(200)).await;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
loop {
|
||||||
|
if let Err(e) = archive(&database_url, &api_host, &log_target).await {
|
||||||
|
eprintln!("{:?}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(Duration::from_secs(60)).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_last_demo(client: &Client, api_host: &str) -> Result<i32, MainError> {
|
async fn get_last_demo(client: &Client, api_host: &str) -> Result<i32, MainError> {
|
||||||
|
|
@ -81,19 +98,37 @@ async fn archive(database_url: &str, api_host: &str, log_target: &Path) -> Resul
|
||||||
.execute(&pool)
|
.execute(&pool)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let log_zip = client
|
download_log(api_host, log_target, &client, last_archived).await?;
|
||||||
.get(&format!("{}/logs/log_{}.log.zip", api_host, last_archived))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.bytes()
|
|
||||||
.await?;
|
|
||||||
let mut archive = ZipArchive::new(Cursor::new(&log_zip))?;
|
|
||||||
archive.extract(log_target)?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn download_log(
|
||||||
|
api_host: &str,
|
||||||
|
log_target: &Path,
|
||||||
|
client: &Client,
|
||||||
|
id: i32,
|
||||||
|
) -> Result<(), MainError> {
|
||||||
|
let log_zip = client
|
||||||
|
.get(&format!("{}/logs/log_{}.log.zip", api_host, id))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.bytes()
|
||||||
|
.await?;
|
||||||
|
let mut archive = match ZipArchive::new(Cursor::new(&log_zip)) {
|
||||||
|
Ok(archive) => archive,
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Error extracting log: {:#}", e);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Err(e) = archive.extract(&log_target) {
|
||||||
|
eprintln!("Error extracting log: {:#}", e);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
struct LogListing {
|
struct LogListing {
|
||||||
success: bool,
|
success: bool,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue