Last active

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Switching network configurations on a TP-Link TL-MR3020 with OpenWrt (12.09 Attitude Adjustment) using the sliding switch. Based on the sample scripts at: https://forum.openwrt.org/viewtopic.php?pid=172111#p172111 and https://forum.openwrt.org/viewtopic.php?pid=172110#p172110

View 00-button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
# based on
# https://dev.openwrt.org/browser/trunk/target/linux/atheros/base-files/etc/hotplug.d/button/00-button
# https://forum.openwrt.org/viewtopic.php?pid=172110#p172110
 
. /lib/functions.sh
 
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 
do_button () {
local button
local action
local handler
local min
local max
 
config_get button $1 button
config_get action $1 action
config_get handler $1 handler
config_get min $1 min
config_get max $1 max
 
if [ "$button" = "3g" -o "$button" = "wisp" -o "$button" = "ap" ] ; then
if [ "$ACTION" = "released" ] ; then
if [ "$BUTTON" = "BTN_1" ] ; then
export BUTTON=3g
export ACTION=pressed
elif [ "$BUTTON" = "BTN_0" ] ; then
export BUTTON=wisp
export ACTION=pressed
fi
elif [ "$BUTTON" = "BTN_0" -o "$BUTTON" = "BTN_1" ] ; then
if BTN_0_pressed && BTN_1_pressed ; then
export BUTTON=ap
fi
fi
fi
 
[ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n "$handler" ] && {
[ -z "$min" -o -z "$max" ] && eval $handler
[ -n "$min" -a -n "$max" ] && {
[ $min -le $SEEN -a $max -ge $SEEN ] && eval $handler
}
}
}
 
config_load system
config_foreach do_button button
View 00-button
1 2
#!/bin/sh
grep -qe "sw1.*in hi" /sys/kernel/debug/gpio
View 00-button
1 2
#!/bin/sh
grep -qe "sw2.*in hi" /sys/kernel/debug/gpio
View 00-button
1 2 3 4 5 6
#!/bin/sh /etc/rc.common
 
START=15
boot() {
/usr/local/sbin/set_network_config
}
View 00-button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#!/bin/sh
 
# based on https://forum.openwrt.org/viewtopic.php?pid=172111#p172111
 
ME=$(basename $0)
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 
if BTN_1_pressed ; then
if BTN_0_pressed ; then
CONFIG=ap
else
CONFIG=wisp
fi
else
CONFIG=3g
fi
 
SRC="/etc/config/$CONFIG"
DEST=/tmp/network_config
 
if [ ! -d "$SRC" ] ; then
logger -t "$ME" -p "user.warn" "$SRC is not a directory"
exit 1
fi
 
if [ -L "$DEST" ] ; then
CUR=$(cd "$DEST"; pwd -P)
if [ "$CUR" = "$SRC" ] ; then
logger -t "$ME" "Already using $CONFIG config"
exit 2
fi
fi
 
logger -t "$ME" "Using $CONFIG config"
ln -sfn "$SRC" "$DEST"
View 00-button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
chmod a+x BTN_0_pressed BTN_1_pressed set_network_config update_network_config network_config
mkdir -p /usr/local/sbin
mv BTN_0_pressed BTN_1_pressed set_network_config update_network_config /usr/local/sbin
mkdir -p /etc/hotplug.d/button
mv 00-button /etc/hotplug.d/button
mv network_config /etc/init.d
 
opkg update
opkg install flock
 
cd /etc/config
mkdir 3g
mv network wireless 3g
cp -r 3g wisp
cp -r 3g ap
ln -s network /tmp/network_config/network
ln -s wireless /tmp/network_config/wireless
# configure files in 3g / wisp / ap directories for each corresponding mode
# to use uci / luci to configure, create the /tmp/network_config symbolic link to point to the correct directory, e.g.
# ln -s /tmp/network_config /etc/config/3g
# or configure the settings before moving the config files
 
/etc/init.d/network_config enable
 
uci add system button
uci set system.@button[-1].button=3g
uci set system.@button[-1].action=pressed
uci set system.@button[-1].handler=update_network_config
uci add system button
uci set system.@button[-1].button=wisp
uci set system.@button[-1].action=pressed
uci set system.@button[-1].handler=update_network_config
uci add system button
uci set system.@button[-1].button=ap
uci set system.@button[-1].action=pressed
uci set system.@button[-1].handler=update_network_config
uci commit system
 
reboot
View 00-button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/bin/sh
 
ME=$(basename $0)
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
 
(
flock -n 9 || exit 1
 
(
sleep 1
 
if set_network_config ; then
. /etc/diag.sh
get_status_led
status_led_set_timer 200 200
 
logger -t "$ME" "Reloading network"
/etc/init.d/network restart
 
status_led_on
fi
) 9>&-
 
) 9>/tmp/update_network_config.lock

Hi Jeffery,

Thanks for your work - it works like a charm!

I don't have any experience with shell scripts, so it took me a while to figure exactly how to install your scripts.

If I understand 'ln' and what you're trying to do correctly, I belive you mixed up the paths in line 16-17 of the setup script. So:

ln -s network /tmp/network_config/network --> ln -s /tmp/network_config/network network
ln -s wireless /tmp/network_config/wireless --> ln -s /tmp/network_config/wireless wireless

At least that works for me, whereas the original produced an error.

Now, I don't know which version of OpenWrt you wrote this for, but the workaround to direct LuCI configuration changes to one of the three stored configurations, doesn't seem to work in Barrier Breaker 14.07 - LuCI simply overwrites the symbolic links with the updated configuration files.

With that in mind, I'm thinking of modifying the scripts, so that the configuration is actually copied when the switch change, rather than updating the symbolic links. The goal would be be able to reconfigure using LuCI, yet being able to preserve the changes in the current config. A couple of questions spring to mind:

1) Is there a particular reason why you chose symbolic links, rather than copying the actual files? Do you see a problem with overwriting current config file as you change configuration, instead of updating the symbolic links?

2) In order to capture configuration changes, I would need to trigger a copy of the config files (to the folder of the current config), when LuCI updates the files, but I'm not aware of how to do that. Any ideas?

Hope to hear from you and thanks again, for all the groundwork! :)

After putting my questions into writing, I had a few ideas on my own and have made a fork of your gist.

I have solved by adding a 'commit' script, that is triggered using the WPS button. It copies the current network config, to the subfolder corresponding to the sliding switch's current position.

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.