Nowe posty

Autor Wątek: Problem z zapetleniem  (Przeczytany 3319 razy)

Offline Piotr Marciniszyn

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
Problem z zapetleniem
« dnia: 2006-06-06, 20:55:16 »
Zainstalowałem sobie Mandrive 2006 PL - jest to mój pierwszy LINUX. Nie posiada on sterowników do tego urządzenia. Czy jest możliwość \\"ręcznego\\" dodania sterowników? I ewentualnie jak je dodać? Jakieś propozycje?

Offline michal wojnowski

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 37
    • Zobacz profil
Problem z zapetleniem
« Odpowiedź #1 dnia: 2006-06-06, 18:13:54 »
Witam mam problem z zapetleniem czesci kodu.
Mianowicie pisze skrypt startowy do linuxa w ktorym mamy do wyboru kilka opcji dotyczacych nadawania adresu IP badz z serwera DHCP lub wpisanego recznie.

Problem polega na tym ze jezeli ades IP bedzie wartoscia nieprawdziwa (za duzo cyfr, oktety powyzej 255 itp) program ma sie zatrzymac i powrocic do wpisania ponownie zle wpisanego adresu ip.
Ponizej zamieszczam czesc kodu ktora odpowiada za reczne wpisanie adresu oraz procedure sprawdzajaca prawdziwosc IP.

# Start manual conf dla eth0



       if ($wybor eq 4)
        {
while(1)
{
# Pobierz adres IP dla interfejsu
        print "Podaj adres IP: ";
        $adres_ip = ;
        chomp $adres_ip;
      if ($adres_ip) {

        check_ip_addr();
      }
# Pobranie Maski Podsieci
        print "Podaj maske podsieci: ";
        my $maska_podsieci = ;
        chomp $maska_podsieci;

        check_ip_addr();

# podaj adres Bramy
        print "Podaj adres bramy: ";
        my $brama = ;
        chomp $brama;

        check_ip_addr();

# Pobierz adres serwera DNS
        print "Podaj adres primary DNS: ";
        my $dns_1 = ;
        check_ip_addr();
        print "Podaj adres secondary DNS: ";
        my $dns_2 = ;
        check_ip_addr();

        my $konfig = `/sbin/ifconfig eth0 $adres_ip $maska_podsieci`;
        my $bramka = `/sbin/route add default gw $brama`;

# Dopisz adresy DNS do /etc/resolv.conf

        my $plik = "/etc/resolv.conf";
        open FILE, ">$plik" or die "Otwarcie pliku '$plik' do zapisu nie powiodlo sie: $! ";
        print FILE "nameserver $dns_1";
        print FILE "nameserver $dns_2";
        close FILE;

        }
}
}

sub check_ip_addr
{

 if ($adres_ip =~ /^(dd?d?).(dd?d?).(dd?d?).(dd?d?)$/)
 {
 my @table = ($1, $2, $3, $4);
   foreach $octect (@table)
    {
      if ($octect le 255)
      {
       last;
      } else
        {
          print ("You write wrong IP ADDRESSn");

        }
    }

 }

 else
{
  print ("You write wrong IP ADDRESSn");
}

}



Offline de Laurent

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1197
    • Zobacz profil
Problem z zapetleniem
« Odpowiedź #2 dnia: 2006-06-07, 19:57:25 »
Nie jestem hakerem perla, ale sprobuje ci pomoc. Chcialbym jednak zebys sprecyzowal co jest problemem, bo z postu nie wynika to jednoznacznie.
Zrozumialem tylko, ze problem masz z petla, ale nie zrozumialem jaki...

Moge sie domyslac, ze zadaniem programu jest: pytanie o ip, dns, route, itd... pozniej w zaleznosci od tego czy zostana podane poprawne wartosci, przechodzi dalej, w przypadku bledu w jednej z nich pyta _tylko_ o ta wartosc i konczy sie..? Czy tak?

Pozdro

Offline Jakub Zalas

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 534
    • Zobacz profil
Problem z zapetleniem
« Odpowiedź #3 dnia: 2006-06-12, 16:13:26 »
Nie dziw si*, *e program si* zap*tla, bo nigdzie p*tli nie przerywasz :) Do tego funkcja check_ip_addr jest *le napisana (np sprawdza tylko pierwsz* poprawn* liczb* z adresu ip).

Spr*buj mo*e rozwi*za* ten problem na takie zasadzie (oczywi*cie dostosuj go do swoich potrzeb):

my $adres_ip = pobierz_ip("Podaj adres IP: ");
my $maska = pobierz_ip("Podaj mask* podsieci: ");

sub pobierz_ip
{
        my $message = shift;
        my $ip = "";

        while(1)
        {
                print $message."n";

                $ip = ;

                chomp $ip;

                my $regexp = "([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])";

                if($ip !~ /^$regexp.$regexp.$regexp.$regexp$/)
                {
                        print "Niew*a*ciwy adres IP!!n";
                        next;
                }

                last;
        }

        return $ip;
}

Mo*esz te* u*y* gotowych modu**w perla do walidacji IP, co skr*ci znacznie skrypt. Poczytaj na przyk*ad to: http://search.cpan.org/~neely/Data-Validate-IP-0.04/lib/Data/Validate/IP.pm

Offline Jakub Zalas

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 534
    • Zobacz profil
Problem z zapetleniem
« Odpowiedź #4 dnia: 2006-06-12, 16:14:52 »
Przepraszam za polskie znaki :/