В свое время возникла задача — раз в сутки менять WPA-PSK ключ на точке доступа, при этом поднимать для подобной попсы RADIUS было как-то нелогично, да еще и несколько пакетиков кофе обнаружилось рядом...
В результате 20-минутного мозгового штурма было принято решение написать PERL-овый скрипт, который менял бы ключ по телнету и отсылал его на электронную почту клиента.
В процессе возник вопрос, чем же, собственно, этот ключ генерировать? Порты, как всегда, пришли на помощь, и была обнаружена следующая приятнейшая тулза :
Port: pwgen-2.06 Path:/usr/ports/sysutils/pwgen2 Info: A small, powerful, GPL'ed password generator
Потому,
# cd /usr/ports/sysutils/pwgen2 # make install clean
Далее, для подключения по телнету и отсылки писем по SMTP PERLу нужны модули Net::Telnet и Net::SMTP, так что
# perl -MCPAN -e 'install Net::Telnet' # perl -MCPAN -e 'install Net::SMTP'
И, наконец-то, можем приступать к скрипту. Заранее скажу, что скрипт 100% протестирован на точке D-Link DWL-2100AP с версией прошивки:
D-Link Access Point wlan1 -> version SOFTWARE_VERSION: v2.40euСам скрипт:
#!/usr/bin/perl -w
use Net::Telnet();
use Net::SMTP();
$log="/usr/local/etc/wifi_pass/log"; # Файл, в который будем записывать историю смены паролей
$telnet_log="/usr/local/etc/wifi_pass/telnet_log"; # Файл, в который будем складывать "дамп протокола" общения с точкой
$pwgen="/usr/local/bin/pwgen -1ncB"; # Путь к pwgen и ключи запуска, чтобы "рандомные" пароли были человекочитабельны
$mail_smtp="smtp.myisp.net"; # Сервер, через который будем слать почту
$mail_from="it\@mycompany.com.ua"; # Адрес, от имени которого шлем уведомления
@mail_to_user= qw/ client1@client-company.com.ua client2@client-company.com.ua /; # Клиенты, получающие уведомление о смене пароля
@mail_to_admin= qw/ admin1@mycompany.com.ua admin2@mycompany.com.ua /; # Админы, получающие уведомление о процессе смены пасса
$username="ACCESSPOINTADMINLOGIN"; # Админский логин в точку
$passwd="ACCESSPOINTADMINPASSWORD"; # Пасс к админскому логину в точку
$ap="192.168.1.25"; # Айпи точки
$date="/bin/date";
chomp($date = `$date`);
#--------------------Открываем логфайл для записи--------------------------
open(LOG,">> $log");
print LOG "========================\n";
print LOG "$date\n";
#--------------------Генерячим пароль посредством pwgen --------------------
chomp($pass_new = `$pwgen`);
print LOG "$pass_new\n\n\n";
close LOG;
#--------------------Подключаемся к точке по телнету и меняем пасс-----------
$t = new Net::Telnet (Timeout => 10, Input_log => "$telnet_log") || die "Conversation opening failed"; # Логируем все, что происходит.
$t->open($ap);
$t->login($username, $passwd) || die "Login or password incorrect";
$t->cmd("set passphrase");
$t->cmd("$pass_new");
$t->errmode(sub {die @_ unless $_[0] =~ /eof/}); # Немаловажный момент - после ребута точки скрипт аварийно завершает работу,
$t->cmd("reboot"); # так что пишем обработчик ошибки.
$t->close;
#---------------Пишем лог общения с точкой-----------------------------------------
open (TLN, "$telnet_log");
@telnet_log = ;
close (TLN);
#---------------Уведомляем пользователей--------------------------------------------------
foreach $mail_to_user(@mail_to_user){
$smtp = Net::SMTP->new("$mail_smtp");
$smtp->mail("$mail_from");
$smtp->to("$mail_to_user");
$smtp->data();
$smtp->datasend("To: $mail_to_user\n");
$smtp->datasend("Subject: Client-Company NEW WiFi Password\n");
$smtp->datasend("$date\n");
$smtp->datasend("-=====================================================-\n");
$smtp->datasend("Password to access in the Client-Company Wi-Fi Zone was been changed\n");
$smtp->datasend("New Password: $pass_new\n");
$smtp->datasend("-=====================================================-\n");
$smtp->datasend("If you have any questions, please contact admin by e-mail: it\@mycompany.com.ua\n");
$smtp->dataend();
$smtp->quit;
}
#--------------Уведомляем админов--------------------------------------------------------
foreach $mail_to_admin(@mail_to_admin){
$smtp = Net::SMTP->new("$mail_smtp");
$smtp->mail("$mail_from");
$smtp->to("$mail_to_admin");
$smtp->data();
$smtp->datasend("To: $mail_to_admin\n");
$smtp->datasend("Subject: Client-Company NEW WiFi Password\n");
$smtp->datasend("$date\n");
$smtp->datasend("-=====================================================-\n");
$smtp->datasend("Password to access in the Client-Company Wi-Fi Zone was been changed\n");
$smtp->datasend("New Password: $pass_new\n");
$smtp->datasend("-=====================================================-\n");
$smtp->datasend("log of the changing password:");
$smtp->datasend("@telnet_log\n");
$smtp->dataend();
$smtp->quit;
}
Далее, делаем
# chmod +x наш_супер_скрипт.plИ добавляем в cron задание для запуска скрипта
0 5 * * 3 root /usr/local/etc/wifi_pass/script.plВот и все, IT'S ALIVE ! ! !