Packages
nerves_system_br
1.0.0-rc.3
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
Current section
Files
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