From b340c713dfd9ce324abc2c61bac95aa6e983fce0 Mon Sep 17 00:00:00 2001 From: pavel Date: Sat, 25 Oct 2025 04:06:16 +0300 Subject: [PATCH] 0406 --- files/ansible-playbooks/sot-updater.yml | 58 ++++++++----------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/files/ansible-playbooks/sot-updater.yml b/files/ansible-playbooks/sot-updater.yml index b970e14..02ffe72 100644 --- a/files/ansible-playbooks/sot-updater.yml +++ b/files/ansible-playbooks/sot-updater.yml @@ -24,7 +24,7 @@ # DEV1 side addressing to reach DEV2 dev2_side_ip: "192.168.1.11/24" # IP we add/remove on DEV1 dev1_iface: "br-wan" # DEV1 interface where IP is added - arping_iface: "eth0" # iface used for ARP refreshes (as per update-indoor) + arping_iface: "eth0" # iface used for ARP refreshes dev2_side_ip_addr: "{{ dev2_side_ip.split('/')[0] }}" # Controller SSH common opts @@ -130,8 +130,7 @@ register: pick_port changed_when: false - # --- replace the single failing "Record chosen local port & ControlMaster path" task with these --- - + # ***** FIXED: split mktemp + sock path ***** - name: Record chosen local port delegate_to: localhost set_fact: @@ -179,28 +178,6 @@ set_fact: _ctrl_sock: "{{ _ctrl_dir }}/ssh_tunnel_ctl" - - name: Journal if no free local port was found (continue anyway) - when: _local_port | length == 0 - delegate_to: localhost - 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: "{{ { - 'inscope_device': (ansible_hostname | default(inventory_hostname)), - 'task_name': 'journal_entry', - 'task_result': 'tunnel_port_pick_failed' - } | to_json }}" - payload_encoding: "string" - # ---------------------------- AIRPING #2 (before tunnel) ---------------------------- - name: Refresh ARP #2 on DEV1 LAN (pre-tunnel) when: _local_port | length > 0 @@ -283,7 +260,7 @@ failed_when: false ignore_errors: true - # (1) Show what we got from banner so we can see what we’re parsing + # ***** FIXED: stepwise, flag-safe normalization for DEV1 ***** - name: Dev1 | Debug raw banner when: dev1_banner is defined delegate_to: localhost @@ -291,19 +268,16 @@ msg: - "DEV1 banner raw: {{ (dev1_banner.stdout | default('') | trim) | regex_replace('\n',' ') }}" - # (2) Strip timestamp/anything after a pipe - name: Dev1 | Strip trailing ' | ...' delegate_to: localhost set_fact: dev1_no_ts: "{{ (dev1_banner.stdout | default('') | trim) | regex_replace('\\|.*$', '') }}" - # (3) Convert 'rev YYYY' to '-rYYYY' (case-insensitive, using explicit flag) - name: Dev1 | Convert 'rev YYYY' → '-rYYYY' delegate_to: localhost set_fact: dev1_rev_dash: "{{ dev1_no_ts | regex_replace('rev\\.?\\s*([0-9]+)\\s*$', '-r\\1', ignorecase=True) }}" - # (4) Extract the canonical core X.X.X-rYYYY (or empty if not found) - name: Dev1 | Extract X.X.X-rYYYY core delegate_to: localhost set_fact: @@ -462,7 +436,6 @@ failed_when: false ignore_errors: true - # Show what we got from DEV2 so parsing is debuggable - name: Dev2 | Debug raw firmux when: dev2_firmux is defined delegate_to: localhost @@ -470,31 +443,36 @@ msg: - "DEV2 firmux raw: {{ (dev2_firmux.stdout | default('') | trim) | regex_replace('\n',' | ') }}" - # Build the list of firmux lines (CRLF-safe) - name: Dev2 | Build firmux lines list delegate_to: localhost set_fact: _firmux_lines: "{{ (dev2_firmux.stdout | default('') | regex_replace('\r','')) | split('\n') | map('trim') | list }}" - # Choose the line (prefer one with 'rev NNNN'); fall back to first non-empty - name: Dev2 | Choose firmux line (prefer containing 'rev NNNN') delegate_to: localhost set_fact: dev2_line: >- {{ (_firmux_lines | select('match','(?i).*\\brev\\s*\\d+.*') | list | first) - | default((_firmux_lines | select('truthy') | list | first) | default('')) + | default((_firmux_lines | select('truthy') | list | first) | default('')) }} - - - name: Dev2 | Normalize to EXACT 'X.X.X rev YYYY' (lowercase 'rev', single space) - when: tunnel_ok | default(false) + # ***** FIXED: ensure dev2_line_clean is defined before use, stepwise extraction ***** + - name: Dev2 | Strip trailing pipes and whitespace + delegate_to: localhost + set_fact: + dev2_line_clean: "{{ (dev2_line | default('') | trim) | regex_replace('\\|.*$', '') }}" + + - name: Dev2 | Extract version (X.X.X) and rev number + delegate_to: localhost + set_fact: + dev2_ver: "{{ dev2_line_clean | regex_search('[0-9]+\\.[0-9]+\\.[0-9]+') | default('', true) }}" + dev2_rev_token: "{{ dev2_line_clean | regex_search('(?i)\\brev\\.?\\s*[0-9]+') | default('', true) }}" + dev2_rev_num: "{{ (dev2_rev_token | regex_replace('(?i).*\\brev\\.?\\s*', '')) if (dev2_rev_token | length) > 0 else '' }}" + + - name: Dev2 | Build EXACT 'X.X.X rev YYYY' (lowercase 'rev', single space) delegate_to: localhost set_fact: - dev2_line_clean: "{{ (dev2_line | default('') | trim) | regex_replace('\\s*\\|.*$', '') }}" - dev2_ver: "{{ dev2_line_clean | regex_search('[0-9]+\\.[0-9]+\\.[0-9]+') | default('') }}" - dev2_rev_token: "{{ dev2_line_clean | regex_search('(?i)\\brev\\.?\\s*[0-9]+') | default('') }}" - dev2_rev_num: "{{ dev2_rev_token | regex_replace('(?i).*\\brev\\.?\\s*', '') }}" indoor_fw_norm: "{{ (dev2_ver ~ ' rev ' ~ dev2_rev_num) if (dev2_ver|length>0 and dev2_rev_num|length>0) else '' }}" - name: Journal if DEV2 normalization failed (no version or rev)