fix variables used in scripts

This commit is contained in:
Tobias Powalowski 2022-01-13 15:32:45 +01:00
parent 0bf41e5578
commit 70a7c7817e
8 changed files with 188 additions and 151 deletions

View file

@ -7,7 +7,6 @@ _CLEANUP_CACHE=""
_SAVE_RAM=""
_LINUX_FIRMWARE=""
_DIR=""
_LOG=""
_PACMAN_AARCH64_CHROOT_SERVER="https://pkgbuild.com/~tpowa/archboot-helper/pacman-chroot-aarch64"
_PACMAN_AARCH64_CHROOT="pacman-aarch64-chroot-latest.tar.zst"
@ -21,7 +20,6 @@ usage () {
echo " -cp Cleanup container package cache"
echo " -lf add linux-firmware to container"
echo " -alf add archboot-linux-firmware to container"
echo " -log show logging on active tty"
exit 0
}
@ -89,8 +87,9 @@ if [[ "$(uname -m)" == "x86_64" ]]; then
echo "Downloading archlinuxarm pacman aarch64 chroot..."
! [[ -f pacman-aarch64-chroot-latest.tar.zst ]] && wget ${_PACMAN_AARCH64_CHROOT_SERVER}/${_PACMAN_AARCH64_CHROOT}{,.sig} >/dev/null 2>&1
# verify dowload
sleep 1
gpg --verify "${_PACMAN_AARCH64_CHROOT}.sig" >/dev/null 2>&1 || exit 1
bsdtar -C "${_DIR}" -xf "${_PACMAN_AARCH64_CHROOT}" >/dev/null 2>&1
bsdtar -C "${_DIR}" -xf "${_PACMAN_AARCH64_CHROOT}"
echo "Removing installation tarball ..."
rm ${_PACMAN_AARCH64_CHROOT}{,.sig}
fi

View file

@ -2,7 +2,7 @@
# created by Tobias Powalowski <tpowa@archlinux.org>
_BASENAME="$(basename "${0}")"
AARCH64="$(mktemp -d AARCH64.XXX)"
_AARCH64="$(mktemp -d AARCH64.XXX)"
_SHIM_URL="https://kojipkgs.fedoraproject.org/packages/shim/15.4/5/aarch64"
_SHIM_VERSION="shim-aa64-15.4-5.aarch64.rpm"
_LOG=""
@ -114,21 +114,21 @@ if ! [[ "${TARBALL_NAME}" == "" ]]; then
exit 1
fi
mkdir -p "${AARCH64}/EFI/BOOT"
mkdir -p "${_AARCH64}/EFI/BOOT"
_prepare_kernel_initramfs_files() {
mkdir -p "${AARCH64}/boot"
mv "${CORE64}"/*/boot/vmlinuz "${AARCH64}/boot/vmlinuz_aarch64"
mv "${CORE64}"/*/boot/initrd.img "${AARCH64}/boot/initramfs_aarch64.img"
mv "${CORE64}"/*/boot/amd-ucode.img "${AARCH64}/boot/"
mv "${CORE64}"/*/boot/dtbs "${AARCH64}/boot/"
mkdir -p "${_AARCH64}/boot"
mv "${CORE64}"/*/boot/vmlinuz "${_AARCH64}/boot/vmlinuz_aarch64"
mv "${CORE64}"/*/boot/initrd.img "${_AARCH64}/boot/initramfs_aarch64.img"
mv "${CORE64}"/*/boot/amd-ucode.img "${_AARCH64}/boot/"
mv "${CORE64}"/*/boot/dtbs "${_AARCH64}/boot/"
}
_prepare_efitools_uefi () {
cp -f "/usr/share/efitools/efi/HashTool.efi" "${AARCH64}/EFI/tools/HashTool.efi"
cp -f "/usr/share/efitools/efi/KeyTool.efi" "${AARCH64}/EFI/tools/KeyTool.efi"
cp -f "/usr/share/efitools/efi/HashTool.efi" "${_AARCH64}/EFI/tools/HashTool.efi"
cp -f "/usr/share/efitools/efi/KeyTool.efi" "${_AARCH64}/EFI/tools/KeyTool.efi"
}
_prepare_fedora_shim_bootloaders () {
@ -137,25 +137,25 @@ _prepare_fedora_shim_bootloaders () {
SHIM=$(mktemp -d shim.XXXX)
curl -s --create-dirs -L -O --output-dir "${SHIM}" "${_SHIM_URL}/${_SHIM_VERSION}"
bsdtar -C "${SHIM}" -xf "${SHIM}"/"${_SHIM_VERSION}"
cp "${SHIM}/boot/efi/EFI/fedora/mmaa64.efi" "${AARCH64}/EFI/BOOT/mmaa64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/shimaa64.efi" "${AARCH64}/EFI/BOOT/BOOTAA64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/mmaa64.efi" "${_AARCH64}/EFI/BOOT/mmaa64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/shimaa64.efi" "${_AARCH64}/EFI/BOOT/BOOTAA64.efi"
}
_prepare_uefi_image() {
## get size of boot x86_64 files
BOOTSIZE=$(du -bc ${AARCH64}/EFI | grep total | cut -f1)
BOOTSIZE=$(du -bc ${_AARCH64}/EFI | grep total | cut -f1)
IMGSZ=$(( (${BOOTSIZE}*102)/100/1024 + 1)) # image size in sectors
mkdir -p "${AARCH64}"/CDEFI/
mkdir -p "${_AARCH64}"/CDEFI/
## Create cdefiboot.img
dd if=/dev/zero of="${AARCH64}"/CDEFI/cdefiboot.img bs="${IMGSZ}" count=1024
VFAT_IMAGE="${AARCH64}/CDEFI/cdefiboot.img"
dd if=/dev/zero of="${_AARCH64}"/CDEFI/cdefiboot.img bs="${IMGSZ}" count=1024
VFAT_IMAGE="${_AARCH64}/CDEFI/cdefiboot.img"
mkfs.vfat "${VFAT_IMAGE}"
## Copy all files to UEFI vfat image
mcopy -i "${VFAT_IMAGE}" -s "${AARCH64}"/EFI ::/
mcopy -i "${VFAT_IMAGE}" -s "${_AARCH64}"/EFI ::/
}
@ -164,8 +164,8 @@ _prepare_uefi_image() {
# If you don't use shim use --disable-shim-lock
_prepare_uefi_AA64_GRUB_USB_files() {
mkdir -p "${AARCH64}/EFI/BOOT"
cat << GRUBEOF > "${AARCH64}/EFI/BOOT/grubaa64.cfg"
mkdir -p "${_AARCH64}/EFI/BOOT"
cat << GRUBEOF > "${_AARCH64}/EFI/BOOT/grubaa64.cfg"
insmod part_gpt
insmod part_msdos
insmod fat
@ -222,7 +222,7 @@ menuentry "Exit GRUB" {
}
GRUBEOF
### Hint: https://src.fedoraproject.org/rpms/grub2/blob/rawhide/f/grub.macros#_407
grub-mkstandalone -d /usr/lib/grub/arm64-efi -O arm64-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd chain tpm" --fonts="unicode" --locales="en@quot" --themes="" -o "${AARCH64}/EFI/BOOT/grubaa64.efi" "boot/grub/grub.cfg=${AARCH64}/EFI/BOOT/grubaa64.cfg"
grub-mkstandalone -d /usr/lib/grub/arm64-efi -O arm64-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd chain tpm" --fonts="unicode" --locales="en@quot" --themes="" -o "${_AARCH64}/EFI/BOOT/grubaa64.efi" "boot/grub/grub.cfg=${_AARCH64}/EFI/BOOT/grubaa64.cfg"
}
echo "Starting ISO creation ..."
@ -249,15 +249,15 @@ xorriso -as mkisofs \
-volid "ARCHBOOT" \
-preparer "prepared by ${_BASENAME}" \
-e CDEFI/cdefiboot.img -isohybrid-gpt-basdat -no-emul-boot \
-output "${IMAGENAME}.iso" "${AARCH64}/" &> "${IMAGENAME}.log"
-output "${IMAGENAME}.iso" "${_AARCH64}/" &> "${IMAGENAME}.log"
## create sha256sums.txt
echo "Generating sha256sum ..."
rm -f "sha256sums.txt" || true
cksum -a sha256 *.iso > "sha256sums.txt"
# cleanup
echo "Cleanup remove ${CORE64}, ${AARCH64} and ${SHIM} ..."
echo "Cleanup remove ${CORE64}, ${_AARCH64} and ${SHIM} ..."
rm -rf "${CORE64}"
rm -rf "${AARCH64}"
rm -rf "${_AARCH64}"
rm -rf "${SHIM}"
echo "Finished ISO creation."

View file

@ -40,7 +40,7 @@ echo "Starting container creation ..."
echo "Create directory ${_DIR} ..."
mkdir -p "${_DIR}"/"${_PACMAN_CHROOT}"
echo "Downloading archlinuxarm aarch64..."
! [[ -f ArchLinuxARM-aarch64-latest.tar.gz ]] && wget ${LATEST_ARM64} >/dev/null 2>&1
! [[ -f ArchLinuxARM-aarch64-latest.tar.gz ]] && wget ${_LATEST_ARM64} >/dev/null 2>&1
bsdtar -xf ArchLinuxARM-aarch64-latest.tar.gz -C "${_DIR}"
echo "Removing installation tarball ..."
rm ArchLinuxARM-aarch64-latest.tar.gz

View file

@ -4,7 +4,7 @@
_BASENAME="$(basename "${0}")"
_PRESET_LATEST="aarch64-latest"
W_DIR="archboot-release"
_W_DIR="archboot-release"
usage () {
echo "CREATE ARCHBOOT RELEASE IMAGE"
@ -25,20 +25,20 @@ echo "Start release creation in $1 ..."
mkdir -p $1
cd $1
# create container
archboot-aarch64-create-container.sh "${W_DIR}" -cc -cp -alf
archboot-aarch64-create-container.sh "${_W_DIR}" -cc -cp -alf || exit 1
# generate tarball in container, umount tmp it's a tmpfs and weird things could happen then
echo "Generate ISO ..."
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -t -i=archrelease"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -t -i=archrelease"
# generate iso in container
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -g -T=archrelease.tar"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -g -T=archrelease.tar"
# remove not working lvm2 from latest image
echo "Remove lvm2 and openssh from container ${W_DIR} ..."
systemd-nspawn -D "${W_DIR}" /bin/bash -c "pacman -Rdd lvm2 openssh --noconfirm" >/dev/null 2>&1
echo "Remove lvm2 and openssh from container ${_W_DIR} ..."
systemd-nspawn -D "${_W_DIR}" /bin/bash -c "pacman -Rdd lvm2 openssh --noconfirm" >/dev/null 2>&1
# generate latest tarball in container
echo "Generate latest ISO ..."
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -t -i=latest -p="${_PRESET_LATEST}""
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -t -i=latest -p="${_PRESET_LATEST}""
# generate latest iso in container
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -g -T=latest.tar -p="${_PRESET_LATEST}" -r=$(date +%Y.%m.%d-%H.%M)-latest"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-aarch64-iso.sh -g -T=latest.tar -p="${_PRESET_LATEST}" -r=$(date +%Y.%m.%d-%H.%M)-latest"
# create Release.txt with included main archlinux packages
echo "Generate Release.txt ..."
echo "Welcome to ARCHBOOT INSTALLATION / RESCUEBOOT SYSTEM" >>Release.txt
@ -46,15 +46,15 @@ echo "Creation Tool: 'archboot' Tobias Powalowski <tpowa@archlinux.org>" >>Relea
echo "Homepage: https://wiki.archlinux.org/title/Archboot" >>Release.txt
echo "Architecture: aarch64" >>Release.txt
echo "RAM requirement to boot: 1152 MB or greater" >>Release.txt
echo "Archboot:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi archboot-arm | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Kernel:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi linux | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Pacman:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi pacman | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Systemd:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi systemd | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Archboot:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi archboot-arm | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Kernel:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi linux | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Pacman:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi pacman | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Systemd:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi systemd | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
# move iso out of container
mv "${W_DIR}"/*.iso ./
mv "${_W_DIR}"/*.iso ./
# remove container
echo "Remove container ${W_DIR} ..."
rm -r "${W_DIR}"
echo "Remove container ${_W_DIR} ..."
rm -r "${_W_DIR}"
# create boot directory with ramdisks
echo "Create boot directory ..."
mkdir -p boot/licenses/amd-ucode

View file

@ -1,13 +1,18 @@
#! /bin/bash
DIRECTORY="$(date +%Y.%m)"
ARCH="aarch64"
BUILDDIR="/home/tobias/Arch/iso/${ARCH}"
SERVER="pkgbuild.com"
HOME="/home/tpowa/"
SERVER_DIR="/home/tpowa/public_html/archboot-images"
USER="tobias"
GROUP="users"
GPG="--detach-sign --batch --passphrase-file /etc/archboot/gpg.passphrase --pinentry-mode loopback -u 7EDF681F"
_DIRECTORY="$(date +%Y.%m)"
_ARCH="aarch64"
_BUILDDIR="/home/tobias/Arch/iso/${_ARCH}"
_SERVER="pkgbuild.com"
_SERVER_HOME="/home/tpowa/"
_SERVER_DIR="/home/tpowa/public_html/archboot-images"
_USER="tobias"
_GROUP="users"
_GPG="--detach-sign --batch --passphrase-file /etc/archboot/gpg.passphrase --pinentry-mode loopback -u 7EDF681F"
_PACMAN_AARCH__BUILDDIR="/home/tobias/Arch/iso"
_PACMAN_AARCH_SERVERDIR="/home/tpowa/public_html/archboot-helper/pacman-chroot-aarch64"
_PACMAN_AARCH64="pacman-aarch64-chroot"
_PACMAN_AARCH64_CHROOT_SERVER="https://pkgbuild.com/~tpowa/archboot-helper/pacman-chroot-aarch64"
_PACMAN_AARCH64_CHROOT="pacman-aarch64-chroot-latest.tar.zst"
### check for root
if ! [[ ${UID} -eq 0 ]]; then
@ -20,38 +25,71 @@ if [[ ! "$(cat /etc/hostname)" == "T-POWA-LX" ]]; then
echo "This script should only be run on tpowa's build server. Aborting..."
exit 1
fi
# create release in "${BUILDDIR}"
cd "${BUILDDIR}"
[[ -e "${DIRECTORY}" ]] && rm -r "${DIRECTORY}"
archboot-"${ARCH}"-release.sh "${DIRECTORY}"
# update aarch64 pacman chroot
cd "${_PACMAN_AARCH__BUILDDIR}"
mkdir "${_PACMAN_AARCH64}"
echo "Downloading archlinuxarm pacman aarch64 chroot..."
[[ -f pacman-aarch64-chroot-latest.tar.zst ]] && rm pacman-aarch64-chroot-latest.tar.zst{,.sig}
wget ${_PACMAN_AARCH64_CHROOT_SERVER}/${_PACMAN_AARCH64_CHROOT}{,.sig} >/dev/null 2>&1
# verify dowload
sudo -u "${_USER}" gpg --verify "${_PACMAN_AARCH64_CHROOT}.sig" >/dev/null 2>&1 || exit 1
bsdtar -C "${_PACMAN_AARCH64}" -xf "${_PACMAN_AARCH64_CHROOT}" >/dev/null 2>&1
echo "Removing installation tarball ..."
rm ${_PACMAN_AARCH64_CHROOT}{,.sig} >/dev/null 2>&1
# update container to latest packages
echo "Update container to latest packages..."
systemd-nspawn -D "${_PACMAN_AARCH64}" pacman -Syu --noconfirm >/dev/null 2>&1
# remove package cache
echo " Remove package cache from container ..."
systemd-nspawn -D "${_PACMAN_AARCH64}" pacman -Scc --noconfirm >/dev/null 2>&1
# enable parallel downloads
sed -i -e 's:^#ParallelDownloads:ParallelDownloads:g' "${_PACMAN_AARCH64}"/etc/pacman.conf
# fix network in container
rm "${_PACMAN_AARCH64}/etc/resolv.conf"
echo "nameserver 8.8.8.8" > "${_PACMAN_AARCH64}/etc/resolv.conf"
echo "Clean container, delete not needed files from ${_PACMAN_AARCH64} ..."
rm -r "${_PACMAN_AARCH64}"/usr/include >/dev/null 2>&1
rm -r "${_PACMAN_AARCH64}"/usr/share/{man,doc,info,locale} >/dev/null 2>&1
echo "Generating tarball ..."
tar -acf "${_PACMAN_AARCH64_CHROOT}" -C "${_PACMAN_AARCH64}" .
echo "Removing ${_PACMAN_AARCH64} ..."
rm -r "${_PACMAN_AARCH64}"
echo "Finished container tarball."
sudo -u "${_USER}" gpg ${_GPG} "${_PACMAN_AARCH64_CHROOT}"
chown "${_USER}" ${_PACMAN_AARCH64_CHROOT}{,.sig}
chgrp "${_GROUP}" ${_PACMAN_AARCH64_CHROOT}{,.sig}
sudo -u "${_USER}" scp ${_PACMAN_AARCH64_CHROOT}{,.sig} ${_SERVER}:${_PACMAN_AARCH_SERVERDIR}
# create release in "${_BUILDDIR}"
cd "${_BUILDDIR}"
[[ -e "${_DIRECTORY}" ]] && rm -r "${_DIRECTORY}"
archboot-"${_ARCH}"-release.sh "${_DIRECTORY}" || exit 1
# set user rights on files
chown -R "${USER}" "${DIRECTORY}"
chgrp -R "${GROUP}" "${DIRECTORY}"
cd "${DIRECTORY}"
chown -R "${_USER}" "${_DIRECTORY}"
chgrp -R "${_GROUP}" "${_DIRECTORY}"
cd "${_DIRECTORY}"
# remove sha256sum and install image
rm sha256sum.txt
rm ArchLinuxARM-aarch64-latest.tar.gz
# sign files and create new sha256sum.txt
for i in *; do
[[ -f "${i}" ]] && sudo -u "${USER}" gpg ${GPG} "${i}"
[[ -f "${i}" ]] && sudo -u "${_USER}" gpg ${_GPG} "${i}"
[[ -f "${i}" ]] && cksum -a sha256 "${i}" >> sha256sum.txt
[[ -f "${i}.sig" ]] && cksum -a sha256 "${i}.sig" >> sha256sum.txt
done
for i in boot/*; do
[[ -f "${i}" ]] && sudo -u "${USER}" gpg ${GPG} "${i}"
[[ -f "${i}" ]] && sudo -u "${_USER}" gpg ${_GPG} "${i}"
[[ -f "${i}" ]] && cksum -a sha256 "${i}" >> sha256sum.txt
[[ -f "${i}.sig" ]] && cksum -a sha256 "${i}.sig" >> sha256sum.txt
done
cd ..
# copy files to server
sudo -u "${USER}" scp -r "${DIRECTORY}" "${SERVER}":"${HOME}"
sudo -u "${_USER}" scp -r "${_DIRECTORY}" "${_SERVER}":"${_SERVER_HOME}"
# move files on server, create symlink and remove 3 month old release
sudo -u "${USER}" ssh "${SERVER}" <<EOF
rm -r "${SERVER_DIR}"/"${ARCH}"/"${DIRECTORY}"
rm -r "${SERVER_DIR}"/"${ARCH}"/"$(date -d "$(date +) - 3 month" +%Y.%m)"
mv "${DIRECTORY}" "${SERVER_DIR}"/"${ARCH}"
cd "${SERVER_DIR}"/"${ARCH}"
sudo -u "${_USER}" ssh "${_SERVER}" <<EOF
rm -r "${_SERVER_DIR}"/"${_ARCH}"/"${_DIRECTORY}"
rm -r "${_SERVER_DIR}"/"${_ARCH}"/"$(date -d "$(date +) - 3 month" +%Y.%m)"
mv "${_DIRECTORY}" "${_SERVER_DIR}"/"${_ARCH}"
cd "${_SERVER_DIR}"/"${_ARCH}"
rm latest
ln -s "${DIRECTORY}" latest
ln -s "${_DIRECTORY}" latest
EOF

View file

@ -2,7 +2,7 @@
# created by Tobias Powalowski <tpowa@archlinux.org>
_BASENAME="$(basename "${0}")"
X86_64="$(mktemp -d X86_64.XXX)"
_X86_64="$(mktemp -d X86_64.XXX)"
_SHIM_URL="https://kojipkgs.fedoraproject.org/packages/shim/15.4/5/x86_64"
_SHIM_VERSION="shim-x64-15.4-5.x86_64.rpm"
_SHIM32_VERSION="shim-ia32-15.4-5.x86_64.rpm"
@ -115,21 +115,21 @@ if ! [[ "${TARBALL_NAME}" == "" ]]; then
exit 1
fi
mkdir -p "${X86_64}/EFI/BOOT"
mkdir -p "${_X86_64}/EFI/BOOT"
_prepare_kernel_initramfs_files() {
mkdir -p "${X86_64}/boot"
mv "${CORE64}"/*/boot/vmlinuz "${X86_64}/boot/vmlinuz_x86_64"
mv "${CORE64}"/*/boot/initrd.img "${X86_64}/boot/initramfs_x86_64.img"
mv "${CORE64}"/*/boot/{intel-ucode.img,amd-ucode.img} "${X86_64}/boot/"
[[ -f "${CORE64}/*/boot/memtest" ]] && mv "${CORE64}"/*/boot/memtest "${X86_64}/boot/"
mkdir -p "${_X86_64}/boot"
mv "${CORE64}"/*/boot/vmlinuz "${_X86_64}/boot/vmlinuz_x86_64"
mv "${CORE64}"/*/boot/initrd.img "${_X86_64}/boot/initramfs_x86_64.img"
mv "${CORE64}"/*/boot/{intel-ucode.img,amd-ucode.img} "${_X86_64}/boot/"
[[ -f "${CORE64}/*/boot/memtest" ]] && mv "${CORE64}"/*/boot/memtest "${_X86_64}/boot/"
}
_prepare_efitools_uefi () {
cp -f "/usr/share/efitools/efi/HashTool.efi" "${X86_64}/EFI/tools/HashTool.efi"
cp -f "/usr/share/efitools/efi/KeyTool.efi" "${X86_64}/EFI/tools/KeyTool.efi"
cp -f "/usr/share/efitools/efi/HashTool.efi" "${_X86_64}/EFI/tools/HashTool.efi"
cp -f "/usr/share/efitools/efi/KeyTool.efi" "${_X86_64}/EFI/tools/KeyTool.efi"
}
_prepare_fedora_shim_bootloaders () {
@ -138,59 +138,59 @@ _prepare_fedora_shim_bootloaders () {
SHIM=$(mktemp -d shim.XXXX)
curl -s --create-dirs -L -O --output-dir "${SHIM}" "${_SHIM_URL}/${_SHIM_VERSION}"
bsdtar -C "${SHIM}" -xf "${SHIM}"/"${_SHIM_VERSION}"
cp "${SHIM}/boot/efi/EFI/fedora/mmx64.efi" "${X86_64}/EFI/BOOT/mmx64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/shimx64.efi" "${X86_64}/EFI/BOOT/BOOTX64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/mmx64.efi" "${_X86_64}/EFI/BOOT/mmx64.efi"
cp "${SHIM}/boot/efi/EFI/fedora/shimx64.efi" "${_X86_64}/EFI/BOOT/BOOTX64.efi"
# add shim ia32 signed files from fedora
SHIM32=$(mktemp -d shim32.XXXX)
curl -s --create-dirs -L -O --output-dir "${SHIM32}" "${_SHIM_URL}/${_SHIM32_VERSION}"
bsdtar -C "${SHIM32}" -xf "${SHIM32}/${_SHIM32_VERSION}"
cp "${SHIM32}/boot/efi/EFI/fedora/mmia32.efi" "${X86_64}/EFI/BOOT/mmia32.efi"
cp "${SHIM32}/boot/efi/EFI/fedora/shimia32.efi" "${X86_64}/EFI/BOOT/BOOTIA32.efi"
cp "${SHIM32}/boot/efi/EFI/fedora/mmia32.efi" "${_X86_64}/EFI/BOOT/mmia32.efi"
cp "${SHIM32}/boot/efi/EFI/fedora/shimia32.efi" "${_X86_64}/EFI/BOOT/BOOTIA32.efi"
### adding this causes boot loop in ovmf and only tries create a boot entry
#cp "${SHIM}/boot/efi/EFI/BOOT/fbx64.efi" "${X86_64}/EFI/BOOT/fbx64.efi"
#cp "${SHIM}/boot/efi/EFI/BOOT/fbx64.efi" "${_X86_64}/EFI/BOOT/fbx64.efi"
}
_prepare_uefi_image() {
## get size of boot x86_64 files
BOOTSIZE=$(du -bc ${X86_64}/EFI | grep total | cut -f1)
BOOTSIZE=$(du -bc ${_X86_64}/EFI | grep total | cut -f1)
IMGSZ=$(( (${BOOTSIZE}*102)/100/1024 + 1)) # image size in sectors
mkdir -p "${X86_64}"/CDEFI/
mkdir -p "${_X86_64}"/CDEFI/
## Create cdefiboot.img
dd if=/dev/zero of="${X86_64}"/CDEFI/cdefiboot.img bs="${IMGSZ}" count=1024
VFAT_IMAGE="${X86_64}/CDEFI/cdefiboot.img"
dd if=/dev/zero of="${_X86_64}"/CDEFI/cdefiboot.img bs="${IMGSZ}" count=1024
VFAT_IMAGE="${_X86_64}/CDEFI/cdefiboot.img"
mkfs.vfat "${VFAT_IMAGE}"
## Copy all files to UEFI vfat image
mcopy -i "${VFAT_IMAGE}" -s "${X86_64}"/EFI ::/
mcopy -i "${VFAT_IMAGE}" -s "${_X86_64}"/EFI ::/
}
_download_uefi_shell_tianocore() {
mkdir -p "${X86_64}/EFI/tools/"
mkdir -p "${_X86_64}/EFI/tools/"
## Install Tianocore UDK/EDK2 ShellBinPkg UEFI X64 "Full Shell" - For UEFI Spec. >=2.3 systems
cp /usr/share/edk2-shell/x64/Shell.efi "${X86_64}/EFI/tools/shellx64_v2.efi"
cp /usr/share/edk2-shell/x64/Shell.efi "${_X86_64}/EFI/tools/shellx64_v2.efi"
## Install Tianocore UDK/EDK2 EdkShellBinPkg UEFI X64 "Full Shell" - For UEFI Spec. <2.3 systems
cp /usr/share/edk2-shell/x64/Shell_Full.efi "${X86_64}/EFI/tools/shellx64_v1.efi"
cp /usr/share/edk2-shell/x64/Shell_Full.efi "${_X86_64}/EFI/tools/shellx64_v1.efi"
## Install Tianocore UDK/EDK2 ShellBinPkg UEFI IA32 "Full Shell" - For UEFI Spec. >=2.3 systems
cp /usr/share/edk2-shell/ia32/Shell.efi "${X86_64}/EFI/tools/shellia32_v2.efi"
cp /usr/share/edk2-shell/ia32/Shell.efi "${_X86_64}/EFI/tools/shellia32_v2.efi"
## InstallTianocore UDK/EDK2 EdkShellBinPkg UEFI IA32 "Full Shell" - For UEFI Spec. <2.3 systems
cp /usr/share/edk2-shell/ia32/Shell_Full.efi "${X86_64}/EFI/tools/shellia32_v1.efi"
cp /usr/share/edk2-shell/ia32/Shell_Full.efi "${_X86_64}/EFI/tools/shellia32_v1.efi"
}
# build grubXXX with all modules: http://bugs.archlinux.org/task/71382
# If you don't use shim use --disable-shim-lock
_prepare_uefi_X64_GRUB_USB_files() {
mkdir -p "${X86_64}/EFI/BOOT"
cat << GRUBEOF > "${X86_64}/EFI/BOOT/grubx64.cfg"
mkdir -p "${_X86_64}/EFI/BOOT"
cat << GRUBEOF > "${_X86_64}/EFI/BOOT/grubx64.cfg"
insmod part_gpt
insmod part_msdos
insmod fat
@ -268,14 +268,14 @@ menuentry "Exit GRUB" {
}
GRUBEOF
### Hint: https://src.fedoraproject.org/rpms/grub2/blob/rawhide/f/grub.macros#_407
grub-mkstandalone -d /usr/lib/grub/x86_64-efi -O x86_64-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="unicode" --locales="en@quot" --themes="" -o "${X86_64}/EFI/BOOT/grubx64.efi" "boot/grub/grub.cfg=${X86_64}/EFI/BOOT/grubx64.cfg"
grub-mkstandalone -d /usr/lib/grub/x86_64-efi -O x86_64-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="unicode" --locales="en@quot" --themes="" -o "${_X86_64}/EFI/BOOT/grubx64.efi" "boot/grub/grub.cfg=${_X86_64}/EFI/BOOT/grubx64.cfg"
}
_prepare_uefi_IA32_GRUB_USB_files() {
mkdir -p "${X86_64}/EFI/BOOT"
mkdir -p "${_X86_64}/EFI/BOOT"
cat << GRUBEOF > "${X86_64}/EFI/BOOT/grubia32.cfg"
cat << GRUBEOF > "${_X86_64}/EFI/BOOT/grubia32.cfg"
insmod part_gpt
insmod part_msdos
insmod fat
@ -343,7 +343,7 @@ menuentry "Exit GRUB" {
}
GRUBEOF
### Hint: https://src.fedoraproject.org/rpms/grub2/blob/rawhide/f/grub.macros#_407
grub-mkstandalone -d /usr/lib/grub/i386-efi -O i386-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="unicode" --locales="en@quot" --themes="" -o "${X86_64}/EFI/BOOT/grubia32.efi" "boot/grub/grub.cfg=${X86_64}/EFI/BOOT/grubia32.cfg"
grub-mkstandalone -d /usr/lib/grub/i386-efi -O i386-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="unicode" --locales="en@quot" --themes="" -o "${_X86_64}/EFI/BOOT/grubia32.efi" "boot/grub/grub.cfg=${_X86_64}/EFI/BOOT/grubia32.cfg"
}
@ -370,11 +370,11 @@ echo "Prepare UEFI image ..."
_prepare_uefi_image >/dev/null 2>&1
# place syslinux files
mkdir -p "${X86_64}/boot/syslinux"
mv "${CORE64}"/*/boot/syslinux/* "${X86_64}/boot/syslinux/"
mkdir -p "${_X86_64}/boot/syslinux"
mv "${CORE64}"/*/boot/syslinux/* "${_X86_64}/boot/syslinux/"
# Change parameters in boot.msg
sed -i -e "s/@@DATE@@/$(date)/g" -e "s/@@KERNEL@@/$KERNEL/g" -e "s/@@RELEASENAME@@/$RELEASENAME/g" -e "s/@@BOOTLOADER@@/ISOLINUX/g" "${X86_64}/boot/syslinux/boot.msg"
sed -i -e "s/@@DATE@@/$(date)/g" -e "s/@@KERNEL@@/$KERNEL/g" -e "s/@@RELEASENAME@@/$RELEASENAME/g" -e "s/@@BOOTLOADER@@/ISOLINUX/g" "${_X86_64}/boot/syslinux/boot.msg"
## Generate the BIOS+ISOHYBRID+UEFI CD image using xorriso (extra/libisoburn package) in mkisofs emulation mode
echo "Generating X86_64 hybrid ISO ..."
@ -388,7 +388,7 @@ xorriso -as mkisofs \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin \
-eltorito-alt-boot -e CDEFI/cdefiboot.img -isohybrid-gpt-basdat -no-emul-boot \
-output "${IMAGENAME}.iso" "${X86_64}/" &> "${IMAGENAME}.log"
-output "${IMAGENAME}.iso" "${_X86_64}/" &> "${IMAGENAME}.log"
## create sha256sums.txt
echo "Generating sha256sum ..."
@ -396,9 +396,9 @@ rm -f "sha256sums.txt" || true
cksum -a sha256 *.iso > "sha256sums.txt"
# cleanup
echo "Cleanup remove ${CORE64}, ${X86_64}, ${SHIM} and ${SHIM32} ..."
echo "Cleanup remove ${CORE64}, ${_X86_64}, ${SHIM} and ${SHIM32} ..."
rm -rf "${CORE64}"
rm -rf "${X86_64}"
rm -rf "${_X86_64}"
rm -rf "${SHIM}"
rm -rf "${SHIM32}"
echo "Finished ISO creation."

View file

@ -4,7 +4,7 @@
_BASENAME="$(basename "${0}")"
_PRESET_LATEST="x86_64-latest"
W_DIR="archboot-release"
_W_DIR="archboot-release"
usage () {
echo "CREATE ARCHBOOT RELEASE IMAGE"
@ -25,20 +25,20 @@ echo "Start release creation in $1 ..."
mkdir -p $1
cd $1
# create container
archboot-x86_64-create-container.sh "${W_DIR}" -cc -cp -alf
archboot-x86_64-create-container.sh "${_W_DIR}" -cc -cp -alf
# generate tarball in container, umount tmp it's a tmpfs and weird things could happen then
echo "Generate ISO ..."
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -t -i=archrelease"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -t -i=archrelease"
# generate iso in container
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -g -T=archrelease.tar"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -g -T=archrelease.tar"
# remove not working lvm2 from latest image
echo "Remove lvm2 and openssh from container ${W_DIR} ..."
systemd-nspawn -D "${W_DIR}" /bin/bash -c "pacman -Rdd lvm2 openssh --noconfirm" >/dev/null 2>&1
echo "Remove lvm2 and openssh from container ${_W_DIR} ..."
systemd-nspawn -D "${_W_DIR}" /bin/bash -c "pacman -Rdd lvm2 openssh --noconfirm" >/dev/null 2>&1
# generate latest tarball in container
echo "Generate latest ISO ..."
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -t -i=latest -p="${_PRESET_LATEST}""
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -t -i=latest -p="${_PRESET_LATEST}""
# generate latest iso in container
systemd-nspawn -q -D "${W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -g -T=latest.tar -p="${_PRESET_LATEST}" -r=$(date +%Y.%m.%d-%H.%M)-latest"
systemd-nspawn -q -D "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-x86_64-iso.sh -g -T=latest.tar -p="${_PRESET_LATEST}" -r=$(date +%Y.%m.%d-%H.%M)-latest"
# create Release.txt with included main archlinux packages
echo "Generate Release.txt ..."
echo "Welcome to ARCHBOOT INSTALLATION / RESCUEBOOT SYSTEM" >>Release.txt
@ -46,15 +46,15 @@ echo "Creation Tool: 'archboot' Tobias Powalowski <tpowa@archlinux.org>" >>Relea
echo "Homepage: https://wiki.archlinux.org/title/Archboot" >>Release.txt
echo "Architecture: x86_64" >>Release.txt
echo "RAM requirement to boot: 1152 MB or greater" >>Release.txt
echo "Archboot:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi archboot | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Kernel:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi linux | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Pacman:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi pacman | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Systemd:$(systemd-nspawn -q -D "${W_DIR}" pacman -Qi systemd | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Archboot:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi archboot | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Kernel:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi linux | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Pacman:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi pacman | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
echo "Systemd:$(systemd-nspawn -q -D "${_W_DIR}" pacman -Qi systemd | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")" >>Release.txt
# move iso out of container
mv "${W_DIR}"/*.iso ./
mv "${_W_DIR}"/*.iso ./
# remove container
echo "Remove container ${W_DIR} ..."
rm -r "${W_DIR}"
echo "Remove container ${_W_DIR} ..."
rm -r "${_W_DIR}"
# create boot directory with ramdisks
echo "Create boot directory ..."
mkdir -p boot/licenses/{amd-ucode,intel-ucode}

View file

@ -1,15 +1,15 @@
#! /bin/bash
DIRECTORY="$(date +%Y.%m)"
ARCH="x86_64"
BUILDDIR="/home/tobias/Arch/iso/${ARCH}"
PACMAN_MIRROR="/etc/pacman.d/mirrorlist"
PACMAN_CONF="/etc/pacman.conf"
SERVER="pkgbuild.com"
HOME="/home/tpowa/"
SERVER_DIR="/home/tpowa/public_html/archboot-images"
USER="tobias"
GROUP="users"
GPG="--detach-sign --batch --passphrase-file /etc/archboot/gpg.passphrase --pinentry-mode loopback -u 7EDF681F"
_DIRECTORY="$(date +%Y.%m)"
_ARCH="x86_64"
_BUILDDIR="/home/tobias/Arch/iso/${_ARCH}"
_PACMAN_MIRROR="/etc/pacman.d/mirrorlist"
_PACMAN_CONF="/etc/pacman.conf"
_SERVER="pkgbuild.com"
_HOME_DIR="/home/tpowa/"
_SERVER_DIR="/home/tpowa/public_html/archboot-images"
_USER="tobias"
_GROUP="users"
_GPG="--detach-sign --batch --passphrase-file /etc/archboot/gpg.passphrase --pinentry-mode loopback -u 7EDF681F"
### check for root
if ! [[ ${UID} -eq 0 ]]; then
@ -24,44 +24,44 @@ if [[ ! "$(cat /etc/hostname)" == "T-POWA-LX" ]]; then
fi
# use pacman.conf with disabled [testing] repository
cp "${PACMAN_CONF}" "${PACMAN_CONF}".old
cp "${PACMAN_CONF}".archboot "${PACMAN_CONF}"
cp "${_PACMAN_CONF}" "${_PACMAN_CONF}".old
cp "${_PACMAN_CONF}".archboot "${_PACMAN_CONF}"
# use mirrorlist with enabled rackspace mirror
cp "${PACMAN_MIRROR}" "${PACMAN_MIRROR}".old
cp "${PACMAN_MIRROR}".archboot "${PACMAN_MIRROR}"
# create release in "${BUILDDIR}"
cd "${BUILDDIR}"
[[ -e "${DIRECTORY}" ]] && rm -r "${DIRECTORY}"
archboot-"${ARCH}"-release.sh "${DIRECTORY}"
cp "${_PACMAN_MIRROR}" "${_PACMAN_MIRROR}".old
cp "${_PACMAN_MIRROR}".archboot "${_PACMAN_MIRROR}"
# create release in "${_BUILDDIR}"
cd "${_BUILDDIR}"
[[ -e "${_DIRECTORY}" ]] && rm -r "${_DIRECTORY}"
archboot-"${_ARCH}"-release.sh "${_DIRECTORY}"
# set user rights on files
chown -R "${USER}" "${DIRECTORY}"
chgrp -R "${GROUP}" "${DIRECTORY}"
cd "${DIRECTORY}"
chown -R "${_USER}" "${_DIRECTORY}"
chgrp -R "${_GROUP}" "${_DIRECTORY}"
cd "${_DIRECTORY}"
# remove sha256sum
rm sha256sum.txt
# sign files and create new sha256sum.txt
for i in *; do
[[ -f "${i}" ]] && sudo -u "${USER}" gpg ${GPG} "${i}"
[[ -f "${i}" ]] && sudo -u "${_USER}" gpg ${_GPG} "${i}"
[[ -f "${i}" ]] && cksum -a sha256 "${i}" >> sha256sum.txt
[[ -f "${i}.sig" ]] && cksum -a sha256 "${i}.sig" >> sha256sum.txt
done
for i in boot/*; do
[[ -f "${i}" ]] && sudo -u "${USER}" gpg ${GPG} "${i}"
[[ -f "${i}" ]] && sudo -u "${_USER}" gpg ${_GPG} "${i}"
[[ -f "${i}" ]] && cksum -a sha256 "${i}" >> sha256sum.txt
[[ -f "${i}.sig" ]] && cksum -a sha256 "${i}.sig" >> sha256sum.txt
done
cd ..
# restore pacman.conf and mirrorlist
cp "${PACMAN_MIRROR}".old "${PACMAN_MIRROR}"
cp "${PACMAN_CONF}".old "${PACMAN_CONF}"
cp "${_PACMAN_MIRROR}".old "${_PACMAN_MIRROR}"
cp "${_PACMAN_CONF}".old "${_PACMAN_CONF}"
# copy files to server
sudo -u "${USER}" scp -r "${DIRECTORY}" "${SERVER}":"${HOME}"
sudo -u "${_USER}" scp -r "${_DIRECTORY}" "${_SERVER}":"${_HOME_DIR}"
# move files on server, create symlink and remove 3 month old release
sudo -u "${USER}" ssh "${SERVER}" <<EOF
rm -r "${SERVER_DIR}"/"${ARCH}"/"${DIRECTORY}"
rm -r "${SERVER_DIR}"/"${ARCH}"/"$(date -d "$(date +) - 3 month" +%Y.%m)"
mv "${DIRECTORY}" "${SERVER_DIR}"/"${ARCH}"
cd "${SERVER_DIR}"/"${ARCH}"
sudo -u "${_USER}" ssh "${_SERVER}" <<EOF
rm -r "${_SERVER_DIR}"/"${_ARCH}"/"${_DIRECTORY}"
rm -r "${_SERVER_DIR}"/"${_ARCH}"/"$(date -d "$(date +) - 3 month" +%Y.%m)"
mv "${_DIRECTORY}" "${_SERVER_DIR}"/"${_ARCH}"
cd "${_SERVER_DIR}"/"${_ARCH}"
rm latest
ln -s "${DIRECTORY}" latest
ln -s "${_DIRECTORY}" latest
EOF