#!/bin/bash
# script by fanthom
#adjusted under the terms of GPL see /usr/share/doc/legal/ 
#hacked by 01micko to be puppy happy
#перевод на русский язык - Андрей Войтович (andy-voit@yandex.ru)15.01.2012
#210527 sfs

##hacked by sfslinux@gmail.com
for i in `ifconfig |awk '!/^lo / && /Link encap:/ {print $1}'` ;do
    sudo ifconfig $i down
done

SU() {
# Переключение в root
if [ `whoami` != "root" ]; then
    echo "Введите ниже ваш пароль root (если есть)"
    su - -c "pns-tool"
    exit
fi
}

# Переменные
dir="/tmp/pns-tool"
file="$dir/etc/rc.d/rc.local"
supplicant="$dir/etc/wpa_supplicant.conf"
inet="$dir/etc/rc.d/rc.inet1"
c='\e[36m'
r='\e[31m'
e=`tput sgr0`

# Удаление файлов от предыдущего запуска pns-tool (если существуют)
rm -r $dir > /dev/null 2>&1
rm /root/pns-tool-configs.xzm > /dev/null 2>&1
rm -r /etc/dhcpc/* > /dev/null 2>&1
rm -r /var/run/wpa_supplicant/ > /dev/null 2>&1

mkdir $dir && mkdir $dir/etc && mkdir $dir/etc/rc.d
clear
# Убить запущенные процессы dhcpcd и wpa_supplicant (если существуют)
proc1=`ps x | grep wpa_supplicant | awk '{print $1}' | head -n1`
proc2=`ps x | grep dhcpcd | awk '{print $1}' | head -n1`
kill -9 $proc1 > /dev/null 2>&1
kill -9 $proc2 > /dev/null 2>&1
#  еще раз для 100% уверенности :)
unset proc1 && unset proc2
proc1=`ps x | grep wpa_supplicant | awk '{print $1}' | head -n1`
proc2=`ps x | grep dhcpcd | awk '{print $1}' | head -n1`
kill -9 $proc1 > /dev/null 2>&1
kill -9 $proc2 > /dev/null 2>&1

## Запуск скрипта
# Приветственное сообщение
#переделано для использования в puppy 01micko 110916
#из porteus-network-setup-tool, удален формат dep
echo -e "${c}Script by fanthom,

Добро пожаловать в Puppy-Network-Setup-Tool.
Этот скрипт позволит вам сконфигурировать устройства для ваших проводных или 
беспроводных сетей. Но первоначально мне необходимо собрать всю необходимую 
информацию, поэтому большая просьба -- корректно отвечать на все поставленные 
вопросы. После каждого ответа нажимайте Enter, чтобы двигаться далее. 
Запомните-вы можете в любой момент прекратить работу скрипта, нажав Сtrl+С 
без всякого вреда для текущей системной конфигурации.

Нажмите Enter для запуска."$e #| fmt -w 80
read
clear
echo -e "${c}Список доступных интерфейсов.\
\nЕсли вашей сетевой карты нет в списке ниже, установите необходимое\
\nпрограммное обеспечение и драйверы, а затем перезапустите скрипт. 
 Полезную информацию для отладки можно получить, набрав в терминале
команду dmesg. Например, команда \
\n'dmesg | grep firmware' \
\nпоможет выявить необходимость прошивки для вашего устройства."$e #| fmt -w 80; echo
ls /sys/class/net;echo
echo -e "${c}Введите имя настраиваемого интерфейса (eth0,ath1,wlan0) 
или введите '?' для получения более детальной информации"$e #| fmt -w 80
read -e dev;echo
if [ "$dev" = "?" ]; then
    echo -e "${r}Вывод команды ifconfig:"$e;echo;echo
    ifconfig
    echo -e "${r}Вывод команды iwconfig:"$e;echo;echo
    iwconfig
    echo -e "${c}Введите наименование настраимового интерфейса (eth0,ath1,wlan0)
или нажмите Сtrl+C для выхода из сценария:"$e #| fmt -w 80
    read -e dev
fi
ifconfig $dev up
echo -e "${c}Вы хотите получить адрес ip с помощью сервера dhcp  \
\n(должен быть доступен в сети)? Ответ y/n"$e #| fmt -w 80
read -e dhcp; echo
YES() {
    echo -e "${r}Хорошо, dhcpd делает жизнь проще :)"$e;echo
}
NO() {
    echo -e "${c}Введите ip адрес для $dev (например: 192.168.1.10):"$e
    read -e ip
    echo "ifconfig $dev $ip" >> $file
    echo -e "${c}Введите ip адрес для маршрутизатора/шлюза (например: 192.168.1.1):"$e
    read -e router
    echo "route add default gw $router $dev" >> $file
    echo -e "${c}Укажите ip адрес сервиса DNS  (например: Google DNS: 8.8.8.8):"$e
    read -e DNS
    echo "echo "nameserver $DNS" > /etc/resolv.conf" >> $file

    # Отключение службы dhcpcd
    cp /etc/rc.d/rc.inet1 $inet
    sed -i $inet -e 's/echo/#echo/g'
    sed -i $inet -e 's/for/#for/g'
    sed -i $inet -e 's@/sbin@#/sbin@g'
    sed -i $inet -e 's/done/#done/g'
}
case "$dhcp" in
y) YES ;;
n) NO ;;
*)
echo -e "${r}Выберите y или n"$e
exit 1 ;;
esac

echo -e "${c} $dev является wifi картой? Ответ y/n"$e
read -e wifi
NO() {
    echo -e "${r}Все сделанные сейчас настройки будут проходить тестирование..."$e
}
YES() {
    clear
    # Отключение проводной сети
    #ifconfig eth0 down > /dev/null 2>&1 & ifconfig eth1 down > /dev/null 2>&1 & ifconfig eth2 down > /dev/null 2>&1
    echo -e "${c}Это список всех доступных беспроводных сетей в вашем районе - ждите окончания сканирования"$e;echo #| fmt -w 80
    iwlist $dev sc >/tmp/wifi$$
    grep ESSID /tmp/wifi$$;echo
    echo -e "${c}Пожалуйста, укажите имя (ESSID) Вашей WiFi сети \
\ П (в кавычки, только если они включены в имя беспроводной сети)."$c #| fmt -w 80
    echo -e "${c}Введите '?' для получения более детальной информации \
    \nили нажмите Enter, если ESSID скрыт."$e
    read -e ssid;echo
    if [ ! "$ssid" = "" ]; then
	ssid="$ssid"
    else
	echo -e "${c}Укажите имя  сети (ESSID) для скрытой точки доступа (AP):"$e
	read -e ssid;echo
	sed -i /tmp/wifi$$ -e 's/ESSID:""/ESSID:"'"$ssid"'"/g'
	echo -e "${c}'scan_ssid=1' режим по умолчанию.  Не поддерживается некоторыми драйверами, \
	\nпоэтому необходим режим 'ap_mode=2'."$e #| fmt -w 80
	echo -e "${c}Хотите добавить это в конфигурационный файл? Ответ y/n"$e
	read -e scan;echo
	if [ "$scan" != "y" -a "$scan" != "n" ]; then echo -e "${r}Выберите y или n"$e; exit 1; fi
    fi
    if [ "$ssid" = "?" ]; then
	iwlist $dev sc;echo
	echo -e "${c}Пожалуйста, укажите имя (ESSID) Вашей WiFi сети"$e
	read -e ssid;echo
    fi
    echo -e "${c}Введите настраиваемый MAC адрес для $dev или нажмите Enter, \
    \nчтобы использовать оригинальный:"$e #| fmt -w 80
    read -e mac; echo
    if [ ! "$mac" = "" ]; then
	ifconfig $dev hw ether $mac;echo
	echo "#ifconfig $dev hw ether $mac" >> $file
    fi
##    echo -e "${c}do you want to enable ad-hoc mode (direct PC-PC connection) on \
##\n${dev}? Some drivers may not support this. Answer y/n"$e #| fmt -w 80
##    read -e hoc; echo
##    if [ "$hoc" != "y" -a "$hoc" != "n" ]; then echo -e "${r}choose y or n"$e; exit 1; fi
hoc=n

    # Шифрование
    echo -e "${c}Попытка обнаружить метод шифрования, используемый в  "$ssid""$e
    echo -e "${c}При нахождении в диапазоне двух и более скрытых сетей, этот \
\nскрипт имеет возможность обнаружить шифрование."$e #| fmt -w 80
    ENWPA=`sed -n '/'"$ssid"'/,/Cell/p' /tmp/wifi$$ | egrep 'IE: WPA|802.11i/WPA2'`
    if [ "$ENWPA" != "" ]; then
	echo -e "${r}Похоже, что "$ssid" использует WPA/WPA2, пробуем вариант '3'" #| fmt -w 80
    else
	grep -B 4 "$ssid" /tmp/wifi$$ | grep -v "$ssid" >/tmp/wep$$
	sed -n '/'"$ssid"'/,/Cell/p' /tmp/wifi$$ >>/tmp/wep$$
	ENWEP=`grep 'Encryption key' /tmp/wep$$ | cut -d ":" -f2`
	if [ "$ENWEP" = "on" ]; then
	    echo -e "${r}Похоже, что "$ssid" использует WEP, пробуем вариант '2'"
	else
	    echo -e "${r}Похоже, что "$ssid" - открытая сеть, пробуем вариант '1'"
	rm /tmp/wep$$
	fi
    fi
    rm /tmp/wifi$$
    echo
    echo -e "${c}Выберите режим шифрования для вашего беспроводного устройства: 1,2 или 3"$e
    echo -e "${c}1 - Открытая сеть (без шифрования)"$e
    echo -e "${c}2 - WEP шифрование (слабое шифрование - легко сломать)"$e
    echo -e "${c}3 - WPA/WPA2 (сильное шифрование)"$e; echo
    read -e encr;echo
    OPEN() {
	echo -e "${c}Ваша сеть WiFi будет оставаться открытой"$e
	echo "# Открытым текстом (без шифрования)" > $supplicant
	echo "ctrl_interface=/var/run/wpa_supplicant" >> $supplicant
	if [ "$scan" = "y" ] > /dev/null 2>&1; then echo "ap_scan=2" >> $supplicant; fi
	echo "network={" >> $supplicant
	if [ "$hoc" = "y" ]; then echo "mode=1" >> $supplicant; fi
	echo "scan_ssid=1" >> $supplicant
	echo "ssid=$ssid" >> $supplicant
	echo "key_mgmt=NONE" >> $supplicant
	echo "}" >> $supplicant
	sed -i $supplicant -e s/ssid="$ssid"/ssid='"'"$ssid"'"'/g
	echo "#wpa_supplicant -Dwext -i$dev -c /etc/wpa_supplicant.conf > /dev/null 2>&1 &" >> $file
	echo -e "${r}Завершение установки, выходим на стадию тестирования..."$e
    }
    WEP() {
	echo -e "${c}Укажите ключ шифрования WEP в HEX формате, т.е.:751E51F12091ACAA2D9AD3E2F0"$e
	read -e key
	echo "# Static WEP key" > $supplicant
	echo "ctrl_interface=/var/run/wpa_supplicant" >> $supplicant
	if [ "$scan" = "y" ] > /dev/null 2>&1; then echo "ap_scan=2" >> $supplicant; fi
	echo "network={" >> $supplicant
	if [ "$hoc" = "y" ]; then echo "mode=1" >> $supplicant; fi
	echo "scan_ssid=1" >> $supplicant
	echo "ssid=$ssid" >> $supplicant
	echo "key_mgmt=NONE" >> $supplicant
	echo "wep_key0=$key" >> $supplicant
	echo "wep_tx_keyidx=0" >> $supplicant
	echo "}" >> $supplicant
	sed -i $supplicant -e s/ssid="$ssid"/ssid='"'"$ssid"'"'/g
	echo "#wpa_supplicant -Dwext -i$dev -c /etc/wpa_supplicant.conf > /dev/null 2>&1 &" >> $file
	echo -e "${r}Установка завершена, переходим к стадии тестирования..."$e
    }
    WPA() {
	echo -e "${c}Укажите пароль WPA/WPA2:"$e
	read -e key
	PSK=`wpa_passphrase "$ssid" "$key" | grep psk=[a-f,0-9] | cut -d '=' -f 2`
	echo "# WPA/WPA2 both TKIP and CCMP" > $supplicant
	echo "ctrl_interface=/var/run/wpa_supplicant" >> $supplicant
	if [ "$scan" = "y" ] > /dev/null 2>&1; then echo "ap_scan=2" >> $supplicant; fi
	echo "network={" >> $supplicant
	if [ "$hoc" = "y" ]; then echo "mode=1" >> $supplicant; fi
	echo "scan_ssid=1" >> $supplicant
	echo "ssid=$ssid" >> $supplicant
	echo "key_mgmt=WPA-PSK" >> $supplicant
	echo "pairwise=CCMP TKIP" >> $supplicant
	echo "group=CCMP TKIP" >> $supplicant
	echo "psk=$PSK" >> $supplicant
	echo "}" >> $supplicant
	sed -i $supplicant -e s/ssid="$ssid"/ssid='"'"$ssid"'"'/g
	if [ "$hoc" = "y" ]; then
	    sed -i $supplicant -e s/key_mgmt=WPA-PSK/key_mgmt=WPA-NONE/g
	    sed -i $supplicant -e s/"pairwise=CCMP TKIP"/pairwise=NONE/g
	fi
	echo "#wpa_supplicant -Dwext -i$dev -c /etc/wpa_supplicant.conf > /dev/null 2>&1 &" >> $file
	echo -e "${r}Установка завершена, переходим к стадии тестирования..."$e
    }
    case "$encr" in
    1) OPEN ;;
    2) WEP ;;
    3) WPA ;;
    *)
    echo -e "${r}Выберите 1,2 или 3"$e
    exit 1 ;;
    esac
}
case "$wifi" in
y) YES ;;
n) NO ;;
*)
echo -e "${r}Выберите y или n"$e
exit 1 ;;
esac
echo -e "${c}Подтвердите (или отредактируйте, если была допущена ошибка) правильность конфигурационного файла.
Нажмите "ESC" два раза, чтобы редактировать каждый конфигурационный файл."$e #| fmt -w 80
read
if [ -e $file ]; then mcedit $file; fi
if [ -e $supplicant ]; then mcedit $supplicant; fi
if [ -e $file ]; then
    chmod +x $file
    $file & > /dev/null 2>&1
fi
if [ "$wifi" = "y" ]; then sed -i $file -e 's/#wpa_supplicant/wpa_supplicant/g'; fi
if [ ! "$mac" = "" ]; then sed -i $file -e 's/#ifconfig/ifconfig/g'; fi
clear
if [ -e $supplicant ]; then
    wpa_supplicant -D wext -i $dev -c $supplicant &
fi
if [ "$dhcp" = "y" ]; then
    echo
    sleep 5
    dhcpcd $dev &
    echo -e "${r}Подождите немного, dhcpcd должен собрать все данные о вашем устройстве."$e
    echo -e "${c}Если у вас возникли проблемы,вставьте эту отладочную информацию на форуме Puppy:"$e
    GAT=`route -nee | grep $dev | tail -n1 | awk '{print $2}' | cut -d '.' -f1`
    while [ "$GAT" = "" ]; do
	sleep 1
	unset $GAT > /dev/null 2>&1
#sfs##	GAT=`route -nee | grep $dev | tail -n1 | awk '{print $2}' | cut -d '.' -f1`
	GAT=`route -ne | grep $dev | tail -n1 | awk '{print $2}' | cut -d '.' -f1`
    done
    RTE=`route -nee | grep $dev | tail -n1 | awk '{print $2}' | cut -d '.' -f1`
    while [ $RTE = 0 ]; do
	sleep 1
	unset $GAT > /dev/null 2>&1
	RTE=`route -nee | grep $dev | tail -n1 | awk '{print $2}' | cut -d '.' -f1`
	echo $RTE
    done
echo
echo -e "${r}Теперь все отлично, работаю..."$e
fi
if [ "$dhcp" = "n" ]; then
    if [ "$wifi" = "y" ]; then
	echo -e "${c}Подождите несколько секунд... При возникновении проблем \
\nвставьте эту отладочную информацию на форуме Puppy:"$e #| fmt -w 80
	echo
	echo -e "${c}Нажмите Enter по завершении операции ассоциирования."$e
	read
    fi
fi
if [ "$hoc" = "y" ] > /dev/null 2>&1; then
    echo
    echo -e "${c}Введите IP адрес другого ПК, работающего в специальном режиме ad-hoc"$e
    read -e pc
    echo
    #echo -e "${c}Сейчас будет произведен пинг $pc. После получения отклика, закройте окно терминала и нажмите Enter"$e #| fmt -w 80
    echo -e "${c}Сейчас будет произведен пинг  $pc"
    echo
    #xterm -T AD-HOC -geometry 70x20+750+80 -fg green -bg black -e "ping $pc" > /dev/null 2>&1
    ping $pc > /dev/null 2>&1
else
#можно добавить эти тесты позднее #micko
    #echo -e "${c}Проверка работоспособности вашего соединения, нажмите Enter когда будете готовы"$e
    #read
    #echo -e "${c}Сначала будет сделан пинг шлюза для проверки связи между $dev и роутером/AP"$e #| fmt -w 80
    ##echo -e "${c}После получения отклика, закройте терминал и нажмите Enter для продолжения."$e #| fmt -w 80
    #if [ "$dhcp" = "n" ]; then
	##xterm -T GATEWAY -geometry 70x20+750+80 -fg green -bg black -e "ping -I $dev $router" > /dev/null 2>&1
    #ping -I $dev $router > /dev/null 2>&1
    #else
	#AP=`route -nee | grep $dev | tail -n1 | awk '{print $2}'`
	##xterm -T GATEWAY -geometry 70x20+750+80 -fg green -bg black -e "ping -I $dev $AP" > /dev/null 2>&1
    #ping -I $dev $AP > /dev/null 2>&1
    #fi
    #read
    #echo -e "${c}Проверяю соединение между $dev и интернетом, по окончании закройте окно xterm и нажмите Enter"$e #| fmt -w 80
    ##xterm -T INTERNET -geometry 70x20+750+80 -fg green -bg black -e "ping 8.8.8.8" > /dev/null 2>&1
    #ping 8.8.8.8 > /dev/null 2>&1
    #read
    #echo -e "${c}Последний тест - Domain Name Service"$e #| fmt -w 80
    ##xterm -T DNS -geometry 70x20+750+80 -fg green -bg black -e "ping kernel.org" > /dev/null 2>&1
    ping -c 3 8.8.8.8 #google #> /dev/null 2>&1
    sleep 2
fi
clear
#не знаю,что с этим делать, мои сетевые возможности не позволяют :| #micko
echo -e "${c}Если все тесты прошли хорошо, вам нужно скопировать 'ready to go' конфигурационные файлы \
\nиз $dir в необходимое место вашей системы (рассмотреть вопрос о добавлении содержимого 
\n$file в существующий /etc/rc.d/rc.local, остальные файлы должны быть заменены):"$e #| fmt -w 80
echo -e "${r}a) $file и $inet должен быть помещен в /etc/rc.d/
b) $supplicant должен перейти в /etc/"$e
echo -e "${c}Готово"$e
#echo -e "${c}Если некоторые файлы, упомянутые выше, отсутствует в каталоге $dir, то они просто не нужны для указанной конфигурации.

#Сохранить настройки?
#Ответ y/n"$e #| fmt -w 80
#read -e module
#if [ "$module" = "y" ]; then
    #echo -e "${c}Нажмите Enter, чтобы перейти непосредственно к конфигурационным файлам."$e
    #echo -e "${c}Благодарю за использование этого инструмента"$e
    #echo
    #echo -e "${c}С уважением,"$e
    #echo -e "${c}fanthom"$e
    #read
    #rox $dir &
#fi
resolv-fix

[ $DISPLAY ] && read
exit
