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