source: ocsinventory-agent/trunk/fuentes/lib/Ocsinventory/Agent/Backend/OS/MacOS/Networks.pm @ 468

Last change on this file since 468 was 468, checked in by mabarracus, 4 years ago

Copyt trusty code

File size: 3.8 KB
Line 
1package Ocsinventory::Agent::Backend::OS::MacOS::Networks;
2
3# I think I hijacked most of this from the BSD/Linux modules
4
5
6use strict;
7
8sub check {
9  can_run("ifconfig") && can_load("Net::IP qw(:PROC)")
10}
11
12
13sub _ipdhcp {
14    my $if = shift;
15
16    my $path;
17    my $ipdhcp;
18    my $leasepath;
19
20    foreach ( # XXX BSD paths
21      "/var/db/dhclient.leases.%s",
22      "/var/db/dhclient.leases",
23      # Linux path for some kFreeBSD based GNU system
24      "/var/lib/dhcp3/dhclient.%s.leases",
25      "/var/lib/dhcp3/dhclient.%s.leases",
26      "/var/lib/dhcp/dhclient.leases") {
27
28      $leasepath = sprintf($_,$if);
29      last if (-e $leasepath);
30     }
31    return undef unless -e $leasepath;
32
33    if (open DHCP, $leasepath) {
34      my $lease;
35      my $dhcp;
36      my $expire;
37      # find the last lease for the interface with its expire date
38      while(<DHCP>){
39        $lease = 1 if(/lease\s*{/i);
40        $lease = 0 if(/^\s*}\s*$/);
41        if ($lease) { #inside a lease section
42            if(/interface\s+"(.+?)"\s*/){
43                $dhcp = ($1 =~ /^$if$/);
44            }
45            #Server IP
46            if(/option\s+dhcp-server-identifier\s+(\d{1,3}(?:\.\d{1,3}){3})\s*;/
47               and $dhcp){
48                $ipdhcp = $1;
49            }
50            if (/^\s*expire\s*\d\s*(\d*)\/(\d*)\/(\d*)\s*(\d*):(\d*):(\d*)/
51                and $dhcp) {
52                $expire=sprintf "%04d%02d%02d%02d%02d%02d",$1,$2,$3,$4,$5,$6;
53            }
54        }
55    }
56      close DHCP or warn;
57      chomp (my $currenttime = `date +"%Y%m%d%H%M%S"`);
58      undef $ipdhcp unless $currenttime <= $expire;
59  } else {
60      warn "Can't open $leasepath\n";
61  }
62    return $ipdhcp;
63}
64
65# Initialise the distro entry
66sub run {
67    my $params = shift;
68    my $common = $params->{common};
69
70    my $description;
71    my $ipaddress;
72    my $ipgateway;
73    my $ipmask;
74    my $ipsubnet;
75    my $macaddr;
76    my $status;
77    my $type;
78
79
80    # Looking for the gateway
81    # 'route show' doesn't work on FreeBSD so we use netstat
82    # XXX IPV4 only
83    for(`netstat -nr -f inet`){
84      $ipgateway=$1 if /^default\s+(\S+)/i;
85    }
86
87    my @ifconfig = `ifconfig -a`; # -a option required on *BSD
88
89
90    # first make the list available interfaces
91    # too bad there's no -l option on OpenBSD
92    my @list;
93    foreach (@ifconfig){
94        # skip loopback, pseudo-devices and point-to-point interfaces
95        #next if /^(lo|fwe|vmnet|sit|pflog|pfsync|enc|strip|plip|sl|ppp)\d+/;
96        next unless(/^en(0|1)/); # darwin has a lot of interfaces, for this purpose we only want to deal with eth0 and eth1
97        if (/^(\S+):/) { push @list , $1; } # new interface name
98    }
99
100    # for each interface get it's parameters
101    foreach $description (@list) {
102        $ipaddress = $ipmask = $macaddr = $status =  $type = undef;
103        # search interface infos
104        @ifconfig = `ifconfig $description`;
105        foreach (@ifconfig){
106            $ipaddress = $1 if /inet (\S+)/i;
107            $ipmask = $1 if /netmask\s+(\S+)/i;
108            $macaddr = $2 if /(address:|ether|lladdr)\s+(\S+)/i;
109            $status = 1 if /status:\s+active/i;
110            $type = $1 if /media:\s+(\S+)/i;
111        }
112        my $binip = &ip_iptobin ($ipaddress ,4);
113        # In BSD, netmask is given in hex form
114        my $binmask = sprintf("%b", oct($ipmask));
115        my $binsubnet = $binip & $binmask;
116        $ipsubnet = ip_bintoip($binsubnet,4);
117        my $mask = ip_bintoip($binmask,4);
118        $common->addNetwork({
119
120            DESCRIPTION => $description,
121            IPADDRESS => ($status?$ipaddress:undef),
122            IPDHCP => _ipdhcp($description),
123            IPGATEWAY => ($status?$ipgateway:undef),
124            IPMASK => ($status?$mask:undef),
125            IPSUBNET => ($status?$ipsubnet:undef),
126            MACADDR => $macaddr,
127            STATUS => ($status?"Up":"Down"),
128            TYPE => ($status?$type:undef)
129
130        });
131    }
132}
133
1341;
Note: See TracBrowser for help on using the repository browser.