diff --git a/src/cli/internal.rs b/src/cli/internal.rs index c89052a4e0885aff4c48704951213d11a1c009e9..d41cada152b95c4a7a9d5ff73833d894423d72ce 100644 --- a/src/cli/internal.rs +++ b/src/cli/internal.rs @@ -67,7 +67,7 @@ impl<'i> Internal<'i> { return self.runner; } - pub fn restart(mut self, name: &Option, watch: &Option, silent: bool) -> Runner { + pub fn restart(mut self, name: &Option, watch: &Option, reset_env: bool, silent: bool) -> Runner { then!(!silent, println!("{} Applying {}action restartProcess on ({})", *helpers::SUCCESS, self.kind, self.id)); if matches!(self.server_name, "internal" | "local") { @@ -78,6 +78,8 @@ impl<'i> Internal<'i> { None => item.disable_watch(), } + then!(reset_env, item.clear_env()); + name.as_ref().map(|n| item.rename(n.trim().replace("\n", ""))); item.restart(); @@ -92,6 +94,8 @@ impl<'i> Internal<'i> { Some(remote) => { let mut item = remote.get(self.id); + then!(reset_env, item.clear_env()); + name.as_ref().map(|n| item.rename(n.trim().replace("\n", ""))); item.restart(); } @@ -480,7 +484,7 @@ impl<'i> Internal<'i> { kind: kind.clone(), runner: runner.clone(), } - .restart(&None, &None, true); + .restart(&None, &None, false, true); } }); diff --git a/src/cli/mod.rs b/src/cli/mod.rs index a2e792d147e6f7c8928a5bbf41c10eec8ef95af8..facc74abfab8cd9900689121b5efc226e786c4d6 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -6,7 +6,7 @@ pub(crate) mod internal; pub(crate) mod server; use internal::Internal; -use macros_rs::{crashln, string, ternary, then}; +use macros_rs::{crashln, string, ternary}; use pmc::{helpers, process::Runner}; use std::env; @@ -46,20 +46,18 @@ pub fn start(name: &Option, args: &Args, watch: &Option, reset_e kind: kind.clone(), runner: runner.clone(), } - .restart(&None, &None, true); + .restart(&None, &None, false, true); }), None => println!("{} Cannot start all, no processes found", *helpers::FAIL), } } else { match args { Args::Id(id) => { - then!(*reset_env, runner.clear_env(*id)); - Internal { id: *id, runner, server_name, kind }.restart(name, watch, false); + Internal { id: *id, runner, server_name, kind }.restart(name, watch, *reset_env, false); } Args::Script(script) => match runner.find(&script, server_name) { Some(id) => { - then!(*reset_env, runner.clear_env(id)); - Internal { id, runner, server_name, kind }.restart(name, watch, false); + Internal { id, runner, server_name, kind }.restart(name, watch, *reset_env, false); } None => { Internal { id: 0, runner, server_name, kind }.create(script, name, watch, false); diff --git a/src/daemon/api/routes.rs b/src/daemon/api/routes.rs index e5435de1c3d347fabe4bdcd4175ec8746932f15e..b1b7db43ac0051b9b7130d419502b25a62743f9b 100644 --- a/src/daemon/api/routes.rs +++ b/src/daemon/api/routes.rs @@ -754,6 +754,11 @@ pub async fn action_handler(id: usize, body: Json, _t: Token) -> Res timer.observe_duration(); Ok(Json(attempt(true, method))) } + "reset_env" | "clear_env" => { + runner.get(id).clear_env(); + timer.observe_duration(); + Ok(Json(attempt(true, method))) + } "remove" | "delete" => { runner.remove(id); timer.observe_duration(); diff --git a/src/process/http.rs b/src/process/http.rs index ffd04c134b9377d3da7329025bb94e1ac6d17577..25bf84c3f4c597649e4c7a498112e3da2f88005e 100644 --- a/src/process/http.rs +++ b/src/process/http.rs @@ -107,3 +107,10 @@ pub fn flush(Remote { address, token, .. }: &Remote, id: usize) -> Result Result { + let (client, headers) = sync::client(token); + let content = ActionBody { method: string!("clear_env") }; + + Ok(client.post(fmtstr!("{address}/process/{id}/action")).json(&content).headers(headers).send()?) +} diff --git a/src/process/mod.rs b/src/process/mod.rs index 64e1fa416bdce54298769eb41311bc91ffc6f232..d3e2c368abf745ba33e4d478ea7ec8e3bdbc4768 100644 --- a/src/process/mod.rs +++ b/src/process/mod.rs @@ -381,7 +381,14 @@ impl Runner { } pub fn clear_env(&mut self, id: usize) -> &mut Self { - self.process(id).env = BTreeMap::new(); + if let Some(remote) = &self.remote { + if let Err(err) = http::clear_env(remote, id) { + crashln!("{} Failed to clear environment on {id}\nError: {:#?}", *helpers::FAIL, err); + }; + } else { + self.process(id).env = BTreeMap::new(); + } + return self; }