1 use anyhow
::{bail, Error}
;
3 use http
::request
::Parts
;
5 use hyper
::{Body, StatusCode}
;
8 use proxmox
::try_block
;
9 use proxmox
::api
::RpcEnvironmentType
;
10 use proxmox
::tools
::fs
::CreateOptions
;
12 use pbs_tools
::auth
::private_auth_key
;
13 use proxmox_rest_server
::{daemon, ApiConfig, RestServer}
;
15 use proxmox_backup
::server
::auth
::default_api_auth
;
16 use proxmox_backup
::auth_helpers
::*;
17 use proxmox_backup
::config
;
20 proxmox_backup
::tools
::setup_safe_path_env();
22 if let Err(err
) = pbs_runtime
::main(run()) {
23 eprintln
!("Error: {}", err
);
24 std
::process
::exit(-1);
29 _auth_id
: Option
<String
>,
30 _language
: Option
<String
>,
35 let index
= "<center><h1>Proxmox Backup API Server</h1></center>";
38 .status(StatusCode
::OK
)
39 .header(header
::CONTENT_TYPE
, "text/html")
44 async
fn run() -> Result
<(), Error
> {
45 if let Err(err
) = syslog
::init(
46 syslog
::Facility
::LOG_DAEMON
,
47 log
::LevelFilter
::Info
,
48 Some("proxmox-backup-api")) {
49 bail
!("unable to inititialize syslog - {}", err
);
52 config
::create_configdir()?
;
54 config
::update_self_signed_cert(false)?
;
56 proxmox_backup
::server
::create_run_dir()?
;
58 proxmox_backup
::rrd
::create_rrdb_dir()?
;
59 proxmox_backup
::server
::jobstate
::create_jobstate_dir()?
;
60 proxmox_backup
::tape
::create_tape_status_dir()?
;
61 proxmox_backup
::tape
::create_drive_state_dir()?
;
62 proxmox_backup
::tape
::create_changer_state_dir()?
;
63 proxmox_backup
::tape
::create_drive_lock_dir()?
;
65 if let Err(err
) = generate_auth_key() {
66 bail
!("unable to generate auth key - {}", err
);
68 let _
= private_auth_key(); // load with lazy_static
70 if let Err(err
) = generate_csrf_key() {
71 bail
!("unable to generate csrf key - {}", err
);
73 let _
= csrf_secret(); // load with lazy_static
75 let mut config
= ApiConfig
::new(
77 &proxmox_backup
::api2
::ROUTER
,
78 RpcEnvironmentType
::PRIVILEGED
,
83 let backup_user
= pbs_config
::backup_user()?
;
84 let mut commando_sock
= proxmox_rest_server
::CommandoSocket
::new(proxmox_rest_server
::our_ctrl_sock(), backup_user
.gid
);
86 let dir_opts
= CreateOptions
::new().owner(backup_user
.uid
).group(backup_user
.gid
);
87 let file_opts
= CreateOptions
::new().owner(backup_user
.uid
).group(backup_user
.gid
);
89 config
.enable_file_log(
90 pbs_buildcfg
::API_ACCESS_LOG_FN
,
91 Some(dir_opts
.clone()),
92 Some(file_opts
.clone()),
96 config
.enable_auth_log(
97 pbs_buildcfg
::API_AUTH_LOG_FN
,
98 Some(dir_opts
.clone()),
99 Some(file_opts
.clone()),
104 let rest_server
= RestServer
::new(config
);
105 proxmox_rest_server
::init_worker_tasks(pbs_buildcfg
::PROXMOX_BACKUP_LOG_DIR_M
!().into(), file_opts
.clone())?
;
107 // http server future:
108 let server
= daemon
::create_daemon(
109 ([127,0,0,1], 82).into(),
110 move |listener
, ready
| {
111 let incoming
= proxmox_backup
::tools
::async_io
::StaticIncoming
::from(listener
);
113 .and_then(|_
| hyper
::Server
::builder(incoming
)
115 .with_graceful_shutdown(proxmox_rest_server
::shutdown_future())
116 .map_err(Error
::from
)
120 eprintln
!("server error: {}", e
);
125 "proxmox-backup.service",
128 proxmox_rest_server
::write_pid(pbs_buildcfg
::PROXMOX_BACKUP_API_PID_FN
)?
;
129 daemon
::systemd_notify(daemon
::SystemdNotify
::Ready
)?
;
131 let init_result
: Result
<(), Error
> = try_block
!({
132 proxmox_rest_server
::register_task_control_commands(&mut commando_sock
)?
;
133 commando_sock
.spawn()?
;
134 proxmox_rest_server
::server_state_init()?
;
138 if let Err(err
) = init_result
{
139 bail
!("unable to start daemon - {}", err
);
143 log
::info
!("server shutting down, waiting for active workers to complete");
144 proxmox_rest_server
::last_worker_future().await?
;
146 log
::info
!("done - exit server");