mirror of
https://github.com/YunoHost/install_script.git
synced 2024-09-03 20:06:25 +02:00
add first version of 01_create_sdcard.sh
helper to rebuild sdcard in reproducible steps add .gitignore for cache step folder
This commit is contained in:
parent
c65b9daf1f
commit
95259a44f0
2 changed files with 163 additions and 0 deletions
1
build_arm_image/.gitignore
vendored
Normal file
1
build_arm_image/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
_build_arm_steps
|
162
build_arm_image/01_create_sdcard.sh
Executable file
162
build_arm_image/01_create_sdcard.sh
Executable file
|
@ -0,0 +1,162 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Create the sdcard on your PC with the latest debian.
|
||||
#
|
||||
# Usage:
|
||||
# ./01_create_sdcard.sh downloaded_debian_image.zip /dev/sdcard_device
|
||||
#
|
||||
# Licence: GPLv3
|
||||
# Author: sylvain303@github
|
||||
|
||||
# informations about Raspbian image:
|
||||
# Raspbian Jessie Lite Version: November 2015 Release date: 2015-11-21
|
||||
# version: SHA-1 of the .zip: 97888fcd9bfbbae2a359b0f1d199850852bf0104
|
||||
# Kernel version: 4.1
|
||||
# http://downloads.raspberrypi.org/raspbian/release_notes.txt
|
||||
|
||||
DOWNLOAD_URL=https://www.raspberrypi.org/downloads/raspbian/
|
||||
SHA_DEBIAN_IMG_ZIP=97888fcd9bfbbae2a359b0f1d199850852bf0104
|
||||
|
||||
die() {
|
||||
echo "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# helper, test if a shell program exists in PATH
|
||||
test_tool() {
|
||||
local cmd=$1
|
||||
if type $cmd > /dev/null
|
||||
then
|
||||
# OK
|
||||
return 0
|
||||
else
|
||||
die "tool missing: $cmd"
|
||||
fi
|
||||
}
|
||||
|
||||
# skip if the file exists.
|
||||
# usage: skip_if _build_arm_steps/somefile && return 2
|
||||
skip_if() {
|
||||
if [[ -e "$1" ]]
|
||||
then
|
||||
echo "cached"
|
||||
return 0
|
||||
fi
|
||||
# echo -n "continue for $1"
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
sha_verify_zip() {
|
||||
local zip=$DEBIAN_IMG_ZIP
|
||||
local out=_build_arm_steps/sha_verify_zip
|
||||
skip_if $out && return 2
|
||||
sha1sum $zip > $out
|
||||
# read only sha check hash
|
||||
local sha="$(sed -e 's/\(^[a-f0-9]\+\).*/\1/' $out)"
|
||||
if [[ "$sha" != "$SHA_DEBIAN_IMG_ZIP" ]]
|
||||
then
|
||||
echo "NOK: '$sha' != '$SHA_DEBIAN_IMG_ZIP'"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# unzip raspbian image in the cache folder
|
||||
unzip_img() {
|
||||
if ! skip_if _build_arm_steps/*.img
|
||||
then
|
||||
unzip -o $DEBIAN_IMG_ZIP -d _build_arm_steps
|
||||
fi
|
||||
# get extrated image filename from zip file
|
||||
DEBIAN_IMG=$(ls _build_arm_steps/ | grep \\.img$)
|
||||
}
|
||||
|
||||
# helper try to guess top device name
|
||||
# /dev/sdp2 => /dev/sdp
|
||||
# /dev/mmcblk0p1 => /dev/mmcblk0
|
||||
# just some regexp no smart thing
|
||||
get_top_device() {
|
||||
local device="$1"
|
||||
local regexp1='^/dev/sd[a-z]'
|
||||
local regexp2='^/dev/mmcblk[0-9]'
|
||||
|
||||
if [[ "$device" =~ $regexp1 ]]
|
||||
then
|
||||
#echo sd
|
||||
device="${device/[0-9]/}"
|
||||
elif [[ "$device" =~ $regexp2 ]]
|
||||
then
|
||||
#echo mmcblk
|
||||
device="${device/p[0-9]/}"
|
||||
fi
|
||||
|
||||
echo "$device"
|
||||
}
|
||||
|
||||
umount_all_partition() {
|
||||
local p
|
||||
# search and replace all occurence of / by .
|
||||
local pattern=${SDCARD////.}
|
||||
pattern=${pattern/p[0-9]/}
|
||||
for p in $(df | awk "/^$pattern/ { print \$1 }")
|
||||
do
|
||||
echo sudo umount $p
|
||||
done
|
||||
echo "done device for sdcard=${pattern//.//}"
|
||||
}
|
||||
|
||||
dd_to_sdcard() {
|
||||
# ensure
|
||||
echo dd bs=16M if=_build_arm_steps/$DEBIAN_IMG of=$SDCARD
|
||||
}
|
||||
|
||||
test_all_tools() {
|
||||
for t in $*
|
||||
do
|
||||
test_tool $t
|
||||
done
|
||||
}
|
||||
|
||||
# functions call in that order, edit remove a long running step if already done or if
|
||||
# you want to skip it, step states are saved in folder _build_arm_steps and skipped automatically.
|
||||
STEPS="
|
||||
sha_verify_zip
|
||||
unzip_img
|
||||
umount_all_partition
|
||||
dd_to_sdcard"
|
||||
|
||||
# main wrapper, so the script can be sourced for debuging purpose or unittesting
|
||||
main() {
|
||||
# positional argument must be script argument.
|
||||
# init
|
||||
if [[ -z "$1" ]]
|
||||
then
|
||||
echo "argument 1 error: expecting raspbian image file.zip"
|
||||
echo "can be downloaded here: $DOWNLOAD_URL"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# reading script argument
|
||||
DEBIAN_IMG_ZIP=$1
|
||||
[[ -f "$DEBIAN_IMG_ZIP" ]] || die "error raspbian image not found: '$DEBIAN_IMG_ZIP'"
|
||||
SDCARD=$(get_top_device "$2")
|
||||
[[ -z "$SDCARD" ]] && die "argument 2 error: expecting sdcard_device"
|
||||
|
||||
test_all_tools dd sync sudo
|
||||
mkdir -p _build_arm_steps
|
||||
|
||||
# actions loop
|
||||
for s in $STEPS
|
||||
do
|
||||
echo -n "$s: "
|
||||
eval $s
|
||||
done
|
||||
}
|
||||
|
||||
# sourcing code detection, if code is sourced for debug purpose, main is not executed.
|
||||
[[ $0 != "$BASH_SOURCE" ]] && sourced=1 || sourced=0
|
||||
if [[ $sourced -eq 0 ]]
|
||||
then
|
||||
# pass positional argument as is
|
||||
main "$@"
|
||||
fi
|
Loading…
Add table
Reference in a new issue