From a5a60f5ab77762a7a0b6e1df4d417eabe9c78d58 Mon Sep 17 00:00:00 2001 From: jalr Date: Sat, 15 May 2021 17:41:10 +0200 Subject: [PATCH 01/36] Update google fonts download url --- packer/ansible/roles/fonts/tasks/google.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/ansible/roles/fonts/tasks/google.yml b/packer/ansible/roles/fonts/tasks/google.yml index e5d5e60..aaacf73 100644 --- a/packer/ansible/roles/fonts/tasks/google.yml +++ b/packer/ansible/roles/fonts/tasks/google.yml @@ -6,6 +6,6 @@ - name: install google fonts unarchive: - src: https://github.com/google/fonts/archive/master.tar.gz + src: https://github.com/google/fonts/archive/main.zip dest: /usr/local/share/fonts/google/ remote_src: yes From 7de5bf2a041d4406c4cc241ac26625e60f9acbf9 Mon Sep 17 00:00:00 2001 From: Simon Bruder Date: Sun, 18 Jul 2021 11:04:20 +0200 Subject: [PATCH 02/36] Fix packer not being found in builder image --- builder/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/Dockerfile b/builder/Dockerfile index 6518d0e..f5fbfa7 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -11,7 +11,7 @@ RUN apk add --no-cache \ openssl \ rsync \ squashfs-tools \ - && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ + && echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \ && apk add --no-cache \ packer From 49f8c7879dce62a838d860ac7a5f8837f0a70c9c Mon Sep 17 00:00:00 2001 From: jalr Date: Wed, 22 Dec 2021 19:10:39 +0000 Subject: [PATCH 03/36] Update to Debian bullseye --- .gitlab-ci.yml | 2 +- Makefile | 30 +++++++++---------- ...ebian-buster.yaml => debian-bullseye.yaml} | 2 +- security-scanner/Dockerfile | 2 +- txt.cfg | 4 +-- 5 files changed, 20 insertions(+), 20 deletions(-) rename packer/{debian-buster.yaml => debian-bullseye.yaml} (99%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6645dda..89ef603 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,7 +74,7 @@ security_scanner: services: - docker:dind script: - - scripts/packer.sh debian-buster + - scripts/packer.sh debian-bullseye - aws --endpoint-url "$AWS_ENDPOINT_URL" s3 cp images/ "s3://$AWS_BUCKET/$CI_COMMIT_REF_SLUG/$CI_JOB_ID/" --recursive --no-progress artifacts: paths: diff --git a/Makefile b/Makefile index 81da0f7..b201b6e 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ qemu_network = 10.2.2.0 qemu_netmask = 24 qemu_vm_ip = 10.2.2.10 qemu_disk = tmp/qemu-disk.img -qemu_target ?= debian-buster +qemu_target ?= debian-bullseye qemu_kernel = $(qemu_target).linux qemu_torrent = $(qemu_target).torrent qemu_initramfs = $(shell \ @@ -35,7 +35,7 @@ fi \ ci_environment=$(shell env | sed -n 's/^\(CI_.*\)=.*/-e \1/p') .PHONY: default -default: builderimg images/debian-buster.squashfs +default: builderimg images/debian-bullseye.squashfs .PHONY: clean clean: @@ -60,7 +60,7 @@ images: [ ! -d "$@" ] && mkdir "$@" touch "$@" -images/debian-buster.squashfs: images +images/debian-bullseye.squashfs: images docker run \ --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ @@ -72,9 +72,9 @@ images/debian-buster.squashfs: images $(ci_environment) \ "$(DOCKER_IMAGE_BUILDER)" \ scripts/packer.sh \ - debian-buster + debian-bullseye -images/debian-buster.torrent: images +images/debian-bullseye.torrent: images docker run \ --rm \ -v "${PWD}:${PWD}" \ @@ -82,7 +82,7 @@ images/debian-buster.torrent: images -e "WEBSEED=$(WEBSEED)" \ "$(DOCKER_IMAGE_BUILDER)" \ scripts/torrent.sh \ - debian-buster + debian-bullseye .PHONY: ansible ansible: @@ -104,24 +104,24 @@ ansible: # updates the initramfs # only used for development -images/debian-buster.initramfs.dev: tmp/initramfs-extracted/debian-buster packer/initramfs/labsync - cp packer/initramfs/labsync tmp/initramfs-extracted/debian-buster/scripts/labsync - (cd tmp/initramfs-extracted/debian-buster && find . | cpio -H newc -o | gzip > $(CWD)/images/debian-buster.initramfs.dev) +images/debian-bullseye.initramfs.dev: tmp/initramfs-extracted/debian-bullseye packer/initramfs/labsync + cp packer/initramfs/labsync tmp/initramfs-extracted/debian-bullseye/scripts/labsync + (cd tmp/initramfs-extracted/debian-bullseye && find . | cpio -H newc -o | gzip > $(CWD)/images/debian-bullseye.initramfs.dev) tmp: [ ! -d "$@" ] && mkdir "$@" || true -tmp/initramfs-extracted/debian-buster: images/debian-buster.initramfs - rm -rf tmp/initramfs-extracted/debian-buster - mkdir -p tmp/initramfs-extracted/debian-buster - (cd tmp/initramfs-extracted/debian-buster && zcat "$(CWD)/images/debian-buster.initramfs" | cpio -i) - touch tmp/initramfs-extracted/debian-buster +tmp/initramfs-extracted/debian-bullseye: images/debian-bullseye.initramfs + rm -rf tmp/initramfs-extracted/debian-bullseye + mkdir -p tmp/initramfs-extracted/debian-bullseye + (cd tmp/initramfs-extracted/debian-bullseye && zcat "$(CWD)/images/debian-bullseye.initramfs" | cpio -i) + touch tmp/initramfs-extracted/debian-bullseye $(qemu_disk): tmp qemu-img create "$@" 20G tmp/netboot.tar.gz: tmp - wget -c -O "$@" https://cdn-aws.deb.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/netboot.tar.gz + wget -c -O "$@" https://cdn-aws.deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz touch "$@" tmp/tftproot: tmp/netboot.tar.gz diff --git a/packer/debian-buster.yaml b/packer/debian-bullseye.yaml similarity index 99% rename from packer/debian-buster.yaml rename to packer/debian-bullseye.yaml index 9a765d7..7e02bc1 100644 --- a/packer/debian-buster.yaml +++ b/packer/debian-bullseye.yaml @@ -20,7 +20,7 @@ variables: builders: - discard: true - image: debian:buster + image: debian:bullseye type: docker volumes: '{{user `images`}}': /tmp/images diff --git a/security-scanner/Dockerfile b/security-scanner/Dockerfile index 3b1eb74..677e003 100644 --- a/security-scanner/Dockerfile +++ b/security-scanner/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster-slim +FROM debian:bullseye-slim RUN apt-get update \ && apt-get -y install \ diff --git a/txt.cfg b/txt.cfg index 2f544a4..1cfc6a4 100644 --- a/txt.cfg +++ b/txt.cfg @@ -1,7 +1,7 @@ label labsync menu label ^labsync - kernel images/debian-buster.linux - append initrd=images/debian-buster.initramfs.dev boot=labsync labsync_disk=sda labsync_partsize_boot=512 labsync_torrent=http://10.2.2.1/debian-buster.torrent quiet vga=792 ip=10.2.2.10:::255.255.255.0:qemu-host:ens3:off labsync_wait=pause + kernel images/debian-bullseye.linux + append initrd=images/debian-bullseye.initramfs.dev boot=labsync labsync_disk=sda labsync_partsize_boot=512 labsync_torrent=http://10.2.2.1/debian-bullseye.torrent quiet vga=792 ip=10.2.2.10:::255.255.255.0:qemu-host:ens3:off labsync_wait=pause label install menu label ^Install From 8519cbbd05358254ae77fc835b6bdd4eb17f4411 Mon Sep 17 00:00:00 2001 From: jalr Date: Wed, 22 Dec 2021 19:37:28 +0000 Subject: [PATCH 04/36] Allow rsa keys for ssh --- packer/debian-bullseye.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packer/debian-bullseye.yaml b/packer/debian-bullseye.yaml index 7e02bc1..aa82551 100644 --- a/packer/debian-bullseye.yaml +++ b/packer/debian-bullseye.yaml @@ -65,6 +65,8 @@ provisioners: - playbook_file: ansible/playbook.yml type: ansible user: root + ansible_env_vars: + - "ANSIBLE_SSH_ARGS='-o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa'" - inline: - rm /boot && mkdir /boot type: shell From fdc0441013083df1a3d8d758d7fcdc1ecec70235 Mon Sep 17 00:00:00 2001 From: jalr Date: Wed, 22 Dec 2021 20:06:07 +0000 Subject: [PATCH 05/36] Use python3 for ansible --- packer/ansible/roles/packages/tasks/sources.yml | 4 ++-- packer/debian-bullseye.yaml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packer/ansible/roles/packages/tasks/sources.yml b/packer/ansible/roles/packages/tasks/sources.yml index 0392177..ee35322 100644 --- a/packer/ansible/roles/packages/tasks/sources.yml +++ b/packer/ansible/roles/packages/tasks/sources.yml @@ -1,7 +1,7 @@ --- -- name: install python-apt +- name: install python3-apt apt: - name: "python-apt" + name: "python3-apt" state: present - name: clear sources.list diff --git a/packer/debian-bullseye.yaml b/packer/debian-bullseye.yaml index aa82551..01c8f8a 100644 --- a/packer/debian-bullseye.yaml +++ b/packer/debian-bullseye.yaml @@ -67,6 +67,7 @@ provisioners: user: root ansible_env_vars: - "ANSIBLE_SSH_ARGS='-o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa'" + - "ANSIBLE_PYTHON_INTERPRETER=/usr/bin/python3" - inline: - rm /boot && mkdir /boot type: shell From e5fe1ea800d6b5dc74f0b86f79e714f4401ec9ec Mon Sep 17 00:00:00 2001 From: jalr Date: Wed, 22 Dec 2021 21:34:21 +0000 Subject: [PATCH 06/36] Change debian-security source --- packer/ansible/roles/packages/tasks/sources.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/ansible/roles/packages/tasks/sources.yml b/packer/ansible/roles/packages/tasks/sources.yml index ee35322..9655549 100644 --- a/packer/ansible/roles/packages/tasks/sources.yml +++ b/packer/ansible/roles/packages/tasks/sources.yml @@ -26,5 +26,5 @@ - name: configure security updates repo apt_repository: filename: "{{ ansible_lsb.codename }}-security" - repo: "deb {{ debian_mirror_security }} {{ ansible_lsb.codename }}/updates {{ debian_sections | join(' ') }}" + repo: "deb {{ debian_mirror_security }}/debian-security/ {{ ansible_lsb.codename }}-security {{ debian_sections | join(' ') }}" state: present From cccc411fab2c6fea997900062750e3a4245b1d0e Mon Sep 17 00:00:00 2001 From: jalr Date: Wed, 22 Dec 2021 21:48:48 +0000 Subject: [PATCH 07/36] Replace package `python-usb` with `python3-usb` --- packer/ansible/roles/inkscape/tasks/silhouette.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packer/ansible/roles/inkscape/tasks/silhouette.yml b/packer/ansible/roles/inkscape/tasks/silhouette.yml index 001291b..5dee3e1 100644 --- a/packer/ansible/roles/inkscape/tasks/silhouette.yml +++ b/packer/ansible/roles/inkscape/tasks/silhouette.yml @@ -1,8 +1,8 @@ --- -- name: install python-usb and usbip +- name: install python3-usb and usbip apt: name: - - python-usb + - python3-usb - usbip state: present From aa2072c11da5cc18cacc4fb0e9ecd6bd9d65fd39 Mon Sep 17 00:00:00 2001 From: jalr Date: Tue, 28 Dec 2021 01:43:00 +0000 Subject: [PATCH 08/36] Use python3 compatible inkscape-silhouette plugin --- packer/ansible/roles/inkscape/files/inkscape-silhouette | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/ansible/roles/inkscape/files/inkscape-silhouette b/packer/ansible/roles/inkscape/files/inkscape-silhouette index 8afe49a..05d9c57 160000 --- a/packer/ansible/roles/inkscape/files/inkscape-silhouette +++ b/packer/ansible/roles/inkscape/files/inkscape-silhouette @@ -1 +1 @@ -Subproject commit 8afe49a2a52bb13bb2a34331e7c9625fb05529bf +Subproject commit 05d9c57336b13028c01c5bfd850431708c934016 From 6174d4beace827cf3bd0d26363175cc1418cc760 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Tue, 4 Jan 2022 17:01:24 +0000 Subject: [PATCH 09/36] Fix missing sfdisk binary in initramfs It's now part of `fdisk` package --- packer/debian-bullseye.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packer/debian-bullseye.yaml b/packer/debian-bullseye.yaml index 01c8f8a..8ac119d 100644 --- a/packer/debian-bullseye.yaml +++ b/packer/debian-bullseye.yaml @@ -40,12 +40,14 @@ provisioners: - echo "LABSYNC_COMMIT_REF_SLUG='{{user `ci_commit_ref_slug`}}'" >> /etc/environment - echo "LABSYNC_PROJECT_URL='{{user `ci_project_url`}}'" >> /etc/environment - sed -i 's#@@PROJECT_URL@@#{{user `ci_project_url`}}#' /etc/initramfs-tools/scripts/labsync + - chmod +x /etc/initramfs-tools/scripts/labsync type: shell - destination: /etc/initramfs-tools/scripts/local-premount/ source: initramfs/labsync-prereqs type: file - inline: - set -x + - chmod +x /etc/initramfs-tools/scripts/local-premount/labsync-prereqs - apt-get update - apt-get -y dist-upgrade - rmdir /boot && ln -s /usr/local/boot /boot @@ -54,7 +56,7 @@ provisioners: - echo overlay >> /etc/initramfs-tools/modules - echo 'RESUME=none' > /etc/initramfs-tools/conf.d/resume - mkdir /usr/local/boot - - apt-get -f -y install aria2 linux-image-amd64 lvm2 haveged + - apt-get -f -y install aria2 linux-image-amd64 lvm2 haveged fdisk - mkdir -p /tmp/images - cp $(find /boot/ -name 'initrd.img-*' | sort -V | tail -n 1) '/tmp/images/{{user `initramfs_file`}}' - cp $(find /boot/ -name 'vmlinuz-*' | sort -V | tail -n 1) '/tmp/images/{{user `linux_file`}}' From 49463b27754c570a3bbd1ece51bac66536a5d995 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Tue, 4 Jan 2022 18:16:49 +0000 Subject: [PATCH 10/36] Fix partition size calculation --- packer/initramfs/labsync | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/initramfs/labsync b/packer/initramfs/labsync index b9f20db..e8f4341 100755 --- a/packer/initramfs/labsync +++ b/packer/initramfs/labsync @@ -112,7 +112,7 @@ labsync_mount_root() { labsync_info "Updating partitions" size_disk=$(blockdev --getsz /dev/${labsync_disk}) size_part_1=$((labsync_partsize_boot * 1024 * 1024 / 512)) - size_part_2=$(((size_disk - labsync_partsize_boot) * 1024 * 1024 / 512)) + size_part_2=$((size_disk - size_part_1 - 2048)) start_part_2=$((size_part_1 + 2048)) dmsetup ls --tree From d443e880d544b6e9faa6ae6d2847cb1f5ec62a62 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 6 Jan 2022 03:50:56 +0000 Subject: [PATCH 11/36] Trigger labsync generator when upload is done --- .gitlab-ci.yml | 8 ++++++++ builder/Dockerfile | 1 + 2 files changed, 9 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 89ef603..babc669 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,6 +76,14 @@ security_scanner: script: - scripts/packer.sh debian-bullseye - aws --endpoint-url "$AWS_ENDPOINT_URL" s3 cp images/ "s3://$AWS_BUCKET/$CI_COMMIT_REF_SLUG/$CI_JOB_ID/" --recursive --no-progress + - > + curl + -i + --retry-connrefused + --retry 10 + -XPOST + -H "Authorization: Bearer $GENERATOR_TRIGGER_TOKEN" + "https://labsync.fablab-nea.de/generator/trigger" artifacts: paths: - images.txt diff --git a/builder/Dockerfile b/builder/Dockerfile index f5fbfa7..2409dc0 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -5,6 +5,7 @@ RUN apk add --no-cache \ aws-cli \ ca-certificates \ coreutils \ + curl \ libffi \ mktorrent \ openssh-client \ From 7c96f8ce138a31f7ae74289851abdba1b324058a Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Tue, 4 Jan 2022 11:11:43 +0000 Subject: [PATCH 12/36] Replace MetalCut with LightBurn As we replaced the Ruida controller with a Duet 3 Mini 5+ --- packer/ansible/playbook.yml | 5 +- .../fablab/files/lightburn/lightburn.desktop | 9 + .../fablab/files/lightburn/lightburn.png | Bin 0 -> 140137 bytes .../roles/fablab/files/lightburn/lightburn.sh | 34 + .../fablab/files/metalcut/metalcut.desktop | 9 - .../roles/fablab/files/metalcut/metalcut.svg | 1190 ----------------- .../ansible/roles/fablab/tasks/lightburn.yml | 66 + packer/ansible/roles/fablab/tasks/main.yml | 4 +- .../ansible/roles/fablab/tasks/metalcut.yml | 58 - .../fablab/templates/lightburn/lightburn.j2 | 1 + .../fablab/templates/metalcut/metalcut.sh.j2 | 25 - 11 files changed, 114 insertions(+), 1287 deletions(-) create mode 100644 packer/ansible/roles/fablab/files/lightburn/lightburn.desktop create mode 100644 packer/ansible/roles/fablab/files/lightburn/lightburn.png create mode 100755 packer/ansible/roles/fablab/files/lightburn/lightburn.sh delete mode 100644 packer/ansible/roles/fablab/files/metalcut/metalcut.desktop delete mode 100644 packer/ansible/roles/fablab/files/metalcut/metalcut.svg create mode 100644 packer/ansible/roles/fablab/tasks/lightburn.yml delete mode 100644 packer/ansible/roles/fablab/tasks/metalcut.yml create mode 100755 packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 delete mode 100755 packer/ansible/roles/fablab/templates/metalcut/metalcut.sh.j2 diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index 792e731..b372c6d 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -42,9 +42,8 @@ url: "https://github.com/t-oster/VisiCut/releases/download/1.7_310/visicut_1.7-310-gcf8c087-1_all.deb" cura: version: 3.3.1 - metalcut: - socket: laser.lab.fablab-nea.de:9000 - dockerimage: r.jalr.de/fablab/metalcut + lightburn: + dockerimage: r.jalr.de/fablab/lightburn firefox: language_packs: - de diff --git a/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop b/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop new file mode 100644 index 0000000..90496bc --- /dev/null +++ b/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=LightBurn +GenericName=LightBurn +Comment=Laser Cutter Job Control Application +Exec=x-terminal-emulator -e 'sudo /usr/local/bin/lightburn' +Icon=/usr/local/share/lightburn/lightburn.png +Terminal=false +Type=Application +Categories=Graphics diff --git a/packer/ansible/roles/fablab/files/lightburn/lightburn.png b/packer/ansible/roles/fablab/files/lightburn/lightburn.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8763ab803797c2dc3ddc73f2bddfbc0e274bca GIT binary patch literal 140137 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 @$0>j0YkoLhIQUf2 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 literal 0 HcmV?d00001 diff --git a/packer/ansible/roles/fablab/files/lightburn/lightburn.sh b/packer/ansible/roles/fablab/files/lightburn/lightburn.sh new file mode 100755 index 0000000..5e84a58 --- /dev/null +++ b/packer/ansible/roles/fablab/files/lightburn/lightburn.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +. /etc/default/lightburn + +if [ ! -z "$SUDO_COMMAND" ] && [ "$SUDO_COMMAND" = "$0" ]; then + home="$(getent passwd "$SUDO_UID" | cut -d: -f6)" + export PUID="$SUDO_UID" + export PGID="$SUDO_GID" +else + home="$HOME" + export PUID=$(id -u) + export PGID=$(id -g) +fi + +config_dir="$home/.config/lightburn" + +mkdir -p "$config_dir" + +media="/media/$(id -un $PUID)" +if [ -e "$media" ]; then + media_volume="-v $media:/media" +fi + +docker run \ + --rm \ + -e PUID \ + -e PGID \ + -e DISPLAY \ + -v /tmp/.X11-unix/:/tmp/.X11-unix/ \ + -v $config_dir:/config/ \ + -v $home:/workdir/ \ + $media_volume \ + --network=none \ + "$LIGHTBURN_DOCKER_IMAGE" diff --git a/packer/ansible/roles/fablab/files/metalcut/metalcut.desktop b/packer/ansible/roles/fablab/files/metalcut/metalcut.desktop deleted file mode 100644 index 47d76e6..0000000 --- a/packer/ansible/roles/fablab/files/metalcut/metalcut.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Name=MetalCut -GenericName=MetalCut -Comment=Laser Cutter Job Control Application -Exec=x-terminal-emulator -e 'sudo /usr/local/bin/metalcut' -Icon=/usr/share/metalcut/metalcut.svg -Terminal=false -Type=Application -Categories=Graphics diff --git a/packer/ansible/roles/fablab/files/metalcut/metalcut.svg b/packer/ansible/roles/fablab/files/metalcut/metalcut.svg deleted file mode 100644 index bb94f22..0000000 --- a/packer/ansible/roles/fablab/files/metalcut/metalcut.svg +++ /dev/null @@ -1,1190 +0,0 @@ - - - - - - - - - - - - - - - eJzMveuuZsdxJfgEfIczPwxIjWE57xfNL6lsd7vnuC1YlqeNRkOgqZLMNk9R4MUez9PPjoi1Vu5z -Kcoz8AwaAqli1P5yZ+bOS1xWrPiT/+WXv/r857/95h8+fF7fpYfP/uRP3n/74Yvvv/n2Zw8uffjL -r7/+4bvvvzXRT/7mpw+5vEvXQz//y/UbPPh3H7797qtvPv7M/+pdvv7yL+zXP/nVDx//4Ydvv/v+ -pw8/+ekl/Nuvvv/6wyX+9psv/+k/ffHxt+++++ff/5Svu37/Z198f/11zn+a55+m/bB/lufDz//q -euAX3/zw8bdfffz9L775P3/20HZ5KHU+zJYeeq/XX/+nr/7mw3cvn3lX59724Lu918Os+924nr5+ -Ud61vvv1sz/75ssfnj58/P6XV38+fPfd+2++/ubb73728Iuvv/jynz67htd/8xdfff3hGsnTF98/ -LBvzz/8yl9/84oevvv7tf/nh6R8+XEMsqZu4/sZ//evvvvj9NQL/s4nnb/7y6ZL86sP33189u9q2 -eXv/V3//v7+/5vObJ3/uGjD+95P/9jcffv+VT/Q1Gf/9p9Hw3354+sPX18T4uMY1wf2h7nH9+/Zn -PHn11p8qZV1/83lJ9sDe3f+tx86wP/zzVx/+5WcP/+Wbjx9ivD//9vtfffV/XSOoI9k/If2bH77+ -8O2vP371fQzg53+5Y7R/9c1vP3x9vU2//Yuvv/BB+v/y+Xc88LdffPv7D99fX+qbr3/43lfLSvir -azYfv/jXDzb7OV7w13/48PFvv/k779/nrY2HnNZ+SO/GGPMh15oedqkPZfhL5kMreFv2N+Zo1hqx -Jtj2vGb/l9f3+Otvv/r9Vx9/1kq6Jqns+FL/8duvfns+1CwPK/7lI3i3bv9s/hNdvUb9/fcfPqLr -1wJ5/1e3D57e/dWvrtf++cffvv/myab9O1vP13f+eC27r7/5ffyd/ux/c/38hz/EEPy/f3N9oV9+ -+9VHa/Oz/+J/s37zy69/uP7qP377zQ9/+MuPv/vms5/EXv3lF9//47WEP3z87XfXrgtZ/OdD/OKS -Pn71zx9C9u6Lr/7w0x9t72+//eLL67UPf/0P/+PDl7aRITh/+tUPX33/4Y839KsvbZq+ffjFtz98 -948Pf/vNN1+rf8//St2E2KX2/P8c7/il/+DjX3+MmX79Jjzw8k3X/vif7i3X059+w/WX/zO3/v6L -r7/+6vfffvGHf/zqy7de8Mbf603xd/8PXnbt8W8/nN/7f/L//w3L8l+f/uGbr7/67umsxpvkl198 -+/1XX3794Vf/+t33H57+eGt/9uF315V0mzaX/vnHf/7w9Td/uHVSkuumffg/vvj2Dz/WtH2m3331 -8bfXDvH9fKbxm6c/2M368Kt//OIPH7y73//jX/iTv/o3LOOvv/j4xbcPLleTdvxc6/c6z54fSSFT -o/0318F4P/o+//yPnYn+N/5ZsT0++8mvP3784unDb7kCvvj+p5+lh59f//zXf/nsh894TV3/+a/X -f/zn6w//4xL9y0N7+KuH//bf08Nv7cm/+ezz2ed8N/aleqy+xrt2qRZPl7St+S7tXI/08bl0tncj -r+LiWxOfEKuNj9dr//qzdLWyUrW7Jqe+rudvkj3WKPPhn+x9u73rrXRreL8rNfXo3CVerU2I81gP -Juzvcps7hNneG8J29RrCdd2r7z8Lcdkdz17t8+cDr6rXQB7iRXtX/LyX3vDz9m7ugZ+P2haeHbtA -eF3B++HNAbz/7Hef/clv/vQ6E/7sqy9NXfji2399+Nkl+kl61/eaY/z04U9/9f23djf95Be/+PmX -l1LzN99876rTTx/+1+vB/+36x3sx3pW1BsZWE77cJa4tL4ivmYRsc3D5UjBCdpuakjLGZp9qZIjb -anj2DCPPyUb7uqYkxpbm+f31wV89Wq+vCmHPbPRF//8d52a+W4MrpM6BqZm3Hreyo2/zXc0bHa57 -dgjTSJiFWsfG4Oaty2Vc6htavWaHwsxWn3fg3/W7D1MaY/Xl1PTdZ+I3bmMuzPHsmas6n6+JXWzb -5+HLz14JsXrtC8/2WvbWV58tc0f2gifX3txkZqz8yMTas2nwI5TBzreEib2WKpfti9H//zGzPfMU -mI0TWwdX9DqrPDdM9u5TE1s1DateY+cumxjvzGX/fz60a97T9PP8soWvSeWGyKPmkOa0Gz5RLr6Q -VrlOAAlbSzuEddSK77auUzXNEF/SmJv1bmU/Lexdo8WOug7QlCUcPEqvOcm+xC5xWcVWTr+MC0zk -1SrOdxMOdavVHEf51SY/xCWeqWZ/9mqrzxWtXldBtGqjKQPCa+3597F2fbe4eO6MztbJXvVaCrf0 -bBhB7a1r6Y5eV3Tgurx4GTWIetq8H8p10GBaR+F5W99dF2CF+JI/hBBHigk3zstrUKVlzErvWw2c -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 -Zu/JxtbxdKB9uvHjtUff3H/w41sbf4aLO8az5fi3/YML3v50zeH08wuG5EQGpPW75vlXvPB98kF7 -7qrpjLdyWL5g9rbvOLo1V54ut7gQsLtofI4PDvb4e24O7dwYnZ0fXH8qLfKqiO/uJfOCfqbXt+n7 -Kr85eUqv5ODolTt18vSVG5eZZb+YnasnpwsTcN01enedFGOYnTzTdf+1//T8mT5ICGndZc/29n9/ -hh0qXM/rrts/3Pl97/rB3m+vfO35sa5ulagfLr72tO8EQRovvvzJ8Xn7UL3/b18vfgX0y4W1bLXx -3aUxW39RP2IXNHX8229ney+97NnSZasrBV3Foar11/zt+Mk0Lc72fz/aufgDpwv523hCydSXtMgX -duvYhdftnD3ZPz/cuWA/o0vlmpWF4+KXRz+8eCPaPTjtltN1V2BjPjk+v+DJ6UpzxJ5wwH39tadP -rx+f7k8e3kvGnS78bdrtnx2f/h+N9K256uT4bH+hrZl5w3f9/fqFE1Wv+bNz9eavOtvdOdhDWy+9 -7s+Ln/Fs9+Rg9+8XbHt8ze7R2UUTfrrmfP/AYsfrn296Swc7Jy8fB73ugr6f/H74/OWeDF91RumR -V5q3fLms6O0jepXfTBP+fP/cPjvCps2thnTptBmQ3724bs13fHq2lz7c7unxBV8wX3Iyrb/7R79d -4JfyZaddcutlN6XQ8pOd07ML3mN7gmm97HahV7j4vHukl117+pKVffHqfhcqay8/3Dl9frbY61e4 -2Hr9Ctd2vX6Fq/tez32jvx2dX396cPFyKtecnP52fHTRWkqXnb14gq89znvoB3t/7h2s7890xZN9 -Ovpd6OYf7f0+zbU/L+jzdBEdg6fN5+ziOUnXTRvf0cVtHXhqbaf3kmed+LNnO0/3Tvda3F4zlJRt -/hhXbtABd+UcP24cHbegwMb+EZ/jaYN45eRf2Pj4s4sSfn3UgK/donDBloYLHi6EC5Yvva9n/kd9 -GMKtu+prO1HUlmCSSySrd+OxxBs+WTnPIA0oV9893XlKW+7GztFTzSRelDuUH21TFz4+lR9xVnj5 -R36pU/eXgjGvkmi9/eDRqw62XPxqoy3XvnS4Fy+bH2+55pUHXC7/R0dcfvUPDbn2fWnMXxL3mT/J -s0tKWOSdo98vOMjRZWfP908mF+/oAhePLjudFqjTs71jhjZfeCUdbXfO9+a+9c+Pn3w2bZvdl27v -7tHjuzQ+AuJZev3T3yjt/8V0mF18Fg2UfW3By83uL7e+vrV6j293llP3fONp8lmX+78wuIgm79nJ -DmZHardgmEi7e2h/uX00eTfmvsX2h+mD2N0/W3n9+iSPpo1i7/y8YQa6Fg+f7D2VSbs6PA9+/80i -jsszpMF4FtEk9F4EZUIDj79dukH23kKz7uNHW599NuRbe+SzUavv3My3nqeP7v960z1989Ff+D9v -jp++8bf2h/jJEIfyfTn8/oPNX+8c12+ie9r97NNf9rZOT2/uHN09ePy3J5/8eu+rjz9+98j/9P5H -/vFw6/WnL25funJr69Mff/Jvf1yP8uWtt75KZ/GNr9756PGTG+7GO/dC+uCr996PH319/smt38a7 -zz99/eGHO7d+c9/dtL+Gdz58WJ5dvnry9R+X3332t08vv7N7/crld395+sPld8OdR5evfXo2PQsZ -vrset8fL79z88OSK3uXZebx5cu3p1+98cnz2pTQmf03vPqTefDL168eP5x6cH+3s8k9Xb4WrN1+7 -xX+4dKVddP3G2XA3fPT6pz9P/3n3YBrA727hqbbPTk/fP3t8+uPB8IW7kR5d4450zQ== - DnevfBv/8tW1a9PPPA/L/fakl66c/rT19l+mZxlevHPz7uU301k4u9dumo4fPjpad9OfT3/65dmj -NTf98Nf8x9snjm966crSbU9/Lt8/WHfTT18/eHLj+/mbfnD5h7PXH3/3YO6ml66cDV99ePXme1s/ -fD73rO+8v5s+WHPT/OztNz5K9+Zvmr771t1xb9/jm04zeelZX7vztLxRH7715dxN3Z2vv7m15qbl -9SsPHn388dxNp/cy3fZXd/f17/86O8Cv3d38y9XPnlz/du6mpz/+bafoTR9cvbr0TuP75wdP+aaX -rkxT8sntxbf63elP4fMv6aZvrb7V6z+kD+9tvTPdNB0v3/Snnz+4M3fTS1f4tvng/mvnfNuZm+6c -/vzmlcdrbnpntxxdLXH2pmcf/xT5prTCrDzrp+n4h++O52/6wWvXzq7WN0/nbnr64ld/5a1rH/3w -09JNp7vwVPrg/Yezz8pv9fU/Xnxf52+avvvB3fnigwezT/rancPxSvry1leXrsw9q7tzvP/52pu+ -ee/+3t11N91zd796/fulm053kQH+8ht35fmNx4+mm9aTpZueXb37S9Sbfrd5bemm+Y/njx7KTW// -+PzOwk2/v+m2PxvjdJfptm+vPOunz/+o6ZOP0txN3fbhb3trbzrcu/3zk6Wb0l30tj+7+wf3H83f -9Iur339x/frx6exNH92Lde1Nt++mLxLvYnPP+kNyX3/26K01N31x/mj77g919qaP3fn+0k11r+Tb -fr335Y1n6276mXv889Wb8zfdHq8+vnb5y49mb/rN5uM3p69y3bN+8/G1919fd9N99/27H/48f9Mv -P9v72+Xdt6+1m1660t32pyev3Vt70+fvHVz9fM1Nf/zI/fzzx2n+pvffee3SlZO3p+V99ll/jd9e -W3vT1777+e0b8zf94PLl09M7D57TTd/hm07P0q1K98Nf3nlt+GB3uul7fyyvSi/80WO96fPx7aWb -/vFLPTzlm067/bVPF570rQfT23/v+Pw23fbdlaXwy69vXLm/f+/hdNO/nC0/6e0vT5ze9Pyjd5YW -wivujV/kowk/nb/3Oe1i/QLxlbt9+6936KbXV5fCK5ev7l2r3003vfNieU/98MbmN3LTj/wXm0s3 -vXTlta8//1oWiPjRX7e3+5uG86PLYet8l27qVp70cfzxb9/e+uDt6aafX14e3tPT2+9gT31wuOJd -XA7jZ7+1vy//Ne5+trn2r5PLdnww91es/DcfvHm69tfu9gdP38VfH634Att/+fQH/PXxyvK+/fDr -X+yrnPv701931//13uWD3y/4a3rjevvryoi5+y+e/239rx89HscL/vrs9idzf9URc18/PL6/9ten -5+8GbGp3v1tdHv9a/8Bff1z+zNzj37detBFb/fs3bzx444K/lh+vXfDXT5/dan9dHbHv8w/vrP/1 -T8+v3V//15+vpW/n/ooR+/n3n/fW/nra3m/eXP/X9HhzZ/1fP7z+218vGDH/yUh8kOv++uXNeLz+ -r/f/eO/9C0bsvTdPjn9Z++vLb76zlfHXX06X//rGvZvP8dcnZysjdjm4W4eLfz/hJUVPgdMJjJaZ -h3YUfFOPa299cDKtTveOdOnZefiJ/tuvn39kZ4NpHfvw61vP/dYnNz7/5tbre58/uvXRO4++HjYv -v/li+re7D/5y4/zq1p1vf7zztJ3fpiZev2r3a4fQ12/sf/jkreklvnZ7Ws8/erjkj52+Fq5++GBT -fC866XQjcfP1eHVq+/NDXlzpnPNdW3Bv3BuOrrobH377grYRml6/fTB30+lk8eLX9/zCgtvflE86 -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 -wv8DHfz6pA== - -image/svg+xmlOpenclipartRock On2009-11-17T15:36:19Classic "Rock On" hand gesture in vector form... I am not claiming to have invented the gesture, just the creator of this particular drawing of it! have fun and "Rock On!"https://openclipart.org/detail/28383/rock-on-by-dugDugmetalrockrock and rollrock handrock onwicked sweet \ No newline at end of file diff --git a/packer/ansible/roles/fablab/tasks/lightburn.yml b/packer/ansible/roles/fablab/tasks/lightburn.yml new file mode 100644 index 0000000..19f9386 --- /dev/null +++ b/packer/ansible/roles/fablab/tasks/lightburn.yml @@ -0,0 +1,66 @@ +--- +- file: + path: /usr/local/share/lightburn + state: directory + mode: "0755" + owner: root + group: root + +- name: copy icon + copy: + src: lightburn/lightburn.png + dest: /usr/local/share/lightburn/lightburn.png + owner: root + group: root + mode: "0644" + +- name: copy script + copy: + src: lightburn/lightburn.sh + dest: /usr/local/bin/lightburn + owner: root + group: root + mode: "0755" + +- name: add lightburn configuration + template: + src: lightburn/lightburn.j2 + dest: /etc/default/lightburn + owner: root + group: root + mode: "0644" + +- name: add lightburn to applications menu + copy: + src: lightburn/lightburn.desktop + dest: /usr/share/applications/lightburn.desktop + owner: root + group: root + mode: "0644" + +- name: add group + group: + name: lightburn + system: yes + +- name: add sudoers config + copy: + content: "%lightburn ALL=/usr/local/bin/lightburn, NOPASSWD:/usr/local/bin/lightburn\n" + dest: /etc/sudoers.d/lightburn + owner: root + group: root + mode: "0644" + +- name: ensure guest-account settings directory exists + file: + path: /etc/guest-account + state: directory + mode: "0755" + owner: root + group: root + +- name: add lightburn group to guest account + lineinfile: + path: /etc/guest-account/groups + line: lightburn + create: yes diff --git a/packer/ansible/roles/fablab/tasks/main.yml b/packer/ansible/roles/fablab/tasks/main.yml index 2981e75..4702f08 100644 --- a/packer/ansible/roles/fablab/tasks/main.yml +++ b/packer/ansible/roles/fablab/tasks/main.yml @@ -18,9 +18,9 @@ - import_tasks: visicut.yml tags: - fablab:visicut - - import_tasks: metalcut.yml + - import_tasks: lightburn.yml tags: - - fablab:metalcut + - fablab:lightburn - import_tasks: prusa.yml tags: - fablab:prusa diff --git a/packer/ansible/roles/fablab/tasks/metalcut.yml b/packer/ansible/roles/fablab/tasks/metalcut.yml deleted file mode 100644 index 15f23cb..0000000 --- a/packer/ansible/roles/fablab/tasks/metalcut.yml +++ /dev/null @@ -1,58 +0,0 @@ ---- -- file: - path: /usr/share/metalcut - state: directory - mode: "0755" - owner: root - group: root - -- name: copy icon - copy: - src: metalcut/metalcut.svg - dest: /usr/share/metalcut/metalcut.svg - owner: root - group: root - mode: "0644" - -- name: add metalcut script - template: - src: metalcut/metalcut.sh.j2 - dest: /usr/local/bin/metalcut - owner: root - group: root - mode: "0755" - -- name: add metalcut to applications menu - copy: - src: metalcut/metalcut.desktop - dest: /usr/share/applications/metalcut.desktop - owner: root - group: root - mode: "0644" - -- name: add group - group: - name: metalcut - system: yes - -- name: add sudoers config - copy: - content: "%metalcut ALL=/usr/local/bin/metalcut, NOPASSWD:/usr/local/bin/metalcut\n" - dest: /etc/sudoers.d/metalcut - owner: root - group: root - mode: "0644" - -- name: ensure guest-account settings directory exists - file: - path: /etc/guest-account - state: directory - mode: "0755" - owner: root - group: root - -- name: add metalcut group to guest account - lineinfile: - path: /etc/guest-account/groups - line: metalcut - create: yes diff --git a/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 b/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 new file mode 100755 index 0000000..bf7cfad --- /dev/null +++ b/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 @@ -0,0 +1 @@ +LIGHTBURN_DOCKER_IMAGE='{{ fablab.lightburn.dockerimage }}' diff --git a/packer/ansible/roles/fablab/templates/metalcut/metalcut.sh.j2 b/packer/ansible/roles/fablab/templates/metalcut/metalcut.sh.j2 deleted file mode 100755 index 97bea9f..0000000 --- a/packer/ansible/roles/fablab/templates/metalcut/metalcut.sh.j2 +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -remote='{{ fablab.metalcut.socket }}' -image='{{ fablab.metalcut.dockerimage }}' - -if [ ! -z "$SUDO_COMMAND" ] && [ "$SUDO_COMMAND" = "$0" ]; then - home="$(getent passwd "$SUDO_UID" | cut -d: -f6)" - uid="$SUDO_UID" - gid="$SUDO_GID" -else - home="$HOME" - uid=$(id -u) - gid=$(id -g) -fi - -docker run \ - --rm \ - -v /tmp/.X11-unix:/tmp/.X11-unix \ - -e DISPLAY \ - -e uid="$uid" \ - -e gid="$gid" \ - -v "$home:/home/metalcut/work" \ - -v '/media:/media' \ - -e remote="$remote" \ - $image From ca6efe499aa0543c5b17c01cca1841de5b7aa6e3 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 6 Jan 2022 23:20:08 +0000 Subject: [PATCH 13/36] Add Prusa slicer settings --- packer/ansible/playbook.yml | 45 +++++++++++++++++++++ packer/ansible/roles/fablab/tasks/prusa.yml | 20 +++++++++ 2 files changed, 65 insertions(+) diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index b372c6d..73983eb 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -44,6 +44,51 @@ version: 3.3.1 lightburn: dockerimage: r.jalr.de/fablab/lightburn + prusa_slicer: + settings: | + no_controller = 1 + no_defaults = 1 + preset_update = 0 + show_splash_screen = 0 + use_inches = 0 + version_check = 0 + view_mode = expert + + [filaments] + AmazonBasics TPU @MINI = 1 + Das Filament PLA = 1 + Generic PETG = 1 + Generic PETG @MINI = 1 + Generic PETG @MMU2 = 1 + Generic PLA = 1 + Generic PLA @MMU2 = 1 + Prusament ASA = 1 + Prusament ASA @MINI = 1 + Prusament ASA @MMU2 = 1 + Prusament PC Blend = 1 + Prusament PC Blend @MINI = 1 + Prusament PC Blend @MMU2 = 1 + Prusament PETG = 1 + Prusament PETG @MINI = 1 + Prusament PETG @MMU2 = 1 + Prusament PLA = 1 + Prusament PLA @MMU2 = 1 + Prusament PVB = 1 + Prusament PVB @MMU2 = 1 + Verbatim BVOH = 1 + Verbatim BVOH @MMU2 = 1 + + [presets] + filament = Prusament PLA + physical_printer = + print = 0.15mm QUALITY @MK3 + printer = Original Prusa i3 MK3 + sla_material = + sla_print = + + [vendor:PrusaResearch] + model:MK3 = 0.4 + model:MK3SMMU2S = 0.4 firefox: language_packs: - de diff --git a/packer/ansible/roles/fablab/tasks/prusa.yml b/packer/ansible/roles/fablab/tasks/prusa.yml index 31a992c..8211e1c 100644 --- a/packer/ansible/roles/fablab/tasks/prusa.yml +++ b/packer/ansible/roles/fablab/tasks/prusa.yml @@ -3,3 +3,23 @@ apt: name: slic3r-prusa state: present + +- name: create skel directories + file: + path: "/etc/skel/{{ item }}" + state: directory + loop: + - .config + - .config/PrusaSlicer + - .config/PrusaSlicer/vendor + +- name: create symlink to vendor profiles + file: + src: /usr/share/PrusaSlicer/profiles/PrusaResearch.ini + dest: /etc/skel/.config/PrusaSlicer/vendor/PrusaResearch.ini + state: link + +- name: Copy Prusa slicer settings + copy: + content: "{{ fablab.prusa_slicer.settings }}" + dest: /etc/skel/.config/PrusaSlicer/PrusaSlicer.ini From b5417f998ae0cbe31f4da587cadecef6fe4fcb2d Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Fri, 7 Jan 2022 01:45:54 +0000 Subject: [PATCH 14/36] Use `main` as default branch --- .gitlab-ci.yml | 6 +++--- security-scanner/security_scanner/__main__.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index babc669..85be239 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -104,15 +104,15 @@ squashfs_featurebranch: variables: - $task == "security-scanner" refs: - - master + - main -squashfs_master: +squashfs_main: <<: *squashfs_template variables: COMPRESSION_LEVEL: 15 only: refs: - - master + - main except: variables: - $task == "security-scanner" diff --git a/security-scanner/security_scanner/__main__.py b/security-scanner/security_scanner/__main__.py index c19cc64..e430bb7 100644 --- a/security-scanner/security_scanner/__main__.py +++ b/security-scanner/security_scanner/__main__.py @@ -33,7 +33,7 @@ if __name__ == '__main__': api_token = os.environ.get('PRIVATE_TOKEN') gitlab = GitLab(gitlab_url, project_id, api_token) for distro in sys.argv[1:]: - job = gitlab.getLastSuccessfulJob('master', 'squashfs_master') + job = gitlab.getLastSuccessfulJob('main', 'squashfs_main') if job is not None: gitlab.downloadArtifact(job, 'images/debian-' + distro + '.dpkg-list', 'debian-' + distro + '.dpkg-list') if checkDebianDistro(distro) > 0: From 632387dfd1546a0becfac987ca3e7c1eff3ee2f6 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Fri, 7 Jan 2022 04:22:12 +0000 Subject: [PATCH 15/36] Revert "Trigger labsync generator when upload is done" This reverts commit d443e880d544b6e9faa6ae6d2847cb1f5ec62a62. While the pipeline is still running, labsync generator can't retrieve its result as it is not yet marked as successfully finished. Therefore, it is easier to use a webhook instead --- .gitlab-ci.yml | 8 -------- builder/Dockerfile | 1 - 2 files changed, 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 85be239..a1736a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,14 +76,6 @@ security_scanner: script: - scripts/packer.sh debian-bullseye - aws --endpoint-url "$AWS_ENDPOINT_URL" s3 cp images/ "s3://$AWS_BUCKET/$CI_COMMIT_REF_SLUG/$CI_JOB_ID/" --recursive --no-progress - - > - curl - -i - --retry-connrefused - --retry 10 - -XPOST - -H "Authorization: Bearer $GENERATOR_TRIGGER_TOKEN" - "https://labsync.fablab-nea.de/generator/trigger" artifacts: paths: - images.txt diff --git a/builder/Dockerfile b/builder/Dockerfile index 2409dc0..f5fbfa7 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -5,7 +5,6 @@ RUN apk add --no-cache \ aws-cli \ ca-certificates \ coreutils \ - curl \ libffi \ mktorrent \ openssh-client \ From 0394230c58c6defdd558f6d0cd07c2948f3f47b5 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Fri, 13 May 2022 19:35:03 +0000 Subject: [PATCH 16/36] Add tabbed box maker https://github.com/paulh-rnd/TabbedBoxMaker --- .../inkscape/files/tabbed_box_maker/LICENSE | 340 ++++++++ .../inkscape/files/tabbed_box_maker/README.md | 157 ++++ .../files/tabbed_box_maker/boxmaker.inx | 104 +++ .../files/tabbed_box_maker/boxmaker.py | 741 ++++++++++++++++++ .../files/tabbed_box_maker/schroffmaker.inx | 47 ++ packer/ansible/roles/inkscape/tasks/main.yml | 3 + .../roles/inkscape/tasks/tabbed_box_maker.yml | 11 + 7 files changed, 1403 insertions(+) create mode 100644 packer/ansible/roles/inkscape/files/tabbed_box_maker/LICENSE create mode 100755 packer/ansible/roles/inkscape/files/tabbed_box_maker/README.md create mode 100755 packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.inx create mode 100755 packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.py create mode 100755 packer/ansible/roles/inkscape/files/tabbed_box_maker/schroffmaker.inx create mode 100644 packer/ansible/roles/inkscape/tasks/tabbed_box_maker.yml diff --git a/packer/ansible/roles/inkscape/files/tabbed_box_maker/LICENSE b/packer/ansible/roles/inkscape/files/tabbed_box_maker/LICENSE new file mode 100644 index 0000000..d6a9326 --- /dev/null +++ b/packer/ansible/roles/inkscape/files/tabbed_box_maker/LICENSE @@ -0,0 +1,340 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + diff --git a/packer/ansible/roles/inkscape/files/tabbed_box_maker/README.md b/packer/ansible/roles/inkscape/files/tabbed_box_maker/README.md new file mode 100755 index 0000000..c500e68 --- /dev/null +++ b/packer/ansible/roles/inkscape/files/tabbed_box_maker/README.md @@ -0,0 +1,157 @@ +# TabbedBoxMaker: A free Inkscape extension for generating tab-jointed box patterns + +_version 1.1 - 9 Aug 2021_ + +Original box maker by Elliot White (formerly of twot.eu, domain name now squatted) + +Heavily modified by [Paul Hutchison](https://github.com/paulh-rnd) + +## About + This tool is designed to simplify the process of making practical boxes from sheet material using almost any kind of CNC cutter (laser, plasma, water jet or mill). The box edges are "finger-jointed" or "tab-jointed", and may include press-fit dimples, internal dividers, dogbone corners (for endmill cutting), and more. + + The tool works by generating each side of the box with the tab and edge sizes corrected to account for the kerf (width of cut). Each box side is composed of a group of individual lines that make up each edge of the face, as well as any other cutouts for dividers. It is recommended that you join adjacent lines in your CNC software to cut efficiently. + + An additional extension which uses the same TabbedBoxMaker generator script is also included: Schroff Box Maker. The Schroff addition was created by [John Slee](https://github.com/jsleeio). If you create further derivative box generators, feel free to send me a pull request! + +## Release Notes +This is a major upgrade to support Inkscape v1.0 and CNC mills (with dogbone cuts), plus an updated dialog layout and documentation, and a number of smaller fixes. So far no serious bugs (i.e causing runtime errors) have been found. The program works with Python 3 ONLY. See [issues](https://github.com/paulh-rnd/TabbedBoxMaker/issues) for known issues, or to log issues and enhancement requests. + +Note that in this release the extension has *moved from the Laser Tools to the CNC Tools submenu*. This is to better reflect that this tool can be used on a wide variety of CNC machinery, especially with the addition of dogbone corners: laser, water jet, milling, even 3D printing. + +## Donate + Any donations will be gratefully received: + + [![](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.me/SparkItUp) + + Many thanks to those who have donated. + +## To do +* Tidy, modularise and simplify the code - it is rough and unpythonic. Needs some work by a master Python guru. +* Add tests and perhaps get it submitted as a core extension to be installed with Inkscape? +* Improve input checking to restrict values to correct solutions. +* Dogbone only works on tabbed joins, NOT divider keyholes or slots yet +* Would be great to make shapes closed and do path subtraction to get slot cutouts and keyholes from faces, and perhaps offer to add fill colour +* [Schroff] Maybe replace the somewhat obscure collection of Schroff rail input data with a dropdown box listing well-documented rail types (Vector, Z-rails, whatever it is that Elby sells, others?) +* [Schroff] Add support for multiple mounting holes per rail where possible (this would definitely make the previous todo item worthwhile) +* [Schroff] Add support for 6U row height + +## Use - regular tabbed boxes + The interface is pretty self explanatory, the extension is 'Tabbed Box Maker' in the 'CNC Tools' group + +Parameters in order of appearance: + +* Units - unit of measurement used for drawing + +* Box Dimensions: Inside/Outside - whether the box dimensions are internal or external measurements + +* Length / Width / Height - the box dimensions + +* Tab Width: Fixed/Proportional - for fixed the tab width is the value given in the Tab + Width, for proportional the side of a piece is divided + equally into tabs and 'spaces' with the tabs size + greater or equal to the Tab Width setting + +* Minimum/Preferred Tab Width - the size of the tabs used to hold the pieces together + +* Symmetry - there are two styles of tabs avaiable: + * XY Symmetrix - each piece is symmetric in both the X and Y axes + * Rotate Symmetric ("waffle block") - each piece is symmetric under a 180-degree rotation + (and 90 degrees if that piece is square) + +* Tab Dimple Height - the height of the dimple to add to the side of each tab, 0 for no dimple. + Dimples can be added to give tabbed joints a little extra material for a tighter press fit. + +* Tab Dimple Length - the length of the tip of the dimple; dimples are trapezoid shaped with + 45-degree sides; using a dimple tip length of 0 gives a triangular dimple + +* Line Thickness - Leave this as _Default_ unless you need hairline thickness (Use for Epilog lasers) + +* Material Thickness - as it says + +* Kerf - this is the diameter/width of the cut. Typical laser cutters will be between 0.1 - 0.25mm, + for CNC mills, this will be your end mill diameter. A larger kerf will assume more material is removed, + hence joints will be tighter. Smaller or zero kerf will result in looser joints. + +* Layout - controls how the pieces are laid out in the drawing + +* Box Type - this allows you to choose how many jointed sides you want. Options are: + * Fully enclosed (6 sides) + * One side open (LxW) - one of the Length x Width panels will be omitted + * Two sides open (LxW and LxH) - two adjacent panels will be omitted + * Three sides open (LxW, LxH, HxW) - one of each panel omitted + * Opposite ends open (LxW) - an open-ended "tube" with the LxW panels omitted + * Two panels only (LxW and LxH) - two panels with a single joint down the Length axis + +* Dividers (Length axis) - use this to create additional LxH panels that mount inside the box + along the length axis and have finger joints into the side panels + and slots for Width dividers to slot into + +* Dividers (Width axis) - use this to create additional WxH panels that mount inside the box + along the width axis and have finger joints into the side panels + and slots for Length dividers to slot into + +* Key the dividers into - this allows you to choose if/how the dividers are keyed into the sides of the box. Options are: + * None - no keying, dividers will be free to slide in and out + * Walls - dividers will only be keyed into the side walls of the box + * Floor/Ceiling - dividers will only be keyed into the top/bottom of the box + * All Sides + +* Space Between Parts - how far apart the pieces are in the drawing produced + +* Live Preview - you may need to turn this off when changing tab style, box type, or layout + +## Use - Schroff enclosures + +Much the same as for regular enclosures, except some options are removed, and some others are added. If you're using Elby rails, all you'll need to do is specify: + +* Depth + +* Number of 3U rows + +* Row width in TE/HP units (divide rail length by 5.08mm/0.2") + +* If multiple rows, inter-row spacing + +## Installation + +1. Download the extension from this GitHub page using the *[Clone or download > Download ZIP](archive/master.zip)* link. If you are using an older version of Inkscape, you will need to download the correct version of the extension (see [Version History](#version-history) below) +2. Extract the zip file +3. Copy all files except README.md and LICENSE into the Inkscape extensions directory. The directory location varies depending on your operating system, and may be customised. The easiest way to find the directory is to open Inkscape, go to _Edit > Preferences > System_ (Win/Linux) or _Inkscape > Preferences > System_ (Mac). +4. You can either copy the files to the _User extensions_ directory or the _Inkscape extensions_ directory. The former will install this extension for just the current user, the latter will install it for all users of the machine. +5. Inkscape *must* be restarted after copying the extension files. +6. If it has been installed correctly, you should find the extension under the _Extensions > CNC Tools_ menu. Enjoy! + +Default installation directories are given below: + +### Windows + +* User: `%APPDATA%\inkscape\extensions` +* Machine: `C:\Program Files\Inkscape\share\extensions` + +### Mac + +* User: `~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions` +* Machine: `/Applications/Inkscape.app/Contents/Resources/share/inkscape/extensions` + +### Linux + +* User: `~/.config/inkscape/extensions` +* Machine: Depends on installation method + +## Version History +version | Date | Notes +--------|------|-------- +0.5 | ( 9 Oct 2011) | beta +0.7 | (24 Oct 2011) | first release +0.8 | (26 Oct 2011) | basic input checking implemented +0.86 | (19 Dec 2014) | updates to allow different box types and internal dividers +0.86a | (23 June 2015) | Updated for compatibility with Inkscape 0.91 +0.87 | (28 July 2015) | Schroff enclosure add-on +0.93 | (21 Sept 2015) | Updated versioning to match original author's updated v0.91 plus adding my 0.02 +0.93a | (21 Sept 2015) | Added hairline line thickness option for Epilog lasers +0.94 | (4 Jan 2017) | Divider keying options +0.95 | (20 Apr 2017) | Added optional dimples on tabs +0.96 | (24 Apr 2017) | Orthogonalized box type, layout, tab style; added rotate-symmetric tabs +0.99 | (4 June 2020) | Upgraded to support Inkscape v1.0, minor fixes and a tidy up of the parameters dialog layout +1.0 | (17 June 2020) | v1.0 final released: fixes and dogbone added - Mills now supported! +1.1 | (9 Aug 2021) | v1.1 with fixes for newer Inkscape versions - sorry for the delays \ No newline at end of file diff --git a/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.inx b/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.inx new file mode 100755 index 0000000..d8bdbb2 --- /dev/null +++ b/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.inx @@ -0,0 +1,104 @@ + + + <_name>CNC Tabbed Box Maker + nz.paulh-rnd.tabbedboxmaker + + + + + + + + + + + + + <_option value="1">Inside + <_option value="0">Outside + + + 180 + 240 + 50 + + + + + + <_option value="0">Fixed + <_option value="1">Proportional + + + 6.0 + + + <_option value="0">Regular (Laser) + <_option value="1">Dogbone (Mill) + + + + <_option value="0">XY Symmetric + <_option value="1">Rotate Symmetric + + + + 0.0 + 0.0 + + + + + + + + + <_option value="0">Default + <_option value="1">Hairline (0.002" for Epilog) + + + 3.0 + 0.1 + + + + + + + + + + + + + + + + + + + + 2 + 3 + + + + + + + + 1.0 + + + + all + + + + + + diff --git a/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.py b/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.py new file mode 100755 index 0000000..ebc8f4f --- /dev/null +++ b/packer/ansible/roles/inkscape/files/tabbed_box_maker/boxmaker.py @@ -0,0 +1,741 @@ +#! /usr/bin/env python -t +''' +Generates Inkscape SVG file containing box components needed to +CNC (laser/mill) cut a box with tabbed joints taking kerf and clearance into account + +Original Tabbed Box Maker Copyright (C) 2011 elliot white + +Changelog: +19/12/2014 Paul Hutchison: + - Ability to generate 6, 5, 4, 3 or 2-panel cutouts + - Ability to also generate evenly spaced dividers within the box + including tabbed joints to box sides and slots to slot into each other + +23/06/2015 by Paul Hutchison: + - Updated for Inkscape's 0.91 breaking change (unittouu) + +v0.93 - 15/8/2016 by Paul Hutchison: + - Added Hairline option and fixed open box height bug + +v0.94 - 05/01/2017 by Paul Hutchison: + - Added option for keying dividers into walls/floor/none + +v0.95 - 2017-04-20 by Jim McBeath + - Added optional dimples + +v0.96 - 2017-04-24 by Jim McBeath + - Refactored to make box type, tab style, and layout all orthogonal + - Added Tab Style option to allow creating waffle-block-style tabs + - Made open box size correct based on inner or outer dimension choice + - Fixed a few tab bugs + +v0.99 - 2020-06-01 by Paul Hutchison + - Preparatory release with Inkscape 1.0 compatibility upgrades (further fixes to come!) + - Removed Antisymmetric option as it's broken, kinda pointless and looks weird + - Fixed divider issues with Rotate Symmetric + - Made individual panels and their keyholes/slots grouped + +v1.0 - 2020-06-17 by Paul Hutchison + - Removed clearance parameter, as this was just subtracted from kerf - pointless? + - Corrected kerf adjustments for overall box size and divider keyholes + - Added dogbone cuts: CNC mills now supported! + - Fix for floor/ceiling divider key issue (#17) + - Increased max dividers to 20 (#35) + +v1.1 - 2021-08-09 by Paul Hutchison + - Fixed for current Inkscape release version 1.1 - thanks to PR from https://github.com/roastedneutrons + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +''' +__version__ = "1.0" ### please report bugs, suggestions etc at https://github.com/paulh-rnd/TabbedBoxMaker ### + +import os,sys,inkex,simplestyle,gettext,math +from copy import deepcopy +_ = gettext.gettext + +linethickness = 1 # default unless overridden by settings + +def log(text): + if 'SCHROFF_LOG' in os.environ: + f = open(os.environ.get('SCHROFF_LOG'), 'a') + f.write(text + "\n") + +def newGroup(canvas): + # Create a new group and add element created from line string + panelId = canvas.svg.get_unique_id('panel') + group = canvas.svg.get_current_layer().add(inkex.Group(id=panelId)) + return group + +def getLine(XYstring): + line = inkex.PathElement() + line.style = { 'stroke': '#000000', 'stroke-width' : str(linethickness), 'fill': 'none' } + line.path = XYstring + #inkex.etree.SubElement(parent, inkex.addNS('path','svg'), drw) + return line + +# jslee - shamelessly adapted from sample code on below Inkscape wiki page 2015-07-28 +# http://wiki.inkscape.org/wiki/index.php/Generating_objects_from_extensions +def getCircle(r, c): + (cx, cy) = c + log("putting circle at (%d,%d)" % (cx,cy)) + circle = inkex.PathElement.arc((cx, cy), r) + circle.style = { 'stroke': '#000000', 'stroke-width': str(linethickness), 'fill': 'none' } + + # ell_attribs = {'style':simplestyle.formatStyle(style), + # inkex.addNS('cx','sodipodi') :str(cx), + # inkex.addNS('cy','sodipodi') :str(cy), + # inkex.addNS('rx','sodipodi') :str(r), + # inkex.addNS('ry','sodipodi') :str(r), + # inkex.addNS('start','sodipodi') :str(0), + # inkex.addNS('end','sodipodi') :str(2*math.pi), + # inkex.addNS('open','sodipodi') :'true', #all ellipse sectors we will draw are open + # inkex.addNS('type','sodipodi') :'arc', + # 'transform' :'' } + #inkex.etree.SubElement(parent, inkex.addNS('path','svg'), ell_attribs ) + return circle + +def dimpleStr(tabVector,vectorX,vectorY,dirX,dirY,dirxN,diryN,ddir,isTab): + ds='' + if not isTab: + ddir = -ddir + if dimpleHeight>0 and tabVector!=0: + if tabVector>0: + dimpleStart=(tabVector-dimpleLength)/2-dimpleHeight + tabSgn=1 + else: + dimpleStart=(tabVector+dimpleLength)/2+dimpleHeight + tabSgn=-1 + Vxd=vectorX+dirxN*dimpleStart + Vyd=vectorY+diryN*dimpleStart + ds+='L '+str(Vxd)+','+str(Vyd)+' ' + Vxd=Vxd+(tabSgn*dirxN-ddir*dirX)*dimpleHeight + Vyd=Vyd+(tabSgn*diryN-ddir*dirY)*dimpleHeight + ds+='L '+str(Vxd)+','+str(Vyd)+' ' + Vxd=Vxd+tabSgn*dirxN*dimpleLength + Vyd=Vyd+tabSgn*diryN*dimpleLength + ds+='L '+str(Vxd)+','+str(Vyd)+' ' + Vxd=Vxd+(tabSgn*dirxN+ddir*dirX)*dimpleHeight + Vyd=Vyd+(tabSgn*diryN+ddir*dirY)*dimpleHeight + ds+='L '+str(Vxd)+','+str(Vyd)+' ' + return ds + +def side(group,root,startOffset,endOffset,tabVec,length,direction,isTab,isDivider,numDividers,dividerSpacing): + rootX, rootY = root + startOffsetX, startOffsetY = startOffset + endOffsetX, endOffsetY = endOffset + dirX, dirY = direction + notTab=0 if isTab else 1 + + if (tabSymmetry==1): # waffle-block style rotationally symmetric tabs + divisions=int((length-2*thickness)/nomTab) + if divisions%2: divisions+=1 # make divs even + divisions=float(divisions) + tabs=divisions/2 # tabs for side + else: + divisions=int(length/nomTab) + if not divisions%2: divisions-=1 # make divs odd + divisions=float(divisions) + tabs=(divisions-1)/2 # tabs for side + + if (tabSymmetry==1): # waffle-block style rotationally symmetric tabs + gapWidth=tabWidth=(length-2*thickness)/divisions + elif equalTabs: + gapWidth=tabWidth=length/divisions + else: + tabWidth=nomTab + gapWidth=(length-tabs*nomTab)/(divisions-tabs) + + if isTab: # kerf correction + gapWidth-=kerf + tabWidth+=kerf + first=halfkerf + else: + gapWidth+=kerf + tabWidth-=kerf + first=-halfkerf + firstholelenX=0 + firstholelenY=0 + s=[] + h=[] + firstVec=0; secondVec=tabVec + dividerEdgeOffsetX = dividerEdgeOffsetY = thickness + notDirX=0 if dirX else 1 # used to select operation on x or y + notDirY=0 if dirY else 1 + if (tabSymmetry==1): + dividerEdgeOffsetX = dirX*thickness; + #dividerEdgeOffsetY = ; + vectorX = rootX + (startOffsetX*thickness if notDirX else 0) + vectorY = rootY + (startOffsetY*thickness if notDirY else 0) + s='M '+str(vectorX)+','+str(vectorY)+' ' + vectorX = rootX+(startOffsetX if startOffsetX else dirX)*thickness + vectorY = rootY+(startOffsetY if startOffsetY else dirY)*thickness + if notDirX: endOffsetX=0 + if notDirY: endOffsetY=0 + else: + (vectorX,vectorY)=(rootX+startOffsetX*thickness,rootY+startOffsetY*thickness) + dividerEdgeOffsetX=dirY*thickness + dividerEdgeOffsetY=dirX*thickness + s='M '+str(vectorX)+','+str(vectorY)+' ' + if notDirX: vectorY=rootY # set correct line start for tab generation + if notDirY: vectorX=rootX + + # generate line as tab or hole using: + # last co-ord:Vx,Vy ; tab dir:tabVec ; direction:dirx,diry ; thickness:thickness + # divisions:divs ; gap width:gapWidth ; tab width:tabWidth + + for tabDivision in range(1,int(divisions)): + if ((tabDivision%2) ^ (not isTab)) and numDividers>0 and not isDivider: # draw holes for divider tabs to key into side walls + w=gapWidth if isTab else tabWidth + if tabDivision==1 and tabSymmetry==0: + w-=startOffsetX*thickness + holeLenX=dirX*w+notDirX*firstVec+first*dirX + holeLenY=dirY*w+notDirY*firstVec+first*dirY + if first: + firstholelenX=holeLenX + firstholelenY=holeLenY + for dividerNumber in range(1,int(numDividers)+1): + Dx=vectorX+-dirY*dividerSpacing*dividerNumber+notDirX*halfkerf+dirX*dogbone*halfkerf-dogbone*first*dirX + Dy=vectorY+dirX*dividerSpacing*dividerNumber-notDirY*halfkerf+dirY*dogbone*halfkerf-dogbone*first*dirY + if tabDivision==1 and tabSymmetry==0: + Dx+=startOffsetX*thickness + h='M '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+holeLenX + Dy=Dy+holeLenY + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+notDirX*(secondVec-kerf) + Dy=Dy+notDirY*(secondVec+kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-holeLenX + Dy=Dy-holeLenY + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-notDirX*(secondVec-kerf) + Dy=Dy-notDirY*(secondVec+kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + group.add(getLine(h)) + if tabDivision%2: + if tabDivision==1 and numDividers>0 and isDivider: # draw slots for dividers to slot into each other + for dividerNumber in range(1,int(numDividers)+1): + Dx=vectorX+-dirY*dividerSpacing*dividerNumber-dividerEdgeOffsetX+notDirX*halfkerf + Dy=vectorY+dirX*dividerSpacing*dividerNumber-dividerEdgeOffsetY+notDirY*halfkerf + h='M '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+dirX*(first+length/2) + Dy=Dy+dirY*(first+length/2) + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+notDirX*(thickness-kerf) + Dy=Dy+notDirY*(thickness-kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-dirX*(first+length/2) + Dy=Dy-dirY*(first+length/2) + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-notDirX*(thickness-kerf) + Dy=Dy-notDirY*(thickness-kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + group.add(getLine(h)) + # draw the gap + vectorX+=dirX*(gapWidth+(isTab&dogbone&1 ^ 0x1)*first+dogbone*kerf*isTab)+notDirX*firstVec + vectorY+=dirY*(gapWidth+(isTab&dogbone&1 ^ 0x1)*first+dogbone*kerf*isTab)+notDirY*firstVec + s+='L '+str(vectorX)+','+str(vectorY)+' ' + if dogbone and isTab: + vectorX-=dirX*halfkerf + vectorY-=dirY*halfkerf + s+='L '+str(vectorX)+','+str(vectorY)+' ' + # draw the starting edge of the tab + s+=dimpleStr(secondVec,vectorX,vectorY,dirX,dirY,notDirX,notDirY,1,isTab) + vectorX+=notDirX*secondVec + vectorY+=notDirY*secondVec + s+='L '+str(vectorX)+','+str(vectorY)+' ' + if dogbone and notTab: + vectorX-=dirX*halfkerf + vectorY-=dirY*halfkerf + s+='L '+str(vectorX)+','+str(vectorY)+' ' + + else: + # draw the tab + vectorX+=dirX*(tabWidth+dogbone*kerf*notTab)+notDirX*firstVec + vectorY+=dirY*(tabWidth+dogbone*kerf*notTab)+notDirY*firstVec + s+='L '+str(vectorX)+','+str(vectorY)+' ' + if dogbone and notTab: + vectorX-=dirX*halfkerf + vectorY-=dirY*halfkerf + s+='L '+str(vectorX)+','+str(vectorY)+' ' + # draw the ending edge of the tab + s+=dimpleStr(secondVec,vectorX,vectorY,dirX,dirY,notDirX,notDirY,-1,isTab) + vectorX+=notDirX*secondVec + vectorY+=notDirY*secondVec + s+='L '+str(vectorX)+','+str(vectorY)+' ' + if dogbone and isTab: + vectorX-=dirX*halfkerf + vectorY-=dirY*halfkerf + s+='L '+str(vectorX)+','+str(vectorY)+' ' + (secondVec,firstVec)=(-secondVec,-firstVec) # swap tab direction + first=0 + + #finish the line off + s+='L '+str(rootX+endOffsetX*thickness+dirX*length)+','+str(rootY+endOffsetY*thickness+dirY*length)+' ' + + if isTab and numDividers>0 and tabSymmetry==0 and not isDivider: # draw last for divider joints in side walls + for dividerNumber in range(1,int(numDividers)+1): + Dx=vectorX+-dirY*dividerSpacing*dividerNumber+notDirX*halfkerf+dirX*dogbone*halfkerf-dogbone*first*dirX + # Dy=vectorY+dirX*dividerSpacing*dividerNumber-notDirY*halfkerf+dirY*dogbone*halfkerf-dogbone*first*dirY + # Dx=vectorX+-dirY*dividerSpacing*dividerNumber-dividerEdgeOffsetX+notDirX*halfkerf + Dy=vectorY+dirX*dividerSpacing*dividerNumber-dividerEdgeOffsetY+notDirY*halfkerf + h='M '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+firstholelenX + Dy=Dy+firstholelenY + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx+notDirX*(thickness-kerf) + Dy=Dy+notDirY*(thickness-kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-firstholelenX + Dy=Dy-firstholelenY + h+='L '+str(Dx)+','+str(Dy)+' ' + Dx=Dx-notDirX*(thickness-kerf) + Dy=Dy-notDirY*(thickness-kerf) + h+='L '+str(Dx)+','+str(Dy)+' ' + group.add(getLine(h)) + # for dividerNumber in range(1,int(numDividers)+1): + # Dx=vectorX+-dirY*dividerSpacing*dividerNumber+notDirX*halfkerf+dirX*dogbone*halfkerf + # Dy=vectorY+dirX*dividerSpacing*dividerNumber-notDirY*halfkerf+dirY*dogbone*halfkerf + # # Dx=vectorX+dirX*dogbone*halfkerf + # # Dy=vectorY+dirX*dividerSpacing*dividerNumber-dirX*halfkerf+dirY*dogbone*halfkerf + # h='M '+str(Dx)+','+str(Dy)+' ' + # Dx=rootX+endOffsetX*thickness+dirX*length + # Dy+=dirY*tabWidth+notDirY*firstVec+first*dirY + # h+='L '+str(Dx)+','+str(Dy)+' ' + # Dx+=notDirX*(secondVec-kerf) + # Dy+=notDirY*(secondVec+kerf) + # h+='L '+str(Dx)+','+str(Dy)+' ' + # Dx-=vectorX + # Dy-=(dirY*tabWidth+notDirY*firstVec+first*dirY) + # h+='L '+str(Dx)+','+str(Dy)+' ' + # Dx-=notDirX*(secondVec-kerf) + # Dy-=notDirY*(secondVec+kerf) + # h+='L '+str(Dx)+','+str(Dy)+' ' + # group.add(getLine(h)) + group.add(getLine(s)) + return s + + +class BoxMaker(inkex.Effect): + def __init__(self): + # Call the base class constructor. + inkex.Effect.__init__(self) + # Define options + self.arg_parser.add_argument('--schroff',action='store',type=int, + dest='schroff',default=0,help='Enable Schroff mode') + self.arg_parser.add_argument('--rail_height',action='store',type=float, + dest='rail_height',default=10.0,help='Height of rail') + self.arg_parser.add_argument('--rail_mount_depth',action='store',type=float, + dest='rail_mount_depth',default=17.4,help='Depth at which to place hole for rail mount bolt') + self.arg_parser.add_argument('--rail_mount_centre_offset',action='store',type=float, + dest='rail_mount_centre_offset',default=0.0,help='How far toward row centreline to offset rail mount bolt (from rail centreline)') + self.arg_parser.add_argument('--rows',action='store',type=int, + dest='rows',default=0,help='Number of Schroff rows') + self.arg_parser.add_argument('--hp',action='store',type=int, + dest='hp',default=0,help='Width (TE/HP units) of Schroff rows') + self.arg_parser.add_argument('--row_spacing',action='store',type=float, + dest='row_spacing',default=10.0,help='Height of rail') + self.arg_parser.add_argument('--unit',action='store',type=str, + dest='unit',default='mm',help='Measure Units') + self.arg_parser.add_argument('--inside',action='store',type=int, + dest='inside',default=0,help='Int/Ext Dimension') + self.arg_parser.add_argument('--length',action='store',type=float, + dest='length',default=100,help='Length of Box') + self.arg_parser.add_argument('--width',action='store',type=float, + dest='width',default=100,help='Width of Box') + self.arg_parser.add_argument('--depth',action='store',type=float, + dest='height',default=100,help='Height of Box') + self.arg_parser.add_argument('--tab',action='store',type=float, + dest='tab',default=25,help='Nominal Tab Width') + self.arg_parser.add_argument('--equal',action='store',type=int, + dest='equal',default=0,help='Equal/Prop Tabs') + self.arg_parser.add_argument('--tabsymmetry',action='store',type=int, + dest='tabsymmetry',default=0,help='Tab style') + self.arg_parser.add_argument('--tabtype',action='store',type=int, + dest='tabtype',default=0,help='Tab type: regular or dogbone') + self.arg_parser.add_argument('--dimpleheight',action='store',type=float, + dest='dimpleheight',default=0,help='Tab Dimple Height') + self.arg_parser.add_argument('--dimplelength',action='store',type=float, + dest='dimplelength',default=0,help='Tab Dimple Tip Length') + self.arg_parser.add_argument('--hairline',action='store',type=int, + dest='hairline',default=0,help='Line Thickness') + self.arg_parser.add_argument('--thickness',action='store',type=float, + dest='thickness',default=10,help='Thickness of Material') + self.arg_parser.add_argument('--kerf',action='store',type=float, + dest='kerf',default=0.5,help='Kerf (width of cut)') + self.arg_parser.add_argument('--style',action='store',type=int, + dest='style',default=25,help='Layout/Style') + self.arg_parser.add_argument('--spacing',action='store',type=float, + dest='spacing',default=25,help='Part Spacing') + self.arg_parser.add_argument('--boxtype',action='store',type=int, + dest='boxtype',default=25,help='Box type') + self.arg_parser.add_argument('--div_l',action='store',type=int, + dest='div_l',default=25,help='Dividers (Length axis)') + self.arg_parser.add_argument('--div_w',action='store',type=int, + dest='div_w',default=25,help='Dividers (Width axis)') + self.arg_parser.add_argument('--keydiv',action='store',type=int, + dest='keydiv',default=3,help='Key dividers into walls/floor') + + def effect(self): + global group,nomTab,equalTabs,tabSymmetry,dimpleHeight,dimpleLength,thickness,kerf,halfkerf,dogbone,divx,divy,hairline,linethickness,keydivwalls,keydivfloor + + # Get access to main SVG document element and get its dimensions. + svg = self.document.getroot() + + # Get the attributes: + widthDoc = self.svg.unittouu(svg.get('width')) + heightDoc = self.svg.unittouu(svg.get('height')) + + # Get script's option values. + hairline=self.options.hairline + unit=self.options.unit + inside=self.options.inside + schroff=self.options.schroff + kerf = self.svg.unittouu( str(self.options.kerf) + unit ) + halfkerf=kerf/2 + + # Set the line thickness + if hairline: + linethickness=self.svg.unittouu('0.002in') + else: + linethickness=1 + + if schroff: + rows=self.options.rows + rail_height=self.svg.unittouu(str(self.options.rail_height)+unit) + row_centre_spacing=self.svg.unittouu(str(122.5)+unit) + row_spacing=self.svg.unittouu(str(self.options.row_spacing)+unit) + rail_mount_depth=self.svg.unittouu(str(self.options.rail_mount_depth)+unit) + rail_mount_centre_offset=self.svg.unittouu(str(self.options.rail_mount_centre_offset)+unit) + rail_mount_radius=self.svg.unittouu(str(2.5)+unit) + + ## minimally different behaviour for schroffmaker.inx vs. boxmaker.inx + ## essentially schroffmaker.inx is just an alternate interface with different + ## default settings, some options removed, and a tiny amount of extra logic + if schroff: + ## schroffmaker.inx + X = self.svg.unittouu(str(self.options.hp * 5.08) + unit) + # 122.5mm vertical distance between mounting hole centres of 3U Schroff panels + row_height = rows * (row_centre_spacing + rail_height) + # rail spacing in between rows but never between rows and case panels + row_spacing_total = (rows - 1) * row_spacing + Y = row_height + row_spacing_total + else: + ## boxmaker.inx + X = self.svg.unittouu( str(self.options.length + kerf) + unit ) + Y = self.svg.unittouu( str(self.options.width + kerf) + unit ) + + Z = self.svg.unittouu( str(self.options.height + kerf) + unit ) + thickness = self.svg.unittouu( str(self.options.thickness) + unit ) + nomTab = self.svg.unittouu( str(self.options.tab) + unit ) + equalTabs=self.options.equal + tabSymmetry=self.options.tabsymmetry + dimpleHeight=self.options.dimpleheight + dimpleLength=self.options.dimplelength + dogbone = 1 if self.options.tabtype == 1 else 0 + layout=self.options.style + spacing = self.svg.unittouu( str(self.options.spacing) + unit ) + boxtype = self.options.boxtype + divx = self.options.div_l + divy = self.options.div_w + keydivwalls = 0 if self.options.keydiv == 3 or self.options.keydiv == 1 else 1 + keydivfloor = 0 if self.options.keydiv == 3 or self.options.keydiv == 2 else 1 + initOffsetX=0 + initOffsetY=0 + + if inside: # if inside dimension selected correct values to outside dimension + X+=thickness*2 + Y+=thickness*2 + Z+=thickness*2 + + # check input values mainly to avoid python errors + # TODO restrict values to *correct* solutions + # TODO restrict divisions to logical values + error=0 + + if min(X,Y,Z)==0: + inkex.errormsg(_('Error: Dimensions must be non zero')) + error=1 + if max(X,Y,Z)>max(widthDoc,heightDoc)*10: # crude test + inkex.errormsg(_('Error: Dimensions Too Large')) + error=1 + if min(X,Y,Z)<3*nomTab: + inkex.errormsg(_('Error: Tab size too large')) + error=1 + if nomTabmin(X,Y,Z)/3: # crude test + inkex.errormsg(_('Error: Material too thick')) + error=1 + if kerf>min(X,Y,Z)/3: # crude test + inkex.errormsg(_('Error: Kerf too large')) + error=1 + if spacing>max(X,Y,Z)*10: # crude test + inkex.errormsg(_('Error: Spacing too large')) + error=1 + if spacing 0=holes 1=tabs + # tabbed= 0=no tabs 1=tabs on this side + # (sides: a=top, b=right, c=bottom, d=left) + # pieceType: 1=XY, 2=XZ, 3=ZY + tpFace=1 + bmFace=1 + ftFace=2 + bkFace=2 + ltFace=3 + rtFace=3 + + def reduceOffsets(aa, start, dx, dy, dz): + for ix in range(start+1,len(aa)): + (s,x,y,z) = aa[ix] + aa[ix] = (s-1, x-dx, y-dy, z-dz) + + # note first two pieces in each set are the X-divider template and Y-divider template respectively + pieces=[] + if layout==1: # Diagramatic Layout + rr = deepcopy([row0, row1z, row2]) + cc = deepcopy([col0, col1z, col2xz, col3xzz]) + if not hasFt: reduceOffsets(rr, 0, 0, 0, 1) # remove row0, shift others up by Z + if not hasLt: reduceOffsets(cc, 0, 0, 0, 1) + if not hasRt: reduceOffsets(cc, 2, 0, 0, 1) + if hasBk: pieces.append([cc[1], rr[2], X,Z, bkTabInfo, bkTabbed, bkFace]) + if hasLt: pieces.append([cc[0], rr[1], Z,Y, ltTabInfo, ltTabbed, ltFace]) + if hasBm: pieces.append([cc[1], rr[1], X,Y, bmTabInfo, bmTabbed, bmFace]) + if hasRt: pieces.append([cc[2], rr[1], Z,Y, rtTabInfo, rtTabbed, rtFace]) + if hasTp: pieces.append([cc[3], rr[1], X,Y, tpTabInfo, tpTabbed, tpFace]) + if hasFt: pieces.append([cc[1], rr[0], X,Z, ftTabInfo, ftTabbed, ftFace]) + elif layout==2: # 3 Piece Layout + rr = deepcopy([row0, row1y]) + cc = deepcopy([col0, col1z]) + if hasBk: pieces.append([cc[1], rr[1], X,Z, bkTabInfo, bkTabbed, bkFace]) + if hasLt: pieces.append([cc[0], rr[0], Z,Y, ltTabInfo, ltTabbed, ltFace]) + if hasBm: pieces.append([cc[1], rr[0], X,Y, bmTabInfo, bmTabbed, bmFace]) + elif layout==3: # Inline(compact) Layout + rr = deepcopy([row0]) + cc = deepcopy([col0, col1x, col2xx, col3xxz, col4, col5]) + if not hasTp: reduceOffsets(cc, 0, 1, 0, 0) # remove col0, shift others left by X + if not hasBm: reduceOffsets(cc, 1, 1, 0, 0) + if not hasLt: reduceOffsets(cc, 2, 0, 0, 1) + if not hasRt: reduceOffsets(cc, 3, 0, 0, 1) + if not hasBk: reduceOffsets(cc, 4, 1, 0, 0) + if hasBk: pieces.append([cc[4], rr[0], X,Z, bkTabInfo, bkTabbed, bkFace]) + if hasLt: pieces.append([cc[2], rr[0], Z,Y, ltTabInfo, ltTabbed, ltFace]) + if hasTp: pieces.append([cc[0], rr[0], X,Y, tpTabInfo, tpTabbed, tpFace]) + if hasBm: pieces.append([cc[1], rr[0], X,Y, bmTabInfo, bmTabbed, bmFace]) + if hasRt: pieces.append([cc[3], rr[0], Z,Y, rtTabInfo, rtTabbed, rtFace]) + if hasFt: pieces.append([cc[5], rr[0], X,Z, ftTabInfo, ftTabbed, ftFace]) + + for idx, piece in enumerate(pieces): # generate and draw each piece of the box + (xs,xx,xy,xz)=piece[0] + (ys,yx,yy,yz)=piece[1] + x=xs*spacing+xx*X+xy*Y+xz*Z+initOffsetX # root x co-ord for piece + y=ys*spacing+yx*X+yy*Y+yz*Z+initOffsetY # root y co-ord for piece + dx=piece[2] + dy=piece[3] + tabs=piece[4] + a=tabs>>3&1; b=tabs>>2&1; c=tabs>>1&1; d=tabs&1 # extract tab status for each side + tabbed=piece[5] + atabs=tabbed>>3&1; btabs=tabbed>>2&1; ctabs=tabbed>>1&1; dtabs=tabbed&1 # extract tabbed flag for each side + xspacing=(X-thickness)/(divy+1) + yspacing=(Y-thickness)/(divx+1) + xholes = 1 if piece[6]<3 else 0 + yholes = 1 if piece[6]!=2 else 0 + wall = 1 if piece[6]>1 else 0 + floor = 1 if piece[6]==1 else 0 + railholes = 1 if piece[6]==3 else 0 + + group = newGroup(self) + + if schroff and railholes: + log("rail holes enabled on piece %d at (%d, %d)" % (idx, x+thickness,y+thickness)) + log("abcd = (%d,%d,%d,%d)" % (a,b,c,d)) + log("dxdy = (%d,%d)" % (dx,dy)) + rhxoffset = rail_mount_depth + thickness + if idx == 1: + rhx=x+rhxoffset + elif idx == 3: + rhx=x-rhxoffset+dx + else: + rhx=0 + log("rhxoffset = %d, rhx= %d" % (rhxoffset, rhx)) + rystart=y+(rail_height/2)+thickness + if rows == 1: + log("just one row this time, rystart = %d" % rystart) + rh1y=rystart+rail_mount_centre_offset + rh2y=rh1y+(row_centre_spacing-rail_mount_centre_offset) + group.add(getCircle(rail_mount_radius,(rhx,rh1y))) + group.add(getCircle(rail_mount_radius,(rhx,rh2y))) + else: + for n in range(0,rows): + log("drawing row %d, rystart = %d" % (n+1, rystart)) + # if holes are offset (eg. Vector T-strut rails), they should be offset + # toward each other, ie. toward the centreline of the Schroff row + rh1y=rystart+rail_mount_centre_offset + rh2y=rh1y+row_centre_spacing-rail_mount_centre_offset + group.add(getCircle(rail_mount_radius,(rhx,rh1y))) + group.add(getCircle(rail_mount_radius,(rhx,rh2y))) + rystart+=row_centre_spacing+row_spacing+rail_height + + # generate and draw the sides of each piece + side(group,(x,y),(d,a),(-b,a),atabs * (-thickness if a else thickness),dx,(1,0),a,0,(keydivfloor|wall) * (keydivwalls|floor) * divx*yholes*atabs,yspacing) # side a + side(group,(x+dx,y),(-b,a),(-b,-c),btabs * (thickness if b else -thickness),dy,(0,1),b,0,(keydivfloor|wall) * (keydivwalls|floor) * divy*xholes*btabs,xspacing) # side b + if atabs: + side(group,(x+dx,y+dy),(-b,-c),(d,-c),ctabs * (thickness if c else -thickness),dx,(-1,0),c,0,0,0) # side c + else: + side(group,(x+dx,y+dy),(-b,-c),(d,-c),ctabs * (thickness if c else -thickness),dx,(-1,0),c,0,(keydivfloor|wall) * (keydivwalls|floor) * divx*yholes*ctabs,yspacing) # side c + if btabs: + side(group,(x,y+dy),(d,-c),(d,a),dtabs * (-thickness if d else thickness),dy,(0,-1),d,0,0,0) # side d + else: + side(group,(x,y+dy),(d,-c),(d,a),dtabs * (-thickness if d else thickness),dy,(0,-1),d,0,(keydivfloor|wall) * (keydivwalls|floor) * divy*xholes*dtabs,xspacing) # side d + + if idx==0: + # remove tabs from dividers if not required + if not keydivfloor: + a=c=1 + atabs=ctabs=0 + if not keydivwalls: + b=d=1 + btabs=dtabs=0 + + y=4*spacing+1*Y+2*Z # root y co-ord for piece + for n in range(0,divx): # generate X dividers + group = newGroup(self) + x=n*(spacing+X) # root x co-ord for piece + side(group,(x,y),(d,a),(-b,a),keydivfloor*atabs*(-thickness if a else thickness),dx,(1,0),a,1,0,0) # side a + side(group,(x+dx,y),(-b,a),(-b,-c),keydivwalls*btabs*(thickness if b else -thickness),dy,(0,1),b,1,divy*xholes,xspacing) # side b + side(group,(x+dx,y+dy),(-b,-c),(d,-c),keydivfloor*ctabs*(thickness if c else -thickness),dx,(-1,0),c,1,0,0) # side c + side(group,(x,y+dy),(d,-c),(d,a),keydivwalls*dtabs*(-thickness if d else thickness),dy,(0,-1),d,1,0,0) # side d + elif idx==1: + y=5*spacing+1*Y+3*Z # root y co-ord for piece + for n in range(0,divy): # generate Y dividers + group = newGroup(self) + x=n*(spacing+Z) # root x co-ord for piece + side(group,(x,y),(d,a),(-b,a),keydivwalls*atabs*(-thickness if a else thickness),dx,(1,0),a,1,divx*yholes,yspacing) # side a + side(group,(x+dx,y),(-b,a),(-b,-c),keydivfloor*btabs*(thickness if b else -thickness),dy,(0,1),b,1,0,0) # side b + side(group,(x+dx,y+dy),(-b,-c),(d,-c),keydivwalls*ctabs*(thickness if c else -thickness),dx,(-1,0),c,1,0,0) # side c + side(group,(x,y+dy),(d,-c),(d,a),keydivfloor*dtabs*(-thickness if d else thickness),dy,(0,-1),d,1,0,0) # side d + +# Create effect instance and apply it. +effect = BoxMaker() +effect.run() diff --git a/packer/ansible/roles/inkscape/files/tabbed_box_maker/schroffmaker.inx b/packer/ansible/roles/inkscape/files/tabbed_box_maker/schroffmaker.inx new file mode 100755 index 0000000..09e8c12 --- /dev/null +++ b/packer/ansible/roles/inkscape/files/tabbed_box_maker/schroffmaker.inx @@ -0,0 +1,47 @@ + + + <_name>Schroff Box Maker + eu.twot.render.schroffboxmaker + + mm + 1 + 1 + 1 + 84 + 0.0 + 0.0 + 65 + + + 10.0 + 17.4 + 0.0 + 0.0 + + 6.0 + + <_option value="0">Fixed + <_option value="1">Proportional + + + 3.0 + 0.1 + 0.01 + 0 + 0 + + 1 + 2 + + 1.0 + + + all + + + + + + diff --git a/packer/ansible/roles/inkscape/tasks/main.yml b/packer/ansible/roles/inkscape/tasks/main.yml index 842910d..4fde435 100644 --- a/packer/ansible/roles/inkscape/tasks/main.yml +++ b/packer/ansible/roles/inkscape/tasks/main.yml @@ -6,5 +6,8 @@ - import_tasks: silhouette.yml tags: - inkscape:silhouette + - import_tasks: tabbed_box_maker.yml + tags: + - inkscape:tabbed_box_maker tags: - inkscape diff --git a/packer/ansible/roles/inkscape/tasks/tabbed_box_maker.yml b/packer/ansible/roles/inkscape/tasks/tabbed_box_maker.yml new file mode 100644 index 0000000..5725b03 --- /dev/null +++ b/packer/ansible/roles/inkscape/tasks/tabbed_box_maker.yml @@ -0,0 +1,11 @@ +--- +- name: copy files + copy: + src: tabbed_box_maker/{{ item }} + dest: /usr/share/inkscape/extensions + owner: root + group: root + loop: + - boxmaker.inx + - boxmaker.py + - schroffmaker.inx From 5c507550a16ed0150e8313363777084826ec45a5 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sun, 1 Jan 2023 14:56:44 +0000 Subject: [PATCH 17/36] Fix Ansible file transfer issue Fixes `failed to transfer file` issue See https://github.com/hashicorp/packer/issues/11783 --- packer/debian-bullseye.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packer/debian-bullseye.yaml b/packer/debian-bullseye.yaml index 8ac119d..0a7285a 100644 --- a/packer/debian-bullseye.yaml +++ b/packer/debian-bullseye.yaml @@ -70,6 +70,9 @@ provisioners: ansible_env_vars: - "ANSIBLE_SSH_ARGS='-o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa'" - "ANSIBLE_PYTHON_INTERPRETER=/usr/bin/python3" + extra_arguments: + - "--scp-extra-args" + - "'-O'" - inline: - rm /boot && mkdir /boot type: shell From 9c822bbba74544097289acec5143a25d3b918793 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sat, 11 Feb 2023 21:08:39 +0000 Subject: [PATCH 18/36] Update to Debian bookworm --- .gitlab-ci.yml | 2 +- Makefile | 30 +++++++++---------- ...ian-bullseye.yaml => debian-bookworm.yaml} | 4 +-- security-scanner/Dockerfile | 2 +- txt.cfg | 4 +-- 5 files changed, 21 insertions(+), 21 deletions(-) rename packer/{debian-bullseye.yaml => debian-bookworm.yaml} (98%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1736a1..b7b0d89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,7 +74,7 @@ security_scanner: services: - docker:dind script: - - scripts/packer.sh debian-bullseye + - scripts/packer.sh debian-bookworm - aws --endpoint-url "$AWS_ENDPOINT_URL" s3 cp images/ "s3://$AWS_BUCKET/$CI_COMMIT_REF_SLUG/$CI_JOB_ID/" --recursive --no-progress artifacts: paths: diff --git a/Makefile b/Makefile index b201b6e..413424f 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ qemu_network = 10.2.2.0 qemu_netmask = 24 qemu_vm_ip = 10.2.2.10 qemu_disk = tmp/qemu-disk.img -qemu_target ?= debian-bullseye +qemu_target ?= debian-bookworm qemu_kernel = $(qemu_target).linux qemu_torrent = $(qemu_target).torrent qemu_initramfs = $(shell \ @@ -35,7 +35,7 @@ fi \ ci_environment=$(shell env | sed -n 's/^\(CI_.*\)=.*/-e \1/p') .PHONY: default -default: builderimg images/debian-bullseye.squashfs +default: builderimg images/debian-bookworm.squashfs .PHONY: clean clean: @@ -60,7 +60,7 @@ images: [ ! -d "$@" ] && mkdir "$@" touch "$@" -images/debian-bullseye.squashfs: images +images/debian-bookworm.squashfs: images docker run \ --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ @@ -72,9 +72,9 @@ images/debian-bullseye.squashfs: images $(ci_environment) \ "$(DOCKER_IMAGE_BUILDER)" \ scripts/packer.sh \ - debian-bullseye + debian-bookworm -images/debian-bullseye.torrent: images +images/debian-bookworm.torrent: images docker run \ --rm \ -v "${PWD}:${PWD}" \ @@ -82,7 +82,7 @@ images/debian-bullseye.torrent: images -e "WEBSEED=$(WEBSEED)" \ "$(DOCKER_IMAGE_BUILDER)" \ scripts/torrent.sh \ - debian-bullseye + debian-bookworm .PHONY: ansible ansible: @@ -104,24 +104,24 @@ ansible: # updates the initramfs # only used for development -images/debian-bullseye.initramfs.dev: tmp/initramfs-extracted/debian-bullseye packer/initramfs/labsync - cp packer/initramfs/labsync tmp/initramfs-extracted/debian-bullseye/scripts/labsync - (cd tmp/initramfs-extracted/debian-bullseye && find . | cpio -H newc -o | gzip > $(CWD)/images/debian-bullseye.initramfs.dev) +images/debian-bookworm.initramfs.dev: tmp/initramfs-extracted/debian-bookworm packer/initramfs/labsync + cp packer/initramfs/labsync tmp/initramfs-extracted/debian-bookworm/scripts/labsync + (cd tmp/initramfs-extracted/debian-bookworm && find . | cpio -H newc -o | gzip > $(CWD)/images/debian-bookworm.initramfs.dev) tmp: [ ! -d "$@" ] && mkdir "$@" || true -tmp/initramfs-extracted/debian-bullseye: images/debian-bullseye.initramfs - rm -rf tmp/initramfs-extracted/debian-bullseye - mkdir -p tmp/initramfs-extracted/debian-bullseye - (cd tmp/initramfs-extracted/debian-bullseye && zcat "$(CWD)/images/debian-bullseye.initramfs" | cpio -i) - touch tmp/initramfs-extracted/debian-bullseye +tmp/initramfs-extracted/debian-bookworm: images/debian-bookworm.initramfs + rm -rf tmp/initramfs-extracted/debian-bookworm + mkdir -p tmp/initramfs-extracted/debian-bookworm + (cd tmp/initramfs-extracted/debian-bookworm && zcat "$(CWD)/images/debian-bookworm.initramfs" | cpio -i) + touch tmp/initramfs-extracted/debian-bookworm $(qemu_disk): tmp qemu-img create "$@" 20G tmp/netboot.tar.gz: tmp - wget -c -O "$@" https://cdn-aws.deb.debian.org/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz + wget -c -O "$@" https://cdn-aws.deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/netboot.tar.gz touch "$@" tmp/tftproot: tmp/netboot.tar.gz diff --git a/packer/debian-bullseye.yaml b/packer/debian-bookworm.yaml similarity index 98% rename from packer/debian-bullseye.yaml rename to packer/debian-bookworm.yaml index 0a7285a..8d9d0a5 100644 --- a/packer/debian-bullseye.yaml +++ b/packer/debian-bookworm.yaml @@ -20,7 +20,7 @@ variables: builders: - discard: true - image: debian:bullseye + image: debian:bookworm type: docker volumes: '{{user `images`}}': /tmp/images @@ -62,7 +62,7 @@ provisioners: - cp $(find /boot/ -name 'vmlinuz-*' | sort -V | tail -n 1) '/tmp/images/{{user `linux_file`}}' type: shell - inline: - - apt-get -y install openssh-server python lsb-release + - apt-get -y install openssh-server python3 lsb-release type: shell - playbook_file: ansible/playbook.yml type: ansible diff --git a/security-scanner/Dockerfile b/security-scanner/Dockerfile index 677e003..10110ad 100644 --- a/security-scanner/Dockerfile +++ b/security-scanner/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim +FROM debian:bookworm-slim RUN apt-get update \ && apt-get -y install \ diff --git a/txt.cfg b/txt.cfg index 1cfc6a4..c61741b 100644 --- a/txt.cfg +++ b/txt.cfg @@ -1,7 +1,7 @@ label labsync menu label ^labsync - kernel images/debian-bullseye.linux - append initrd=images/debian-bullseye.initramfs.dev boot=labsync labsync_disk=sda labsync_partsize_boot=512 labsync_torrent=http://10.2.2.1/debian-bullseye.torrent quiet vga=792 ip=10.2.2.10:::255.255.255.0:qemu-host:ens3:off labsync_wait=pause + kernel images/debian-bookworm.linux + append initrd=images/debian-bookworm.initramfs.dev boot=labsync labsync_disk=sda labsync_partsize_boot=512 labsync_torrent=http://10.2.2.1/debian-bookworm.torrent quiet vga=792 ip=10.2.2.10:::255.255.255.0:qemu-host:ens3:off labsync_wait=pause label install menu label ^Install From 14e7d09c694ae98ac0af82a3dd8e40440f3d276e Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sat, 11 Feb 2023 22:43:00 +0000 Subject: [PATCH 19/36] Set wiki as homepage --- packer/ansible/roles/firefox/files/policies.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/ansible/roles/firefox/files/policies.json b/packer/ansible/roles/firefox/files/policies.json index 65685f9..46d5317 100644 --- a/packer/ansible/roles/firefox/files/policies.json +++ b/packer/ansible/roles/firefox/files/policies.json @@ -19,7 +19,7 @@ "NoDefaultBookmarks": true, "OfferToSaveLogins": true, "Homepage": { - "URL": "about:blank" + "URL": "https://wiki.fablab-nea.de/" }, "OverrideFirstRunPage": "", "SearchEngines": { From db9fc6af8bf51c76ccee441cb24072553080dcee Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sat, 11 Feb 2023 23:10:35 +0000 Subject: [PATCH 20/36] Remove HTTPS Everywhere It is no longer maintained by EFF and deprecated in favour of native browser support. --- packer/ansible/playbook.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index 73983eb..ae8bd60 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -94,7 +94,6 @@ - de extensions: - uBlock0@raymondhill.net - - https-everywhere@eff.org debian_sections: - main - contrib From 2835e9380a17c935ddb764a3d12aa1e519ee5740 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sun, 12 Feb 2023 00:00:54 +0000 Subject: [PATCH 21/36] Remove `firmware-and-graphics` package as it is not available on bookworm. --- packer/ansible/playbook.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index ae8bd60..8fb1adf 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -100,8 +100,7 @@ - non-free debian_mirror: http://ftp.de.debian.org/debian hardware: - firmware: - - firmware-amd-graphics + firmware: [] greeting: title: Willkommen im FabLab Bad Windsheim content: > From 1c158dcca275577ebac798b12fb3de2ec6c7ec9c Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Fri, 17 Feb 2023 18:17:37 +0000 Subject: [PATCH 22/36] Add font viewer --- packer/ansible/roles/fonts/tasks/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packer/ansible/roles/fonts/tasks/main.yml b/packer/ansible/roles/fonts/tasks/main.yml index 2f8f750..6408a58 100644 --- a/packer/ansible/roles/fonts/tasks/main.yml +++ b/packer/ansible/roles/fonts/tasks/main.yml @@ -3,5 +3,11 @@ - import_tasks: google.yml tags: - fonts:google + - name: Install font viewer + apt: + name: + - fontmatrix + tags: + - fonts:fontmatrix tags: - fonts From f64f9028bb81472f613a1dad3a12374b5716c967 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 9 Mar 2023 23:38:39 +0000 Subject: [PATCH 23/36] Use virtualenv --- .gitlab-ci.yml | 2 +- security-scanner/Dockerfile | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b7b0d89..93829cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,7 +57,7 @@ security_scanner: script: - set -x - export GITLAB_URL="$(echo "$CI_PROJECT_URL" | grep -Eo '^https?://[^/]*')" - - python3 -m security_scanner $target + - /code/venv/bin/python -m security_scanner $target only: refs: - schedules diff --git a/security-scanner/Dockerfile b/security-scanner/Dockerfile index 10110ad..622e443 100644 --- a/security-scanner/Dockerfile +++ b/security-scanner/Dockerfile @@ -7,14 +7,17 @@ RUN apt-get update \ python3 \ python3-apt \ python3-pip \ + python3-venv \ && rm -rf /var/lib/apt/lists/* COPY setup.py /code/setup.py WORKDIR /code -RUN pip3 install -e . +RUN python3 -m venv --system-site-packages venv + +RUN venv/bin/pip install -e . ADD . /code -RUN python3 setup.py install +RUN venv/bin/python setup.py install From 2db45a612bbd8e2d651833860e14d745ba7e25dc Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sun, 12 Mar 2023 20:47:19 +0000 Subject: [PATCH 24/36] Disable platformio pip install without venv is not possible on bookworm. As I don't want to fix it now, let's remove it until I have time to fix it properly. --- packer/ansible/roles/fablab/tasks/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packer/ansible/roles/fablab/tasks/main.yml b/packer/ansible/roles/fablab/tasks/main.yml index 4702f08..40c6d9a 100644 --- a/packer/ansible/roles/fablab/tasks/main.yml +++ b/packer/ansible/roles/fablab/tasks/main.yml @@ -24,8 +24,8 @@ - import_tasks: prusa.yml tags: - fablab:prusa - - import_tasks: platformio.yml - tags: - - fablab:platformio +# - import_tasks: platformio.yml +# tags: +# - fablab:platformio tags: - fablab From 6f52c72093d2f0dd6e6e2819d3c9734f6bd8a196 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 6 Apr 2023 21:55:13 +0000 Subject: [PATCH 25/36] Update inkscape-silhouette --- packer/ansible/roles/inkscape/files/inkscape-silhouette | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packer/ansible/roles/inkscape/files/inkscape-silhouette b/packer/ansible/roles/inkscape/files/inkscape-silhouette index 05d9c57..2f40eef 160000 --- a/packer/ansible/roles/inkscape/files/inkscape-silhouette +++ b/packer/ansible/roles/inkscape/files/inkscape-silhouette @@ -1 +1 @@ -Subproject commit 05d9c57336b13028c01c5bfd850431708c934016 +Subproject commit 2f40eef85264eb6646ea7e89cbd4659560b88235 From 76da536bbdaa93a85eeda086ad13c402d5b15ee7 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 13 Jul 2023 02:10:45 +0000 Subject: [PATCH 26/36] Rename CI token variable --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 93829cb..a173edc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,7 +23,7 @@ dockerimage_builder: - docker:dind script: - docker pull $DOCKER_IMAGE_BUILDER || true - - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make builderimg - docker push $DOCKER_IMAGE_BUILDER tags: @@ -41,7 +41,7 @@ dockerimage_security_scanner: - docker:dind script: - docker pull $DOCKER_IMAGE_SECURITY_SCANNER || true - - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make secscanimg - docker push $DOCKER_IMAGE_SECURITY_SCANNER tags: From 1e0e997f17cf73e8e6b1c9f0d9e73f7dddef8720 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 13 Jul 2023 10:22:20 +0000 Subject: [PATCH 27/36] Update tags The `dedicated` runner was removed --- .gitlab-ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a173edc..c430cd6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,6 @@ dockerimage_builder: - docker push $DOCKER_IMAGE_BUILDER tags: - fablab - - ssd except: refs: - schedules @@ -46,7 +45,6 @@ dockerimage_security_scanner: - docker push $DOCKER_IMAGE_SECURITY_SCANNER tags: - fablab - - ssd except: refs: - schedules @@ -66,7 +64,7 @@ security_scanner: - $task == "security-scanner" - $target tags: - - dedicated + - fablab .squashfs_template: &squashfs_template image: $DOCKER_IMAGE_BUILDER From 27ec180b7940d07ae6df334db370e100b56e3d2d Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 7 Sep 2023 19:31:11 +0000 Subject: [PATCH 28/36] Use lightburn without docker --- .gitlab-ci.yml | 11 ++++ packer/ansible/playbook.yml | 4 ++ .../fablab/files/lightburn/lightburn.desktop | 9 --- .../roles/fablab/files/lightburn/lightburn.sh | 34 ---------- .../ansible/roles/fablab/tasks/lightburn.yml | 66 ------------------- packer/ansible/roles/fablab/tasks/main.yml | 3 - .../fablab/templates/lightburn/lightburn.j2 | 1 - packer/ansible/roles/lightburn/.gitignore | 1 + .../roles/lightburn/files/lightburn.desktop | 6 ++ .../ansible/roles/lightburn/tasks/devices.yml | 34 ++++++++++ .../ansible/roles/lightburn/tasks/install.yml | 13 ++++ packer/ansible/roles/lightburn/tasks/main.yml | 10 +++ 12 files changed, 79 insertions(+), 113 deletions(-) delete mode 100644 packer/ansible/roles/fablab/files/lightburn/lightburn.desktop delete mode 100755 packer/ansible/roles/fablab/files/lightburn/lightburn.sh delete mode 100644 packer/ansible/roles/fablab/tasks/lightburn.yml delete mode 100755 packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 create mode 100644 packer/ansible/roles/lightburn/.gitignore create mode 100644 packer/ansible/roles/lightburn/files/lightburn.desktop create mode 100644 packer/ansible/roles/lightburn/tasks/devices.yml create mode 100644 packer/ansible/roles/lightburn/tasks/install.yml create mode 100644 packer/ansible/roles/lightburn/tasks/main.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c430cd6..77525ea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,6 +66,17 @@ security_scanner: tags: - fablab +lightburn-download: + stage: prepare + image: alpine + script: + - mkdir -p packer/ansible/roles/lightburn/files + - 'wget -O packer/ansible/roles/lightburn/files/lightburn.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_SERVER_URL}/api/v4/projects/fablab%2Flightburn-patched/jobs/artifacts/main/download?job=patch-Linux64"' + artifacts: + paths: + - packer/ansible/roles/lightburn/files/lightburn.zip + expire_in: 4 hours + .squashfs_template: &squashfs_template image: $DOCKER_IMAGE_BUILDER stage: build diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index 8fb1adf..22db53b 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -11,6 +11,7 @@ - role: firefox - role: windowmanager - role: inkscape + - role: lightburn - role: fablab - role: hardware - role: docker @@ -109,3 +110,6 @@ Du hast Dich mit einem Gast-Account angemeldet. Alle Daten werden nach der Anmeldung gelöscht. Wenn Du Deine Daten dauerhaft speichern möchtest, lege Dir bitte einen Account an! + lightburn: + devices: + - https://raw.githubusercontent.com/fablab-nea/LaserKutter/main/lightburn/LaserKutter.lbdev diff --git a/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop b/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop deleted file mode 100644 index 90496bc..0000000 --- a/packer/ansible/roles/fablab/files/lightburn/lightburn.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Name=LightBurn -GenericName=LightBurn -Comment=Laser Cutter Job Control Application -Exec=x-terminal-emulator -e 'sudo /usr/local/bin/lightburn' -Icon=/usr/local/share/lightburn/lightburn.png -Terminal=false -Type=Application -Categories=Graphics diff --git a/packer/ansible/roles/fablab/files/lightburn/lightburn.sh b/packer/ansible/roles/fablab/files/lightburn/lightburn.sh deleted file mode 100755 index 5e84a58..0000000 --- a/packer/ansible/roles/fablab/files/lightburn/lightburn.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -. /etc/default/lightburn - -if [ ! -z "$SUDO_COMMAND" ] && [ "$SUDO_COMMAND" = "$0" ]; then - home="$(getent passwd "$SUDO_UID" | cut -d: -f6)" - export PUID="$SUDO_UID" - export PGID="$SUDO_GID" -else - home="$HOME" - export PUID=$(id -u) - export PGID=$(id -g) -fi - -config_dir="$home/.config/lightburn" - -mkdir -p "$config_dir" - -media="/media/$(id -un $PUID)" -if [ -e "$media" ]; then - media_volume="-v $media:/media" -fi - -docker run \ - --rm \ - -e PUID \ - -e PGID \ - -e DISPLAY \ - -v /tmp/.X11-unix/:/tmp/.X11-unix/ \ - -v $config_dir:/config/ \ - -v $home:/workdir/ \ - $media_volume \ - --network=none \ - "$LIGHTBURN_DOCKER_IMAGE" diff --git a/packer/ansible/roles/fablab/tasks/lightburn.yml b/packer/ansible/roles/fablab/tasks/lightburn.yml deleted file mode 100644 index 19f9386..0000000 --- a/packer/ansible/roles/fablab/tasks/lightburn.yml +++ /dev/null @@ -1,66 +0,0 @@ ---- -- file: - path: /usr/local/share/lightburn - state: directory - mode: "0755" - owner: root - group: root - -- name: copy icon - copy: - src: lightburn/lightburn.png - dest: /usr/local/share/lightburn/lightburn.png - owner: root - group: root - mode: "0644" - -- name: copy script - copy: - src: lightburn/lightburn.sh - dest: /usr/local/bin/lightburn - owner: root - group: root - mode: "0755" - -- name: add lightburn configuration - template: - src: lightburn/lightburn.j2 - dest: /etc/default/lightburn - owner: root - group: root - mode: "0644" - -- name: add lightburn to applications menu - copy: - src: lightburn/lightburn.desktop - dest: /usr/share/applications/lightburn.desktop - owner: root - group: root - mode: "0644" - -- name: add group - group: - name: lightburn - system: yes - -- name: add sudoers config - copy: - content: "%lightburn ALL=/usr/local/bin/lightburn, NOPASSWD:/usr/local/bin/lightburn\n" - dest: /etc/sudoers.d/lightburn - owner: root - group: root - mode: "0644" - -- name: ensure guest-account settings directory exists - file: - path: /etc/guest-account - state: directory - mode: "0755" - owner: root - group: root - -- name: add lightburn group to guest account - lineinfile: - path: /etc/guest-account/groups - line: lightburn - create: yes diff --git a/packer/ansible/roles/fablab/tasks/main.yml b/packer/ansible/roles/fablab/tasks/main.yml index 40c6d9a..02faee9 100644 --- a/packer/ansible/roles/fablab/tasks/main.yml +++ b/packer/ansible/roles/fablab/tasks/main.yml @@ -18,9 +18,6 @@ - import_tasks: visicut.yml tags: - fablab:visicut - - import_tasks: lightburn.yml - tags: - - fablab:lightburn - import_tasks: prusa.yml tags: - fablab:prusa diff --git a/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 b/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 deleted file mode 100755 index bf7cfad..0000000 --- a/packer/ansible/roles/fablab/templates/lightburn/lightburn.j2 +++ /dev/null @@ -1 +0,0 @@ -LIGHTBURN_DOCKER_IMAGE='{{ fablab.lightburn.dockerimage }}' diff --git a/packer/ansible/roles/lightburn/.gitignore b/packer/ansible/roles/lightburn/.gitignore new file mode 100644 index 0000000..c4c4ffc --- /dev/null +++ b/packer/ansible/roles/lightburn/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/packer/ansible/roles/lightburn/files/lightburn.desktop b/packer/ansible/roles/lightburn/files/lightburn.desktop new file mode 100644 index 0000000..62d3c05 --- /dev/null +++ b/packer/ansible/roles/lightburn/files/lightburn.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name=LightBurn +Exec=/opt/LightBurn/LightBurn +Icon=/opt/LightBurn/LightBurn.png +Type=Application +Categories=Graphics;VectorGraphics;Engineering; diff --git a/packer/ansible/roles/lightburn/tasks/devices.yml b/packer/ansible/roles/lightburn/tasks/devices.yml new file mode 100644 index 0000000..2981a65 --- /dev/null +++ b/packer/ansible/roles/lightburn/tasks/devices.yml @@ -0,0 +1,34 @@ +- name: Download devices files + uri: + url: "{{ device_url }}" + return_content: true + loop: "{{ lightburn.devices }}" + loop_control: + loop_var: device_url + register: lightburn_downloaded_devices + +- name: Create lightburn settings + set_fact: + lightburn_devices: "{{ lightburn_devices | default([]) + [device_settings] }}" + vars: + device_settings: "{{ (device.content | from_json)['DeviceList'][0] }}" + loop: "{{ lightburn_downloaded_devices.results }}" + loop_control: + loop_var: device + label: "{{ device_settings.DisplayName }}" + +- name: Create settings directory + file: + path: "{{ item }}" + state: directory + loop: + - /etc/skel/.config + - /etc/skel/.config/LightBurn + +- name: Create settings file + copy: + dest: /etc/skel/.config/LightBurn/prefs.ini + content: "{{ lightburn_settings | to_nice_json() }}" + vars: + lightburn_settings: + DeviceList: "{{ lightburn_devices }}" diff --git a/packer/ansible/roles/lightburn/tasks/install.yml b/packer/ansible/roles/lightburn/tasks/install.yml new file mode 100644 index 0000000..cd9895d --- /dev/null +++ b/packer/ansible/roles/lightburn/tasks/install.yml @@ -0,0 +1,13 @@ +--- +- name: Extract zip file + unarchive: + src: lightburn.zip + dest: /opt +- name: Create applications directory + file: + path: /usr/local/share/applications/ + state: directory +- name: Copy desktop file + copy: + src: lightburn.desktop + dest: /usr/local/share/applications/lightburn.desktop diff --git a/packer/ansible/roles/lightburn/tasks/main.yml b/packer/ansible/roles/lightburn/tasks/main.yml new file mode 100644 index 0000000..82ab78c --- /dev/null +++ b/packer/ansible/roles/lightburn/tasks/main.yml @@ -0,0 +1,10 @@ +--- +- block: + - import_tasks: install.yml + tags: + - lightburn:install + - import_tasks: devices.yml + tags: + - lightburn:devices + tags: + - lightburn From dbb05df99fcdf5e143188fbda7faa85bb38cd2b9 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 7 Sep 2023 22:36:48 +0000 Subject: [PATCH 29/36] Remove tags --- .gitlab-ci.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 77525ea..670a6ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -26,8 +26,6 @@ dockerimage_builder: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make builderimg - docker push $DOCKER_IMAGE_BUILDER - tags: - - fablab except: refs: - schedules @@ -43,8 +41,6 @@ dockerimage_security_scanner: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make secscanimg - docker push $DOCKER_IMAGE_SECURITY_SCANNER - tags: - - fablab except: refs: - schedules @@ -63,8 +59,6 @@ security_scanner: variables: - $task == "security-scanner" - $target - tags: - - fablab lightburn-download: stage: prepare @@ -93,9 +87,6 @@ lightburn-download: - images/*.linux #- images/*.squashfs - images/*.torrent - tags: - - fablab - - ssd squashfs_featurebranch: <<: *squashfs_template From d372cd9f098a79f7fefff1e5c8d74fa3341f5bc0 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 14 Sep 2023 20:19:04 +0000 Subject: [PATCH 30/36] Move prusa-slicer to own role --- packer/ansible/playbook.yml | 91 ++++++++++--------- packer/ansible/roles/fablab/tasks/main.yml | 3 - .../tasks/configure.yml} | 7 +- .../roles/prusa-slicer/tasks/install.yml | 5 + .../ansible/roles/prusa-slicer/tasks/main.yml | 12 +++ 5 files changed, 64 insertions(+), 54 deletions(-) rename packer/ansible/roles/{fablab/tasks/prusa.yml => prusa-slicer/tasks/configure.yml} (78%) create mode 100644 packer/ansible/roles/prusa-slicer/tasks/install.yml create mode 100644 packer/ansible/roles/prusa-slicer/tasks/main.yml diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index 22db53b..b994b60 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -12,6 +12,7 @@ - role: windowmanager - role: inkscape - role: lightburn + - role: prusa-slicer - role: fablab - role: hardware - role: docker @@ -45,51 +46,6 @@ version: 3.3.1 lightburn: dockerimage: r.jalr.de/fablab/lightburn - prusa_slicer: - settings: | - no_controller = 1 - no_defaults = 1 - preset_update = 0 - show_splash_screen = 0 - use_inches = 0 - version_check = 0 - view_mode = expert - - [filaments] - AmazonBasics TPU @MINI = 1 - Das Filament PLA = 1 - Generic PETG = 1 - Generic PETG @MINI = 1 - Generic PETG @MMU2 = 1 - Generic PLA = 1 - Generic PLA @MMU2 = 1 - Prusament ASA = 1 - Prusament ASA @MINI = 1 - Prusament ASA @MMU2 = 1 - Prusament PC Blend = 1 - Prusament PC Blend @MINI = 1 - Prusament PC Blend @MMU2 = 1 - Prusament PETG = 1 - Prusament PETG @MINI = 1 - Prusament PETG @MMU2 = 1 - Prusament PLA = 1 - Prusament PLA @MMU2 = 1 - Prusament PVB = 1 - Prusament PVB @MMU2 = 1 - Verbatim BVOH = 1 - Verbatim BVOH @MMU2 = 1 - - [presets] - filament = Prusament PLA - physical_printer = - print = 0.15mm QUALITY @MK3 - printer = Original Prusa i3 MK3 - sla_material = - sla_print = - - [vendor:PrusaResearch] - model:MK3 = 0.4 - model:MK3SMMU2S = 0.4 firefox: language_packs: - de @@ -113,3 +69,48 @@ lightburn: devices: - https://raw.githubusercontent.com/fablab-nea/LaserKutter/main/lightburn/LaserKutter.lbdev + prusa_slicer: + settings: | + no_controller = 1 + no_defaults = 1 + preset_update = 0 + show_splash_screen = 0 + use_inches = 0 + version_check = 0 + view_mode = expert + + [filaments] + AmazonBasics TPU @MINI = 1 + Das Filament PLA = 1 + Generic PETG = 1 + Generic PETG @MINI = 1 + Generic PETG @MMU2 = 1 + Generic PLA = 1 + Generic PLA @MMU2 = 1 + Prusament ASA = 1 + Prusament ASA @MINI = 1 + Prusament ASA @MMU2 = 1 + Prusament PC Blend = 1 + Prusament PC Blend @MINI = 1 + Prusament PC Blend @MMU2 = 1 + Prusament PETG = 1 + Prusament PETG @MINI = 1 + Prusament PETG @MMU2 = 1 + Prusament PLA = 1 + Prusament PLA @MMU2 = 1 + Prusament PVB = 1 + Prusament PVB @MMU2 = 1 + Verbatim BVOH = 1 + Verbatim BVOH @MMU2 = 1 + + [presets] + filament = Prusament PLA + physical_printer = + print = 0.15mm QUALITY @MK3 + printer = Original Prusa i3 MK3 + sla_material = + sla_print = + + [vendor:PrusaResearch] + model:MK3 = 0.4 + model:MK3SMMU2S = 0.4 diff --git a/packer/ansible/roles/fablab/tasks/main.yml b/packer/ansible/roles/fablab/tasks/main.yml index 02faee9..1bb8ab5 100644 --- a/packer/ansible/roles/fablab/tasks/main.yml +++ b/packer/ansible/roles/fablab/tasks/main.yml @@ -18,9 +18,6 @@ - import_tasks: visicut.yml tags: - fablab:visicut - - import_tasks: prusa.yml - tags: - - fablab:prusa # - import_tasks: platformio.yml # tags: # - fablab:platformio diff --git a/packer/ansible/roles/fablab/tasks/prusa.yml b/packer/ansible/roles/prusa-slicer/tasks/configure.yml similarity index 78% rename from packer/ansible/roles/fablab/tasks/prusa.yml rename to packer/ansible/roles/prusa-slicer/tasks/configure.yml index 8211e1c..817ae54 100644 --- a/packer/ansible/roles/fablab/tasks/prusa.yml +++ b/packer/ansible/roles/prusa-slicer/tasks/configure.yml @@ -1,9 +1,4 @@ --- -- name: install slic3r-prusa - apt: - name: slic3r-prusa - state: present - - name: create skel directories file: path: "/etc/skel/{{ item }}" @@ -21,5 +16,5 @@ - name: Copy Prusa slicer settings copy: - content: "{{ fablab.prusa_slicer.settings }}" + content: "{{ prusa_slicer.settings }}" dest: /etc/skel/.config/PrusaSlicer/PrusaSlicer.ini diff --git a/packer/ansible/roles/prusa-slicer/tasks/install.yml b/packer/ansible/roles/prusa-slicer/tasks/install.yml new file mode 100644 index 0000000..31a992c --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/tasks/install.yml @@ -0,0 +1,5 @@ +--- +- name: install slic3r-prusa + apt: + name: slic3r-prusa + state: present diff --git a/packer/ansible/roles/prusa-slicer/tasks/main.yml b/packer/ansible/roles/prusa-slicer/tasks/main.yml new file mode 100644 index 0000000..6f1600a --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/tasks/main.yml @@ -0,0 +1,12 @@ +--- +- block: + - import_tasks: install.yml + tags: + - prusa-slicer:install + + - import_tasks: configure.yml + tags: + - prusa-slicer:configure + + tags: + - prusa-slicer From 9e1f29dfd9e89984a6c47872d7b6b3af9534c0ec Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 14 Sep 2023 22:09:06 +0000 Subject: [PATCH 31/36] Download PrusaSlicer from GitHub --- packer/ansible/playbook.yml | 2 + .../roles/prusa-slicer/defaults/main.yml | 2 + .../files/PrusaGcodeviewer.desktop | 9 +++ .../prusa-slicer/files/PrusaSlicer.desktop | 12 ++++ .../roles/prusa-slicer/tasks/configure.yml | 27 ++++++++- .../tasks/install_from_github.yml | 60 +++++++++++++++++++ .../ansible/roles/prusa-slicer/tasks/main.yml | 8 ++- .../tasks/{install.yml => package.yml} | 0 8 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 packer/ansible/roles/prusa-slicer/defaults/main.yml create mode 100644 packer/ansible/roles/prusa-slicer/files/PrusaGcodeviewer.desktop create mode 100644 packer/ansible/roles/prusa-slicer/files/PrusaSlicer.desktop create mode 100644 packer/ansible/roles/prusa-slicer/tasks/install_from_github.yml rename packer/ansible/roles/prusa-slicer/tasks/{install.yml => package.yml} (100%) diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index b994b60..842fcd6 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -78,6 +78,8 @@ use_inches = 0 version_check = 0 view_mode = expert + tls_accepted_cert_store_location = /etc/ssl/certs/ca-certificates.crt + tls_cert_store_accepted = yes [filaments] AmazonBasics TPU @MINI = 1 diff --git a/packer/ansible/roles/prusa-slicer/defaults/main.yml b/packer/ansible/roles/prusa-slicer/defaults/main.yml new file mode 100644 index 0000000..cd9af8b --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/defaults/main.yml @@ -0,0 +1,2 @@ +--- +prusa_slicer_use_package: false diff --git a/packer/ansible/roles/prusa-slicer/files/PrusaGcodeviewer.desktop b/packer/ansible/roles/prusa-slicer/files/PrusaGcodeviewer.desktop new file mode 100644 index 0000000..51d1b4d --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/files/PrusaGcodeviewer.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Prusa GCode viewer +Exec=/opt/PrusaSlicer/bin/prusa-slicer --gcodeviewer %F +Icon=/opt/PrusaSlicer/resources/icons/PrusaSlicer-gcodeviewer.svg +Terminal=false +Type=Application +MimeType=text/x.gcode; +Categories=Graphics;3DGraphics; +Keywords=3D;Printing;Slicer; diff --git a/packer/ansible/roles/prusa-slicer/files/PrusaSlicer.desktop b/packer/ansible/roles/prusa-slicer/files/PrusaSlicer.desktop new file mode 100644 index 0000000..42680f4 --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/files/PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Terminal=false +Exec=/opt/PrusaSlicer/bin/prusa-slicer %F +Icon=/opt/PrusaSlicer/resources/icons/PrusaSlicer.png +Type=Application +MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer diff --git a/packer/ansible/roles/prusa-slicer/tasks/configure.yml b/packer/ansible/roles/prusa-slicer/tasks/configure.yml index 817ae54..c59887b 100644 --- a/packer/ansible/roles/prusa-slicer/tasks/configure.yml +++ b/packer/ansible/roles/prusa-slicer/tasks/configure.yml @@ -1,4 +1,12 @@ --- +- set_fact: + prusa_slicer_profiles_directory: /usr/share/PrusaSlicer/profiles + when: prusa_slicer_use_package | bool + +- set_fact: + prusa_slicer_profiles_directory: /opt/PrusaSlicer/resources/profiles + when: not prusa_slicer_use_package | bool + - name: create skel directories file: path: "/etc/skel/{{ item }}" @@ -10,11 +18,26 @@ - name: create symlink to vendor profiles file: - src: /usr/share/PrusaSlicer/profiles/PrusaResearch.ini + src: "{{ prusa_slicer_profiles_directory }}/PrusaResearch.ini" dest: /etc/skel/.config/PrusaSlicer/vendor/PrusaResearch.ini state: link +- name: Stat /opt/PrusaSlicer + stat: + path: /opt/PrusaSlicer + register: prusa_slicer_stat + +- name: Set version + set_fact: + prusa_slicer_version: "{{ prusa_slicer_stat.stat.lnk_target | regex_replace('^/opt/PrusaSlicer-(.*)-[0-9]{12}$', '\\1') }}" + when: prusa_slicer_stat.stat.exists and prusa_slicer_stat.stat.islnk + +- debug: + var: prusa_slicer_version + - name: Copy Prusa slicer settings copy: - content: "{{ prusa_slicer.settings }}" + content: | + version_system_info_sent = {{ prusa_slicer_version | default('') }} + {{ prusa_slicer.settings }} dest: /etc/skel/.config/PrusaSlicer/PrusaSlicer.ini diff --git a/packer/ansible/roles/prusa-slicer/tasks/install_from_github.yml b/packer/ansible/roles/prusa-slicer/tasks/install_from_github.yml new file mode 100644 index 0000000..c191e33 --- /dev/null +++ b/packer/ansible/roles/prusa-slicer/tasks/install_from_github.yml @@ -0,0 +1,60 @@ +--- +- name: Get latest release + uri: + url: https://api.github.com/repos/prusa3d/PrusaSlicer/releases/latest + return_content: true + register: prusa_slicer_release + +- name: Create tarball tempfile + tempfile: + state: file + suffix: .tar.gz + register: prusa_slicer_tarball + +- name: Select asset + set_fact: + prusa_slicer_asset: "{{ asset }}" + when: "asset.name | regex_search('PrusaSlicer-.*linux-x64-GTK3.*\\.tar\\.bz2$')" + loop: "{{ prusa_slicer_release.json.assets }}" + loop_control: + loop_var: asset + label: "{{ asset.name }}" + +- name: Download release file + get_url: + url: "{{ prusa_slicer_asset.browser_download_url }}" + dest: "{{ prusa_slicer_tarball.path }}" + force: true + +- name: Extract tarball + unarchive: + src: "{{ prusa_slicer_tarball.path }}" + dest: /opt + remote_src: true + +- name: Remove tarball + ansible.builtin.file: + path: "{{ prusa_slicer_tarball.path }}" + state: absent + when: prusa_slicer_tarball.path is defined + +- name: Create symlink + file: + src: "/opt/{{ prusa_slicer_directory }}" + dest: "/opt/PrusaSlicer" + state: link + vars: + prusa_slicer_directory: "{{ prusa_slicer_asset.name | regex_replace('\\.tar\\.bz2$', '') }}" + +- name: Create applications directory + file: + path: /usr/local/share/applications/ + state: directory + +- name: Copy desktop files + copy: + src: "{{ item }}.desktop" + dest: /usr/local/share/applications/{{ item }}.desktop + loop: + - PrusaSlicer + - PrusaGcodeviewer diff --git a/packer/ansible/roles/prusa-slicer/tasks/main.yml b/packer/ansible/roles/prusa-slicer/tasks/main.yml index 6f1600a..2487822 100644 --- a/packer/ansible/roles/prusa-slicer/tasks/main.yml +++ b/packer/ansible/roles/prusa-slicer/tasks/main.yml @@ -1,6 +1,12 @@ --- - block: - - import_tasks: install.yml + - import_tasks: package.yml + when: prusa_slicer_use_package | bool + tags: + - prusa-slicer:install + + - import_tasks: install_from_github.yml + when: not prusa_slicer_use_package | bool tags: - prusa-slicer:install diff --git a/packer/ansible/roles/prusa-slicer/tasks/install.yml b/packer/ansible/roles/prusa-slicer/tasks/package.yml similarity index 100% rename from packer/ansible/roles/prusa-slicer/tasks/install.yml rename to packer/ansible/roles/prusa-slicer/tasks/package.yml From 71122c46b6c06b3ab0a60a283f7a8c224df3c351 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Thu, 14 Sep 2023 22:23:54 +0000 Subject: [PATCH 32/36] Add Ultimaker2 to Prusa slicer --- packer/ansible/playbook.yml | 3 +++ packer/ansible/roles/prusa-slicer/tasks/configure.yml | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packer/ansible/playbook.yml b/packer/ansible/playbook.yml index 842fcd6..773a7bc 100644 --- a/packer/ansible/playbook.yml +++ b/packer/ansible/playbook.yml @@ -116,3 +116,6 @@ [vendor:PrusaResearch] model:MK3 = 0.4 model:MK3SMMU2S = 0.4 + + [vendor:Ultimaker] + model:ULTIMAKER2 = 0.4 diff --git a/packer/ansible/roles/prusa-slicer/tasks/configure.yml b/packer/ansible/roles/prusa-slicer/tasks/configure.yml index c59887b..649fb4d 100644 --- a/packer/ansible/roles/prusa-slicer/tasks/configure.yml +++ b/packer/ansible/roles/prusa-slicer/tasks/configure.yml @@ -18,9 +18,12 @@ - name: create symlink to vendor profiles file: - src: "{{ prusa_slicer_profiles_directory }}/PrusaResearch.ini" - dest: /etc/skel/.config/PrusaSlicer/vendor/PrusaResearch.ini + src: "{{ prusa_slicer_profiles_directory }}/{{ item }}.ini" + dest: /etc/skel/.config/PrusaSlicer/vendor/{{ item }}.ini state: link + loop: + - PrusaResearch + - Ultimaker - name: Stat /opt/PrusaSlicer stat: From a649d9686e9f3c5a52cbd8491269d6d01e25a66c Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Sun, 1 Oct 2023 19:59:03 +0000 Subject: [PATCH 33/36] Build docker image only when necessary --- .gitlab-ci.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 670a6ad..ef8bbab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,7 @@ variables: PACKER_VERSION: 1.4.3 ANNOUNCE: http://labsync.lab.fablab-nea.de:6969/announce WEBSEED: http://labsync.lab.fablab-nea.de/labsync/$CI_COMMIT_REF_NAME/$CI_PIPELINE_ID/images - DOCKER_IMAGE_BUILDER: ${CI_REGISTRY_IMAGE}/labsync-builder:$CI_COMMIT_REF_SLUG + DOCKER_IMAGE_BUILDER: ${CI_REGISTRY_IMAGE}/labsync-builder:main DOCKER_IMAGE_SECURITY_SCANNER: ${CI_REGISTRY_IMAGE}/security-scanner:$CI_COMMIT_REF_SLUG DOCKER_TLS_CERTDIR: "" @@ -21,14 +21,26 @@ dockerimage_builder: - apk add --no-cache make services: - docker:dind + variables: + DOCKER_IMAGE_BUILDER: ${CI_REGISTRY_IMAGE}/labsync-builder:$CI_COMMIT_REF_SLUG script: - docker pull $DOCKER_IMAGE_BUILDER || true - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make builderimg - docker push $DOCKER_IMAGE_BUILDER - except: - refs: - - schedules + - echo "DOCKER_IMAGE_BUILDER=$DOCKER_IMAGE_BUILDER" >> build.env + artifacts: + reports: + dotenv: build.env + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + when: on_success + - if: + changes: + paths: + - builder + compare_to: main + when: on_success dockerimage_security_scanner: stage: prepare From 0acc97e09eb8c6a7a30b88acd9252b9e47be13d2 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Wed, 4 Oct 2023 15:32:47 +0000 Subject: [PATCH 34/36] Print docker images --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ef8bbab..c1ca052 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -89,6 +89,8 @@ lightburn-download: services: - docker:dind script: + - echo DOCKER_IMAGE_BUILDER=$DOCKER_IMAGE_BUILDER + - echo DOCKER_IMAGE_SECURITY_SCANNER=$DOCKER_IMAGE_SECURITY_SCANNER - scripts/packer.sh debian-bookworm - aws --endpoint-url "$AWS_ENDPOINT_URL" s3 cp images/ "s3://$AWS_BUCKET/$CI_COMMIT_REF_SLUG/$CI_JOB_ID/" --recursive --no-progress artifacts: From 8e8647fdbd5de91f69c95c566393a3bab66a2853 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Wed, 4 Oct 2023 15:30:59 +0000 Subject: [PATCH 35/36] Fix path matching --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c1ca052..aa2492f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,7 @@ dockerimage_builder: - if: changes: paths: - - builder + - builder/**/* compare_to: main when: on_success From f6070572faadff6e9bfb0c463417ae1323c534f0 Mon Sep 17 00:00:00 2001 From: Jakob Lechner Date: Wed, 4 Oct 2023 15:11:34 +0000 Subject: [PATCH 36/36] Build security-scanner image only when necessary --- .gitlab-ci.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa2492f..5b8b6f3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ variables: ANNOUNCE: http://labsync.lab.fablab-nea.de:6969/announce WEBSEED: http://labsync.lab.fablab-nea.de/labsync/$CI_COMMIT_REF_NAME/$CI_PIPELINE_ID/images DOCKER_IMAGE_BUILDER: ${CI_REGISTRY_IMAGE}/labsync-builder:main - DOCKER_IMAGE_SECURITY_SCANNER: ${CI_REGISTRY_IMAGE}/security-scanner:$CI_COMMIT_REF_SLUG + DOCKER_IMAGE_SECURITY_SCANNER: ${CI_REGISTRY_IMAGE}/security-scanner:main DOCKER_TLS_CERTDIR: "" stages: @@ -53,9 +53,19 @@ dockerimage_security_scanner: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - make secscanimg - docker push $DOCKER_IMAGE_SECURITY_SCANNER - except: - refs: - - schedules + - echo "DOCKER_IMAGE_SECURITY_SCANNER=${CI_REGISTRY_IMAGE}/security-scanner:$CI_COMMIT_REF_SLUG" >> build.env + artifacts: + reports: + dotenv: build.env + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + when: on_success + - if: + changes: + paths: + - security-scanner/**/* + compare_to: main + when: on_success security_scanner: stage: check