Code

Fixed dialog ignore account state
[gosa.git] / gosa-si / modules / GosaSupportDaemon.pm
index d6420a1424ac75ff010c9b204ab848f209786087..9c33df325d1a937c45dfc85392be2cbcda85349a 100644 (file)
@@ -1,12 +1,27 @@
 package GOSA::GosaSupportDaemon;
 
+use strict;
+use warnings;
+
 use Exporter;
-@ISA = qw(Exporter);
+use IO::Socket::INET;
+use Crypt::Rijndael;
+use Digest::MD5  qw(md5 md5_hex md5_base64);
+use MIME::Base64;
+use XML::Quote qw(:all);
+use XML::Simple;
+use Data::Dumper;
+use Net::DNS;
+use Net::ARP;
+use DateTime;
+
+our @ISA = qw(Exporter);
+
 my @functions = (
     "create_passwd",
     "create_xml_hash",
-       "createXmlHash",
-       "myXmlHashToString",
+    "createXmlHash",
+    "myXmlHashToString",
     "get_content_from_xml_hash",
     "add_content2xml_hash",
     "create_xml_string",
@@ -38,18 +53,9 @@ my @functions = (
     "check_opsi_res",
     "calc_timestamp",
     "opsi_callobj2string",
-    ); 
-@EXPORT = @functions;
-use strict;
-use warnings;
-use IO::Socket::INET;
-use Crypt::Rijndael;
-use Digest::MD5  qw(md5 md5_hex md5_base64);
-use MIME::Base64;
-use XML::Simple;
-use Data::Dumper;
-use Net::DNS;
-use DateTime;
+    );
+    
+our @EXPORT = @functions;
 
 my $op_hash = {
     'eq' => '=',
@@ -130,7 +136,8 @@ sub _transformHashToString {
                } elsif ( ref $content eq "ARRAY") {
                        $s .= &_transformArrayToString($tag, $content);
                } else {
-                       $s .= "<$tag>".$content."</$tag>";
+                       $content = defined $content ? $content : "";
+                       $s .= "<$tag>".&xml_quote($content)."</$tag>";
                }
        }
        return $s;
@@ -143,7 +150,8 @@ sub _transformArrayToString {
                if (ref $content eq "HASH") {
                        $s .= "<$tag>".&_transformHashToString($content)."</$tag>";
                } else {
-                       $s .= "<$tag>$content</$tag>";
+                       $content = defined $content ? $content : "";
+                       $s .= "<$tag>".&xml_quote($content)."</$tag>";
                }
        }
        return $s;
@@ -506,8 +514,8 @@ sub get_orderby_statement {
 sub get_dns_domains() {
         my $line;
         my @searches;
-        open(RESOLV, "</etc/resolv.conf") or return @searches;
-        while(<RESOLV>){
+        open(my $RESOLV, "<", "/etc/resolv.conf") or return @searches;
+        while(<$RESOLV>){
                 $line= $_;
                 chomp $line;
                 $line =~ s/^\s+//;
@@ -519,7 +527,7 @@ sub get_dns_domains() {
                         push(@searches, split(/ /, $1));
                 }
         }
-        close(RESOLV);
+        close($RESOLV);
 
         my %tmp = map { $_ => 1 } @searches;
         @searches = sort keys %tmp;
@@ -684,6 +692,15 @@ sub get_ip {
 sub get_interface_for_ip {
        my $result;
        my $ip= shift;
+
+       if($ip =~ /^[a-z]/i) {
+               my $ip_address = inet_ntoa(scalar gethostbyname($ip));
+               if(defined($ip_address) && $ip_address =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
+                       # Write ip address to $source variable
+                       $ip = $ip_address;
+               }
+       }
+
        if ($ip && length($ip) > 0) {
                my @ifs= &get_interfaces();
                if($ip eq "0.0.0.0") {
@@ -710,12 +727,12 @@ sub get_interfaces {
        my @result;
        my $PROC_NET_DEV= ('/proc/net/dev');
 
-       open(PROC_NET_DEV, "<$PROC_NET_DEV")
+       open(my $FD_PROC_NET_DEV, "<", "$PROC_NET_DEV")
                or die "Could not open $PROC_NET_DEV";
 
-       my @ifs = <PROC_NET_DEV>;
+       my @ifs = <$FD_PROC_NET_DEV>;
 
-       close(PROC_NET_DEV);
+       close($FD_PROC_NET_DEV);
 
        # Eat first two line
        shift @ifs;
@@ -738,12 +755,12 @@ sub get_local_ip_for_remote_ip {
     if($remote_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
         my $PROC_NET_ROUTE= ('/proc/net/route');
 
-        open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+        open(my $FD_PROC_NET_ROUTE, "<", "$PROC_NET_ROUTE")
             or die "Could not open $PROC_NET_ROUTE";
 
-        my @ifs = <PROC_NET_ROUTE>;
+        my @ifs = <$FD_PROC_NET_ROUTE>;
 
-        close(PROC_NET_ROUTE);
+        close($FD_PROC_NET_ROUTE);
 
         # Eat header line
         shift @ifs;
@@ -790,29 +807,11 @@ sub get_local_ip_for_remote_ip {
 sub get_mac_for_interface {
        my $ifreq= shift;
        my $result;
-       if ($ifreq && length($ifreq) > 0) { 
+       if ($ifreq && length($ifreq) > 0) {
                if($ifreq eq "all") {
                        $result = "00:00:00:00:00:00";
                } else {
-                       my $SIOCGIFHWADDR= 0x8927;     # man 2 ioctl_list
-
-                       # A configured MAC Address should always override a guessed value
-                       if ($main::server_mac_address and length($main::server_mac_address) > 0) {
-                               $result= $main::server_mac_address;
-                       }
-
-                       socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip')
-                               or die "socket: $!";
-
-                       if(ioctl SOCKET, $SIOCGIFHWADDR, $ifreq) {
-                               my ($if, $mac)= unpack 'h36 H12', $ifreq;
-
-                               if (length($mac) > 0) {
-                                       $mac=~ m/^([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$/;
-                                       $mac= sprintf("%s:%s:%s:%s:%s:%s", $1, $2, $3, $4, $5, $6);
-                                       $result = $mac;
-                               }
-                       }
+        $result = Net::ARP::get_mac($ifreq);
                }
        }
        return $result;
@@ -860,10 +859,10 @@ sub run_as {
                &main::daemon_log("ERROR: The sudo utility is not available! Please fix this!");
        }
        my $cmd_line= "$sudo_cmd su - $uid -c '$command'";
-       open(PIPE, "$cmd_line |");
+       open(my $PIPE, "$cmd_line |");
        my $result = {'command' => $cmd_line};
-       push @{$result->{'output'}}, <PIPE>;
-       close(PIPE);
+       push @{$result->{'output'}}, <$PIPE>;
+       close($PIPE);
        my $exit_value = $? >> 8;
        $result->{'resultCode'} = $exit_value;
        return $result;