also download original logs files

This commit is contained in:
Robin Appelman 2021-06-05 17:20:09 +02:00
commit 5868f998bd
3 changed files with 310 additions and 202 deletions

485
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -13,3 +13,4 @@ reqwest = { version = "0.11", default-features = false , features = ["rustls-tls
serde = { version = "1", features = ["derive"] }
serde_json = "1"
chrono = { version = "0.4", features = ["serde"] }
zip = "0.5"

View file

@ -4,17 +4,20 @@ use reqwest::{Client, Response};
use serde::Deserialize;
use serde_json::Value;
use sqlx::postgres::PgPool;
use std::io::Cursor;
use std::path::{Path, PathBuf};
use std::time::Duration;
use tokio::time::sleep;
use zip::ZipArchive;
#[tokio::main]
async fn main() -> Result<(), MainError> {
let database_url = dotenv::var("DATABASE_URL")?;
let api_base =
dotenv::var("API_BASE").unwrap_or_else(|_| "http://logs.tf/api/v1/log".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")?);
loop {
if let Err(e) = archive(&database_url, &api_base).await {
if let Err(e) = archive(&database_url, &api_host, &log_target).await {
eprintln!("{:?}", e);
}
@ -22,9 +25,9 @@ async fn main() -> Result<(), MainError> {
}
}
async fn get_last_demo(client: &Client, api_base: &str) -> Result<i32, MainError> {
async fn get_last_demo(client: &Client, api_host: &str) -> Result<i32, MainError> {
let response: Response = client
.get(&format!("{}?limit=100", api_base))
.get(&format!("{}/api/v1/log?limit=100", api_host))
.send()
.await?;
let listing: LogListing = serde_json::from_str(&response.text().await?)?;
@ -43,7 +46,7 @@ async fn get_last_demo(client: &Client, api_base: &str) -> Result<i32, MainError
Ok(last_log.ok_or("Failed to find last log")?.id)
}
async fn archive(database_url: &str, api_base: &str) -> Result<(), MainError> {
async fn archive(database_url: &str, api_host: &str, log_target: &Path) -> Result<(), MainError> {
let pool = PgPool::connect(database_url).await?;
let client = reqwest::Client::new();
@ -52,7 +55,7 @@ async fn archive(database_url: &str, api_base: &str) -> Result<(), MainError> {
.fetch_one(&pool)
.await?;
let last_demo = get_last_demo(&client, api_base).await?;
let last_demo = get_last_demo(&client, api_host).await?;
println!("Archiving up to log {}", last_demo);
let mut last_archived = row.last_archived.unwrap_or_default();
@ -65,7 +68,7 @@ async fn archive(database_url: &str, api_base: &str) -> Result<(), MainError> {
sleep(Duration::from_millis(200)).await;
let response: Response = client
.get(&format!("{}/{}", api_base, last_archived))
.get(&format!("{}/api/v1/log/{}", api_host, last_archived))
.send()
.await?;
let body: Value = serde_json::from_str(&response.text().await?)?;
@ -77,6 +80,15 @@ async fn archive(database_url: &str, api_base: &str) -> Result<(), MainError> {
)
.execute(&pool)
.await?;
let log_zip = client
.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(())