Code

Updated new Config Management
[gosa.git] / gosa-si / modules / GosaPackages.pm
index ea5bc2a517deca1db8650a1799da8fe916764c1f..c18472eb8047e04df3cc361435786aa55616901c 100644 (file)
@@ -1,17 +1,19 @@
 package GosaPackages;
 
-use Exporter;
-@ISA = ("Exporter");
-
 use strict;
 use warnings;
-use GOSA::GosaSupportDaemon;
+
+use Exporter;
+use GOsaSI::GosaSupportDaemon;
 use IO::Socket::INET;
 use Socket;
 use XML::Simple;
 use File::Spec;
 use Data::Dumper;
 use MIME::Base64;
+use Net::ARP;
+
+our @ISA = ("Exporter");
 
 my $event_dir = "/usr/lib/gosa-si/server/GosaPackages";
 use lib "/usr/lib/gosa-si/server/GosaPackages";
@@ -73,29 +75,16 @@ sub get_module_info {
 sub get_mac {
     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 ($gosa_mac_address and length($gosa_mac_address) > 0) {
                     $result= $gosa_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;
@@ -203,11 +192,16 @@ sub process_gosa_msg {
         &main::daemon_log("$session_id ERROR: GosaPackages: no event handler or core function defined for '$header'", 1);
         @out_msg_l = ();
     } elsif ($out_msg_l[0] eq 'knownclienterror') {
-        &main::daemon_log("$session_id ERROR: no event handler found for '$header', check client registration events!", 1);
-        &main::daemon_log("$session_id ERROR: no or more than 1 hits are found at known_clients_db with sql query: '$sql_events'", 1);
-        &main::daemon_log("$session_id ERROR: processing is aborted and message will not be forwarded", 1);
+        if ($header eq "ping") {
+            &main::daemon_log("$session_id WARNING: Cannot send '$header' to '$target'. GOsa-si do not know client. Maybe client is offline or gosa-si-client process is not running.", 3);
+        } else {
+            &main::daemon_log("$session_id ERROR: no general event handler found for '$header', check client registration events!", 1);
+            &main::daemon_log("$session_id ERROR: no or more than 1 hits are found at known_clients_db with sql query: '$sql_events'", 1);
+            &main::daemon_log("$session_id ERROR: processing is aborted and message will not be forwarded", 1);
+        }
         @out_msg_l = ();
     } elsif ($out_msg_l[0] eq 'noeventerror') {
+        &main::daemon_log("$session_id ERROR: no general event handler found for '$header', check client registration events!", 1);
         &main::daemon_log("$session_id ERROR: client '$target' is not registered for event '$header', processing is aborted", 1); 
         @out_msg_l = ();
     }
@@ -246,6 +240,8 @@ sub process_job_msg {
             "<answer1>1</answer1>".
             "<error_string>no mac address specified, neither in target-tag nor in macaddres-tag</error_string>".
             "</xml>";
+
+        return ($out_msg);
     }
     
     # Determine plain_name for host
@@ -276,6 +272,24 @@ sub process_job_msg {
         &main::release_ldap_handle($ldap_handle);
     }
        
+    # Check if it is a periodical job
+    my $periodic = 'none';
+    if (exists $msg_hash->{periodic})
+    {
+        $periodic = $msg_hash->{periodic}[0];
+        if ($periodic ne 'none' and not $periodic =~ /[0-9]+_(hours|minutes|days|weeks|months)/)    # Periodic tag is not valid
+        {
+            &main::daemon_log("$session_id ERROR: Message contains invalid periodic-tag '$periodic'.".
+                    " Please use the following pattern for the tag: 'INTEGER_[minutes|hours|days|weeks|months]'".
+                    " Aborted message: $msg", 1);
+            $out_msg = "<xml>".
+                "<header>answer</header><source>$main::server_address</source><target>GOSA</target>".
+                "<answer1>1</answer1><error_string>Message contains invalid periodic-tag '$periodic'</error_string>".
+                "</xml>";
+            return ($out_msg);
+        }
+    }
+
     # Add job to job queue
     if( $error == 0 ) {
         my $func_dic = {table=>$main::job_queue_tn, 
@@ -291,6 +305,7 @@ sub process_job_msg {
                        plainname=>$plain_name,
             siserver=>"localhost",
             modified=>"1",
+            periodic=>$periodic,
         };
         my $res = $main::job_db->add_dbentry($func_dic);
         if (not $res == 0) {