I count myself among those who have taken a stab at automating wifi
roaming in userland:
https://github.com/bonds/winot
To be clear, winot is far, far from production ready, its more of an
excuse for me to play with Haskell at this point. But I've started
adding to the Further Reading and Alternatives sections of the README
when I see a thread on this topic, so maybe that could be useful to a
wider audience.
On 08/03, Steven Dee wrote:
Cool. Maybe a good complement for <https://github.com/mrdomino/autonet>.
On Wed, Aug 3, 2016 at 11:30 AM Walter Alejandro Iglesias <
roque...@gmail.com> wrote:
Sorry!
I have an entry in vimrc for my mail that replaces '>>' for '> >'. That
screwed the code, it was a bad idea. Here the corrected code:
=========================================================================
#!/bin/sh
# ~/bin/wifi.sh - occasional wireless connection in OpenBSD
[ "`whoami`" != "root" ] && { echo "You must be root"; exit 1; }
# PUT YOUR NORMAL USER HERE
user=morlock
# IMPORTANT: if you don't use dhcp in your home LAN save a copy of your
# LAN version of /etc/resolv.conf and /etc/hosts to this directory.
backdir=/home/$user/.wifi
[ ! -d $backdir ] && mkdir $backdir
rec=$backdir/stored
[ ! -e $rec ] && {
touch $rec
chmod 600 $rec
chown $user:$user $rec
}
tmp=/tmp/wifi-`date +%H%M%S`
# FUNCTIONS
cancel()
{
ifconfig $int -inet -inet6 -nwid -bssid -wpakey -nwkey
ifconfig $int down
[ -f $tmp ] && rm $tmp
[ -f $stored_tmp ] && rm $stored_tmp
exit 1
}
get_password()
{
if grep -i $bssid $rec; then
echo -n "Use the above \"$nwid\" stored password? [Y/n] "
read answer
if [ "$answer" != "n" ]; then
password=`grep -i $bssid $rec | awk '{ print $2 }'`
else
printf "$nwid $enc $message: "
read password
fi
else
printf "$nwid $enc $message: "
read password
fi
}
# SELECT WIRELESS INTERFACE
interfaces="`ifconfig wlan | awk -F: '/^[^\t]/ { print $1 }' | xargs`"
if [ ! "$interfaces" ]; then
echo "No wireless interfaces found." 1>&2
exit 1
elif [ `echo "$interfaces" | wc -w | xargs` -gt 1 ]; then
echo $interfaces
int=none
until echo $interfaces | grep -q $int; do
echo -n "Interface? "
read int
done
else
int=$interfaces
fi
trap cancel INT
ifconfig $int up
ifconfig $int -inet -inet6 -nwid -bssid -wpakey -nwkey
# SCAN AND CHOOSE AN ACCESS POINT
echo 'Scanning on '$int'...'
ifconfig $int scan | awk -F'\t' '/\tnwid/ { print $3 }' | nl -s') ' > $tmp
if [ `awk 'END { print NR }' $tmp` -eq 0 ]; then
echo "No access points found."
cancel
elif [ `awk 'END { print NR }' $tmp` -gt 1 ]; then
sed 's/\(.*\) nwid \(.*\) chan .*/\1 \2/' $tmp
ap=0
until egrep -q "^ *$ap\) nwid" $tmp ; do
echo -n "number? "
read ap
done
else
ap=`awk -F\) '{ print $1 }' $tmp | sed 's/ *//'`
fi
# GET AP DATA
bssid=`egrep '^ +'$ap')' $tmp | egrep -o '(..:){5}..' | tr "[a-f]" "[A-F]"`
nwid=`grep -i $bssid $tmp | sed 's/.* nwid \(.*\) chan .*/\1/' | sed
's/"//g'`
enc=`grep -i $bssid $tmp | awk -F, '{ print $NF }'`
case $enc in
wep)
key=nwkey
message="key (for HEX prefix 0x)"
get_password
;;
wpa*)
key=wpakey
message="passphrase"
get_password
;;
*)
key='-wpakey -nwkey'
password=''
;;
esac
# SET UP INTERFACE
ifconfig $int nwid "$nwid" $key $password || cancel
# CONNECTION ATTEMPT
/home/$user/bin/dhcp-connect.sh $int || cancel
# STORE PASSWORD
[ "$password" != "" ] && {
sed -i "/$bssid/d" $rec
echo -e "$bssid\t$password" >> $rec
}
# End of wifi.sh
=======================================================================
#!/bin/sh
# ~/bin/dhcp-connect.sh
# Connect using dhcp and set hostname (OpenBSD version)
[ "`whoami`" != "root" ] && { echo "You must be root"; exit 1; }
# PUT YOUR NORMAL USER HERE
user=morlock
# IMPORTANT: if you don't use dhcp in your home LAN save a copy of your
# LAN version of /etc/resolv.conf and /etc/hosts to this directory.
backdir=/home/$user/.wifi
int=$1
[ "$int" ] || {
echo "Usage: `basename $0` <interface>"
exit 1
}
clean_start()
{
for i in `ps xw | grep dhclient | grep $int | \
awk '{ print $1 }'`
do
[ $i ] && kill $i
done
}
cancel()
{
clean_start
[ -f $backdir/hosts ] && /home/$user/bin/reset-LAN.sh
exit 1
}
reset_LAN_at_shutdown()
{
[ ! -e /etc/rc.shutdown ] && {
echo "# /etc/rc.shutdown" > /etc/rc.shutdown
chmod 600 /etc/rc.shutdown
}
grep -q "# Reset LAN" /etc/rc.shutdown 2>/dev/null || {
echo >>/etc/rc.shutdown
echo '# Reset LAN' >>/etc/rc.shutdown
echo -n "[ -x /home/$user/bin/reset-LAN.sh ] && " \
>>/etc/rc.shutdown
echo "/home/$user/bin/reset-LAN.sh" >>/etc/rc.shutdown
}
}
dhclientConf()
{
grep -q "send host-name \"`hostname`\"" \
/etc/dhclient.conf 2>/dev/null ||
echo "send host-name \"`hostname`\";" \
>>/etc/dhclient.conf
}
clean_start
trap cancel INT
# Comment this if you think you don't need it
dhclientConf
# Attempt a connection
dhclient $int
ip=`ifconfig $int | awk '/inet/ { print $2 }'`
if [ "$ip" ]; then
[ -e $backdir/hosts ] && { # Set hosts file (Optional)
echo "# /etc/hosts" >/etc/hosts
echo "# (by $0)"
>>/etc/hosts
echo -e "127.0.0.1\tlocalhost"
>>/etc/hosts
echo -e "::1\tlocalhost"
>>/etc/hosts
echo -e "$ip\t`hostname`\t`hostname -s`"
>>/etc/hosts
reset_LAN_at_shutdown
/etc/rc.d/smtpd restart
grep -q ntpd /etc/rc.conf.local && /etc/rc.d/ntpd restart
}
else
echo "`basename $0`: could't establish the connection."
cancel
fi
# End of dhcp-connect.sh
=============================================================================
#!/bin/sh
# ~/bin/reset-LAN.sh - Reset your home LAN (OpenBSD version)
[ "`whoami`" != "root" ] && { echo "You must be root" 1>&2; exit 1; }
# PUT YOUR NORMAL USER HERE
user=morlock
# IMPORTANT: if you don't use dhcp in your home LAN save a copy of your
# LAN version of /etc/resolv.conf and /etc/hosts to this directory.
backdir=/home/$user/.wifi
diff -q $backdir/resolv.conf /etc/resolv.conf || {
cp $backdir/resolv.conf /etc || exit 1
echo "`basename $0`: restored LAN version of /etc/resolv.conf"
}
diff -q $backdir/hosts /etc/hosts || {
cp $backdir/hosts /etc || exit 1
echo "`basename $0`: restored LAN version of /etc/hosts"
}
# End of reset-LAN.sh
***
Finally, to add a menu entry to the window manager:
echo 'permit nopass <your_user> cmd /home/<your_user>/bin/wifi.sh' \
>>/etc/doas.conf
In ~/.cwmrc:
command wifi-connect "xterm -title wifi-connect \
-e \"doas /home/<your_user>/bin/wifi.sh; echo 'quiting...'; sleep
4\""
In a ~/.fvwmrc menu entry:
+ "WiFi connect" Exec exec xterm -title "WIFI Connect" \
-e "doas /home/<your_user>/bin/wifi.sh; echo 'quiting...'; sleep 4"