Herramientas de usuario

Herramientas del sitio


manuales:servidor_dhcp

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisiónAmbos lados, revisión siguiente
manuales:servidor_dhcp [2010/03/22 14:49] – creado cayumanuales:servidor_dhcp [2010/11/17 15:06] cayu
Línea 2: Línea 2:
  
 Veremos como configurar un servidor DHCP con alta disponibilidad y configuracion replicada por medio de Cscync2 Veremos como configurar un servidor DHCP con alta disponibilidad y configuracion replicada por medio de Cscync2
 +
 +===== Notas =====
 +
 +Script para verificar la cantidad de leases activos expirados y abandonados
 +
 +<code perl>
 +#!/usr/bin/perl
 +#
 +# script to list active, expired and abandoned leases.
 +#
 +# Original script received by Ian Jones, ltjones@hawkeye.ualr.edu
 +#
 +# Current Version by Rainer Krienke, krienke@uni-koblenz.de
 +# Version 1.0
 +# Added: - output in local timezone
 +#        - output in HTML  using -w option 
 +#        - eliminate double entries for same ip address
 +#
 +# TL: Rework for nslu2/thttpd cgi script.
 +#     Rewrite parse to deal with ddns lines.
 +# Break out clients & addresses.
 +#     Install in /opt/bin/leaseholders.txt
 +#     Add a script to copy to /home/httpd/html/leaseholders.cgi
 +
 +use Getopt::Std;
 +use Date::Manip;
 +use CGI;
 +
 +# Look for Options
 +$res=getopts('wh');
 +
 +# Echo help message 
 +if( $opt_h || $res =="" ){
 + die "$0 [-w]  List active and expired DHCP leases \n",
 +     "\tOptions:\n",
 +     "\t -w: output is not written in HTML format.\n\n";
 +}
 +
 +$abandonedc = 0;
 +$leasesc = 0;
 +$expiredc = 0;
 +
 +# Find local host name -- from IP address if possible.
 +
 +$ipName = `localhost`;
 +open(CFG, "/etc/sysconfig/network-scripts/ifcfg-ixp0");
 +while ($line = <CFG>) {
 + next if ( $line =~ /^\s*#/o );
 + $mline = $line;
 +        chomp($mline);
 + @wds = split( '=',$mline);
 + next if ( $wds[0] ne "IPADDR" );
 + $ipAddr = $wds[1];
 + @numbers = split(/\./, $ipAddr);
 + $ip_number = pack("C4", @numbers);
 + ($ipName) = (gethostbyaddr($ip_number, 2))[0];
 +}
 +close(CFG);
 +chomp($localhost = $ipName);
 +
 +#
 +# Format (see man date) in that the expiration date is echoed.
 +# Select the format of your choice. If you want the lease time to 
 +# be printed in amarican style put a comment char ``#'' right in 
 +# front of the first $outputDateFormat line and remove it from the
 +# second one.
 +#
 +# European Style date
 +#$outputDateFormat="%H:%M:%S %d.%m.%Y ";
 +
 +# American style date
 +$outputDateFormat="%m/%d/%Y %H:%M:%S";
 +
 +# ### point this to your dhcpd.leases ###
 +# /etc/dhcpd.leases and /var/state/dhcpd/dhcpd.leases 
 +# will be seachred by default.
 +#
 +$LEASEFILE = "/var/lib/dhcpd/dhcpd.leases";
 +if( ! -r $LEASEFILE ){
 + if( -r "/etc/dhcpd.leases" ){
 + $LEASEFILE="/etc/dhcpd.leases";
 + }else{
 + die "Cannot find \"dhcpd.leases\" file \n";
 + }
 +}
 +
 +# ### get universal date from system    ###
 +#
 +$xTZ = &ParseDate("now");
 +$tz=&Date_TimeZone;
 +$x=Date_ConvTZ($xTZ, $tz, "UTC");
 +
 +open(LEASES, "$LEASEFILE") or die "Can't open $LEASEFILE";
 +$inlease = 0;
 +
 +while ($line = <LEASES>) {
 + next if( $line =~ /^\s*#/o );
 + $mline = $line;
 +      chomp($mline);
 + $mline=~ s/  / /g;
 +
 + @wds = split( ' ',$mline);
 + if( !$inlease ) {
 + # Look for a lease record
 + next if( $wds[0] ne "lease" );
 + $ipAddr = $wds[1];
 + @numbers = split(/\./, $ipAddr);
 + $ip_number = pack("C4", @numbers);
 + ($ipName) = (gethostbyaddr($ip_number, 2))[0];
 + if ($ipName) {
 +    ;
 + } else {
 +    $ipName = "<unknown>";
 + }
 + $startDt = "<unknown>";
 + $endDt = "<unknown>";
 + $endNever = 0;
 + $ddnsClient = "<unknown>";
 + $ethAddr = "<unknown>";
 + $hostName = "<unknown>";
 + $leaseState = "<unknown>";
 + $leaseAbandoned = 0;
 + $inlease = 1;
 + next;
 + }
 + # Parse each clause in lease
 + if( $wds[0] eq "starts" ) {
 + $startDt = join( ' ', $wds[2], $wds[3] );
 + $startDt=~s/;\s*$//;
 + # Parse Date in Date::Manip internel format
 + $startDtUTC=ParseDate($startDt);
 + #
 + # Convert it to local timezone
 + $startDtTZ=Date_ConvTZ($startDtUTC,"UTC", $tz);
 + #
 + # Finally make a human readable date string out of it
 + $startDt=UnixDate($startDtTZ, ($outputDateFormat) ) ;
 + next;
 + }
 + if( $wds[0] eq "ends" ) {
 + if( $wds[2] eq "never" ) {
 + $endDt = "2999\/01\/01 12:00:00";
 + $endNever = 1;
 + } else {
 + $endDt = join( ' ', $wds[2], $wds[3] );
 + $endDt=~s/;\s*$//;
 + }
 + # Parse Date in Date::Manip internel format
 + $endDtUTC=ParseDate($endDt);
 + #
 + # Convert it to local timezone
 + $endDtTZ=Date_ConvTZ($endDtUTC,"UTC", $tz);
 + #
 + # Finally make a human readable date string out of it
 + $endDt=UnixDate($endDtTZ, ($outputDateFormat) ) ;
 + next;
 + }
 + if( $wds[0] eq "hardware" ) {
 + $ethAddr = $wds[2];
 + $ethAddr=~s/;\s*$//;
 + next;
 + }
 + if( $wds[0] eq "client-hostname" ) {
 + $hostName = $wds[1];
 + $hostName=~s/;\s*$//;
 + $hostName=~ s/"//g;
 + next;
 + }
 + if( $wds[0] eq "binding" ) {
 + $leaseState = $wds[2];
 + $leaseState=~s/;\s*$//;
 + next;
 + }
 + if( $wds[0] eq "set" ) {
 + if( $wds[1] eq "ddns-client-fqdn" ) {
 + $ddnsClient = $wds[3];
 + $ddnsClient=~s/"//g;
 + }
 + }
 + if( $wds[0] eq "abandoned;" ) {
 + $leaseAbandoned = 1;
 + next;
 + }
 + if( $wds[0] ne "}" ) {
 + next;
 + }
 +
 + ## End of lease data, generate output
 +
 + $inlease = 0;
 +
 + if( $ipName eq "<unknown>" ) {
 + $ipName = $ddnsClient;
 + }
 +
 + $endDt = "dyn-bootp: never" if( $endNever );
 + $lease = sprintf "%-17s %-15s %-19s %-19s %-25s %s\n",
 +                         $ethAddr,
 +                         $ipAddr,
 +                         $startDt,
 +                         $endDt,
 +                         $hostName,
 +                         $ipName;
 +
 + $ClientLeases{$ethAddr} = $lease;
 + $ClientLeaseTime{$ethAddr} = $endDtUTC;
 + $ClientLeaseState{$ethAddr} = $leaseState;
 +
 + if( $leaseAbandoned ) {
 + # Unexpectedly found someone with this address
 + $AbandonedAddresses[$abandonedc++] = $lease;
 + next;
 + }
 +
 + if( $leaseState eq "active" ) {
 + $ActiveLeases{$ipAddr} = $lease;
 + } else {
 + $ExpiredLease{$ipAddr} = $lease;
 + }
 +}
 +
 +close(LEASES);
 +
 +if( !$opt_w ){
 + $|=1;
 + $q = new CGI;
 + print $q->header('text/html');
 + print $q->start_html( -title=>"DHCP status on $localhost",
 +       -expires=>'+5s',
 +       -status=>'200 OK',
 +       -BGCOLOR=>'white' );
 + print "<PRE>\n";
 +}
 +
 +# Sort each hash & return the keys for in-order access
 +
 +@ClientKeys = sort(keys(%ClientLeases)); # MAC address order
 +@ActiveKeys = sort(keys(%ActiveLeases)); # IP address order
 +@ExpiredKeys = sort(keys(%ExpiredLeases)); # IP address order
 +@abandoned = sort(@abandoned); # MAC, IP address (?)
 +
 +$xDate=UnixDate($xTZ, ($outputDateFormat) ) ;
 +print "DHCP leases issued by $localhost as of $xDate\n";
 +
 +$actc = 0;
 +print "\nActive Clients:";
 +foreach $i  ( @ClientKeys ) {
 + next if( $ClientLeaseState{$i} ne "active" );
 +
 + if( $actc++ == 0 ) {
 + print "\nEthernet Address";
 +                print "     IP Address";
 +                print "     Lease Issue Time";
 +                print "    Expiration Time";
 +                print "       Client Hostname";
 +                print "       DNS Hostname\n";
 + print "-----------------";
 +                print " ---------------";
 +                print " -------------------";
 +                print " -------------------";
 +                print " -------------------------";
 +                print " --------------------";
 +                print "---------------------\n";
 + }
 + print $ClientLeases{$i};
 +}
 +if( $actc == 0 ) {
 + printf " None\n";
 +} else {
 + printf "Total active clients: %d\n", $actc;
 +}
 +
 +$iactc = 0;
 +print "\nInactive Clients:";
 +foreach $i  ( @ClientKeys ) {
 + next if( $ClientLeaseState{$i} eq "active" );
 +
 + if( $iactc++ == 0 ) {
 + print "\nEthernet Address";
 +                print "     IP Address";
 +                print "     Lease Issue Time";
 +                print "    Expiration Time";
 +                print "       Client Hostname";
 +                print "       DNS Hostname\n";
 + print "-----------------";
 +                print " ---------------";
 +                print " -------------------";
 +                print " -------------------";
 +                print " -------------------------";
 +                print " --------------------";
 +                print "---------------------\n";
 + }
 + print $ClientLeases{$i};
 +}
 +if( $iactc == 0 ) {
 + printf " None\n";
 +} else {
 + printf "Total inactive clients: %d\n", $iactc;
 +}
 +
 +$actn = 0;
 +print "\nActive Addresses:";
 +foreach $i  ( @ActiveKeys ) {
 + if( $actn++ == 0 ) {
 + print "\nEthernet Address";
 +                print "     IP Address";
 +                print "     Lease Issue Time";
 +                print "    Expiration Time";
 +                print "       Client Hostname";
 +                print "       DNS Hostname\n";
 + print "-----------------";
 +                print " ---------------";
 +                print " -------------------";
 +                print " -------------------";
 +                print " -------------------------";
 +                print " --------------------";
 +                print "---------------------\n";
 + }
 + print $ActiveLeases{$i};
 +}
 +if( $actn == 0 ) {
 + printf " None\n";
 +} else {
 + printf "Total Active: %d\n", $actn;
 +}
 +
 +$expn = 0;
 +print "\nExpired Leases:";
 +foreach $i  ( @ExpiredKeys ) {
 + @wds = split( ' ', $ExpiredLeases{$i});
 + if( !defined($ActiveLeaseTime{$wds[1]}) ) {
 + if( $expn++ == 0 ) {
 + print "\nEthernet Address";
 +                 print "     IP Address";
 + print "     Lease Issue Time";
 + print "    Expiration Time";
 + print "       Client Hostname";
 + print "       DNS Hostname\n";
 + print "-----------------";
 + print " ---------------";
 + print " -------------------";
 + print " -------------------";
 + print " -------------------------";
 +                        print " --------------------";
 +                        print "---------------------\n";
 + }
 + print $ExpiredLeases{$i};
 + }
 +}
 +if( $expn == 0 ) {
 + printf " None\n";
 +} else {
 + printf "Total expired: %d\n", $expn;
 +}
 +
 +$abdn = 0;
 +print "\nAbandoned Addresses:";
 +foreach $i  ( @abandoned ) {
 + if( $abdn++ == 0 ) {
 + print "\nEthernet Address";
 +                print "     IP Address";
 +                print "     Lease Issue Time";
 +                print "    Expiration Time";
 +                print "       Client Hostname";
 +                print "       DNS Hostname\n";
 + print "-----------------";
 +                print " ---------------";
 +                print " -------------------";
 +                print " -------------------";
 +                print " -------------------------";
 +                print " --------------------";
 +                print "---------------------\n";
 + }
 + print $i;
 +}
 +if( $abdn == 0 ) {
 + printf " None\n";
 +} else {
 + printf "Total abandoned: %d\n", $abdn;
 +}
 +
 +printf "\n";
 +
 +if( !$opt_w ){
 + print "</PRE>\n";
 + $me = $q->url();
 + print $q->a({href=>$me},"Refresh");
 + print $q->br();
 + print $q->a({href=>"/"}, "Home Page");
 + print $q->end_html;
 +}
 +# Last line of /opt/bin/leaseholders.cgi
 +</code>
 +
manuales/servidor_dhcp.txt · Última modificación: 2010/12/01 15:12 por cayu