public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup v2] api2/node/services: turn service api calls into workers
@ 2020-08-14 10:03 Dominik Csapak
  2020-08-14 11:00 ` [pbs-devel] applied: " Fabian Grünbichler
  0 siblings, 1 reply; 2+ messages in thread
From: Dominik Csapak @ 2020-08-14 10:03 UTC (permalink / raw)
  To: pbs-devel

to be in line with pve/pmg and be able to show the progress in the gui

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
changes from v1:
* use Userid struct instead of strings
* rebase on master
 src/api2/node/services.rs | 67 +++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 21 deletions(-)

diff --git a/src/api2/node/services.rs b/src/api2/node/services.rs
index 923252cd..849bead7 100644
--- a/src/api2/node/services.rs
+++ b/src/api2/node/services.rs
@@ -4,12 +4,13 @@ use anyhow::{bail, Error};
 use serde_json::{json, Value};
 
 use proxmox::{sortable, identity, list_subdirs_api_method};
-use proxmox::api::{api, Router, Permission};
+use proxmox::api::{api, Router, Permission, RpcEnvironment};
 use proxmox::api::router::SubdirMap;
 use proxmox::api::schema::*;
 
 use crate::api2::types::*;
 use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
+use crate::server::WorkerTask;
 
 static SERVICE_NAME_LIST: [&str; 7] = [
     "proxmox-backup",
@@ -181,31 +182,43 @@ fn get_service_state(
     Ok(json_service_state(&service, status))
 }
 
-fn run_service_command(service: &str, cmd: &str) -> Result<Value, Error> {
+fn run_service_command(service: &str, cmd: &str, userid: Userid) -> Result<Value, Error> {
 
-    // fixme: run background worker (fork_worker) ???
+    let workerid = format!("srv{}", &cmd);
 
     let cmd = match cmd {
-        "start"|"stop"|"restart"=> cmd,
-        "reload" => "try-reload-or-restart", // some services do not implement reload
+        "start"|"stop"|"restart"=> cmd.to_string(),
+        "reload" => "try-reload-or-restart".to_string(), // some services do not implement reload
         _ => bail!("unknown service command '{}'", cmd),
     };
+    let service = service.to_string();
 
-    if service == "proxmox-backup" && cmd == "stop" {
-        bail!("invalid service cmd '{} {}' cannot stop essential service!", service, cmd);
-    }
+    let upid = WorkerTask::new_thread(
+        &workerid,
+        Some(service.clone()),
+        userid,
+        false,
+        move |_worker| {
 
-    let real_service_name = real_service_name(service);
+            if service == "proxmox-backup" && cmd == "stop" {
+                bail!("invalid service cmd '{} {}' cannot stop essential service!", service, cmd);
+            }
 
-    let status = Command::new("systemctl")
-        .args(&[cmd, real_service_name])
-        .status()?;
+            let real_service_name = real_service_name(&service);
 
-    if !status.success() {
-        bail!("systemctl {} failed with {}", cmd, status);
-    }
+            let status = Command::new("systemctl")
+                .args(&[&cmd, real_service_name])
+                .status()?;
+
+            if !status.success() {
+                bail!("systemctl {} failed with {}", cmd, status);
+            }
 
-    Ok(Value::Null)
+            Ok(())
+        }
+    )?;
+
+    Ok(upid.into())
 }
 
 #[api(
@@ -228,11 +241,14 @@ fn run_service_command(service: &str, cmd: &str) -> Result<Value, Error> {
 fn start_service(
     service: String,
     _param: Value,
+    rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
+    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
+
     log::info!("starting service {}", service);
 
-    run_service_command(&service, "start")
+    run_service_command(&service, "start", userid)
 }
 
 #[api(
@@ -255,11 +271,14 @@ fn start_service(
 fn stop_service(
     service: String,
     _param: Value,
+    rpcenv: &mut dyn RpcEnvironment,
  ) -> Result<Value, Error> {
 
+    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
+
     log::info!("stopping service {}", service);
 
-    run_service_command(&service, "stop")
+    run_service_command(&service, "stop", userid)
 }
 
 #[api(
@@ -282,15 +301,18 @@ fn stop_service(
 fn restart_service(
     service: String,
     _param: Value,
+    rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
+    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
+
     log::info!("re-starting service {}", service);
 
     if &service == "proxmox-backup-proxy" {
         // special case, avoid aborting running tasks
-        run_service_command(&service, "reload")
+        run_service_command(&service, "reload", userid)
     } else {
-        run_service_command(&service, "restart")
+        run_service_command(&service, "restart", userid)
     }
 }
 
@@ -314,11 +336,14 @@ fn restart_service(
 fn reload_service(
     service: String,
     _param: Value,
+    rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
+    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
+
     log::info!("reloading service {}", service);
 
-    run_service_command(&service, "reload")
+    run_service_command(&service, "reload", userid)
 }
 
 
-- 
2.20.1





^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pbs-devel] applied: [PATCH proxmox-backup v2] api2/node/services: turn service api calls into workers
  2020-08-14 10:03 [pbs-devel] [PATCH proxmox-backup v2] api2/node/services: turn service api calls into workers Dominik Csapak
@ 2020-08-14 11:00 ` Fabian Grünbichler
  0 siblings, 0 replies; 2+ messages in thread
From: Fabian Grünbichler @ 2020-08-14 11:00 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion

On August 14, 2020 12:03 pm, Dominik Csapak wrote:
> to be in line with pve/pmg and be able to show the progress in the gui
> 
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
> changes from v1:
> * use Userid struct instead of strings
> * rebase on master
>  src/api2/node/services.rs | 67 +++++++++++++++++++++++++++------------
>  1 file changed, 46 insertions(+), 21 deletions(-)
> 
> diff --git a/src/api2/node/services.rs b/src/api2/node/services.rs
> index 923252cd..849bead7 100644
> --- a/src/api2/node/services.rs
> +++ b/src/api2/node/services.rs
> @@ -4,12 +4,13 @@ use anyhow::{bail, Error};
>  use serde_json::{json, Value};
>  
>  use proxmox::{sortable, identity, list_subdirs_api_method};
> -use proxmox::api::{api, Router, Permission};
> +use proxmox::api::{api, Router, Permission, RpcEnvironment};
>  use proxmox::api::router::SubdirMap;
>  use proxmox::api::schema::*;
>  
>  use crate::api2::types::*;
>  use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
> +use crate::server::WorkerTask;
>  
>  static SERVICE_NAME_LIST: [&str; 7] = [
>      "proxmox-backup",
> @@ -181,31 +182,43 @@ fn get_service_state(
>      Ok(json_service_state(&service, status))
>  }
>  
> -fn run_service_command(service: &str, cmd: &str) -> Result<Value, Error> {
> +fn run_service_command(service: &str, cmd: &str, userid: Userid) -> Result<Value, Error> {
>  
> -    // fixme: run background worker (fork_worker) ???
> +    let workerid = format!("srv{}", &cmd);
>  
>      let cmd = match cmd {
> -        "start"|"stop"|"restart"=> cmd,
> -        "reload" => "try-reload-or-restart", // some services do not implement reload
> +        "start"|"stop"|"restart"=> cmd.to_string(),
> +        "reload" => "try-reload-or-restart".to_string(), // some services do not implement reload
>          _ => bail!("unknown service command '{}'", cmd),
>      };
> +    let service = service.to_string();
>  
> -    if service == "proxmox-backup" && cmd == "stop" {
> -        bail!("invalid service cmd '{} {}' cannot stop essential service!", service, cmd);
> -    }
> +    let upid = WorkerTask::new_thread(
> +        &workerid,
> +        Some(service.clone()),
> +        userid,
> +        false,
> +        move |_worker| {
>  
> -    let real_service_name = real_service_name(service);
> +            if service == "proxmox-backup" && cmd == "stop" {
> +                bail!("invalid service cmd '{} {}' cannot stop essential service!", service, cmd);
> +            }
>  
> -    let status = Command::new("systemctl")
> -        .args(&[cmd, real_service_name])
> -        .status()?;
> +            let real_service_name = real_service_name(&service);
>  
> -    if !status.success() {
> -        bail!("systemctl {} failed with {}", cmd, status);
> -    }
> +            let status = Command::new("systemctl")
> +                .args(&[&cmd, real_service_name])
> +                .status()?;
> +
> +            if !status.success() {
> +                bail!("systemctl {} failed with {}", cmd, status);
> +            }
>  
> -    Ok(Value::Null)
> +            Ok(())
> +        }
> +    )?;
> +
> +    Ok(upid.into())
>  }
>  
>  #[api(
> @@ -228,11 +241,14 @@ fn run_service_command(service: &str, cmd: &str) -> Result<Value, Error> {
>  fn start_service(
>      service: String,
>      _param: Value,
> +    rpcenv: &mut dyn RpcEnvironment,
>  ) -> Result<Value, Error> {
>  
> +    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
> +
>      log::info!("starting service {}", service);
>  
> -    run_service_command(&service, "start")
> +    run_service_command(&service, "start", userid)
>  }
>  
>  #[api(
> @@ -255,11 +271,14 @@ fn start_service(
>  fn stop_service(
>      service: String,
>      _param: Value,
> +    rpcenv: &mut dyn RpcEnvironment,
>   ) -> Result<Value, Error> {
>  
> +    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
> +
>      log::info!("stopping service {}", service);
>  
> -    run_service_command(&service, "stop")
> +    run_service_command(&service, "stop", userid)
>  }
>  
>  #[api(
> @@ -282,15 +301,18 @@ fn stop_service(
>  fn restart_service(
>      service: String,
>      _param: Value,
> +    rpcenv: &mut dyn RpcEnvironment,
>  ) -> Result<Value, Error> {
>  
> +    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
> +
>      log::info!("re-starting service {}", service);
>  
>      if &service == "proxmox-backup-proxy" {
>          // special case, avoid aborting running tasks
> -        run_service_command(&service, "reload")
> +        run_service_command(&service, "reload", userid)
>      } else {
> -        run_service_command(&service, "restart")
> +        run_service_command(&service, "restart", userid)
>      }
>  }
>  
> @@ -314,11 +336,14 @@ fn restart_service(
>  fn reload_service(
>      service: String,
>      _param: Value,
> +    rpcenv: &mut dyn RpcEnvironment,
>  ) -> Result<Value, Error> {
>  
> +    let userid: Userid = rpcenv.get_user().unwrap().parse()?;
> +
>      log::info!("reloading service {}", service);
>  
> -    run_service_command(&service, "reload")
> +    run_service_command(&service, "reload", userid)
>  }
>  
>  
> -- 
> 2.20.1
> 
> 
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> 
> 
> 




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-08-14 11:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-14 10:03 [pbs-devel] [PATCH proxmox-backup v2] api2/node/services: turn service api calls into workers Dominik Csapak
2020-08-14 11:00 ` [pbs-devel] applied: " Fabian Grünbichler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal