#!/usr/bin/perl # # Module: vyatta-show-dhclient.pl # # **** License **** # Version: VPL 1.0 # # The contents of this file are subject to the Vyatta Public License # Version 1.0 ("License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at # http://www.vyatta.com/vpl # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # # This code was originally developed by Vyatta, Inc. # Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc. # All Rights Reserved. # # Author: Stig Thormodsrud # Date: January 2008 # Description: Script to display dhcp client lease info # # **** End License **** # use lib "/opt/vyatta/share/perl5/"; use POSIX; use strict; use warnings; my $lease_dir = '/var/lib/dhcp3'; sub dhclient_get_lease_files { my ($intf) = @_; # todo: fix sorting for ethX > 9 my @lease_files; my $LS; if ($intf eq "all") { my $file = "dhclient_eth"; open($LS,"ls $lease_dir |grep '^$file.*\_lease\$' | sort |"); } else { my $file = "dhclient_$intf"; open($LS,"ls $lease_dir |grep '^$file\_lease\$' | sort |"); } @lease_files = <$LS>; close($LS); foreach my $i (0 .. $#lease_files) { $lease_files[$i] = "$lease_dir/$lease_files[$i]"; } chomp @lease_files; return @lease_files; } sub dhclient_parse_vars { my ($file) = @_; my %var_list; if ( !(-f $file)) { return %var_list; } open(FD, "<$file"); my $line; $line = ; chomp $line; $var_list{'last_update'} = $line; while ($line = ) { chomp $line; if ($line =~ m/(\w+)=\'([\w\s.]+)\'/) { my $var = $1; my $val = $2; $var_list{$var} = $val; } } close(FD); return %var_list; } sub dhclient_show_lease { my ($file) = @_; my %var_list = dhclient_parse_vars($file); my $last_update = $var_list{'last_update'}; my $reason = $var_list{'reason'}; my $interface = $var_list{'interface'}; my $new_expiry = $var_list{'new_expiry'}; my $new_dhcp_lease_time = $var_list{'new_dhcp_lease_time'}; my $new_ip_address = $var_list{'new_ip_address'}; my $new_broadcast_address = $var_list{'new_broadcast_address'}; my $new_subnet_mask = $var_list{'new_subnet_mask'}; my $new_domain_name = $var_list{'new_domain_name'}; my $new_network_number = $var_list{'new_network_number'}; my $new_domain_name_servers = $var_list{'new_domain_name_servers'}; my $new_routers = $var_list{'new_routers'}; my $new_dhcp_server_identifier = $var_list{'new_dhcp_server_identifier'}; my $new_dhcp_message_type = $var_list{'new_dhcp_message_type'}; my $old_ip_address = $var_list{'old_ip_address'}; my $old_subnet_mask = $var_list{'old_subnet_mask'}; my $old_domain_name = $var_list{'old_domain_name'}; my $old_domain_name_servers = $var_list{'old_domain_name_servers'}; my $old_routers = $var_list{'old_routers'}; my $new_expiry_str; if (defined $new_expiry) { $new_expiry_str = strftime("%a %b %d %R:%S %Z %Y", localtime($new_expiry)); } print "interface : $interface\n" if defined $interface; if (defined $new_ip_address) { print "ip address : $new_ip_address\t"; my $ip_active = `ip addr list $interface`; if ($ip_active =~ m/$new_ip_address/) { print "[Active]\n"; } else { print "[Inactive]\n"; } } print "subnet mask: $new_subnet_mask\n" if defined $new_subnet_mask; print "domain name: $new_domain_name\n" if defined $new_domain_name; print "router : $new_routers\n" if defined $new_routers; print "name server: $new_domain_name_servers\n" if defined $new_domain_name_servers; print "dhcp server: $new_dhcp_server_identifier\n" if defined $new_dhcp_server_identifier; print "lease time : $new_dhcp_lease_time\n" if defined $new_dhcp_lease_time; print "last update: $last_update\n" if defined $last_update; print "expiry : $new_expiry_str\n" if defined $new_expiry_str; print "reason : $reason\n" if defined $reason; print "\n"; } # # main # my $intf = 'all'; if ($#ARGV >= 0) { $intf = $ARGV[0]; } my @dhclient_files = dhclient_get_lease_files($intf); foreach my $file (@dhclient_files) { dhclient_show_lease($file); } exit 0; #end of file