Code

Updated New Device && opsi host
[gosa.git] / gosa-plugins / systems / admin / systems / class_systemManagement.inc
index 21f1032075e89b22e177d762bcf91b760c1e9b47..e6423173c36b632761505afbc960f606f857ac91 100644 (file)
@@ -221,7 +221,7 @@ class systems extends plugin
      ********************/
     if ($s_action=="gen_cd"){
       $this->dn= $this->terminals[$s_entry]['dn'];
-      session::set('objectinfo',$this->dn);
+      set_object_info($this->dn);
       return ($smarty->fetch(get_template_path('gencd.tpl', TRUE)));
     }
 
@@ -305,9 +305,18 @@ class systems extends plugin
 
 
     /********************
-      New Device hanlding  (Ogroup/System select dialog.)
+      New Device handling  (Ogroup/System select dialog.)
      ********************/
 
+    /*  All objects that have to be activated are listed in 
+          $this->system_activation_object[] = "dn";
+      
+        If there is an object group selected we simply adopt all
+         settings from these group and then directly save the entry again.
+        If no object group was selected, then we keep the "edit" dialog of 
+         the target system opened to allow to edit the objects attributes.
+     */
+  
     if($s_action == "SelectedSystemType"){
 
       /* Possible destination system types 
@@ -335,7 +344,9 @@ class systems extends plugin
           msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
         }else{
 
-          /* Go through all objects that should be activated */
+          /* Go through all objects that should be activated 
+              Contains alls object dns that have to be activated ("New Devices" not unknown)
+            */
           foreach($this->system_activation_object as $key => $dn){
 
             /* Remove entry from list, to avoid page-reload problems */
@@ -354,11 +365,28 @@ class systems extends plugin
               $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
               $this->systab->base = $this->DivListSystem->selectedBase;
 
+              /* This will be used when the object is saved, to set FAIstate to 'install'
+                  and to preset maybe other attributes.
+               */
+              $this->systab->was_activated = TRUE;
+
+              /* Assign some default values for opsi hosts 
+               */
+              if($this->systab instanceOf opsi_tabs){
+                $ldap = $this->config->get_ldap_link();
+                $ldap->cat($dn);
+                $source_attrs = $ldap->fetch();
+                foreach(array("macAddress" => "mac" ,"cn" => "hostId","description","description") as $src => $attr){
+                  if(isset($source_attrs[$src][0])){
+                    $this->systab->by_object['opsiGeneric']->$attr = $source_attrs[$src][0];
+                  }
+                }
+              }
 
               if($selected_group != "none"){
 
                 /*******
-                 * Set gotoMode to active if we there was an ogroup selected. 
+                 * Set gotoMode to active if there was an ogroup selected. 
                  */
                 $found = false;
                 foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
@@ -411,6 +439,10 @@ class systems extends plugin
                */
               if($selected_group != "none"){
                 $this->systab->save();
+    
+                /* Post handling for activated new devices 
+                 */
+                $this->activate_new_device($this->systab->dn);
                 $this->systab = NULL;
 
                 if(!isset($ldap)){
@@ -506,7 +538,7 @@ class systems extends plugin
       /* Check locking, save current plugin in 'back_plugin', so
          the dialog knows where to return. */
       if (($user= get_lock($this->dn)) != ""){
-        return(gen_locked_message ($user, $this->dn));
+        return(gen_locked_message ($user, $this->dn,TRUE));
       }
 
       /* Find out more about the object type */
@@ -521,14 +553,18 @@ class systems extends plugin
         if(!class_available("ArpNewDeviceTabs")){
           msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG);
         }else{
+          add_lock ($this->dn, $this->ui->dn);
           $this->systab = new ArpNewDeviceTabs($this->config,$this->config->data['TABS']['ARPNEWDEVICETABS'],$this->dn);
         }
       }elseif($type == "NewDevice"){
         if(!class_available("SelectDeviceType")){
           msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG);
         }else{
+          add_lock ($this->dn, $this->ui->dn);
           $this->system_activation_object= array($this->dn);
           $this->systab = new SelectDeviceType($this->config,$this->dn) ;
+
+          // see condition  -$s_action == "SelectedSystemType"-  for further handling
         }
       }elseif(isset($tabs[$type])){
 
@@ -539,10 +575,10 @@ class systems extends plugin
         if(!class_available($tabclass)){
           msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
         }else{
+          add_lock ($this->dn, $this->ui->dn);
           $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$acl_cat);
           $this->systab->set_acl_base($this->dn);
-          session::set('objectinfo',$this->dn);
-          add_lock ($this->dn, $this->ui->dn);
+          set_object_info($this->dn);
         }
       }else{ 
         msg_dialog::display(_("Error"), _("Editing this type of object is not supported yet!"), ERROR_DIALOG);
@@ -569,7 +605,7 @@ class systems extends plugin
       $tabacl   = $ui->get_permissions($dn,$acl,"userPassword");
       if(preg_match("/w/",$tabacl)){
         $this->dn= $this->terminals[$s_entry]['dn'];
-        session::set('objectinfo',$this->dn);
+        set_object_info($this->dn);
         return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
       }else{
         msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
@@ -613,11 +649,10 @@ class systems extends plugin
       if(!empty($type) && in_array($type,$allow_for)){
 
         /* Get infos */
-        $plug     = $tabs[$type]["PLUG"];
-        $class    = $tabs[$type]["CLASS"];
+        $plug     = $tabs[$type]["TABNAME"];
         $acl      = $tabs[$type]["ACL"];
         $tabclass = $tabs[$type]["TABCLASS"];
-    
+   
         /* Get acls */
         $ui       = get_userinfo();
         $tabacl   = $ui->get_permissions($this->dn,$acl,"userPassword");
@@ -666,9 +701,9 @@ class systems extends plugin
           }
           $ldap->modify($attrs);
           if (!$ldap->success()){
-            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type));
           }else{
-            if(class_available($plug)){
+            if(class_available($plug)){ 
               $p = new $plug($this->config,$this->dn);
               $p->handle_post_events("modify");
             }
@@ -681,7 +716,7 @@ class systems extends plugin
       }else{
         msg_dialog::display(_("Error"), _("Cannot determine object to change password!"), ERROR_DIALOG);
       }
-      session::un_set('objectinfo');
+      set_object_info();
     }
 
 
@@ -692,7 +727,7 @@ class systems extends plugin
     /* Delete terminal canceled? */
     if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
       $this->remove_lock();
-      session::un_set('objectinfo');
+      set_object_info();
     }
 
 
@@ -722,12 +757,19 @@ class systems extends plugin
       if(count($ids) && class_available("DaemonEvent")){
         $mac= array();
 
+        /* Collect target mac addresses */
         $ldap = $this->config->get_ldap_link();
         foreach($ids as $id){
-          $ldap->cat ($this->terminals[$id]['dn'], array("macAddress"));
-          $attrs= $ldap->fetch();
-          if (isset($attrs['macAddress'][0])){
-            $mac[]= $attrs['macAddress'][0];
+          $type = $this->get_system_type($this->terminals[$id]);
+          if(!in_array($type,array("terminal","server","workstation","opsi_client","winstation "))) continue;
+          if(isset($this->terminals[$id]['macAddress'][0])){
+            $mac[] = $this->terminals[$id]['macAddress'][0];
+          }else{
+            $ldap->cat ($this->terminals[$id]['dn'], array("macAddress"));
+            $attrs= $ldap->fetch();
+            if (isset($attrs['macAddress'][0])){
+              $mac[]= $attrs['macAddress'][0];
+            }
           }
         }
         $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
@@ -836,7 +878,7 @@ class systems extends plugin
           $dns_names = array();
           foreach($this->dns as $dn){
             add_lock ($dn, $this->ui->dn);
-            $dns_names[] = @LDAP::fix($dn);
+            $dns_names[] = LDAP::fix($dn);
           }
 
           /* Lock the current entry, so nobody will edit it during deletion */
@@ -957,10 +999,21 @@ class systems extends plugin
 
       /* Save, or display error message? */
       if (count($message) == 0){
-
-
         $this->systab->save();
 
+        /* Post handling for activated systems 
+            target opsi -> Remove source.
+            target gosa -> Activate system.
+         */
+        if($this->systab instanceOf opsi_tabs && $this->systab->was_activated){
+          $ldap = $this->config->get_ldap_link();
+          $ldap->cd($this->config->current['BASE']);
+          $ldap->rmdir ($this->systab->dn);
+          @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,"Source removed: ".$this->systab->dn,"Opsi host activated.");
+        }elseif(isset($this->systab->was_activated) && $this->systab->was_activated){
+          $this->activate_new_device($this->systab->dn);
+        }
+
         /* Terminal has been saved successfully, remove lock from LDAP. */
         if (!isset($_POST['edit_apply'])){
           if ($this->dn != "new"){
@@ -969,7 +1022,7 @@ class systems extends plugin
 
           unset ($this->systab);
           $this->systab= NULL;
-          session::un_set('objectinfo');
+          set_object_info();
         }else{
       
           /* Reinitialize tab */
@@ -995,7 +1048,7 @@ class systems extends plugin
         unset ($this->systab);
       }
       $this->systab= NULL;
-      session::un_set('objectinfo');
+      set_object_info();
     }
 
     /********************
@@ -1004,13 +1057,18 @@ class systems extends plugin
 
     /* Show tab dialog if object is present */
     if (isset($this->systab->config)){
+
+      if($this->systab instanceOf plugin && !($this->systab instanceOf tabs)){
+        $this->systab->save_object();
+      }
+
       $display= $this->systab->execute();
 
       /* Don't show buttons if tab dialog requests this */
 
       $dialog     = FALSE;
       $hide_apply = $this->dn == "new";
-      $hide_apply = ($this->dn == "new") || (preg_match("/".normalizePreg(get_ou("systemIncomingRDN"))."/",$this->dn));
+      $hide_apply = ($this->dn == "new") || (preg_match("/".preg_quote(get_ou("systemIncomingRDN"), '/')."/",$this->dn));
       if(is_object($this->systab) && !isset($this->systab->by_object)){
         $dialog = TRUE;
         $hide_apply = TRUE;
@@ -1025,7 +1083,11 @@ class systems extends plugin
         $dialog = TRUE;
       }
 
-      if (!$dialog){
+      if(($this->systab instanceOf tabs || $this->systab instanceOf plugin) && $this->systab->read_only == TRUE){
+        $display.= "<p style=\"text-align:right\">
+          <input type=submit name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">
+          </p>";
+      }elseif (!$dialog){
         $display.= "<p style=\"text-align:right\">\n";
         $display.= "<input type=\"submit\" name=\"edit_finish\" style=\"width:80px\" value=\"".msgPool::okButton()."\">\n";
         $display.= "&nbsp;\n";
@@ -1169,7 +1231,7 @@ class systems extends plugin
 
     /* Attributes to fetch */
     $sys_attrs        = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode","FAIclass");
-    $sys_categories   = array("terminal", "workstation", "server", "phone" ,"printer","incoming");
+    $sys_categories   = array("terminal", "workstation", "server", "phone" ,"printer","incoming","winworkstation","component");
 
     /* Add FAIstate to attributes if FAI is activated */
     $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
@@ -1202,11 +1264,15 @@ class systems extends plugin
     $res = array_merge($res,get_list($filter,$sys_categories, get_ou('systemIncomingRDN').$base,$sys_attrs, GL_SIZELIMIT));
 
     /* Append opsi systems, the opsi extension have to installed.
+        (Only, if we are allowed to view opsi hosts)
      */
     if($this->opsi instanceof opsi && $this->opsi->enabled() && $this->DivListSystem->ShowOpsiHosts){
-      $opsi_clients = $this->opsi->get_hosts_for_system_management();
-      if($this->opsi->is_error()){
-        msg_dialog::display(_("Error"),msgPool::siError($this->opsi->get_error()),ERROR_DIALOG);
+      $o_acl = $this->ui->get_permissions($base,"opsi/opsiGeneric","");
+      if(preg_match("/r/",$o_acl)){
+        $opsi_clients = $this->opsi->get_hosts_for_system_management();
+        if($this->opsi->is_error()){
+          msg_dialog::display(_("Error"),msgPool::siError($this->opsi->get_error()),ERROR_DIALOG);
+        }
       }
     }
     
@@ -1226,7 +1292,7 @@ class systems extends plugin
       }
 
       /* Create a string containing the last part of the department. */
-      $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(@LDAP::fix($tmp)));
+      $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(LDAP::fix($tmp)));
       if(empty($dn_name)){
         $dn_name = "/";
       }
@@ -1326,8 +1392,9 @@ class systems extends plugin
           $terminal['type']   = "Q";
           $terminal['is_new'] = $add;
         }
-      } elseif (in_array_ics('ieee802Device', $value["objectClass"])){
-
+      } elseif (in_array_ics('ieee802Device', $value["objectClass"]) && 
+        !( in_array_ics('sambaAccount', $value["objectClass"]) || in_array_ics('sambaSamAccount', $value["objectClass"]))){
+        $type= "winstation";
         $acl = $ui->get_permissions($value['dn'],"component/componentGeneric");
         if($add != "" || preg_match("/r/",$acl)) {
 
@@ -1391,8 +1458,7 @@ class systems extends plugin
   {
     if (isset($this->systab->dn)){
       del_lock ($this->systab->dn);
-    }
-    if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
+    }elseif(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
       del_lock($this->dn);
     }
     if(isset($this->dns) && is_array($this->dns) && count($this->dns)){
@@ -1495,6 +1561,9 @@ class systems extends plugin
     $type= "";
     if (in_array_ics('gosa_opsi_client', $classes)){
       $type= "opsi_client";
+    }elseif (in_array_ics('sambaAccount', $classes) ||
+        in_array_ics('sambaSamAccount', $classes)){
+      $type= "winstation";
     }elseif (in_array_ics('ieee802Device', $classes)){
       $type= "component";
     }elseif (in_array_ics('gotoTerminal', $classes)){
@@ -1511,9 +1580,6 @@ class systems extends plugin
       $type= "ArpNewDevice";
     }elseif (in_array_ics('GOhard', $classes)){
       $type= "NewDevice";
-    }elseif (in_array_ics('sambaAccount', $classes) ||
-        in_array_ics('sambaSamAccount', $classes)){
-      $type= "winstation";
     }
     return ($type);
   }
@@ -1529,7 +1595,7 @@ class systems extends plugin
         "C" => array("plugins/systems/images/select_component.png",_("Network device")),
         "P" => array("plugins/systems/images/select_printer.png",_("Printer")),
 
-        "W" => array("plugins/systems/images/select_winstation.png",_("Win workstation")),
+        "W" => array("plugins/systems/images/select_winstation.png",_("Windows workstation")),
 
         "L" => array("plugins/systems/images/select_workstation.png",_("Workstation")),
         "S" => array("plugins/systems/images/select_server.png",_("Server")),
@@ -1710,6 +1776,42 @@ class systems extends plugin
   }
 
 
+  /*! \brief  Sets FAIstate to "install" for "New Devices".
+              This function is some kind of "Post handler" for activated systems,
+               it is called directly after the object (workstabs,servtabs) gets saved.  
+      @param  String  $dn   The dn of the newly activated object.
+      @return Boolean TRUE if activated else FALSE
+   */
+  function activate_new_device($dn)
+  {
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+    $ldap->cat($dn);
+    if($ldap->count()){
+      $attrs = $ldap->fetch();
+      $type  = $this->get_system_type($attrs);
+      if(!in_array($type,array("workstation","server"))) {
+        $ocs = $attrs['objectClass'];
+        unset($ocs['count']);
+        $new_attrs = array();
+        if(!in_array("FAIobject",$ocs)){
+          $ocs[] = "FAIobject";
+          $new_attrs['objectClass'] = $ocs;
+        }
+        $new_attrs['FAIstate'] = "install";
+        $ldap->cd($dn);
+        $ldap->modify($new_attrs);
+        if (!$ldap->success()){
+          msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 
+                LDAP_MOD, "activate_new_device($dn)"));
+        }else{
+          return(TRUE);
+        }
+      }
+    }
+    return(FALSE);
+  }
+
 
   /* !! Incoming dummy acls, required to defined acls for incoming objects
    */