Code

Moved get_ip to gosa-si-server.
authorjanw <janw@594d385d-05f5-0310-b6e9-bd551577e9d8>
Mon, 11 Feb 2008 10:10:21 +0000 (10:10 +0000)
committerjanw <janw@594d385d-05f5-0310-b6e9-bd551577e9d8>
Mon, 11 Feb 2008 10:10:21 +0000 (10:10 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@8817 594d385d-05f5-0310-b6e9-bd551577e9d8

gosa-si/gosa-si-server
gosa-si/modules/SIPackages.pm

index 71500ad2ce7a3cd1493af149e0fdc14406fc9f03..d14b5baa7964ba4c03b99d0631e0f5ae6bba6914 100755 (executable)
@@ -652,6 +652,75 @@ sub open_socket {
 }
 
 
+#===  FUNCTION  ================================================================
+#         NAME:  get_ip 
+#   PARAMETERS:  interface name (i.e. eth0)
+#      RETURNS:  (ip address) 
+#  DESCRIPTION:  Uses ioctl to get ip address directly from system.
+#===============================================================================
+sub get_ip {
+       my $ifreq= shift;
+       my $result= "";
+       my $SIOCGIFADDR= 0x8915;       # man 2 ioctl_list
+       my $proto= getprotobyname('ip');
+
+       socket SOCKET, PF_INET, SOCK_DGRAM, $proto
+               or die "socket: $!";
+
+       if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) {
+               my ($if, $sin)    = unpack 'a16 a16', $ifreq;
+               my ($port, $addr) = sockaddr_in $sin;
+               my $ip            = inet_ntoa $addr;
+
+               if ($ip && length($ip) > 0) {
+                       $result = $ip;
+               }
+       }
+
+       return $result;
+}
+
+sub get_local_ip_for_remote_ip {
+       my $remote_ip= shift;
+       my $result="0.0.0.0";
+
+       if($remote_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
+               if($remote_ip eq "127.0.0.1") {
+                       $result = "127.0.0.1";
+               } else {
+                       my $PROC_NET_ROUTE= ('/proc/net/route');
+
+                       open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+                               or die "Could not open $PROC_NET_ROUTE";
+
+                       my @ifs = <PROC_NET_ROUTE>;
+
+                       close(PROC_NET_ROUTE);
+
+                       # Eat header line
+                       shift @ifs;
+                       chomp @ifs;
+                       foreach my $line(@ifs) {
+                               my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
+                               my $destination;
+                               my $mask;
+                               my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
+                               $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
+                               $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+                               if(new NetAddr::IP($remote_ip)->within(new NetAddr::IP($destination, $mask))) {
+                                       # destination matches route, save mac and exit
+                                       $result= &get_ip($Iface);
+                                       last;
+                               }
+                       }
+               }
+       } else {
+               daemon_log("get_local_ip_for_remote_ip was called with a non-ip parameter: $remote_ip", 1);
+       }
+       return $result;
+}
+
 sub send_msg_to_target {
     my ($msg, $address, $encrypt_key, $msg_header) = @_ ;
     my $error = 0;
@@ -668,8 +737,10 @@ sub send_msg_to_target {
     }
 
        # Patch the source ip
-       my $remote_ip = sprintf("%s", $address =~ /^([0-9\.]*?):.*$/);
-       $msg =~ s/<source>(0\.0\.0\.0):(\d*?)<\/source>/<source>$remote_ip:\2<\/source>/s;
+       if($msg =~ /<source>0\.0\.0\.0:\d*?<\/source>/) {
+               my $remote_ip = &get_local_ip_for_remote_ip(sprintf("%s", $address =~ /^([0-9\.]*?):.*$/));
+               $msg =~ s/<source>(0\.0\.0\.0):(\d*?)<\/source>/<source>$remote_ip:$2<\/source>/s;
+       }
 
     # encrypt xml msg
     my $crypted_msg = &encrypt_msg($msg, $encrypt_key);
index 184c58e57ced7ae7d719ff2f4686ff565691ee89..5c68b8ec925544dc6aed3b9c7b2c975fae6f84b2 100644 (file)
@@ -298,34 +298,6 @@ sub get_mac {
        return $result;
 }
 
-#===  FUNCTION  ================================================================
-#         NAME:  get_ip 
-#   PARAMETERS:  interface name (i.e. eth0)
-#      RETURNS:  (ip address) 
-#  DESCRIPTION:  Uses ioctl to get ip address directly from system.
-#===============================================================================
-sub get_ip {
-       my $ifreq= shift;
-       my $result= "";
-       my $SIOCGIFADDR= 0x8915;       # man 2 ioctl_list
-       my $proto= getprotobyname('ip');
-
-       socket SOCKET, PF_INET, SOCK_DGRAM, $proto
-               or die "socket: $!";
-
-       if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) {
-               my ($if, $sin)    = unpack 'a16 a16', $ifreq;
-               my ($port, $addr) = sockaddr_in $sin;
-               my $ip            = inet_ntoa $addr;
-
-               if ($ip && length($ip) > 0) {
-                       $result = $ip;
-               }
-       }
-
-       return $result;
-}
-
 
 #===  FUNCTION  ================================================================
 #         NAME:  register_at_bus