diff --git a/debian/install b/debian/install index 9fa984f7..617f9376 100644 --- a/debian/install +++ b/debian/install @@ -1,4 +1,5 @@ target/release/proxmox-backup-api /usr/sbin +target/release/proxmox-backup-proxy /usr/bin target/release/proxmox-backup-manager /usr/sbin target/release/proxmox-backup-client /usr/sbin target/release/catar /usr/sbin diff --git a/debian/proxmox-backup-proxy.service b/debian/proxmox-backup-proxy.service new file mode 100644 index 00000000..481ff73c --- /dev/null +++ b/debian/proxmox-backup-proxy.service @@ -0,0 +1,16 @@ +[Unit] +Description=Proxmox API Proxy Server +ConditionPathExists=/usr/bin/proxmox-backup-proxy +Wants=proxmox-backup.service +After=syslog.service +After=network.target + +[Service] +User=www-data +Group=www-data +ExecStart=/usr/bin/proxmox-backup-proxy start +Type=simple +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/debian/rules b/debian/rules index fdda9fe9..9fe161d9 100755 --- a/debian/rules +++ b/debian/rules @@ -7,3 +7,7 @@ %: dh $@ --with=systemd --with=bash-completion + +override_dh_installinit: + dh_installinit + dh_installinit --name proxmox-backup-proxy diff --git a/src/api/config.rs b/src/api/config.rs index b395668b..2bb9e86e 100644 --- a/src/api/config.rs +++ b/src/api/config.rs @@ -9,15 +9,17 @@ pub struct ApiConfig { basedir: PathBuf, router: &'static Router, aliases: HashMap, + env_type: RpcEnvironmentType, } impl ApiConfig { - pub fn new>(basedir: B, router: &'static Router) -> Self { + pub fn new>(basedir: B, router: &'static Router, env_type: RpcEnvironmentType) -> Self { Self { basedir: basedir.into(), router: router, aliases: HashMap::new(), + env_type, } } @@ -58,4 +60,8 @@ impl ApiConfig { { self.aliases.insert(alias.into(), path.into()); } + + pub fn env_type(&self) -> RpcEnvironmentType { + self.env_type + } } diff --git a/src/bin/proxmox-backup-api.rs b/src/bin/proxmox-backup-api.rs index 6b1ebaed..89b01176 100644 --- a/src/bin/proxmox-backup-api.rs +++ b/src/bin/proxmox-backup-api.rs @@ -72,24 +72,14 @@ fn main() { }, } - let addr = ([0,0,0,0,0,0,0,0], 8007).into(); + let addr = ([127,0,0,1], 82).into(); lazy_static!{ static ref ROUTER: Router = proxmox_backup::api2::router(); } - let mut config = ApiConfig::new("/usr/share/javascript/proxmox-backup", &ROUTER); - - // add default dirs which includes jquery and bootstrap - // my $base = '/usr/share/libpve-http-server-perl'; - // add_dirs($self->{dirs}, '/css/' => "$base/css/"); - // add_dirs($self->{dirs}, '/js/' => "$base/js/"); - // add_dirs($self->{dirs}, '/fonts/' => "$base/fonts/"); - config.add_alias("novnc", "/usr/share/novnc-pve"); - config.add_alias("extjs", "/usr/share/javascript/extjs"); - config.add_alias("fontawesome", "/usr/share/fonts-font-awesome"); - config.add_alias("xtermjs", "/usr/share/pve-xtermjs"); - config.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit"); + let config = ApiConfig::new( + "/usr/share/javascript/proxmox-backup", &ROUTER, RpcEnvironmentType::PRIVILEDGED); let rest_server = RestServer::new(config); diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs new file mode 100644 index 00000000..f14161d0 --- /dev/null +++ b/src/bin/proxmox-backup-proxy.rs @@ -0,0 +1,104 @@ +extern crate proxmox_backup; + +use std::sync::Arc; + +use proxmox_backup::api::schema::*; +use proxmox_backup::api::router::*; +use proxmox_backup::api::config::*; +use proxmox_backup::server::rest::*; +use proxmox_backup::getopts; + +//use failure::*; +use lazy_static::lazy_static; + +use futures::future::Future; + +use hyper; + +fn main() { + + if let Err(err) = syslog::init( + syslog::Facility::LOG_DAEMON, + log::LevelFilter::Info, + Some("proxmox-backup-proxy")) { + eprintln!("unable to inititialize syslog: {}", err); + std::process::exit(-1); + } + + let command : Arc = StringSchema::new("Command.") + .format(Arc::new(ApiStringFormat::Enum(vec![ + "start".into(), + "status".into(), + "stop".into() + ]))) + .into(); + + let schema = ObjectSchema::new("Parameters.") + .required("command", command); + + let args: Vec = std::env::args().skip(1).collect(); + + let options = match getopts::parse_arguments(&args, &vec!["command"], &schema) { + Ok((options, rest)) => { + if !rest.is_empty() { + eprintln!("Error: got additional arguments: {:?}", rest); + std::process::exit(-1); + } + options + } + Err(err) => { + eprintln!("Error: unable to parse arguments:\n{}", err); + std::process::exit(-1); + } + }; + + let command = options["command"].as_str().unwrap(); + + match command { + "start" => { + println!("Starting server."); + }, + "stop" => { + println!("Stopping server."); + std::process::exit(0); + }, + "status" => { + println!("Server status."); + std::process::exit(0); + }, + _ => { + eprintln!("got unexpected command {}", command); + std::process::exit(-1); + }, + } + + let addr = ([0,0,0,0,0,0,0,0], 8007).into(); + + lazy_static!{ + static ref ROUTER: Router = proxmox_backup::api2::router(); + } + + let mut config = ApiConfig::new( + "/usr/share/javascript/proxmox-backup", &ROUTER, RpcEnvironmentType::PUBLIC); + + // add default dirs which includes jquery and bootstrap + // my $base = '/usr/share/libpve-http-server-perl'; + // add_dirs($self->{dirs}, '/css/' => "$base/css/"); + // add_dirs($self->{dirs}, '/js/' => "$base/js/"); + // add_dirs($self->{dirs}, '/fonts/' => "$base/fonts/"); + config.add_alias("novnc", "/usr/share/novnc-pve"); + config.add_alias("extjs", "/usr/share/javascript/extjs"); + config.add_alias("fontawesome", "/usr/share/fonts-font-awesome"); + config.add_alias("xtermjs", "/usr/share/pve-xtermjs"); + config.add_alias("widgettoolkit", "/usr/share/javascript/proxmox-widget-toolkit"); + + let rest_server = RestServer::new(config); + + let server = hyper::Server::bind(&addr) + .serve(rest_server) + .map_err(|e| eprintln!("server error: {}", e)); + + + // Run this server for... forever! + hyper::rt::run(server); +} diff --git a/src/server/rest.rs b/src/server/rest.rs index ccadae47..d585cd03 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -397,7 +397,7 @@ pub fn handle_request(api: Arc, req: Request) -> BoxFut { println!("REQUEST {} {}", method, path); println!("COMPO {:?}", components); - let mut rpcenv = RestEnvironment::new(RpcEnvironmentType::PRIVILEDGED); + let mut rpcenv = RestEnvironment::new(api.env_type()); if comp_len >= 1 && components[0] == "api2" { println!("GOT API REQUEST");