Code

Updated table summary
[gosa.git] / gosa-si / modules / GosaSupportDaemon.pm
index 9e7062472370305a6a7a1342036a2be3372e0493..7d769c08ad6ff4e302a900203e214f955cb2b16c 100644 (file)
@@ -5,6 +5,8 @@ use Exporter;
 my @functions = (
     "create_passwd",
     "create_xml_hash",
+       "createXmlHash",
+       "myXmlHashToString",
     "get_content_from_xml_hash",
     "add_content2xml_hash",
     "create_xml_string",
@@ -44,12 +46,12 @@ 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 DateTime;
 
-
 my $op_hash = {
     'eq' => '=',
     'ne' => '!=',
@@ -67,7 +69,7 @@ END {}
 
 ### Start ######################################################################
 
-my $xml = new XML::Simple();
+our $xml = new XML::Simple();
 
 sub daemon_log {
     my ($msg, $level) = @_ ;
@@ -113,6 +115,91 @@ sub create_xml_hash {
     return $hash
 }
 
+sub createXmlHash {
+       my ($header, $source, $target) = @_;
+       return { header=>$header, source=>$source, target=>$target};
+}
+
+sub _transformHashToString {
+       my ($hash) = @_;
+       my $s = "";
+
+       while (my ($tag, $content) = each(%$hash)) {
+
+               if (ref $content eq "HASH") {
+                       $s .= "<$tag>".&_transformHashToString($content)."</$tag>";
+               } elsif ( ref $content eq "ARRAY") {
+                       $s .= &_transformArrayToString($tag, $content);
+               } else {
+                       $content = defined $content ? $content : "";
+                       $s .= "<$tag>".&xml_quote($content)."</$tag>";
+               }
+       }
+       return $s;
+}
+
+sub _transformArrayToString {
+       my ($tag, $contentArray) = @_;
+       my $s = "";
+       foreach my $content (@$contentArray) {
+               if (ref $content eq "HASH") {
+                       $s .= "<$tag>".&_transformHashToString($content)."</$tag>";
+               } else {
+                       $content = defined $content ? $content : "";
+                       $s .= "<$tag>".&xml_quote($content)."</$tag>";
+               }
+       }
+       return $s;
+}
+
+
+#===  FUNCTION  ================================================================
+#         NAME:  myXmlHashToString
+#   PARAMETERS:  xml_hash - hash - hash from function createXmlHash
+#      RETURNS:  xml_string - string - xml string representation of the hash
+#  DESCRIPTION:  Transforms the given hash to a xml wellformed string. I.e.:
+#                   {
+#                   'header' => 'a'
+#                   'source' => 'c',
+#                   'target' => 'b',
+#                   'hit' => [ '1',
+#                              '2',
+#                              { 
+#                                'hit31' => 'ABC',
+#                               'hit32' => 'XYZ'
+#                              }
+#                            ],
+#                   'res0' => {
+#                      'res1' => {
+#                         'res2' => 'result'
+#                      }
+#                   },
+#               };
+#           
+#                               will be transformed to 
+#                               <xml>
+#                                      <header>a</header>
+#                                      <source>c</source>
+#                                      <target>b</target>
+#                                      <hit>1</hit>
+#                                      <hit>2</hit>
+#                                      <hit>
+#                                              <hit31>ABC</hit31>
+#                                              <hit32>XYZ</hit32>
+#                                      </hit>
+#                                      <res0>
+#                                              <res1>
+#                                                      <res2>result</res2>
+#                                              </res1>
+#                                      </res0>
+#                              </xml>
+#
+#===============================================================================
+sub myXmlHashToString {
+       my ($hash) = @_;
+       return "<xml>".&_transformHashToString($hash)."</xml>";
+}
+
 
 #===  FUNCTION  ================================================================
 #         NAME:  create_xml_string
@@ -524,7 +611,13 @@ sub import_events {
 
     if ($error == 0) {
         while (defined (my $event = readdir ($DIR))) {
-            if( $event eq "." || $event eq ".." ) { next; }  
+            if( $event eq "." || $event eq ".." || ($event =~ /^\.pm$/)) { next; }  
+
+                       # Check config file to exclude disabled event plugins (i.e. Opsi)
+                       if ($event eq "opsi_com.pm" &&  $main::opsi_enabled ne "true")  { 
+                               &main::daemon_log("0 WARNING: opsi-module is installed but not enabled in config file, please set under section '[OPSI]': 'enabled=true'", 3);  
+                               next; 
+                       }
 
             # try to import event module
             eval{ require $event; };
@@ -594,6 +687,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") {
@@ -658,17 +760,36 @@ sub get_local_ip_for_remote_ip {
         # Eat header line
         shift @ifs;
         chomp @ifs;
+        my $iffallback = ''; 
+
+        # linux-vserver might have * as Iface due to hidden interfaces, set a default 
+        foreach my $line(@ifs) { 
+            my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line); 
+            if ($Iface =~ m/^[^\*]+$/) { 
+                 $iffallback = $Iface; 
+            } 
+        }
         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);
+            if ($Iface =~ m/^[^\*]+$/) { 
+                 $iffallback = $Iface;
+            } 
             $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);
+                #$result= &get_ip($Iface);
+
+                if ($Iface =~ m/^\*$/ ) { 
+                    $result= &get_ip($iffallback);    
+                } else { 
+                    $result= &get_ip($Iface); 
+                } 
                 last;
             }
         }
@@ -752,9 +873,11 @@ sub run_as {
        }
        my $cmd_line= "$sudo_cmd su - $uid -c '$command'";
        open(PIPE, "$cmd_line |");
-       my $result = {'resultCode' => $?};
-       $result->{'command'} = $cmd_line;
+       my $result = {'command' => $cmd_line};
        push @{$result->{'output'}}, <PIPE>;
+       close(PIPE);
+       my $exit_value = $? >> 8;
+       $result->{'resultCode'} = $exit_value;
        return $result;
 }
 
@@ -821,20 +944,27 @@ sub check_opsi_res {
         if ($res->is_error) {
             my $error_string;
             if (ref $res->error_message eq "HASH") { 
+                               # for different versions
                 $error_string = $res->error_message->{'message'}; 
+                               $_ = $res->error_message->{'message'};
             } else { 
+                               # for different versions
                 $error_string = $res->error_message; 
+                               $_ = $res->error_message;
             }
             return 1, $error_string;
         }
     } else {
+               # for different versions
+               $_ = $main::opsi_client->status_line;
         return 1, $main::opsi_client->status_line;
     }
     return 0;
 }
 
 sub calc_timestamp {
-    my ($timestamp, $operation, $value) = @_ ;
+    my ($timestamp, $operation, $value, $entity) = @_ ;
+       $entity = defined $entity ? $entity : "seconds";
     my $res_timestamp = 0;
     
     $value = int($value);
@@ -849,12 +979,12 @@ sub calc_timestamp {
             );
 
     if ($operation eq "plus" || $operation eq "+") {
-        $dt->add( seconds => $value);
+        $dt->add($entity => $value);
         $res_timestamp = $dt->ymd('').$dt->hms('');
     }
 
     if ($operation eq "minus" || $operation eq "-") {
-        $dt->subtract(seconds => $value);
+        $dt->subtract($entity => $value);
         $res_timestamp = $dt->ymd('').$dt->hms('');
     }