This commit is contained in:
netadmin committed 2026-10-25 22:48:38 +03:00
1 parent b0d63c9f0f
commit 552c009120
8 files changed
+114 -83

No files matched your search

+12 -3
View File
@@ -90,7 +90,10 @@ pub struct PeerDevice {
/// Собеседник подтвердил сверку с НАШИМ устройством (узнаём по mTLS-каналу из /p2p/info).
pub trusts_me: bool,
pub online: bool,
/// Когда устройство последний раз отвечало по сети (unix timestamp, сек).
pub last_seen: u64,
/// Когда мы последний раз опрашивали (пинговали) это устройство (unix timestamp, сек).
pub last_ping: u64,
}
impl PeerDevice {
@@ -106,6 +109,7 @@ impl PeerDevice {
trusts_me: false,
online: false,
last_seen: 0,
last_ping: 0,
}
}
}
@@ -198,6 +202,8 @@ pub struct AppState {
pub probe_cooldown: PlMutex<HashMap<(IpAddr, u16), Instant>>,
/// Интервал опроса известных пиров (сек), меняется на лету
pub ping_interval_sec: AtomicU64,
/// Время последнего глобального опроса устройств (unix timestamp, сек)
pub last_ping: AtomicU64,
pub ping_notify: Notify,
/// true в режиме `serve`: журнал дублируется в stdout (в CLI-командах stdout занят результатом)
pub log_stdout: bool,
@@ -303,6 +309,7 @@ impl AppState {
ips: p.ips.clone(),
port: p.port,
trusts_me: p.trusts_me,
last_seen: p.last_seen,
})
.collect();
match storage::save_trusted(&self.data_dir, &entries) {
@@ -367,6 +374,7 @@ impl AppState {
p.port = port;
p.online = true;
p.last_seen = now;
p.last_ping = now;
p.ips.retain(|x| x != &ip_s);
p.ips.insert(0, ip_s.clone());
p.ips.truncate(MAX_PEER_IPS);
@@ -378,6 +386,7 @@ impl AppState {
let mut p = PeerDevice::new(fp, name.clone(), vec![ip_s.clone()], port, &self.my_fingerprint, false);
p.online = true;
p.last_seen = now;
p.last_ping = now;
v.insert(p);
created = true;
}
@@ -405,11 +414,12 @@ impl AppState {
return;
}
let ip_s = ip.to_string();
let now = now_sec();
let mut dirty = false;
if let Some(p) = self.peers.write().get_mut(fp) {
let changed = p.ips.first() != Some(&ip_s);
p.online = true;
p.last_seen = now_sec();
p.last_seen = now;
if changed {
p.ips.retain(|x| x != &ip_s);
p.ips.insert(0, ip_s);
@@ -496,7 +506,6 @@ impl AppState {
}
/// Подхватывает изменения trusted.json, сделанные другим процессом (CLI: trust/untrust).
/// Повреждённый файл игнорируется, а не «разжалует» всех пиров.
pub fn sync_trust_from_disk(&self) {
let path = self.data_dir.join("trusted.json");
let Ok(mt) = std::fs::metadata(&path).and_then(|m| m.modified()) else { return };
@@ -528,6 +537,7 @@ impl AppState {
let port = if e.port == 0 { 8443 } else { e.port };
let mut np = PeerDevice::new(&e.fp, clean_label(&e.name, 48), ips, port, &self.my_fingerprint, true);
np.trusts_me = e.trusts_me;
np.last_seen = e.last_seen;
peers.insert(e.fp.clone(), np);
}
}
@@ -581,7 +591,6 @@ pub fn short_id(fp: &str) -> String {
}
/// SAS-код: SHA-256(sorted(fpA, fpB)), 80 бит, группы по 4 символа.
/// Подбор ключа «под префикс» не работает: код зависит от обоих сертификатов.
pub fn sas_code(a: &str, b: &str) -> String {
let (x, y) = if a <= b { (a, b) } else { (b, a) };
let mut h = Sha256::new();