* [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