2 Commits

Author SHA1 Message Date
effcf44f4c 19:07 2025-11-05 19:07:17 +02:00
fa3ed7f772 18:19 2025-11-05 18:19:38 +02:00

View File

@@ -642,56 +642,120 @@
ansible.builtin.debug: ansible.builtin.debug:
msg: "DEV2 firmux={{ (dev2_firmux.stdout | default('')) | trim }}" msg: "DEV2 firmux={{ (dev2_firmux.stdout | default('')) | trim }}"
# ====== INSERTED: two-step normalization preview (rev→r, then space→dash) ======
- name: Normalize DEV2 firmux (step 1): replace 'rev ' → 'r'
# ===== NEW: derive expected & current firmware cores and block if equal (unless force-upgrade) =====
- name: Derive expected target_version core (early, from image filename)
delegate_to: localhost
ansible.builtin.set_fact:
expected_fw_core_early: "{{ (image_filename | regex_search('[0-9]+\\.[0-9]+\\.[0-9]+-r[0-9]+')) | default('', true) }}"
- name: Parse current firmware core from DEV2 firmux (early, '-rNNNN' form)
when: dev2_firmux is defined when: dev2_firmux is defined
delegate_to: localhost delegate_to: localhost
ansible.builtin.set_fact: ansible.builtin.set_fact:
current_fw_core_dash: "{{ (dev2_firmux.stdout | default('') | regex_search('[0-9]+\\.[0-9]+\\.[0-9]+-r[0-9]+')) | default('', true) }}" dev2_fw_norm_step1: "{{ (dev2_firmux.stdout | default('')) | trim | regex_replace('\\brev\\s+','r') }}"
- name: Parse current firmware core from DEV2 firmux (alt 'X.Y.Z rev NNNN' → 'X.Y.Z-rNNNN') - name: Debug normalization step 1 output
when: dev2_firmux is defined and (current_fw_core_dash | length) == 0 when: dev2_fw_norm_step1 is defined
delegate_to: localhost
ansible.builtin.debug:
msg: "step1={{ dev2_fw_norm_step1 }}"
- name: Normalize DEV2 firmux (step 2): replace space → '-'
when: dev2_fw_norm_step1 is defined
delegate_to: localhost delegate_to: localhost
ansible.builtin.set_fact: ansible.builtin.set_fact:
current_fw_core_rev_parts: "{{ (dev2_firmux.stdout | default('') | regex_search('([0-9]+\\.[0-9]+\\.[0-9]+)\\s+rev\\s+([0-9]+)')) | default('', true) }}" dev2_fw_norm_step2: "{{ dev2_fw_norm_step1 | replace(' ', '-') }}"
- name: Normalize current firmware core (prefer '-r' form; else build from 'rev') - name: Debug normalization step 2 output
when: dev2_fw_norm_step2 is defined
delegate_to: localhost
ansible.builtin.debug:
msg: "step2={{ dev2_fw_norm_step2 }}"
# ====== END INSERTED ======
# ===================== Early equality/substring check (same logic as checker) =====================
# 1) expected_norm from image_filename (prefer extracted X.Y.Z-rNNNN)
- name: Normalize expected target step one compute base string (from image_filename)
delegate_to: localhost delegate_to: localhost
ansible.builtin.set_fact: ansible.builtin.set_fact:
current_fw_core: >- expected_norm_step1: "{{ (image_filename | default('') | trim) }}"
{% if (current_fw_core_dash | default('') | length) > 0 -%} changed_when: false
{{ current_fw_core_dash }}
{%- elif (current_fw_core_rev_parts | default('') | length) > 0 -%}
{{ (dev2_firmux.stdout | regex_replace('.*([0-9]+\\.[0-9]+\\.[0-9]+)\\s+rev\\s+([0-9]+).*','\\1-r\\2')) }}
{%- else -%}
{{ '' }}
{%- endif %}
- name: Debug version comparison (current vs expected; force-override) - name: Extract version core X dot Y dot Z dash rNNNN from image_filename if present
delegate_to: localhost
ansible.builtin.set_fact:
expected_norm_core_list: "{{ (image_filename | default('') | regex_findall('[0-9]+\\.[0-9]+\\.[0-9]+-r[0-9]+')) | default([]) }}"
changed_when: false
- name: Choose first extracted core if available
delegate_to: localhost
ansible.builtin.set_fact:
expected_norm_core: "{{ (expected_norm_core_list | default([]) | length > 0) | ternary((expected_norm_core_list | first), '') }}"
changed_when: false
- name: Normalize expected target step two prefer extracted core when available
delegate_to: localhost
ansible.builtin.set_fact:
expected_norm: "{{ (expected_norm_core | default('') | length > 0) | ternary(expected_norm_core, expected_norm_step1) }}"
changed_when: false
# 2) banner_raw + banner_norm (convert "rev NNNN" → "-rNNNN" only if needed)
- name: Capture firmware banner line from DEV2 (raw)
delegate_to: localhost
ansible.builtin.set_fact:
banner_raw: "{{ (dev2_firmux.stdout | default('') | trim) }}"
changed_when: false
- name: Normalize banner line to X dot Y dot Z dash rNNNN suffix
delegate_to: localhost
ansible.builtin.set_fact:
banner_norm: >-
{{
((banner_raw | lower) is search('-r[0-9]+$'))
| ternary(
banner_raw,
(banner_raw | regex_replace('\s*[Rr][Ee][Vv]\.?\s*([0-9]+)\s*$', '-r\1'))
)
}}
changed_when: false
- name: Evaluate version match using normalized equality or substring
delegate_to: localhost
ansible.builtin.set_fact:
version_match: >-
{{
(expected_norm | default('') | length > 0)
and (
(banner_norm | default('')) == (expected_norm | default(''))
or ((banner_norm | default('') | lower) is search((expected_norm | default('') | lower)))
or ((expected_norm | default('') | lower) is search((banner_norm | default('') | lower)))
)
}}
changed_when: false
- name: Debug version compare snapshot (pre-write)
delegate_to: localhost delegate_to: localhost
ansible.builtin.debug: ansible.builtin.debug:
msg: msg:
- "expected_fw_core_early={{ expected_fw_core_early | default('') }}" - "expected_norm={{ expected_norm | default('') }}"
- "current_fw_core={{ current_fw_core | default('') }}" - "banner_raw={{ banner_raw | default('') }}"
- "banner_norm={{ banner_norm | default('') }}"
- "force_upgrade={{ force_upgrade | default(false) }}" - "force_upgrade={{ force_upgrade | default(false) }}"
- "version_match={{ version_match | default(false) }}"
- name: Soft-block if current firmware already matches target and not forced # 4) soft-block when equal (unless forced) + back-fill legacy debug names
- name: Soft-block if already on target (skip staging/write unless force-upgrade)
when: when:
- not (force_upgrade | default(false)) - not (force_upgrade | default(false))
- (expected_fw_core_early | length) > 0 - version_match | default(false)
- (current_fw_core | length) > 0
- current_fw_core == expected_fw_core_early
ansible.builtin.set_fact: ansible.builtin.set_fact:
_blocked: true _blocked: true
_journal: "{{ (_journal | default([])) + [ 'Device already running target image: ' ~ current_fw_core ~ ' — skipping write/flip (use force-upgrade=yes to override)' ] }}" _journal: "{{ (_journal | default([])) + [ 'Device already running target image: ' ~ (banner_norm | default('')) ~ ' — skipping write/flip (use force-upgrade=yes to override)' ] }}"
expected_fw_core_early: "{{ expected_norm | default('') }}"
current_fw_core: "{{ banner_norm | default('') }}"
changed_when: false
- name: Back-fill compare names for summary (no-op if already set)
when: not (_blocked | default(false))
ansible.builtin.set_fact:
expected_fw_core_early: "{{ expected_fw_core_early | default(expected_norm | default('')) }}"
current_fw_core: "{{ current_fw_core | default(banner_norm | default('')) }}"
changed_when: false
# ---------------------------- Normalize rebootin early (HOURS) ---------------------------- # ---------------------------- Normalize rebootin early (HOURS) ----------------------------
# Strict: rebootin is integer HOURS only. Always add +20s grace to the schedule. # Strict: rebootin is integer HOURS only. Always add +20s grace to the schedule.