···
use anyhow::{anyhow, bail, Context, Result};
blocking::{stdintf::org_freedesktop_dbus::Properties, LocalConnection, Proxy},
21
-
strings::{BusName, Interface, Member},
···
38
-
#![allow(non_upper_case_globals)]
39
-
#![allow(non_camel_case_types)]
40
-
#![allow(non_snake_case)]
42
-
#![allow(clippy::all)]
43
-
include!(concat!(env!("OUT_DIR"), "/fdo_dbus.rs"));
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
···
include!(concat!(env!("OUT_DIR"), "/logind_manager.rs"));
65
-
fdo_dbus::OrgFreedesktopDBusNameOwnerChanged, systemd_manager::OrgFreedesktopSystemd1Manager,
53
+
use crate::systemd_manager::OrgFreedesktopSystemd1Manager;
logind_manager::OrgFreedesktopLogin1Manager,
···
910
-
fn fdo_dbus_proxy(conn: &LocalConnection) -> Proxy<'_, &LocalConnection> {
912
-
"org.freedesktop.DBus",
913
-
"/org/freedesktop/DBus",
914
-
Duration::from_millis(500),
fn systemd1_proxy(conn: &LocalConnection) -> Proxy<'_, &LocalConnection> {
"org.freedesktop.systemd1",
···
954
-
fn reexecute_systemd_manager(
955
-
dbus_conn: &LocalConnection,
956
-
fdo_dbus: &Proxy<'_, &LocalConnection>,
957
-
) -> anyhow::Result<()> {
958
-
let reexecute_done = Rc::new(RefCell::new(false));
959
-
let _reexecute_done = reexecute_done.clone();
960
-
let owner_changed_token = fdo_dbus
962
-
move |signal: OrgFreedesktopDBusNameOwnerChanged, _: &LocalConnection, _: &Message| {
963
-
if signal.name.as_str() == "org.freedesktop.systemd1" {
964
-
*_reexecute_done.borrow_mut() = true;
970
-
.context("Failed to add signal match for DBus name owner changes")?;
972
-
let bus_name = BusName::from("org.freedesktop.systemd1");
973
-
let object_path = dbus::Path::from("/org/freedesktop/systemd1");
974
-
let interface = Interface::new("org.freedesktop.systemd1.Manager")
975
-
.expect("the org.freedesktop.systemd1.Manager interface name should be valid");
976
-
let method_name = Member::new("Reexecute").expect("the Reexecute method name should be valid");
978
-
// Systemd does not reply to the Reexecute method.
979
-
let _serial = dbus_conn
980
-
.send(Message::method_call(
986
-
.map_err(|_err| anyhow!("Failed to send org.freedesktop.systemd1.Manager.Reexecute"))?;
988
-
log::debug!("waiting for systemd to finish reexecuting");
989
-
while !*reexecute_done.borrow() {
991
-
.process(Duration::from_secs(500))
992
-
.context("Failed to process dbus messages")?;
996
-
.remove_match(owner_changed_token)
997
-
.context("Failed to remove jobs token")?;
/// Performs switch-to-configuration functionality for a single non-root user
fn do_user_switch(parent_exe: String) -> anyhow::Result<()> {
if Path::new(&parent_exe)
···
let dbus_conn = LocalConnection::new_session().context("Failed to open dbus connection")?;
1017
-
let fdo_dbus = fdo_dbus_proxy(&dbus_conn);
let systemd = systemd1_proxy(&dbus_conn);
1020
-
reexecute_systemd_manager(&dbus_conn, &fdo_dbus)?;
let nixos_activation_done = Rc::new(RefCell::new(false));
let _nixos_activation_done = nixos_activation_done.clone();
···
.context("Failed to add signal match for systemd removed jobs")?;
966
+
// The systemd user session seems to not send a Reloaded signal, so we don't have anything to
968
+
_ = systemd.reexecute();
.restart_unit("nixos-activation.service", "replace")
···
let mut units_to_reload = map_from_list_file(RELOAD_LIST_FILE);
let dbus_conn = LocalConnection::new_system().context("Failed to open dbus connection")?;
1210
-
let fdo_dbus = fdo_dbus_proxy(&dbus_conn);
let systemd = systemd1_proxy(&dbus_conn);
let logind = login1_proxy(&dbus_conn);
···
// just in case the new one has trouble communicating with the running pid 1.
eprintln!("restarting systemd...");
1736
-
reexecute_systemd_manager(&dbus_conn, &fdo_dbus)?;
1667
+
_ = systemd.reexecute(); // we don't get a dbus reply here
log::debug!("waiting for systemd restart to finish");
while !*systemd_reload_status.borrow() {