#!/usr/bin/perl # dhcphosts.pl - by dual # # Generates an /etc/hosts file for a # box on a DHCP network # # - Simply call it in /etc/rc.local. # - Depends on Nmap::Parser. #################################### # Include Nmap::Parser ###################### use strict; use Nmap::Parser; # Declare and set variables ########################### my $ip; my $fqn; my $dmain; my $tld; my $host; my $path = '/usr/bin/nmap'; my $args = '-sP'; my @ips = qw/192.168.1.100-109/; my $ip_addr; my $mac_addr; # Obtain local info ################### my @ifconfig = `/sbin/ifconfig eth1`; foreach my $line (@ifconfig) { $ip = $1 if ($line =~ /inet addr:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/); } open NETWK, ") { $fqn = $1 if ($_ =~ /^HOSTNAME=(.+)$/); } close NETWK; my @names = split (/\./, "$fqn"); $host = $names[0]; $dmain = $names[1]; $tld = $names[2]; # Clobber /etc/hosts #################### open HOSTS, ">/etc/hosts" or die "Can't open hosts: $!"; # Print local info ################## print HOSTS "# Generated by dhcphosts.pl\n\n"; print HOSTS "# Gotta have loopback\n"; print HOSTS "127.0.0.1\tlocalhost.localdomain\tlocalhost\n\n"; print HOSTS "# This box...\n"; print HOSTS "$ip\t$fqn\t$host\n\n"; print HOSTS "# Remaining network hosts\n"; # Scan, parse and print the remaining network ############################################# my $nmap = new Nmap::Parser; $nmap->parsescan ($path, $args, @ips); for my $host ($nmap->all_hosts()) { $ip_addr = $host->addr; $mac_addr = $host->mac_addr; if ($mac_addr =~ /.{2}:.{2}:.{2}:.{2}:.{2}:.{2}/) { # Fill in your MACs and hostnames here if ($mac_addr =~ /XX:XX:XX:XX:XX:XX/) { print HOSTS "$ip_addr\thostname1.$dmain.$tld\thostname1\n"; } elsif ($mac_addr =~ /XX:XX:XX:XX:XX:XX/) { print HOSTS "$ip_addr\thostname2.$dmain.$tld\thostname2\n"; } elsif ($mac_addr =~ /XX:XX:XX:XX:XX:XX/) { print HOSTS "$ip_addr\thostname3.$dmain.$tld\thostname3\n"; } elsif ($mac_addr =~ /XX:XX:XX:XX:XX:XX/) { print HOSTS "$ip_addr\thostname4.$dmain.$tld\thostname4\n"; } } } # Clean up ########## close HOSTS;