fix(network): re-register secret agent after NetworkManager restart
This commit is contained in:
parent
e544cb54c2
commit
48c3633151
1 changed files with 30 additions and 5 deletions
|
|
@ -35,7 +35,11 @@ use cosmic::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use futures::{StreamExt, lock::Mutex as AsyncMutex};
|
use futures::{
|
||||||
|
StreamExt,
|
||||||
|
channel::mpsc::{UnboundedReceiver, UnboundedSender, unbounded},
|
||||||
|
lock::Mutex as AsyncMutex,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::{config, fl};
|
use crate::{config, fl};
|
||||||
|
|
||||||
|
|
@ -325,6 +329,7 @@ struct CosmicNetworkApplet {
|
||||||
new_connection: Option<NewConnectionState>,
|
new_connection: Option<NewConnectionState>,
|
||||||
toggle_wifi_ctr: u128,
|
toggle_wifi_ctr: u128,
|
||||||
token_tx: Option<calloop::channel::Sender<TokenRequest>>,
|
token_tx: Option<calloop::channel::Sender<TokenRequest>>,
|
||||||
|
secret_agent_reregister_tx: Option<UnboundedSender<()>>,
|
||||||
failed_known_ssids: FxHashSet<Arc<str>>,
|
failed_known_ssids: FxHashSet<Arc<str>>,
|
||||||
|
|
||||||
/// When defined, displays connections for the specific device.
|
/// When defined, displays connections for the specific device.
|
||||||
|
|
@ -929,7 +934,10 @@ impl CosmicNetworkApplet {
|
||||||
|
|
||||||
/// Registers an `nmrs` secret agent on the system bus and yields its
|
/// Registers an `nmrs` secret agent on the system bus and yields its
|
||||||
/// requests + cancellations as [`NmAgentEvent`] for the applet to handle.
|
/// requests + cancellations as [`NmAgentEvent`] for the applet to handle.
|
||||||
fn secret_agent_task(identifier: String) -> Task<NmAgentEvent> {
|
fn secret_agent_task(
|
||||||
|
identifier: String,
|
||||||
|
mut reregister_requests: UnboundedReceiver<()>,
|
||||||
|
) -> Task<NmAgentEvent> {
|
||||||
cosmic::Task::stream(async_fn_stream::fn_stream(move |emitter| async move {
|
cosmic::Task::stream(async_fn_stream::fn_stream(move |emitter| async move {
|
||||||
let registration = SecretAgent::builder()
|
let registration = SecretAgent::builder()
|
||||||
.with_identifier(identifier)
|
.with_identifier(identifier)
|
||||||
|
|
@ -961,6 +969,11 @@ fn secret_agent_task(identifier: String) -> Task<NmAgentEvent> {
|
||||||
}
|
}
|
||||||
None => break,
|
None => break,
|
||||||
},
|
},
|
||||||
|
Some(()) = reregister_requests.next() => {
|
||||||
|
if let Err(e) = handle.reregister().await {
|
||||||
|
tracing::warn!("failed to re-register secret agent: {e}");
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1076,13 +1089,17 @@ impl cosmic::Application for CosmicNetworkApplet {
|
||||||
let uuid = uuid::Uuid::new_v4().to_string().replace("-", "_");
|
let uuid = uuid::Uuid::new_v4().to_string().replace("-", "_");
|
||||||
let my_id =
|
let my_id =
|
||||||
format!("com.system76.CosmicSettings.Applet._{uuid}.NetworkManager.SecretAgent",);
|
format!("com.system76.CosmicSettings.Applet._{uuid}.NetworkManager.SecretAgent",);
|
||||||
|
let (secret_agent_reregister_tx, secret_agent_reregister_rx) = unbounded();
|
||||||
|
|
||||||
(
|
(
|
||||||
applet,
|
Self {
|
||||||
|
secret_agent_reregister_tx: Some(secret_agent_reregister_tx),
|
||||||
|
..applet
|
||||||
|
},
|
||||||
Task::batch(vec![
|
Task::batch(vec![
|
||||||
snapshot_task(),
|
snapshot_task(),
|
||||||
network_events_task(),
|
network_events_task(),
|
||||||
secret_agent_task(my_id).map(Message::SecretAgent),
|
secret_agent_task(my_id, secret_agent_reregister_rx).map(Message::SecretAgent),
|
||||||
])
|
])
|
||||||
.map(cosmic::Action::App),
|
.map(cosmic::Action::App),
|
||||||
)
|
)
|
||||||
|
|
@ -1427,7 +1444,15 @@ impl cosmic::Application for CosmicNetworkApplet {
|
||||||
}
|
}
|
||||||
Message::NetworkEvent(event) => {
|
Message::NetworkEvent(event) => {
|
||||||
if matches!(event, NetworkEvent::NetworkManagerRestarted) {
|
if matches!(event, NetworkEvent::NetworkManagerRestarted) {
|
||||||
tracing::debug!("NetworkManager restarted; refreshing network snapshot");
|
tracing::debug!(
|
||||||
|
"NetworkManager restarted; refreshing network snapshot and secret agent"
|
||||||
|
);
|
||||||
|
if let Some(mut tx) = self.secret_agent_reregister_tx.clone() {
|
||||||
|
if let Err(e) = tx.unbounded_send(()) {
|
||||||
|
tracing::warn!("secret agent re-registration task stopped: {e}");
|
||||||
|
self.secret_agent_reregister_tx = None;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return snapshot_task().map(cosmic::Action::App);
|
return snapshot_task().map(cosmic::Action::App);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue