]> git.proxmox.com Git - proxmox-backup.git/blob - src/bin/proxmox-backup-proxy.rs
update a chunk of stuff to the hyper release
[proxmox-backup.git] / src / bin / proxmox-backup-proxy.rs
1 use std::sync::Arc;
2
3 use failure::*;
4 use futures::*;
5 use hyper;
6 use openssl::ssl::{SslMethod, SslAcceptor, SslFiletype};
7
8 use proxmox::tools::try_block;
9 use proxmox::api::RpcEnvironmentType;
10
11 use proxmox_backup::configdir;
12 use proxmox_backup::buildcfg;
13 use proxmox_backup::server;
14 use proxmox_backup::tools::daemon;
15 use proxmox_backup::server::{ApiConfig, rest::*};
16 use proxmox_backup::auth_helpers::*;
17
18 #[tokio::main]
19 async fn main() {
20 if let Err(err) = run().await {
21 eprintln!("Error: {}", err);
22 std::process::exit(-1);
23 }
24 }
25
26 async fn run() -> Result<(), Error> {
27 if let Err(err) = syslog::init(
28 syslog::Facility::LOG_DAEMON,
29 log::LevelFilter::Info,
30 Some("proxmox-backup-proxy")) {
31 bail!("unable to inititialize syslog - {}", err);
32 }
33
34 let _ = public_auth_key(); // load with lazy_static
35 let _ = csrf_secret(); // load with lazy_static
36
37 let mut config = ApiConfig::new(
38 buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PUBLIC);
39
40 // add default dirs which includes jquery and bootstrap
41 // my $base = '/usr/share/libpve-http-server-perl';
42 // add_dirs($self->{dirs}, '/css/' => "$base/css/");
43 // add_dirs($self->{dirs}, '/js/' => "$base/js/");
44 // add_dirs($self->{dirs}, '/fonts/' => "$base/fonts/");
45 config.add_alias("novnc", "/usr/share/novnc-pve");
46 config.add_alias("extjs", "/usr/share/javascript/extjs");
47 config.add_alias("fontawesome", "/usr/share/fonts-font-awesome");
48 config.add_alias("xtermjs", "/usr/share/pve-xtermjs");
49 config.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit");
50
51 let rest_server = RestServer::new(config);
52
53 //openssl req -x509 -newkey rsa:4096 -keyout /etc/proxmox-backup/proxy.key -out /etc/proxmox-backup/proxy.pem -nodes
54 let key_path = configdir!("/proxy.key");
55 let cert_path = configdir!("/proxy.pem");
56
57 let mut acceptor = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
58 acceptor.set_private_key_file(key_path, SslFiletype::PEM)
59 .map_err(|err| format_err!("unable to read proxy key {} - {}", key_path, err))?;
60 acceptor.set_certificate_chain_file(cert_path)
61 .map_err(|err| format_err!("unable to read proxy cert {} - {}", cert_path, err))?;
62 acceptor.check_private_key().unwrap();
63
64 let acceptor = Arc::new(acceptor.build());
65
66 let server = daemon::create_daemon(
67 ([0,0,0,0,0,0,0,0], 8007).into(),
68 |listener, ready| {
69 let connections = proxmox_backup::tools::async_io::StaticIncoming::from(listener)
70 .map_err(Error::from)
71 .try_filter_map(move |(sock, _addr)| {
72 let acceptor = Arc::clone(&acceptor);
73 async move {
74 sock.set_nodelay(true).unwrap();
75 sock.set_send_buffer_size(1024*1024).unwrap();
76 sock.set_recv_buffer_size(1024*1024).unwrap();
77 Ok(tokio_openssl::accept(&acceptor, sock)
78 .await
79 .ok() // handshake errors aren't be fatal, so return None to filter
80 )
81 }
82 });
83 let connections = proxmox_backup::tools::async_io::HyperAccept(connections);
84
85 Ok(ready
86 .and_then(|_| hyper::Server::builder(connections)
87 .serve(rest_server)
88 .with_graceful_shutdown(server::shutdown_future())
89 .map_err(Error::from)
90 )
91 .map_err(|err| eprintln!("server error: {}", err))
92 .map(|_| ())
93 )
94 },
95 );
96
97 daemon::systemd_notify(daemon::SystemdNotify::Ready)?;
98
99 let init_result: Result<(), Error> = try_block!({
100 server::create_task_control_socket()?;
101 server::server_state_init()?;
102 Ok(())
103 });
104
105 if let Err(err) = init_result {
106 bail!("unable to start daemon - {}", err);
107 }
108
109 server.await?;
110 log::info!("done - exit server");
111
112 Ok(())
113 }