diff options
Diffstat (limited to 'recipes-core/multitech/config/config.init')
-rw-r--r-- | recipes-core/multitech/config/config.init | 220 |
1 files changed, 163 insertions, 57 deletions
diff --git a/recipes-core/multitech/config/config.init b/recipes-core/multitech/config/config.init index f60fbfc..2a1e0b5 100644 --- a/recipes-core/multitech/config/config.init +++ b/recipes-core/multitech/config/config.init @@ -1,12 +1,27 @@ #!/bin/sh -CONFIG_MTDC=/dev/mtd6 -CONFIG_MTDB=/dev/mtdblock6 CONFIG_DIR=/var/config RUN_CONF_DIR=/run/config -OEM_MTDC=/dev/mtd7 -OEM_MTDB=/dev/mtdblock7 +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 \ @@ -19,11 +34,7 @@ ppp/peers \ # Files used by bluetooth or wifi. BTWIFIFILES="\ bluetooth/ \ -default/bluetooth \ -default/bt-pan \ -default/dnsmasq \ -default/hostapd \ -default/ifplugd \ +default/ \ dnsmasq.d/ \ hosts \ hostname \ @@ -31,10 +42,6 @@ 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" @@ -87,6 +94,93 @@ mount_oem() { 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 == volatiles ]] ; then + continue + fi + if [[ $f == \* ]] ; then + break + fi + + if ! [[ -h ${to}/${f} ]] ; then + ln -sf "${from}/${f}" "${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. +# +# Any symlinks found are not copied, but instead +# updated to point to the "to" directory. +# +function copydir { + from="$1" + to="$2" + newdir=$(basename "$from") + links=() + if rmdir $from >/dev/null 2>&1 ; then + ln -sf "$to/$newdir" "$from" + else + mkdir "$to/$newdir" >/dev/null 2>&1 || true + if [[ -L $from ]] ; then + # If we have a symlink to a directory, + # skip copying any files. + return 0 + fi + savedir=$(pwd) + cd "$from" + for f in * ; do + if [[ $f == \* ]] ; then + break + fi + if [[ $f == volatiles ]] ; then + continue + fi + if [[ -L ${f} ]] ; then + links+=(${f}) + continue + fi + if ! [[ -f "$to/$f" ]] ; then + cp -a "${f}" "$to/${newdir}/${f}" + fi + done + for l in ${links[*]} ; do + mylink=$(readlink "$l") + if [[ $(dirname ${mylink}) == ${from} ]] ; then + base=$(basename "${mylink}") + if [[ $base != $l ]] ; then + echo "Writing symlink $to/$base $l" + ln -sf $to/${newdir}/$base $l + fi + fi + done + cd "$savedir" + fi +} + case $1 in start) # mount config if not already mounted @@ -109,28 +203,30 @@ case $1 in cd ${CONFIG_DIR} if [ -f force_defaults ]; then echo "Extracting default config files" - tar -xvf /etc/defaults.tar.gz + tar -xf /etc/defaults.tar.gz if [[ -f ${WIFITAR} ]] ; then echo "Extract original wifi related files" - tar -xvf ${WIFITAR} + tar -xf ${WIFITAR} fi rm -f force_defaults fi # Extract any missing files - TARFILES=`tar -tf /etc/defaults.tar.gz` + TARFILES=$(tar -tf /etc/defaults.tar.gz) for file in $TARFILES; do if [ ! -e $file ]; then - tar -xvf /etc/defaults.tar.gz $file + tar -xf /etc/defaults.tar.gz $file fi done # Create links in /etc for file in $FILES; do - if [ ! -L /etc/$file ]; then - echo "Creating link to ${CONFIG_DIR}/$file" + 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 @@ -144,52 +240,62 @@ case $1 in fi done if ((dobackup==1)) ; then + echo "Creating backup of Config files" 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 - # If last character is /, make the CONFIG directory. - if [[ ${file: -1} == / ]] ; then - file=${file%?} - echo directory $file operations - if ! [[ -d ${CONFIG_DIR}/$file ]] ; then - rm -f ${CONFIG_DIR}/$file 2>/dev/null || true - mkdir ${CONFIG_DIR}/$file - fi - fi - if [[ ! -L /etc/$file ]]; then - echo "Creating link to ${CONFIG_DIR}/$file" - dir=$(dirname $file) - if [[ $dir != '.' ]] ; then - mkdir -p "$dir" + 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 - 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 + fi + rm -rf /etc/$file + ln -sf ${CONFIG_DIR}/$file /etc/$file + else + if ! [[ -L "/etc/${file}" ]] ; then + rm -f "/etc/${file}/*" + linkdir "${CONFIG_DIR}/${file}" "/etc/${file}" fi + fi done - - ;; *) |