#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/init-vps
- name: Acquiring home of current user
  when: ansible_facts["system"] == "Linux"
  ansible.builtin.shell:
    cmd: "echo ~{{ ansible_user }}"
  register: ansible_user_home
- name: Acquiring current user
  when: ansible_facts["system"] == "Linux"
  ansible.builtin.shell:
    cmd: "echo {{ ansible_user }}"
  register: current_user
- name: Creating prerequisite directory tree for installation scripts
  become: true
  become_user: "{{ current_user.stdout }}"
  ansible.builtin.file:
    path: "{{ ansible_user_home.stdout }}/.local/bin"
    recurse: true
    owner: "{{ ansible_user }}"
    group: "{{ ansible_user }}"
    state: directory
- name: Creating prerequisite directory tree for unarchived archives
  become: true
  become_user: "{{ current_user.stdout }}"
  ansible.builtin.file:
    path: "{{ ansible_user_home.stdout }}/downloads/archives/released"
    recurse: true
    owner: "{{ ansible_user }}"
    group: "{{ ansible_user }}"
    state: directory
- name: Creating prerequisite directory tree for package installation executables
  become: true
  become_user: "{{ current_user.stdout }}"
  ansible.builtin.file:
    path: "{{ ansible_user_home.stdout }}/.local_pkgs"
    recurse: true
    owner: "{{ ansible_user }}"
    group: "{{ ansible_user }}"
    state: directory
- name: Installing Linux software
  when: ansible_facts["system"] == "Linux"
  block:
    - name: Installing software using Debian package manager
      when: ansible_facts["os_family"] == "Debian"
      become: true
      block:
        - name: Creating core OS repository sources for package manager
          when: ansible_facts["os_family"] == "Debian"
          ansible.builtin.deb822_repository:
            name: "{{ item.name }}"
            uris: "{{ item.sources }}"
            types: "{{ item.types }}"
            suites: "{{ item.suites }}"
            components: "{{ item.comps }}"
            signed_by: "{{ item.sigkey }}"
            state: present
          loop:
            - name: debian-trixie
              sources: "http://deb.debian.org/debian/"
              sigkey: /usr/share/keyrings/debian-archive-keyring.gpg
              types:
                - deb-src
                - deb
              suites:
                - trixie
                - trixie-updates
              comps:
                - main
                - non-free-firmware
                - contrib
            - name: debian-trixie-security
              sources: "http://security.debian.org/debian-security"
              sigkey: /usr/share/keyrings/debian-archive-keyring.gpg
              types:
                - deb-src
                - deb
              suites: trixie-security
              comps:
                - main
                - non-free-firmware
                - contrib
        - name: Remove previous core OS repository sources for package manager
          ansible.builtin.file:
            path: /etc/apt/sources.list
            state: absent
        # @TODO uncomment below before continuing with testing previous task
        # - name: Premature end of play
        #   ansible.builtin.meta: end_play
        - name: Registering a package source
          when: item.sources != None
          ansible.builtin.deb822_repository:
            name: "{{ item.name }}"
            uris: "{{ item.sources }}"
            types: "{{ item.types | default('deb') }}"
            suites: "{{ item.suites | default('*') }}"
            components: "{{ item.comps | default('*') }}"
            signed_by: "{{ item.sigkey }}"
            state: present
          loop: "{{ ((pkgs.mngr.core | default([]))) }}"
        - name: Updating package cache
          ansible.builtin.apt:
            update_cache: true
        - name: Upgrading
          ansible.builtin.apt:
            upgrade: dist
            autoremove: true
        - name: Installing a local package in managed node
          when: item.uri != None
          ansible.builtin.apt:
            deb: "{{ item.uri }}"
            state: present
          notify: "{{ item.handler | default('default') }}"
          loop: "{{ (pkgs.mngr.core | default([])) | selectattr('uri', 'search', '\\.deb$') }}"
        - name: Installing a package
          when: item.name != None and item.uri == None
          ansible.builtin.package:
            name: "{{ item.name }}"
            state: present
          notify: "{{ item.handler | default('default') }}"
          async: 600
          poll: 5
          loop: "{{ ((pkgs.mngr.core | default([]))) | rejectattr('uri', 'search', '\\.deb$') }}"
      tags:
        - get_mngr_pkgs
    - name: Installing software by executing installation shell scripts
      block:
        - name: Acquiring installation shell script
          become: true
          become_user: "{{ current_user.stdout }}"
          when: item.src != None and (((pkgs.script.core | default([]))) | length) > 0
          ansible.builtin.uri:
            url: "{{ item.src }}"
            dest: "{{ ansible_user_home.stdout }}/.local/bin/{{ item.name }}-install.sh"
            follow_redirects: safe
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            force: true
            mode: "755"
            timeout: 300
          notify: "{{ ((pkgs.script.core | default([])))[idx].handler | default('default') }}"
          loop: "{{ (pkgs.script.core | default([])) }}"
          loop_control:
            index_var: idx
          register: install_scripts
        - name: Reboot machine for shell environment change
          become: true
          ansible.builtin.reboot:
            msg: Rebooting machine
      tags:
        - get_script_pkgs
    - name: Installing software by building it from source archives
      block:
        - name: Acquiring software source archive
          become: true
          become_user: "{{ current_user.stdout }}"
          when: item.src != None
          ansible.builtin.get_url:
            url: "{{ item.src }}"
            dest: "{{ ansible_user_home.stdout }}/downloads/archives/"
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            force: true
            backup: true
            mode: "644"
          loop: "{{ (pkgs.archive.core | default([])) }}"
          register: archived_builds
        - name: Create subdirectories for unarchiving
          become: true
          become_user: "{{ current_user.stdout }}"
          ansible.builtin.file:
            path: "{{ ansible_user_home.stdout }}/downloads/archives/released/{{ ((pkgs.archive.core | default([])))[idx].name }}"
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            mode: "755"
            state: directory
          loop: "{{ archived_builds.results }}"
          loop_control:
            index_var: idx
        - name: Unarchiving software build archive
          become: true
          become_user: "{{ current_user.stdout }}"
          when: item.dest != None and (((pkgs.script.core | default([]))) | length) > 0
          ansible.builtin.unarchive:
            src: "{{ item.dest }}"
            remote_src: true
            dest: "{{ ansible_user_home.stdout }}/downloads/archives/released/{{ ((pkgs.archive.core | default([])))[idx].name }}/"
          notify: "{{ ((pkgs.archive.core | default([])))[idx].handler | default('default') }}"
          loop: "{{ archived_builds.results }}"
          loop_control:
            index_var: idx
        - name: Reboot machine for shell environment change
          become: true
          ansible.builtin.reboot:
            msg: Rebooting machine
      tags:
        - get_archive_pkgs
    - name: Installing software from source git repositories
      block:
        - name: Clone git bare repository
          become: true
          become_user: "{{ current_user.stdout }}"
          when: item.src != None
          ansible.builtin.git:
            repo: "{{ item.src }}"
            dest: "{{ ansible_user_home.stdout }}/repos/.foreign/{{ item.name }}"
            version: "{{ item.branch }}"
            clone: true
          notify: "{{ item.handler | default('default') }}"
          loop: "{{ (pkgs.git_repos.core | default([])) }}"
          register: installation_repos
        - name: Reboot machine for shell environment change
          become: true
          ansible.builtin.reboot:
            msg: Rebooting machine
      tags:
        - get_git_pkgs
    - name: Installing software as pre-compiled binary
      block:
        - name: Grabbing software binary
          become: true
          ansible.builtin.get_url:
            url: "{{ item.src }}"
            dest: "/usr/bin/{{ item.name }}"
            owner: root
            group: root
            mode: "755"
            force: true
            backup: true
          notify: "{{ item.handler }}"
          timeout: 300
          loop: "{{ (pkgs.binaries.core | default([])) }}"

