diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0af55246..3e889dcc 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -52,7 +52,6 @@ jobs: run: | sudo update-binfmts --enable qemu-aarch64 echo $(ls /usr/bin/qemu-aarch64-static) - echo ':qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:' | sudo tee /proc/sys/fs/binfmt_misc/register - name: Restart binfmt-support run: sudo service binfmt-support restart diff --git a/Makefile2 b/Makefile2 new file mode 100644 index 00000000..88424859 --- /dev/null +++ b/Makefile2 @@ -0,0 +1,68 @@ +PACKER_VERSION := 1.10.0 +PWN_HOSTNAME := pwnagotchi +PWN_VERSION := ${PWN_VERSION} + +MACHINE_TYPE := $(shell uname -m) +ifneq (,$(filter x86_64,$(MACHINE_TYPE))) +GOARCH := amd64 +else ifneq (,$(filter i686,$(MACHINE_TYPE))) +GOARCH := 386 +else ifneq (,$(filter arm64% aarch64%,$(MACHINE_TYPE))) +GOARCH := arm64 +else ifneq (,$(filter arm%,$(MACHINE_TYPE))) +GOARCH := arm +else +GOARCH := amd64 +$(warning Unable to detect CPU arch from machine type $(MACHINE_TYPE), assuming $(GOARCH)) +endif + +# The Ansible part of the build can inadvertently change the active hostname of +# the build machine while updating the permanent hostname of the build image. +# If the unshare command is available, use it to create a separate namespace +# so hostname changes won't affect the build machine. +UNSHARE := $(shell command -v unshare) +ifneq (,$(UNSHARE)) +UNSHARE := $(UNSHARE) --uts +endif + +all: clean image clean + +update_langs: + @for lang in pwnagotchi/locale/*/; do\ + echo "updating language: $$lang ..."; \ + ./scripts/language.sh update $$(basename $$lang); \ + done + +compile_langs: + @for lang in pwnagotchi/locale/*/; do\ + echo "compiling language: $$lang ..."; \ + ./scripts/language.sh compile $$(basename $$lang); \ + done + +PACKER := ~/pwnagotchi/packer +PACKER_URL := https://releases.hashicorp.com/packer/$(PACKER_VERSION)/packer_$(PACKER_VERSION)_linux_$(GOARCH).zip +$(PACKER): + mkdir -p $(@D) + curl -L "$(PACKER_URL)" -o $(PACKER).zip + unzip $(PACKER).zip -d $(@D) + rm $(PACKER).zip + chmod +x $@ + +SDIST := dist/pwnagotchi-$(PWN_VERSION).tar.gz +$(SDIST): setup.py pwnagotchi + python3 setup.py sdist + +# Building the image requires packer, but don't rebuild the image just because packer updated. +pwnagotchi: | $(PACKER) + +# If the packer or ansible files are updated, rebuild the image. +pwnagotchi: $(SDIST) builder/pwnagotchi.json.pkr.hcl builder/raspberrypi32.yml builder/raspberrypi64.yml builder/orangepi.yml builder/extras/nexmon.yml $(shell find builder/data -type f) + + cd builder && $(PACKER) init pwnagotchi.json.pkr.hcl && sudo $(UNSHARE) $(PACKER) build -var "pwn_hostname=$(PWN_HOSTNAME)" -var "pwn_version=$(PWN_VERSION)" pwnagotchi.json.pkr.hcl + +.PHONY: image +image: pwnagotchi + +clean: + - rm -rf dist pwnagotchi.egg-info + - rm -f $(PACKER) diff --git a/builder/config.kcl b/builder/config.kcl new file mode 100644 index 00000000..2ce17d68 --- /dev/null +++ b/builder/config.kcl @@ -0,0 +1,241 @@ +# This is not working quite yet +# https://github.com/mkaczanowski/packer-builder-arm/pull/172 +packer { + required_plugins { + arm = { + version = "1.0.0" + source = "github.com/cdecoux/builder-arm" + } + ansible = { + source = "github.com/hashicorp/ansible" + version = "~> 1" + } + } +} + +variable "pwn_hostname" { + type = string +} + +variable "pwn_version" { + type = string +} + +source "arm" "rpi64-pwnagotchi" { + file_checksum_url = "https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-12-11/2023-12-11-raspios-bookworm-arm64-lite.img.xz.sha256" + file_urls = ["https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-12-11/2023-12-11-raspios-bookworm-arm64-lite.img.xz"] + file_checksum_type = "sha256" + file_target_extension = "xz" + file_unarchive_cmd = ["unxz", "$ARCHIVE_PATH"] + image_path = "../../../pwnagotchi-rpi-bookworm-${var.pwn_version}-arm64.img" + qemu_binary_source_path = "/usr/bin/qemu-aarch64-static" + qemu_binary_destination_path = "/usr/bin/qemu-aarch64-static" + image_build_method = "resize" + image_size = "9G" + image_type = "dos" + image_partitions { + name = "boot" + type = "c" + start_sector = "8192" + filesystem = "fat" + size = "256M" + mountpoint = "/boot/firmware" + } + image_partitions { + name = "root" + type = "83" + start_sector = "532480" + filesystem = "ext4" + size = "0" + mountpoint = "/" + } +} + +source "arm" "rpi32-pwnagotchi" { + file_checksum_url = "https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-lite.img.xz.sha256" + file_urls = ["https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-lite.img.xz"] + file_checksum_type = "sha256" + file_target_extension = "xz" + file_unarchive_cmd = ["unxz", "$ARCHIVE_PATH"] + image_path = "../../pwnagotchi-rpi-bullseye-${var.pwn_version}-armhf.img" + qemu_binary_source_path = "/usr/libexec/qemu-binfmt/arm-binfmt-P" + qemu_binary_destination_path = "/usr/libexec/qemu-binfmt/arm-binfmt-P" + image_build_method = "resize" + image_size = "9G" + image_type = "dos" + image_partitions { + name = "boot" + type = "c" + start_sector = "8192" + filesystem = "fat" + size = "256M" + mountpoint = "/boot" + } + image_partitions { + name = "root" + type = "83" + start_sector = "532480" + filesystem = "ext4" + size = "0" + mountpoint = "/" + } +} +source "arm" "opi-pwnagotchi" { + file_checksum_url = "https://github.com/jayofelony/orangepi/releases/download/v1.0/orangepi-raspios.img.xz.sha256" + file_urls = ["https://github.com/jayofelony/orangepi/releases/download/v1.0/orangepi-raspios.img.xz"] + file_checksum_type = "sha256" + file_target_extension = "xz" + file_unarchive_cmd = ["unxz", "$ARCHIVE_PATH"] + image_path = "../../pwnagotchi-opi-bullseye-${var.pwn_version}-arm64.img" + qemu_binary_source_path = "/usr/libexec/qemu-binfmt/aarch64-binfmt-P" + qemu_binary_destination_path = "/usr/libexec/qemu-binfmt/aarch64-binfmt-P" + image_build_method = "resize" + image_size = "9G" + image_type = "dos" + image_partitions { + name = "root" + type = "83" + start_sector = "8192" + filesystem = "ext4" + size = "0" + mountpoint = "/" + } +} + +# a build block invokes sources and runs provisioning steps on them. The +# documentation for build blocks can be found here: +# https://www.packer.io/docs/from-1.5/blocks/build +build { + name = "Raspberry Pi 64 Pwnagotchi" + sources = ["source.arm.rpi64-pwnagotchi"] + + provisioner "file" { + destination = "/usr/bin/" + sources = [ + "data/usr/bin/bettercap-launcher", + "data/usr/bin/hdmioff", + "data/usr/bin/hdmion", + "data/usr/bin/monstart", + "data/usr/bin/monstop", + "data/usr/bin/pwnagotchi-launcher", + "data/usr/bin/pwnlib", + ] + } + provisioner "shell" { + inline = ["chmod +x /usr/bin/*"] + } + + provisioner "file" { + destination = "/etc/systemd/system/" + sources = [ + "data/etc/systemd/system/bettercap.service", + "data/etc/systemd/system/pwnagotchi.service", + "data/etc/systemd/system/pwngrid-peer.service", + ] + } + provisioner "file" { + destination = "/etc/update-motd.d/01-motd" + source = "data/etc/update-motd.d/01-motd" + } + provisioner "shell" { + inline = ["chmod +x /etc/update-motd.d/*"] + } + provisioner "shell" { + inline = ["apt-get -y --allow-releaseinfo-change update", "apt-get -y dist-upgrade", "apt-get install -y --no-install-recommends ansible"] + } + provisioner "ansible-local" { + command = "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION=${var.pwn_version} PWN_HOSTNAME=${var.pwn_hostname} ansible-playbook" + extra_arguments = ["--extra-vars \"ansible_python_interpreter=/usr/bin/python3\""] + playbook_file = "raspberrypi64.yml" + } +} + +build { + name = "Raspberry Pi 32 Pwnagotchi" + sources = ["source.arm.rpi32-pwnagotchi"] + provisioner "file" { + destination = "/usr/bin/" + sources = [ + "data/usr/bin/bettercap-launcher", + "data/usr/bin/hdmioff", + "data/usr/bin/hdmion", + "data/usr/bin/monstart", + "data/usr/bin/monstop", + "data/usr/bin/pwnagotchi-launcher", + "data/usr/bin/pwnlib", + ] + } + provisioner "shell" { + inline = ["chmod +x /usr/bin/*"] + } + + provisioner "file" { + destination = "/etc/systemd/system/" + sources = [ + "data/etc/systemd/system/bettercap.service", + "data/etc/systemd/system/pwnagotchi.service", + "data/etc/systemd/system/pwngrid-peer.service", + ] + } + provisioner "file" { + destination = "/etc/update-motd.d/01-motd" + source = "data/etc/update-motd.d/01-motd" + } + provisioner "shell" { + inline = ["chmod +x /etc/update-motd.d/*"] + } + provisioner "shell" { + inline = ["apt-get -y --allow-releaseinfo-change update", "apt-get -y dist-upgrade", "apt-get install -y --no-install-recommends ansible"] + } + provisioner "ansible-local" { + command = "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION=${var.pwn_version} PWN_HOSTNAME=${var.pwn_hostname} ansible-playbook" + extra_arguments = ["--extra-vars \"ansible_python_interpreter=/usr/bin/python3\""] + playbook_dir = "extras/" + playbook_file = "raspberrypi32.yml" + } +} + +#build { +# name = "Orange Pi Pwnagotchi" +# sources = ["source.arm.opi-pwnagotchi"] + +# provisioner "file" { +# destination = "/usr/bin/" +# sources = [ +# "data/usr/bin/bettercap-launcher", +# "data/usr/bin/hdmioff", +# "data/usr/bin/hdmion", +# "data/usr/bin/monstart", +# "data/usr/bin/monstop", +# "data/usr/bin/pwnagotchi-launcher", +# "data/usr/bin/pwnlib", +# ] +# } +# provisioner "shell" { +# inline = ["chmod +x /usr/bin/*"] +# } + +# provisioner "file" { +# destination = "/etc/systemd/system/" +# sources = [ +# "data/etc/systemd/system/bettercap.service", +# "data/etc/systemd/system/pwnagotchi.service", +# "data/etc/systemd/system/pwngrid-peer.service", +# ] +# } +# provisioner "file" { +# destination = "/etc/update-motd.d/01-motd" +# source = "data/etc/update-motd.d/01-motd" +# } +# provisioner "shell" { +# inline = ["chmod +x /etc/update-motd.d/*"] +# } +# provisioner "shell" { +# inline = ["apt-get -y --allow-releaseinfo-change update", "apt-get -y dist-upgrade", "apt-get install -y --no-install-recommends ansible"] +# } +# provisioner "ansible-local" { +# command = "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION=${var.pwn_version} PWN_HOSTNAME=${var.pwn_hostname} ansible-playbook" +# extra_arguments = ["--extra-vars \"ansible_python_interpreter=/usr/bin/python3\""] +# playbook_file = "orangepi.yml" +# } +#} \ No newline at end of file