Persistencia setters, compat-resolved, journald→CAS, compat-polkit
- hostnamed: SetHostname llama sethostname(2) + cache. SetStaticHostname
escribe atómico a /etc/hostname (tmp + fsync + rename, perms 0644).
Set{Pretty,Icon,Chassis,Deployment,Location} mergean k=v en
/etc/machine-info preservando otras keys. Validación: hostname RFC 1123
+ chassis enum.
- timedated: SetTimezone valida que /usr/share/zoneinfo/<tz> exista,
hace symlink atómico a /etc/localtime.
- localed: SetLocale valida formato KEY=value, escribe a /etc/locale.conf.
- compat-resolved (nuevo): org.freedesktop.resolve1.Manager con
ResolveHostname (vía tokio::lookup_host) y ResolveAddress (getnameinfo).
ResolveRecord devuelve NotSupported.
- journald-compat: persiste cada datagram al CAS por SHA. Append a
~/.local/share/ente/journal/index.log con
timestamp_ms:source:unit:sha_hex. Mutex serializa escrituras.
- compat-polkit (nuevo): org.freedesktop.PolicyKit1.Authority always-yes.
CheckAuthorization/CheckAuthorizationByAsync responden true,false,{}.
EnumerateActions vacío. Loguea action_id + pid/uid del subject.
7 compat-shims operativos en paralelo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -96,8 +96,21 @@ impl LocaleManager {
|
||||
}
|
||||
|
||||
async fn set_locale(&self, locale: Vec<String>, _interactive: bool) -> fdo::Result<()> {
|
||||
info!(?locale, "SetLocale (stub: no persistimos a /etc/locale.conf)");
|
||||
*self.transient_locale.lock().unwrap() = Some(locale);
|
||||
// Validar formato KEY=value en cada entry.
|
||||
for entry in &locale {
|
||||
if !entry.contains('=') {
|
||||
return Err(fdo::Error::InvalidArgs(
|
||||
format!("locale entry inválido (sin '='): {entry}")
|
||||
));
|
||||
}
|
||||
}
|
||||
let content: String = locale.iter()
|
||||
.map(|s| format!("{s}\n"))
|
||||
.collect();
|
||||
atomic_write("/etc/locale.conf", content.as_bytes())
|
||||
.map_err(|e| fdo::Error::Failed(format!("write /etc/locale.conf: {e}")))?;
|
||||
*self.transient_locale.lock().unwrap() = Some(locale.clone());
|
||||
info!(?locale, "SetLocale → /etc/locale.conf");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -126,6 +139,24 @@ impl LocaleManager {
|
||||
}
|
||||
}
|
||||
|
||||
fn atomic_write(path: &str, content: &[u8]) -> std::io::Result<()> {
|
||||
use std::io::Write;
|
||||
use std::os::unix::fs::OpenOptionsExt;
|
||||
let p = std::path::Path::new(path);
|
||||
if let Some(parent) = p.parent() { let _ = std::fs::create_dir_all(parent); }
|
||||
let tmp = p.with_extension("tmp");
|
||||
{
|
||||
let mut f = std::fs::OpenOptions::new()
|
||||
.create(true).write(true).truncate(true)
|
||||
.mode(0o644)
|
||||
.open(&tmp)?;
|
||||
f.write_all(content)?;
|
||||
f.sync_all()?;
|
||||
}
|
||||
std::fs::rename(&tmp, p)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn read_kv(path: &str, key: &str) -> Option<String> {
|
||||
let content = std::fs::read_to_string(path).ok()?;
|
||||
for line in content.lines() {
|
||||
|
||||
Reference in New Issue
Block a user