use proxmox_backup::configdir;
use proxmox_backup::tools;
+use proxmox_backup::server;
use proxmox_backup::tools::daemon;
use proxmox_backup::api_schema::router::*;
use proxmox_backup::api_schema::config::*;
use failure::*;
use lazy_static::lazy_static;
+use futures::*;
use futures::stream::Stream;
-use tokio::prelude::*;
use hyper;
},
)?;
- hyper::rt::run(server);
+ tokio::run(lazy(|| {
+
+ if let Err(err) = server::server_state_init() {
+ eprintln!("unable to start daemon - {}", err);
+ } else {
+ tokio::spawn(server);
+ }
+
+ Ok(())
+ }));
+
Ok(())
}
use std::panic::UnwindSafe;
use failure::*;
-use futures::future::poll_fn;
-use futures::try_ready;
use tokio::prelude::*;
+use crate::server;
use crate::tools::fd_change_cloexec;
-use crate::tools::signalfd::{SigSet, SignalFd};
// Unfortunately FnBox is nightly-only and Box<FnOnce> is unusable, so just use Box<Fn>...
pub type BoxedStoreFunc = Box<dyn Fn() -> Result<String, Error> + UnwindSafe + Send>;
let service = create_service(listener)?;
- // Block SIGHUP for *all* threads and use it for a signalfd handler:
- use nix::sys::signal;
- let mut sigs = SigSet::empty();
- sigs.add(signal::Signal::SIGHUP);
- signal::sigprocmask(signal::SigmaskHow::SIG_BLOCK, Some(&sigs), None)?;
-
- let mut sigfdstream = SignalFd::new(&sigs)?
- .map_err(|e| log::error!("error in signal handler: {}", e));
-
let mut reloader = Some(reloader);
- // Use a Future instead of a Stream for ease-of-use: Poll until we receive a SIGHUP.
- let signal_handler = poll_fn(move || {
- match try_ready!(sigfdstream.poll()) {
- Some(si) => {
- log::info!("received signal {}", si.ssi_signo);
- if si.ssi_signo == signal::Signal::SIGHUP as u32 {
- if let Err(e) = reloader.take().unwrap().fork_restart() {
- log::error!("error during reload: {}", e);
- }
- Ok(Async::Ready(()))
- } else {
- Ok(Async::NotReady)
- }
- }
- // or the stream ended (which it can't, really)
- None => Ok(Async::Ready(()))
- }
- });
-
- Ok(service.select(signal_handler)
- .map(|_| {
- log::info!("daemon shutting down...");
- crate::tools::request_shutdown();
+ let abort_future = server::shutdown_future().map_err(|_| {});
+ Ok(service
+ .select(abort_future)
+ .map(move |_| {
+ crate::tools::request_shutdown(); // make sure we are in shutdown mode
+ if server::is_reload_request() {
+ log::info!("daemon reload...");
+ if let Err(e) = reloader.take().unwrap().fork_restart() {
+ log::error!("error during reload: {}", e);
+ }
+ } else {
+ log::info!("daemon shutting down...");
+ }
})
.map_err(|_| ())
)