Add job flags

This commit is contained in:
asonix 2020-03-22 19:07:36 -05:00
parent dabeba43e2
commit 97b5612717
4 changed files with 77 additions and 5 deletions

View file

@ -7,6 +7,27 @@ To simply run the server, the command is as follows
$ ./relay $ ./relay
``` ```
To learn about any other tasks, the `--help` flag can be passed
```bash
$ ./relay --help
relay 0.1.0
An activitypub relay
USAGE:
relay [FLAGS] [OPTIONS]
FLAGS:
-h, --help Prints help information
-j, --jobs-only Only process background jobs, do not start the relay server
-n, --no-jobs Only run the relay server, do not process background jobs
-u, --undo Undo whitelisting or blocking domains
-V, --version Prints version information
OPTIONS:
-b <blocks>... A list of domains that should be blocked
-w <whitelists>... A list of domains that should be whitelisted
```
To add domains to the blocklist, use the `-b` flag and pass a list of domains To add domains to the blocklist, use the `-b` flag and pass a list of domains
```bash ```bash
$ ./relay -b asonix.dog blimps.xyz $ ./relay -b asonix.dog blimps.xyz
@ -22,7 +43,12 @@ $ ./relay -uw asonix.dog blimps.xyz
``` ```
Whitelisted domains are only checked against incoming activities if `WHITELIST_MODE` is enabled. Whitelisted domains are only checked against incoming activities if `WHITELIST_MODE` is enabled.
Blocks can be published in the nodeinfo metadata by settings `PUBLISH_BLOCKS` to true Blocks can be published in the nodeinfo metadata by setting `PUBLISH_BLOCKS` to true
For advanced setups, it may be useful to run the relay API and the background tasks in separate
processes, possibly on separate hosts. The `-j` and `-n` flags have been provided for this purpose.
By passing `-n`, a relay can be spawned that handles no deliveries. By passing `-j`, a relay will
not be spawned, but any deliveries existing in the database will be processed.
### Subscribing ### Subscribing
Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings. Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings.

View file

@ -9,8 +9,22 @@ pub struct Args {
#[structopt(short, help = "A list of domains that should be whitelisted")] #[structopt(short, help = "A list of domains that should be whitelisted")]
whitelists: Vec<String>, whitelists: Vec<String>,
#[structopt(short, help = "Undo whitelisting or blocking these domains")] #[structopt(short, long, help = "Undo whitelisting or blocking domains")]
undo: bool, undo: bool,
#[structopt(
short,
long,
help = "Only process background jobs, do not start the relay server"
)]
jobs_only: bool,
#[structopt(
short,
long,
help = "Only run the relay server, do not process background jobs"
)]
no_jobs: bool,
} }
impl Args { impl Args {
@ -29,4 +43,12 @@ impl Args {
pub fn undo(&self) -> bool { pub fn undo(&self) -> bool {
self.undo self.undo
} }
pub fn jobs_only(&self) -> bool {
self.jobs_only
}
pub fn no_jobs(&self) -> bool {
self.no_jobs
}
} }

View file

@ -1,3 +1,4 @@
use actix::Arbiter;
use actix_web::{ use actix_web::{
http::header::{ContentType, Expires}, http::header::{ContentType, Expires},
middleware::Logger, middleware::Logger,
@ -92,6 +93,12 @@ async fn main() -> Result<(), anyhow::Error> {
let args = Args::new(); let args = Args::new();
if args.jobs_only() && args.no_jobs() {
return Err(anyhow::Error::msg(
"Either the server or the jobs must be run",
));
}
if !args.blocks().is_empty() || !args.whitelists().is_empty() { if !args.blocks().is_empty() || !args.whitelists().is_empty() {
if args.undo() { if args.undo() {
db.remove_blocks(args.blocks()).await?; db.remove_blocks(args.blocks()).await?;
@ -110,9 +117,26 @@ async fn main() -> Result<(), anyhow::Error> {
let job_server = create_server(db.clone()); let job_server = create_server(db.clone());
if args.jobs_only() {
for _ in 0..num_cpus::get() {
let state = state.clone();
let job_server = job_server.clone();
Arbiter::new().exec_fn(move || {
create_workers(state, job_server);
});
}
actix_rt::signal::ctrl_c().await?;
return Ok(());
}
let no_jobs = args.no_jobs();
let bind_address = config.bind_address(); let bind_address = config.bind_address();
HttpServer::new(move || { HttpServer::new(move || {
create_workers(state.clone(), job_server.clone()); if !no_jobs {
create_workers(state.clone(), job_server.clone());
}
App::new() App::new()
.wrap(Logger::default()) .wrap(Logger::default())

View file

@ -9,7 +9,7 @@ use futures::{
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use std::sync::Arc; use std::sync::Arc;
async fn handle_notification(state: &State, notif: Notification) { async fn handle_notification(state: State, notif: Notification) {
match notif.channel() { match notif.channel() {
"new_blocks" => { "new_blocks" => {
info!("Caching block of {}", notif.payload()); info!("Caching block of {}", notif.payload());
@ -88,7 +88,7 @@ pub fn spawn(state: State, config: &crate::config::Config) -> Result<(), MyError
}); });
while let Some(n) = stream.next().await { while let Some(n) = stream.next().await {
handle_notification(&state, n).await; actix::spawn(handle_notification(state.clone(), n));
} }
drop(client); drop(client);