diff --git a/test.yml b/test.yml index 85f0166..231bc2e 100644 --- a/test.yml +++ b/test.yml @@ -1,267 +1,33 @@ --- -- name: "Synology DSM - Découverte outils MAJ + tentative download/install (SSH)" +- name: Synology DSM upgrade FULL AUTO via SSH uniquement hosts: synology gather_facts: false vars: - do_install: false # true => tente de lancer l'installation après download - do_reboot: false # true => reboot après install - command_timeout: 120 + syno_port: 5001 + + # Attentes reboot + reboot_down_timeout: 300 # 5 min + reboot_up_timeout: 1800 # 30 min tasks: - - name: "Lire version DSM (best effort)" - ansible.builtin.shell: | - if test -f /etc.defaults/VERSION; then - cat /etc.defaults/VERSION - elif test -f /etc/VERSION; then - cat /etc/VERSION - else - echo "VERSION_FILE_NOT_FOUND" - fi - args: - executable: /bin/bash - register: dsm_version - changed_when: false + - name: Lancer upgrade DSM via SSH (synoupgrade --start-force) + ansible.builtin.shell: /usr/syno/sbin/synoupgrade --start-force + become: true - - name: "Afficher version DSM" - ansible.builtin.debug: - var: dsm_version.stdout_lines + - name: Attendre que DSM tombe (reboot en cours) + ansible.builtin.wait_for: + host: "{{ inventory_hostname }}" + port: "{{ syno_port }}" + state: stopped + timeout: "{{ reboot_down_timeout }}" + delegate_to: localhost - # ------------------------------------------------------------ - # 1) Découvrir l'outil de MAJ existant - # ------------------------------------------------------------ - - name: "Chercher des binaires connus (synoupgrade/synoautoupdate/...)" - ansible.builtin.shell: | - set +e - - candidates=" - synoupgrade - synoautoupdate - synoautoupdate2 - synoupgrade2 - " - - echo "== command -v ==" - for c in $candidates; do - p="$(command -v "$c" 2>/dev/null)" - if [ -n "$p" ]; then - echo "$c=$p" - fi - done - - echo "== common paths ==" - for p in \ - /usr/syno/sbin/synoupgrade \ - /usr/syno/sbin/synoautoupdate \ - /usr/syno/bin/synoautoupdate \ - /usr/sbin/synoautoupdate \ - /usr/syno/sbin/synoupgrade2 \ - /usr/syno/sbin/synoautoupdate2 - do - if [ -x "$p" ]; then - echo "FOUND=$p" - fi - done - - echo "== find (limited) ==" - for root in /usr/syno /usr/sbin /usr/bin /bin /sbin; do - if [ -d "$root" ]; then - find "$root" -maxdepth 3 -type f \( -name "syno*update*" -o -name "syno*upgrade*" \) 2>/dev/null | head -n 50 - fi - done - - exit 0 - args: - executable: /bin/bash - register: discover - changed_when: false - - - name: "Afficher découverte" - ansible.builtin.debug: - var: discover.stdout_lines - - - name: "Choisir un binaire (priorité: synoupgrade puis synoautoupdate)" - ansible.builtin.shell: | - set +e - - pick="" - if command -v synoupgrade >/dev/null 2>&1; then - pick="$(command -v synoupgrade)" - elif [ -x /usr/syno/sbin/synoupgrade ]; then - pick="/usr/syno/sbin/synoupgrade" - elif command -v synoautoupdate >/dev/null 2>&1; then - pick="$(command -v synoautoupdate)" - elif [ -x /usr/syno/sbin/synoautoupdate ]; then - pick="/usr/syno/sbin/synoautoupdate" - fi - - if [ -z "$pick" ]; then - echo "MISSING" - else - echo "$pick" - fi - exit 0 - args: - executable: /bin/bash - register: picked - changed_when: false - - - name: "Enregistrer outil de MAJ" - ansible.builtin.set_fact: - upgrade_tool: "{{ picked.stdout | trim }}" - - - name: "Stop si aucun outil trouvé (message clair)" - ansible.builtin.fail: - msg: >- - Aucun outil de mise à jour trouvé via SSH (synoupgrade/synoautoupdate). - Regarde la tâche "Chercher des binaires connus" pour voir ce qui existe. - Si rien n'apparait, on devra rester sur l'API DSM ou faire via interface DSM. - when: upgrade_tool in ["", "MISSING"] - - - name: "Debug outil choisi" - ansible.builtin.debug: - msg: "Outil retenu: {{ upgrade_tool }}" - - # ------------------------------------------------------------ - # 2) Afficher l'aide (pour savoir quelles options existent) - # ------------------------------------------------------------ - - name: "Afficher --help de l'outil" - ansible.builtin.shell: | - set +e - "{{ upgrade_tool }}" --help 2>&1 | head -n 120 - exit 0 - args: - executable: /bin/bash - register: tool_help - changed_when: false - - - name: "Debug help" - ansible.builtin.debug: - var: tool_help.stdout_lines - - # ------------------------------------------------------------ - # 3) Tenter un check/download/start en best effort - # ------------------------------------------------------------ - - name: "Check MAJ (best effort)" - ansible.builtin.shell: | - set +e - T="{{ upgrade_tool }}" - - echo "---- TRY: check ----" - "$T" check 2>&1 - rc1=$? - - echo "---- TRY: --check ----" - "$T" --check 2>&1 - rc2=$? - - echo "---- TRY: status ----" - "$T" status 2>&1 - rc3=$? - - echo "---- TRY: --status ----" - "$T" --status 2>&1 - rc4=$? - - echo "RCs: check=$rc1 --check=$rc2 status=$rc3 --status=$rc4" - exit 0 - args: - executable: /bin/bash - register: check_out - changed_when: false - - - name: "Afficher check" - ansible.builtin.debug: - var: check_out.stdout_lines - - - name: "Heuristique update dispo" - ansible.builtin.set_fact: - update_available: >- - {{ - ( - (check_out.stdout | lower).find('available') != -1 - or (check_out.stdout | lower).find('update') != -1 - or (check_out.stdout | lower).find('upgrade') != -1 - or (check_out.stdout | lower).find('download') != -1 - or (check_out.stdout | lower).find('télécharg') != -1 - or (check_out.stdout | lower).find('dispon') != -1 - ) - }} - - - name: "Info update dispo" - ansible.builtin.debug: - msg: "MAJ dispo (heuristique) = {{ update_available }}" - - - name: "Télécharger la MAJ (best effort)" - ansible.builtin.shell: | - set +e - T="{{ upgrade_tool }}" - - echo "---- TRY: download ----" - "$T" download 2>&1 - rc1=$? - - echo "---- TRY: --download ----" - "$T" --download 2>&1 - rc2=$? - - echo "---- TRY: download --start ----" - "$T" download --start 2>&1 - rc3=$? - - echo "RCs: download=$rc1 --download=$rc2 download--start=$rc3" - exit 0 - args: - executable: /bin/bash - register: dl_out - changed_when: true - when: update_available | bool - - - name: "Afficher download" - ansible.builtin.debug: - var: dl_out.stdout_lines - when: update_available | bool - - - name: "Installer (optionnel, best effort)" - ansible.builtin.shell: | - set +e - T="{{ upgrade_tool }}" - - echo "---- TRY: start ----" - "$T" start 2>&1 - rc1=$? - - echo "---- TRY: --start ----" - "$T" --start 2>&1 - rc2=$? - - echo "---- TRY: upgrade ----" - "$T" upgrade 2>&1 - rc3=$? - - echo "RCs: start=$rc1 --start=$rc2 upgrade=$rc3" - exit 0 - args: - executable: /bin/bash - register: install_out - changed_when: true - when: - - update_available | bool - - do_install | bool - - - name: "Afficher install" - ansible.builtin.debug: - var: install_out.stdout_lines - when: - - update_available | bool - - do_install | bool - - - name: "Reboot NAS (optionnel)" - ansible.builtin.shell: | - sudo reboot || reboot - args: - executable: /bin/bash - when: - - update_available | bool - - do_install | bool - - do_reboot | bool + - name: Attendre le retour de DSM (port 5001) + ansible.builtin.wait_for: + host: "{{ inventory_hostname }}" + port: "{{ syno_port }}" + state: started + delay: 10 + timeout: "{{ reboot_up_timeout }}" + delegate_to: localhost