Packages

nerves_system_br

1.3.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

#!/bin/bash
# Merge an overlay directory into a squashfs
#
# Usage: merge-squashfs input.squashfs output.squashfs overlay-dir
#
set -e
LC_ALL=C
# 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//' | sed -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 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
;;
*)
esac
done < <(unsquashfs -n -ll $input)
}
find_to_pseudofile() {
inputdir=$1
while read mode path; do
path=$(echo $path | sed -e "s^$inputdir^^" | sed -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 [[ $# -ne 3 ]]; then
echo "Usage: merge-squashfs input.squashfs output.squashfs overlay-dir"
exit 1
fi
input_squashfs=$(readlink_f "$1")
output_squashfs=$(readlink_f "$2")
overlay_dir=$(readlink_f "$3")
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 -noappend -no-recovery -no-progress
# cleanup
popd >/dev/null
rm -fr $workdir