Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package himmelblau for openSUSE:Factory checked in at 2026-07-15 16:41:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/himmelblau (Old) and /work/SRC/openSUSE:Factory/.himmelblau.new.1991 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "himmelblau" Wed Jul 15 16:41:51 2026 rev:52 rq:1365721 version:3.1.9+git0.1d7db0df Changes: -------- --- /work/SRC/openSUSE:Factory/himmelblau/himmelblau.changes 2026-07-07 21:09:44.135847613 +0200 +++ /work/SRC/openSUSE:Factory/.himmelblau.new.1991/himmelblau.changes 2026-07-15 17:00:34.001001323 +0200 @@ -1,0 +2,10 @@ +Wed Jul 08 17:19:52 UTC 2026 - David Mulder <[email protected]> + +- Update to version 3.1.9+git0.1d7db0df: + * Version 3.1.9 + * Revert "Work around resume lockout on network down" + * Revert "dispatcher: refine Himmelblau restart workaround" + * Revert "packaging: disable duplicate NM workaround scripts" + * fix(resolver): release db lock before offline auth fallback to prevent deadlock + +------------------------------------------------------------------- Old: ---- himmelblau-3.1.8+git0.f72b330e.tar.bz2 New: ---- himmelblau-3.1.9+git0.1d7db0df.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ himmelblau.spec ++++++ --- /var/tmp/diff_new_pack.SkJ6Qu/_old 2026-07-15 17:00:40.957237220 +0200 +++ /var/tmp/diff_new_pack.SkJ6Qu/_new 2026-07-15 17:00:40.961237355 +0200 @@ -30,7 +30,7 @@ %endif Name: himmelblau -Version: 3.1.8+git0.f72b330e +Version: 3.1.9+git0.1d7db0df Release: 0 Summary: Interoperability suite for Microsoft Azure Entra Id License: GPL-3.0-or-later ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.SkJ6Qu/_old 2026-07-15 17:00:41.009238983 +0200 +++ /var/tmp/diff_new_pack.SkJ6Qu/_new 2026-07-15 17:00:41.013239120 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/himmelblau-idm/himmelblau.git</param> - <param name="changesrevision">f72b330ed7284f011450c91bc91cbc4c3f281a6c</param></service></servicedata> + <param name="changesrevision">1d7db0df9f857244cbdde873dfd19ddc8b3f28a8</param></service></servicedata> (No newline at EOF) ++++++ himmelblau-3.1.8+git0.f72b330e.tar.bz2 -> himmelblau-3.1.9+git0.1d7db0df.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/Cargo.lock new/himmelblau-3.1.9+git0.1d7db0df/Cargo.lock --- old/himmelblau-3.1.8+git0.f72b330e/Cargo.lock 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/Cargo.lock 2026-07-08 19:18:32.000000000 +0200 @@ -4,7 +4,7 @@ [[package]] name = "aad-tool" -version = "3.1.8" +version = "3.1.9" dependencies = [ "anyhow", "broker-client", @@ -611,7 +611,7 @@ [[package]] name = "broker" -version = "3.1.8" +version = "3.1.9" dependencies = [ "dbus", "himmelblau_unix_common", @@ -622,7 +622,7 @@ [[package]] name = "broker-client" -version = "3.1.8" +version = "3.1.9" dependencies = [ "serde_json", "zbus", @@ -2051,7 +2051,7 @@ [[package]] name = "himmelblau-fuzz" -version = "3.1.8" +version = "3.1.9" dependencies = [ "arbitrary", "himmelblau_unix_common", @@ -2063,7 +2063,7 @@ [[package]] name = "himmelblau_policies" -version = "3.1.8" +version = "3.1.9" dependencies = [ "anyhow", "async-trait", @@ -2085,7 +2085,7 @@ [[package]] name = "himmelblau_unix_common" -version = "3.1.8" +version = "3.1.9" dependencies = [ "anyhow", "async-trait", @@ -2136,7 +2136,7 @@ [[package]] name = "himmelblaud" -version = "3.1.8" +version = "3.1.9" dependencies = [ "async-trait", "base64 0.22.1", @@ -2525,7 +2525,7 @@ [[package]] name = "idmap" -version = "3.1.8" +version = "3.1.9" dependencies = [ "bindgen", "cc", @@ -3270,7 +3270,7 @@ [[package]] name = "nss_himmelblau" -version = "3.1.8" +version = "3.1.9" dependencies = [ "himmelblau_unix_common", "lazy_static", @@ -3376,7 +3376,7 @@ [[package]] name = "o365" -version = "3.1.8" +version = "3.1.9" dependencies = [ "anyhow", "reqwest 0.12.24", @@ -3678,7 +3678,7 @@ [[package]] name = "pam_himmelblau" -version = "3.1.8" +version = "3.1.9" dependencies = [ "himmelblau_unix_common", "libc", @@ -4107,7 +4107,7 @@ [[package]] name = "qr-greeter" -version = "3.1.8" +version = "3.1.9" [[package]] name = "qrcodegen" @@ -4812,7 +4812,7 @@ [[package]] name = "selinux" -version = "3.1.8" +version = "3.1.9" [[package]] name = "semver" @@ -5180,11 +5180,11 @@ [[package]] name = "sshd-config" -version = "3.1.8" +version = "3.1.9" [[package]] name = "sso" -version = "3.1.8" +version = "3.1.9" dependencies = [ "broker-client", "clap", @@ -5196,7 +5196,7 @@ [[package]] name = "sso-policies" -version = "3.1.8" +version = "3.1.9" [[package]] name = "stable_deref_trait" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/Cargo.toml new/himmelblau-3.1.9+git0.1d7db0df/Cargo.toml --- old/himmelblau-3.1.8+git0.f72b330e/Cargo.toml 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/Cargo.toml 2026-07-08 19:18:32.000000000 +0200 @@ -28,7 +28,7 @@ serde_cbor-0-11-2 = { package = "serde_cbor", path = "src/serde_cbor" } [workspace.package] -version = "3.1.8" +version = "3.1.9" authors = [ "David Mulder <[email protected]>" ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down new/himmelblau-3.1.9+git0.1d7db0df/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down --- old/himmelblau-3.1.8+git0.f72b330e/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down 1970-01-01 01:00:00.000000000 +0100 @@ -1,127 +0,0 @@ -#!/bin/sh -# Temporary workaround for himmelblau-idm/himmelblau#1206. - -IFACE="${1:-}" -ACTION="${2:-}" -TAG="himmelblau-nm-dispatcher" -SYSTEMD_RUN_DIR="${HIMMELBLAU_SYSTEMD_RUN_DIR:-/run/systemd/system}" -LOCKFILE="${HIMMELBLAU_NM_LOCKDIR:-/run/himmelblau-nm-dispatcher.lock}" -STAMP="${HIMMELBLAU_NM_STAMP:-/run/himmelblau-nm-dispatcher.last}" -COOLDOWN_SECONDS=15 -STATUS_TIMEOUT_SECONDS=2 - -log_skip() { - logger -t "$TAG" "Skipping $ACTION on ${IFACE:-none}: $1" -} - -log_info() { - logger -t "$TAG" "$1" -} - -case "$ACTION" in - pre-down|down) - case "$IFACE" in - ""|lo|docker*|virbr*|br-*|veth*|vnet*|tun*|tap*|wg*|ppp*) - exit 0 - ;; - esac - ;; - vpn-down) - ;; - connectivity-change) - case "${CONNECTIVITY_STATE:-unknown}" in - FULL|full) - exit 0 - ;; - esac - ;; - *) - exit 0 - ;; -esac - -if [ ! -d "$SYSTEMD_RUN_DIR" ] || ! command -v systemctl >/dev/null 2>&1; then - exit 0 -fi - -state="$(systemctl is-active himmelblaud.service 2>/dev/null || true)" -case "$state" in - active|failed) - ;; - activating|deactivating) - log_skip "himmelblaud.service is $state" - exit 0 - ;; - *) - log_skip "himmelblaud.service is $state" - exit 0 - ;; -esac - -restart_if_needed() { - now="$(date +%s 2>/dev/null || echo 0)" - last=0 - if [ -r "$STAMP" ]; then - last="$(cat "$STAMP" 2>/dev/null || echo 0)" - fi - case "$last" in - *[!0-9]*|"") - last=0 - ;; - esac - - if [ "$now" -gt 0 ] && [ "$last" -gt 0 ]; then - elapsed=$((now - last)) - if [ "$elapsed" -ge 0 ] && [ "$elapsed" -lt "$COOLDOWN_SECONDS" ]; then - log_skip "restart cooldown active (${elapsed}s)" - exit 0 - fi - fi - - if [ "$state" = "active" ] && [ "$ACTION" != "pre-down" ]; then - if command -v aad-tool >/dev/null 2>&1 && command -v timeout >/dev/null 2>&1; then - if timeout "$STATUS_TIMEOUT_SECONDS" aad-tool status 2>/dev/null | grep -qx "working!"; then - log_skip "himmelblaud.service is responsive" - exit 0 - fi - fi - fi - - if [ "$now" -gt 0 ]; then - printf '%s\n' "$now" >"$STAMP" 2>/dev/null || true - fi - - logger -t "$TAG" "Network ${IFACE:-none} event $ACTION - restarting himmelblaud.service and himmelblaud-tasks.service" - systemctl restart --no-block himmelblaud.service himmelblaud-tasks.service 2>&1 | logger -t "$TAG" - - exit 0 -} - -if [ -d "$LOCKFILE" ]; then - if rmdir "$LOCKFILE" 2>/dev/null; then - log_info "Removed stale dispatcher lock directory: $LOCKFILE" - else - log_skip "stale dispatcher lock directory is present" - exit 0 - fi -fi - -if command -v flock >/dev/null 2>&1; then - ( - if ! exec 9>"$LOCKFILE"; then - log_skip "dispatcher lock file is unavailable" - exit 0 - fi - if ! flock -n 9; then - log_skip "another dispatcher run is active" - exit 0 - fi - restart_if_needed - ) - exit $? -fi - -log_info "flock unavailable; proceeding without dispatcher lock" -restart_if_needed - -exit 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/src/common/src/resolver.rs new/himmelblau-3.1.9+git0.1d7db0df/src/common/src/resolver.rs --- old/himmelblau-3.1.8+git0.f72b330e/src/common/src/resolver.rs 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/src/common/src/resolver.rs 2026-07-08 19:18:32.000000000 +0200 @@ -105,6 +105,268 @@ } } +#[cfg(test)] +mod tests { + use super::{AuthSession, Resolver}; + use crate::db::{Cache, CacheTxn, Db, KeyStoreTxn}; + use crate::idprovider::interface::{ + tpm, AuthCacheAction, AuthCredHandler, AuthRequest, AuthResult, CacheState, GroupToken, Id, + IdProvider, IdpError, UserToken, UserTokenState, + }; + use crate::unix_config::{HomeAttr, UidAttr}; + use crate::unix_proto::{PamAuthRequest, PamAuthResponse}; + use async_trait::async_trait; + use himmelblau::UserToken as UnixUserToken; + use kanidm_hsm_crypto::{provider::BoxedDynTpm, provider::SoftTpm, provider::Tpm, AuthValue}; + use libkrimes::proto::KerberosCredentials; + use std::sync::atomic::{AtomicBool, Ordering}; + use std::time::{Duration, SystemTime}; + use tokio::sync::broadcast; + + struct OfflineFallbackProvider { + offline: AtomicBool, + } + + impl OfflineFallbackProvider { + fn new() -> Self { + Self { + offline: AtomicBool::new(false), + } + } + } + + #[async_trait] + impl IdProvider for OfflineFallbackProvider { + async fn check_online( + &self, + _tpm: &mut tpm::provider::BoxedDynTpm, + _now: SystemTime, + ) -> bool { + true + } + + async fn unix_user_get<D: KeyStoreTxn + Send>( + &self, + _id: &Id, + _token: Option<&UserToken>, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + ) -> Result<UserTokenState, IdpError> { + Ok(UserTokenState::UseCached) + } + + async fn unix_user_access<D: KeyStoreTxn + Send>( + &self, + _id: &Id, + _scopes: Vec<String>, + _token: Option<&UserToken>, + _client_id: Option<String>, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + ) -> Result<UnixUserToken, IdpError> { + Err(IdpError::BadRequest) + } + + async fn unix_user_tgts<D: KeyStoreTxn + Send>( + &self, + _id: &Id, + _old_token: Option<&UserToken>, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + ) -> ( + Option<Box<KerberosCredentials>>, + Option<Box<KerberosCredentials>>, + Option<String>, + Option<String>, + ) { + (None, None, None, None) + } + + async fn unix_user_prt_cookie<D: KeyStoreTxn + Send>( + &self, + _id: &Id, + _token: Option<&UserToken>, + _sso_nonce: Option<&str>, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + ) -> Result<String, IdpError> { + Err(IdpError::BadRequest) + } + + async fn change_auth_token<D: KeyStoreTxn + Send>( + &self, + _account_id: &str, + _token: &UnixUserToken, + _new_tok: &str, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + ) -> Result<bool, IdpError> { + Err(IdpError::BadRequest) + } + + async fn unix_user_online_auth_init<D: KeyStoreTxn + Send>( + &self, + _account_id: &str, + _token: Option<&UserToken>, + _service: &str, + _no_hello_pin: bool, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + _shutdown_rx: &broadcast::Receiver<()>, + ) -> Result<(AuthRequest, AuthCredHandler), IdpError> { + self.offline.store(true, Ordering::Release); + Err(IdpError::BadRequest) + } + + async fn unix_user_online_auth_step<D: KeyStoreTxn + Send>( + &self, + _account_id: &str, + _old_token: &UserToken, + _service: &str, + _no_hello_pin: bool, + _cred_handler: &mut AuthCredHandler, + _pam_next_req: PamAuthRequest, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + _shutdown_rx: &broadcast::Receiver<()>, + ) -> Result<(AuthResult, AuthCacheAction), IdpError> { + Err(IdpError::BadRequest) + } + + async fn unix_user_offline_auth_init<D: KeyStoreTxn + Send>( + &self, + _account_id: &str, + _token: Option<&UserToken>, + _no_hello_pin: bool, + _keystore: &mut D, + ) -> Result<(AuthRequest, AuthCredHandler), IdpError> { + Ok((AuthRequest::Pin, AuthCredHandler::None)) + } + + async fn unix_user_offline_auth_step<D: KeyStoreTxn + Send>( + &self, + _account_id: &str, + _token: &UserToken, + _cred_handler: &mut AuthCredHandler, + _pam_next_req: PamAuthRequest, + _keystore: &mut D, + _tpm: &mut tpm::provider::BoxedDynTpm, + _machine_key: &tpm::structures::StorageKey, + _online_at_init: bool, + ) -> Result<AuthResult, IdpError> { + Err(IdpError::BadRequest) + } + + async fn unix_group_get( + &self, + _id: &Id, + _tpm: &mut tpm::provider::BoxedDynTpm, + ) -> Result<GroupToken, IdpError> { + Err(IdpError::NotFound { + what: "group".to_string(), + where_: "test".to_string(), + }) + } + + async fn get_cachestate<D: KeyStoreTxn + Send>( + &self, + _account_id: Option<&str>, + _keystore: &mut D, + ) -> CacheState { + if self.offline.load(Ordering::Acquire) { + CacheState::OfflineNextCheck(SystemTime::now() + Duration::from_secs(60)) + } else { + CacheState::Online + } + } + + async fn offline_break_glass(&self, _ttl: Option<u64>) -> Result<(), IdpError> { + Ok(()) + } + } + + fn test_token() -> UserToken { + UserToken { + name: "testuser".to_string(), + spn: "[email protected]".to_string(), + uuid: uuid::uuid!("0302b99c-f0f6-41ab-9492-852692b0fd16"), + real_gidnumber: Some(2000), + gidnumber: 2000, + displayname: "Test User".to_string(), + shell: None, + groups: Vec::new(), + tenant_id: Some(uuid::uuid!("58e8a301-2502-4814-81c5-a4d17c399a45")), + valid: true, + } + } + + async fn setup_resolver() -> Resolver<OfflineFallbackProvider> { + let db = Db::new("").expect("failed to create test db"); + let mut dbtxn = db.write().await; + dbtxn.migrate().expect("failed to migrate test db"); + dbtxn + .update_account(&test_token(), 0) + .expect("failed to seed test token"); + dbtxn.commit().expect("failed to commit test db"); + + let mut hsm = BoxedDynTpm::new(SoftTpm::new()); + let auth_value = AuthValue::ephemeral().expect("failed to create auth value"); + let loadable_machine_key = hsm + .root_storage_key_create(&auth_value) + .expect("failed to create machine key"); + let machine_key = hsm + .root_storage_key_load(&auth_value, &loadable_machine_key) + .expect("failed to load machine key"); + + Resolver::new( + db, + OfflineFallbackProvider::new(), + hsm, + machine_key, + 3600, + Vec::new(), + "/bin/sh".to_string(), + "/home/".to_string(), + HomeAttr::Name, + None, + UidAttr::Name, + UidAttr::Name, + Vec::new(), + ) + .await + .expect("failed to create resolver") + } + + #[tokio::test] + async fn online_auth_init_offline_fallback_does_not_reenter_db_lock() { + let resolver = setup_resolver().await; + let (_shutdown_tx, shutdown_rx) = broadcast::channel(1); + + let result = tokio::time::timeout( + Duration::from_secs(5), + resolver.pam_account_authenticate_init( + "[email protected]", + "gdm-password", + false, + shutdown_rx, + ), + ) + .await + .expect("auth init deadlocked waiting for the db lock") + .expect("auth init failed"); + + assert!(matches!(result.0, AuthSession::InProgress { .. })); + assert!(matches!(result.1, PamAuthResponse::Pin)); + } +} + impl<I> Resolver<I> where I: IdProvider + Sync, @@ -1122,29 +1384,32 @@ }; let maybe_err = if online_at_init { - let mut hsm_lock = self.hsm.lock().await; - let mut dbtxn = self.db.write().await; + let online_result = { + let mut hsm_lock = self.hsm.lock().await; + let mut dbtxn = self.db.write().await; + + self.client + .unix_user_online_auth_init( + account_id, + token.as_ref(), + service, + no_hello_pin, + &mut dbtxn, + hsm_lock.deref_mut(), + &self.machine_key, + &shutdown_rx, + ) + .await + }; - match self - .client - .unix_user_online_auth_init( - account_id, - token.as_ref(), - service, - no_hello_pin, - &mut dbtxn, - hsm_lock.deref_mut(), - &self.machine_key, - &shutdown_rx, - ) - .await - { + match online_result { Ok(res) => Ok(res), Err(e) => { // Check if the failure is because we went offline match self.get_cachestate(Some(account_id)).await { CacheState::Offline | CacheState::OfflineNextCheck(_) => { // Attempt to proceed offline + let mut dbtxn = self.db.write().await; self.client .unix_user_offline_auth_init( account_id, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/src/daemon/Cargo.toml new/himmelblau-3.1.9+git0.1d7db0df/src/daemon/Cargo.toml --- old/himmelblau-3.1.8+git0.f72b330e/src/daemon/Cargo.toml 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/src/daemon/Cargo.toml 2026-07-08 19:18:32.000000000 +0200 @@ -66,7 +66,6 @@ ["../../platform/debian/himmelblaud-tasks.service", "usr/lib/systemd/system/", "644"], ["../../platform/debian/himmelblaud.service", "usr/lib/systemd/system/", "644"], ["../../platform/debian/himmelblau-hsm-pin-init.service", "usr/lib/systemd/system/", "644"], - ["../../platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down", "usr/lib/NetworkManager/dispatcher.d/", "755"], ["scripts/himmelblau-init-hsm-pin", "usr/libexec/", "755"], ["target/release/himmelblaud", "usr/sbin/", "755"], ["target/release/himmelblaud_tasks", "usr/sbin/", "755"], @@ -91,7 +90,6 @@ { source = "../../platform/opensuse/himmelblaud-tasks.service", dest = "/usr/lib/systemd/system/", mode = "644" }, { source = "../../platform/opensuse/himmelblaud.service", dest = "/usr/lib/systemd/system/", mode = "644" }, { source = "../../platform/opensuse/himmelblau-hsm-pin-init.service", dest = "/usr/lib/systemd/system/", mode = "644" }, - { source = "../../platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down", dest = "/usr/lib/NetworkManager/dispatcher.d/", mode = "755" }, { source = "scripts/himmelblau-init-hsm-pin", dest = "/usr/libexec/", mode = "755" }, { source = "target/release/himmelblaud", dest = "/usr/sbin/", mode = "755" }, { source = "target/release/himmelblaud_tasks", dest = "/usr/sbin/", mode = "755" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.8+git0.f72b330e/src/daemon/scripts/postinst new/himmelblau-3.1.9+git0.1d7db0df/src/daemon/scripts/postinst --- old/himmelblau-3.1.8+git0.f72b330e/src/daemon/scripts/postinst 2026-07-07 00:46:09.000000000 +0200 +++ new/himmelblau-3.1.9+git0.1d7db0df/src/daemon/scripts/postinst 2026-07-08 19:18:32.000000000 +0200 @@ -89,44 +89,6 @@ fi done -disable_old_nm_dispatcher_workarounds() { - dispatcher_dir="${DPKG_ROOT:-}/etc/NetworkManager/dispatcher.d" - [ -d "$dispatcher_dir" ] || return 0 - - for file in \ - "$dispatcher_dir/99-zzz-himmelblau" \ - "$dispatcher_dir/99-restart-himmelblau" \ - "$dispatcher_dir/99-himmelblau"; do - [ -f "$file" ] || continue - if grep -Eq 'himmelblau-idm/himmelblau#1206|NM-dispatcher\.99-restart-himmelblau|99-zzz-himmelblau' "$file" \ - && grep -Eq 'systemctl[[:space:]]+restart.*himmelblaud(\.service)?' "$file"; then - disabled="${file}.himmelblau-disabled" - if [ -e "$disabled" ]; then - disabled="${disabled}.$$" - fi - if mv "$file" "$disabled"; then - echo "Disabled old manual Himmelblau NetworkManager workaround: $file -> $disabled" - else - echo "Warning: failed to disable old manual Himmelblau NetworkManager workaround: $file" >&2 - fi - fi - done - - for file in "$dispatcher_dir"/*himmelblau* "$dispatcher_dir"/*himmelblaud*; do - [ -f "$file" ] || continue - case "$file" in - *.himmelblau-disabled|*.himmelblau-disabled.*) - continue - ;; - esac - if grep -Eq 'systemctl[[:space:]]+restart.*himmelblaud(\.service)?' "$file"; then - echo "Warning: found unmanaged Himmelblau NetworkManager dispatcher script: $file" >&2 - fi - done -} - -disable_old_nm_dispatcher_workarounds - if command -v deb-systemd-helper >/dev/null 2>&1; then if [ "$1" != "configure" ]; then exit 0 ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/himmelblau/vendor.tar.zst /work/SRC/openSUSE:Factory/.himmelblau.new.1991/vendor.tar.zst differ: char 7, line 1
