X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fmodules%2FGosaSupportDaemon.pm;h=7d769c08ad6ff4e302a900203e214f955cb2b16c;hb=bc18340d72a93568de1eb69137ff8565bcf4262f;hp=d6aafa43f1f3a821bc7cde046a4ffb957a37159a;hpb=c595a7c878347496e022136bb1b2ee35cf4717c4;p=gosa.git diff --git a/gosa-si/modules/GosaSupportDaemon.pm b/gosa-si/modules/GosaSupportDaemon.pm index d6aafa43f..7d769c08a 100644 --- a/gosa-si/modules/GosaSupportDaemon.pm +++ b/gosa-si/modules/GosaSupportDaemon.pm @@ -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).""; + } elsif ( ref $content eq "ARRAY") { + $s .= &_transformArrayToString($tag, $content); + } else { + $content = defined $content ? $content : ""; + $s .= "<$tag>".&xml_quote($content).""; + } + } + return $s; +} + +sub _transformArrayToString { + my ($tag, $contentArray) = @_; + my $s = ""; + foreach my $content (@$contentArray) { + if (ref $content eq "HASH") { + $s .= "<$tag>".&_transformHashToString($content).""; + } else { + $content = defined $content ? $content : ""; + $s .= "<$tag>".&xml_quote($content).""; + } + } + 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 +# +#
a
+# c +# b +# 1 +# 2 +# +# ABC +# XYZ +# +# +# +# result +# +# +#
+# +#=============================================================================== +sub myXmlHashToString { + my ($hash) = @_; + return "".&_transformHashToString($hash).""; +} + #=== FUNCTION ================================================================ # NAME: create_xml_string @@ -524,11 +611,11 @@ 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("WARNING: opsi-module is installed but not enabled in config file, please set under section '[OPSI]': 'enabled=true'", 3); + &main::daemon_log("0 WARNING: opsi-module is installed but not enabled in config file, please set under section '[OPSI]': 'enabled=true'", 3); next; } @@ -600,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") { @@ -664,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; } } @@ -758,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'}}, ; + close(PIPE); + my $exit_value = $? >> 8; + $result->{'resultCode'} = $exit_value; return $result; } @@ -827,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); @@ -855,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(''); }