Plug-and-Play USB Networking
From Openmoko
(→File/directory structure) |
(→File contents) |
||
Line 58: | Line 58: | ||
[802-3-ethernet] | [802-3-ethernet] | ||
mac-address=00:1f:11:01:6e:12 | mac-address=00:1f:11:01:6e:12 | ||
+ | </pre> | ||
+ | |||
+ | /etc/NetworkManager/dispatcher.d/10myiptables: | ||
+ | <pre> | ||
+ | #!/bin/sh -e | ||
+ | # Script to dispatch NetworkManager events | ||
+ | # | ||
+ | # Runs ifupdown scripts when NetworkManager fiddles with interfaces. | ||
+ | |||
+ | # Bobek's freerunner | ||
+ | export MYUUID1="27afa607-ee36-43f0-b8c3-9d245cdc4bb3" | ||
+ | |||
+ | # Bob's freerunner | ||
+ | export MYUUID2="27afa607-ee36-43f0-b8c3-9d245cdc4bb4" | ||
+ | |||
+ | # The computer's username | ||
+ | export USERNAME="lolza" | ||
+ | |||
+ | if [ -z "$1" ]; then | ||
+ | echo "$0: called with no interface" 1>&2 | ||
+ | exit 1; | ||
+ | fi | ||
+ | |||
+ | # Fake ifupdown environment | ||
+ | export IFACE="$1" | ||
+ | export LOGICAL="$1" | ||
+ | export ADDRFAM="NetworkManager" | ||
+ | export METHOD="NetworkManager" | ||
+ | export VERBOSITY="0" | ||
+ | |||
+ | # Run the right scripts | ||
+ | case "$2" in | ||
+ | up) | ||
+ | export MODE="start" | ||
+ | export PHASE="up" | ||
+ | |||
+ | if [ -f /sys/class/net/$IFACE/address ] ; then | ||
+ | tmpfile=`mktemp -t` | ||
+ | echo $CONNECTION_UUID > $tmpfile | ||
+ | if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then | ||
+ | echo "Bobek's Freerunner connected..." >> $tmpfile | ||
+ | date >> $tmpfile | ||
+ | iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | sysctl -w net.ipv4.ip_forward=1 | ||
+ | sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202 | ||
+ | else | ||
+ | if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then | ||
+ | echo "Bob's Freerunner connected..." >> $tmpfile | ||
+ | date >> $tmpfile | ||
+ | iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | sysctl -w net.ipv4.ip_forward=1 | ||
+ | sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202 | ||
+ | fi | ||
+ | fi | ||
+ | fi | ||
+ | ;; | ||
+ | down) | ||
+ | export MODE="stop" | ||
+ | export PHASE="down" | ||
+ | |||
+ | tmpfile=`mktemp -t` | ||
+ | echo "down called..." >> $tmpfile | ||
+ | tmpfile=`mktemp -t` | ||
+ | echo $CONNECTION_UUID > $tmpfile | ||
+ | if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then | ||
+ | echo "Bobek's Freerunner disconnected..." >> $tmpfile | ||
+ | iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | sysctl -w net.ipv4.ip_forward=0 | ||
+ | else | ||
+ | if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then | ||
+ | echo "Bob's Freerunner disconnected..." >> $tmpfile | ||
+ | iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | sysctl -w net.ipv4.ip_forward=0 | ||
+ | fi | ||
+ | fi | ||
+ | ;; | ||
+ | *) | ||
+ | echo "$0: called with unknown action \`$2'" 1>&2 | ||
+ | exit 1 | ||
+ | ;; | ||
+ | esac | ||
</pre> | </pre> | ||
[[Category:USB]] | [[Category:USB]] |
Revision as of 16:48, 15 October 2009
Contents |
Introduction
I provide here an example setup which are more complicated than your setup probably will be.
Use case
I have 1 laptop and 2 freerunners. Whenever I plug my freerunner, I want my laptop recognize which freerunner was plugged in and act accordingly. Also automagically set up the networking for me.
Prerequisites
You need a linux/unix computer with working NetworkManager setup. I have successfully use this method more than a month now, with Ubuntu 9.04 (jaunty), I will test it also on Ubuntu 8.10 (intrepid), and report back here.
The NetworkManager on jaunty is:
ii network-manager 0.7.1~rc4-0ubuntu1 ii network-manager-gnome 0.7.1~rc4.1-0ubuntu1
File/directory structure
/etc/NetworkManager/system-connections/freerunner_bob (owner: root, rights: 600) /etc/NetworkManager/system-connections/freerunner_bobek (owner: root, rights: 600) /etc/NetworkManager/dispatcher.d/10myiptables (owner: root, rights: 755)
File contents
/etc/NetworkManager/system-connections/freerunner_bob:
[connection] id=Bob's moko uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb4 type=802-3-ethernet autoconnect=true timestamp=0 [ipv4] method=manual never-default=true address1=192.168.0.200;24 [802-3-ethernet] mac-address=00:1f:11:01:5d:13
/etc/NetworkManager/system-connections/freerunner_bobek:
[connection] id=Bobek's moko uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb3 type=802-3-ethernet autoconnect=true timestamp=0 [ipv4] method=manual never-default=true address1=192.168.0.200;24 [802-3-ethernet] mac-address=00:1f:11:01:6e:12
/etc/NetworkManager/dispatcher.d/10myiptables:
#!/bin/sh -e # Script to dispatch NetworkManager events # # Runs ifupdown scripts when NetworkManager fiddles with interfaces. # Bobek's freerunner export MYUUID1="27afa607-ee36-43f0-b8c3-9d245cdc4bb3" # Bob's freerunner export MYUUID2="27afa607-ee36-43f0-b8c3-9d245cdc4bb4" # The computer's username export USERNAME="lolza" if [ -z "$1" ]; then echo "$0: called with no interface" 1>&2 exit 1; fi # Fake ifupdown environment export IFACE="$1" export LOGICAL="$1" export ADDRFAM="NetworkManager" export METHOD="NetworkManager" export VERBOSITY="0" # Run the right scripts case "$2" in up) export MODE="start" export PHASE="up" if [ -f /sys/class/net/$IFACE/address ] ; then tmpfile=`mktemp -t` echo $CONNECTION_UUID > $tmpfile if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then echo "Bobek's Freerunner connected..." >> $tmpfile date >> $tmpfile iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 iptables -P FORWARD ACCEPT sysctl -w net.ipv4.ip_forward=1 sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202 else if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then echo "Bob's Freerunner connected..." >> $tmpfile date >> $tmpfile iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 iptables -P FORWARD ACCEPT sysctl -w net.ipv4.ip_forward=1 sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202 fi fi fi ;; down) export MODE="stop" export PHASE="down" tmpfile=`mktemp -t` echo "down called..." >> $tmpfile tmpfile=`mktemp -t` echo $CONNECTION_UUID > $tmpfile if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then echo "Bobek's Freerunner disconnected..." >> $tmpfile iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 iptables -P FORWARD ACCEPT sysctl -w net.ipv4.ip_forward=0 else if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then echo "Bob's Freerunner disconnected..." >> $tmpfile iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 iptables -P FORWARD ACCEPT sysctl -w net.ipv4.ip_forward=0 fi fi ;; *) echo "$0: called with unknown action \`$2'" 1>&2 exit 1 ;; esac