Added stop signal handler

This commit is contained in:
Maurice 2022-11-03 11:28:27 +01:00
parent e874e4e473
commit d24c9b1ad9
4 changed files with 48 additions and 7 deletions

20
Cargo.lock generated

@ -605,6 +605,7 @@ dependencies = [
"rand", "rand",
"rouille", "rouille",
"serde", "serde",
"signal-hook",
] ]
[[package]] [[package]]
@ -788,6 +789,25 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "signal-hook"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
dependencies = [
"libc",
"signal-hook-registry",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "sled" name = "sled"
version = "0.34.7" version = "0.34.7"

@ -10,4 +10,5 @@ kv = { version = "0.24.0", features = ["json-value"] }
serde = { version = "1.0.145", features = ["derive"] } serde = { version = "1.0.145", features = ["derive"] }
chrono = { version = "0.4.22", features = ["serde"] } chrono = { version = "0.4.22", features = ["serde"] }
rand = "0.8.5" rand = "0.8.5"
rouille = "3.6.1" rouille = "3.6.1"
signal-hook = "0.3.14"

@ -4,4 +4,4 @@ WORKDIR /app
COPY ./target/x86_64-unknown-linux-musl/release/ /app COPY ./target/x86_64-unknown-linux-musl/release/ /app
COPY ./about.html /app/about.html COPY ./about.html /app/about.html
ENTRYPOINT [ "./pastabble" ] CMD [ "./pastabble" ]

@ -1,10 +1,11 @@
use std::{env, fs}; use std::{env, fs, thread};
use chrono::Utc; use chrono::Utc;
use kv::{Config, Store, Json, Bucket, Value}; use kv::{Config, Store, Json, Bucket, Value};
use paste::Paste; use paste::Paste;
use rand::{Rng, distributions::Alphanumeric}; use rand::{Rng, distributions::Alphanumeric};
use rouille::{Response, router, try_or_400, post_input, Request}; use rouille::{Response, router, try_or_400, post_input, Request, Server};
use signal_hook::{iterator::Signals, consts::{SIGINT, SIGTERM}};
mod paste; mod paste;
@ -46,9 +47,8 @@ fn main() {
let links = store.bucket::<String, String>(Some("links")) let links = store.bucket::<String, String>(Some("links"))
.expect("Failed to open links bucket"); .expect("Failed to open links bucket");
// Start server // Create server
println!("Started PASTABBLE server on port {}", port); let server = Server::new(format!("0.0.0.0:{}", port), move |req| {
rouille::start_server(format!("0.0.0.0:{}", port), move |req| {
router!(req, router!(req,
(GET) (/) => { (GET) (/) => {
Response::html(&about) Response::html(&about)
@ -84,7 +84,27 @@ fn main() {
}, },
_ => Response::empty_404() _ => Response::empty_404()
) )
}).expect("Failed to start server");
// Start server (run() or ::start_server is not able to handle graceful shutdown, hence stoppable() or poll() in loop)
println!("Started PASTABBLE server on {:?}", server.server_addr());
let (handle, stop) = server.stoppable();
// Listen for signals
let mut signals = Signals::new(&[SIGINT, SIGTERM]).unwrap();
thread::spawn(move || {
for sig in signals.forever() {
match sig {
_ => {
println!("Received stop signal {:?}, stopping server...", sig);
stop.send(()).expect("Failed to stop server");
}
}
}
}); });
// Join server thread
handle.join().unwrap();
} }
// Register paste handler // Register paste handler