X-Git-Url: https://git.proxmox.com/?p=proxmox-backup.git;a=blobdiff_plain;f=src%2Fbin%2Fproxmox-backup-api.rs;h=ee037a3bb30574df163fdd9310d9ad4845bd1611;hp=17b6f1844dea3ce3b6e12c700786f2fed0345018;hb=d91a0f9fc90aecabc4f359d968f716a14562ce78;hpb=8bca935f08757b11acff9ae2cddea45a4d6816c2 diff --git a/src/bin/proxmox-backup-api.rs b/src/bin/proxmox-backup-api.rs index 17b6f184..ee037a3b 100644 --- a/src/bin/proxmox-backup-api.rs +++ b/src/bin/proxmox-backup-api.rs @@ -1,32 +1,66 @@ +use std::future::Future; +use std::pin::Pin; + use anyhow::{bail, Error}; use futures::*; +use http::request::Parts; +use http::Response; +use hyper::{Body, Method, StatusCode}; +use http::HeaderMap; -use proxmox::try_block; -use proxmox::api::RpcEnvironmentType; -use proxmox::tools::fs::CreateOptions; - -use pbs_tools::auth::private_auth_key; -use proxmox_rest_server::ApiConfig; +use proxmox_lang::try_block; +use proxmox_router::{RpcEnvironmentType, UserInformation}; +use proxmox_sys::fs::CreateOptions; -use proxmox_backup::server::{ - self, - auth::default_api_auth, - rest::*, -}; -use proxmox_rest_server::daemon; +use proxmox_rest_server::{daemon, AuthError, ApiConfig, RestServer, RestEnvironment, ServerAdapter}; +use proxmox_backup::server::auth::check_pbs_auth; use proxmox_backup::auth_helpers::*; use proxmox_backup::config; fn main() { + pbs_tools::setup_libc_malloc_opts(); + proxmox_backup::tools::setup_safe_path_env(); - if let Err(err) = pbs_runtime::main(run()) { + if let Err(err) = proxmox_async::runtime::main(run()) { eprintln!("Error: {}", err); std::process::exit(-1); } } +struct ProxmoxBackupApiAdapter; + +impl ServerAdapter for ProxmoxBackupApiAdapter { + + fn get_index( + &self, + _env: RestEnvironment, + _parts: Parts, + ) -> Pin> + Send>> { + Box::pin(async move { + + let index = "

Proxmox Backup API Server

"; + + Response::builder() + .status(StatusCode::OK) + .header(hyper::header::CONTENT_TYPE, "text/html") + .body(index.into()) + .unwrap() + }) + } + + fn check_auth<'a>( + &'a self, + headers: &'a HeaderMap, + method: &'a Method, + ) -> Pin), AuthError>> + Send + 'a>> { + Box::pin(async move { + check_pbs_auth(headers, method).await + }) + } +} + async fn run() -> Result<(), Error> { if let Err(err) = syslog::init( syslog::Facility::LOG_DAEMON, @@ -35,15 +69,12 @@ async fn run() -> Result<(), Error> { bail!("unable to inititialize syslog - {}", err); } - server::create_task_log_dirs()?; - config::create_configdir()?; config::update_self_signed_cert(false)?; proxmox_backup::server::create_run_dir()?; - - proxmox_backup::rrd::create_rrdb_dir()?; + proxmox_backup::server::create_state_dir()?; proxmox_backup::server::jobstate::create_jobstate_dir()?; proxmox_backup::tape::create_tape_status_dir()?; proxmox_backup::tape::create_drive_state_dir()?; @@ -64,52 +95,58 @@ async fn run() -> Result<(), Error> { pbs_buildcfg::JS_DIR, &proxmox_backup::api2::ROUTER, RpcEnvironmentType::PRIVILEGED, - default_api_auth(), + ProxmoxBackupApiAdapter, )?; let backup_user = pbs_config::backup_user()?; - let mut commando_sock = proxmox_rest_server::CommandoSocket::new(crate::server::our_ctrl_sock(), backup_user.gid); + let mut commando_sock = proxmox_rest_server::CommandSocket::new(proxmox_rest_server::our_ctrl_sock(), backup_user.gid); let dir_opts = CreateOptions::new().owner(backup_user.uid).group(backup_user.gid); let file_opts = CreateOptions::new().owner(backup_user.uid).group(backup_user.gid); - config.enable_file_log( + config.enable_access_log( pbs_buildcfg::API_ACCESS_LOG_FN, - Some(dir_opts), - Some(file_opts), + Some(dir_opts.clone()), + Some(file_opts.clone()), + &mut commando_sock, + )?; + + config.enable_auth_log( + pbs_buildcfg::API_AUTH_LOG_FN, + Some(dir_opts.clone()), + Some(file_opts.clone()), &mut commando_sock, )?; + let rest_server = RestServer::new(config); + proxmox_rest_server::init_worker_tasks(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR_M!().into(), file_opts.clone())?; // http server future: let server = daemon::create_daemon( ([127,0,0,1], 82).into(), - move |listener, ready| { - let incoming = proxmox_backup::tools::async_io::StaticIncoming::from(listener); - Ok(ready - .and_then(|_| hyper::Server::builder(incoming) + move |listener| { + let incoming = hyper::server::conn::AddrIncoming::from_listener(listener)?; + + Ok(async { + daemon::systemd_notify(daemon::SystemdNotify::Ready)?; + + hyper::Server::builder(incoming) .serve(rest_server) .with_graceful_shutdown(proxmox_rest_server::shutdown_future()) .map_err(Error::from) - ) - .map(|e| { - if let Err(e) = e { - eprintln!("server error: {}", e); - } - }) - ) + .await + }) }, - "proxmox-backup.service", ); - server::write_pid(pbs_buildcfg::PROXMOX_BACKUP_API_PID_FN)?; - daemon::systemd_notify(daemon::SystemdNotify::Ready)?; + proxmox_rest_server::write_pid(pbs_buildcfg::PROXMOX_BACKUP_API_PID_FN)?; let init_result: Result<(), Error> = try_block!({ - server::register_task_control_commands(&mut commando_sock)?; + proxmox_rest_server::register_task_control_commands(&mut commando_sock)?; commando_sock.spawn()?; - proxmox_rest_server::server_state_init()?; + proxmox_rest_server::catch_shutdown_signal()?; + proxmox_rest_server::catch_reload_signal()?; Ok(()) });