[Cologne-pm] Sachen, die die Welt nicht braucht, brauchen Deine Hilfe

Michael Lamertz mike at lamertz.net
Fri Apr 11 07:37:58 CDT 2003


On Fri, Apr 11, 2003 at 10:08:04AM +0200, Cem Sakaryali wrote:
> Hallo alle,
> 
> neulich beim surfen habe ich mir die Frage gestellt,
> "wie viele zugelassene de Domainnamen mit 3 Zeichen geben wurde"

War da nicht schon vor 2 Jahren oder so 'was auf /.?  Ich glaube die 2-
und 3-Buchstabigen Kombinationen sind bis auf ganz wenige Ausnahmen
*alle* weg.  :)

> @a=(a..z,1..9); 3 er loop; ping ; ja/nein;
> 
> lief auch gut aber Net::Ping gibt nicht immer die richtige
> Antwort. z.B www.ihi.de.

Klar.  Viele Sysadmins schalten Ping ab, weil es ja Information ueber
die Netzinfrastruktur liefert - ueber den Sinn oder Unsinn laesst sich
viel und lautstark streiten.

> Jetzt habe ich auf Net::DNS umgestellt. Scheint zu funktionieren
> moechte aber die Meinung unserer Experten einholen bevor ich die
> Untersuchung starte.

'whois' waere auch eine Moeglichkeit, allerdings haettest Du da das
Problem, dass sich die einzelnen Institutionen nicht immer abgleichen.
Wenn Du's nur fuer die .de-Zone machst dann bist Du natuerlich beim
DeNIC hinreichend bedient.  Ein weiteres Problem von whois ist, dass die
NICs normalerweise die Anzahl der Anfragen pro Zeit begrenzen um es den
Domain-Squatter-Bots ein wenig schwerer zu machen - was aber nicht
wirklich hilft.

DNS scheint mir da schon das Richtige zu sein.

Die Entscheidung den SOA anzufragen war auf jeden Fall die Richtige, da
Hostnamen ja willkuerlich vergeben werden.  Der SOA-Record gilt fuer die
gesamte Zone, deshalb wuerde ich den Hostnamen selber (www.) einfach
weglassen.

> #use Net::Ping;
> use Net::DNS;
> my @a=(a..z,1..9); 
> my @b=(a..z,1..9); 
> my @c=(a..z,1..9); 

Wieso 3 Arrays wenn Du keine Zuweisungen vornimmst?

> $|=1;
> open (A,">report.txt");

Ich mach' sowas immer nach stdout, aber das ist wohl Geschmachsache.
Schoen ist immer folgendes Konstrukt:

    ---------- snip ----------
    #!/usr/bin/perl -s

    use vars /$o/;

    open STDOUT, ">$o" or die "Cannot redirect STDOUT: $!\n" if $o;
    print "This goes into the log if the script is called with -o=filename\n";
    ...
    ---------- snip ----------

> print A "hostname\t\t1:exsists, 0:does not exists\n";
> print A "----------------------------------------------------\n";

Hmmm, I smell formats...

> foreach my $a (@a) {
>     foreach my $b (@b) {
>         foreach my $c (@c) {

Schade, wenn's nur Buchstaben waeren ginge auch

    ---------- snip ----------
    foreach my $zone ('aaa' .. 'zzz') {
        ...
    }
    ---------- snip ----------

Bring perl6 nicht Iterator-Funktionen?

>             $status=-1;

Hmmm, warum?  Der Abschnitt 'if ($query) ... else ...' laesst doch keine
Alternativen zu 0 oder 1 zu.  Wenn Du das Beduerfnis hast, den Kram
vorzudeklarieren, dann setz' wenigstens noch ein 'my' davor :)

>             my $host='www.'.$a.$b.$c.'.de';

Siehe Kommentar weiter oben.  Das 'www' wuerde ich nicht dazunehmen.
Woher weisst Du, dass die einen Webserver betreiben?  Woher weisst Du,
dass der auch 'www' heisst.  Der SOA-Record gilt fuer die ganze Zone, da
brauchst Du keinen expliziten Hostnamen.

>             my $res   = Net::DNS::Resolver->new;

Muss man das Objekt jedesmal wieder neu erzeugen?  Das kannst Du
ausserhalb der Schleife einmal machen.  Ich wuerd's umbenennen in
'$dns', da viele Leute '$res' eher als 'result' benutzen.

>             my $query = $res->query($host, "SOA");
>             if ($query) {$status=1}
>             else {$status=0}

    ---------- snip ----------
    $status = defined $q;
    ---------- snip ----------

>             print A  "host:$host\t\t$status\n";
>             print   "host:$host\t\t$status\n";

Ah, deshalb das explizite 'open'?  Ok.

Das geht uebrigens auch mit 'ner Pipe wenn Du 

    perl DeinScript.pl | tee logfile.txt

aufrufst.


Fazit:

    * Optional den STDOUT-Redirect und 'perl -s'

    * Net::DNS::Resolver aus der Schleife 'rausziehen

    * Kein Test auf Hostnamen

    * Evtl. 'format' um 'mal was neues kennen zu lernen

    * Ueberfluessige Zuweisungen 'raus und notwendige vereinfachen

Zu formats:

    ---------- snip ----------
    # These are globally predeclared because 'format's work only on globals :(
    our ($zone, $status);

    foreach $zone (somehow_create_the_zone_list()) {
        $zone = $a . $b . $c;
        my $query = $dns->query("$zone.de", 'SOA');
        $status = $query ? "connected" : "not connected";

        write;
    }

    format STDOUT_TOP =
    zone          status
    ===========================
    .

    format STDOUT =
    @<<<<<        @>>>>>>>>>>>>
    $zone,        $status
    .
    ---------- snip ----------

Ist zwar in diesem Zusammenhang nicht 100% sinnvoll, aber wenn man 'mal
weiss wie formate funktionieren, koennen sie manchmal ganz praktisch
sein fuer die Report-Erzeugung.

BTW: perl6 wird keine eingebauten Formate mehr haben, aber das wird dann
wohl durch ein Modul ersetzt.

Mike

-- 
	    Well, then let's give that Java-Wussie a beating... (me)

Michael Lamertz                        |     +49 2234 204947 / +49 171 6900 310
Sandstr. 122                           |                       mike at lamertz.net
50226 Frechen                          |                 http://www.lamertz.net
Germany                                |               http://www.perl-ronin.de 



More information about the Cologne-pm mailing list