]> git.proxmox.com Git - proxmox-backup.git/blob - src/bin/proxmox-backup-api.rs
server/rest: add ApiAuth trait to make user auth generic
[proxmox-backup.git] / src / bin / proxmox-backup-api.rs
1 use anyhow::{bail, Error};
2 use futures::*;
3
4 use proxmox::try_block;
5 use proxmox::api::RpcEnvironmentType;
6
7 //use proxmox_backup::tools;
8 //use proxmox_backup::api_schema::config::*;
9 use proxmox_backup::server::{
10 self,
11 auth::default_api_auth,
12 rest::*,
13 };
14 use proxmox_backup::tools::daemon;
15 use proxmox_backup::auth_helpers::*;
16 use proxmox_backup::config;
17 use proxmox_backup::buildcfg;
18
19 fn main() {
20 proxmox_backup::tools::setup_safe_path_env();
21
22 if let Err(err) = proxmox_backup::tools::runtime::main(run()) {
23 eprintln!("Error: {}", err);
24 std::process::exit(-1);
25 }
26 }
27
28 async fn run() -> Result<(), Error> {
29 if let Err(err) = syslog::init(
30 syslog::Facility::LOG_DAEMON,
31 log::LevelFilter::Info,
32 Some("proxmox-backup-api")) {
33 bail!("unable to inititialize syslog - {}", err);
34 }
35
36 server::create_task_log_dirs()?;
37
38 config::create_configdir()?;
39
40 config::update_self_signed_cert(false)?;
41
42 proxmox_backup::rrd::create_rrdb_dir()?;
43 proxmox_backup::server::jobstate::create_jobstate_dir()?;
44 proxmox_backup::tape::create_tape_status_dir()?;
45 proxmox_backup::tape::create_drive_state_dir()?;
46 proxmox_backup::tape::create_changer_state_dir()?;
47
48 if let Err(err) = generate_auth_key() {
49 bail!("unable to generate auth key - {}", err);
50 }
51 let _ = private_auth_key(); // load with lazy_static
52
53 if let Err(err) = generate_csrf_key() {
54 bail!("unable to generate csrf key - {}", err);
55 }
56 let _ = csrf_secret(); // load with lazy_static
57
58 let mut config = server::ApiConfig::new(
59 buildcfg::JS_DIR,
60 &proxmox_backup::api2::ROUTER,
61 RpcEnvironmentType::PRIVILEGED,
62 default_api_auth(),
63 )?;
64
65 let mut commando_sock = server::CommandoSocket::new(server::our_ctrl_sock());
66
67 config.enable_file_log(buildcfg::API_ACCESS_LOG_FN, &mut commando_sock)?;
68
69 let rest_server = RestServer::new(config);
70
71 // http server future:
72 let server = daemon::create_daemon(
73 ([127,0,0,1], 82).into(),
74 move |listener, ready| {
75 let incoming = proxmox_backup::tools::async_io::StaticIncoming::from(listener);
76 Ok(ready
77 .and_then(|_| hyper::Server::builder(incoming)
78 .serve(rest_server)
79 .with_graceful_shutdown(server::shutdown_future())
80 .map_err(Error::from)
81 )
82 .map(|e| {
83 if let Err(e) = e {
84 eprintln!("server error: {}", e);
85 }
86 })
87 )
88 },
89 "proxmox-backup.service",
90 );
91
92 server::write_pid(buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
93 daemon::systemd_notify(daemon::SystemdNotify::Ready)?;
94
95 let init_result: Result<(), Error> = try_block!({
96 server::register_task_control_commands(&mut commando_sock)?;
97 commando_sock.spawn()?;
98 server::server_state_init()?;
99 Ok(())
100 });
101
102 if let Err(err) = init_result {
103 bail!("unable to start daemon - {}", err);
104 }
105
106 server.await?;
107 log::info!("server shutting down, waiting for active workers to complete");
108 proxmox_backup::server::last_worker_future().await?;
109
110 log::info!("done - exit server");
111
112 Ok(())
113 }