оповещение об отсутствии интернета

Обнаруженные вами ошибки в работе программы, предложения по ее улучшению
Аватара пользователя
Dmitry
Администратор
Сообщения: 1073
Зарегистрирован: 25 май 2011, 09:14
Откуда: г. Запорожье, Украина
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dmitry »

возможно все-таки из-за "неавторизованности" клиента
Аватара пользователя
Dmitry
Администратор
Сообщения: 1073
Зарегистрирован: 25 май 2011, 09:14
Откуда: г. Запорожье, Украина
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dmitry »

совсем просто то можно так.
1-й файл - bash-скрипт, который нужно "где-то" создать (например, в той-же папке /root), и запускать по расписанию через cron

Код: Выделить всё

#!/bin/bash
# Месторасположение файла
file=/usr/lib/cgi-bin/inet_status
# Сервер, по пингу на который определяется - есть доступ в интернет или нет.
test_server=www.google.com

if ping -c3 $test_server &> /dev/null
then
echo "1" > $file
chmod 666 $file
else
echo "0" > $file
chmod 666 $file
fi
exit
По результатам пинга в файл /usr/lib/cgi-bin/inet_status пишется либо 1 (интернет есть), либо 0 (интернета нет).

2-я часть - это код который нужно добавить в начало hotspotlogin.cgi, вместо того твоего пинга.

Код: Выделить всё

$file = "inet_status";
$count = "0";
$templ = "1";
if (! open LOGF, "<$file") {
die "Can't open file $file!";
} else {
while (<LOGF>){
    chomp;
if ($_ =~ m/$templ/g){
$count += 1;
}
}
close LOG_FILE;
if ($count == 0) {
print "Content-type: text/html\n\n";
print "Твое сообщение, которое хочешь засветить клиентам о том, что тырнета нет";
exit;
}
}
Он просто считывает этот самый файл и ищет в нем 1. Если не найдено (счетчик совпадений равен 0), то тогда - юзеру сообщение и выход
Dazzler
Сообщения: 66
Зарегистрирован: 30 июл 2011, 02:31
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dazzler »

Dmitry писал(а):возможно все-таки из-за "неавторизованности" клиента
Дак дело в том что скрипт:
use Net::Ping;
$pong = Net::Ping->new( $> ? "tcp" : "icmp" );
if (!$pong->ping("www.ya.ru"))
{
print "Content-type: text/html\n\n";
print "сообщение";
exit;
}
по идее должен выполнится на сервере, запуская его именно на сервере все работает,
когда обращаюсь к нему с клиента он вроде как работает но при любом исходе (прошёл пинг или нет) всегда попадает на print "сообщение";
Создается впечатление что переменная pong всегда получает одно и то же значение в случае если скрипт активируется с клиента
вот в чем странность то.
Аватара пользователя
Dmitry
Администратор
Сообщения: 1073
Зарегистрирован: 25 май 2011, 09:14
Откуда: г. Запорожье, Украина
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dmitry »

попробуй на время встромить туда такой код

Код: Выделить всё

$msg = system("ping -c3 www.google.com");
print $msg;
увидишь, пингует или нет
Dazzler
Сообщения: 66
Зарегистрирован: 30 июл 2011, 02:31
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dazzler »

В этом коде ошибку выбивает, но то что пингует это факт, даже небольшая задержка по времени видна в случае валидного домена, вот бы как то результат переменной понять
#!/usr/bin/perl
use Net::Ping;
$pong = Net::Ping->new( $> ? "tcp" : "icmp" );
$pong->ping("8.8.8.8");
print "Content-type: text/html\n\n";
print $pong;
exit;
на клиенте Net:Ping=HASH(0x9c499d0), адрес (9c499d0) при обновлении в браузере постоянно меняется
Аватара пользователя
Dmitry
Администратор
Сообщения: 1073
Зарегистрирован: 25 май 2011, 09:14
Откуда: г. Запорожье, Украина
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dmitry »

Dazzler писал(а):то что пингует это факт, даже небольшая задержка по времени видна в случае валидного домена,
Вообще-то, те мои две строки стоит вставлять ПОСЛЕ строки

Код: Выделить всё

print "Content-type: text/html\n\n";
и тогда в самой странице вы будете наблюдать вывод пинга. Вот пример
http://wifi-hotspot.zp.ua/cgi-bin/11.cgi
Только там у меня код этот вписан дважды, и в первый раз введено несуществующее доменное имя.


По поводу Net:Ping мне нечего сказать, я им не пользовался, и что значат получаемые вами значения, я не знаю.
Dazzler
Сообщения: 66
Зарегистрирован: 30 июл 2011, 02:31
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dazzler »

интересный нюанс
код:
$pong = Net::Ping->new( $> ? "tcp" : "icmp" );
$p = $pong->ping("www.google.com");
print "Content-type: text/html\n\n";
print $p;
на клиенте выводится '0' (процедура выполняется с задержкой), если задать неверный домен то ничего не выводиться, и без задержки, в обеих случаях нет сообщений об ошибках. Вопрос только в одном, как разрулить 0 и пустоту ?
Dazzler
Сообщения: 66
Зарегистрирован: 30 июл 2011, 02:31
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dazzler »

Вообще-то, те мои две строки стоит вставлять ПОСЛЕ строки

Код: Выделить всё

print "Content-type: text/html\n\n";
и тогда в самой странице вы будете наблюдать вывод пинга. Вот пример
http://wifi-hotspot.zp.ua/cgi-bin/11.cgi
Только там у меня код этот вписан дважды, и в первый раз введено несуществующее доменное имя.

Код: Выделить всё

print "Content-type: text/html\n\n";
$msg = system("ping -c3 www.google.com");
print $msg;
так работает
Аватара пользователя
Dmitry
Администратор
Сообщения: 1073
Зарегистрирован: 25 май 2011, 09:14
Откуда: г. Запорожье, Украина
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dmitry »

Dazzler писал(а):интересный нюанс
код:
$pong = Net::Ping->new( $> ? "tcp" : "icmp" );
$p = $pong->ping("www.google.com");
print "Content-type: text/html\n\n";
print $p;
на клиенте выводится '0' (процедура выполняется с задержкой), если задать неверный домен то ничего не выводиться, и без задержки, в обеих случаях нет сообщений об ошибках. Вопрос только в одном, как разрулить 0 и пустоту ?
очень просто - ноль это НЕ пустота ! :)
в принципе, можно попытаться сразу оба условия вставить в проверку:

Код: Выделить всё

if ($p ne "" && $p == 0) {
# Это действия при успешной проверке. В принципе нам тут вроде как делать ничего не нужно, но между фигурными скобками должно быть хоть что-то, поэтому присвоим 1 отфонарной переменной
$a = 1;
} else {
# это место неуспешной проверки. Тут тогда и выводите ваше сообщение что нет интернета и потом выход из скрипта
print "Content-type: text/html \n\n";
print "Интернета нет, бла-бла-бла...";
exit;
}
Dazzler
Сообщения: 66
Зарегистрирован: 30 июл 2011, 02:31
Контактная информация:

Re: оповещение об отсутствии интернета

Сообщение Dazzler »

а так проще:

Код: Выделить всё

#!/usr/bin/perl
use Net::Ping;
$myhost = 8.8.8.8 # dns провайдера
$pong = Net::Ping->new( $> ? "tcp" : "icmp" );
$p = $pong->ping($myhost);
if (!($p ne "" && $p == 0))
{
    print "Content-type: text/html \n\n";
    print "Интернета нет";
    exit;
}
Ну наконец то, головная боль закончилась, спасибо Дмитрий, а то я никак понять не могу в чем же разница между "0" и "пустотой", для меня это одно и то же как бы, было :)
Кстати, я думаю можно пинговать DNS провайдера, он на пинг не ответит только в одном случае
Ну, теперь можно заняться и DNS'ом.
Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей