Benutzer:Kirmse/delixs-hostlist

Aus Delixs
Zur Navigation springen Zur Suche springen

delixs-hostlist

  • dieses Script listet alle DHCP-Hosts für einen Pool (Raum) auf
  • Parameter: --help oder -h, --tnetz oder -t, -pool oder -p
  • Aufruf: delixs-hostlist -p chemie

das Teilnetz muss normalerweise nicht angegeben werden. Voreinstellung ist '10.100.0.0'. Das Script wird also normalerweise nur mit dem Parameter für den Pool (Raum) aufgerufen.


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

use Net::LDAP; use Getopt::Long;


my ($ldap, $ldap_base, $entry, $mesg, $teilnetz, $vorgabe_teilnetz, $temp,

   $poolname, @temp);

$vorgabe_teilnetz = '10.100.0.0';


  1. Initialisieren der Variablen fuer die Parameter

$teilnetz = ; $poolname = ;

  1. wir holen uns zuerst die Parameter,
  2. falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden

GetOptions('tnetz=s'=> \$teilnetz,

          'pool=s' => \$poolname,
          'help'   => \&help);

  1. Wenn kein Parameter -p oder --poolname uebergeben wurde, dann Abbruch

if ($poolname eq ) {

 die "Abbruch: es wurde kein Name fuer die Rechnergruppe uebergeben!\n";

}

  1. Wenn der Poolname nicht den (meinen) Konventionen entspricht, dann Abbruch

unless ($poolname =~ /^[a-zA-Z]\w{1,10}$/) {

 die "Abbruch: Der Name fuer die Rechnergruppe ist nicht korrekt!\n";

}

  1. Wenn Parameter Teilnetz uebergeben, dann kontrollieren

unless ($teilnetz eq ) {

 # ob richtiges Format 
 unless ($teilnetz =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.0$/) {
   die "Abbruch: Das Teilnetz $teilnetz ist keine gueltige Angabe!\n"
 }

}

  1. Wenn der Parameter nicht uebergeben

else {

 # dann setzen wir das Teilnetz
 $teilnetz = $vorgabe_teilnetz;  

}

  1. wir holen uns die Such-Basis ($ldap_base) aus der ldap.conf

open DATEI, '<', '/etc/ldap/ldap.conf'

 or die "Abbruch: konnte ldap.conf nicht oeffnen, $!\n";

while (my $zeile = <DATEI>) {

 if ($zeile =~ m/^\s*base\s+(\w.*\w)\s*$/i) {
   $ldap_base = $1;
   last;
 }

} close DATEI;

  1. wir verbinden uns mit dem LDAP

$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@"; $ldap->bind or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";

  1. wir ueberpruefen, ob das Teilnetz im LDAP existiert

$mesg = $ldap->search(base => "cn=$teilnetz,cn=DHCP Config,$ldap_base",

                     filter => "cn=$teilnetz");
  1. wenn wir keinen Eintrag erhalten haben, dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Das Teilnetz $teilnetz existiert nicht im LDAP!\n";

}

  1. Wir ueberpruefen, ob der Pool im LDAP existiert

$mesg = $ldap->search(

         base   => "cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base", 
         filter => "cn=$poolname");
  1. Wenn der Pool nicht gefunden wird dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Der Pool $poolname existiert nicht im LDAP!\n";

}

  1. wir holen uns von diesem Pool die DHCP-Hosts

$mesg = $ldap->search(

         base   => "cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base", 
         filter => 'objectClass=dhcpHost',
         attrs  => ['cn', 'dhcpStatements'] );
  1. wir trennen uns vom LDAP

$ldap->unbind;


  1. wir geben die Hosts aus

if (scalar ($mesg->entries) > 0) {

 foreach my $entry ($mesg->entries) {
   $temp   = $entry->get_value('dhcpStatements');
   ($temp) = $temp =~ /^fixed-address (.*)$/; 
   push @temp, $entry->get_value('cn'). ': ' . $temp ;
 }
 @temp = sort { &ip_vergleich($a,$b) } @temp;
 foreach my $element (@temp) {
   print $element, "\n";
 } 

} else {

 print "Warnung: keinen DHCP-Host im Pool $poolname gefunden!\n";

}

                                      1. Programm-Ende #####################################
  1. Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden

sub help {

  print "Hilfe muss noch erstellt werden.\n";
  exit (0);

}

  1. bei den (festen) IPs in einem Pool unterscheidet sich nur das letzte Oktett

sub ip_vergleich {

 my $ip1 = shift;
 my $ip2 = shift;
 my ($str, $temp1, $temp2, @oktetts1, @oktetts2);
 
 ($str, $temp1) = split /: /, $ip1;  # den Name abtrennen (verwerfen)
 ($str, $temp2) = split /: /, $ip2;  # den Name abtrennen (verwerfen)
 
 @oktetts1 = split /\./, $temp1;     # die IP an dem Punkt splitten 
 @oktetts2 = split /\./, $temp2;     # die IP an dem Punkt splitten
 
 return  $oktetts1[3] <=> $oktetts2[3];   # das Ergebnis ist -1, 0, 1  

}


__END__

</source>