#!/bin/bash # Source & license at https://github.com/macmpi/berryboot-scripts # Feel free to report any issue or comment there. INSTALLVERSION="1.2" BBINITURL="https://bit.ly/BBInitLakka" INSTALLURL="https://bit.ly/InstLakka" MOUNTDIR=${1:-""} UPDATE_SELF=${UPDATE_SELF:-1} WORK_PATH="$(pwd)" function update_self() { # function mostly borrowed from MrEngman install-wifi: thanks! echo " *** Performing self-update" _tempFileName="$0.tmp" if ! curl -Ls --output "${_tempFileName}" "${INSTALLURL}"; then echo " !!! Failed to download update for $0 !" echo " !!! Make sure you have ca-certificates installed and that time is set correctly" exit 1 fi OCTAL_MODE=$(stat -c '%a' "$0") if ! chmod ${OCTAL_MODE} "${_tempFileName}" ; then echo " !!! Failed: Error while trying to set mode on ${_tempFileName}" exit 1 fi cat > "${WORK_PATH}/.updateScript.sh" << EOF if mv "${_tempFileName}" "$0"; then rm -- "\$0" exec env UPDATE_SELF=0 /bin/bash "$0" "${MOUNTDIR}" else echo " !!! Failed!" fi EOF echo " *** Relaunching after update" exec /bin/bash "${WORK_PATH}/.updateScript.sh" } ############# Few general checks to run safely [ "$BASH_VERSION" != '' ] || { echo >&2 "Please run with bash, or as: ./$0 Exiting now..."; exit 1; } wget -q --tries=10 --timeout=20 --spider http://google.com > /dev/null 2>&1 || { echo >&2 "Please check your internet connection !! Exiting now..."; exit 1; } [ "${UPDATE_SELF}" -ne 0 ] && { update_self; } echo -n " ################################################### ########### Lakka install on Berryboot ########### ########### version ${INSTALLVERSION} by macmpi ########### This script prepares and installs Lakka image for use under berryboot on Raspberry Pi It MUST be run under a Debian Linux OS (like Raspbian-lite) and with internet access. At first run, it may install missing Debian packages: this can take time... (sudo rights are needed for Debian installs, mounts and image copy) If run under Pi with berryboot (recommended), it will try to install image into final location (SD/USB disk encrypted or not, iSCSI). If not run under berryboot (Pi, PC,...), it will try to copy image to any connected media eventually containing a berryboot partition. If no berryboot data partition is detected, image file may be produced in working directory, for later-on use... Hit any key to continue, or \"q\" to quit " read -n 1 resp echo "" if [ "${resp}" = "q" ]; then echo "Setup unmodified, quitting... Bye!" exit 1 fi RUNBB=false ! uname -r | grep "\-aufs" > /dev/null 2>&1 || { echo >&2 "berryboot kernel detected !! "; RUNBB=true; } # Install required Debian tool packages if needed function check_install_packages() { APTUPDT=false for p do if ! dpkg-query -s $p 2> /dev/null | grep -q ^"Status: install ok installed" ; then [ ${APTUPDT} = true ] || { echo >&2 "We need to install a few Debian tools (only once)...please be patient"; echo >&2 ""; sudo apt-get update; } sudo apt-get install -y "$p" APTUPDT=true fi done [ ${APTUPDT} = false ] || { echo >&2 "Debian tools installed, let's move-on !"; echo >&2 ""; } } if [ ${RUNBB} = true ]; then check_install_packages squashfs-tools # encrypted and iscsi are readily available else check_install_packages squashfs-tools cryptsetup open-iscsi fi ################## Determine where to land image file if [ -z "${MOUNTDIR}" ]; then CRYPT_PART=$( sudo blkid | egrep "TYPE=\"crypto_LUKS\"" | awk -F ":" '{print $1}' ) if [ ! -z "${CRYPT_PART}" ] && [ ${RUNBB} = false ]; then # not on berryboot but encrypted data partition plugged-in echo "Encrypted Berryboot partition found !" sudo cryptsetup luksOpen "${CRYPT_PART}" lukstemp > /dev/null 2>&1 fi DEVLIST=$( sudo blkid | egrep "LABEL=\"berryboot\"" | awk -F ":" '{print $1}' ) for p in ${DEVLIST} do echo -n "Found berryboot partition at $p : do you want to use this one? [Y/n] " read -n 1 resp echo "" if [ "${resp}" != "n" ]; then # on Berryboot: mounts any type (std, encrypted, iscsi); on other cases all mounted except iscsi MOUNTDIR="$(pwd)/berryboot" mkdir -p "${MOUNTDIR}" sudo mount "${p}" "${MOUNTDIR}" > /dev/null 2>&1 break fi done fi # Handle missing berryboot folder DESTDIR="${MOUNTDIR}"/images if ! ls "${DESTDIR}" > /dev/null 2>&1; then DESTDIR="$(pwd)" echo -n " Could not find any berryboot data partition ! You may QUIT, and once you manually mount a target berryboot partition, you may relaunch and pass relevant mountpoint path as input paramater. Alternatively, you may choose to CONTINUE, and this script will produce image file into ${DESTDIR} directory. You may then move that image later-on yourself into \"images\" directory, within your berryboot data partition. Hit any key to continue, or \"q\" to quit : " read -n 1 resp echo "" if [ "${resp}" = "q" ]; then if [ -z "$1" ]; then sudo umount "${MOUNTDIR}" > /dev/null 2>&1 rmdir "${MOUNTDIR}" > /dev/null 2>&1 sudo cryptsetup luksClose lukstemp > /dev/null 2>&1 fi echo "Setup unmodified, quitting... Bye!" exit 1 fi fi #################### Now we start the actual work !... IMAGENAME="Lakka" FBVERSION="2.0" # fallback Lakka version if latest can not be detected BB_MEM="128" # this corresponds to Lakka default 16MB gpu memory split. Change if you need different MODEL="" # try to identify Pi architecture MODEL=$( uname -m ) case $MODEL in armv6l) MODEL="Pi Zero/v1" ;; armv7l) MODEL="Pi v2/v3" ;; *) MODEL="" ;; esac echo "" if [ ! -z "${MODEL}" ]; then echo -n "We detected ${MODEL} model. Please hit [ENTER] to confirm, or type \"0\" for Pi Zero/v1, or \"2\" for Pi v2/v3: " else echo -n "Unknown Pi Model. Please type \"0\" for Pi Zero/v1, or \"2\" for Pi v2/v3: " fi read -n 1 resp echo "" case $resp in 0) MODEL="RPi.arm" ;; 2) MODEL="RPi2.arm" ;; "") case $MODEL in "Pi Zero/v1") MODEL="RPi.arm" ;; "Pi v2/v3") MODEL="RPi2.arm" ;; "") echo "Could not determine proper Pi Model, quitting..." exit 1 ;; esac ;; *) echo "Could not determine proper Pi Model, quitting..." exit 1 ;; esac # Try to find latest Lakka version number VLATEST=$( curl -Ls --user-agent "fogent" "http://www.lakka.tv/get/linux/rpi" | grep -o 'Lakka-RPi\.arm-.*\.img.gz' | head -n 1 | awk -F "-" '{print $3}' | sed "s/.......$//g" ) echo "" if [ -z "${VLATEST}" ]; then echo "Could not identify latest version, falling-back to version ${FBVERSION}" VLATEST="${FBVERSION}" else echo "Lakka latest release version is: ${VLATEST}" fi echo -n " Please input desired Lakka version (format: X.Y) List of available versions here: http://le.builds.lakka.tv/RPi.arm/ For default version ${VLATEST}, just hit [ENTER] : " read resp if [ ! -z "${resp}" ]; then VLATEST="${resp}" fi echo -n " Please input name for the image (no space or special characters) For default name ${IMAGENAME}, just hit [ENTER] : " read resp echo "" if [ ! -z "${resp}" ]; then IMAGENAME="${resp}" fi DONE=-1 WORKDIR="tmp_workdir" mkdir "${WORKDIR}" cd "${WORKDIR}" FILENAME="${IMAGENAME}".img"${BB_MEM}" # Lakka image file name in Berryboot echo "Downloading original image from Lakka repo, this may take a bit of time..." if wget "http://le.builds.lakka.tv/${MODEL}/Lakka-${MODEL}-${VLATEST}.tar"; then echo "Expanding archive..." if tar --strip-components=2 -xf "Lakka-${MODEL}-${VLATEST}.tar" "Lakka-${MODEL}-${VLATEST}"/target/SYSTEM; then echo "Obtaining patches..." if wget -O berryboot-init "${BBINITURL}" > /dev/null 2>&1; then echo "Applying patches..." if mksquashfs ./berryboot-init SYSTEM > /dev/null 2>&1; then echo "Moving image into place..." sudo mv -f SYSTEM "${DESTDIR}/${FILENAME}" > /dev/null 2>&1 DONE=$? [ ${DONE} -eq 0 ] || { echo >&2 "Final Lakka image copy failed"; } else echo "Lakka image patch failed." fi else echo "Patch files download failed." fi else echo "Archive expansion failed." fi else echo "Lakka image download failed, or wrong version." fi ###### clean-up and exit cd .. echo "cleaning-up..." rm -rf "${WORKDIR:?}" sync if [ ${RUNBB} = true ]; then sudo umount "${MOUNTDIR}" > /dev/null 2>&1 rmdir "${MOUNTDIR}" [ ${DONE} -eq 0 ] && { echo "Install done. You may launch ${IMAGENAME} from berryboot UI at next reboot"; } else if [ -z "$1" ] && [ "${DESTDIR}" != "$(pwd)" ]; then # we mounted image so we will unmount sudo umount "${MOUNTDIR}" > /dev/null 2>&1 rmdir "${MOUNTDIR}" > /dev/null 2>&1 sudo cryptsetup luksClose lukstemp > /dev/null 2>&1 [ ${DONE} -eq 0 ] && { echo "Install done. You may plug back your berryboot media into your Pi, and launch ${IMAGENAME} from berryboot UI at next boot"; } else [ ${DONE} -eq 0 ] && { echo "Install done; image file is available in: ${DESTDIR}/${FILENAME}"; } fi fi exit 0