diff options
Diffstat (limited to 'recipes-core/multitech/overlayfs-init-jffs2/config')
-rw-r--r-- | recipes-core/multitech/overlayfs-init-jffs2/config | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/recipes-core/multitech/overlayfs-init-jffs2/config b/recipes-core/multitech/overlayfs-init-jffs2/config new file mode 100644 index 0000000..785f99f --- /dev/null +++ b/recipes-core/multitech/overlayfs-init-jffs2/config @@ -0,0 +1,285 @@ +#!/bin/sh + +CONFIG_DIR=/var/config +RUN_CONF_DIR=/run/config + +CONFIG_PARTITION="Config" +OEM_PARTITION="OEM Config" +TABLE=$'\n'"$(cat /proc/mtd)" +if [[ $TABLE =~ [[:space:]]mtd([[:digit:]]+)[^\"]*\"$CONFIG_PARTITION\" ]] ; then + CONFIG_MTDC=/dev/mtd${BASH_REMATCH[1]} + CONFIG_MTDB=/dev/mtdblock${BASH_REMATCH[1]} +else + echo "Cannot find a ${CONFIG_PARTITION} partition" + exit 0 +fi +if [[ $TABLE =~ [[:space:]]mtd([[:digit:]]+)[^\"]*\"$OEM_PARTITION\" ]] ; then + OEM_MTDC=/dev/mtd${BASH_REMATCH[1]} + OEM_MTDB=/dev/mtdblock${BASH_REMATCH[1]} +else + echo "Cannot find a ${OEM_PARTITION} partition" + exit 0 +fi + +CONFIG_DIR=/var/config +OEM_DIR=/var/oem + +FILES="network/interfaces \ +ppp/options \ +ppp/pap-secrets \ +ppp/chap-secrets \ +ppp/peers \ +" + +# Files used by bluetooth or wifi. +BTWIFIFILES="\ +bluetooth/ \ +default/ \ +dnsmasq.d/ \ +hosts \ +hostname \ +hostapd.conf \ +modprobe.d/ \ +wpa_supplicant.conf \ +" + +# mts-io driver may not be loaded +if [[ -L /etc/default/rs9113 ]] || [[ -f /etc/default/rs9113 ]] || [[ -d /opt/rs9113 ]] ; then + BTWIFIFILES+="default/rs9113 " +fi + +# File hidden so it is not removed on hardware reset +WIFITAR=".defaults2.tar.gz" + +mount_config() { + echo "Mounting ${CONFIG_DIR}" + mkdir -p ${CONFIG_DIR} + mount ${CONFIG_DIR} + + # Prepare flash for JFFS2 or EXT4 if mount fails + if [ $? -ne 0 ]; then + echo "Creating ${CONFIG_DIR}" + fs=$(mount -fvn ${CONFIG_DIR}) + if [[ $fs =~ [[:space:]]*(/dev/(...)[^[:space:]]*) ]] ; then + if [[ ${BASH_REMATCH[2]} == mmc ]] ; then + # One more check for empty + mdev="${BASH_REMATCH[1]}" + if [[ $(dd if=$mdev count=4 2>/dev/null | tr -d '\0' | wc -c) == 0 ]] ; then + mkfs.ext4 -O 64bit ${mdev} + fi + else + flash_erase -j ${CONFIG_MTDC} 0 0 + fi + fi + mount ${CONFIG_DIR} + fi +} + +mount_oem() { + echo "Mounting ${OEM_DIR}" + mkdir -p ${OEM_DIR} + mount ${OEM_DIR} + + # Prepare flash for JFFS2 or EXT4 if mount fails + # Prepare flash for JFFS2 or EXT4 if mount fails + if [ $? -ne 0 ]; then + echo "Creating ${OEM_DIR}" + fs=$(mount -fvn ${OEM_DIR}) + if [[ $fs =~ [[:space:]]*(/dev/(...)[^[:space:]]*) ]] ; then + if [[ ${BASH_REMATCH[2]} == mmc ]] ; then + mdev="${BASH_REMATCH[1]}" + if [[ $(dd if=$mdev count=4 2>/dev/null | tr -d '\0' | wc -c) == 0 ]] ; then + mkfs.ext4 -O 64bit ${mdev} + fi + else + flash_erase -j ${OEM_MTDC} 0 0 + fi + fi + mount ${OEM_DIR} + fi +} + +# Create symlinks in directory $2 +# that point to non-directory items +# in directory $1 +# No recursion. +# +# /etc/default/rcS must be in the +# root file system +# +function linkdir { + from="$1" + to="$2" + newdir=$(basename "$from") + savedir=$(pwd) + cd "${from}" + for f in * ; do + if [[ ${to} == /etc/default ]] && [[ $f == rcS ]] ; then + continue + fi + if [[ $f == \* ]] ; then + break + fi + if ! [[ -d "${to}/${f}" ]] ; then + if ! [[ -f ${from}/${f} ]] ; then + ln -sf "${from}/${f}" "${to}/${f}" + fi + else + echo Skipping directory "$to/$f" + fi + done + cd "$savedir" +} + +# parameter 1 Input directory +# parameter 2 Parent of output directory +# +# The basename (final component) of parameter 1 +# is created as a directory in the directory +# of parameter 2. +function copydir { + from="$1" + to="$2" + newdir=$(basename "$from") + if rmdir $from >/dev/null 2>&1 ; then + ln -sf "$to/$newdir" "$from" + else + mkdir "$to/$newdir" >/dev/null 2>&1 || true + savedir=$(pwd) + cd "$from" + for f in * ; do + if [[ $f == \* ]] ; then + break + fi + if ! [[ -f "$to/$f" ]] ; then + cannon=$(readlink "$to/${newdir}/${f}" 2>/dev/null) + # Don't overwrite files in destination. + if ! [[ -f ${cannon} ]] ; then + cp -a "${f}" "$to/${newdir}/${f}" + fi + fi + done + cd "$savedir" + fi +} + +case $1 in + start) + # mount config if not already mounted + if ! grep -q " ${CONFIG_DIR} " /proc/mounts; then + mount_config + else + echo "$CONFIG_DIR already mounted" + fi + + # mount oem if specified in /etc/fstab and it isn't already mounted + if mount -fvn "${OEM_DIR}" ; then + if ! grep -q " ${OEM_DIR} " /proc/mounts; then + mount_oem + else + echo "$OEM_DIR already mounted" + fi + fi + + # Default all config files if requested + cd ${CONFIG_DIR} + if [ -f force_defaults ]; then + echo "Extracting default config files" + tar -xf /etc/defaults.tar.gz + if [[ -f ${WIFITAR} ]] ; then + echo "Extract original wifi related files" + tar -xvf ${WIFITAR} + fi + rm -f force_defaults + fi + + # Extract any missing files + TARFILES=$(tar -tf /etc/defaults.tar.gz) + for file in $TARFILES; do + if [ ! -e $file ]; then + tar -xvf /etc/defaults.tar.gz $file + fi + done + + # Create links in /etc + for file in $FILES; do + if ! [[ -L /etc/$file ]] && ! [[ -d /etc/$file ]] ; then + rm -rf /etc/$file + ln -sf ${CONFIG_DIR}/$file /etc/$file + elif [[ -d /etc/$file ]] ; then + # JAK create links in directory. + linkdir "${CONFIG_DIR}/${file}" "/etc/${file}" + fi + done + + # Move bluetooth wifi stuff to config directory. + # We don't have factory defaults. + ((dobackup=1)) + for file in ${BTWIFIFILES}; do + if [[ -L /etc/$file ]]; then + ((dobackup=0)) + break + fi + done + if ((dobackup==1)) ; then + tar -C /etc -czf ${CONFIG_DIR}/${WIFITAR} ${BTWIFIFILES} + fi + + # For jffs2, you cannot remove a populated directory in an overlay. + # We must copy individual files and create symlinks instead. + for file in ${BTWIFIFILES}; do + isdir=0 + # If last character is /, make the CONFIG directory. + if [[ ${file: -1} == / ]] ; then + isdir=1 + file=${file%?} + if ! [[ -d ${CONFIG_DIR}/$file ]] ; then + rm -f ${CONFIG_DIR}/$file 2>/dev/null || true + mkdir ${CONFIG_DIR}/$file + fi + if [[ -d ${file} ]] ; then + copydir "/etc/${file}" "${CONFIG_DIR}" + fi + fi + + if ((isdir == 0)); then + dir=$(dirname $file) + if [[ $dir != '.' ]] ; then + mkdir -p "$dir" + fi + rm -rf old + mkdir old + if ! [[ -f $file ]] ; then + # Need to preserve old files which is difficult with busybox! + if [[ -d $file ]] || [[ -f $file ]] ; then + cp --parents -a $file old || true + fi + ( + cd /etc + if [[ -d $file ]] || [[ -f $file ]] ; then + cp --parents -a $file ${CONFIG_DIR} || true + fi + ) + ( + cd old + if [[ -d $file ]] || [[ -f $file ]] ; then + cp --parents -a $file .. || true + fi + ) + rm -rf old + fi + rm -rf /etc/$file + ln -sf ${CONFIG_DIR}/$file /etc/$file + else + rm -f "/etc/${file}/*" + linkdir "${CONFIG_DIR}/${file}" "/etc/${file}" + fi + done + ;; + + *) + echo "Usage: $0 {start}" + exit 2 + ;; + +esac |