#!/usr/bin/perl # # Copyright InfoStructure Solutions Inc 2011 # All rights reserved. No part of this doucment may be reproduced in any # form without the written permission of the copyright holder. # # $Id: ifFix.pl,v 1.1 2011/11/23 16:24:59 wia Exp $ # use Getopt::Long; my $dmi = "dmidecode -t 41"; my $upath = "/sys/class/net"; my $udev = "udevadm info --query=property --path=$upath"; my $rfile = "/etc/udev/rules.d/70-persistent-net.rules"; my $cfile = "/etc/sysconfig/network-scripts/ifcfg-"; die "Usage: $0 [-d] <-w>\n" if ( !GetOptions("d:1", "w", "h") || $opt_h ); sub debug (@) { warn shift || $_, "\n" if $opt_d; } if ( -e $rfile) { if ( open(RULES, $rfile) ) { my @rules = ; close RULES; if ( open(DMI, "$dmi |") ) { if ( opendir(UDIR, $upath) ) { my ($macs, $ifs, $onb); my $idx = 0; foreach my $if ( grep(/^eth/, readdir(UDIR)) ) { my $ifcfg = "$cfile$if"; if ( -e $ifcfg ) { $interfaces->{$if} = $ifcfg; debug "Found interface config '$ifcfg'"; } else { warn "Config for interface $if does not exist\n"; } } closedir UDIR; my $y; while ( ) { if (/Type:\s+(\w+)/) { $y = ($1 =~ /Ethernet/) ? 1 : 0; } elsif ($y && /Bus Address:\s+(\S+)/) { my $if = "eth".$idx++; if ( exists $interfaces->{$if} ) { debug "Found onboard eth \@ bus '$1' and setting to $if"; $onb->{$1} = $if; $y = undef; } else { warn "Found onboard eth \@ bus '$1' but there was no interface $if\n"; } } } close DMI; foreach my $if ( keys %{$interfaces} ) { if ( open(UDEV, "$udev/$if |") ) { debug "Properties for interface $if:"; my ($path, $bus, $mac); while ( ) { if ( /^DEVPATH=(\S+)/ ) { $path = $1; } elsif ( /^NET_MATCHID=(\S+)/ ) { $bus = $1; } elsif ( /^MATCHADDR=(\S+)/ ) { $mac = $1; } } if ( $mac && $bus ) { $ifs->{$if} = ( exists $onb->{$bus} ) ? $onb->{$bus} : "eth".$idx++; ($macs->{$ifs->{$if}} = $mac) =~ tr/a-f/A-F/; debug " bus = $bus, mac = $mac, path = $path -> new if = $ifs->{$if}"; } else { warn "Could not find mac($mac) and/or bus($bus) for interface $if\n"; } close UDEV; } else { warn "Could not get properties for '$if'\n"; } } if ( $opt_w ) { if ( open(RULES, ">$rfile") ) { debug "Openned '$rfile for write'"; select RULES; } else { warn "Could not open rules file '$rfile' for writing\n"; } } else { print "\ncat <$rfile\n"; } foreach my $line ( @rules ) { chomp $line; if ( $line !~ /^\s*(:?#.*)?$/ ) { my $newLine; foreach my $par ( split(/\s*,\s*/, $line ) ) { if ( $par =~ /^NAME="([^"]+)"/ ) { if ( exists $ifs->{$1} ) { if ( $ifs->{$1} eq $1 ) { $newLine = undef; last; } else { $par = qq|NAME="$ifs->{$1}"|; } } } $newLine = ($newLine) ? join(', ', $newLine, $par) : $par; } if ( $newLine ) { print "# $line\n"; print "$newLine\n" } else { print "$line\n"; } } else { print "$line\n"; } } if ( $opt_w ) { close RULES; select STDOUT; } else { print "EOF\n" unless $opt_w; } foreach my $if ( keys %{$interfaces} ) { if ( open(RI, $interfaces->{$if} ) ) { @cfg = ; close RI; } else { warn "Could not read ifcfg '$interfaces->{$if}\n"; } if ( $opt_w ) { if ( open(WI, ">$interfaces->{$if}") ) { debug "Openned '$interfaces->{$if} for write'"; select WI; } else { warn "Could not open ifcfg '$interfaces->{$if}' for writing\n"; } } else { print "\ncat <$interfaces->{$if}\n"; } foreach my $line ( @cfg ) { if ( $line =~ /HWADDR="?([^\s"]+)/ ) { debug "Check $1 =? $macs->{$if}\n"; if ( $1 eq $macs->{$if} ) { print $line; } else { print "# $line"; print qq|HWADDR="$macs->{$if}"\n|; } } else { print $line; } } if ( $opt_w ) { close WI; select STDOUT; } else { print "EOF\n" unless $opt_w; } } } else { warn "Could not read '$upath'\n"; } } else { warn "Could not run '$dmi'\n"; } close RULES; } else { warn "Could not open '$rules'\n"; } } else { warn "No rules file '$rules'\n"; }