implement cache/clean api

This commit is contained in:
postscriptum 2026-03-23 08:47:47 +02:00
parent 0603fdf4a6
commit 461f838cc0
4 changed files with 35 additions and 3 deletions

View file

@ -26,8 +26,9 @@ RUST_LOG=trace cargo run -- --allow=http://localhost/allow.txt \
``` ```
* set `socks5://127.0.0.1:1080` proxy in your application * set `socks5://127.0.0.1:1080` proxy in your application
* open http://127.0.0.1:8010 in browser for stats: * open http://127.0.0.1:8010 in browser for stats:
* `/api/allow/domain.com` - add rule to the current session (and `--cache` if defined) * `/api/allow/{domain.com}` - add rule to the current session (and `--cache` if defined)
* `/api/block/domain.com` - delete rule from the current session (and `--cache` if defined) * `/api/block/{domain.com}` - delete rule from the current session (and `--cache` if defined)
* `/api/cache/clean` - clean `--cache` file (returns deleted rules or `null` if not enabled)
### Allow list example ### Allow list example

View file

@ -90,4 +90,9 @@ impl List {
self.cache.block(rule).await?; self.cache.block(rule).await?;
Ok(self.index.write().await.remove(&Item::from_line(rule))) Ok(self.index.write().await.remove(&Item::from_line(rule)))
} }
/// Privately clean `--cache` file collected, return deleted rules
/// * we can implement `self.index` update at this step @TODO
pub async fn cache_clean(&self) -> Result<Option<Vec<String>>> {
self.cache.clean().await
}
} }

View file

@ -49,6 +49,22 @@ impl Cache {
} }
Ok(()) Ok(())
} }
/// Clean `--cache` file collected, return deleted rules
pub async fn clean(&self) -> Result<Option<Vec<String>>> {
match self.0 {
Some(ref p) => {
init_file(p).await?;
let mut rules = Vec::new();
let lines = fs::read_to_string(p).await?;
for line in lines.lines() {
rules.push(line.into());
}
fs::write(p, "").await?;
Ok(Some(rules))
}
None => Ok(None),
}
}
} }
/// Make sure that cache file is always exist (e.g. user may remove it when the daemon is running) /// Make sure that cache file is always exist (e.g. user may remove it when the daemon is running)

View file

@ -56,6 +56,16 @@ async fn api_block(
})?)) })?))
} }
#[rocket::get("/api/cache/clean")]
async fn api_cache_clean(list: &State<Arc<List>>) -> Result<Json<Option<Vec<String>>>, Status> {
let result = list.cache_clean().await;
info!("Clean cache file: {result:?}");
Ok(Json(result.map_err(|e| {
error!("Could not handle cache clean request: `{e}`");
Status::InternalServerError
})?))
}
#[rocket::launch] #[rocket::launch]
async fn rocket() -> _ { async fn rocket() -> _ {
env_logger::init(); env_logger::init();
@ -91,7 +101,7 @@ async fn rocket() -> _ {
.manage(Instant::now()) .manage(Instant::now())
.mount( .mount(
"/", "/",
rocket::routes![index, api_totals, api_allow, api_block], rocket::routes![index, api_totals, api_allow, api_block, api_cache_clean],
) )
} }