Compare commits

..

No commits in common. "master" and "v0.2.0" have entirely different histories.

View File

@ -1,316 +1,191 @@
#!/bin/sh #!/bin/bash
VERSION="0.3.3" VERSION="0.2.0"
BRANCH=master BRANCH=master
CUSTOM=""
UBOOT_JOB=u-boot UBOOT_JOB=u-boot
UBOOT_DIR=u-boot-bootloader UBOOT_DIR=u-boot-bootloader
ROOTFS_PINEPHONE_JOB=pinephone-rootfs
ROOTFS_PINEPHONE_1_0_JOB=pinephone-1.0-rootfs
ROOTFS_PINEPHONE_1_1_JOB=pinephone-1.1-rootfs
ROOTFS_PINETAB_JOB=pinetab-rootfs ROOTFS_PINETAB_JOB=pinetab-rootfs
ROOTFS_PINETABDEV_JOB=pinetab-rootfs
ROOTFS_DEVKIT_JOB=devkit-rootfs ROOTFS_DEVKIT_JOB=devkit-rootfs
ROOTFS_PINEPHONE_1_0_DIR=pinephone-1.0 ROOTFS_PINEPHONE_DIR=pinephone
ROOTFS_PINEPHONE_1_1_DIR=pinephone-1.1
ROOTFS_PINETAB_DIR=pinetab ROOTFS_PINETAB_DIR=pinetab
ROOTFS_PINETABDEV_DIR=pinetab
ROOTFS_DEVKIT_DIR=devkit ROOTFS_DEVKIT_DIR=devkit
UBOOT_PINEPHONE_1_0_DIR=pinephone-1.0
UBOOT_PINEPHONE_1_1_DIR=pinephone-1.1
UBOOT_PINETAB_DIR=pinetab
UBOOT_PINETABDEV_DIR=pinetabdev
UBOOT_DEVKIT_DIR=devkit
MOUNT_DATA=./data MOUNT_DATA=./data
MOUNT_BOOT=./boot MOUNT_BOOT=./boot
# Parse arguments # Parse arguments
# https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash # https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash
unset POSITIONAL POSITIONAL=()
while [ "$#" -gt 0 ]; do while [[ $# -gt 0 ]]
case "$1" in do
-b|--branch) key="$1"
BRANCH="$2"
shift 2
;;
-h|--help)
printf '%s\n' "Sailfish OS flashing script for Pine64 devices
This script will download the latest Sailfish OS image for the Pine
Phone, Pine Phone dev kit, or Pine Tab. It requires that you have a
micro SD card inserted into the computer.
usage: flash-it.sh [-b BRANCH] case $key in
-b|--branch)
BRANCH="$2"
shift
shift
;;
-h|--help)
echo "Sailfish OS flashing script for Pine64 devices"
echo ""
printf '%s\n' \
"This script will download the latest Sailfish OS image for the Pine" \
"Phone, Pine Phone dev kit, or Pine Tab. It requires that you have a" \
"micro SD card inserted into the computer." \
"" \
"usage: flash-it.sh [-b BRANCH]" \
"" \
"Options:" \
"" \
" -b, --branch BRANCH Download images from a specific Git branch." \
" -h, --help Print this help and exit." \
"" \
"This command requires: parted, sudo, wget, tar, unzip, lsblk," \
"mkfs.ext4." \
""\
"Some distros do not have parted on the PATH. If necessary, add" \
"parted to the PATH before running the script."
Options: exit 0
shift
-c, --custom Install from custom dir. Just put you rootfs.tar.bz2 ;;
and u-boot-sunxi-with-spl.bin into dir and system will *) # unknown argument
istalled from it POSITIONAL+=("$1") # save it in an array for later
-b, --branch BRANCH Download images from a specific Git branch. shift # past argument
-h, --help Print this help and exit. ;;
esac
This command requires: parted; sudo, doas or su; wget or curl; tar, unzip, lsblk,
and mkfs.ext4.
Some distros do not have parted on the PATH. If necessary, add
parted to the PATH before running the script."
exit 0
;;
-c|--custom)
CUSTOM="$2"
shift 2
;;
*) # unknown argument
POSITIONAL="$POSITIONAL:$1" # save it in a list for later
shift # past argument
;;
esac
done done
# Retrieve saved arguments set -- "${POSITIONAL[@]}" # restore positional parameters
IFS=: set -- ${POSITIONAL#:}
# Helper functions # Helper functions
# Run as root
as_root() {
command -V sudo >/dev/null 2>&1 && {
sudo "$@"
return "$?"
}
command -V doas >/dev/null 2>&1 && {
doas "$@"
return "$?"
}
command -V su >/dev/null 2>&1 && {
su -c "$*"
return "$?"
}
}
# Print message to stderr and exit
die() {
printf '%s\n' "$*" >&2
exit "${status:-2}"
}
# Error out if the given command is not found on the PATH. # Error out if the given command is not found on the PATH.
check_dependency() { function check_dependency {
command -V "$1" >/dev/null 2>&1 || dependency=$1
status=1 die "$1 not found. Please make sure it is installed and in your PATH." command -v $dependency >/dev/null 2>&1 || {
} echo >&2 "${dependency} not found. Please make sure it is installed and on your PATH."; exit 1;
}
# Check if one or more of depends are present
check_alternative_dependencies() {
IFS=', ' all="$*"
unset found
while [ "$1" ]; do
command -V "$1" >/dev/null 2>&1 && {
found=y
break
}
shift
done
[ "$found" ] || die "None of '$all found'. Please make sure one of them is installed and in your PATH."
} }
# Determine if wget supports the --show-progress option (introduced in # Determine if wget supports the --show-progress option (introduced in
# 1.16). If so, make use of that instead of spewing out redirects and # 1.16). If so, make use of that instead of spewing out redirects and
# loads of info into the terminal. # loads of info into the terminal.
set_wget_cmd() { function wget_cmd {
if command -V wget >/dev/null 2>&1; then wget --show-progress > /dev/null 2>&1
status=$?
if wget --help 2>&1 | grep -q 'show-progress'; then # Exit code 2 means command parsing error (i.e. option does not
WGET="wget -q --show-progress -O" # exist).
else if [ "$status" == "2" ]; then
WGET="wget -O" echo "wget -O"
fi else
echo "wget -q --show-progress -O"
else fi
WGET="curl -Lo"
fi
} }
# Add sbin to the PATH to make sure all commands are found
export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin"
# Check dependencies # Check dependencies
check_alternative_dependencies sudo doas su check_dependency "parted"
check_alternative_dependencies wget curl check_dependency "sudo"
check_dependency tar check_dependency "wget"
check_dependency unzip check_dependency "tar"
check_dependency lsblk check_dependency "unzip"
check_dependency parted check_dependency "lsblk"
check_dependency mkfs.ext4 check_dependency "mkfs.ext4"
check_dependency losetup
# If use custom dir check it # Different branch for some reason?
if [ "$CUSTOM" ]; then if [ "${BRANCH}" != "master" ]; then
if [ ! -d "$CUSTOM" ]; then echo -e "\e[1m\e[97m!!! Will flash image from ${BRANCH} branch !!!\e[0m"
die "!!! Directory $CUSTOM not exist !!!"
fi
if [ ! -f "$CUSTOM/rootfs.tar.bz2" ]; then
die "!!! rootfs $CUSTOM/rootfs.tar.bz2 not found !!!"
fi
if [ ! -f "$CUSTOM/u-boot-sunxi-with-spl.bin" ]; then
die "!!! uboot image $CUSTOM/u-boot-sunxi-with-spl.bin not found !!!"
fi
if ! [ -f "$CUSTOM/boot.scr" ]; then
die "!!! uboot config $CUSTOM/boot.scr not found !!!"
fi
else
# Different branch for some reason?
if [ "$BRANCH" != master ]; then
printf '%s\n' "!!! Will flash image from $BRANCH branch !!!"
fi
# Header
printf '%s\n' "Sailfish OS Pine64 device flasher V$VERSION
======================================
"
# Image selection
printf '%s\n' "Which image do you want to flash?"
: $(( i = 0 ))
for opt in "PinePhone 1.0 (Development) device" "PinePhone 1.1 (Brave Heart) or 1.2 (Community Editions) device" "PineTab device" "PineTab Dev device" "Dont Be Evil devkit"; do
: $(( i += 1 ))
printf '%s\n' "$i) $opt"
done
printf '%s' "#? "
read -r OPTION
case "$OPTION" in
1) ROOTFS_JOB=$ROOTFS_PINEPHONE_1_0_JOB; ROOTFS_DIR=$ROOTFS_PINEPHONE_1_0_DIR; UBOOT_DEV_DIR=$UBOOT_PINEPHONE_1_0_DIR;;
2) ROOTFS_JOB=$ROOTFS_PINEPHONE_1_1_JOB; ROOTFS_DIR=$ROOTFS_PINEPHONE_1_1_DIR; UBOOT_DEV_DIR=$UBOOT_PINEPHONE_1_1_DIR;;
3) ROOTFS_JOB=$ROOTFS_PINETAB_JOB; ROOTFS_DIR=$ROOTFS_PINETAB_DIR; UBOOT_DEV_DIR=$UBOOT_PINETAB_DIR;;
4) ROOTFS_JOB=$ROOTFS_PINETABDEV_JOB; ROOTFS_DIR=$ROOTFS_PINETABDEV_DIR; UBOOT_DEV_DIR=$UBOOT_PINETABDEV_DIR;;
5) ROOTFS_JOB=$ROOTFS_DEVKIT_JOB; ROOTFS_DIR=$ROOTFS_DEVKIT_DIR; UBOOT_DEV_DIR=$UBOOT_DEVKIT_DIR;;
*) die "Invalid selection";;
esac
# Downloading images
printf '%s\n' "Downloading images..."
set_wget_cmd
UBOOT_DOWNLOAD="https://gitlab.com/sailfishos-porters-ci/dont_be_evil-ci/-/jobs/artifacts/$BRANCH/download?job=$UBOOT_JOB"
$WGET "$UBOOT_JOB.zip" "$UBOOT_DOWNLOAD" || {
die "UBoot image download failed. Aborting."
}
UBOOT2_JOB=u-boot-sunxi-with-spl-pinephone.bin
UBOOT_DOWNLOAD2="https://gitlab.com/pine64-org/crust-meta/-/jobs/artifacts/master/raw/u-boot-sunxi-with-spl-pinephone.bin?job=build"
$WGET "$UBOOT2_JOB" "$UBOOT_DOWNLOAD2" || {
die "UBoot image download failed. Aborting."
}
ROOTFS_DOWNLOAD="https://gitlab.com/sailfishos-porters-ci/dont_be_evil-ci/-/jobs/artifacts/$BRANCH/download?job=$ROOTFS_JOB"
$WGET "$ROOTFS_JOB.zip" "$ROOTFS_DOWNLOAD" || {
die "Root filesystem image download failed. Aborting."
}
fi fi
# Header
echo -e "\e[1m\e[91mSailfish OS Pine64 device flasher V$VERSION\e[0m"
echo "======================================"
echo ""
# Image selection
echo -e "\e[1mWhich image do you want to flash?\e[0m"
select OPTION in "PinePhone device" "PineTab device" "Dont Be Evil devkit"; do
case $OPTION in
"PinePhone device" ) ROOTFS_JOB=$ROOTFS_PINEPHONE_JOB; ROOTFS_DIR=$ROOTFS_PINEPHONE_DIR; break;;
"PineTab device" ) ROOTFS_JOB=$ROOTFS_PINETAB_JOB; ROOTFS_DIR=$ROOTFS_PINETAB_DIR; break;;
"Dont Be Evil devkit" ) ROOTFS_JOB=$ROOTFS_DEVKIT_JOB; ROOTFS_DIR=$ROOTFS_DEVKIT_DIR; break;;
esac
done
# Downloading images
echo -e "\e[1mDownloading images...\e[0m"
WGET=$(wget_cmd)
UBOOT_DOWNLOAD="https://gitlab.com/sailfishos-porters-ci/dont_be_evil-ci/-/jobs/artifacts/$BRANCH/download?job=$UBOOT_JOB"
$WGET "${UBOOT_JOB}.zip" "${UBOOT_DOWNLOAD}" || {
echo >&2 "UBoot image download failed. Aborting."
exit 2
}
ROOTFS_DOWNLOAD="https://gitlab.com/sailfishos-porters-ci/dont_be_evil-ci/-/jobs/artifacts/$BRANCH/download?job=$ROOTFS_JOB"
$WGET "${ROOTFS_JOB}.zip" "${ROOTFS_DOWNLOAD}" || {
echo >&2 "Root filesystem image download failed. Aborting."
exit 2
}
# Select flash target # Select flash target
printf '%s\n' "Which SD card do you want to flash?" echo -e "\e[1mWhich SD card do you want to flash?\e[0m"
lsblk lsblk
printf '%s\n%s\n' "raw" "Device node (/dev/sdX): " read -p "Device node (/dev/sdX): " DEVICE_NODE
read -r DEVICE_NODE echo "Flashing image to: $DEVICE_NODE"
printf '%s\n' "Flashing image to: $DEVICE_NODE echo "WARNING: All data will be erased! You have been warned!"
WARNING: All data will be erased! You have been warned! echo "Some commands require root permissions, you might be asked to enter your sudo password."
Some commands require root permissions, you might be asked to enter your password."
#create loop file for raw.img
if [ "$DEVICE_NODE" = raw ]; then
as_root dd if=/dev/zero of=sdcard.img bs=1 count=0 seek=4G
DEVICE_NODE=./sdcard.img
fi
# Creating EXT4 file system # Creating EXT4 file system
printf '%s\n' "Creating EXT4 file system..." echo -e "\e[1mCreating EXT4 file system...\e[0m"
for PARTITION in "$DEVICE_NODE"*; do for PARTITION in $(ls ${DEVICE_NODE}*)
do
echo "Unmounting $PARTITION" echo "Unmounting $PARTITION"
as_root umount "$PARTITION" sudo umount $PARTITION
done done
as_root parted "$DEVICE_NODE" mklabel msdos --script sudo parted $DEVICE_NODE mklabel msdos --script
as_root parted "$DEVICE_NODE" mkpart primary ext4 1MB 250MB --script sudo parted $DEVICE_NODE mkpart primary ext4 1MB 250MB --script
as_root parted "$DEVICE_NODE" mkpart primary ext4 250MB 100% --script sudo parted $DEVICE_NODE mkpart primary ext4 250MB 100% --script
sudo mkfs.ext4 -F -L boot "${DEVICE_NODE}1" # 1st partition = boot
if [ "$DEVICE_NODE" = ./sdcard.img ]; then sudo mkfs.ext4 -F -L data "${DEVICE_NODE}2" # 2nd partition = data
printf '%s\n' "Prepare loop file"
as_root losetup -D
as_root losetup -Pf sdcard.img
LOOP_NODE="$(echo /dev/loop?p1 | cut -c10-10)"
DEVICE_NODE="/dev/loop$LOOP_NODE"
fi
# use p1, p2 extentions instead of 1, 2 when using sd drives
if echo "$DEVICE_NODE" | grep -q -E 'mmcblk|loop'; then
BOOTPART="${DEVICE_NODE}p1"
DATAPART="${DEVICE_NODE}p2"
else
BOOTPART="${DEVICE_NODE}1"
DATAPART="${DEVICE_NODE}2"
fi
as_root mkfs.ext4 -F -L boot "$BOOTPART" # 1st partition = boot
as_root mkfs.ext4 -F -L data "$DATAPART" # 2nd partition = data
# Flashing u-boot # Flashing u-boot
printf '%s\n' "Flashing U-boot..." echo -e "\e[1mFlashing U-boot...\e[0m"
if [ "$CUSTOM" ]; then unzip "${UBOOT_JOB}.zip"
as_root dd if="$CUSTOM/u-boot-sunxi-with-spl.bin" of="$DEVICE_NODE" bs=8k seek=1 sudo dd if="./u-boot-bootloader/u-boot/u-boot-sunxi-with-spl.bin" of="$DEVICE_NODE" bs=8k seek=1
else
unzip "$UBOOT_JOB.zip"
as_root dd if="./u-boot-sunxi-with-spl-pinephone.bin" of="$DEVICE_NODE" bs=8k seek=1
fi
sync sync
# Flashing rootFS # Flashing rootFS
printf '%s\n' "Flashing rootFS..." echo -e "\e[1mFlashing rootFS...\e[0m"
unzip "${ROOTFS_JOB}.zip"
TEMP=`ls $ROOTFS_DIR/*/*.tar.bz2`
echo "$TEMP"
mkdir "$MOUNT_DATA" mkdir "$MOUNT_DATA"
if [ "$CUSTOM" ]; then sudo mount "${DEVICE_NODE}2" "$MOUNT_DATA" # Mount data partition
TEMP="$CUSTOM/rootfs.tar.bz2" sudo tar -xpf "$TEMP" -C "$MOUNT_DATA"
else
unzip "$ROOTFS_JOB.zip"
TEMP="$(echo $ROOTFS_DIR/*/*.tar.bz2)"
echo "$TEMP"
fi
as_root mount "$DATAPART" "$MOUNT_DATA" # Mount data partition
as_root tar -xpf "$TEMP" -C "$MOUNT_DATA"
sync sync
# Copying kernel to boot partition # Copying kernel to boot partition
printf '%s\n' "Copying kernel to boot partition..." echo -e "\e[1mCopying kernel to boot partition...\e[0m"
mkdir "$MOUNT_BOOT" mkdir "$MOUNT_BOOT"
as_root mount "$BOOTPART" "$MOUNT_BOOT" # Mount boot partition sudo mount "${DEVICE_NODE}1" "$MOUNT_BOOT" # Mount boot partition
printf '%s\n' "Boot partition mount: $MOUNT_BOOT" sudo cp $MOUNT_DATA/boot/* $MOUNT_BOOT
as_root chmod a+rx "$MOUNT_DATA/boot" sudo cp "./u-boot-bootloader/$ROOTFS_DIR/boot.scr" "$MOUNT_BOOT/boot.scr"
as_root cp -r "$MOUNT_DATA/boot"/* "$MOUNT_BOOT"
echo "$MOUNT_BOOT"
if [ "$CUSTOM" ]; then
as_root cp "$CUSTOM/boot.scr" "$MOUNT_BOOT/boot.scr"
else
as_root cp "./u-boot-bootloader/$UBOOT_DEV_DIR/boot.scr" "$MOUNT_BOOT/boot.scr"
fi
sync sync
# Clean up files # Clean up files
printf '%s\n' "Cleaning up!" echo -e "\e[1mCleaning up!\e[0m"
for PARTITION in "$DEVICE_NODE"*; do for PARTITION in $(ls ${DEVICE_NODE}*)
do
echo "Unmounting $PARTITION" echo "Unmounting $PARTITION"
as_root umount "$PARTITION" sudo umount $PARTITION
done done
rm "${UBOOT_JOB}.zip"
as_root losetup -D rm -r "$UBOOT_DIR"
rm "${ROOTFS_JOB}.zip"
if [ -z "$CUSTOM" ]; then rm -r "$ROOTFS_DIR"
rm -r "$UBOOT_JOB.zip" "$UBOOT2_JOB" "$UBOOT_DIR" "$ROOTFS_JOB.zip" "$ROOTFS_DIR" rm -rf "$MOUNT_DATA"
fi rm -rf "$MOUNT_BOOT"
as_root rm -rf "$MOUNT_DATA" "$MOUNT_BOOT"
# Done :) # Done :)
printf '%s\n' "Flashing $DEVICE_NODE OK! echo -e "\e[1mFlashing $DEVICE_NODE OK!\e[0m"
You may now remove the SD card and insert it in your Pine64 device!" echo "You may now remove the SD card and insert it in your Pine64 device!"