Скрипт для настройки сети openwrt
Dec. 22nd, 2013 03:41 amОн может пригодится, если этот маршрутизатор планируется использовать как консольный компьютер подключенный к интернету.
Он запрашивает только номер доступной точки доступа и ее пароль, а имя точки доступа он ищет сам.
#!/bin/sh
#********************************************************************************
#* скрипт для настройки сети openwrt в качестве приемника интернета из wifi *
#* достоинства: *
#* - настраивает eth на адрес 192.168.0.254, а если сеть 192.168.0.0/24 занята *
#* wifi, то настраивает на сеть 192.168.1.254 *
#* - настраивает opkg на ftp://<сеть eth>.200/packages *
#* - умеет определять мена доступных точк доступа *
#* - если доступна только одна SSID, то выбирает ее автоматом *
#* - настраивает синхронизацию времени *
#* 22 декабря 2013 года, zepete *
#********************************************************************************
#lanip=$(uci show network.lan.ipaddr | sed 's/network\.lan\.ipaddr=//')
lan_ip="192.168.0.254"
hostname='mr3020'
timezone='MSK-4'
opkg_ip=200#enable wireless
rm -f /etc/config/wireless
wifi detect > /etc/config/wireless
uci set wireless.radio0.disabled=0
#uci set wireless.radio0.distance=100
#uci set wireless.radio0.country='RU'
#uci set wireless.@wifi-iface[0].disabled=1
uci commit wireless
#out of wifi always go on uart.
wifi
#get information about wifi AP
iw dev wlan0 scan >/tmp/wifiAP.txt
#iw dev wlan0 scan
#get number of SSID of wifi AP
awk 'BEGIN{i=0}{if($1=="SSID:")i=i+1}END{exit i}' < /tmp/wifiAP.txt
NumSSID=$?
#echo $NumSSID
if [ $NumSSID -eq 0 ]
then
clear
echo '**********************************************'
echo '* ERROR ERROR ERROR ERROR ERROR ERROR *'
echo '* do not find wireless AP *'
echo '**********************************************'
exit 1
fi
#out table SSID with security type
clear
awk 'BEGIN{SSID="";WEP="no";WPA="no";RSA="no";AES="no";TKIP="no";free="yes";i=0;
printf "No SSID free WEP WPA WPA2 TKIP AES\n"}
{if($1=="SSID:"){SSID=$2}}
{if($1=="WPA:"){WPA="yes"}}
{if($1=="WEP:"){WEP="yes"}}
{if($1=="RSA:"){RSA="yes"}}
{if($0~/CCMP/){AES="yes"}}
{if($0~/TKIP/){TKIP="yes"}}
{if($0~/cipher/){free="no"}}
{if($1=="BSS")
{if(i!=0){printf "%2i %-30s %3s %3s %3s %3s %3s %3s\n",i,SSID,free,WEP,WPA,RSA,TKIP,AES};
WEP="no";WPA="no";RSA="no";AES="no";TKIP="no";free="yes";i+=1}
}
END{printf "%2i %-30s %3s %3s %3s %3s %3s %3s\n",i,SSID,free,WEP,WPA,RSA,TKIP,AES}
'# input number SSID
if [ $NumSSID -eq 1 ]
then
SSID="1"
else
SSID="0"
fi
while [[ $SSID -lt 1 || $SSID -gt $NumSSID ]]
do
read -p 'Input number of SSID:'
SSID=$(echo $REPLY|awk '{if($0~/[^[:digit:]]+/){print "0"; exit 0}else{print $0; exit 0}}')
done
#get type of security
encryption=$( (echo GetNumSSID: $SSID;cat /tmp/wifiAP.txt)|awk 'BEGIN{SSID="";WEP="no";WPA="no";RSA="no";AES="no";TKIP="no";free="yes";i=0;}
{if($1=="GetNumSSID:"){GetNumSSID=$2}
if($1=="SSID:"){SSID=$2}
if($1=="WPA:"){WPA="yes"}
if($1=="WEP:"){WEP="yes"}
if($1=="RSA:"){RSA="yes"}
if($0~/CCMP/){AES="yes"}
if($0~/TKIP/){TKIP="yes"}
if($0~/cipher/){free="no"}
if($1=="BSS"){
if(i==GetNumSSID){ exit }
if(i!=0){WEP="no";WPA="no";RSA="no";AES="no";TKIP="no";free="yes";};
i+=1};
}
END{if(i==GetNumSSID){
if(RSA=="yes"){
if(WPA=="no"){
if(TKIP=="yes" && AES=="yes"){print "psk2+tkip+aes";exit 0;}
if(TKIP=="yes"){print "psk2+TKIP";exit 0;}
if(AES=="yes"){print "psk2+AES"; exit 0;}
exit 1;}
if(TKIP=="yes" && AES=="yes"){print "mixed-psk+tkip+aes";exit 0;}
if(TKIP=="yes"){print "mixed-psk+TKIP";exit 0;}
if(AES=="yes"){print "mixed-psk+AES";exit 0;}
exit 1;}
if(WPA=="yes"){
if(TKIP=="yes" && AES=="yes"){print "psk+tkip+aes";exit 0;}
if(TKIP=="yes"){print "psk+TKIP";exit 0;}
if(AES=="yes"){print "psk+AES";exit 0;}
exit 1;}
if(WEP=="yes"){print "wep"; exit 0}
if(free=="yes"){print "none"; exit 0}
}
exit 1;
}')
if [ ! $? ]
then
echo '**********************************************'
echo '* ERROR ERROR ERROR ERROR ERROR ERROR *'
echo '* can not detect correct type encription *'
echo '* setup network handle *'
echo '**********************************************'
exit 1
fi
#get name of SSID
NameSSID=$( (echo GetNumSSID: $SSID;cat /tmp/wifiAP.txt)|
awk 'BEGIN{NumSSID=0;i=0;NameSSID=""}
{if($1=="GetNumSSID:"){NumSSID=$2}
if($1=="SSID:"){NameSSID=$2;i+=1;}
if(i==NumSSID){print NameSSID;exit 0}}
END{exit 1}')
if [ ! $? ]
then
echo '**********************************************'
echo '* ERROR ERROR ERROR ERROR ERROR ERROR *'
echo '* internal error get name SSID *'
echo '**********************************************'
exit 1
fi
echo $NameSSID
# set wifi managed (client) mode
uci set wireless.radio0.channel='auto'
uci set wireless.@wifi-iface[0].mode='sta'
uci set wireless.@wifi-iface[0].disabled=0
uci set wireless.@wifi-iface[0].ssid=$NameSSID
uci set wireless.@wifi-iface[0].network='wan'
uci set wireless.@wifi-iface[0].encryption=$encryption
#set password
if [ $encryption = "none" ]
then
uci delete wireless.@wifi-iface[0].key
uci commit wireless
else
connected=0
while [ $connected -eq 0 ]
do
wifi down
clear
echo "Choosed SSID: $NameSSID encryption: $encryption"
read -p 'Input key:'
uci set wireless.@wifi-iface[0].key=$REPLY
uci commit wireless
wifi
sleep 10
connected=$(cat /proc/net/wireless | awk 'BEGIN{k=0}
{if($1=="wlan0:" && $3!=0)k=1}
END{print k}')
done
fi
#настройка /etc/config/network
uci set network.wan=interface
uci set network.wan.proto=dhcp
uci set network.wan.hostname=$hostname
#проверка на совпадение внешней сети с внутренней
uci delete network.lan
uci commit network
wifi down;killall -9 wpa_supplicant;wifi up
/etc/init.d/network restrt
wlan_ip=$(ifconfig | awk 'BEGIN{f=0}
$1=="wlan0"{f=1}
f==1 && $1=="inet" && $2~/addr:([0-9]{1,3}\.){3}[0-9]{1,3}$/{
split($2,ip,":");
print ip[2]}')
if [[ $(echo $lan_ip | awk '{split($1,ip,"."); print ip[1]}') -eq \
$(echo $wlan_ip | awk '{split($1,ip,"."); print ip[1]}') &&\
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[2]}') -eq \
$(echo $wlan_ip | awk '{split($1,ip,"."); print ip[2]}') &&\
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[3]}') -eq \
$(echo $wlan_ip | awk '{split($1,ip,"."); print ip[3]}') ]]
then
lan_ip="$(echo $lan_ip | awk '{split($1,ip,"."); printf "%i.%i.%i.%i",ip[1],ip[2],ip[3]+1,ip[4]}')"
fi
# настройка opkg
opkg_conf_addr=$(printf "%i.%i.%i.%i"\
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[1]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[2]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[3]}') $opkg_ip)
sed -i "/etc/opkg.conf.bak" -e "s/\(src\/gz attitude_adjustment \).*/\1ftp:\/\/$opkg_conf_addr\/packages/"
#настройка eth сети
uci set network.lan=interface
uci set network.lan.ifname='eth0'
uci set network.lan.proto=static
uci set network.lan.ipaddr=$lan_ip
uci set network.lan.netmask='255.255.255.0'
uci set network.lan.type='bridge'
uci commit network
#настройка /etc/config/firewall
uci set firewall.@zone[1].input=ACCEPT
uci set firewall.@zone[1].masq_dest=!192.168.1.0/24
uci add firewall forwarding
uci set firewall.@forwarding[1].src='wan'
uci set firewall.@forwarding[1].dest='lan'
uci commit firewall
# настройка /etc/config/system
uci set system.@system[0].hostname=\'$hostname\'
uci set sytem.@system[0].timezone=\'$timezone\'
uci delete system.ntp.server
uci add_list system.ntp.server='ntp.mobatime.ru'
uci add_list system.ntp.server='0.pool.ntp.org'
uci add_list system.ntp.server='ntp1.vniiftri.ru'
uci add_list system.ntp.server='time.windows.com'
uci add_list system.ntp.server='0.debian.pool.ntp.org'
uci set system.ntp.enable_server=1
uci set system.@system[0].timezone='MSK-4'
uci commit system
#сброс сети
/etc/init.d/firewall restart
sleep 1
wifi down; sleep 10; killall -9 wpa_supplicant; wifi up
sleep 10
/etc/init.d/network restart
sleep 10
ntpd -p ntp.mobatime.ru -p 0.pool.ntp.org -p ntp1.vniiftri.ru -p time.windows.com -p 0.debian.pool.ntp.org
opkg update
#вывод на экран требуемых параметров сети подключенного компьютера
clear
echo '********************************************************'
echo '* Config your ethernet adapter on computer *'
printf "* ip address:%3i.%3i.%3i.%3i *\n" \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[1]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[2]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[3]}') $opkg_ip
echo '* mask: 255.255.255.0 *'
printf "* gate:%3i.%3i.%3i.254 *\n" \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[1]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[2]}') \
$(echo $lan_ip | awk '{split($1,ip,"."); print ip[3]}')
echo '* dns server: 8.8.8.8 *'
echo '********************************************************'