pub struct BridgeClient { /* private fields */ }Expand description
A live connection to a spawned bridge process, multiplexing D-Bus and stream channels over its stdio.
Implementations§
Source§impl BridgeClient
impl BridgeClient
Sourcepub fn connect(transport: &dyn Transport) -> Result<BridgeClient>
pub fn connect(transport: &dyn Transport) -> Result<BridgeClient>
Spawn the bridge via transport, perform the init handshake, and return
a ready client.
Sourcepub fn dbus_open(&mut self, name: &str) -> Result<String>
pub fn dbus_open(&mut self, name: &str) -> Result<String>
Open an unprivileged D-Bus channel to name and return its channel id.
Sourcepub fn dbus_open_privileged(&mut self, name: &str) -> Result<String>
pub fn dbus_open_privileged(&mut self, name: &str) -> Result<String>
Open a privileged D-Bus channel (superuser: "require"); the bridge
performs the sudo/polkit escalation and spawns a root peer (Section 5).
Sourcepub fn escalate(&mut self) -> Result<()>
pub fn escalate(&mut self) -> Result<()>
Bring up a root peer by selecting a working escalation mechanism.
With init sent as superuser: "none", no root peer exists until fez
asks for one. This reads the bridge’s advertised mechanisms
(BridgeClient::superuser_bridges) and tries each via
BridgeClient::superuser_start in order until one succeeds, so a host
with password-only sudo but a working polkit rule still escalates. The
FEZ_ESCALATION environment variable overrides the default loop:
off disables escalation, and any other value forces that single
mechanism (no fall-through). Idempotent: a no-op once escalated.
§Errors
Returns FezError::AccessDenied (exit 11) when no mechanism succeeds,
when the host advertises none, or when FEZ_ESCALATION=off. Propagates
any non-Dbus transport error encountered while talking to the bridge.
Sourcepub fn superuser_bridges(&mut self) -> Result<Vec<String>>
pub fn superuser_bridges(&mut self) -> Result<Vec<String>>
List the escalation mechanisms the bridge considers viable on this host.
Reads the cockpit.Superuser Bridges property (signature as) over
the internal bus. The list is the bridge’s own ordered, validity-filtered
set of mechanism names (e.g. ["sudo", "pkexec"]); an empty list means
the host has no usable escalation mechanism.
§Errors
Returns FezError::Dbus if the property read fails, or any transport
error from opening the internal channel or reading the reply.
Sourcepub fn superuser_start(&mut self, name: &str) -> Result<()>
pub fn superuser_start(&mut self, name: &str) -> Result<()>
Ask the bridge to start the named escalation mechanism.
Calls cockpit.Superuser.Start(name) over the internal bus. On success
the bridge has brought up a root peer, and subsequent
superuser: "require" channels route to it. A mechanism that needs a
credential fez cannot supply surfaces as a D-Bus error, not a hang.
§Errors
Returns FezError::Dbus when the bridge rejects the start (e.g. the
mechanism needs an unanswerable credential), or any transport error.
Sourcepub fn dbus_call(
&mut self,
channel: &str,
path: &str,
iface: &str,
method: &str,
args: Value,
) -> Result<Value>
pub fn dbus_call( &mut self, channel: &str, path: &str, iface: &str, method: &str, args: Value, ) -> Result<Value>
Returns the out-argument array (reply[0]). Index [0] for the first return value.
Sourcepub fn dbus_call_collect(
&mut self,
channel: &str,
path: &str,
iface: &str,
method: &str,
args: Value,
) -> Result<Vec<(String, Vec<Value>)>>
pub fn dbus_call_collect( &mut self, channel: &str, path: &str, iface: &str, method: &str, args: Value, ) -> Result<Vec<(String, Vec<Value>)>>
Send a D-Bus method call on channel and collect the signals it emits
until a Finished signal (or a channel close) terminates the stream.
PackageKit transactions report their result as a stream of signals on
the transaction object path rather than as a method reply, so the
request/reply BridgeClient::dbus_call cannot observe them. This sends
the call, then accumulates every signal frame on channel whose path
matches path, returning the raw (member, args) pairs in arrival
order. The method-call reply itself (an empty reply) is ignored; only
signals carry the payload. A Finished signal ends collection.
§Errors
Returns FezError::BridgeClosed / FezError::Timeout on transport
failure, FezError::Decode on a malformed frame, or the mapped close
problem if the channel closes with an error before Finished.
Sourcepub fn stream_collect(&mut self, argv: &[&str]) -> Result<Vec<u8>>
pub fn stream_collect(&mut self, argv: &[&str]) -> Result<Vec<u8>>
Open a stream channel running argv and buffer its output until done.