免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3109 | 回复: 2
打印 上一主题 下一主题

perl-MAC地址比较算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-21 14:56 |只看该作者 |倒序浏览
一服务器有eth0..eth7八块网口,网口与mac的对应关系如下
eth0  F0:4D:A2:08:79:71
eth1  F0:4D:A2:08:79:73
eth2  00:1B:21:64:16:F4
eth3  00:1B:21:64:16:F5
eth4  00:1B:21:64:16:F0
eth5  00:1B:21:64:16:F1
eth6  F0:4D:A2:08:79:75
eth7  F0:4D:A2:08:79:77


对应知道eth2,eth4处于up running状态,比如需要根据eth2的mac地址,找出离eth2 mac最接近的大 (diff1)或者小(diff2)的mac地址,并计算出差值diff1,diff2,然后取小值min(diff1,diff2)。谁能用perl分析下怎么实现这一需求。


谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-12-21 15:01 |只看该作者
比如和eth2 mac相近的有eth3和eth5,可以看出eth3和eth2的mac最相近。

论坛徽章:
0
3 [报告]
发表于 2010-12-21 17:30 |只看该作者
#!/usr/bin/perl
my $conf = "/tmp/ip.conf";
my $internal_ip;
my $internal_mask;
my $external_ip;
my $external_mask;
my $external_gateway;
open(FH,"<",$conf) or die $!;
while(<FH>
{
        chomp;
        next if(/^\s+$/);
        my @line = split /\s+/,$_;
        if(scalar @line != 2)
        {
                ($external_ip,$external_mask,$external_gateway) = @line;
        }
        else
        {
                ($internal_ip,$internal_mask) = @line;
        }
}

print "|------------------Global Settings------------------|\n";
print "\t\$external_ip = $external_ip\n";
print "\t\$external_mask = $external_mask\n";
print "\t\$external_gateway = $external_gateway\n";
print "\t\$internal_ip = $internal_ip\n";
print "\t\$internal_mask = $internal_mask\n";
print "|---------------------------------------------------|\n";

#my @ifconfig = `/usr/bin/ifconfig -a`;
my @full_list;
my @running_list;
my $eth;
my %ip_hash;

my $g_internal_eth;
my $g_external_eth;

my $data = "data";
open(my $fp,"<",$data) or die $!;
while(<$fp>
{
        chomp;
        if(/(eth\d+|lo)/)
        {
                #print "|---$_---|\n";
                $eth = $1;
                push @full_list,$eth unless $eth eq 'lo';
        }
        if(/inet addr\d+.\d+.\d+.\d+).*Bcast/)
        {
                #print "$1\n";
                $ip_hash{$eth} = $1;
        }
        if(/RUNNING/)
        {
                #print "<<--$_-->>\n";
                push @running_list, $eth unless $eth eq 'lo';
        }
}
close($fp);
foreach(@running_list)
{
        #print "|--Running interface: $_-----|\n";
        if(defined $ip_hash{$_})
        {
                $g_internal_eth = $_;
        }
        else
        {
                $g_external_eth = $_;
        }
}
print "\$g_internal_eth = $g_internal_eth,\$g_external_eth = $g_external_eth\n";
#my @hw_list = `/usr/bin/ifconfig -a | grep HW`;
my @mac_list;
my %eth_hash;

my $hw_data = "hw.data";
open(my $hw_fp,"<",$hw_data) or die $!;
while(<$hw_fp>
#foreach(@hw_list)
{
       if(/(eth\d+).*HWaddr\s+(\S+)\s*$/){
                #print "$1,$2\n";
                $eth_hash{$1}=$2;
                push @mac_list,$2;
       }
}
foreach (keys %eth_hash){
        open FILE,">","/tmp/ifcfg-$_" or die $!;
        print FILE "DEVICE=$_\n";
        print FILE "BOOTPROTO=static\n";
        print FILE "HWADDR=$eth_hash{$_}\n";
        print FILE "ONBOOT=yes\n";
        print FILE "TYPE=Ethernet\n";
        if(scalar @running_list > 2)
        {
                foreach my $eth (@running_list)
                {
                        if($_ eq $eth)
                        {
                                if(defined $ip_hash{$_})
                                {
                                        print FILE "IPADDR=$ip_hash{$_}\n";
                                        print FILE "NETMASK=255.255.255.0\n";
                                }
                        }
                }
        }
        #@running_list = 2
        else
        {
                foreach my $eth (@running_list)
                {
                        if($_ eq $eth)
                        {
                                if(defined $ip_hash{$_})
                                {
                                        print FILE "IPADDR=$ip_hash{$_}\n";
                                        print FILE "NETMASK=255.255.255.0\n";
                                }
                                else
                                {
                                        print FILE "IPADDR=$external_ip\n";
                                        print FILE "NETMASK=$external_mask\n";
                                        print FILE "GATEWAY=$external_gateway\n";
                                }
                        }
                }
        }
        close FILE;
}
foreach(sort @mac_list)
{
        #print "$_\n";
}
my @exclusive_list;
foreach(@full_list)
{
        #print "$_.mac = $eth_hash{$_}\n";
        my $tmp = $eth_hash{$_};

        if($tmp =~ m/(\S+)\S+)\S+)\S+)\S+)\S+)/)
        {
                #print "$1-$2-$3-$4-$5-$6\n";
        }

        push @exclusive_list,$_ unless ($_ eq $g_internal_eth || $_ eq $g_external_eth);
}
my ($g_i_1,$g_i_2,$g_i_3,$g_i_4,$g_i_5,$g_i_6);
my ($g_e_1,$g_e_2,$g_e_3,$g_e_4,$g_e_5,$g_e_6);
$eth_hash{$g_internal_eth} =~ m/(\S+)\S+)\S+)\S+)\S+):(\S+)/;
{
        ($g_i_1,$g_i_2,$g_i_3,$g_i_4,$g_i_5,$g_i_6) = ($1,$2,$3,$4,$5,$6);
}
$eth_hash{$g_external_eth} =~ m/(\S+):(\S+):(\S+):(\S+):(\S+):(\S+)/;
{
        ($g_e_1,$g_e_2,$g_e_3,$g_e_4,$g_e_5,$g_e_6) = ($1,$2,$3,$4,$5,$6);
}

my $in_diff_ref;
my $ex_diff_ref;
foreach(@exclusive_list)
{
        my $tmp = $eth_hash{$_};

        if($tmp =~ m/(\S+):(\S+):(\S+):(\S+):(\S+):(\S+)/)
        {
                #print "$1-$2-$3-$4-$5-$6\n";
                if(($1 eq $g_i_1) && ($2 eq $g_i_2) && ($3 eq $g_i_3) && ($4 eq $g_i_4) && ($5 eq $g_i_5))
                {
                        $in_diff_ref->{$_} = ((hex($6) - hex($g_i_6)) > 0 ? (hex($6) - hex($g_i_6)) : (hex($g_i_6) - hex($6)));
                        print  "$_.mac = $tmp,$g_internal_eth.mac = $eth_hash{$g_internal_eth},diff: $in_diff_ref->{$_}\n";
                }
                if(($1 eq $g_e_1) && ($2 eq $g_e_2) && ($3 eq $g_e_3) && ($4 eq $g_e_4) && ($5 eq $g_e_5))
                {
                        $ex_diff_ref->{$_} = ((hex($6) - hex($g_e_6)) > 0 ? (hex($6) - hex($g_e_6)) : (hex($g_e_6) - hex($6)));
                        print  "$_.mac = $tmp,$g_external_eth.mac = $eth_hash{$g_external_eth},diff: $ex_diff_ref->{$_}\n";
                }
        }
}
my $in_min;
my $g_internal_eth_2;
foreach(keys %$in_diff_ref)
{
        if(!defined $in_min)
        {
                $in_min = $in_diff_ref->{$_};
                $g_internal_eth_2 = $_;
        }
        if($in_diff_ref->{$_} < $in_min)
        {
                $in_min = $in_diff_ref->{$_};
                $g_internal_eth_2 = $_;
        }
}
my $ex_min;
my $g_external_eth_2;
foreach(keys %$ex_diff_ref)
{
        if(!defined $ex_min)
        {
                $ex_min = $ex_diff_ref->{$_};
                $g_external_eth_2 = $_;
        }
        if($ex_diff_ref->{$_} < $ex_min)
        {
                $ex_min = $ex_diff_ref->{$_};
                $g_external_eth_2 = $_;
        }
}
print "\t++++++++$g_internal_eth_2,$g_external_eth_2+++++++++++++\n";

[root@localhost bond]# cat /tmp/ip.conf
192.168.5.21 255.255.255.0
202.108.6.116 255.255.255.0 202.108.6.1

[root@localhost bond]# cat data
eth0      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:71  
          UP BROADCAST MULTICAST

eth1      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:73  
          UP BROADCAST MULTICAST

eth2      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F4  
          inet addr:192.168.5.190  Bcast:192.168.5.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST

eth3      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F5  
          UP BROADCAST MULTICAST

eth4      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F0  
          UP BROADCAST RUNNING MULTICAST

eth5      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F1  
          UP BROADCAST MULTICAST

eth6      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:75  
          UP BROADCAST MULTICAST

eth7      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:77  
          UP BROADCAST MULTICAST

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING

[root@localhost bond]# cat hw.data
eth0      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:71  

eth1      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:73  

eth2      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F4  

eth3      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F5  

eth4      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F0  

eth5      Link encap:Ethernet  HWaddr 00:1B:21:64:16:F1  

eth6      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:75  

eth7      Link encap:Ethernet  HWaddr F0:4D:A2:08:79:77
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP