From 4f2b0a0b882d4e9ce31805114203042d471677c0 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 17 Aug 2023 18:19:41 +0200 Subject: [PATCH] Add admin button to update repo --- src/main.rs | 4 ++-- src/server.rs | 17 +++++++++++------ src/server/recurring.rs | 7 +++++-- src/server/web.rs | 10 +++++++--- src/server/web/admin.rs | 1 + src/server/web/admin/repo.rs | 29 +++++++++++++++++++++++++++++ src/server/web/pages/index.rs | 8 ++++++-- src/server/web/paths.rs | 4 ++++ templates/pages/index.html | 4 ++++ 9 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 src/server/web/admin/repo.rs diff --git a/src/main.rs b/src/main.rs index 70bc594..6fed466 100644 --- a/src/main.rs +++ b/src/main.rs @@ -176,10 +176,10 @@ async fn run() -> somehow::Result<()> { tokio::task::spawn(launch_local_workers(config, command.local_worker)); } - let server = Server::new(&config.server, command).await?; + let (server, recurring_rx) = Server::new(&config.server, command).await?; select! { _ = wait_for_signal() => {} - _ = server.run() => {} + _ = server.run(recurring_rx) => {} } select! { diff --git a/src/server.rs b/src/server.rs index bd9eb44..6fd48c5 100644 --- a/src/server.rs +++ b/src/server.rs @@ -18,7 +18,7 @@ use sqlx::{ sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions, SqliteSynchronous}, SqlitePool, }; -use tokio::select; +use tokio::{select, sync::mpsc}; use crate::{args::ServerCommand, config::ServerConfig, somehow}; @@ -117,13 +117,14 @@ pub struct Server { repo: Option, bench_repo: Option, workers: Arc>, + recurring_tx: Arc>, } impl Server { pub async fn new( config: &'static ServerConfig, command: ServerCommand, - ) -> somehow::Result { + ) -> somehow::Result<(Self, mpsc::UnboundedReceiver<()>)> { let repo = if let Some(path) = command.repo.as_ref() { let repo = open_repo(path, &config.repo_fetch_url, &config.repo_fetch_refspecs)?; Some(Repo(Arc::new(repo))) @@ -138,20 +139,24 @@ impl Server { None }; - Ok(Self { + let (recurring_tx, recurring_rx) = mpsc::unbounded_channel(); + let server = Self { config, db: open_db(&command.db).await?, repo, bench_repo, workers: Arc::new(Mutex::new(Workers::new(config))), - }) + recurring_tx: Arc::new(recurring_tx), + }; + + Ok((server, recurring_rx)) } - pub async fn run(&self) -> somehow::Result<()> { + pub async fn run(&self, recurring_rx: mpsc::UnboundedReceiver<()>) -> somehow::Result<()> { if let Some(repo) = self.repo.clone() { select! { e = web::run(self.clone()) => e, - () = recurring::run(self.clone(), repo) => Ok(()), + () = recurring::run(self.clone(), repo, recurring_rx) => Ok(()), } } else { web::run(self.clone()).await diff --git a/src/server/recurring.rs b/src/server/recurring.rs index faf1af3..7c8dcb5 100644 --- a/src/server/recurring.rs +++ b/src/server/recurring.rs @@ -4,14 +4,17 @@ mod fetch; mod queue; mod repo; +use tokio::sync::mpsc; + use super::{Repo, Server}; -pub(super) async fn run(server: Server, repo: Repo) { +pub(super) async fn run(server: Server, repo: Repo, mut recurring_rx: mpsc::UnboundedReceiver<()>) { loop { fetch::update(server.config, repo.clone()).await; repo::update(&server.db, repo.clone()).await; queue::update(&server.db).await; - tokio::time::sleep(server.config.repo_update).await; + let _ = tokio::time::timeout(server.config.repo_update, recurring_rx.recv()).await; + while let Ok(()) = recurring_rx.try_recv() {} } } diff --git a/src/server/web.rs b/src/server/web.rs index bc3ddbb..c66c1e2 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -12,9 +12,12 @@ use axum_extra::routing::RouterExt; use crate::somehow; use self::{ - admin::queue::{ - post_admin_queue_add, post_admin_queue_decrease, post_admin_queue_delete, - post_admin_queue_increase, + admin::{ + queue::{ + post_admin_queue_add, post_admin_queue_decrease, post_admin_queue_delete, + post_admin_queue_increase, + }, + repo::post_admin_repo_update, }, api::worker::{ get_api_worker_bench_repo_by_hash_tree_tar_gz, get_api_worker_repo_by_hash_tree_tar_gz, @@ -55,6 +58,7 @@ pub async fn run(server: Server) -> somehow::Result<()> { .typed_post(post_admin_queue_decrease) .typed_post(post_admin_queue_delete) .typed_post(post_admin_queue_increase) + .typed_post(post_admin_repo_update) .merge(post_api_worker_status) .fallback(get(r#static::static_handler)) .with_state(server.clone()); diff --git a/src/server/web/admin.rs b/src/server/web/admin.rs index e8ae652..e7f690b 100644 --- a/src/server/web/admin.rs +++ b/src/server/web/admin.rs @@ -1 +1,2 @@ pub mod queue; +pub mod repo; diff --git a/src/server/web/admin/repo.rs b/src/server/web/admin/repo.rs new file mode 100644 index 0000000..290f151 --- /dev/null +++ b/src/server/web/admin/repo.rs @@ -0,0 +1,29 @@ +use std::sync::Arc; + +use axum::{ + extract::State, + response::{IntoResponse, Redirect}, +}; +use log::info; +use tokio::sync::mpsc; + +use crate::{ + config::ServerConfig, + server::web::{ + base::Base, + paths::{PathAdminRepoUpdate, PathIndex}, + }, + somehow, +}; + +pub async fn post_admin_repo_update( + _path: PathAdminRepoUpdate, + State(config): State<&'static ServerConfig>, + State(recurring_tx): State>>, +) -> somehow::Result { + let _ = recurring_tx.send(()); + info!("Admin updated repo"); + + let link = Base::link_with_config(config, PathIndex {}); + Ok(Redirect::to(&link.to_string())) +} diff --git a/src/server/web/pages/index.rs b/src/server/web/pages/index.rs index ef66a0c..6fb6e45 100644 --- a/src/server/web/pages/index.rs +++ b/src/server/web/pages/index.rs @@ -6,9 +6,9 @@ use sqlx::SqlitePool; use crate::{ config::ServerConfig, server::web::{ - base::{Base, Tab}, + base::{Base, Link, Tab}, link::LinkCommit, - paths::PathIndex, + paths::{PathAdminRepoUpdate, PathIndex}, }, somehow, }; @@ -22,7 +22,9 @@ struct Ref { #[derive(Template)] #[template(path = "pages/index.html")] struct IndexTemplate { + link_admin_repo_update: Link, base: Base, + tracked_refs: Vec, untracked_refs: Vec, } @@ -62,7 +64,9 @@ pub async fn get_index( } Ok(IndexTemplate { + link_admin_repo_update: base.link(PathAdminRepoUpdate {}), base: Base::new(config, Tab::Index), + tracked_refs, untracked_refs, }) diff --git a/src/server/web/paths.rs b/src/server/web/paths.rs index 205f38d..d7c98da 100644 --- a/src/server/web/paths.rs +++ b/src/server/web/paths.rs @@ -53,6 +53,10 @@ pub struct PathWorkerByName { // Admin actions // /////////////////// +#[derive(Deserialize, TypedPath)] +#[typed_path("/admin/repo/update")] +pub struct PathAdminRepoUpdate {} + #[derive(Deserialize, TypedPath)] #[typed_path("/admin/queue/add")] pub struct PathAdminQueueAdd {} diff --git a/templates/pages/index.html b/templates/pages/index.html index b7e5b8a..8444e26 100644 --- a/templates/pages/index.html +++ b/templates/pages/index.html @@ -6,6 +6,10 @@

Refs

+
+ +
+
Tracked ({{ tracked_refs.len() }})