]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/bin/proxmox-backup-proxy.rs: implement unpriviledged server
authorDietmar Maurer <dietmar@proxmox.com>
Mon, 28 Jan 2019 12:17:03 +0000 (13:17 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 28 Jan 2019 12:29:58 +0000 (13:29 +0100)
We want to run the public server as user www-data. Requests needing
root priviledges needs to be proxied to the proxmox-backup.service, which
now listens to 127.0.0.1:82.

debian/install
debian/proxmox-backup-proxy.service [new file with mode: 0644]
debian/rules
src/api/config.rs
src/bin/proxmox-backup-api.rs
src/bin/proxmox-backup-proxy.rs [new file with mode: 0644]
src/server/rest.rs

index 9fa984f7d23311b8965cc2678ca395dc610e8150..617f93766ed4517cad7358a716b857b1b1b0c70e 100644 (file)
@@ -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 (file)
index 0000000..481ff73
--- /dev/null
@@ -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
index fdda9fe97979f300e8916ff2e9b2dffae90be433..9fe161d9eb1cbd722d26539e5d264e0422174d59 100755 (executable)
@@ -7,3 +7,7 @@
 %:
        dh $@ --with=systemd --with=bash-completion
 
+
+override_dh_installinit:
+       dh_installinit
+       dh_installinit --name proxmox-backup-proxy
index b395668b82fa67caeff80b509104064d9a7979eb..2bb9e86e692436a41d3af95c75a7ae77ed5d6d65 100644 (file)
@@ -9,15 +9,17 @@ pub struct ApiConfig {
     basedir: PathBuf,
     router: &'static Router,
     aliases: HashMap<String, PathBuf>,
+    env_type: RpcEnvironmentType,
 }
 
 impl ApiConfig {
 
-    pub fn new<B: Into<PathBuf>>(basedir: B, router: &'static Router) -> Self {
+    pub fn new<B: Into<PathBuf>>(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
+    }
 }
index 6b1ebaed456ec7397edd3052901c148bf393ff6d..89b01176fbc9b47fb2b2b9211f1980c531663a6b 100644 (file)
@@ -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 (file)
index 0000000..f14161d
--- /dev/null
@@ -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<Schema> = 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<String> = 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);
+}
index ccadae4736f5a0884bde9e171040455d6749e77c..d585cd03379bcd7b58b6c6e44b144c60caaef8e8 100644 (file)
@@ -397,7 +397,7 @@ pub fn handle_request(api: Arc<ApiConfig>, req: Request<Body>) -> 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");