#!/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 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/bluetooth \ default/bt-pan \ default/dnsmasq \ default/hostapd \ default/ifplugd \ 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 } 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 -xvf /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 ]; then echo "Creating link to ${CONFIG_DIR}/$file" rm -rf /etc/$file ln -sf ${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 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" 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 done ;; *) echo "Usage: $0 {start}" exit 2 ;; esac