From 03f3b4f4dc4eb2e490a550c44b1334b58197451a Mon Sep 17 00:00:00 2001 From: Jakob Truelsen Date: Mon, 25 Aug 2025 08:52:04 +0200 Subject: [PATCH 1/5] Add image and extrenv as env to predeproy and prestart --- src/bin/sadmin/client_daemon_service.rs | 30 ++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/bin/sadmin/client_daemon_service.rs b/src/bin/sadmin/client_daemon_service.rs index 63dcb76..119c034 100644 --- a/src/bin/sadmin/client_daemon_service.rs +++ b/src/bin/sadmin/client_daemon_service.rs @@ -461,7 +461,7 @@ impl RemoteLogTarget<'_> { } } -async fn run_script(name: String, src: &String, log: &mut RemoteLogTarget<'_>) -> Result<()> { +async fn run_script(name: String, src: &String, log: &mut RemoteLogTarget<'_>, envs: &[(&str, &str)]) -> Result<()> { let (first, _) = src .split_once('\n') .with_context(|| format!("Expected two lines in script {name}"))?; @@ -471,8 +471,13 @@ async fn run_script(name: String, src: &String, log: &mut RemoteLogTarget<'_>) - let mut f = tempfile::Builder::new().prefix(&name).tempfile()?; f.write_all(src.as_bytes())?; f.flush()?; + let mut cmd = tokio::process::Command::new(interperter); + cmd.arg(f.path()); + for (k,v) in envs { + cmd.env(k,v); + } let result = forward_command( - tokio::process::Command::new(interperter).arg(f.path()), + &mut cmd, &None, log, ) @@ -1316,9 +1321,17 @@ impl Service { } } + let mut env = Vec::new(); + for (k,v) in &extra_env { + env.push((k.as_str(), v.as_str())); + } + if let Some(image) = &image { + env.push(("image", image.as_str())); + } + // Run pre_deploy for (idx, src) in desc.pre_deploy.iter().enumerate() { - run_script(format!("predeploy {idx}"), src, log) + run_script(format!("predeploy {idx}"), src, log, &env) .await .with_context(|| format!("Failed running predeploy script {idx}"))?; } @@ -1800,9 +1813,16 @@ It will be hard killed in {:?} if it does not stop before that. ", .build(Box::new(cgroups_rs::hierarchies::V2::new())); } + let mut script_env = Vec::new(); + for (k,v) in extra_env { + script_env.push((k.as_str(), v.as_str())); + } + if let Some(image) = &image { + script_env.push(("image", image.as_str())); + } // Run run prestart for (idx, src) in desc.pre_start.iter().enumerate() { - run_script(format!("prestart {idx}"), src, log).await?; + run_script(format!("prestart {idx}"), src, log, &script_env).await?; } let dir = format!("/run/simpleadmin/services/{}/{}", desc.name, instance_id); @@ -2226,7 +2246,7 @@ It will be hard killed in {:?} if it does not stop before that. ", } else { src.clone() }; - run_script(format!("poststart {idx}"), &src, log).await?; + run_script(format!("poststart {idx}"), &src, log, &script_env).await?; } Ok((instance, status.into_inner().unwrap())) From 1396ccacce622062fe1a2128c30ab7f00eb5a1fa Mon Sep 17 00:00:00 2001 From: Jakob Truelsen Date: Mon, 25 Aug 2025 08:54:57 +0200 Subject: [PATCH 2/5] fix issues pointed out by clippy --- src/bin/sadmin/connection.rs | 5 ++--- src/bin/sadmin/list_deployments.rs | 10 ++++------ src/bin/sadmin/list_images.rs | 5 ++--- src/bin/sadmin/main.rs | 5 ++--- src/bin/sadmin/port.rs | 5 ++--- src/type_types.rs | 10 ++++------ 6 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/bin/sadmin/connection.rs b/src/bin/sadmin/connection.rs index 5456d5c..12d0126 100644 --- a/src/bin/sadmin/connection.rs +++ b/src/bin/sadmin/connection.rs @@ -95,11 +95,10 @@ impl ConnectionSend2 { self.response_handlers.lock().unwrap().insert(msg_id, s); self.send.lock().await.send_message_str(m).await?; let r = r.await.context("r failed")?; - if let IServerAction::Response(r) = &r { - if let Some(e) = &r.error { + if let IServerAction::Response(r) = &r + && let Some(e) = &r.error { bail!("Remote error: {}", e); } - } Ok(r) } diff --git a/src/bin/sadmin/list_deployments.rs b/src/bin/sadmin/list_deployments.rs index 0e7c46c..d2f3b1b 100644 --- a/src/bin/sadmin/list_deployments.rs +++ b/src/bin/sadmin/list_deployments.rs @@ -429,16 +429,14 @@ pub async fn list_deployments(config: Config, args: ListDeployments) -> Result<( if !host_names.contains_key(&d.host) { return false; } - if let Some(image) = &args.image { - if &d.image != image { + if let Some(image) = &args.image + && &d.image != image { return false; } - } - if let Some(container) = &args.container { - if &d.name != container { + if let Some(container) = &args.container + && &d.name != container { return false; } - } true }); list_deployment_groups( diff --git a/src/bin/sadmin/list_images.rs b/src/bin/sadmin/list_images.rs index 38a8b88..610be10 100644 --- a/src/bin/sadmin/list_images.rs +++ b/src/bin/sadmin/list_images.rs @@ -115,13 +115,12 @@ pub async fn list_images(config: Config, args: ListImages) -> Result<()> { if let Some(image) = &args.image { images.retain(|i| &i.image == image); } - if full { - if let Some(tail) = args.tail.as_ref().and_then(|l| l.last().cloned()) { + if full + && let Some(tail) = args.tail.as_ref().and_then(|l| l.last().cloned()) { images.reverse(); images.truncate(tail); images.reverse(); } - } let mut stdout = std::io::stdout(); for i in &images { diff --git a/src/bin/sadmin/main.rs b/src/bin/sadmin/main.rs index 3a66c35..42c6aa1 100644 --- a/src/bin/sadmin/main.rs +++ b/src/bin/sadmin/main.rs @@ -157,8 +157,8 @@ async fn get_secret(config: Config, args: GetSecret) -> Result<()> { })) .await?; loop { - if let IServerAction::GetSecretRes(r) = con.recv().await? { - if r.name == args.secret { + if let IServerAction::GetSecretRes(r) = con.recv().await? + && r.name == args.secret { if let Some(v) = r.value { println!("{v}"); return Ok(()); @@ -166,7 +166,6 @@ async fn get_secret(config: Config, args: GetSecret) -> Result<()> { bail!("Secret {} not found", args.secret); } } - } } } diff --git a/src/bin/sadmin/port.rs b/src/bin/sadmin/port.rs index 4fb90e5..a315fd1 100644 --- a/src/bin/sadmin/port.rs +++ b/src/bin/sadmin/port.rs @@ -146,11 +146,10 @@ pub async fn proxy(config: Config, cmd: ProxySocket) -> Result<()> { } } r = writer_shutdown_r.recv() => { - if let Some((socket_id, read_half)) = r { - if let Some(write_half) = socket_write_halfs.remove(&socket_id) { + if let Some((socket_id, read_half)) = r + && let Some(write_half) = socket_write_halfs.remove(&socket_id) { read_half.reunite(write_half)?.shutdown().await?; } - } } _ = interval.tick() => { send.ping().await?; diff --git a/src/type_types.rs b/src/type_types.rs index 4936d06..93de170 100644 --- a/src/type_types.rs +++ b/src/type_types.rs @@ -386,13 +386,12 @@ impl<'a> Iterator for VariableExtractor<'a> { type Item = (&'a str, &'a str); fn next(&mut self) -> Option { for v in self.0.by_ref() { - if let serde_json::Value::Object(o) = v { - if let (Some(serde_json::Value::String(k)), Some(serde_json::Value::String(v))) = + if let serde_json::Value::Object(o) = v + && let (Some(serde_json::Value::String(k)), Some(serde_json::Value::String(v))) = (o.get("key"), o.get("value")) { return Some((k.as_str(), v.as_str())); } - } } None } @@ -438,13 +437,12 @@ impl<'a> Iterator for TriggersExtractor<'a> { type Item = (i64, &'a ValueMap); fn next(&mut self) -> Option { for v in self.0.by_ref() { - if let serde_json::Value::Object(o) = v { - if let (Some(serde_json::Value::Number(k)), Some(serde_json::Value::Object(v))) = + if let serde_json::Value::Object(o) = v + && let (Some(serde_json::Value::Number(k)), Some(serde_json::Value::Object(v))) = (o.get("id"), o.get("values")) { return Some((k.as_i64().unwrap_or_default(), v)); } - } } None } From dd2af2f056a9eab2905b837c8e80e65ebb92789e Mon Sep 17 00:00:00 2001 From: Jakob Truelsen Date: Mon, 25 Aug 2025 08:56:15 +0200 Subject: [PATCH 3/5] fixup! Add image and extrenv as env to predeproy and prestart --- src/bin/sadmin/client_daemon_service.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/sadmin/client_daemon_service.rs b/src/bin/sadmin/client_daemon_service.rs index 119c034..6295920 100644 --- a/src/bin/sadmin/client_daemon_service.rs +++ b/src/bin/sadmin/client_daemon_service.rs @@ -1817,7 +1817,8 @@ It will be hard killed in {:?} if it does not stop before that. ", for (k,v) in extra_env { script_env.push((k.as_str(), v.as_str())); } - if let Some(image) = &image { + let image_for_env = image.clone(); + if let Some(image) = &image_for_env { script_env.push(("image", image.as_str())); } // Run run prestart From 55fae9ca35ddfb38d321656133a12ad4ac2bb0d2 Mon Sep 17 00:00:00 2001 From: Jakob Truelsen Date: Mon, 25 Aug 2025 08:57:36 +0200 Subject: [PATCH 4/5] clippy --- src/bin/sadmin/client_daemon.rs | 12 ++--- src/bin/sadmin/client_daemon_service.rs | 57 ++++++++++----------- src/bin/sadmin/connection.rs | 7 +-- src/bin/sadmin/list_deployments.rs | 14 +++--- src/bin/sadmin/list_images.rs | 11 ++-- src/bin/sadmin/main.rs | 15 +++--- src/bin/server/deployment.rs | 67 ++++++++++++------------- src/bin/server/docker.rs | 46 ++++++++--------- src/bin/server/docker_web.rs | 58 ++++++++++----------- src/bin/server/hostclient.rs | 24 ++++----- src/bin/server/modified_files.rs | 16 +++--- src/bin/server/vanta.rs | 8 +-- src/bin/server/webclient.rs | 10 ++-- src/type_types.rs | 12 ++--- 14 files changed, 178 insertions(+), 179 deletions(-) diff --git a/src/bin/sadmin/client_daemon.rs b/src/bin/sadmin/client_daemon.rs index a6d4408..7f63573 100644 --- a/src/bin/sadmin/client_daemon.rs +++ b/src/bin/sadmin/client_daemon.rs @@ -1406,12 +1406,12 @@ impl Client { } Ok(Ok(Err(e))) => { info!("Error connecting to upstream: {e:?}"); - if let Some(notifier) = ¬ifier { - if first { - notifier.notify_ready()?; - notifier.set_status("Disconnected".to_string())?; - first = false; - } + if let Some(notifier) = ¬ifier + && first + { + notifier.notify_ready()?; + notifier.set_status("Disconnected".to_string())?; + first = false; } if cancelable(&run_token, tokio::time::sleep(Duration::from_millis(1234))) diff --git a/src/bin/sadmin/client_daemon_service.rs b/src/bin/sadmin/client_daemon_service.rs index 6295920..40efcd5 100644 --- a/src/bin/sadmin/client_daemon_service.rs +++ b/src/bin/sadmin/client_daemon_service.rs @@ -461,7 +461,12 @@ impl RemoteLogTarget<'_> { } } -async fn run_script(name: String, src: &String, log: &mut RemoteLogTarget<'_>, envs: &[(&str, &str)]) -> Result<()> { +async fn run_script( + name: String, + src: &String, + log: &mut RemoteLogTarget<'_>, + envs: &[(&str, &str)], +) -> Result<()> { let (first, _) = src .split_once('\n') .with_context(|| format!("Expected two lines in script {name}"))?; @@ -473,16 +478,12 @@ async fn run_script(name: String, src: &String, log: &mut RemoteLogTarget<'_>, e f.flush()?; let mut cmd = tokio::process::Command::new(interperter); cmd.arg(f.path()); - for (k,v) in envs { - cmd.env(k,v); + for (k, v) in envs { + cmd.env(k, v); } - let result = forward_command( - &mut cmd, - &None, - log, - ) - .await - .context("Failed running script")?; + let result = forward_command(&mut cmd, &None, log) + .await + .context("Failed running script")?; if !result.success() { bail!("Error running script {}: {:?}", name, result); } @@ -1252,23 +1253,23 @@ impl Service { } // Enable linger if required - if let Some(user) = &user { - if desc.enable_linger == Some(true) { - forward_command( - tokio::process::Command::new("/usr/bin/loginctl") - .arg("enable-linger") - .arg(&user.name), - &None, - log, + if let Some(user) = &user + && desc.enable_linger == Some(true) + { + forward_command( + tokio::process::Command::new("/usr/bin/loginctl") + .arg("enable-linger") + .arg(&user.name), + &None, + log, + ) + .await + .with_context(|| { + format!( + "Failed running /usr/bin/loginctl enable-linger {}", + user.name ) - .await - .with_context(|| { - format!( - "Failed running /usr/bin/loginctl enable-linger {}", - user.name - ) - })?; - } + })?; } let t = tempfile::TempDir::new()?; @@ -1322,7 +1323,7 @@ impl Service { } let mut env = Vec::new(); - for (k,v) in &extra_env { + for (k, v) in &extra_env { env.push((k.as_str(), v.as_str())); } if let Some(image) = &image { @@ -1814,7 +1815,7 @@ It will be hard killed in {:?} if it does not stop before that. ", } let mut script_env = Vec::new(); - for (k,v) in extra_env { + for (k, v) in extra_env { script_env.push((k.as_str(), v.as_str())); } let image_for_env = image.clone(); diff --git a/src/bin/sadmin/connection.rs b/src/bin/sadmin/connection.rs index 12d0126..6c3a1a4 100644 --- a/src/bin/sadmin/connection.rs +++ b/src/bin/sadmin/connection.rs @@ -96,9 +96,10 @@ impl ConnectionSend2 { self.send.lock().await.send_message_str(m).await?; let r = r.await.context("r failed")?; if let IServerAction::Response(r) = &r - && let Some(e) = &r.error { - bail!("Remote error: {}", e); - } + && let Some(e) = &r.error + { + bail!("Remote error: {}", e); + } Ok(r) } diff --git a/src/bin/sadmin/list_deployments.rs b/src/bin/sadmin/list_deployments.rs index d2f3b1b..179f574 100644 --- a/src/bin/sadmin/list_deployments.rs +++ b/src/bin/sadmin/list_deployments.rs @@ -430,13 +430,15 @@ pub async fn list_deployments(config: Config, args: ListDeployments) -> Result<( return false; } if let Some(image) = &args.image - && &d.image != image { - return false; - } + && &d.image != image + { + return false; + } if let Some(container) = &args.container - && &d.name != container { - return false; - } + && &d.name != container + { + return false; + } true }); list_deployment_groups( diff --git a/src/bin/sadmin/list_images.rs b/src/bin/sadmin/list_images.rs index 610be10..72d205a 100644 --- a/src/bin/sadmin/list_images.rs +++ b/src/bin/sadmin/list_images.rs @@ -115,12 +115,11 @@ pub async fn list_images(config: Config, args: ListImages) -> Result<()> { if let Some(image) = &args.image { images.retain(|i| &i.image == image); } - if full - && let Some(tail) = args.tail.as_ref().and_then(|l| l.last().cloned()) { - images.reverse(); - images.truncate(tail); - images.reverse(); - } + if full && let Some(tail) = args.tail.as_ref().and_then(|l| l.last().cloned()) { + images.reverse(); + images.truncate(tail); + images.reverse(); + } let mut stdout = std::io::stdout(); for i in &images { diff --git a/src/bin/sadmin/main.rs b/src/bin/sadmin/main.rs index 42c6aa1..a73a0c4 100644 --- a/src/bin/sadmin/main.rs +++ b/src/bin/sadmin/main.rs @@ -158,14 +158,15 @@ async fn get_secret(config: Config, args: GetSecret) -> Result<()> { .await?; loop { if let IServerAction::GetSecretRes(r) = con.recv().await? - && r.name == args.secret { - if let Some(v) = r.value { - println!("{v}"); - return Ok(()); - } else { - bail!("Secret {} not found", args.secret); - } + && r.name == args.secret + { + if let Some(v) = r.value { + println!("{v}"); + return Ok(()); + } else { + bail!("Secret {} not found", args.secret); } + } } } diff --git a/src/bin/server/deployment.rs b/src/bin/server/deployment.rs index 86d52dc..82f39e1 100644 --- a/src/bin/server/deployment.rs +++ b/src/bin/server/deployment.rs @@ -358,10 +358,10 @@ impl<'a, M> Visitor<'a, M> { .get(name) .and_then(|v| v.as_bool()) .unwrap_or(*default); - if let Some(variable) = variable { - if !variable.is_empty() { - vars.add_bool(variable, v)?; - } + if let Some(variable) = variable + && !variable.is_empty() + { + vars.add_bool(variable, v)?; } content.insert(name.to_string(), Value::Bool(v)); } @@ -386,10 +386,10 @@ impl<'a, M> Visitor<'a, M> { Cow::Borrowed(v) => v, Cow::Owned(v) => self.string_arena.alloc_str(access, v), }; - if let Some(variable) = variable { - if !variable.is_empty() { - vars.add_str(variable, vv)?; - } + if let Some(variable) = variable + && !variable.is_empty() + { + vars.add_str(variable, vv)?; } if deploy_title.unwrap_or_default() { deployment_title = vv; @@ -418,10 +418,10 @@ impl<'a, M> Visitor<'a, M> { } else { v.into() }; - if let Some(variable) = variable { - if !variable.is_empty() { - vars.add_str(variable, v.clone())?; - } + if let Some(variable) = variable + && !variable.is_empty() + { + vars.add_str(variable, v.clone())?; } content.insert(name.to_string(), Value::String(v.into_owned())); } @@ -435,10 +435,10 @@ impl<'a, M> Visitor<'a, M> { .get(name) .and_then(|v| v.as_str()) .unwrap_or(default); - if let Some(variable) = variable { - if !variable.is_empty() { - vars.add_str(variable, v)?; - } + if let Some(variable) = variable + && !variable.is_empty() + { + vars.add_str(variable, v)?; } content.insert(name.to_string(), Value::String(v.to_owned())); } @@ -642,13 +642,12 @@ impl<'a, M> Visitor<'a, M> { if type_content.has_variables.unwrap_or_default() { self.add_variabels(vars, obj); } - if let Some(nv) = &type_content.name_variable { - if !nv.is_empty() { - if let Err(e) = vars.add_str(nv.as_str(), &obj.name) { - self.errors - .push(format!("Failed to add varible {nv}: {e:?}")); - } - } + if let Some(nv) = &type_content.name_variable + && !nv.is_empty() + && let Err(e) = vars.add_str(nv.as_str(), &obj.name) + { + self.errors + .push(format!("Failed to add varible {nv}: {e:?}")); } let mut v = self.visit_content(access, &obj.name, &obj.content, type_content, vars)?; @@ -1000,13 +999,13 @@ async fn setup_deployment_host<'a, M>( deployment_order: base.type_order, }; - if let Some(v) = old_content.remove(*name) { - if !redeploy { - let content = v.content; - o.prev_content = content.content; - o.prev_script = content.script; - o.action = DeploymentObjectAction::Modify; - } + if let Some(v) = old_content.remove(*name) + && !redeploy + { + let content = v.content; + o.prev_content = content.content; + o.prev_script = content.script; + o.action = DeploymentObjectAction::Modify; } host_deployment_objects.push(o); } @@ -1584,10 +1583,10 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result if o2.prev_content.is_some() { next_objects.remove(&o2.name); } - if let Some(c) = o2.next_content.clone() { - if !c.is_empty() { - next_objects.insert(o2.name.clone(), c.into()); - } + if let Some(c) = o2.next_content.clone() + && !c.is_empty() + { + next_objects.insert(o2.name.clone(), c.into()); } } diff --git a/src/bin/server/docker.rs b/src/bin/server/docker.rs index 51c32e3..4fb58b0 100644 --- a/src/bin/server/docker.rs +++ b/src/bin/server/docker.rs @@ -384,10 +384,10 @@ async fn deploy_server_inner2( let hash = hash.context("Could not find image to deploy")?; let image = format!("{project}@{hash}"); - if let Some(p) = &description.project { - if p != project { - bail!("roject and image does not match") - } + if let Some(p) = &description.project + && p != project + { + bail!("roject and image does not match") } (project.to_string(), Some(hash), Some(image)) } else if let Some(project) = description.project { @@ -540,17 +540,17 @@ async fn deploy_server_inner3( .fetch_optional(&state.db) .await .context("Query 1")?; - if let Some(old_deployment) = old_deployment { - if old_deployment.endTime.is_none() { - query!( - "UPDATE `docker_deployments` SET `endTime` = ? WHERE `id`=?", - now, - old_deployment.id, - ) - .execute(&state.db) - .await - .context("Query 2")?; - } + if let Some(old_deployment) = old_deployment + && old_deployment.endTime.is_none() + { + query!( + "UPDATE `docker_deployments` SET `endTime` = ? WHERE `id`=?", + now, + old_deployment.id, + ) + .execute(&state.db) + .await + .context("Query 2")?; } let id2 = query!( "INSERT INTO `docker_deployments` ( @@ -771,15 +771,15 @@ pub async fn list_deployments( .context("Running main query")?; let mut deployments = Vec::new(); for row in rows { - if let Some(host) = act.host { - if host != row.host { - continue; - } + if let Some(host) = act.host + && host != row.host + { + continue; } - if let Some(image) = &act.image { - if image != &row.project { - continue; - } + if let Some(image) = &act.image + && image != &row.project + { + continue; } deployments.push(row_to_deployment(row).context("In row_to_deployment")?); } diff --git a/src/bin/server/docker_web.rs b/src/bin/server/docker_web.rs index 82b7148..cc59f8a 100644 --- a/src/bin/server/docker_web.rs +++ b/src/bin/server/docker_web.rs @@ -214,16 +214,12 @@ async fn check_docker_path Option>( }) .and_then(|v| BASE64_STANDARD.decode(v).ok()) .and_then(|v| String::from_utf8(v).ok()) + && let Some((user, sid)) = auth.split_once(":") + && let Ok(a) = get_auth(state, None, Some(sid)).await + && a.user.as_deref() == Some(user) + && let Some(v) = cb(a) { - if let Some((user, sid)) = auth.split_once(":") { - if let Ok(a) = get_auth(state, None, Some(sid)).await { - if a.user.as_deref() == Some(user) { - if let Some(v) = cb(a) { - return Ok(v); - } - } - } - } + return Ok(v); } Err(( StatusCode::FORBIDDEN, @@ -574,17 +570,17 @@ async fn put_blob_upload( .await .to_api_error("Upload failed")?; - if let Some(expected_size) = expected_size { - if inner.count != start_size + expected_size { - api_error!( - BAD_REQUEST, - SizeInvalid, - "Inconsistent size uuid={}, got={}, expected_size={}", - uuid, - inner.count - start_size, - expected_size - ); - } + if let Some(expected_size) = expected_size + && inner.count != start_size + expected_size + { + api_error!( + BAD_REQUEST, + SizeInvalid, + "Inconsistent size uuid={}, got={}, expected_size={}", + uuid, + inner.count - start_size, + expected_size + ); } state.docker_uploads.lock().unwrap().remove(&uuid); @@ -876,17 +872,17 @@ async fn patch_blob_upload( handle_upload(body, inner, &u.shadow_range) .await .to_api_error("Upload failed")?; - if let Some(expected_size) = expected_size { - if inner.count != start_size + expected_size { - api_error!( - BAD_REQUEST, - SizeInvalid, - "Uploaded bytes does not match expected size uuid={} recieved={} expected={}", - uuid, - inner.count - start_size, - expected_size - ); - } + if let Some(expected_size) = expected_size + && inner.count != start_size + expected_size + { + api_error!( + BAD_REQUEST, + SizeInvalid, + "Uploaded bytes does not match expected size uuid={} recieved={} expected={}", + uuid, + inner.count - start_size, + expected_size + ); } info!( "Docker patch uuid={} uploaded={} end={}", diff --git a/src/bin/server/hostclient.rs b/src/bin/server/hostclient.rs index 1830466..2575173 100644 --- a/src/bin/server/hostclient.rs +++ b/src/bin/server/hostclient.rs @@ -423,10 +423,10 @@ impl HostClient { match jh.next_message().await? { Some(ClientHostMessage::Success(msg)) => { jh.done(); - if let Some(code) = msg.code { - if code != 0 { - bail!("Command failed with code {}", code); - } + if let Some(code) = msg.code + && code != 0 + { + bail!("Command failed with code {}", code); } let Some(Value::String(v)) = msg.data else { bail!("Missing data"); @@ -457,10 +457,10 @@ impl HostClient { match jh.next_message().await? { Some(ClientHostMessage::Success(msg)) => { jh.done(); - if let Some(code) = msg.code { - if code != 0 { - bail!("Command failed with code {}", code); - } + if let Some(code) = msg.code + && code != 0 + { + bail!("Command failed with code {}", code); } Ok(()) } @@ -640,10 +640,10 @@ async fn handle_host_client( } run_token.cancel(); - if let Entry::Occupied(e) = state.host_clients.lock().unwrap().entry(id) { - if Arc::as_ptr(e.get()) == Arc::as_ptr(&hc) { - e.remove(); - } + if let Entry::Occupied(e) = state.host_clients.lock().unwrap().entry(id) + && Arc::as_ptr(e.get()) == Arc::as_ptr(&hc) + { + e.remove(); } webclient::broadcast(&state, IServerAction::HostDown(IHostDown { id }))?; diff --git a/src/bin/server/modified_files.rs b/src/bin/server/modified_files.rs index 6baaecb..df99a7f 100644 --- a/src/bin/server/modified_files.rs +++ b/src/bin/server/modified_files.rs @@ -387,10 +387,10 @@ with open({}, 'w', encoding='utf-8') as f: match jh.next_message().await? { Some(ClientHostMessage::Success(SuccessMessage { code, .. })) => { jh.done(); - if let Some(code) = code { - if code != 0 { - bail!("Resolve job failed with code {}", code); - } + if let Some(code) = code + && code != 0 + { + bail!("Resolve job failed with code {}", code); } } Some(ClientHostMessage::Failure(FailureMessage { .. })) => { @@ -557,10 +557,10 @@ sys.stdout.flush()"; } Some(ClientHostMessage::Success(m)) => { jh.done(); - if let Some(code) = m.code { - if code != 0 { - bail!("Script returned {}", code); - } + if let Some(code) = m.code + && code != 0 + { + bail!("Script returned {}", code); } break; } diff --git a/src/bin/server/vanta.rs b/src/bin/server/vanta.rs index dfa721b..cd30857 100644 --- a/src/bin/server/vanta.rs +++ b/src/bin/server/vanta.rs @@ -239,10 +239,10 @@ async fn analyze_host(state: &State, id: i64) -> Result Err(HostStatus::Timeout), Ok(Err(_)) => Err(HostStatus::HostDown), Ok(Ok(Some(ClientHostMessage::Success(msg)))) => { - if let Some(code) = msg.code { - if code != 0 { - return Err(HostStatus::CommandFailed); - } + if let Some(code) = msg.code + && code != 0 + { + return Err(HostStatus::CommandFailed); } let Some(data) = msg.data else { return Err(HostStatus::InvalidJson); diff --git a/src/bin/server/webclient.rs b/src/bin/server/webclient.rs index e6c9800..5e5cd93 100644 --- a/src/bin/server/webclient.rs +++ b/src/bin/server/webclient.rs @@ -286,11 +286,11 @@ impl WebClient { if let Some(content) = content { tokio::time::sleep(Duration::from_secs(1)).await; pwd = crypt::validate_password(&act.pwd, &content.password)?; - if let Some(otp_token) = &act.otp { - if !otp_token.is_empty() { - otp = crypt::validate_otp(otp_token, &content.otp_base32)?; - new_otp = true; - } + if let Some(otp_token) = &act.otp + && !otp_token.is_empty() + { + otp = crypt::validate_otp(otp_token, &content.otp_base32)?; + new_otp = true; } found = true; } diff --git a/src/type_types.rs b/src/type_types.rs index 93de170..2d6f54d 100644 --- a/src/type_types.rs +++ b/src/type_types.rs @@ -389,9 +389,9 @@ impl<'a> Iterator for VariableExtractor<'a> { if let serde_json::Value::Object(o) = v && let (Some(serde_json::Value::String(k)), Some(serde_json::Value::String(v))) = (o.get("key"), o.get("value")) - { - return Some((k.as_str(), v.as_str())); - } + { + return Some((k.as_str(), v.as_str())); + } } None } @@ -440,9 +440,9 @@ impl<'a> Iterator for TriggersExtractor<'a> { if let serde_json::Value::Object(o) = v && let (Some(serde_json::Value::Number(k)), Some(serde_json::Value::Object(v))) = (o.get("id"), o.get("values")) - { - return Some((k.as_i64().unwrap_or_default(), v)); - } + { + return Some((k.as_i64().unwrap_or_default(), v)); + } } None } From e47fdfcf4000c8f15661ff417f51a8b5e93cb53b Mon Sep 17 00:00:00 2001 From: Jakob Truelsen Date: Mon, 25 Aug 2025 09:21:07 +0200 Subject: [PATCH 5/5] update dependencies --- Cargo.lock | 128 ++++++++++++++++++-------------- Cargo.toml | 4 +- src/bin/sadmin/client_daemon.rs | 24 +++--- src/bin/server/deployment.rs | 40 +++++----- src/bin/server/hostclient.rs | 18 ++--- src/bin/server/webclient.rs | 120 +++++++++++++++--------------- 6 files changed, 177 insertions(+), 157 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0af8161..bc6f594 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -111,9 +111,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" @@ -143,6 +143,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" @@ -396,9 +402,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -406,9 +412,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -418,9 +424,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", @@ -1025,19 +1031,21 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1057,14 +1065,14 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64", "bytes", @@ -1078,7 +1086,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -1332,9 +1340,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" @@ -1343,7 +1351,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.48.5", ] [[package]] @@ -1741,7 +1749,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2", + "socket2 0.5.10", "thiserror", "tokio", "tracing", @@ -1757,7 +1765,7 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", "rustls", @@ -1778,7 +1786,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -1811,9 +1819,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1908,9 +1916,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64", "bytes", @@ -1941,7 +1949,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -2059,9 +2067,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "aws-lc-rs", "log", @@ -2085,9 +2093,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -2132,7 +2140,7 @@ dependencies = [ "log", "nix 0.30.1", "passfd", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "rpassword", "rusqlite", @@ -2156,7 +2164,7 @@ dependencies = [ "ts-rs", "uuid", "webpki", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", "zip", ] @@ -2194,9 +2202,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "indexmap", "itoa", @@ -2339,6 +2347,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -2653,15 +2671,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix 1.0.7", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2720,9 +2738,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -2732,9 +2750,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2771,9 +2789,9 @@ dependencies = [ [[package]] name = "tokio-tasks" -version = "0.3.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbc0159e60f54b70502626c04bdec1c128566699d2dd4f97c5f00cb632f0f5a" +checksum = "dbb46354f2ee2cf4426d0af5399beedba491b15e18d8d13c51db2f6f66a10eb8" dependencies = [ "futures-util", "log", @@ -2810,9 +2828,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2955,7 +2973,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "sha1", "thiserror", "utf-8", @@ -2972,7 +2990,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "rustls", "rustls-pki-types", "sha1", @@ -3080,9 +3098,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -3239,14 +3257,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -3279,7 +3297,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -3689,9 +3707,9 @@ dependencies = [ [[package]] name = "zip" -version = "4.2.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ab361742de920c5535880f89bbd611ee62002bf11341d16a5f057bb8ba6899" +checksum = "8835eb39822904d39cb19465de1159e05d371973f0c6df3a365ad50565ddc8b9" dependencies = [ "arbitrary", "crc32fast", diff --git a/Cargo.toml b/Cargo.toml index 16daa8e..5df1d67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,12 +74,12 @@ serde_repr = {version = "0.1"} serde_yaml = "0.9" sha2 = {version="0.10", optional = true} simple_logger = {version = "5", default-features=false} -sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio", "chrono"], optional = true} +sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio", "chrono"], optional = true, default-features = false} sqlx-type = {version = "0.4", optional = true} tempfile = {version="3", optional=true} tokio = { version = "1", default-features = false, features=['rt', 'net', 'fs', 'sync', 'macros', 'time', 'process', 'signal', 'io-std', 'rt-multi-thread'] } tokio-rustls = "0.26" -tokio-tasks = {version = "0.3", optional=true} +tokio-tasks = {version = "0.5", optional=true} tokio-tungstenite = { version = "0.27", features=['rustls-tls-webpki-roots']} tokio-util = {version = "0.7", features = ["io"], optional = true} totp-rs= {version="5", features = ["otpauth"], optional = true} diff --git a/src/bin/sadmin/client_daemon.rs b/src/bin/sadmin/client_daemon.rs index 7f63573..49e8741 100644 --- a/src/bin/sadmin/client_daemon.rs +++ b/src/bin/sadmin/client_daemon.rs @@ -39,7 +39,9 @@ use tokio::{ time::timeout, }; use tokio_rustls::{TlsConnector, client::TlsStream, rustls}; -use tokio_tasks::{CancelledError, RunToken, Task, TaskBase, TaskBuilder, cancelable}; +use tokio_tasks::{ + CancelledError, RunToken, Task, TaskBase, TaskBuilder, cancelable, set_location, +}; use sadmin2::client_message::{ ClientHostMessage, CommandSpawnMessage, DataMessage, DataSource, DeployServiceMessage, @@ -216,9 +218,9 @@ impl Client { } cmd.stdin(Stdio::null()); cmd.kill_on_drop(true); - run_token.set_location(file!(), line!()); + set_location!(run_token); let output = cmd.output().await?; - run_token.set_location(file!(), line!()); + set_location!(run_token); if !output.status.success() { let code = output .status @@ -263,7 +265,7 @@ impl Client { ) -> Result<()> { debug!("Start instant command {}: {}", msg.id, msg.name); let id = msg.id; - run_token.set_location(file!(), line!()); + set_location!(run_token); let m = match self.handle_run_instant_inner(&run_token, msg).await { Ok(v) => v, Err(e) => { @@ -276,9 +278,9 @@ impl Client { }) } }; - run_token.set_location(file!(), line!()); + set_location!(run_token); self.send_message(m).await; - run_token.set_location(file!(), line!()); + set_location!(run_token); self.command_tasks.lock().unwrap().remove(&id); debug!("Finished instant command {id}"); Ok(()) @@ -1387,7 +1389,7 @@ impl Client { let notifier = SdNotify::from_env().ok(); let mut first = true; loop { - run_token.set_location(file!(), line!()); + set_location!(run_token); let mut read = match cancelable( &run_token, timeout(Duration::from_secs(60), self.connect_to_upstream()), @@ -1428,7 +1430,7 @@ impl Client { } Err(_) => return Ok(()), }; - run_token.set_location(file!(), line!()); + set_location!(run_token); info!("Connected to server"); let mut last_ping_time = Instant::now(); let mut buffer = BytesMut::with_capacity(40960); @@ -1445,7 +1447,7 @@ impl Client { let read = read.read_buf(&mut buffer); let send_failure = self.send_failure_notify.notified(); let sleep = tokio::time::sleep(Duration::from_secs(120)); - run_token.set_location(file!(), line!()); + set_location!(run_token); tokio::select! { val = read => { match val { @@ -1498,7 +1500,7 @@ impl Client { } } info!("Trying to take sender for disconnect"); - run_token.set_location(file!(), line!()); + set_location!(run_token); { let f = async { loop { @@ -1514,7 +1516,7 @@ impl Client { () = f => {panic!()} } } - run_token.set_location(file!(), line!()); + set_location!(run_token); info!("Took sender for disconnect"); if let Some(notifier) = ¬ifier { notifier.set_status("Disconnected".to_string())?; diff --git a/src/bin/server/deployment.rs b/src/bin/server/deployment.rs index 82f39e1..15a0729 100644 --- a/src/bin/server/deployment.rs +++ b/src/bin/server/deployment.rs @@ -37,7 +37,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use sqlx_type::{query, query_as}; use tokio::select; -use tokio_tasks::RunToken; +use tokio_tasks::{RunToken, set_location}; type ValueMap = serde_json::Map; @@ -1287,7 +1287,7 @@ async fn deploy_single_inner( script: String, content: Value, ) -> Result<()> { - rt.set_location(file!(), line!()); + set_location!(rt); let mut jh = host_client .start_job(&HostClientMessage::RunScript(RunScriptMessage { id: host_client.next_job_id(), @@ -1302,7 +1302,7 @@ async fn deploy_single_inner( })) .await?; loop { - rt.set_location(file!(), line!()); + set_location!(rt); let msg = jh.next_message().await?.context("Host went away")?; match msg { ClientHostMessage::Failure(msg) => { @@ -1317,7 +1317,7 @@ async fn deploy_single_inner( bail!("Command failed with code {:?}", msg.code) } ClientHostMessage::Data(msg) => { - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, move |deployment| { let data = msg.data.as_str().context("Expected string")?; let line = String::from_utf8(BASE64_STANDARD.decode(data)?)?; @@ -1471,7 +1471,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result else { return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query_as!( ObjectRow, "SELECT `id`, `name`, `content`, `category`, `version`, `comment`, @@ -1500,7 +1500,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result if object.host != cur_host { bad_host = false; cur_host = object.host; - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.add_header(&object.host_name, true); Ok(()) @@ -1508,7 +1508,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result .await?; host_objects.clear(); - rt.set_location(file!(), line!()); + set_location!(rt); let res = query!( "SELECT `name`, `content`, `type`, `title` FROM `deployments` WHERE `host`=?", cur_host @@ -1525,7 +1525,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result } if bad_host { - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.set_object_status(index, DeploymentObjectStatus::Failure); Ok(()) @@ -1545,7 +1545,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result .cloned() else { bad_host = true; - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.add_log(format!("Host {} is down\r\n", object.host_name)); deployment.set_object_status(index, DeploymentObjectStatus::Failure); @@ -1560,7 +1560,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result let type_id = object.type_id; let t = types.get(&type_id); let type_kind = t.as_ref().and_then(|v| v.content.kind.clone()); - rt.set_location(file!(), line!()); + set_location!(rt); if type_kind == Some(KindType::Sum) { let next_objects = host_objects.entry(type_id).or_default(); // Temp workaronud for broken objects @@ -1593,7 +1593,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result if rt.is_cancelled() { break; } - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { for (i2, _) in &sum_objects { deployment.set_object_status(*i2, DeploymentObjectStatus::Deplying); @@ -1604,11 +1604,11 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result let mut m = ValueMap::new(); m.insert("objects".to_string(), Value::Object(next_objects.clone())); - rt.set_location(file!(), line!()); + set_location!(rt); let ret = deploy_single(rt, state, host_client, script, Value::Object(m)).await; if let Err(e) = ret { - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { for (i2, _) in &sum_objects { deployment.set_object_status(*i2, DeploymentObjectStatus::Failure); @@ -1619,7 +1619,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result .await?; bad_host = true; } else { - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { for (i2, _) in &sum_objects { deployment.set_object_status(*i2, DeploymentObjectStatus::Success); @@ -1638,7 +1638,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result if rt.is_cancelled() { break; } - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.add_header(&format!("{} ({})", &object.title, &object.type_name), false); deployment.set_object_status(index, DeploymentObjectStatus::Deplying); @@ -1665,7 +1665,7 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result }; let ok = ret.is_ok(); if let Err(e) = ret { - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, move |deployment| { deployment.add_log(format!("{e:?}")); Ok(()) @@ -1675,10 +1675,10 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result bad_host = true; } } else if type_kind != Some(KindType::Trigger) && type_kind.is_some() { - rt.set_location(file!(), line!()); + set_location!(rt); set_deployment(state, object, type_id).await?; } - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.set_object_status( index, @@ -1692,14 +1692,14 @@ async fn perform_deploy(rt: &RunToken, state: &State, mark_only: bool) -> Result }) .await?; } - rt.set_location(file!(), line!()); + set_location!(rt); mut_deployment(state, |deployment| { deployment.add_log("Done".to_string()); deployment.set_status(DeploymentStatus::Done); Ok(()) }) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); Ok(()) } diff --git a/src/bin/server/hostclient.rs b/src/bin/server/hostclient.rs index 2575173..ace0cf7 100644 --- a/src/bin/server/hostclient.rs +++ b/src/bin/server/hostclient.rs @@ -22,7 +22,7 @@ use tokio::{ sync::mpsc::{UnboundedReceiver, UnboundedSender}, }; use tokio_rustls::{TlsAcceptor, server::TlsStream}; -use tokio_tasks::{RunToken, TaskBuilder, cancelable}; +use tokio_tasks::{RunToken, TaskBuilder, cancelable, set_location}; use sadmin2::client_message::{ ClientHostMessage, HostClientMessage, RunInstantMessage, RunInstantStdinOutputType, @@ -386,7 +386,7 @@ impl HostClient { .shutdown_order(-1) .create(|rt| async move { let s = s; - rt.set_location(file!(), line!()); + set_location!(rt); match cancelable(&rt, tokio::time::timeout(Duration::from_secs(60), s.sign_host_certificate(&rt, &state))).await { Ok(Ok(Ok(()))) => (), Ok(Ok(Err(e))) => { @@ -476,16 +476,16 @@ impl HostClient { async fn sign_host_certificate(self: &Arc, rt: &RunToken, state: &State) -> Result<()> { info!("Signing SSH host certificate for {}", self.hostname); // TODO(jakobt) ADD Read file command - rt.set_location(file!(), line!()); + set_location!(rt); let host_key = self .run_shell("cat /etc/ssh/ssh_host_ed25519_key.pub".into()) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); let r = db::get_root_variables(state).await?; - rt.set_location(file!(), line!()); + set_location!(rt); if let Some(ssh_host_ca_key) = r.get("sshHostCaKey") { const VALIDITY_DAYS: u32 = 7; - rt.set_location(file!(), line!()); + set_location!(rt); let ssh_crt: String = crt::generate_ssh_crt( &format!("{} sadmin host", self.hostname), &format!( @@ -498,14 +498,14 @@ impl HostClient { crt::Type::Host, ) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); self.write_small_text_file("/etc/ssh/ssh_host_ed25519_key-cert.pub".into(), ssh_crt) .await?; // TODO add exec command - rt.set_location(file!(), line!()); + set_location!(rt); self.run_shell("systemctl reload 'ssh*.service'".into()) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); } Ok(()) } diff --git a/src/bin/server/webclient.rs b/src/bin/server/webclient.rs index 5e5cd93..cd712e3 100644 --- a/src/bin/server/webclient.rs +++ b/src/bin/server/webclient.rs @@ -15,7 +15,7 @@ use std::{ time::Duration, }; use tokio::net::TcpListener; -use tokio_tasks::{RunToken, TaskBuilder, cancelable}; +use tokio_tasks::{RunToken, TaskBuilder, cancelable, set_location}; use tokio_tungstenite::tungstenite; use crate::{ @@ -928,21 +928,21 @@ os.execv(sys.argv[1], sys.argv[1:]) rt: RunToken, act: IClientAction, ) -> Result<()> { - rt.set_location(file!(), line!()); + set_location!(rt); match act { IClientAction::RequestInitialState(_) => { if !self.get_auth().auth { self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query_as!(ObjectRow, "SELECT `id`, `type`, `name`, `content`, `category`, `version`, `comment`, strftime('%s', `time`) AS `time`, `author` FROM `objects` WHERE `newest` ORDER BY `id`" ) .fetch_all(&state.db) .await.context("RequestInitialState query")?; - rt.set_location(file!(), line!()); + set_location!(rt); let hosts_up: Vec<_> = state.host_clients.lock().unwrap().keys().cloned().collect(); @@ -996,7 +996,7 @@ os.execv(sys.argv[1], sys.argv[1:]) used_by.extend(object.content.contains_iter().map(|v| (v, object.id))); used_by.extend(object.content.sudo_on_iter().map(|v| (v, object.id))) } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::SetInitialState(ISetInitialState { @@ -1015,18 +1015,18 @@ os.execv(sys.argv[1], sys.argv[1:]) .context("send_message")?; } IClientAction::RequestAuthStatus(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); let auth = get_auth(state, Some(&self.remote), act.session.as_deref()).await?; self.set_auth(auth.clone()); - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message(&rt, IServerAction::AuthStatus(auth)) .await?; } IClientAction::Login(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); if let Err(e) = self.handle_login_inner(&rt, state, act).await { error!("Error in handle_login: {e:?}"); - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::AuthStatus(IAuthStatus { @@ -1038,7 +1038,7 @@ os.execv(sys.argv[1], sys.argv[1:]) } } IClientAction::Logout(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); let auth = self.get_auth(); if !auth.auth { self.close(403).await?; @@ -1050,20 +1050,20 @@ os.execv(sys.argv[1], sys.argv[1:]) self.remote, auth.user, session, act.forget_pwd, act.forget_otp, ); if act.forget_pwd { - rt.set_location(file!(), line!()); + set_location!(rt); query!("UPDATE `sessions` SET `pwd`=NULL WHERE `sid`=?", session) .execute(&state.db) .await?; } if act.forget_otp { - rt.set_location(file!(), line!()); + set_location!(rt); query!("UPDATE `sessions` SET `otp`=NULL WHERE `sid`=?", session) .execute(&state.db) .await?; } let auth = get_auth(state, Some(&self.remote), Some(&session)).await?; self.set_auth(auth.clone()); - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message(&rt, IServerAction::AuthStatus(auth)) .await?; } @@ -1072,7 +1072,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query_as!( ObjectRow, "SELECT `id`, `version`, `type`, `name`, `content`, `category`, `comment`, @@ -1085,7 +1085,7 @@ os.execv(sys.argv[1], sys.argv[1:]) for row in rows { object.push(row.try_into()?); } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::ObjectChanged(IObjectChanged { id: act.id, object }), @@ -1093,12 +1093,12 @@ os.execv(sys.argv[1], sys.argv[1:]) .await?; } IClientAction::GetObjectId(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); if !self.get_auth().admin { self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let id = match self.get_object_id_inner(state, &act).await { Ok(v) => Some(v), Err(e) => { @@ -1120,7 +1120,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `version`, strftime('%s', `time`) AS `time`, `author` FROM `objects` WHERE `id`=?", act.id @@ -1135,7 +1135,7 @@ os.execv(sys.argv[1], sys.argv[1:]) author: row.author, }); } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::GetObjectHistoryRes(IGetObjectHistoryRes { @@ -1151,9 +1151,9 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let t = msg::get_full_text(state, act.id).await?; - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::MessageTextRep(IMessageTextRepAction { @@ -1178,7 +1178,7 @@ os.execv(sys.argv[1], sys.argv[1:]) } else { None }; - rt.set_location(file!(), line!()); + set_location!(rt); query!( "UPDATE `messages` SET `dismissed`=?, `dismissedTime`=? WHERE `id` IN (_LIST_)", act.dismissed, @@ -1205,7 +1205,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); query!("DELETE FROM `deployments` WHERE `host`=?", act.host) .execute(&state.db) .await?; @@ -1215,7 +1215,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `id`, `version`, `type`, `name`, `content`, `comment` FROM `objects` @@ -1226,7 +1226,7 @@ os.execv(sys.argv[1], sys.argv[1:]) ) .fetch_all(&state.db) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); let mut objects = Vec::new(); for row in rows { objects.push(ISearchResObject { @@ -1238,7 +1238,7 @@ os.execv(sys.argv[1], sys.argv[1:]) content: row.content, }); } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::SearchRes(ISearchRes { @@ -1249,7 +1249,7 @@ os.execv(sys.argv[1], sys.argv[1:]) .await?; } IClientAction::GenerateKey(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); self.handle_generate_key(&rt, state, act).await?; } IClientAction::SaveObject(act) => { @@ -1265,7 +1265,7 @@ os.execv(sys.argv[1], sys.argv[1:]) let mut obj = act.obj.context("Missing object in action")?; let object_type: i64 = obj.r#type.into(); let content = &mut obj.content; - rt.set_location(file!(), line!()); + set_location!(rt); let type_row = query!( "SELECT `content` FROM `objects` WHERE `id`=? AND `newest`", object_type @@ -1293,7 +1293,7 @@ os.execv(sys.argv[1], sys.argv[1:]) content.insert("otp_base32".to_string(), otp_base32.into()); content.insert("otp_url".to_string(), otp_url.into()); } - rt.set_location(file!(), line!()); + set_location!(rt); let IV { id, version } = db::change_object( state, act.id, @@ -1309,7 +1309,7 @@ os.execv(sys.argv[1], sys.argv[1:]) object: vec![obj], }), )?; - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::SetPage(ISetPageAction { @@ -1332,7 +1332,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `id`, `type`, `name`, `content` FROM `objects` WHERE `newest` ORDER BY `id`" ) @@ -1358,7 +1358,7 @@ os.execv(sys.argv[1], sys.argv[1:]) } } if !conflicts.is_empty() { - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::Alert(IAlert { @@ -1371,7 +1371,7 @@ os.execv(sys.argv[1], sys.argv[1:]) ) .await?; } else { - rt.set_location(file!(), line!()); + set_location!(rt); info!("Web client delete object id={}", act.id); db::change_object::( state, @@ -1387,7 +1387,7 @@ os.execv(sys.argv[1], sys.argv[1:]) object: vec![], }), )?; - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::SetPage(ISetPageAction { @@ -1402,7 +1402,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `id`, `hash`, `time`, `project`, `user`, `tag`, `pin`, `labels`, `removed` FROM `docker_images` WHERE `hash` IN (_LIST_)", @@ -1428,7 +1428,7 @@ os.execv(sys.argv[1], sys.argv[1:]) }, ); } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::DockerListImageByHashRes(IDockerListImageByHashRes { @@ -1439,7 +1439,7 @@ os.execv(sys.argv[1], sys.argv[1:]) .await?; } IClientAction::DockerListImageTags(act) => { - rt.set_location(file!(), line!()); + set_location!(rt); if !self.get_auth().docker_pull { self.close(403).await?; return Ok(()); @@ -1449,7 +1449,7 @@ os.execv(sys.argv[1], sys.argv[1:]) .context("Bad unix time")? .as_secs_f64(); let time = now - 14.0 * 24.0 * 60.0 * 60.0; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = match query_as!( DockerImageTagRow, "SELECT `id`, `hash`, `time`, `project`, `user`, `tag`, `pin`, `labels`, `removed` @@ -1471,14 +1471,14 @@ os.execv(sys.argv[1], sys.argv[1:]) for row in rows { tags.push(row.try_into().context("Mapping row")?); } - rt.set_location(file!(), line!()); + set_location!(rt); let pinned_image_tags = query_as!( IDockerListImageTagsResTag, "SELECT `project` as `image`, `tag` FROM `docker_image_tag_pins`" ) .fetch_all(&state.db) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::DockerListImageTagsRes(IDockerListImageTagsRes { @@ -1499,7 +1499,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); query!( "UPDATE `docker_images` SET pin=? WHERE `id`=?", act.pin, @@ -1507,7 +1507,7 @@ os.execv(sys.argv[1], sys.argv[1:]) ) .execute(&state.db) .await?; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `id`, `hash`, `time`, `project`, `user`, `tag`, `pin`, `labels`, `removed` FROM `docker_images` WHERE `id`=?", @@ -1549,7 +1549,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); if act.pin { query!( "INSERT INTO `docker_image_tag_pins` (`project`, `tag`) VALUES (?, ?)", @@ -1585,7 +1585,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); let rows = query!( "SELECT `id`, `hash`, `time`, `project`, `user`, `tag`, `pin`, `labels`, `removed` FROM `docker_images` WHERE `tag` = ? AND `project`= ?", @@ -1609,7 +1609,7 @@ os.execv(sys.argv[1], sys.argv[1:]) pinned_image_tag: false, }); } - rt.set_location(file!(), line!()); + set_location!(rt); self.send_message( &rt, IServerAction::DockerListImageTagHistoryRes(IDockerListImageTagHistoryRes { @@ -1630,7 +1630,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); query!( "DELETE FROM `docker_deployments` WHERE `host`=? AND `container`=?", act.host, @@ -1658,7 +1658,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); deploy_service(state, self, act).await?; } IClientAction::ServiceRedeployStart(act) => { @@ -1670,7 +1670,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); redploy_service(state, self, act).await?; } IClientAction::DockerListDeployments(act) => { @@ -1678,7 +1678,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); list_deployments(&rt, state, self, act).await?; } IClientAction::DockerListDeploymentHistory(act) => { @@ -1686,7 +1686,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); list_deployment_history(&rt, state, self, act).await?; } IClientAction::ModifiedFilesScan(_) => { @@ -1698,7 +1698,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); modified_files::scan(state).await?; } IClientAction::ModifiedFilesList(act) => { @@ -1706,7 +1706,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(403).await?; return Ok(()); }; - rt.set_location(file!(), line!()); + set_location!(rt); modified_files::list(&rt, state, self, act).await?; } IClientAction::ModifiedFilesResolve(act) => { @@ -1718,7 +1718,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); modified_files::resolve(state, self, act).await?; } IClientAction::DeployObject(act) => { @@ -1730,7 +1730,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); if let Err(e) = deployment::setup_deployment(state, act.id, act.redeploy, act.cancel).await { @@ -1746,7 +1746,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); deployment::cancel(state).await?; } IClientAction::StartDeployment(_) => { @@ -1758,7 +1758,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); if let Err(e) = deployment::start(&rt, state).await { alert_error(&rt, state, e, "Deployment::start", Some(self)).await?; } @@ -1772,7 +1772,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); if let Err(e) = deployment::mark_deployed(&rt, state).await { alert_error(&rt, state, e, "Deployment::mark_deployed", Some(self)).await?; } @@ -1786,7 +1786,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); deployment::stop(state).await? } IClientAction::ToggleDeploymentObject(act) => { @@ -1820,7 +1820,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); self.handle_run_command(state, &rt, act).await?; } IClientAction::RunCommandTerminate(act) => { @@ -1832,7 +1832,7 @@ os.execv(sys.argv[1], sys.argv[1:]) self.close(503).await?; return Ok(()); } - rt.set_location(file!(), line!()); + set_location!(rt); if let Some(token) = self.command_tokens.lock().unwrap().get(&act.id) { token.cancel(); }