diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/point_of_sale/tools/posbox/posbox_create_image.sh | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/point_of_sale/tools/posbox/posbox_create_image.sh')
| -rwxr-xr-x | addons/point_of_sale/tools/posbox/posbox_create_image.sh | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/addons/point_of_sale/tools/posbox/posbox_create_image.sh b/addons/point_of_sale/tools/posbox/posbox_create_image.sh new file mode 100755 index 00000000..3808d727 --- /dev/null +++ b/addons/point_of_sale/tools/posbox/posbox_create_image.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace + +if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root" + exit 1 +fi + +file_exists() { + [[ -f $1 ]]; +} + +require_command () { + type "$1" &> /dev/null || { echo "Command $1 is missing. Install it e.g. with 'apt-get install $1'. Aborting." >&2; exit 1; } +} + +require_command kpartx +require_command qemu-arm-static +require_command zerofree + +__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +__file="${__dir}/$(basename "${BASH_SOURCE[0]}")" +__base="$(basename ${__file} .sh)" + +MOUNT_POINT="${__dir}/root_mount" +OVERWRITE_FILES_BEFORE_INIT_DIR="${__dir}/overwrite_before_init" +OVERWRITE_FILES_AFTER_INIT_DIR="${__dir}/overwrite_after_init" +VERSION=14.0 +VERSION_IOTBOX=21.04 +REPO=https://github.com/odoo/odoo.git + +if ! file_exists *raspios*.img ; then + wget 'http://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-03-25/2021-03-04-raspios-buster-armhf-lite.zip' -O raspios.img.zip + unzip raspios.img.zip +fi + +RASPIOS=$(echo *raspios*.img) +rsync -avh --progress "${RASPIOS}" iotbox.img + +CLONE_DIR="${OVERWRITE_FILES_BEFORE_INIT_DIR}/home/pi/odoo" + +rm -rfv "${CLONE_DIR}" + +if [ ! -d $CLONE_DIR ]; then + echo "Clone Github repo" + mkdir -pv "${CLONE_DIR}" + git clone -b ${VERSION} --no-local --no-checkout --depth 1 ${REPO} "${CLONE_DIR}" + cd "${CLONE_DIR}" + git config core.sparsecheckout true + echo "addons/web +addons/hw_* +addons/point_of_sale/tools/posbox/configuration +odoo/ +odoo-bin" | tee --append .git/info/sparse-checkout > /dev/null + git read-tree -mu HEAD +fi + +cd "${__dir}" +USR_BIN="${OVERWRITE_FILES_BEFORE_INIT_DIR}/usr/bin/" +mkdir -pv "${USR_BIN}" +cd "/tmp" +curl 'https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip' > ngrok.zip +unzip ngrok.zip +rm -v ngrok.zip +cd "${__dir}" +mv -v /tmp/ngrok "${USR_BIN}" + +# zero pad the image to be around 4.4 GiB, by default the image is only ~2.2 GiB +echo "Enlarging the image..." +dd if=/dev/zero bs=1M count=2048 status=progress >> iotbox.img + +# resize partition table +echo "Fdisking" + +SECTORS_BOOT_START=$(sudo fdisk -l iotbox.img | tail -n 2 | awk 'NR==1 {print $2}') +SECTORS_BOOT_END=$((SECTORS_BOOT_START + 1048576)) # sectors to have a partition of ~512Mo +SECTORS_ROOT_START=$((SECTORS_BOOT_END + 1)) + +START_OF_ROOT_PARTITION=$(fdisk -l iotbox.img | tail -n 1 | awk '{print $2}') +(echo 'p'; # print + echo 'd'; # delete + echo '2'; # number 2 + echo 'd'; # delete number 1 by default + echo 'n'; # create new partition + echo 'p'; # primary + echo '1'; # number 1 + echo "${SECTORS_BOOT_START}"; # first sector + echo "${SECTORS_BOOT_END}"; # partition size + echo 't'; # change type of partition. 1 selected by default + echo 'c'; # change to W95 FAT32 (LBA) + echo 'n'; # create new partition + echo 'p'; # primary + echo '2'; # number 2 + echo "${SECTORS_ROOT_START}"; # starting at previous offset + echo ''; # ending at default (fdisk should propose max) + echo 'p'; # print + echo 'w') | fdisk iotbox.img # write and quit + +LOOP_RASPIOS=$(kpartx -avs "${RASPIOS}") +LOOP_RASPIOS_ROOT=$(echo "${LOOP_RASPIOS}" | tail -n 1 | awk '{print $3}') +LOOP_RASPIOS_PATH="/dev/${LOOP_RASPIOS_ROOT::-2}" +LOOP_RASPIOS_ROOT="/dev/mapper/${LOOP_RASPIOS_ROOT}" + +LOOP_IOT=$(kpartx -avs iotbox.img) +LOOP_IOT_ROOT=$(echo "${LOOP_IOT}" | tail -n 1 | awk '{print $3}') +LOOP_IOT_PATH="/dev/${LOOP_IOT_ROOT::-2}" +LOOP_IOT_ROOT="/dev/mapper/${LOOP_IOT_ROOT}" +LOOP_IOT_BOOT=$(echo "${LOOP_IOT}" | tail -n 2 | awk 'NR==1 {print $3}') +LOOP_IOT_BOOT="/dev/mapper/${LOOP_IOT_BOOT}" + +mkfs.ext4 -v "${LOOP_IOT_ROOT}" + +dd if="${LOOP_RASPIOS_ROOT}" of="${LOOP_IOT_ROOT}" bs=4M status=progress + +# resize filesystem +e2fsck -fv "${LOOP_IOT_ROOT}" # resize2fs requires clean fs +resize2fs "${LOOP_IOT_ROOT}" + +mkdir -pv "${MOUNT_POINT}" #-p: no error if existing +mount -v "${LOOP_IOT_ROOT}" "${MOUNT_POINT}" +mount -v "${LOOP_IOT_BOOT}" "${MOUNT_POINT}/boot/" + +QEMU_ARM_STATIC="/usr/bin/qemu-arm-static" +cp -v "${QEMU_ARM_STATIC}" "${MOUNT_POINT}/usr/bin/" + +# 'overlay' the overwrite directory onto the mounted image filesystem +cp -av "${OVERWRITE_FILES_BEFORE_INIT_DIR}"/* "${MOUNT_POINT}" +chroot "${MOUNT_POINT}" /bin/bash -c "sudo /etc/init_posbox_image.sh" + +# copy iotbox version +mkdir -pv "${MOUNT_POINT}"/var/odoo +echo "${VERSION_IOTBOX}" | tee "${MOUNT_POINT}"/var/odoo/iotbox_version "${MOUNT_POINT}"/home/pi/iotbox_version + +# get rid of the git clone +rm -rfv "${CLONE_DIR}" +# and the ngrok usr/bin +rm -rfv "${OVERWRITE_FILES_BEFORE_INIT_DIR}/usr" +cp -av "${OVERWRITE_FILES_AFTER_INIT_DIR}"/* "${MOUNT_POINT}" + +find "${MOUNT_POINT}"/ -type f -name "*.iotpatch"|while read iotpatch; do + DIR=$(dirname "${iotpatch}") + BASE=$(basename "${iotpatch%.iotpatch}") + find "${DIR}" -type f -name "${BASE}" ! -name "*.iotpatch"|while read file; do + patch -f --verbose "${file}" < "${iotpatch}" + done +done + +# cleanup +umount -fv "${MOUNT_POINT}"/boot/ +umount -fv "${MOUNT_POINT}"/ +rm -rfv "${MOUNT_POINT}" + +echo "Running zerofree..." +zerofree -v "${LOOP_IOT_ROOT}" || true + +sleep 10 + +kpartx -dv "${LOOP_IOT_PATH}" +kpartx -dv "${LOOP_RASPIOS_PATH}" |
