3 use anyhow
::{bail, format_err, Error}
;
6 use openssl
::ssl
::{SslMethod, SslAcceptor, SslFiletype}
;
8 use proxmox
::try_block
;
9 use proxmox
::api
::RpcEnvironmentType
;
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
::*;
19 if let Err(err
) = proxmox_backup
::tools
::runtime
::main(run()) {
20 eprintln
!("Error: {}", err
);
21 std
::process
::exit(-1);
25 async
fn run() -> Result
<(), Error
> {
26 if let Err(err
) = syslog
::init(
27 syslog
::Facility
::LOG_DAEMON
,
28 log
::LevelFilter
::Info
,
29 Some("proxmox-backup-proxy")) {
30 bail
!("unable to inititialize syslog - {}", err
);
33 let _
= public_auth_key(); // load with lazy_static
34 let _
= csrf_secret(); // load with lazy_static
36 let mut config
= ApiConfig
::new(
37 buildcfg
::JS_DIR
, &proxmox_backup
::api2
::ROUTER
, RpcEnvironmentType
::PUBLIC
);
39 // add default dirs which includes jquery and bootstrap
40 // my $base = '/usr/share/libpve-http-server-perl';
41 // add_dirs($self->{dirs}, '/css/' => "$base/css/");
42 // add_dirs($self->{dirs}, '/js/' => "$base/js/");
43 // add_dirs($self->{dirs}, '/fonts/' => "$base/fonts/");
44 config
.add_alias("novnc", "/usr/share/novnc-pve");
45 config
.add_alias("extjs", "/usr/share/javascript/extjs");
46 config
.add_alias("fontawesome", "/usr/share/fonts-font-awesome");
47 config
.add_alias("xtermjs", "/usr/share/pve-xtermjs");
48 config
.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit");
49 config
.add_alias("css", "/usr/share/javascript/proxmox-backup/css");
50 config
.add_alias("docs", "/usr/share/doc/proxmox-backup/html");
52 let rest_server
= RestServer
::new(config
);
54 //openssl req -x509 -newkey rsa:4096 -keyout /etc/proxmox-backup/proxy.key -out /etc/proxmox-backup/proxy.pem -nodes
55 let key_path
= configdir
!("/proxy.key");
56 let cert_path
= configdir
!("/proxy.pem");
58 let mut acceptor
= SslAcceptor
::mozilla_intermediate(SslMethod
::tls()).unwrap();
59 acceptor
.set_private_key_file(key_path
, SslFiletype
::PEM
)
60 .map_err(|err
| format_err
!("unable to read proxy key {} - {}", key_path
, err
))?
;
61 acceptor
.set_certificate_chain_file(cert_path
)
62 .map_err(|err
| format_err
!("unable to read proxy cert {} - {}", cert_path
, err
))?
;
63 acceptor
.check_private_key().unwrap();
65 let acceptor
= Arc
::new(acceptor
.build());
67 let server
= daemon
::create_daemon(
68 ([0,0,0,0,0,0,0,0], 8007).into(),
70 let connections
= proxmox_backup
::tools
::async_io
::StaticIncoming
::from(listener
)
72 .try_filter_map(move |(sock
, _addr
)| {
73 let acceptor
= Arc
::clone(&acceptor
);
75 sock
.set_nodelay(true).unwrap();
76 sock
.set_send_buffer_size(1024*1024).unwrap();
77 sock
.set_recv_buffer_size(1024*1024).unwrap();
78 Ok(tokio_openssl
::accept(&acceptor
, sock
)
80 .ok() // handshake errors aren't be fatal, so return None to filter
84 let connections
= proxmox_backup
::tools
::async_io
::HyperAccept(connections
);
87 .and_then(|_
| hyper
::Server
::builder(connections
)
89 .with_graceful_shutdown(server
::shutdown_future())
92 .map_err(|err
| eprintln
!("server error: {}", err
))
98 daemon
::systemd_notify(daemon
::SystemdNotify
::Ready
)?
;
100 let init_result
: Result
<(), Error
> = try_block
!({
101 server
::create_task_control_socket()?
;
102 server
::server_state_init()?
;
106 if let Err(err
) = init_result
{
107 bail
!("unable to start daemon - {}", err
);
111 log
::info
!("server shutting down, waiting for active workers to complete");
112 proxmox_backup
::server
::last_worker_future().await?
;
113 log
::info
!("done - exit server");