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"