]>
git.proxmox.com Git - proxmox-backup.git/blob - src/bin/proxmox-backup-proxy.rs
2 extern crate proxmox_backup
;
4 use proxmox_backup
::tools
;
5 use proxmox_backup
::api_schema
::router
::*;
6 use proxmox_backup
::api_schema
::config
::*;
7 use proxmox_backup
::server
::rest
::*;
8 use proxmox_backup
::auth_helpers
::*;
11 use lazy_static
::lazy_static
;
13 use futures
::future
::Future
;
14 use futures
::stream
::Stream
;
20 if let Err(err
) = run() {
21 eprintln
!("Error: {}", err
);
22 std
::process
::exit(-1);
26 fn run() -> Result
<(), Error
> {
28 if let Err(err
) = syslog
::init(
29 syslog
::Facility
::LOG_DAEMON
,
30 log
::LevelFilter
::Info
,
31 Some("proxmox-backup-proxy")) {
32 bail
!("unable to inititialize syslog - {}", err
);
35 let _
= public_auth_key(); // load with lazy_static
36 let _
= csrf_secret(); // load with lazy_static
39 static ref ROUTER
: Router
= proxmox_backup
::api2
::router();
42 let mut config
= ApiConfig
::new(
43 env
!("PROXMOX_JSDIR"), &ROUTER
, RpcEnvironmentType
::PUBLIC
);
45 // add default dirs which includes jquery and bootstrap
46 // my $base = '/usr/share/libpve-http-server-perl';
47 // add_dirs($self->{dirs}, '/css/' => "$base/css/");
48 // add_dirs($self->{dirs}, '/js/' => "$base/js/");
49 // add_dirs($self->{dirs}, '/fonts/' => "$base/fonts/");
50 config
.add_alias("novnc", "/usr/share/novnc-pve");
51 config
.add_alias("extjs", "/usr/share/javascript/extjs");
52 config
.add_alias("fontawesome", "/usr/share/fonts-font-awesome");
53 config
.add_alias("xtermjs", "/usr/share/pve-xtermjs");
54 config
.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit");
56 let rest_server
= RestServer
::new(config
);
58 let cert_path
= configdir
!("/proxy.pfx");
59 let raw_cert
= tools
::file_get_contents(cert_path
)?
;
61 let identity
= match native_tls
::Identity
::from_pkcs12(&raw_cert
, "") {
63 Err(err
) => bail
!("unabled to decode pkcs12 identity {} - {}", cert_path
, err
),
66 let addr
= ([0,0,0,0,0,0,0,0], 8007).into();
67 let listener
= tokio
::net
::TcpListener
::bind(&addr
)?
;
68 let acceptor
= native_tls
::TlsAcceptor
::new(identity
)?
;
69 let acceptor
= std
::sync
::Arc
::new(tokio_tls
::TlsAcceptor
::from(acceptor
));
70 let connections
= listener
73 .and_then(move |sock
| acceptor
.accept(sock
).map_err(|e
| e
.into()))
75 // accept()s can fail here with an Err() when eg. the client rejects
76 // the cert and closes the connection, so we follow up with mapping
77 // it to an option and then filtering None with filter_map
78 Ok(c
) => Ok
::<_
, Error
>(Some(c
)),
82 // Filter out the Nones
86 let server
= hyper
::Server
::builder(connections
)
88 .map_err(|e
| eprintln
!("server error: {}", e
));
90 // Run this server for... forever!
91 hyper
::rt
::run(server
);