diff --git a/files/ansible-playbooks/update-outdoorbackup224.yml b/files/ansible-playbooks/update-outdoorbackup224.yml index 94554e0..b62ed7f 100644 --- a/files/ansible-playbooks/update-outdoorbackup224.yml +++ b/files/ansible-playbooks/update-outdoorbackup224.yml @@ -55,7 +55,7 @@ - name: Stop if connected hostname differs from inventory ansible.builtin.fail: - msg: "Backup-bank prep aborting: connected host reported hostname '{{ host_env.stdout | trim }}' which differs from inventory '{{ inventory_hostname }}'." + msg: "Aborting: connected host reported hostname '{{ host_env.stdout | trim }}' which differs from inventory '{{ inventory_hostname }}'." when: (host_env.stdout | trim) != inventory_hostname rescue: @@ -72,7 +72,7 @@ - name: Build failure summary text (hostname preflight) ansible.builtin.set_fact: fail_summary: >- - Outdoor backup preparation aborted at '{{ fail_task_name }}': {{ fail_detail_raw }} + Firmware update aborted at '{{ fail_task_name }}': {{ fail_detail_raw }} - name: Truncate failure summary to ~400 chars (hostname preflight) ansible.builtin.set_fact: @@ -203,7 +203,7 @@ body_format: json body: properties: - content_type: "application/json" + content_type: "application/json" routing_key: "{{ control_queue }}" payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), @@ -247,7 +247,7 @@ body_format: json body: properties: - content_type: "application/json" + content_type: "application/json" routing_key: "{{ control_queue }}" payload: "{{ tag_inprogress_payload | to_json }}" payload_encoding: "string" @@ -287,7 +287,7 @@ body_format: json body: properties: - content_type: "application/json" + content_type: "application/json" routing_key: "{{ control_queue }}" payload: >- {{ @@ -295,9 +295,9 @@ "inscope_device": (ansible_hostname | default(inventory_hostname)), "task_name": "journal_add", "task_result": ( - "Backup preparation already present for " ~ fw_banner_repr ~ + "Preparation already present for " ~ fw_banner_repr ~ "; marker " ~ fw_marker ~ - ". Skipping backup preparation steps." + ". Skipping update steps." ) } | to_json }} @@ -365,7 +365,7 @@ body_format: json body: properties: - content_type: "application/json" + content_type: "application/json" routing_key: "{{ control_queue }}" payload: "{{ ssid_journal_payload | to_json }}" payload_encoding: "string" @@ -398,79 +398,24 @@ - name: Stop if bootloader environment looks invalid (<7 lines) ansible.builtin.fail: - msg: "Backup-bank prep aborting: fw_printenv returned only {{ env_line_count.stdout | trim }} lines (<7) — environment missing or corrupted." + msg: "Aborting: fw_printenv returned only {{ env_line_count.stdout | trim }} lines (<7) — environment missing or corrupted." when: (env_line_count.stdout | trim | int) < 7 - - name: Read /var/run/bootbanks.json (active and backup firmux versions) - ansible.builtin.raw: "{{ pathprefix }} cat /var/run/bootbanks.json" - register: bootbanks_raw + - name: Read first line of /etc/banner (current running version) + ansible.builtin.raw: "{{ pathprefix }} cat /etc/banner | grep -i rev | head -n1" + register: banner changed_when: false - - - name: Parse bootbanks.json - ansible.builtin.set_fact: - bootbanks_obj: "{{ bootbanks_raw.stdout | from_json }}" - bootbanks_active_firmux: "{{ (bootbanks_raw.stdout | from_json).active.firmux | default('') }}" - bootbanks_backup_firmux: "{{ (bootbanks_raw.stdout | from_json).backup.firmux | default('') }}" - failed_when: bootbanks_raw.stdout is not search('"backup"') or bootbanks_raw.stdout is not search('"active"') - - - name: current versions (active primary and backup) + + - name: current version ansible.builtin.debug: msg: - - "active (primary) firmux: {{ bootbanks_active_firmux }}" - - "backup firmux: {{ bootbanks_backup_firmux }}" - - - name: Stop if target version already present on backup (backup already at {{ fw_banner_repr }}) - ansible.builtin.debug: - msg: "Backup-bank prep skip: backup already at {{ fw_banner_repr }} (backup firmux: {{ bootbanks_backup_firmux }}; active firmux: {{ bootbanks_active_firmux }}). This playbook prepares backup bootbank only (no flip, no reboot)." - when: bootbanks_backup_firmux is search(fw_banner_repr) - - - name: Build control queue payload for skip journal (journal_add) - ansible.builtin.set_fact: - journal_skip_payload: - inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}" - task_name: "journal_add" - task_result: >- - Backup-bank prep skipped: backup already at {{ fw_banner_repr }} - (backup {{ bootbanks_backup_firmux }}; active {{ bootbanks_active_firmux }}). - No flip; no reboot. - when: nbq2_payload_obj is defined and (bootbanks_backup_firmux is search(fw_banner_repr)) - - - name: Bandaid | Pause before Publish skip journal to control queue via RabbitMQ HTTP API - ansible.builtin.pause: - seconds: 1 - delegate_to: localhost - changed_when: false - when: journal_skip_payload is defined - - - name: Publish skip journal to control queue via RabbitMQ HTTP API - ansible.builtin.uri: - url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" - method: POST - user: "{{ rmq_user }}" - password: "{{ rmq_pass }}" - force_basic_auth: true - status_code: 200 - headers: - content-type: "application/json" - body_format: json - body: - properties: - content_type: "application/json" - routing_key: "{{ control_queue }}" - payload: "{{ journal_skip_payload | to_json }}" - payload_encoding: "string" - delegate_to: localhost - register: rmq_journal_skip_resp - when: journal_skip_payload is defined - - - name: Log control queue skip journal publish result - ansible.builtin.debug: - var: rmq_journal_skip_resp.json - when: journal_skip_payload is defined and rmq_journal_skip_resp is defined - - - name: End play for this host (backup already prepared; backup prep not needed) - ansible.builtin.meta: end_host - when: bootbanks_backup_firmux is search(fw_banner_repr) + - "current banner: {{ banner.stdout | trim }}" + + - name: Stop if target version matches current (/etc/banner already at {{ fw_banner_repr }}) + ansible.builtin.fail: + msg: "Aborting: device already runs {{ fw_banner_repr }} (banner: {{ banner.stdout | trim }})" + when: banner.stdout is search(fw_banner_repr) + - name: Upload firmware to /tmp via scp (controller-side) ansible.builtin.shell: | set -e @@ -576,7 +521,7 @@ - name: Summary ansible.builtin.debug: msg: - - "Active (primary) firmux before: {{ bootbanks_active_firmux | default('unknown') }}" + - "Active (primary) firmux before: {{ bootbanks_active_firmux }}" - "Target version: {{ fw_banner_repr }}" - "SHA256: OK ({{ sha_out.stdout | trim }})" - "update -c: {{ up_check.stdout | trim }}" @@ -717,8 +662,8 @@ inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}" task_name: "journal_add" task_result: >- - Backup bank prepared for { fw_banner_repr }. - Active unchanged; marker { fw_marker }. + Backup bank prepared for {{ fw_banner_repr }}. + Active unchanged; marker {{ fw_marker }}. when: nbq2_payload_obj is defined - name: Bandaid | Pause before Publish success journal to control queue via RabbitMQ HTTP API @@ -791,7 +736,7 @@ - name: Build failure summary text ansible.builtin.set_fact: fail_summary: >- - Outdoor backup preparation aborted at '{{ fail_task_name }}': {{ fail_detail_raw }} + Firmware update aborted at '{{ fail_task_name }}': {{ fail_detail_raw }} - name: Truncate failure summary to ~400 chars ansible.builtin.set_fact: @@ -900,4 +845,4 @@ - name: Scheduler | Debug action_state failed published (update failure) ansible.builtin.debug: msg: "scheduler-run detected; published action_state=failed (update failure)" - when: is_run_by_effective == 'scheduler' + when: is_run_by_effective == 'scheduler' \ No newline at end of file