Полный продакшн-фикс: parity с old bash, drift-recovery, status/runtime и builder separation
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use std::{
|
||||
fs,
|
||||
io::Write,
|
||||
sync::{Arc, Mutex},
|
||||
thread,
|
||||
time::{Duration, Instant},
|
||||
@@ -15,6 +16,7 @@ struct LastActionState {
|
||||
}
|
||||
|
||||
const LAST_STATE_FILE: &str = "/run/awg2-harness/last_action.state";
|
||||
const EVENTS_FILE: &str = "/run/awg2-harness/events.log";
|
||||
|
||||
pub fn run(cfg: Config) -> anyhow::Result<()> {
|
||||
info!("starting daemon");
|
||||
@@ -22,13 +24,17 @@ pub fn run(cfg: Config) -> anyhow::Result<()> {
|
||||
|
||||
if let Err(e) = traffic::reconcile_traffic(&cfg) {
|
||||
set_err(&state, format!("startup traffic reconcile: {e}"));
|
||||
append_event(&format!("startup_reconcile traffic=error error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(&state, "startup traffic reconcile ok");
|
||||
append_event("startup_reconcile traffic=ok");
|
||||
}
|
||||
if let Err(e) = firewall::apply_firewall(&cfg) {
|
||||
set_err(&state, format!("startup firewall reconcile: {e}"));
|
||||
append_event(&format!("startup_firewall error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(&state, "startup firewall reconcile ok");
|
||||
append_event("startup_firewall ok");
|
||||
}
|
||||
let _ = reboot::maybe_schedule_reboot(&cfg);
|
||||
let reboot_cfg = cfg.clone();
|
||||
@@ -53,14 +59,18 @@ pub fn run(cfg: Config) -> anyhow::Result<()> {
|
||||
if let Err(e) = traffic::reconcile_traffic(&cfg) {
|
||||
error!(error = %e, "traffic reconcile error");
|
||||
set_err(&state, format!("periodic traffic reconcile: {e}"));
|
||||
append_event(&format!("periodic_reconcile traffic=error error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(&state, "periodic traffic reconcile ok");
|
||||
append_event("periodic_reconcile traffic=ok");
|
||||
}
|
||||
if let Err(e) = firewall::apply_firewall(&cfg) {
|
||||
error!(error = %e, "firewall reconcile error");
|
||||
set_err(&state, format!("periodic firewall reconcile: {e}"));
|
||||
append_event(&format!("periodic_reconcile firewall=error error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(&state, "periodic firewall reconcile ok");
|
||||
append_event("periodic_reconcile firewall=ok");
|
||||
}
|
||||
thread::sleep(Duration::from_secs(
|
||||
cfg.traffic.reconcile_interval_secs.max(5),
|
||||
@@ -94,16 +104,21 @@ fn docker_events_loop(cfg: &Config, state: &Arc<Mutex<LastActionState>>) -> anyh
|
||||
if cfg.amnezia.container_names.iter().any(|n| n == &name)
|
||||
&& wait_for_interface(cfg, &name, cfg.traffic.container_ready_timeout_secs)
|
||||
{
|
||||
append_event(&format!("docker_event container={name} action=start"));
|
||||
if let Err(e) = traffic::reconcile_traffic(cfg) {
|
||||
set_err(state, format!("event traffic reconcile: {e}"));
|
||||
append_event(&format!("event_reconcile traffic=error error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(state, "event traffic reconcile ok");
|
||||
append_event("event_reconcile traffic=ok");
|
||||
}
|
||||
|
||||
if let Err(e) = firewall::apply_firewall(cfg) {
|
||||
set_err(state, format!("event firewall reconcile: {e}"));
|
||||
append_event(&format!("event_reconcile firewall=error error=\"{e}\""));
|
||||
} else {
|
||||
set_ok(state, "event firewall reconcile ok");
|
||||
append_event("event_reconcile firewall=ok");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,3 +165,15 @@ fn persist_state(state: &LastActionState) {
|
||||
);
|
||||
let _ = fs::write(LAST_STATE_FILE, content);
|
||||
}
|
||||
|
||||
fn append_event(event: &str) {
|
||||
let _ = fs::create_dir_all("/run/awg2-harness");
|
||||
let ts = chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Secs, true);
|
||||
if let Ok(mut f) = fs::OpenOptions::new()
|
||||
.create(true)
|
||||
.append(true)
|
||||
.open(EVENTS_FILE)
|
||||
{
|
||||
let _ = writeln!(f, "{ts} {event}");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user