diff --git a/.editorconfig b/.editorconfig index 1c83ba2..a1cc729 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,7 +14,7 @@ ij_smart_tabs = false ij_visual_guides = 80, 120, 160 ij_wrap_on_typing = false -[*.yml] +[*.yaml] indent_size = 2 [*.md] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yaml similarity index 100% rename from .github/workflows/ci.yml rename to .github/workflows/ci.yaml diff --git a/.github/workflows/pre-commit-warmup.yml b/.github/workflows/pre-commit-warmup.yaml similarity index 100% rename from .github/workflows/pre-commit-warmup.yml rename to .github/workflows/pre-commit-warmup.yaml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yaml similarity index 100% rename from .github/workflows/release.yml rename to .github/workflows/release.yaml diff --git a/.github/workflows/ubuntu-test.yml b/.github/workflows/ubuntu-test.yaml similarity index 100% rename from .github/workflows/ubuntu-test.yml rename to .github/workflows/ubuntu-test.yaml diff --git a/.gitignore b/.gitignore index e94000b..b8db3fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ # Ansible /.galaxy/ *.retry -group_vars/_*.yml -group_vars/local.yml +group_vars/_*.yaml +group_vars/local.yaml .lock # Intellij diff --git a/.mk/.mk-common-version b/.mk/.mk-common-version new file mode 100644 index 0000000..1a56440 --- /dev/null +++ b/.mk/.mk-common-version @@ -0,0 +1 @@ +leinardi/make-common@v1 a5d37077c784b7e0ded1faf17ce70ae97ec68f8c diff --git a/.mk/help.mk b/.mk/help.mk new file mode 100644 index 0000000..82e4619 --- /dev/null +++ b/.mk/help.mk @@ -0,0 +1,16 @@ +ifndef MK_COMMON_HELP_INCLUDED +MK_COMMON_HELP_INCLUDED := 1 + +# Only set default if not already set +ifeq ($(.DEFAULT_GOAL),) + .DEFAULT_GOAL := help +endif + +.PHONY: help +help: ## Show this help and usage + @awk 'BEGIN {FS=":.*##"} /^[a-zA-Z0-9_\/-]+:.*##/ { printf "%s:%s\n", $$1, $$2 }' $(MAKEFILE_LIST) \ + | sort \ + | awk 'BEGIN {FS=":"; print "\nTargets:"} { printf " \033[36m%-24s\033[0m %s\n", $$1, $$2 }' + @echo "" + +endif # MK_COMMON_HELP_INCLUDED diff --git a/.mk/password.mk b/.mk/password.mk new file mode 100644 index 0000000..73f34a8 --- /dev/null +++ b/.mk/password.mk @@ -0,0 +1,9 @@ +ifndef MK_COMMON_PASSWORD_INCLUDED +MK_COMMON_PASSWORD_INCLUDED := 1 + +.PHONY: password +password: ## Generate a 99-character password (PostgreSQL compatible) + @echo "Generating a 99-character password (PostgreSQL compatible)..." + @env LC_ALL=C tr -dc 'A-Za-z0-9_.-+=,' < /dev/urandom | head -c 99; echo + +endif # MK_COMMON_PASSWORD_INCLUDED diff --git a/.mk/pre-commit.mk b/.mk/pre-commit.mk new file mode 100644 index 0000000..501ee62 --- /dev/null +++ b/.mk/pre-commit.mk @@ -0,0 +1,32 @@ +ifndef MK_COMMON_PRECOMMIT_INCLUDED +MK_COMMON_PRECOMMIT_INCLUDED := 1 + +.PHONY: check +check: check-installed-pre-commit ## Run pre-commit on all files + @pre-commit run --all-files + +.PHONY: check-stage +check-stage: check-installed-pre-commit ## Run pre-commit on the current staging area + @echo "Running pre-commit on current staging area..." + @pre-commit run + +.PHONY: pre-commit-install +pre-commit-install: check-installed-pre-commit ## Install pre-commit git hook in this repo + @pre-commit install + +.PHONY: pre-commit-autoupdate +pre-commit-autoupdate: check-installed-pre-commit ## Update pre-commit hook versions (immediate) + @pre-commit autoupdate + +.PHONY: check-installed-pre-commit +check-installed-pre-commit: # Verify that pre-commit is installed, print install help otherwise + @if ! command -v pre-commit >/dev/null 2>&1; then \ + echo "Error: pre-commit is not installed."; \ + echo "Install it with:"; \ + echo " macOS: brew install pre-commit"; \ + echo " Ubuntu: sudo apt install pre-commit"; \ + echo " (or) pipx install pre-commit"; \ + exit 1; \ + fi + +endif # MK_COMMON_PRECOMMIT_INCLUDED diff --git a/.yamllint.yml b/.yamllint.yaml similarity index 66% rename from .yamllint.yml rename to .yamllint.yaml index a24ce15..c257703 100644 --- a/.yamllint.yml +++ b/.yamllint.yaml @@ -1,15 +1,20 @@ +--- extends: default rules: braces: - min-spaces-inside: 1 + min-spaces-inside: 0 max-spaces-inside: 1 min-spaces-inside-empty: 0 max-spaces-inside-empty: 0 brackets: disable comments: min-spaces-from-content: 1 + comments-indentation: false document-start: disable indentation: disable line-length: disable + octal-values: + forbid-implicit-octal: true + forbid-explicit-octal: true truthy: disable diff --git a/Makefile b/Makefile index bcce3c3..d896fd6 100644 --- a/Makefile +++ b/Makefile @@ -1,115 +1,53 @@ -# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: check -check: check-installed-pre-commit - @pre-commit run --all-files +# Resolve repository root (Makefile can live anywhere) +REPO_ROOT := $(shell git rev-parse --show-toplevel 2>/dev/null || pwd) -.PHONY: check-stage -check-stage: check-installed-pre-commit - @echo "Running pre-commit on current staging area..." - pre-commit run +MK_COMMON_REPO ?= leinardi/make-common +MK_COMMON_VERSION ?= v1 -.PHONY: check-master-changes -check-master-changes: check-installed-pre-commit - @REF=; \ - if git rev-parse --verify --quiet origin/master >/dev/null && \ - git merge-base --is-ancestor origin/master HEAD; then \ - REF=origin/master; \ - elif git rev-parse --verify --quiet master >/dev/null && \ - git merge-base --is-ancestor master HEAD; then \ - REF=master; \ - else \ - echo "Error: neither origin/master nor master is an ancestor of HEAD." >&2; \ - exit 1; \ - fi; \ - echo "Running pre-commit on new commits since $$REF..."; \ - echo "pre-commit run --from-ref $$REF --to-ref HEAD"; \ - pre-commit run --from-ref $$REF --to-ref HEAD - -# Task to run shellcheck on all shell scripts -.PHONY: shellcheck -shellcheck: check-installed-pre-commit check-installed-shellcheck - @echo "Running shellcheck..." - pre-commit run shellcheck --all-files - -# Task to run prettier on all .yml and .yaml files -.PHONY: prettier -prettier: check-installed-pre-commit - pre-commit run prettier-yaml --all-files - -# Task to run ansible-lint on all playbooks after prettier -.PHONY: ansible-lint -ansible-lint: check-installed-pre-commit - @echo "Running ansible-lint..." - pre-commit run ansible-lint --all-files - -.PHONY: actionlint -actionlint: check-installed-pre-commit - @echo "Running actionlint..." - pre-commit run actionlint --all-files +MK_COMMON_DIR := $(REPO_ROOT)/.mk +MK_COMMON_FILES := help.mk pre-commit.mk password.mk -# Task to run yamllint on all playbooks after prettier -.PHONY: yamllint -yamllint: check-installed-pre-commit - @echo "Running yamllint..." - pre-commit run yamllint --all-files +MK_COMMON_BOOTSTRAP_SCRIPT := $(REPO_ROOT)/scripts/bootstrap-mk-common.sh -.PHONY: check-installed-shellcheck -check-installed-shellcheck: - @if ! command -v shellcheck >/dev/null 2>&1; then \ - echo "Error: shellcheck is not installed."; \ - echo "Install it with:"; \ - echo " macOS: brew install shellcheck"; \ - echo " Ubuntu: sudo apt-get install -y shellcheck"; \ - exit 1; \ - fi +# Bootstrap: the script will self-update and fetch the selected .mk snippets +MK_COMMON_BOOTSTRAP := $(shell "$(MK_COMMON_BOOTSTRAP_SCRIPT)" \ + "$(MK_COMMON_REPO)" \ + "$(MK_COMMON_VERSION)" \ + "$(MK_COMMON_DIR)" \ + "$(MK_COMMON_FILES)") -.PHONY: check-installed-prettier -check-installed-prettier: - @if ! command -v prettier >/dev/null 2>&1; then \ - echo "Error: prettier is not installed."; \ - echo "Install it with:"; \ - echo " macOS: brew install prettier"; \ - echo " Ubuntu: npm install --global prettier"; \ - exit 1; \ - fi +# Include shared make logic +include $(addprefix $(MK_COMMON_DIR)/,$(MK_COMMON_FILES)) -.PHONY: check-installed-pre-commit -check-installed-pre-commit: - @if ! command -v pre-commit >/dev/null 2>&1; then \ - echo "Error: pre-commit is not installed."; \ - echo "Install it with:"; \ - echo " macOS: brew install pre-commit"; \ - echo " Ubuntu: pip install pre-commit"; \ - exit 1; \ - fi +.PHONY: mk-common-update +mk-common-update: ## Check for remote updates of shared .mk files + @echo "[mk] Checking for updates from $(MK_COMMON_REPO)@$(MK_COMMON_VERSION)" + MK_COMMON_UPDATE=1 "$(MK_COMMON_BOOTSTRAP_SCRIPT)" \ + "$(MK_COMMON_REPO)" \ + "$(MK_COMMON_VERSION)" \ + "$(MK_COMMON_DIR)" \ + "$(MK_COMMON_FILES)" -.PHONY: install-pre-commit -install-pre-commit: check-installed-pre-commit - @echo "Setting up pre-commit..." - pre-commit install - -# Task to generate group_vars/all.yml .PHONY: generate-group-vars -generate-group-vars: check-installed-pre-commit - @echo "Generating group_vars/all.yml..." +generate-group-vars: check-installed-pre-commit ## Generate inventory/group_vars/all.yaml + @echo "Generating inventory/group_vars/all.yaml..." pre-commit run generate-group-vars --all-files -# Task to run ansible-playbook with optional parameters like TAGS, LIMIT, EXTRA_VARS, OTHER_PARAMS + .PHONY: install -install: check-ansible +install: check-ansible ## Run ansible-playbook with optional parameters @echo "Running ansible-playbook with optional parameters..." - ansible-playbook ubuntu-setup.yml --ask-become-pass $(strip \ + ansible-playbook playbooks/ubuntu-setup.yaml --ask-become-pass $(strip \ $(if $(TAGS),--tags=$(TAGS)) \ $(if $(LIMIT),--limit=$(LIMIT)) \ $(if $(EXTRA_VARS),--extra-vars="$(EXTRA_VARS)") \ $(if $(OTHER_PARAMS),$(OTHER_PARAMS))) -# Check if ansible is installed, and run the ansible installation script if not .PHONY: check-ansible -check-ansible: +check-ansible: # Check if ansible is installed, and run the ansible installation script if not @if ! command -v ansible >/dev/null 2>&1; then \ echo "Ansible is not installed, running setup script..."; \ - sudo ./install_ansible.sh; \ + ./install_ansible.sh; \ else \ echo "Ansible is already installed."; \ fi diff --git a/README.md b/README.md index 4356cb2..c145bef 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -[![Ubuntu test](https://github.com/leinardi/JDInstaller/actions/workflows/ubuntu-test.yml/badge.svg?branch=release)](https://github.com/leinardi/JDInstaller/actions/workflows/ubuntu-test.yml) [![CI release](https://github.com/leinardi/JDInstaller/actions/workflows/ci.yml/badge.svg?branch=release)](https://github.com/leinardi/JDInstaller/actions/workflows/ci.yml) +[![Ubuntu test](https://github.com/leinardi/JDInstaller/actions/workflows/ubuntu-test.yaml/badge.svg?branch=release)](https://github.com/leinardi/JDInstaller/actions/workflows/ubuntu-test.yaml) [![CI release](https://github.com/leinardi/JDInstaller/actions/workflows/ci.yaml/badge.svg?branch=release)](https://github.com/leinardi/JDInstaller/actions/workflows/ci.yaml) # JDInstaller This Ansible playbook is designed to initialize a fresh Ubuntu installation with packages and configurations that suit my personal preferences. While it is specifically tailored to my needs, it can be easily adapted to different setups. Every major Ansible role can be individually enabled or disabled by modifying -its respective value in `group_vars/all.yml`. +its respective value in `inventory/group_vars/all.yaml`. ## Table of Contents @@ -21,9 +21,9 @@ its respective value in `group_vars/all.yml`. ## Introduction -This project uses [Ansible](https://www.ansible.com/) to automate the setup of Ubuntu installations. By running the main playbook (`ubuntu-setup.yml`), the +This project uses [Ansible](https://www.ansible.com/) to automate the setup of Ubuntu installations. By running the main playbook (`playbooks/ubuntu-setup.yaml`), the system will be configured with a range of packages and settings that I prefer. You can easily customize the playbook by enabling or disabling specific roles in -`group_vars/all.yml`. +`inventory/group_vars/all.yaml`. ### What is a Role? @@ -78,13 +78,13 @@ make install This command will: 1. Automatically install Ansible if it’s not already installed. -2. Launch the main playbook (`ubuntu-setup.yml`) to configure the system. +2. Launch the main playbook (`playbooks/ubuntu-setup.yaml`) to configure the system. 3. Prompt for the sudo password of the current user. Alternatively, you can run the playbook manually: ```bash -ansible-playbook ubuntu-setup.yml --ask-become-pass +ansible-playbook playbooks/ubuntu-setup.yaml --ask-become-pass ``` ### Run Single Roles @@ -98,12 +98,12 @@ make install TAGS=virtualbox Or manually run the playbook with specific tags: ```bash -ansible-playbook ubuntu-setup.yml --ask-become-pass --tags=virtualbox +ansible-playbook playbooks/ubuntu-setup.yaml --ask-become-pass --tags=virtualbox ``` ### Reset Configuration -To generate/reset the `group_vars/all.yml` file to the default values, run: +To generate/reset the `inventory/group_vars/all.yaml` file to the default values, run: ```bash ./generate-group-vars.sh @@ -112,24 +112,24 @@ To generate/reset the `group_vars/all.yml` file to the default values, run: ## Playbooks Below is a list of the playbooks that are included in this project. You can enable or disable each one by modifying the respective variable in -`group_vars/all.yml`. +`inventory/group_vars/all.yaml`. | Playbook | Enabled by Default | Description | |-------------------|--------------------|-------------------------------------------| -| `common.yml` | ✅ | Sets up common packages and settings. | -| `desktop.yml` | ✅ | Installs desktop-specific applications. | -| `development.yml` | ✅ | Installs development tools and libraries. | -| `gaming.yml` | ✅ | Installs gaming-related tools. | -| `work.yml` | ⛔ | Installs work-related applications. | +| `common.yaml` | ✅ | Sets up common packages and settings. | +| `desktop.yaml` | ✅ | Installs desktop-specific applications. | +| `development.yaml` | ✅ | Installs development tools and libraries. | +| `gaming.yaml` | ✅ | Installs gaming-related tools. | +| `work.yaml` | ⛔ | Installs work-related applications. | ## Roles -The tables below provide an overview of the roles included in this project. Each role can be enabled or disabled via `group_vars/all.yml`. The "Enabled by +The tables below provide an overview of the roles included in this project. Each role can be enabled or disabled via `inventory/group_vars/all.yaml`. The "Enabled by Default" column shows whether the role is active by default. Even if a role is enabled by default, if the relative playbook is disabled via -`group_vars/all.yml`, the role will not be executed. To run a specific playbook or role, make sure both the playbook and the role are enabled in -`group_vars/all.yml`. +`inventory/group_vars/all.yaml`, the role will not be executed. To run a specific playbook or role, make sure both the playbook and the role are enabled in +`inventory/group_vars/all.yaml`. -### Playbook: `common.yml` +### Playbook: `common.yaml` | Role | Enabled by Default | Source | Description | |----------|--------------------|--------|----------------------------------------------------------------| @@ -137,7 +137,7 @@ Default" column shows whether the role is active by default. Even if a role is e | `snapd` | ⛔ | apt | Installs snapd for managing Snap packages. | | `ufw` | ⛔ | apt | Installs and configures Uncomplicated Firewall (UFW). | -### Playbook: `desktop.yml` +### Playbook: `desktop.yaml` | Role | Enabled by Default | Source | Description | |--------------------|--------------------|-----------------------|------------------------------------------------------------------------------------------------| @@ -171,7 +171,7 @@ Default" column shows whether the role is active by default. Even if a role is e | `vlc` | ✅ | apt | Installs VLC media player. | | `xfburn` | ✅ | apt | Installs Xfburn, a tool for burning CDs and DVDs. | -### Playbook: `development.yml` +### Playbook: `development.yaml` | Role | Enabled by Default | Source | Description | |---------------|--------------------|--------|-----------------------------------------------------------------------| @@ -182,7 +182,7 @@ Default" column shows whether the role is active by default. Even if a role is e | `python` | ✅ | apt | Installs Python. | | `slack` | ⛔ | snap | Installs Slack for team communication. | -### Playbook: `gaming.yml` +### Playbook: `gaming.yaml` | Role | Enabled by Default | Source | Description | |------------|--------------------|--------|--------------------------------------------------| @@ -191,7 +191,7 @@ Default" column shows whether the role is active by default. Even if a role is e | `mangohud` | ✅ | github | Installs MangoHud, a gaming performance overlay. | | `steam` | ✅ | deb | Installs Steam, a gaming platform. | -### Playbook: `work.yml` +### Playbook: `work.yaml` | Role | Enabled by Default | Source | Description | |-----------------------------|--------------------|-----------------------|-----------------------------------------------| @@ -199,8 +199,8 @@ Default" column shows whether the role is active by default. Even if a role is e | `mattermost` | ✅ | apt (mattermost repo) | Installs Mattermost, a team chat application. | | `zoom` | ✅ | deb | Installs Zoom, a video conferencing tool. | -Each playbook can be customized, and roles enabled or disabled as required via `group_vars/all.yml`. By default, the playbook `work.yml` is disabled, -but can be easily enabled if needed by changing the `work_enabled` in `group_vars/all.yml`. +Each playbook can be customized, and roles enabled or disabled as required via `inventory/group_vars/all.yaml`. By default, the playbook `work.yaml` is disabled, +but can be easily enabled if needed by changing the `work_enabled` in `inventory/group_vars/all.yaml`. ## DaVinci Resolve @@ -221,7 +221,7 @@ instructions on enabling the installation, as well as uninstallation steps. ## Contributions Bug fixes and improvements to the Ansible code are welcome. However, please note that the list of default software installations is strictly based on my -personal preferences. I will accept pull requests adding roles for software that I don't use, but they must be disabled by default via `group_vars/all.yml`. +personal preferences. I will accept pull requests adding roles for software that I don't use, but they must be disabled by default via `inventory/group_vars/all.yaml`. **Before opening a pull request, please create an issue to describe the feature you would like to add and wait for my approval.** This helps avoid unnecessary work. @@ -248,7 +248,7 @@ After that, checks will automatically run before each commit. You can also run t make check ``` -This command performs static analysis on shell and YAML files and regenerates the `group_vars/all.yml` file. +This command performs static analysis on shell and YAML files and regenerates the `inventory/group_vars/all.yaml` file. ## Acknowledgements diff --git a/TODO.md b/TODO.md index 9a5d317..16894c9 100644 --- a/TODO.md +++ b/TODO.md @@ -11,6 +11,6 @@ https://ubuntuhandbook.org/index.php/2024/01/foliate-opds-catalogs/amp/ https://ubuntuhandbook.org/index.php/2021/08/enable-game-mode-ubuntu-linux/amp/ https://gitlab.gnome.org/World/iotas https://github.com/somepaulo/MoreWaita -Fix tags (see common.yml) +Fix tags (see common.yaml) https://flathub.org/apps/com.mattjakeman.ExtensionManager Telegram diff --git a/ansible.cfg b/ansible.cfg index bfb570b..45d1afc 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,9 +1,9 @@ [defaults] -roles_path = .galaxy/roles -collections_path = .galaxy/collections -hostfile = hosts -inventory = inventory -nocows = 1 +inventory=./inventory/hosts.yaml +roles_path=./.galaxy/roles:./roles:~/.ansible/roles +collections_path=./.galaxy/collections:./collections:~/.ansible/collections +nocows=1 +interpreter_python=auto_silent [privilege_escalation] -become_method = sudo +become_method=sudo diff --git a/generate-group-vars.sh b/generate-group-vars.sh index fab77df..d9c362a 100755 --- a/generate-group-vars.sh +++ b/generate-group-vars.sh @@ -1,7 +1,7 @@ #!/bin/bash # Define the output file -output_file="group_vars/all.yml" +output_file="inventory/group_vars/all.yaml" # Create or empty the output file and add the initial YAML document separator { @@ -9,9 +9,9 @@ output_file="group_vars/all.yml" echo "---" } > "$output_file" -# Loop through each role's defaults/main.yml file +# Loop through each role's defaults/main.yaml file for role in roles/*; do - defaults_file="$role/defaults/main.yml" + defaults_file="$role/defaults/main.yaml" if [ -f "$defaults_file" ]; then { @@ -26,4 +26,4 @@ done # Remove the last newline to avoid two trailing newlines truncate -s -1 "$output_file" -echo "group_vars/all.yml has been generated." +echo "inventory/group_vars/all.yaml has been generated." diff --git a/hosts b/hosts deleted file mode 100644 index 4bda6c9..0000000 --- a/hosts +++ /dev/null @@ -1,3 +0,0 @@ -[local] -localhost ansible_connection=local - diff --git a/install_ansible.sh b/install_ansible.sh index 7fd2d62..47dd9d2 100755 --- a/install_ansible.sh +++ b/install_ansible.sh @@ -73,11 +73,11 @@ print_instructions() { echo "Next steps:" echo "" echo "1. Customize the playbook to fit your needs:" - echo " -> Edit the file: **group_vars/all.yml**" + echo " -> Edit the file: **group_vars/all.yaml**" echo "" echo "" echo "2. Run Ansible with the following command:" - echo " $ ansible-playbook ubuntu-setup.yml --ask-become-pass" + echo " $ ansible-playbook playbooks/ubuntu-setup.yaml --ask-become-pass" echo "" echo " The '--ask-become-pass' flag will prompt you for the sudo password." echo "" diff --git a/inventory b/inventory deleted file mode 100644 index d139c1c..0000000 --- a/inventory +++ /dev/null @@ -1,2 +0,0 @@ -[local] -localhost ansible_host=127.0.0.1 ansible_connection=local ansible_python_interpreter=/usr/bin/python3 \ No newline at end of file diff --git a/group_vars/all.yml b/inventory/group_vars/all.yaml similarity index 88% rename from group_vars/all.yml rename to inventory/group_vars/all.yaml index 4a3cc26..0626dd7 100644 --- a/group_vars/all.yml +++ b/inventory/group_vars/all.yaml @@ -148,6 +148,9 @@ firefox_enabled: true # Variables from roles/flatpak flatpak_enabled: true +# Variables from roles/freecad +freecad_enabled: true + # Variables from roles/gamemode gparted_enabled: true @@ -261,6 +264,31 @@ openjre_enabled: false # Variables from roles/opentofu opentofu_enabled: true +# Variables from roles/orcaslicer +orcaslicer_enabled: true + +orcaslicer: + # If true installs the nightly bundle; if false installs stable (latest or pinned version). + nightly: false + + # "system" or "user" + method: system + + # Stable only: "latest" (default) or a specific version like "2.3.1" + version: latest + + # If true and OrcaSlicer is already installed, uninstall it first then reinstall. + force_reinstall: false + + # Official GitHub repo used for the release API and assets + github_repo: OrcaSlicer/OrcaSlicer + + # Flatpak app-id inside the bundle (used for idempotency check + uninstall) + app_id: io.github.softfever.OrcaSlicer + +# Temporary download folder +orcaslicer_tmp_dir: /tmp/orcaslicer-flatpak + # Variables from roles/pipx pipx_enabled: false @@ -282,6 +310,9 @@ sweethome3d_enabled: true # Variables from roles/tflint tflint_enabled: true +# Variables from roles/three_d_printing +three_d_printing_enabled: true + # Variables from roles/timeshift timeshift_enabled: false diff --git a/inventory/hosts.yaml b/inventory/hosts.yaml new file mode 100644 index 0000000..0650567 --- /dev/null +++ b/inventory/hosts.yaml @@ -0,0 +1,9 @@ +--- +all: + children: + local: + hosts: + localhost: + ansible_host: 127.0.0.1 + ansible_connection: local + ansible_python_interpreter: /usr/bin/python3 diff --git a/common.yml b/playbooks/common.yaml similarity index 100% rename from common.yml rename to playbooks/common.yaml diff --git a/desktop.yml b/playbooks/desktop.yaml similarity index 100% rename from desktop.yml rename to playbooks/desktop.yaml diff --git a/development.yml b/playbooks/development.yaml similarity index 100% rename from development.yml rename to playbooks/development.yaml diff --git a/gaming.yml b/playbooks/gaming.yaml similarity index 100% rename from gaming.yml rename to playbooks/gaming.yaml diff --git a/pre_tasks.yml b/playbooks/tasks/pre_tasks.yaml similarity index 98% rename from pre_tasks.yml rename to playbooks/tasks/pre_tasks.yaml index b490a4d..84dffc5 100644 --- a/pre_tasks.yml +++ b/playbooks/tasks/pre_tasks.yaml @@ -1,5 +1,7 @@ --- -- block: +- name: Ubuntu setup pre-task + tags: always + block: - name: Check Ubuntu version ansible.builtin.pause: prompt: | @@ -60,5 +62,3 @@ - name: Set has_nvidia_gpu fact based on lspci output ansible.builtin.set_fact: has_nvidia_gpu: "{{ lspci_output.rc | default(1) == 0 }}" - - tags: always diff --git a/playbooks/three_d_printing.yaml b/playbooks/three_d_printing.yaml new file mode 100644 index 0000000..9ecf06f --- /dev/null +++ b/playbooks/three_d_printing.yaml @@ -0,0 +1,10 @@ +--- +- name: Ubuntu 3D Printing Playbook + hosts: localhost + roles: + - role: freecad + tags: freecad + when: freecad_enabled | bool + - role: orcaslicer + tags: orcaslicer + when: orcaslicer_enabled | bool diff --git a/ubuntu-setup.yml b/playbooks/ubuntu-setup.yaml similarity index 57% rename from ubuntu-setup.yml rename to playbooks/ubuntu-setup.yaml index 1610ffa..d2e16a9 100644 --- a/ubuntu-setup.yml +++ b/playbooks/ubuntu-setup.yaml @@ -4,29 +4,34 @@ pre_tasks: - name: Import pre_tasks - ansible.builtin.import_tasks: pre_tasks.yml + ansible.builtin.import_tasks: tasks/pre_tasks.yaml - name: Import common tasks - import_playbook: common.yml + import_playbook: common.yaml tags: common when: common_enabled | bool - name: Import desktop tasks - import_playbook: desktop.yml + import_playbook: desktop.yaml tags: desktop when: desktop_enabled | bool - name: Import gaming tasks - import_playbook: gaming.yml + import_playbook: gaming.yaml tags: gaming when: gaming_enabled | bool - name: Import development tasks - import_playbook: development.yml + import_playbook: development.yaml tags: development when: development_enabled | bool +- name: Import 3D printing tasks + import_playbook: three_d_printing.yaml + tags: three_d_printing + when: three_d_printing_enabled | bool + - name: Import work tasks - import_playbook: work.yml + import_playbook: work.yaml tags: work when: work_enabled | bool diff --git a/work.yml b/playbooks/work.yaml similarity index 100% rename from work.yml rename to playbooks/work.yaml diff --git a/roles/anydesk/defaults/main.yml b/roles/anydesk/defaults/main.yaml similarity index 100% rename from roles/anydesk/defaults/main.yml rename to roles/anydesk/defaults/main.yaml diff --git a/roles/anydesk/tasks/main.yml b/roles/anydesk/tasks/main.yaml similarity index 100% rename from roles/anydesk/tasks/main.yml rename to roles/anydesk/tasks/main.yaml diff --git a/roles/chrome/defaults/main.yml b/roles/chrome/defaults/main.yaml similarity index 100% rename from roles/chrome/defaults/main.yml rename to roles/chrome/defaults/main.yaml diff --git a/roles/chrome/tasks/main.yml b/roles/chrome/tasks/main.yaml similarity index 100% rename from roles/chrome/tasks/main.yml rename to roles/chrome/tasks/main.yaml diff --git a/roles/chromium/defaults/main.yml b/roles/chromium/defaults/main.yaml similarity index 100% rename from roles/chromium/defaults/main.yml rename to roles/chromium/defaults/main.yaml diff --git a/roles/chromium/tasks/main.yml b/roles/chromium/tasks/main.yaml similarity index 100% rename from roles/chromium/tasks/main.yml rename to roles/chromium/tasks/main.yaml diff --git a/roles/common/defaults/main.yml b/roles/common/defaults/main.yaml similarity index 100% rename from roles/common/defaults/main.yml rename to roles/common/defaults/main.yaml diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yaml similarity index 100% rename from roles/common/tasks/main.yml rename to roles/common/tasks/main.yaml diff --git a/roles/davinci_resolve/DaVinciResolve.md b/roles/davinci_resolve/DaVinciResolve.md index 48c9d31..1c74fbd 100644 --- a/roles/davinci_resolve/DaVinciResolve.md +++ b/roles/davinci_resolve/DaVinciResolve.md @@ -14,7 +14,7 @@ The DaVinci Resolve installation is disabled by default. To enable it: ``` 3. To install the standard (non-Studio) version, move to the next step. If you want, instead, to install the Studio version, update the configuration by setting - `davinci_resolve.install_studio` to `true` in `group_vars/all.yml`: + `davinci_resolve.install_studio` to `true` in `group_vars/all.yaml`: ```yaml davinci_resolve: install_studio: true diff --git a/roles/davinci_resolve/defaults/main.yml b/roles/davinci_resolve/defaults/main.yaml similarity index 100% rename from roles/davinci_resolve/defaults/main.yml rename to roles/davinci_resolve/defaults/main.yaml diff --git a/roles/davinci_resolve/handlers/main.yml b/roles/davinci_resolve/handlers/main.yaml similarity index 100% rename from roles/davinci_resolve/handlers/main.yml rename to roles/davinci_resolve/handlers/main.yaml diff --git a/roles/davinci_resolve/meta/main.yml b/roles/davinci_resolve/meta/main.yaml similarity index 100% rename from roles/davinci_resolve/meta/main.yml rename to roles/davinci_resolve/meta/main.yaml diff --git a/roles/davinci_resolve/tasks/main.yml b/roles/davinci_resolve/tasks/main.yaml similarity index 100% rename from roles/davinci_resolve/tasks/main.yml rename to roles/davinci_resolve/tasks/main.yaml diff --git a/roles/desktop/defaults/main.yml b/roles/desktop/defaults/main.yaml similarity index 100% rename from roles/desktop/defaults/main.yml rename to roles/desktop/defaults/main.yaml diff --git a/roles/desktop/tasks/main.yml b/roles/desktop/tasks/main.yaml similarity index 100% rename from roles/desktop/tasks/main.yml rename to roles/desktop/tasks/main.yaml diff --git a/roles/development/defaults/main.yml b/roles/development/defaults/main.yaml similarity index 100% rename from roles/development/defaults/main.yml rename to roles/development/defaults/main.yaml diff --git a/roles/development/meta/main.yml b/roles/development/meta/main.yaml similarity index 100% rename from roles/development/meta/main.yml rename to roles/development/meta/main.yaml diff --git a/roles/development/tasks/main.yml b/roles/development/tasks/main.yaml similarity index 100% rename from roles/development/tasks/main.yml rename to roles/development/tasks/main.yaml diff --git a/roles/discord/defaults/main.yml b/roles/discord/defaults/main.yaml similarity index 100% rename from roles/discord/defaults/main.yml rename to roles/discord/defaults/main.yaml diff --git a/roles/discord/tasks/main.yml b/roles/discord/tasks/main.yaml similarity index 100% rename from roles/discord/tasks/main.yml rename to roles/discord/tasks/main.yaml diff --git a/roles/docker/defaults/main.yml b/roles/docker/defaults/main.yaml similarity index 100% rename from roles/docker/defaults/main.yml rename to roles/docker/defaults/main.yaml diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yaml similarity index 100% rename from roles/docker/tasks/main.yml rename to roles/docker/tasks/main.yaml diff --git a/roles/doublecmd/defaults/main.yml b/roles/doublecmd/defaults/main.yaml similarity index 100% rename from roles/doublecmd/defaults/main.yml rename to roles/doublecmd/defaults/main.yaml diff --git a/roles/doublecmd/tasks/main.yml b/roles/doublecmd/tasks/main.yaml similarity index 100% rename from roles/doublecmd/tasks/main.yml rename to roles/doublecmd/tasks/main.yaml diff --git a/roles/earth/defaults/main.yml b/roles/earth/defaults/main.yaml similarity index 100% rename from roles/earth/defaults/main.yml rename to roles/earth/defaults/main.yaml diff --git a/roles/earth/tasks/main.yml b/roles/earth/tasks/main.yaml similarity index 100% rename from roles/earth/tasks/main.yml rename to roles/earth/tasks/main.yaml diff --git a/roles/edge/defaults/main.yml b/roles/edge/defaults/main.yaml similarity index 100% rename from roles/edge/defaults/main.yml rename to roles/edge/defaults/main.yaml diff --git a/roles/edge/tasks/main.yml b/roles/edge/tasks/main.yaml similarity index 100% rename from roles/edge/tasks/main.yml rename to roles/edge/tasks/main.yaml diff --git a/roles/filezilla/defaults/main.yml b/roles/filezilla/defaults/main.yaml similarity index 100% rename from roles/filezilla/defaults/main.yml rename to roles/filezilla/defaults/main.yaml diff --git a/roles/filezilla/tasks/main.yml b/roles/filezilla/tasks/main.yaml similarity index 100% rename from roles/filezilla/tasks/main.yml rename to roles/filezilla/tasks/main.yaml diff --git a/roles/firefox/defaults/main.yml b/roles/firefox/defaults/main.yaml similarity index 100% rename from roles/firefox/defaults/main.yml rename to roles/firefox/defaults/main.yaml diff --git a/roles/firefox/tasks/main.yml b/roles/firefox/tasks/main.yaml similarity index 100% rename from roles/firefox/tasks/main.yml rename to roles/firefox/tasks/main.yaml diff --git a/roles/flatpak/defaults/main.yml b/roles/flatpak/defaults/main.yaml similarity index 100% rename from roles/flatpak/defaults/main.yml rename to roles/flatpak/defaults/main.yaml diff --git a/roles/flatpak/tasks/main.yml b/roles/flatpak/tasks/main.yaml similarity index 100% rename from roles/flatpak/tasks/main.yml rename to roles/flatpak/tasks/main.yaml diff --git a/roles/freecad/defaults/main.yaml b/roles/freecad/defaults/main.yaml new file mode 100644 index 0000000..6bfc166 --- /dev/null +++ b/roles/freecad/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +freecad_enabled: true diff --git a/roles/freecad/tasks/main.yaml b/roles/freecad/tasks/main.yaml new file mode 100644 index 0000000..159e9a5 --- /dev/null +++ b/roles/freecad/tasks/main.yaml @@ -0,0 +1,17 @@ +--- +- name: Add FreeCAD PPA + become: true + ansible.builtin.deb822_repository: + name: "freecad-maintainers-ubuntu-freecad-stable-{{ ansible_distribution_release }}" + types: deb + uris: "https://ppa.launchpadcontent.net/freecad-maintainers/freecad-stable/ubuntu/" + suites: "{{ ansible_distribution_release }}" + components: main + signed_by: https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x9F0E375806520BD65BC61B18A728AE60A790F0EB + +- name: Install FreeCAD + become: true + ansible.builtin.apt: + name: freecad + state: present + update_cache: true diff --git a/roles/gamemode/defaults/main.yml b/roles/gamemode/defaults/main.yaml similarity index 100% rename from roles/gamemode/defaults/main.yml rename to roles/gamemode/defaults/main.yaml diff --git a/roles/gamemode/tasks/main.yml b/roles/gamemode/tasks/main.yaml similarity index 100% rename from roles/gamemode/tasks/main.yml rename to roles/gamemode/tasks/main.yaml diff --git a/roles/gaming/defaults/main.yml b/roles/gaming/defaults/main.yaml similarity index 100% rename from roles/gaming/defaults/main.yml rename to roles/gaming/defaults/main.yaml diff --git a/roles/gimp/defaults/main.yml b/roles/gimp/defaults/main.yaml similarity index 100% rename from roles/gimp/defaults/main.yml rename to roles/gimp/defaults/main.yaml diff --git a/roles/gimp/tasks/main.yml b/roles/gimp/tasks/main.yaml similarity index 100% rename from roles/gimp/tasks/main.yml rename to roles/gimp/tasks/main.yaml diff --git a/roles/git/defaults/main.yml b/roles/git/defaults/main.yaml similarity index 100% rename from roles/git/defaults/main.yml rename to roles/git/defaults/main.yaml diff --git a/roles/git/tasks/main.yml b/roles/git/tasks/main.yaml similarity index 100% rename from roles/git/tasks/main.yml rename to roles/git/tasks/main.yaml diff --git a/roles/globalprotect_openconnect/defaults/main.yml b/roles/globalprotect_openconnect/defaults/main.yaml similarity index 100% rename from roles/globalprotect_openconnect/defaults/main.yml rename to roles/globalprotect_openconnect/defaults/main.yaml diff --git a/roles/globalprotect_openconnect/tasks/main.yml b/roles/globalprotect_openconnect/tasks/main.yaml similarity index 100% rename from roles/globalprotect_openconnect/tasks/main.yml rename to roles/globalprotect_openconnect/tasks/main.yaml diff --git a/roles/gnome_extensions/defaults/main.yml b/roles/gnome_extensions/defaults/main.yaml similarity index 100% rename from roles/gnome_extensions/defaults/main.yml rename to roles/gnome_extensions/defaults/main.yaml diff --git a/roles/gnome_extensions/meta/main.yml b/roles/gnome_extensions/meta/main.yaml similarity index 100% rename from roles/gnome_extensions/meta/main.yml rename to roles/gnome_extensions/meta/main.yaml diff --git a/roles/gnome_extensions/tasks/main.yml b/roles/gnome_extensions/tasks/main.yaml similarity index 100% rename from roles/gnome_extensions/tasks/main.yml rename to roles/gnome_extensions/tasks/main.yaml diff --git a/roles/gparted/defaults/main.yml b/roles/gparted/defaults/main.yaml similarity index 100% rename from roles/gparted/defaults/main.yml rename to roles/gparted/defaults/main.yaml diff --git a/roles/gparted/tasks/main.yml b/roles/gparted/tasks/main.yaml similarity index 100% rename from roles/gparted/tasks/main.yml rename to roles/gparted/tasks/main.yaml diff --git a/roles/graphics_drivers/defaults/main.yml b/roles/graphics_drivers/defaults/main.yaml similarity index 100% rename from roles/graphics_drivers/defaults/main.yml rename to roles/graphics_drivers/defaults/main.yaml diff --git a/roles/graphics_drivers/tasks/main.yml b/roles/graphics_drivers/tasks/main.yaml similarity index 100% rename from roles/graphics_drivers/tasks/main.yml rename to roles/graphics_drivers/tasks/main.yaml diff --git a/roles/gsettings/defaults/main.yml b/roles/gsettings/defaults/main.yaml similarity index 100% rename from roles/gsettings/defaults/main.yml rename to roles/gsettings/defaults/main.yaml diff --git a/roles/gsettings/tasks/main.yml b/roles/gsettings/tasks/main.yaml similarity index 100% rename from roles/gsettings/tasks/main.yml rename to roles/gsettings/tasks/main.yaml diff --git a/roles/hadolint/defaults/main.yml b/roles/hadolint/defaults/main.yaml similarity index 100% rename from roles/hadolint/defaults/main.yml rename to roles/hadolint/defaults/main.yaml diff --git a/roles/hadolint/tasks/main.yml b/roles/hadolint/tasks/main.yaml similarity index 100% rename from roles/hadolint/tasks/main.yml rename to roles/hadolint/tasks/main.yaml diff --git a/roles/handbrake/defaults/main.yml b/roles/handbrake/defaults/main.yaml similarity index 100% rename from roles/handbrake/defaults/main.yml rename to roles/handbrake/defaults/main.yaml diff --git a/roles/handbrake/tasks/main.yml b/roles/handbrake/tasks/main.yaml similarity index 100% rename from roles/handbrake/tasks/main.yml rename to roles/handbrake/tasks/main.yaml diff --git a/roles/inkscape/defaults/main.yml b/roles/inkscape/defaults/main.yaml similarity index 100% rename from roles/inkscape/defaults/main.yml rename to roles/inkscape/defaults/main.yaml diff --git a/roles/inkscape/tasks/main.yml b/roles/inkscape/tasks/main.yaml similarity index 100% rename from roles/inkscape/tasks/main.yml rename to roles/inkscape/tasks/main.yaml diff --git a/roles/inotify_watches/tasks/main.yml b/roles/inotify_watches/tasks/main.yaml similarity index 100% rename from roles/inotify_watches/tasks/main.yml rename to roles/inotify_watches/tasks/main.yaml diff --git a/roles/insync/defaults/main.yml b/roles/insync/defaults/main.yaml similarity index 100% rename from roles/insync/defaults/main.yml rename to roles/insync/defaults/main.yaml diff --git a/roles/insync/meta/main.yml b/roles/insync/meta/main.yaml similarity index 100% rename from roles/insync/meta/main.yml rename to roles/insync/meta/main.yaml diff --git a/roles/insync/tasks/main.yml b/roles/insync/tasks/main.yaml similarity index 100% rename from roles/insync/tasks/main.yml rename to roles/insync/tasks/main.yaml diff --git a/roles/kvm/defaults/main.yml b/roles/kvm/defaults/main.yaml similarity index 100% rename from roles/kvm/defaults/main.yml rename to roles/kvm/defaults/main.yaml diff --git a/roles/kvm/kvm.md b/roles/kvm/kvm.md index 65fb6d5..1cf744f 100644 --- a/roles/kvm/kvm.md +++ b/roles/kvm/kvm.md @@ -28,7 +28,7 @@ The KVM role is disabled by default. Enable it in either of two ways: ``` * **Permanently (via vars file)** - Edit `group_vars/all.yml` and set + Edit `group_vars/all.yaml` and set ```yaml kvm_enabled: true ``` diff --git a/roles/kvm/tasks/bootloader.yml b/roles/kvm/tasks/bootloader.yaml similarity index 100% rename from roles/kvm/tasks/bootloader.yml rename to roles/kvm/tasks/bootloader.yaml diff --git a/roles/kvm/tasks/grub.yml b/roles/kvm/tasks/grub.yaml similarity index 100% rename from roles/kvm/tasks/grub.yml rename to roles/kvm/tasks/grub.yaml diff --git a/roles/kvm/tasks/main.yml b/roles/kvm/tasks/main.yaml similarity index 93% rename from roles/kvm/tasks/main.yml rename to roles/kvm/tasks/main.yaml index 0aaac4a..623afe1 100644 --- a/roles/kvm/tasks/main.yml +++ b/roles/kvm/tasks/main.yaml @@ -41,12 +41,12 @@ # GPU Passthrough Configuration (must run before bootloader) - name: Include GPU passthrough tasks - ansible.builtin.include_tasks: passthrough.yml + ansible.builtin.include_tasks: passthrough.yaml when: kvm_gpu_passthrough in ['bootbased', 'runtime'] # Configure Bootloader - name: Configure bootloader - ansible.builtin.import_tasks: bootloader.yml + ansible.builtin.import_tasks: bootloader.yaml # User Configuration - name: Add current user to libvirt groups @@ -66,4 +66,4 @@ state: started - name: Verify KVM installation - ansible.builtin.import_tasks: verify.yml + ansible.builtin.import_tasks: verify.yaml diff --git a/roles/kvm/tasks/passthrough.yml b/roles/kvm/tasks/passthrough.yaml similarity index 100% rename from roles/kvm/tasks/passthrough.yml rename to roles/kvm/tasks/passthrough.yaml diff --git a/roles/kvm/tasks/systemd.yml b/roles/kvm/tasks/systemd.yaml similarity index 100% rename from roles/kvm/tasks/systemd.yml rename to roles/kvm/tasks/systemd.yaml diff --git a/roles/kvm/tasks/verify.yml b/roles/kvm/tasks/verify.yaml similarity index 100% rename from roles/kvm/tasks/verify.yml rename to roles/kvm/tasks/verify.yaml diff --git a/roles/kvm/templates/gpu_passthrough_entry.j2 b/roles/kvm/templates/gpu_passthrough_entry.j2 index f808738..5dc3c1a 100644 --- a/roles/kvm/templates/gpu_passthrough_entry.j2 +++ b/roles/kvm/templates/gpu_passthrough_entry.j2 @@ -10,7 +10,7 @@ exec tail -n +3 $0 # # Variables available: # * item → ['group_id', 'vendor', 'vga_id(,audio_id)'] as produced -# by roles/kvm/tasks/passthrough.yml +# by roles/kvm/tasks/passthrough.yaml # * iommu_param → 'intel_iommu=on' or 'amd_iommu=on' (set in tasks/main) # ------------------------------------------------------------------ #} diff --git a/roles/kvm/vars/main.yml b/roles/kvm/vars/main.yaml similarity index 100% rename from roles/kvm/vars/main.yml rename to roles/kvm/vars/main.yaml diff --git a/roles/libreoffice/defaults/main.yml b/roles/libreoffice/defaults/main.yaml similarity index 100% rename from roles/libreoffice/defaults/main.yml rename to roles/libreoffice/defaults/main.yaml diff --git a/roles/libreoffice/tasks/main.yml b/roles/libreoffice/tasks/main.yaml similarity index 100% rename from roles/libreoffice/tasks/main.yml rename to roles/libreoffice/tasks/main.yaml diff --git a/roles/mainline/defaults/main.yml b/roles/mainline/defaults/main.yaml similarity index 100% rename from roles/mainline/defaults/main.yml rename to roles/mainline/defaults/main.yaml diff --git a/roles/mainline/tasks/main.yml b/roles/mainline/tasks/main.yaml similarity index 100% rename from roles/mainline/tasks/main.yml rename to roles/mainline/tasks/main.yaml diff --git a/roles/mangohud/defaults/main.yml b/roles/mangohud/defaults/main.yaml similarity index 100% rename from roles/mangohud/defaults/main.yml rename to roles/mangohud/defaults/main.yaml diff --git a/roles/mangohud/tasks/main.yml b/roles/mangohud/tasks/main.yaml similarity index 100% rename from roles/mangohud/tasks/main.yml rename to roles/mangohud/tasks/main.yaml diff --git a/roles/mattermost/defaults/main.yml b/roles/mattermost/defaults/main.yaml similarity index 100% rename from roles/mattermost/defaults/main.yml rename to roles/mattermost/defaults/main.yaml diff --git a/roles/mattermost/tasks/main.yml b/roles/mattermost/tasks/main.yaml similarity index 100% rename from roles/mattermost/tasks/main.yml rename to roles/mattermost/tasks/main.yaml diff --git a/roles/meld/defaults/main.yml b/roles/meld/defaults/main.yaml similarity index 100% rename from roles/meld/defaults/main.yml rename to roles/meld/defaults/main.yaml diff --git a/roles/meld/tasks/main.yml b/roles/meld/tasks/main.yaml similarity index 100% rename from roles/meld/tasks/main.yml rename to roles/meld/tasks/main.yaml diff --git a/roles/nautilus_plugins/defaults/main.yml b/roles/nautilus_plugins/defaults/main.yaml similarity index 100% rename from roles/nautilus_plugins/defaults/main.yml rename to roles/nautilus_plugins/defaults/main.yaml diff --git a/roles/nautilus_plugins/tasks/main.yml b/roles/nautilus_plugins/tasks/main.yaml similarity index 100% rename from roles/nautilus_plugins/tasks/main.yml rename to roles/nautilus_plugins/tasks/main.yaml diff --git a/roles/nodejs/defaults/main.yml b/roles/nodejs/defaults/main.yaml similarity index 100% rename from roles/nodejs/defaults/main.yml rename to roles/nodejs/defaults/main.yaml diff --git a/roles/nodejs/tasks/main.yml b/roles/nodejs/tasks/main.yaml similarity index 100% rename from roles/nodejs/tasks/main.yml rename to roles/nodejs/tasks/main.yaml diff --git a/roles/nordvpn/defaults/main.yml b/roles/nordvpn/defaults/main.yaml similarity index 100% rename from roles/nordvpn/defaults/main.yml rename to roles/nordvpn/defaults/main.yaml diff --git a/roles/nordvpn/tasks/main.yml b/roles/nordvpn/tasks/main.yaml similarity index 100% rename from roles/nordvpn/tasks/main.yml rename to roles/nordvpn/tasks/main.yaml diff --git a/roles/openjdk/defaults/main.yml b/roles/openjdk/defaults/main.yaml similarity index 100% rename from roles/openjdk/defaults/main.yml rename to roles/openjdk/defaults/main.yaml diff --git a/roles/openjdk/tasks/main.yml b/roles/openjdk/tasks/main.yaml similarity index 100% rename from roles/openjdk/tasks/main.yml rename to roles/openjdk/tasks/main.yaml diff --git a/roles/openjre/defaults/main.yml b/roles/openjre/defaults/main.yaml similarity index 100% rename from roles/openjre/defaults/main.yml rename to roles/openjre/defaults/main.yaml diff --git a/roles/openjre/tasks/main.yml b/roles/openjre/tasks/main.yaml similarity index 100% rename from roles/openjre/tasks/main.yml rename to roles/openjre/tasks/main.yaml diff --git a/roles/opentofu/defaults/main.yml b/roles/opentofu/defaults/main.yaml similarity index 100% rename from roles/opentofu/defaults/main.yml rename to roles/opentofu/defaults/main.yaml diff --git a/roles/opentofu/tasks/main.yml b/roles/opentofu/tasks/main.yaml similarity index 100% rename from roles/opentofu/tasks/main.yml rename to roles/opentofu/tasks/main.yaml diff --git a/roles/orcaslicer/defaults/main.yaml b/roles/orcaslicer/defaults/main.yaml new file mode 100644 index 0000000..9b45ecd --- /dev/null +++ b/roles/orcaslicer/defaults/main.yaml @@ -0,0 +1,24 @@ +--- +orcaslicer_enabled: true + +orcaslicer: + # If true installs the nightly bundle; if false installs stable (latest or pinned version). + nightly: false + + # "system" or "user" + method: system + + # Stable only: "latest" (default) or a specific version like "2.3.1" + version: latest + + # If true and OrcaSlicer is already installed, uninstall it first then reinstall. + force_reinstall: false + + # Official GitHub repo used for the release API and assets + github_repo: OrcaSlicer/OrcaSlicer + + # Flatpak app-id inside the bundle (used for idempotency check + uninstall) + app_id: io.github.softfever.OrcaSlicer + +# Temporary download folder +orcaslicer_tmp_dir: /tmp/orcaslicer-flatpak diff --git a/roles/sweethome3d/meta/main.yml b/roles/orcaslicer/meta/main.yaml similarity index 100% rename from roles/sweethome3d/meta/main.yml rename to roles/orcaslicer/meta/main.yaml diff --git a/roles/orcaslicer/tasks/main.yaml b/roles/orcaslicer/tasks/main.yaml new file mode 100644 index 0000000..5921e46 --- /dev/null +++ b/roles/orcaslicer/tasks/main.yaml @@ -0,0 +1,258 @@ +--- +- name: "OrcaSlicer | Validate configuration" + ansible.builtin.assert: + that: + - orcaslicer is mapping + - orcaslicer.method is defined + - orcaslicer.method in ["system", "user"] + - orcaslicer.github_repo is defined + - (orcaslicer.github_repo | length) > 0 + - orcaslicer.app_id is defined + - (orcaslicer.app_id | length) > 0 + - orcaslicer.nightly is defined + - orcaslicer.force_reinstall is defined + - orcaslicer.version is defined + - (orcaslicer.version | length) > 0 + - orcaslicer_tmp_dir is defined + - (orcaslicer_tmp_dir | length) > 0 + fail_msg: "Invalid or incomplete OrcaSlicer role configuration." + +- name: "OrcaSlicer | Compute Flatpak scope option" + ansible.builtin.set_fact: + _orcaslicer_scope_opt: "{{ '--system' if orcaslicer.method == 'system' else '--user' }}" + changed_when: false + +- name: "OrcaSlicer | Normalize force_reinstall flag" + ansible.builtin.set_fact: + _orcaslicer_force_reinstall: "{{ (orcaslicer.force_reinstall | default(false)) | bool }}" + changed_when: false + +- name: "OrcaSlicer | Check whether app is already installed" + ansible.builtin.command: + argv: + - flatpak + - info + - "{{ _orcaslicer_scope_opt }}" + - "{{ orcaslicer.app_id }}" + register: _orcaslicer_info + changed_when: false + failed_when: false + +- name: "OrcaSlicer | Decide whether to install" + ansible.builtin.set_fact: + _orcaslicer_is_installed: "{{ _orcaslicer_info.rc == 0 }}" + _orcaslicer_do_install: "{{ (_orcaslicer_info.rc != 0) or _orcaslicer_force_reinstall }}" + changed_when: false + +- name: "OrcaSlicer | Uninstall existing app (force reinstall)" + become: "{{ orcaslicer.method == 'system' }}" + ansible.builtin.command: + argv: + - flatpak + - uninstall + - -y + - "{{ _orcaslicer_scope_opt }}" + - "{{ orcaslicer.app_id }}" + register: _orcaslicer_uninstall + when: + - _orcaslicer_force_reinstall + - _orcaslicer_is_installed + changed_when: true + failed_when: _orcaslicer_uninstall.rc != 0 + +- name: "OrcaSlicer | Ensure temporary directory exists" + ansible.builtin.file: + path: "{{ orcaslicer_tmp_dir }}" + state: directory + mode: "0755" + when: _orcaslicer_do_install + +- name: "OrcaSlicer | Map architecture token" + ansible.builtin.set_fact: + _orcaslicer_arch_tokens: "{{ {'x86_64': ['x86_64','amd64'], 'aarch64': ['aarch64','arm64']}.get(ansible_architecture, [ansible_architecture]) }}" + when: _orcaslicer_do_install + changed_when: false + +# ------------------------- +# Nightly bundle selection +# ------------------------- +- name: "OrcaSlicer | Nightly - fetch releases list" + ansible.builtin.uri: + url: "https://api.github.com/repos/{{ orcaslicer.github_repo }}/releases" + return_content: true + headers: + Accept: "application/vnd.github+json" + register: _orcaslicer_releases_resp + when: + - _orcaslicer_do_install + - orcaslicer.nightly | bool + changed_when: false + +- name: "OrcaSlicer | Nightly - extract tag/assets from most recent prerelease" + ansible.builtin.set_fact: + _orcaslicer_release_tag: >- + {{ + ( + (_orcaslicer_releases_resp.json | default([])) + | selectattr('prerelease', 'equalto', true) + | map(attribute='tag_name') + | list + | first + ) | default('unknown') + }} + _orcaslicer_release_assets: >- + {{ + ( + (_orcaslicer_releases_resp.json | default([])) + | selectattr('prerelease', 'equalto', true) + | map(attribute='assets') + | list + | first + ) | default([]) + }} + when: + - _orcaslicer_do_install + - orcaslicer.nightly | bool + changed_when: false + +# ------------------------- +# Stable bundle selection +# ------------------------- +- name: "OrcaSlicer | Stable - compute tag for pinned versions" + ansible.builtin.set_fact: + _orcaslicer_version_tag: "{{ (orcaslicer.version if (orcaslicer.version | string).startswith('v') else ('v' ~ (orcaslicer.version | string))) }}" + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + - orcaslicer.version != "latest" + changed_when: false + +- name: "OrcaSlicer | Stable - fetch release JSON (latest)" + ansible.builtin.uri: + url: "https://api.github.com/repos/{{ orcaslicer.github_repo }}/releases/latest" + return_content: true + headers: + Accept: "application/vnd.github+json" + register: _orcaslicer_release_latest_resp + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + - orcaslicer.version == "latest" + changed_when: false + +- name: "OrcaSlicer | Stable - compute tag for pinned versions" + ansible.builtin.set_fact: + _orcaslicer_version_tag: "{{ (orcaslicer.version if (orcaslicer.version | string).startswith('v') else ('v' ~ (orcaslicer.version | string))) }}" + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + - orcaslicer.version != "latest" + changed_when: false + +- name: "OrcaSlicer | Stable - fetch release JSON (pinned tag)" + ansible.builtin.uri: + url: "https://api.github.com/repos/{{ orcaslicer.github_repo }}/releases/tags/{{ _orcaslicer_version_tag }}" + return_content: true + headers: + Accept: "application/vnd.github+json" + register: _orcaslicer_release_pinned_resp + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + - orcaslicer.version != "latest" + changed_when: false + +- name: "OrcaSlicer | Stable - select release JSON object" + ansible.builtin.set_fact: + _orcaslicer_release_json: >- + {{ + (_orcaslicer_release_latest_resp.json + if orcaslicer.version == "latest" + else _orcaslicer_release_pinned_resp.json) + | default({}) + }} + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + changed_when: false + +- name: "OrcaSlicer | Stable - extract tag/assets from release response" + ansible.builtin.set_fact: + _orcaslicer_release_tag: "{{ _orcaslicer_release_json.tag_name | default('unknown') }}" + _orcaslicer_release_assets: "{{ _orcaslicer_release_json.assets | default([]) }}" + when: + - _orcaslicer_do_install + - not (orcaslicer.nightly | bool) + changed_when: false + +# ------------------------- +# Asset selection (both) +# ------------------------- +- name: "OrcaSlicer | Determine flatpak arch token" + ansible.builtin.set_fact: + _orcaslicer_flatpak_arch: >- + {{ + 'x86_64' if (ansible_facts.architecture in ['x86_64', 'amd64']) + else 'aarch64' if (ansible_facts.architecture in ['aarch64', 'arm64']) + else ansible_facts.architecture + }} + changed_when: false + +- name: "OrcaSlicer | Pick flatpak asset from release" + ansible.builtin.set_fact: + _orcaslicer_asset: >- + {{ + ( + _orcaslicer_release_assets + | selectattr('name', 'search', '\.flatpak$') + | selectattr('name', 'search', _orcaslicer_flatpak_arch) + | list + | first + ) | default({}) + }} + changed_when: false + +- name: "OrcaSlicer | Fail if flatpak asset not found" + ansible.builtin.fail: + msg: >- + Could not find a .flatpak bundle asset for this release. + Release: {{ _orcaslicer_release_tag }} + Nightly: {{ orcaslicer.nightly | bool }} + Repo: {{ orcaslicer.github_repo }} + when: + - _orcaslicer_do_install + - (_orcaslicer_asset | length) == 0 or (_orcaslicer_asset.browser_download_url is not defined) + +- name: "OrcaSlicer | Set bundle URL and local path" + ansible.builtin.set_fact: + _orcaslicer_bundle_url: "{{ _orcaslicer_asset.browser_download_url }}" + _orcaslicer_bundle_path: "{{ orcaslicer_tmp_dir }}/{{ _orcaslicer_asset.name }}" + when: _orcaslicer_do_install + changed_when: false + +- name: "OrcaSlicer | Download .flatpak bundle" + ansible.builtin.get_url: + url: "{{ _orcaslicer_bundle_url }}" + dest: "{{ _orcaslicer_bundle_path }}" + mode: "0644" + when: _orcaslicer_do_install + +- name: "OrcaSlicer | Install from local bundle" + become: "{{ orcaslicer.method == 'system' }}" + ansible.builtin.command: + argv: + - flatpak + - install + - -y + - "{{ _orcaslicer_scope_opt }}" + - "{{ _orcaslicer_bundle_path }}" + register: _orcaslicer_install + when: _orcaslicer_do_install + changed_when: true + failed_when: _orcaslicer_install.rc != 0 + +- name: "OrcaSlicer | Cleanup temporary directory" + ansible.builtin.file: + path: "{{ orcaslicer_tmp_dir }}" + state: absent + when: _orcaslicer_do_install diff --git a/roles/pipx/defaults/main.yml b/roles/pipx/defaults/main.yaml similarity index 100% rename from roles/pipx/defaults/main.yml rename to roles/pipx/defaults/main.yaml diff --git a/roles/pipx/tasks/main.yml b/roles/pipx/tasks/main.yaml similarity index 100% rename from roles/pipx/tasks/main.yml rename to roles/pipx/tasks/main.yaml diff --git a/roles/python/defaults/main.yml b/roles/python/defaults/main.yaml similarity index 100% rename from roles/python/defaults/main.yml rename to roles/python/defaults/main.yaml diff --git a/roles/python/tasks/main.yml b/roles/python/tasks/main.yaml similarity index 100% rename from roles/python/tasks/main.yml rename to roles/python/tasks/main.yaml diff --git a/roles/slack/defaults/main.yml b/roles/slack/defaults/main.yaml similarity index 100% rename from roles/slack/defaults/main.yml rename to roles/slack/defaults/main.yaml diff --git a/roles/slack/meta/main.yml b/roles/slack/meta/main.yaml similarity index 100% rename from roles/slack/meta/main.yml rename to roles/slack/meta/main.yaml diff --git a/roles/slack/tasks/main.yml b/roles/slack/tasks/main.yaml similarity index 100% rename from roles/slack/tasks/main.yml rename to roles/slack/tasks/main.yaml diff --git a/roles/snapd/defaults/main.yml b/roles/snapd/defaults/main.yaml similarity index 100% rename from roles/snapd/defaults/main.yml rename to roles/snapd/defaults/main.yaml diff --git a/roles/snapd/tasks/main.yml b/roles/snapd/tasks/main.yaml similarity index 100% rename from roles/snapd/tasks/main.yml rename to roles/snapd/tasks/main.yaml diff --git a/roles/steam/defaults/main.yml b/roles/steam/defaults/main.yaml similarity index 100% rename from roles/steam/defaults/main.yml rename to roles/steam/defaults/main.yaml diff --git a/roles/steam/tasks/main.yml b/roles/steam/tasks/main.yaml similarity index 100% rename from roles/steam/tasks/main.yml rename to roles/steam/tasks/main.yaml diff --git a/roles/sweethome3d/defaults/main.yml b/roles/sweethome3d/defaults/main.yaml similarity index 100% rename from roles/sweethome3d/defaults/main.yml rename to roles/sweethome3d/defaults/main.yaml diff --git a/roles/sweethome3d/meta/main.yaml b/roles/sweethome3d/meta/main.yaml new file mode 100644 index 0000000..abcde07 --- /dev/null +++ b/roles/sweethome3d/meta/main.yaml @@ -0,0 +1,3 @@ +--- +dependencies: + - { role: flatpak } diff --git a/roles/sweethome3d/tasks/main.yml b/roles/sweethome3d/tasks/main.yaml similarity index 100% rename from roles/sweethome3d/tasks/main.yml rename to roles/sweethome3d/tasks/main.yaml diff --git a/roles/tflint/defaults/main.yml b/roles/tflint/defaults/main.yaml similarity index 100% rename from roles/tflint/defaults/main.yml rename to roles/tflint/defaults/main.yaml diff --git a/roles/tflint/meta/main.yml b/roles/tflint/meta/main.yaml similarity index 100% rename from roles/tflint/meta/main.yml rename to roles/tflint/meta/main.yaml diff --git a/roles/tflint/tasks/main.yml b/roles/tflint/tasks/main.yaml similarity index 100% rename from roles/tflint/tasks/main.yml rename to roles/tflint/tasks/main.yaml diff --git a/roles/three_d_printing/defaults/main.yaml b/roles/three_d_printing/defaults/main.yaml new file mode 100644 index 0000000..3754453 --- /dev/null +++ b/roles/three_d_printing/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +three_d_printing_enabled: true diff --git a/roles/timeshift/defaults/main.yml b/roles/timeshift/defaults/main.yaml similarity index 100% rename from roles/timeshift/defaults/main.yml rename to roles/timeshift/defaults/main.yaml diff --git a/roles/timeshift/tasks/main.yml b/roles/timeshift/tasks/main.yaml similarity index 100% rename from roles/timeshift/tasks/main.yml rename to roles/timeshift/tasks/main.yaml diff --git a/roles/trezor_suite/defaults/main.yml b/roles/trezor_suite/defaults/main.yaml similarity index 100% rename from roles/trezor_suite/defaults/main.yml rename to roles/trezor_suite/defaults/main.yaml diff --git a/roles/trezor_suite/handlers/main.yml b/roles/trezor_suite/handlers/main.yaml similarity index 100% rename from roles/trezor_suite/handlers/main.yml rename to roles/trezor_suite/handlers/main.yaml diff --git a/roles/trezor_suite/tasks/main.yml b/roles/trezor_suite/tasks/main.yaml similarity index 100% rename from roles/trezor_suite/tasks/main.yml rename to roles/trezor_suite/tasks/main.yaml diff --git a/roles/ufw/defaults/main.yml b/roles/ufw/defaults/main.yaml similarity index 100% rename from roles/ufw/defaults/main.yml rename to roles/ufw/defaults/main.yaml diff --git a/roles/ufw/handlers/main.yml b/roles/ufw/handlers/main.yaml similarity index 100% rename from roles/ufw/handlers/main.yml rename to roles/ufw/handlers/main.yaml diff --git a/roles/ufw/tasks/main.yml b/roles/ufw/tasks/main.yaml similarity index 100% rename from roles/ufw/tasks/main.yml rename to roles/ufw/tasks/main.yaml diff --git a/roles/ulauncher/defaults/main.yml b/roles/ulauncher/defaults/main.yaml similarity index 100% rename from roles/ulauncher/defaults/main.yml rename to roles/ulauncher/defaults/main.yaml diff --git a/roles/ulauncher/tasks/main.yml b/roles/ulauncher/tasks/main.yaml similarity index 100% rename from roles/ulauncher/tasks/main.yml rename to roles/ulauncher/tasks/main.yaml diff --git a/roles/vagrant/defaults/main.yml b/roles/vagrant/defaults/main.yaml similarity index 100% rename from roles/vagrant/defaults/main.yml rename to roles/vagrant/defaults/main.yaml diff --git a/roles/vagrant/meta/main.yml b/roles/vagrant/meta/main.yaml similarity index 100% rename from roles/vagrant/meta/main.yml rename to roles/vagrant/meta/main.yaml diff --git a/roles/vagrant/tasks/main.yml b/roles/vagrant/tasks/main.yaml similarity index 100% rename from roles/vagrant/tasks/main.yml rename to roles/vagrant/tasks/main.yaml diff --git a/roles/virtualbox/defaults/main.yml b/roles/virtualbox/defaults/main.yaml similarity index 100% rename from roles/virtualbox/defaults/main.yml rename to roles/virtualbox/defaults/main.yaml diff --git a/roles/virtualbox/tasks/main.yml b/roles/virtualbox/tasks/main.yaml similarity index 100% rename from roles/virtualbox/tasks/main.yml rename to roles/virtualbox/tasks/main.yaml diff --git a/roles/vlc/defaults/main.yml b/roles/vlc/defaults/main.yaml similarity index 100% rename from roles/vlc/defaults/main.yml rename to roles/vlc/defaults/main.yaml diff --git a/roles/vlc/tasks/main.yml b/roles/vlc/tasks/main.yaml similarity index 100% rename from roles/vlc/tasks/main.yml rename to roles/vlc/tasks/main.yaml diff --git a/roles/work/defaults/main.yml b/roles/work/defaults/main.yaml similarity index 100% rename from roles/work/defaults/main.yml rename to roles/work/defaults/main.yaml diff --git a/roles/xfburn/defaults/main.yml b/roles/xfburn/defaults/main.yaml similarity index 100% rename from roles/xfburn/defaults/main.yml rename to roles/xfburn/defaults/main.yaml diff --git a/roles/xfburn/tasks/main.yml b/roles/xfburn/tasks/main.yaml similarity index 100% rename from roles/xfburn/tasks/main.yml rename to roles/xfburn/tasks/main.yaml diff --git a/roles/zoom/defaults/main.yml b/roles/zoom/defaults/main.yaml similarity index 100% rename from roles/zoom/defaults/main.yml rename to roles/zoom/defaults/main.yaml diff --git a/roles/zoom/tasks/main.yml b/roles/zoom/tasks/main.yaml similarity index 100% rename from roles/zoom/tasks/main.yml rename to roles/zoom/tasks/main.yaml diff --git a/scripts/bootstrap-mk-common.sh b/scripts/bootstrap-mk-common.sh new file mode 100755 index 0000000..d75688b --- /dev/null +++ b/scripts/bootstrap-mk-common.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +set -euo pipefail + +MK_REPO="${1:?MK repo (e.g. leinardi/make-common) required}" +VERSION="${2:?version (e.g. v1.2.0 or latest) required}" +MK_DIR="${3:?target .mk directory required}" +FILES="${4:?list of .mk files required}" + +# Mode: normal bootstrap vs update +MK_UPDATE_MODE="${MK_COMMON_UPDATE:-0}" + +# Resolve repo root (so Makefile can live anywhere in the repo) +REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" + +SCRIPT_PATH="${REPO_ROOT}/scripts/bootstrap-mk-common.sh" + +# Normalise MK_DIR and derive version file +MK_DIR="${MK_DIR%/}" +MK_VERSION_FILE="${MK_DIR}/.mk-common-version" +EXPECTED="${MK_REPO}@${VERSION}" + +NEED_REFRESH=0 +STORED_EXPECTED="" +STORED_SHA="" +REMOTE_SHA="" + +# Read existing version file, if any: format "@ [sha]" +if [[ -f "${MK_VERSION_FILE}" ]]; then + IFS=' ' read -r STORED_EXPECTED STORED_SHA < "${MK_VERSION_FILE}" || true +fi + +if [[ "${MK_UPDATE_MODE}" = "1" ]]; then + # --------------------------------------------------------------------------- + # UPDATE MODE: go online, compare remote SHA, refresh only if changed + # --------------------------------------------------------------------------- + REMOTE_URL="https://github.com/${MK_REPO}.git" + REMOTE_SHA="$(git ls-remote "${REMOTE_URL}" "${VERSION}" 2>/dev/null | awk 'NR==1 {print $1}')" + + if [[ -z "${REMOTE_SHA}" ]]; then + echo "[mk] ERROR: could not resolve '${VERSION}' in ${REMOTE_URL}" >&2 + echo "[mk] Check MK_COMMON_VERSION or your network connection." >&2 + exit 1 + fi + + # Decide if we need to refresh: + # - tag name changed + # - or no stored SHA (first time / old format) + # - or stored SHA != remote SHA (mutable tag/branch moved) + if [[ "${STORED_EXPECTED}" != "${EXPECTED}" ]] \ + || [[ -z "${STORED_SHA}" ]] \ + || [[ "${STORED_SHA}" != "${REMOTE_SHA}" ]]; then + NEED_REFRESH=1 + fi + + if [[ "${NEED_REFRESH}" -eq 0 ]]; then + echo "[mk] Shared makefiles already up to date for ${EXPECTED} (${REMOTE_SHA})" >&2 + exit 0 + fi +else + # --------------------------------------------------------------------------- + # NORMAL MODE: only compare tag string + ensure files exist + # --------------------------------------------------------------------------- + if [[ -z "${STORED_EXPECTED}" ]] || [[ "${STORED_EXPECTED}" != "${EXPECTED}" ]]; then + NEED_REFRESH=1 + fi + + # Also refresh if any requested .mk file is missing + if [[ "${NEED_REFRESH}" -eq 0 ]]; then + for f in ${FILES}; do + if [[ ! -f "${MK_DIR}/${f}" ]]; then + NEED_REFRESH=1 + break + fi + done + fi +fi + +# --------------------------------------------------------------------------- +# Refresh: update script + .mk files, write version file, re-exec +# --------------------------------------------------------------------------- + +if [[ "${NEED_REFRESH}" -eq 1 ]]; then + echo "[mk] Updating bootstrap-mk-common.sh and .mk files from ${MK_REPO}@${VERSION}" >&2 + mkdir -p "${REPO_ROOT}/scripts" "${MK_DIR}" + + # If we don't already know REMOTE_SHA (normal mode), resolve it now. + # This only happens when we are *already* going online to download files. + if [[ -z "${REMOTE_SHA}" ]]; then + REMOTE_URL="https://github.com/${MK_REPO}.git" + REMOTE_SHA="$(git ls-remote "${REMOTE_URL}" "${VERSION}" 2>/dev/null | awk 'NR==1 {print $1}')" + if [[ -z "${REMOTE_SHA}" ]]; then + echo "[mk] WARNING: could not resolve SHA for ${EXPECTED};" \ + "version file will not contain a SHA." >&2 + fi + fi + + # Fetch the script itself from the tagged ref + curl -fsSL \ + "https://raw.githubusercontent.com/${MK_REPO}/${VERSION}/scripts/bootstrap-mk-common.sh" \ + -o "${SCRIPT_PATH}" + chmod +x "${SCRIPT_PATH}" + + # Fetch all requested .mk files + for f in ${FILES}; do + echo "[mk] Fetching ${f} from ${MK_REPO}@${VERSION}" >&2 + curl -fsSL \ + "https://raw.githubusercontent.com/${MK_REPO}/${VERSION}/.mk/${f}" \ + -o "${MK_DIR}/${f}" + done + + # Store "@ " (sha may be empty only if resolution failed) + if [[ -n "${REMOTE_SHA}" ]]; then + printf '%s %s\n' "${EXPECTED}" "${REMOTE_SHA}" > "${MK_VERSION_FILE}" + else + printf '%s\n' "${EXPECTED}" > "${MK_VERSION_FILE}" + fi + + # Re-exec the freshly downloaded script so any new logic applies immediately + exec "${SCRIPT_PATH}" "$@" +fi + +# If we reach here in normal mode, script + .mk files are already up to date. +# Nothing else to do; Make just needed us for our side effects.