]> git.proxmox.com Git - proxmox-backup.git/blob - src/bin/proxmox-backup-api.rs
proxmox-rest-server: improve logging
[proxmox-backup.git] / src / bin / proxmox-backup-api.rs
1 use anyhow::{bail, Error};
2 use futures::*;
3 use http::request::Parts;
4 use http::Response;
5 use hyper::{Body, StatusCode};
6 use hyper::header;
7
8 use proxmox::try_block;
9 use proxmox::api::RpcEnvironmentType;
10 use proxmox::tools::fs::CreateOptions;
11
12 use proxmox_rest_server::{daemon, ApiConfig, RestServer};
13
14 use proxmox_backup::server::auth::default_api_auth;
15 use proxmox_backup::auth_helpers::*;
16 use proxmox_backup::config;
17
18 fn main() {
19 proxmox_backup::tools::setup_safe_path_env();
20
21 if let Err(err) = pbs_runtime::main(run()) {
22 eprintln!("Error: {}", err);
23 std::process::exit(-1);
24 }
25 }
26
27 fn get_index(
28 _auth_id: Option<String>,
29 _language: Option<String>,
30 _api: &ApiConfig,
31 _parts: Parts,
32 ) -> Response<Body> {
33
34 let index = "<center><h1>Proxmox Backup API Server</h1></center>";
35
36 Response::builder()
37 .status(StatusCode::OK)
38 .header(header::CONTENT_TYPE, "text/html")
39 .body(index.into())
40 .unwrap()
41 }
42
43 async fn run() -> Result<(), Error> {
44 if let Err(err) = syslog::init(
45 syslog::Facility::LOG_DAEMON,
46 log::LevelFilter::Info,
47 Some("proxmox-backup-api")) {
48 bail!("unable to inititialize syslog - {}", err);
49 }
50
51 config::create_configdir()?;
52
53 config::update_self_signed_cert(false)?;
54
55 proxmox_backup::server::create_run_dir()?;
56
57 proxmox_backup::rrd::create_rrdb_dir()?;
58 proxmox_backup::server::jobstate::create_jobstate_dir()?;
59 proxmox_backup::tape::create_tape_status_dir()?;
60 proxmox_backup::tape::create_drive_state_dir()?;
61 proxmox_backup::tape::create_changer_state_dir()?;
62 proxmox_backup::tape::create_drive_lock_dir()?;
63
64 if let Err(err) = generate_auth_key() {
65 bail!("unable to generate auth key - {}", err);
66 }
67 let _ = private_auth_key(); // load with lazy_static
68
69 if let Err(err) = generate_csrf_key() {
70 bail!("unable to generate csrf key - {}", err);
71 }
72 let _ = csrf_secret(); // load with lazy_static
73
74 let mut config = ApiConfig::new(
75 pbs_buildcfg::JS_DIR,
76 &proxmox_backup::api2::ROUTER,
77 RpcEnvironmentType::PRIVILEGED,
78 default_api_auth(),
79 get_index,
80 )?;
81
82 let backup_user = pbs_config::backup_user()?;
83 let mut commando_sock = proxmox_rest_server::CommandoSocket::new(proxmox_rest_server::our_ctrl_sock(), backup_user.gid);
84
85 let dir_opts = CreateOptions::new().owner(backup_user.uid).group(backup_user.gid);
86 let file_opts = CreateOptions::new().owner(backup_user.uid).group(backup_user.gid);
87
88 config.enable_file_log(
89 pbs_buildcfg::API_ACCESS_LOG_FN,
90 Some(dir_opts.clone()),
91 Some(file_opts.clone()),
92 &mut commando_sock,
93 )?;
94
95 config.enable_auth_log(
96 pbs_buildcfg::API_AUTH_LOG_FN,
97 Some(dir_opts.clone()),
98 Some(file_opts.clone()),
99 &mut commando_sock,
100 )?;
101
102
103 let rest_server = RestServer::new(config);
104 proxmox_rest_server::init_worker_tasks(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR_M!().into(), file_opts.clone())?;
105
106 // http server future:
107 let server = daemon::create_daemon(
108 ([127,0,0,1], 82).into(),
109 move |listener| {
110 let incoming = hyper::server::conn::AddrIncoming::from_listener(listener)?;
111
112 Ok(async {
113 daemon::systemd_notify(daemon::SystemdNotify::Ready)?;
114
115 hyper::Server::builder(incoming)
116 .serve(rest_server)
117 .with_graceful_shutdown(proxmox_rest_server::shutdown_future())
118 .map_err(Error::from)
119 .await
120 })
121 },
122 "proxmox-backup.service",
123 );
124
125 proxmox_rest_server::write_pid(pbs_buildcfg::PROXMOX_BACKUP_API_PID_FN)?;
126
127 let init_result: Result<(), Error> = try_block!({
128 proxmox_rest_server::register_task_control_commands(&mut commando_sock)?;
129 commando_sock.spawn()?;
130 proxmox_rest_server::catch_shutdown_and_reload_signals()?;
131 Ok(())
132 });
133
134 if let Err(err) = init_result {
135 bail!("unable to start daemon - {}", err);
136 }
137
138 server.await?;
139 log::info!("server shutting down, waiting for active workers to complete");
140 proxmox_rest_server::last_worker_future().await?;
141
142 log::info!("done - exit server");
143
144 Ok(())
145 }