Hello,
Not what you asked for, but taking in care some people here complain
about not having a "desktop wireless connection app" as they got used by
the popular OSs, I'll share (shamelessly) what I improvised to solve my
specific needs with the aim to encourage others to write their own
solutions.
In my case, since I prefer to use ethernet cables and static IP
addresses for all machines in my home LAN, I wrote the following shell
scripts to connect my laptop in those occasions I'm out, in a bar or a
restaurant. They are also intended to be useful individually; if at
some place I have an ethernet cable available, I directly run the second
one (dhcp-connect.sh) to establish a provisional dhcp connection, then
(optionally) when I shutdown the machine before living the place, the
third one (reset-LAN.sh) restores the LAN version of /etc/hosts and
/etc/resolv.conf so I don't need to bother about reseting them manually
when I'm back home.
I'm new to openbsd, it surely offers simpler ways to accomplish the same
tasks that I still ignore (advices welcome).
=========================================================================
#!/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"
And that's all.
Walter