src/bin/proxmox-backup-proxy.rs: switch to async
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
		| @ -11,23 +11,21 @@ use proxmox::tools::try_block; | ||||
| use lazy_static::lazy_static; | ||||
|  | ||||
| use futures::*; | ||||
| use futures::stream::Stream; | ||||
|  | ||||
| use openssl::ssl::{SslMethod, SslAcceptor, SslFiletype}; | ||||
| use std::sync::Arc; | ||||
| use tokio_openssl::SslAcceptorExt; | ||||
|  | ||||
| use hyper; | ||||
|  | ||||
| fn main() { | ||||
|  | ||||
|     if let Err(err) = run() { | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
|     if let Err(err) = run().await { | ||||
|         eprintln!("Error: {}", err); | ||||
|         std::process::exit(-1); | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn run() -> Result<(), Error> { | ||||
| async fn run() -> Result<(), Error> { | ||||
|     if let Err(err) = syslog::init( | ||||
|         syslog::Facility::LOG_DAEMON, | ||||
|         log::LevelFilter::Info, | ||||
| @ -77,61 +75,41 @@ fn run() -> Result<(), Error> { | ||||
|             let connections = listener | ||||
|                 .incoming() | ||||
|                 .map_err(Error::from) | ||||
|                 .and_then(move |sock| { | ||||
|                     sock.set_nodelay(true).unwrap(); | ||||
|                     sock.set_send_buffer_size(1024*1024).unwrap(); | ||||
|                     sock.set_recv_buffer_size(1024*1024).unwrap(); | ||||
|                     acceptor.accept_async(sock).map_err(|e| e.into()) | ||||
|                 }) | ||||
|                 .then(|r| match r { | ||||
|                     // accept()s can fail here with an Err() when eg. the client rejects | ||||
|                     // the cert and closes the connection, so we follow up with mapping | ||||
|                     // it to an option and then filtering None with filter_map | ||||
|                     Ok(c) => Ok::<_, Error>(Some(c)), | ||||
|                     Err(e) => { | ||||
|                         if let Some(_io) = e.downcast_ref::<std::io::Error>() { | ||||
|                             // "real" IO errors should not simply be ignored | ||||
|                             bail!("shutting down..."); | ||||
|                         } else { | ||||
|                             // handshake errors just get filtered by filter_map() below: | ||||
|                             Ok(None) | ||||
|                         } | ||||
|                 .try_filter_map(move |sock| { | ||||
|                     let acceptor = Arc::clone(&acceptor); | ||||
|                     async move { | ||||
|                         sock.set_nodelay(true).unwrap(); | ||||
|                         sock.set_send_buffer_size(1024*1024).unwrap(); | ||||
|                         sock.set_recv_buffer_size(1024*1024).unwrap(); | ||||
|                         Ok(tokio_openssl::accept(&acceptor, sock) | ||||
|                             .await | ||||
|                             .ok() // handshake errors aren't be fatal, so return None to filter | ||||
|                         ) | ||||
|                     } | ||||
|                 }) | ||||
|                 .filter_map(|r| { | ||||
|                     // Filter out the Nones | ||||
|                     r | ||||
|                 }); | ||||
|  | ||||
|             Ok(hyper::Server::builder(connections) | ||||
|                .serve(rest_server) | ||||
|                .with_graceful_shutdown(server::shutdown_future()) | ||||
|                .map_err(|err| eprintln!("server error: {}", err)) | ||||
|                .map(|_| ()) | ||||
|             ) | ||||
|         }, | ||||
|     )?; | ||||
|  | ||||
|     daemon::systemd_notify(daemon::SystemdNotify::Ready)?; | ||||
|  | ||||
|     tokio::run(lazy(||  { | ||||
|  | ||||
|         let init_result: Result<(), Error> = try_block!({ | ||||
|             server::create_task_control_socket()?; | ||||
|             server::server_state_init()?; | ||||
|             Ok(()) | ||||
|         }); | ||||
|  | ||||
|         if let Err(err) = init_result { | ||||
|             eprintln!("unable to start daemon - {}", err); | ||||
|         } else { | ||||
|             tokio::spawn(server.then(|_| { | ||||
|                 log::info!("done - exit server"); | ||||
|                 Ok(()) | ||||
|             })); | ||||
|         } | ||||
|  | ||||
|     let init_result: Result<(), Error> = try_block!({ | ||||
|         server::create_task_control_socket()?; | ||||
|         server::server_state_init()?; | ||||
|         Ok(()) | ||||
|     })); | ||||
|     }); | ||||
|  | ||||
|     if let Err(err) = init_result { | ||||
|         bail!("unable to start daemon - {}", err); | ||||
|     } | ||||
|  | ||||
|     server.await; | ||||
|     log::info!("done - exit server"); | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user