Programowanie (Moje Projekty), Sieć (IP, TCP, ...), System (GNU, BSD, Windows...)

netd.pl

11 września, 2008 o 10:22:01 Dodaj komentarz Poziom: 0 Permalink

Prosty kod który ma jedno zadanie - resetować połączenie gdy nie może spingować czegoś. Nie jestem pewien czy czekanie działa.

  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Net::Ping;
  6. use POSIX 'setsid';
  7. use POSIX 'sleep';
  8.  
  9. ### Configuration
  10. ## Hosts - each member is a host to ping. Move the quickiest to the beginning.
  11. ## Please note that the more hosts is pinged the more realible is test and
  12. ## the more time it requires
  13. my @hosts = ('netia.pl', 'google.com', 'onet.pl');
  14.  
  15. ## Method of ping
  16. my $ping_method = 'icmp';
  17.  
  18. ## Sleep - a sleep in ms betwean the checks
  19. my $sleep = 250;
  20.  
  21. ## Tries - a number of attapts to connect
  22. my $tries = 1;
  23.  
  24. ## Routine to be called if network not found
  25. sub on_network_not_found {
  26.  system '/etc/init.d/net.ppp0 restart';
  27. }
  28.  
  29. ### Daemonize
  30. chdir '/'                 or die "Can't chdir to /: $!";
  31. defined(my $pid = fork)   or die "Can't fork: $!";
  32. exit if $pid;
  33. setsid;
  34. open STDIN, '/dev/null'   or die "Can't read /dev/null: $!";
  35. open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
  36. open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
  37.  
  38. ### Main loop
  39. my $p = Net::Ping->new($ping_method) or die "Cannot create ping object";
  40.  
  41. MAIN: while(1) {
  42.   for(my $i = 0; $i < $tries; $i++) {
  43.     select(undef, undef, undef, $sleep/1000.0);
  44.     for my $host (@hosts) {
  45.       next MAIN if $p->ping($host)
  46.     }
  47.     on_network_not_found();
  48.   }
  49. }

Kod jak zwykle na MIT.

Komentarze do wpisu

Możesz śledzić odpowiedzi poprzez kanał RSS. Możesz dodać komentarz lub zostawić ślad (trackback) ze swojego bloga.

#

Mateusz Kozak

u mnie za automatyczny reconnect odpowiada prosty skrypt w bashu

#!/bin/bash

/bin/ping -c 4 213.25.2.205 | grep „bytes from” || pppd call speedtouch;

11 września 2008, 14:16:05

#

Uzytkownik

Tak – tylko z dziwnych powodów takie skrypty nie chciały działać – cron się ‘zatykał’.
Gdyby nie to to oczywiście twój jest poprawniejszy.
No może z wyjątkiem tego że wystarczy:
ping -c 1 213.25.2.205 || pppd call speedtouch

11 września 2008, 19:00:22

#

Minio

Ślepy jestem… możesz pokazać palcem która linijka odpowiada za restartowanie połączenia?

11 września 2008, 20:21:39

#

Mateusz Kozak

@minio: # system ‘/etc/init.d/net.ppp0 restart’;

11 września 2008, 20:22:29

#

Uzytkownik

26. Oczywiście dla Gentoo ;)
Można sobie tam wpisać cokolwiek.

11 września 2008, 20:22:36

#

Minio

Mówiłem że ślepy jestem ;) .

Ale… jak ta procedura jest wywoływana? Nie widzę nigdzie odwołania do niej. A teraz pomogłem sobie ctrl+f ;) .

11 września 2008, 20:28:35

#

Uzytkownik

Bugreport przyjęty ;) tak to jest gdy skrypt rozwija się na 2 systemach bez gita…

11 września 2008, 20:31:17

Dodaj komentarz

Textile Lite włączony ( szczegółowy opis znaczników ):