name: docker build
# on: [push]
on:
    push:
        paths:
            - 'usr/share/usability-misc/dist-installer-cli-standalone'
            - '.github/workflows/builds.yml'

jobs:
    changes:
        runs-on: ubuntu-22.04
        permissions:
            pull-requests: read
        outputs:
            builds: ${{ steps.filter.outputs.builds }}
            installer: ${{ steps.filter.outputs.installer }}
        steps:
            - uses: actions/checkout@v4
            - uses: dorny/paths-filter@v3
              id: filter
              with:
                filters: |
                    installer:
                        - 'usr/share/usability-misc/dist-installer-cli-standalone'
                    builds:
                        - '.github/workflows/builds.yml'

    build:
        needs: changes
        # if: ${{ (needs.changes.outputs.installer == 'true') }}
        # if: ${{ (needs.changes.outputs.builds == 'true') }}
        if: ${{ (needs.changes.outputs.installer == 'true' || needs.changes.outputs.builds == 'true') }}
        ## Github takes too long to set the current latest image, this is
        ## why we set it manually.
        ##  https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
        runs-on: ubuntu-24.04
        strategy:
            fail-fast: false
            matrix:
                include:
                    - image: fedora:41
                    - image: fedora:42
                    #- image: fedora:latest
                    #- image: fedora:rawhide
                    ## Debian bullseye: EOL
                    ## E: The repository '\''https://deb.debian.org/debian bullseye-backports Release'\'' does not have a Release file.
                    #- image: debian:oldoldstable
                    - image: debian:oldstable
                    - image: debian:stable
                    - image: debian:testing
                    - image: debian:unstable
                    - image: ubuntu:latest
                    - image: linuxmintd/mint22.1-amd64:latest
                    - image: kalilinux/kali-rolling

        container:
            image: ${{ matrix.image }}

        steps:
            - uses: actions/checkout@v4
            - name: System Basic Packages
              run: |
                  if command -v apt-get; then
                    apt-get update --error-on=any
                    ## Installer aborts if package upgrades are pending.
                    apt-get dist-upgrade --yes
                    apt-get install --yes shellcheck sudo adduser tor locales
                  elif command -v dnf; then
                    dnf upgrade --assumeyes
                    dnf install --assumeyes ShellCheck sudo tor systemd gawk
                    ## Debugging.
                    dnf provides needs-restarting
                  else
                    exit 1
                  fi
                  ## TODO: test
                  sed -i "s/^# \(ru_RU.UTF-8 UTF-8\)$/\1/" /etc/locale.gen || true
                  ## TODO: Probably missing package on Fedora.
                  locale-gen || true
            - name: System information
              run: |
                  cat /etc/os-release
                  sep="--------------------"
                  printf '%s\n' "${sep}"
                  uname -a
                  printf '%s\n' "${sep}"
                  echo "${PATH}"
                  printf '%s\n' "${sep}"
                  localedef --list-archive
                  printf '%s\n' "${sep}"
                  locale
                  printf '%s\n' "${sep}"
                  if command -v apt-get >/dev/null; then
                    for f in \
                      /etc/apt/sources.list \
                      /etc/apt/sources.list.d/*.list \
                      /etc/apt/sources.list.d/*.sources
                    do
                      test -f "${f}" || continue
                      printf '%s\n%s\n%s\n' "### ${f} ###" "$(cat "$f")" "${sep}"
                    done
                  elif command -v dnf >/dev/null; then
                    for f in \
                      /etc/yum.repos.d/*.repo
                    do
                      test -f "${f}" || continue
                      printf '%s\n%s\n%s\n' "### ${f} ###" "$(cat "$f")" "${sep}"
                    done
                  fi
                  printf '%s\n' "${sep}"
                  #cat /etc/sudoers
                  #ls /etc/sudoers.d
            - name: Enable Services
              run: |
                  if command -v apt-get; then
                    service tor start
                    service tor status
                  elif command -v dnf; then
                    #cat /etc/tor/torrc || true

                    ## Manual start without systemd.
                    # sudo -u toranon tor -f /etc/tor/torrc --RunAsDaemon 1
                    # sleep 3
                    # ps aux | grep tor

                    ## 'service' not available on Fedora.
                    #service tor start || true
                    #service tor status || true

                    /lib/systemd/systemd --system || true
                    /usr/sbin/init || true

                    ## systemd installation in this way does not work. Error message:
                    ## System has not been booted with systemd as init system (PID 1). Can't operate.
                    systemctl enable --now tor || true
                    systemctl start tor || true
                    systemctl status tor || true
                  fi
            - name: Normal user with sudo privileges
              run: |
                  if test -f /etc/debian_version; then
                    ## Debian trixie needs "--comment".
                    ## Older Debian versions need "--gecos".
                    adduser --comment "" --disabled-password user || adduser --gecos "" --disabled-password user
                    usermod -aG sudo user
                    echo "%sudo ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/user
                  elif test -f /etc/fedora-release; then
                    adduser user
                    usermod -aG wheel user
                    echo "%wheel ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/user
                  else
                    exit 1
                  fi

            - name: Run default dist-installer-cli - Clearnet
              run: sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci
            - name: Run default dist-installer-cli - Onion
              run: sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --onion

            - name: Run VirtualBox Installer - default repository - Clearnet
              run: sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only
            - name: Run VirtualBox Installer - default repository - Onion
              run: sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only --onion

            - name: Run VirtualBox Installer - Oracle repository - Clearnet
              run: |
                  if ! grep -iq "kali" /etc/os-release; then
                    sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only --oracle-repo
                  fi
            - name: Run VirtualBox Installer - Oracle repository - Onion
              run: |
                  if ! grep -iq "kali" /etc/os-release; then
                    sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only --oracle-repo --onion
                  fi

            - name: Run VirtualBox Installer - back to default repository
              run: |
                  sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only || {
                    ec="$?"
                    if grep -iq -e "debian" -e "buntu" -e "mint" /etc/os-release && test "$ec" = "108"; then
                      printf '%s\n' "Expected error as --oracle-repo is not specified"
                      apt-get remove -y 'virtualbox*'
                      sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only
                    else
                      exit $?
                    fi
                  }
            - name: Run VirtualBox Installer - back to default repository - Clearnet
              run: sudo -u user -- usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --virtualbox-only --onion
            - name: Run with non-English locale - Clearnet
              run: sudo -u user -- env LC_ALL=ru_RU.UTF-8 LANG=ru_RU.UTF-8 LANGUAGE=ru_RU usr/share/usability-misc/dist-installer-cli-standalone --non-interactive --log-level=debug --no-boot --dev --ci --import-only=both --destroy-existing-guest
            ## When `source`d the script should exit in less than a second because it should not perform actual work.
            ## If it was running longer that would mean that it can no longer be `source`d without actually running.
            - name: Run Bash to test 'source'ing the script
              run: sudo -u user -- timeout 5 bash -c "set -x && source usr/share/usability-misc/dist-installer-cli-standalone"

            - name: Run Installer ShellCheck
              run: shellcheck usr/share/usability-misc/dist-installer-cli-standalone
