Packages

nerves_system_br

1.12.0-rc.0
1.34.0 1.33.9 1.33.8 1.33.7 1.33.6 1.33.5 1.33.4 1.33.3 1.33.2 1.33.1 1.33.0 1.32.5 1.32.4 1.32.3 1.32.2 1.32.1 1.32.0 1.31.7 1.31.6 1.31.5 1.31.4 1.31.3 1.31.2 1.31.1 1.31.0 1.30.1 1.30.0 1.29.3 1.29.2 1.29.1 1.29.0 1.28.3 1.28.2 1.28.1 1.28.0 1.27.3 1.27.2 1.27.1 1.27.0 1.26.1 1.26.0 1.25.3 1.25.2 1.25.1 1.25.0 1.24.1 1.24.0 1.23.3 1.23.2 1.23.1 1.23.0 1.22.8 1.22.7 1.22.6 1.22.5 1.22.4 1.22.3 1.22.2 1.22.1 1.22.0 1.21.6 1.21.5 1.21.4 1.21.3 1.21.2 1.21.1 1.21.0 1.20.6 1.20.5 1.20.4 1.20.3 1.20.2 1.20.1 1.20.0 1.19.1 1.19.0 1.18.6 1.18.5 1.18.4 1.18.3 1.18.2 1.18.1 1.18.0 1.17.4 1.17.3 1.17.2 1.17.1 1.17.0 1.16.5 1.16.4 1.16.3 1.16.2 1.16.1 1.16.0 1.15.2 1.15.1 1.15.0 1.14.5 1.14.4 1.14.3 1.14.2 1.14.1 1.14.0 1.13.8 1.13.7 1.13.6 1.13.5 1.13.4 1.13.3 1.13.2 1.13.1 1.13.0 1.12.4 1.12.3 1.12.2 1.12.1 1.12.0 1.12.0-rc.0 1.11.4 1.11.3 1.11.2 1.11.1 1.11.0 1.10.3 1.10.2 1.10.1 1.10.0 1.9.5 1.9.4 1.9.3 1.9.2 1.9.1 1.9.0 1.8.6 1.8.5 1.8.4 1.8.3 1.8.2 1.8.1 1.8.0 1.7.3 1.7.2 1.7.1 1.7.0 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.6 1.5.5 1.5.4 1.5.3 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.2 1.2.1 1.2.0 1.1.0 1.0.1 1.0.0 1.0.0-rc.4 1.0.0-rc.3 1.0.0-rc.2 1.0.0-rc.1 1.0.0-rc.0 0.17.0 0.16.4 0.16.3 0.16.2 0.16.1-2017-11 0.16.0-2017-11 0.15.1 0.15.0 0.14.1 0.14.0 0.13.9 0.13.8 0.13.7 0.13.6 0.13.5 0.13.4 retired 0.13.3 0.13.2 0.13.0 0.12.1 0.12.0 0.11.1 0.11.0 0.10.1 0.10.0 0.9.4 0.9.3 0.9.2 0.9.1 0.9.0 0.8.2 0.8.1 0.8.0 0.7.0 0.6.1 0.6.0 0.5.2 0.5.1 0.5.0 0.4.2 0.4.1

Nerves System BR - Buildroot based build platform for Nerves Systems

Current section

Files

Jump to
nerves_system_br scripts merge-squashfs
Raw

scripts/merge-squashfs

#!/usr/bin/env bash
# Merge an overlay directory into a squashfs
#
# Usage: merge-squashfs input.squashfs output.squashfs overlay-dir squashfs-priorities
#
set -e
LC_ALL=C
LANG=C
export LC_ALL LANG
# Account for Mac differences
if [[ "$(uname)" = "Darwin" ]]; then
# Use gstat on the Mac, but make sure that it exists first.
STAT=$(command -v gstat || echo "/usr/local/bin/gstat")
if [[ ! -e "$STAT" ]]; then
echo "merge-squashfs: ERROR: Please install gstat first"
echo
echo "For example:"
echo " brew install coreutils"
exit 1
fi
else
STAT=stat
fi
# This implementation might be slow
perm_to_num() {
string=$1
let perms=0
[[ "${string}" = ?r???????? ]] && perms=$(( perms + 0400 ))
[[ "${string}" = ??w??????? ]] && perms=$(( perms + 0200 ))
[[ "${string}" = ???x?????? ]] && perms=$(( perms + 0100 ))
[[ "${string}" = ???s?????? ]] && perms=$(( perms + 04100 ))
[[ "${string}" = ???S?????? ]] && perms=$(( perms + 04000 ))
[[ "${string}" = ????r????? ]] && perms=$(( perms + 040 ))
[[ "${string}" = ?????w???? ]] && perms=$(( perms + 020 ))
[[ "${string}" = ??????x??? ]] && perms=$(( perms + 010 ))
[[ "${string}" = ??????s??? ]] && perms=$(( perms + 02010 ))
[[ "${string}" = ??????S??? ]] && perms=$(( perms + 02000 ))
[[ "${string}" = ???????r?? ]] && perms=$(( perms + 04 ))
[[ "${string}" = ????????w? ]] && perms=$(( perms + 02 ))
[[ "${string}" = ?????????x ]] && perms=$(( perms + 01 ))
[[ "${string}" = ?????????t ]] && perms=$(( perms + 01001 ))
[[ "${string}" = ?????????T ]] && perms=$(( perms + 01000 ))
printf '%o' $perms
}
owner_to_uid_gid() {
echo "$1" | sed -e "s/\// /g"
}
get_path() {
# trim the squashfs-root and escape any spaces
echo "$*" | sed -e 's/squashfs-root//' -e 's/ /\\ /g'
}
device_file() {
perm=$1
owner=$2
# Depending on the major and minor numbers, you either get
# major,minor or major, minor. Remove the comma and account
# for the optional space.
if [[ $3 =~ ,.+ ]]; then
major_minor=$(echo "$3" | sed -e 's/,/ /')
filename=$6
else
major_minor="$(echo "$3" | sed -e 's/,/ /') $4"
filename=$7
fi
echo "$(get_path "$filename") ${perm:0:1} $(perm_to_num "$perm") $(owner_to_uid_gid "$owner") $major_minor"
}
symlink_file() {
# symlinks are the handled the same as files currently.
echo "$(get_path "$6") m $(perm_to_num "$1") $(owner_to_uid_gid "$2")"
}
directory_file() {
pathname=$(get_path "$6")
# mksquashfs doesn't support setting permissions and ownership
# on the root directory
if [[ ! -z $pathname ]]; then
echo "$pathname m $(perm_to_num "$1") $(owner_to_uid_gid "$2")"
fi
}
regular_file() {
echo "$(get_path "$6") m $(perm_to_num "$1") $(owner_to_uid_gid "$2")"
}
unsquash_to_pseudofile() {
input=$1
while read -r perms owner rest; do
case $perms in
c*)
device_file "$perms" "$owner" $rest
;;
b*)
device_file "$perms" "$owner" $rest
;;
l*)
symlink_file "$perms" "$owner" $rest
;;
d*)
directory_file "$perms" "$owner" $rest
;;
-*)
regular_file "$perms" "$owner" $rest
;;
*)
# Ignore
;;
esac
done < <(unsquashfs -n -ll "$input")
}
find_to_pseudofile() {
inputdir=$1
while read -r mode path; do
path=$(echo "$path" | sed -e "s^$inputdir^^" -e "s/ /\\\\ /g")
if [[ ! -z $path ]]; then
echo "$path m $mode 0 0"
fi
done < <(find "$inputdir" -exec $STAT -c "%a %n" "{}" ";")
}
# "readlink -f" implementation for BSD
# This code was extracted from the Elixir shell scripts
readlink_f () {
cd "$(dirname "$1")" > /dev/null
filename="$(basename "$1")"
if [[ -h "$filename" ]]; then
readlink_f "$(readlink "$filename")"
else
echo "$(pwd -P)/$filename"
fi
}
if [[ $# -lt 4 ]]; then
echo "Usage: merge-squashfs input.squashfs output.squashfs overlay-dir squashfs_priorities"
exit 1
fi
input_squashfs=$(readlink_f "$1")
output_squashfs=$(readlink_f "$2")
overlay_dir=$(readlink_f "$3")
squashfs_priorities=$(readlink_f "$4")
if [[ ! -f $input_squashfs ]]; then
echo "Can't open $input_squashfs"
exit 1
fi
if [[ ! -d $overlay_dir ]]; then
echo "Can't find $overlay_dir"
exit 1
fi
workdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'merge-squashfs-tmp')
pushd "$workdir" >/dev/null
unsquash_to_pseudofile "$input_squashfs" >pseudofile.in
find_to_pseudofile "$overlay_dir" >>pseudofile.in
# remove repeated entries to avoid warnings from mksquashfs
awk '!x[$1]++' pseudofile.in > pseudofile
unsquashfs "$input_squashfs" >/dev/null 2>/dev/null
cp -Rf "$overlay_dir/." "$workdir/squashfs-root"
mksquashfs squashfs-root "$output_squashfs" -pf pseudofile -sort "$squashfs_priorities" -noappend -no-recovery -no-progress $NERVES_MKSQUASHFS_FLAGS
# cleanup
popd >/dev/null
rm -fr "$workdir"