From 65642d811451088d83668fec6d07f6cf0ab1109b Mon Sep 17 00:00:00 2001 From: fencl Date: Sun, 5 Oct 2025 16:35:35 +0200 Subject: [PATCH] . --- nextcloud/update_collabora.yml | 23 ++-- nextcloud/update_collabora_old.yml | 165 +++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+), 8 deletions(-) create mode 100644 nextcloud/update_collabora_old.yml diff --git a/nextcloud/update_collabora.yml b/nextcloud/update_collabora.yml index 5fa9eac..5920667 100644 --- a/nextcloud/update_collabora.yml +++ b/nextcloud/update_collabora.yml @@ -43,12 +43,11 @@ state: present update_cache: yes - - name: Run Collabora update commands on VM (via SSH) + - name: Run Collabora update commands on VM (via SSH) # use SSHPASS env, hide item value ansible.builtin.command: argv: - sshpass - - -p - - "{{ vm_pass }}" + - -e # read password from SSHPASS environment - ssh - -o - StrictHostKeyChecking=no @@ -58,10 +57,14 @@ - bash - -lc - "{{ ('sudo ' if use_sudo else '') + item }}" + environment: + SSHPASS: "{{ vm_pass }}" # supply password via environment loop: "{{ collabora_commands }}" + loop_control: + label: "cmd-{{ loop.index }}" # prevents dumping full item in (item=...) log line register: collab_cmds changed_when: false - no_log: "{{ DEBUG == 0 }}" + no_log: "{{ DEBUG == 0 }}" # hide outputs and env when not debugging - name: Show outputs for each Collabora command ansible.builtin.debug: @@ -75,12 +78,14 @@ loop: "{{ collab_cmds.results }}" when: DEBUG == 1 - - name: Fail play if any Collabora command failed + - name: Fail play if any Collabora command failed # also hide item label ansible.builtin.assert: that: "item.rc == 0" fail_msg: "Collabora update failed on VM: {{ item.item }} (rc={{ item.rc }})" success_msg: "All Collabora update commands succeeded." loop: "{{ collab_cmds.results }}" + loop_control: + label: "cmd-{{ loop.index }}" # ------------------------- # Readiness checks (controller first, then VM fallback) @@ -102,12 +107,11 @@ failed_when: false changed_when: false - - name: Collabora | VM-side fetch (pure JSON via Python) + - name: Collabora | VM-side fetch (pure JSON via Python) # use SSHPASS env here too ansible.builtin.command: argv: - sshpass - - -p - - "{{ vm_pass }}" + - -e - ssh - -o - StrictHostKeyChecking=no @@ -125,11 +129,14 @@ except Exception: pass PY + environment: + SSHPASS: "{{ vm_pass }}" register: caps_vm changed_when: false failed_when: false when: caps_controller.status | default(0) != 200 or caps_controller.json is not defined no_log: "{{ DEBUG == 0 }}" + - name: Collabora | Choose JSON (controller wins, else VM) ansible.builtin.set_fact: collab_caps_json: >- diff --git a/nextcloud/update_collabora_old.yml b/nextcloud/update_collabora_old.yml new file mode 100644 index 0000000..5fa9eac --- /dev/null +++ b/nextcloud/update_collabora_old.yml @@ -0,0 +1,165 @@ +# nextcloud/update_collabora.yml + +- name: Update Collabora CODE on VM via Proxmox + hosts: proxmox + gather_facts: false + become: true + become_user: root + become_method: sudo + + vars: + # --- Connection to VM (provided by Semaphore env vars) --- + vm_ip: "{{ lookup('env', 'VM_IP') }}" + vm_user: "{{ lookup('env', 'VM_USER') }}" + vm_pass: "{{ lookup('env', 'VM_PASS') }}" + use_sudo: false + + # --- Debug mode (controlled via Semaphore variable) --- + DEBUG: "{{ lookup('env', 'DEBUG') | default(0) | int }}" + RETRIES: "{{ lookup('env', 'RETRIES') | default(25) | int }}" + + # --- Collabora specifics --- + collabora_debug_caps: true + collabora_caps_url: "https://collabora.martinfencl.eu/hosting/capabilities" + + # Use the FULL Nextcloud stack compose file; only target the 'collabora' service inside it + collabora_project: "nextcloud-collabora" + collabora_compose_file: "/data/compose/nextcloud-collabora.yml" + collabora_service: "collabora" + + # Docker command prefix (consistent behavior and quiet hints) + docker_prefix: "unalias docker 2>/dev/null || true; DOCKER_CLI_HINTS=0; command docker" + + # Commands to run on the target VM (quiet outputs) + collabora_commands: + - "{{ docker_prefix }} pull -q collabora/code:latest >/dev/null" + - "{{ docker_prefix }} compose -p {{ collabora_project }} -f {{ collabora_compose_file }} pull {{ collabora_service }} >/dev/null" + - "{{ docker_prefix }} compose -p {{ collabora_project }} -f {{ collabora_compose_file }} up -d --no-deps --force-recreate {{ collabora_service }} >/dev/null" + + tasks: + - name: Ensure sshpass is installed (for password-based SSH) # English comments + ansible.builtin.apt: + name: sshpass + state: present + update_cache: yes + + - name: Run Collabora update commands on VM (via SSH) + ansible.builtin.command: + argv: + - sshpass + - -p + - "{{ vm_pass }}" + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - "{{ ('sudo ' if use_sudo else '') + item }}" + loop: "{{ collabora_commands }}" + register: collab_cmds + changed_when: false + no_log: "{{ DEBUG == 0 }}" + + - name: Show outputs for each Collabora command + ansible.builtin.debug: + msg: | + CMD: {{ item.item }} + RC: {{ item.rc }} + STDOUT: + {{ (item.stdout | default('')).strip() }} + STDERR: + {{ (item.stderr | default('')).strip() }} + loop: "{{ collab_cmds.results }}" + when: DEBUG == 1 + + - name: Fail play if any Collabora command failed + ansible.builtin.assert: + that: "item.rc == 0" + fail_msg: "Collabora update failed on VM: {{ item.item }} (rc={{ item.rc }})" + success_msg: "All Collabora update commands succeeded." + loop: "{{ collab_cmds.results }}" + + # ------------------------- + # Readiness checks (controller first, then VM fallback) + # ------------------------- + + - name: Collabora | Wait for capabilities (controller first) + ansible.builtin.uri: + url: "{{ collabora_caps_url }}" + method: GET + return_content: true + validate_certs: true + status_code: 200 + register: caps_controller + delegate_to: localhost + run_once: true + retries: "{{ RETRIES }}" + delay: 2 + until: caps_controller.status == 200 + failed_when: false + changed_when: false + + - name: Collabora | VM-side fetch (pure JSON via Python) + ansible.builtin.command: + argv: + - sshpass + - -p + - "{{ vm_pass }}" + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - | + python3 - <<'PY' + import json, urllib.request, sys + try: + with urllib.request.urlopen("{{ collabora_caps_url }}", timeout=15) as r: + sys.stdout.write(r.read().decode()) + except Exception: + pass + PY + register: caps_vm + changed_when: false + failed_when: false + when: caps_controller.status | default(0) != 200 or caps_controller.json is not defined + no_log: "{{ DEBUG == 0 }}" + - name: Collabora | Choose JSON (controller wins, else VM) + ansible.builtin.set_fact: + collab_caps_json: >- + {{ + (caps_controller.json + if (caps_controller.status|default(0))==200 and (caps_controller.json is defined) + else ( + (caps_vm.stdout | default('') | trim | length > 0) + | ternary((caps_vm.stdout | trim | from_json), omit) + ) + ) + }} + failed_when: false + + - name: Collabora | Print concise summary + ansible.builtin.debug: + msg: >- + Collabora {{ collab_caps_json.productVersion | default('?') }} + ({{ collab_caps_json.productName | default('?') }}), + convert-to.available={{ collab_caps_json['convert-to']['available'] | default('n/a') }}, + serverId={{ collab_caps_json.serverId | default('n/a') }} + when: collab_caps_json is defined and DEBUG == 1 + + - name: Collabora | Capabilities unavailable (after retries) + ansible.builtin.debug: + msg: "Capabilities endpoint nenĂ­ dostupnĂ˝ ani po pokusech." + when: collab_caps_json is not defined and DEBUG == 1 + + # Optional full JSON (debug) + - name: Collabora | Full JSON (debug) + ansible.builtin.debug: + var: collab_caps_json + when: collabora_debug_caps and (collab_caps_json is defined) and DEBUG == 1