Code

Fixed problem with OK dialog and automatic saving of objects.
[gosa.git] / gosa-plugins / systems / admin / systems / class_systemManagement.inc
index e49653d78523dfdac10151dadcf8c159f7c29edf..90933fa0412f530d76ea0864495907bf2f8e8036 100644 (file)
@@ -1,21 +1,23 @@
 <?php
 /*
-   This code is part of GOsa (https://gosa.gonicus.de)
-   Copyright (C) 2003  Cajus Pollmeier
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ *
+ * ID: $$Id$$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 class systems extends plugin
@@ -35,6 +37,14 @@ class systems extends plugin
 
   /* Arp hanlding activated */
   var $arp_handling_active = FALSE;
+  var $last_action = "";
+
+  var $dns = array();
+
+  var $system_activation_object = ""; // The object to activate (NewDevice)
+  var $fai_activated  = FALSE;
+
+  var $acl_module = array("incoming","terminal","workstation","server","printer","phone","winworkstation","component");
 
   function systems (&$config, $ui)
   {
@@ -42,6 +52,12 @@ class systems extends plugin
     $this->config= $config;
     $this->ui= $ui;
 
+    /* Add FAIstate to attributes if FAI is activated */
+    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
+    if(!empty($tmp)){
+      $this->fai_activated = TRUE;
+    }
+
     /* Creat dialog object */
     $this->DivListSystem = new divListSystem($this->config,$this);
 
@@ -54,7 +70,6 @@ class systems extends plugin
     if($this->config->search("ArpNewDevice","CLASS",array('tabs')) != ""){
       $this->arp_handling_active = TRUE;
     }
-
   }
 
 
@@ -63,7 +78,7 @@ class systems extends plugin
     /* Call parent execute */
     plugin::execute();
 
-    session::set('LOCK_VARS_TO_USE',array("/^system_edit_/i","/^system_del_/","/^act/","/^id/","/^item_selected/","/^remove_multiple_systems/"));
+    session::set('LOCK_VARS_TO_USE',array("/^system_edit_/i","/^system_del_/","/^act/","/^id/","/^item_selected/","/^remove_multiple_systems/","/^menu_action/"));
 
     /********************
       Check for functional posts, edit|delete|add|... system devices 
@@ -103,19 +118,6 @@ class systems extends plugin
       }
     }
    
-    /* Incoming handling  
-     * If someone made a systemtype and ogroup selection 
-     * Display the new requested entry type ... servtab  in case of server and so on.
-     */
-    if(isset($_POST['SystemTypeChoosen'])){
-      $SelectedSystemType = session::get('SelectedSystemType');
-      $s_action = "SelectedSystemType";
-      $s_entry  = $_POST['SystemType'];
-      $SelectedSystemType['ogroup'] = $_POST['ObjectGroup'];
-      $this->systab = NULL;
-      session::set('SelectedSystemType',$SelectedSystemType);
-    }
-
     /* remove image tags from posted entry  (posts looks like this 'name_x')*/
     $s_entry  = preg_replace("/_.$/","",$s_entry);
 
@@ -141,11 +143,32 @@ class systems extends plugin
       $s_action = "editPaste";
     }
 
+    /* Handle daemon events */
+    if(isset($_POST['menu_action']) && preg_match("/^trigger_event_/",$_POST['menu_action'])){
+      $s_action = $_POST['menu_action'];
+    }
+    
+    /* Handle daemon events */
+    if(isset($_POST['menu_action']) && preg_match("/^schedule_event_/",$_POST['menu_action'])){
+      $s_action = $_POST['menu_action'];
+    }
+
     /* handle remove from layers menu */
     if(isset($_POST['menu_action']) && preg_match("/^remove_multiple/",$_POST['menu_action'])){
       $s_action = "del_multiple";
     }
     
+    /* Handle instant actions from layers menu */
+    foreach (array("halt", "reboot", "reinstall", "update", "wake") as $act){
+           if(isset($_POST['menu_action']) && preg_match("/^${act}_multiple/",$_POST['menu_action'])){
+             $s_action = "${act}_multiple";
+           }
+    }
+
+    /* Activate multiple machines */
+    if(isset($_POST['menu_action']) && preg_match("/^activate_multiple/",$_POST['menu_action'])){
+      $s_action = "activate_multiple";
+    }
 
     /* Check for exeeded sizelimit */
     if (($message= check_sizelimit()) != ""){
@@ -157,6 +180,13 @@ class systems extends plugin
       return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
     }
 
+    /* Incoming handling  
+     * If someone made a systemtype and ogroup selection 
+     * Display the new requested entry type ... servtab  in case of server and so on.
+     */
+    if(isset($_POST['SystemTypeChoosen'])){
+      $s_action = "SelectedSystemType";
+    }
 
     /********************
       Copy & Paste Handling  ...
@@ -258,32 +288,144 @@ class systems extends plugin
 
 
     /********************
-      Create new system ...   
+      New Device hanlding  (Ogroup/System select dialog.)
      ********************/
-    /* Create new default terminal 
-     * Or create specified object of selected system type, from given incoming object  
-     */
 
-    $save_object_directly = false;
-    if(($s_action == "SelectedSystemType") && (isset($_POST['ObjectGroup']) && ($_POST['ObjectGroup'] != "none"))){
-      $save_object_directly = true;
+    if($s_action == "SelectedSystemType"){
+
+      /* Possible destination system types 
+       */
+      $tabs = array(
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     
+            "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     
+            "TABCLASS" =>"worktabs",      "ACL"=> "workstation"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABNAME"=>"servgeneric",     
+            "TABCLASS" =>"servtabs",      "ACL"=> "server"));
+
+      /* Remember dialog selection.
+       */
+      $selected_group = $_POST['ObjectGroup'];
+      $selected_system = $_POST['SystemType'];
+
+      $this->systab = NULL;
+
+      /* Check if system type exists. It should! */
+      if(isset($tabs[$selected_system])){
+
+        /* Get tab informations */
+        $class    = $tabs[$selected_system]["CLASS"];
+        $tabname  = $tabs[$selected_system]["TABNAME"];
+        $tabclass = $tabs[$selected_system]["TABCLASS"];
+        $acl_cat  = $tabs[$selected_system]["ACL"];
+
+        /* Go through all objects that should be activated */
+        foreach($this->system_activation_object as $key => $dn){
+
+          /* Remove entry from list, to avoid page-reload problems */
+          unset($this->system_activation_object[$key]);
+  
+          /* Load permissions for selected 'dn' and check if
+             we're allowed to create this 'dn' */
+          $this->dn = $dn;
+          $ui       = get_userinfo();
+          $tabacl   = $ui->get_permissions($this->dn,$acl_cat."/".$tabname);
+
+          /* We are allowed to create the requested system type */
+          if(preg_match("/c/",$tabacl)){
+            $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$selected_system);
+            $this->systab->set_acl_base($this->DivListSystem->selectedBase);
+            $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
+            $this->systab->base = $this->DivListSystem->selectedBase;
+
+
+            if($selected_group != "none"){
+
+              /*******
+               * Set gotoMode to active if we there was an ogroup selected. 
+               */
+              $found = false;
+              foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
+                if(isset($this->systab->by_object[$tab]->gotoMode)) {
+                  $found = true;
+                  $this->systab->by_object[$tab]->gotoMode = $value;
+                }
+              }
+              if(!$found){
+                msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG);
+              }
+
+              /*******
+               * Update object group membership
+               */
+              $og = new ogroup($this->config,$selected_group);
+              if($og){
+                $og->AddDelMembership($this->systab->dn);
+                $og->save();
+              }
+
+              /*******
+               * Set default system specific attributes 
+               */
+              foreach (array("workservice", "termservice") as $cls){
+                if (isset($this->systab->by_object[$cls])){
+                  $this->systab->by_object[$cls]->gotoXMouseport= "";
+                  $this->systab->by_object[$cls]->gotoXMouseType= "";
+                  $this->systab->by_object[$cls]->gotoXResolution= "";
+                  $this->systab->by_object[$cls]->gotoXColordepth= "";
+                }
+              }
+
+              // Enable activation
+              foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){
+                if (isset($this->systab->by_object[$cls])){
+                  $this->systab->by_object[$cls]->auto_activate= TRUE;
+                }
+              }
+
+              // Enable sending of LDAP events
+              if (isset($this->systab->by_object["workstartup"])){
+                $this->systab->by_object["workstartup"]->gotoLdap_inherit= TRUE;
+              }
+            }
+
+            /* Don't save directly if there is no objectGroup selected.
+               The user will then be able to configure the missing attributes 
+                on his own.
+             */
+            if($selected_group != "none"){
+              $this->systab->save();
+              $this->systab = NULL;
+
+              if(!isset($ldap)){
+                $ldap = $this->config->get_ldap_link();
+              }
+              $ldap->cd ($this->dn);
+              $ldap->cat($this->dn, array('dn'));
+              if(count($ldap->fetch())){
+                $ldap->cd($this->dn);
+                $ldap->rmDir($this->dn);
+              }
+            }
+          }else{
+            msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
+          }
+        }
+      }
     }
 
-    if (isset($_POST['create_system'])||$s_action=="newsystem"||$s_action == "SelectedSystemType") {
+
+    if (isset($_POST['create_system'])||$s_action=="newsystem") {
 
       /* If the current entry is an incoming object 
        * $sw = System type as posted in new incoming handling dialog 
        */ 
-      if($s_action == "SelectedSystemType") {
-        $sw         = $s_entry;
+      if(isset($_POST['system'])){
+        $sw = $_POST['system'];
       }else{
-        if(isset($_POST['system'])){
-          $sw = $_POST['system'];
-        }else{
-          $sw = $s_entry;
-        }
-        $this->dn= "new";
+        $sw = $s_entry;
       }
+      $this->dn= "new";
 
       $tabs = array(
           "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
@@ -309,18 +451,39 @@ class systems extends plugin
           $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
           $this->systab->base = $this->DivListSystem->selectedBase;
         }else{
-          print_red(_("You are not allowed to create a new object of this type."));
+          msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
+        }
+      }
+    }
+
+
+    /********************
+      System activation
+     ********************/
+
+    /* User wants to edit data? */
+    if (($s_action == "activate_multiple") && (!isset($this->systab->config))){
+      $this->system_activation_object = array();
+      foreach($this->list_get_selected_items() as $id) {
+        $obj = $this->terminals[$id];
+        $type= $this->get_system_type($obj);
+        if($type == "NewDevice"){
+          $this->system_activation_object[] = $obj['dn'];
         }
       }
+      if(count($this->system_activation_object)){
+        $this->systab = new SelectDeviceType($this->config,$this->system_activation_object) ;
+      }
     }
 
+
     /********************
       Edit system ...   
      ********************/
 
     /* User wants to edit data? */
     if (($s_action == "edit") && (!isset($this->systab->config))){
-
+      $this->last_action = "";
       $this->dn= $this->terminals[$s_entry]['dn'];
 
       /* Check locking, save current plugin in 'back_plugin', so
@@ -350,6 +513,7 @@ class systems extends plugin
       if($type == "ArpNewDevice"){
         $this->systab = new ArpNewDeviceTabs($this->config,$this->config->data['TABS']['ARPNEWDEVICETABS'],$this->dn);
       }elseif($type == "NewDevice"){
+        $this->system_activation_object= array($this->dn);
         $this->systab = new SelectDeviceType($this->config,$this->dn) ;
       }elseif(isset($tabs[$type])){
 
@@ -362,8 +526,8 @@ class systems extends plugin
         session::set('objectinfo',$this->dn);
         add_lock ($this->dn, $this->ui->dn);
       }else{ 
-        print_red (_("You can't edit this object type yet!"));
-        del_lock($this->dn);
+        msg_dialog::display(_("Error"), _("Editing this type of object is not supported yet!"), ERROR_DIALOG);
+        $this->remove_lock();
       }
     }
 
@@ -375,22 +539,30 @@ class systems extends plugin
     /* Set terminals root password */
     if ($s_action=="change_pw"){
       $tabs = array(
-          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
-          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"));
+          "ArpNewDevice"=> array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "incoming/systems"),
+          "NewDevice"   => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "incoming/systems"),
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal/termgeneric"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation/workgeneric"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server/servgeneric"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABCLASS" =>"printtabs",     "ACL"=> "printer/printgeneric"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone/phoneGeneric"),
+          "winstation"  => array("CLASS"=>"WINTABS",      "TABCLASS" =>"wintabs",       "ACL"=> "winworkstation/wingeneric"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric"));
 
+      $dn   = $this->terminals[$s_entry]['dn'];
       $type = $this->get_system_type($this->terminals[$s_entry]);
+
       $class    = $tabs[$type]["CLASS"];
-      $tabname  = $tabs[$type]["TABNAME"];
-      $acl_cat  = $tabs[$type]["ACL"];
+      $acl      = $tabs[$type]["ACL"];
       $tabclass = $tabs[$type]["TABCLASS"];
       $ui       = get_userinfo();
-      $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd");
+      $tabacl   = $ui->get_permissions($dn,$acl,"userPassword");
       if(preg_match("/w/",$tabacl)){
         $this->dn= $this->terminals[$s_entry]['dn'];
         session::set('objectinfo',$this->dn);
         return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
       }else{
-        print_red(_("You are not allowed to change the password for this object."));
+        msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
       }
     }
 
@@ -402,7 +574,7 @@ class systems extends plugin
     /* Correctly specified? */
     if (isset($_POST['password_finish'])){
       if ($_POST['new_password'] != $_POST['repeated_password']){
-        print_red (_("Passwords entered as new and repeated do not match!"));
+        msg_dialog::display(_("Error"), _("The passwords you've entered as 'New password' and 'Repeated password' do not match!"), ERROR_DIALOG);
         return($smarty->fetch(get_template_path('password.tpl', TRUE)));
       }
     }
@@ -417,49 +589,92 @@ class systems extends plugin
 
       /* Check if user is allowed to set password */
       $tabs = array(
-          "terminal"    => array("CLASS"=>"TERMTABS",     "TABNAME"=>"termgeneric",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal"),
-          "workstation" => array("CLASS"=>"WORKTABS",     "TABNAME"=>"workgeneric",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation"));
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal/termgeneric"    ,"PLUG"=>"termgeneric"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation/workgeneric" ,"PLUG"=>"workgeneric"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server/servgeneric"      ,"PLUG"=>"servgeneric"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric","PLUG"=>"componentGeneric"));
 
       /* Detect object type */
       $type = "";
       foreach($this->terminals as $terminal){
         if($terminal['dn'] == $this->dn){
-          $type = $this->get_system_type($terminal);
+          $type  = $this->get_system_type($terminal);
           break;
         } 
       }
 
       /* Type detected */
-      if(!empty($type)){
+      $allow_for = array("terminal","workstation","server","component");
+      if(!empty($type) && in_array($type,$allow_for)){
 
         /* Get infos */
+        $plug     = $tabs[$type]["PLUG"];
         $class    = $tabs[$type]["CLASS"];
-        $tabname  = $tabs[$type]["TABNAME"];
-        $acl_cat  = $tabs[$type]["ACL"];
+        $acl      = $tabs[$type]["ACL"];
         $tabclass = $tabs[$type]["TABCLASS"];
     
         /* Get acls */
         $ui       = get_userinfo();
-        $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd");
+        $tabacl   = $ui->get_permissions($this->dn,$acl,"userPassword");
 
         /* Check acls */
         if(preg_match("/w/",$tabacl)){
           $ldap = $this->config->get_ldap_link();
           $ldap->cd($this->dn);
+          $ldap->cat($this->dn);
+          $old_attrs = $ldap->fetch();
 
           $attrs= array();
           if ($_POST['new_password'] == ""){
-            $attrs['gotoRootPasswd']= array();
+
+            /* Remove password attribute 
+             */
+            if(in_array("simpleSecurityObject",$old_attrs['objectClass'])){
+              $attrs['objectClass'] = array();
+              for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
+                if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){
+                  $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
+                }
+              }
+            }
+            $attrs['userPassword']= array();
           } else {
-            $attrs['gotoRootPasswd']= crypt($_POST['new_password'],substr(session_id(),0,2));
+
+            /* Add/modify password attribute 
+             */
+            if(!in_array("simpleSecurityObject",$old_attrs['objectClass'])){
+              $attrs['objectClass'] = array();
+              for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
+                $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
+              }
+              $attrs['objectClass'][] = "simpleSecurityObject";
+            }
+
+            if(class_available("passwordMethodCrypt")){
+              $pwd_m = new passwordMethodCrypt($this->config);
+              $pwd_m->set_hash("crypt/md5");
+              $attrs['userPassword'] = $pwd_m->generate_hash($_POST['new_password']);
+            }else{
+              msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password."));
+              $attrs = array();
+            }
           }
           $ldap->modify($attrs);
+          if (!$ldap->success()){
+            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+          }else{
+            if(class_available($plug)){
+              $p = new $plug($this->config,$this->dn);
+              $p->handle_post_events("modify");
+            }
+          }
+  
           new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error());
         }else{
-          print_red(_("You are not allowed to change the password for this object."));
+          msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
         }
       }else{
-        print_red(_("Can't detect object to change password."));
+        msg_dialog::display(_("Error"), _("Cannot determine object to change password!"), ERROR_DIALOG);
       }
       session::un_set('objectinfo');
     }
@@ -471,11 +686,94 @@ class systems extends plugin
 
     /* Delete terminal canceled? */
     if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
-      del_lock ($this->dn);
+      $this->remove_lock();
       session::un_set('objectinfo');
     }
 
 
+    /********************
+      Action(s) for MULTIPLE
+     ********************/
+
+    /********************
+      SCHEDULE action in GOsa Daemon
+     ********************/
+
+    if(preg_match("/^schedule_event_/",$s_action) || preg_match("/^trigger_event_/",$s_action)){
+      $this->dns = array();
+      $ids = $this->list_get_selected_items();
+
+      if(count($ids)){
+        $mac= array();
+
+        $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];
+          }
+        }
+        $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
+        $type = preg_replace("/^[a-z]*_event_/","",$s_action);
+        $o_queue = new gosaSupportDaemon();
+
+        /* Skip installation or update trigerred events, 
+         *  if this entry is currently processing.
+         */
+        if(preg_match("/trigger_event/",$s_action) && in_array($type,array("DaemonEvent_reinstall","DaemonEvent_update"))){
+          foreach($mac as $key => $mac_address){
+            foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
+
+              $entry['STATUS'] = strtoupper($entry['STATUS']);
+              if($entry['STATUS'] == "PROCESSING" && 
+                  isset($events['QUEUED'][$entry['HEADERTAG']]) && 
+                  in_array($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
+                unset($mac[$key]);
+
+                new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
+                break;
+              }
+            }
+          }
+        }        
+
+        /* Prepare event to be added 
+         */
+        if(count($mac) && isset($events['BY_CLASS'][$type])){
+          $event = $events['BY_CLASS'][$type];
+          $this->systab = new $event['CLASS_NAME']($this->config);
+          $this->systab->add_targets($mac);
+          if(preg_match("/trigger_event/",$s_action)){
+            $this->systab->set_type(TRIGGERED_EVENT);
+          }else{
+            $this->systab->set_type(SCHEDULED_EVENT);
+          }
+        }
+      }
+    }
+
+    /* Insert scheduled events into queue */
+    if($this->systab instanceof DaemonEvent){
+      $this->systab->save_object();
+
+      /* Save event 
+       */
+      if(isset($_POST['save_event_dialog']) || $this->systab->get_type() == TRIGGERED_EVENT){
+        $o_queue = new gosaSupportDaemon();
+        $o_queue->append($this->systab);
+        if($o_queue->is_error()){
+          msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+        }else{
+          $this->systab = FALSE;
+        }
+      }
+      if(isset($_POST['abort_event_dialog'])){
+        $this->systab = FALSE;
+      }
+    }
+
+
     /********************
       Delete MULTIPLE entries requested, display confirm dialog
      ********************/
@@ -484,31 +782,57 @@ class systems extends plugin
       $this->dns = array();
       $ids = $this->list_get_selected_items();
 
+      $ui = get_userinfo();
+      $tabs = array(
+          "ArpNewDevice"=> array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "incoming/systems"),
+          "NewDevice"   => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "incoming/systems"),
+          "terminal"    => array("CLASS"=>"TERMTABS",     "TABCLASS" =>"termtabs",      "ACL"=> "terminal/termgeneric"),
+          "workstation" => array("CLASS"=>"WORKTABS",     "TABCLASS" =>"worktabs",      "ACL"=> "workstation/workgeneric"),
+          "server"      => array("CLASS"=>"SERVTABS",     "TABCLASS" =>"servtabs",      "ACL"=> "server/servgeneric"),
+          "printer"     => array("CLASS"=>"PRINTTABS",    "TABCLASS" =>"printtabs",     "ACL"=> "printer/printgeneric"),
+          "phone"       => array("CLASS"=>"PHONETABS",    "TABCLASS" =>"phonetabs",     "ACL"=> "phone/phoneGeneric"),
+          "winstation"  => array("CLASS"=>"WINTABS",      "TABCLASS" =>"wintabs",       "ACL"=> "winworkstation/wingeneric"),
+          "component"   => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric"));
+
+
       if(count($ids)){
 
+        $disallowed = array();
         foreach($ids as $id){
-          $dn = $this->terminals[$id]['dn'];
-          if (($user= get_lock($dn)) != ""){
-            return(gen_locked_message ($user, $dn));
+
+          /* Get 'dn' from posted termlinst */
+          $attrs  = $this->terminals[$id];
+          $type   = $this->get_system_type($attrs);
+          $dn     = $attrs['dn'];
+          $acl = $this->ui->get_permissions($dn, $tabs[$type]['ACL']);
+          if(preg_match("/d/",$acl)){
+            $this->dns[$id] = $dn;
+          }else{
+            $disallowed[] = $dn;
           }
-          $this->dns[$id] = $dn;
         }
 
-        $dns_names = "<br><pre>";
-        foreach($this->dns as $dn){
-          add_lock ($dn, $this->ui->dn);
-          $dns_names .= $dn."\n";
+        if(count($disallowed)){
+          msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
         }
-        $dns_names .="</pre>";
 
-        /* Lock the current entry, so nobody will edit it during deletion */
-        if (count($this->dns) == 1){
-          $smarty->assign("warning",     sprintf(_("You're about to delete the following entry %s"), @LDAP::fix($dns_names)));
-        } else {
-          $smarty->assign("warning",     sprintf(_("You're about to delete the following entries %s"), @LDAP::fix($dns_names)));
+        if(count($this->dns)){
+
+          if ($user= get_multiple_locks($this->dns)){
+            return(gen_locked_message($user,$this->dns));
+          }
+
+          $dns_names = array();
+          foreach($this->dns as $dn){
+            add_lock ($dn, $this->ui->dn);
+            $dns_names[] = @LDAP::fix($dn);
+          }
+
+          /* Lock the current entry, so nobody will edit it during deletion */
+          $smarty->assign("warning", msgPool::deleteInfo($dns_names));
+          $smarty->assign("multiple", true);
+          return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
         }
-        $smarty->assign("multiple", true);
-        return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       }
     }
 
@@ -554,7 +878,11 @@ class systems extends plugin
           if(preg_match("/d/",$tabacl)){ 
 
             /* Delete request is permitted, perform LDAP action */
-            if($tabtype=="phonetabs"){
+            if(in_array($type,array("ArpNewDevice","NewDevice")) && class_available("termgeneric")){
+              $this->systab= new termgeneric($this->config, $dn);
+              $this->systab->set_acl_base($dn);
+              $this->systab->remove_from_parent();
+            }elseif($tabtype=="phonetabs"){
               $this->systab= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $dn,$type);
               $this->systab->set_acl_base($dn);
               $this->systab->by_object['phoneGeneric']->remove_from_parent ();
@@ -569,13 +897,14 @@ class systems extends plugin
           } else {
             /* Normally this shouldn't be reached, send some extra
                logs to notify the administrator */
-            print_red (_("You are not allowed to delete this component!"));
+            msg_dialog::display(_("Permission error"), msgPool::permDelete(), ERROR_DIALOG);
             new log("security","systems/".get_class($this),$dn,array(),"Tried to trick deletion.");
           }
-          /* Remove lock file after successfull deletion */
-          del_lock ($dn);
-          unset($this->dns[$key]);
         }
+
+        /* Remove lock file after successfull deletion */
+        $this->remove_lock();
+        $this->dns = array();
       }
     }
 
@@ -585,11 +914,11 @@ class systems extends plugin
 
     /* Remove lock */
    if(isset($_POST['delete_multiple_system_cancel'])){
-      foreach($this->dns as $key => $dn){
-        del_lock ($dn);
-        unset($this->dns[$key]);
-      }
-    }
+
+     /* Remove lock file after successfull deletion */
+     $this->remove_lock();
+     $this->dns = array();
+   }
 
 
     /********************
@@ -640,14 +969,14 @@ class systems extends plugin
 
         /* Lock the current entry, so nobody will edit it during deletion */
         add_lock ($this->dn, $this->ui->dn);
-        $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), @LDAP::fix($this->dn)));
+        $smarty->assign("warning", msgPool::deleteInfo(@LDAP::fix($this->dn)));
         $smarty->assign("multiple", false);
         return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       } else {
 
         /* Obviously the user isn't allowed to delete. Show message and
            clean session. */
-        print_red (_("You are not allowed to delete this component!"));
+        msg_dialog::display(_("Permission error"), msgPool::permDelete(), ERROR_DIALOG);
       }
     }
 
@@ -691,7 +1020,11 @@ class systems extends plugin
       if(preg_match("/d/",$tabacl)){
 
         /* Delete request is permitted, perform LDAP action */
-        if($tabtype=="phonetabs"){
+        if(in_array($type,array("ArpNewDevice","NewDevice")) && class_available("termgeneric")){
+          $this->systab= new termgeneric($this->config, $this->dn);
+          $this->systab->set_acl_base($this->dn);
+          $this->systab->remove_from_parent();
+        }elseif($tabtype=="phonetabs"){
           $this->systab= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $this->dn,$type);
           $this->systab->set_acl_base($this->dn);
           $this->systab->by_object['phoneGeneric']->remove_from_parent ();
@@ -708,115 +1041,74 @@ class systems extends plugin
 
         /* Normally this shouldn't be reached, send some extra
            logs to notify the administrator */
-        print_red (_("You are not allowed to delete this component!"));
+        msg_dialog::display(_("Permission error"), msgPool::permDelete(), ERROR_DIALOG);
         new log("security","systems/".get_class($this),$dn,array(),"Tried to trick deletion.");
       }
 
       /* Remove lock file after successfull deletion */
-      del_lock ($this->dn);
+      $this->remove_lock();
     }
 
 
-
-
-
-
-
-
-
-   /********************
+    /********************
       Edit system type finished, check if everything went ok
      ********************/
     /* Finish user edit is triggered by the tabulator dialog, so
        the user wants to save edited data. Check and save at this
        point. */
-    if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config)) || $save_object_directly){
-
-      /* Check tabs, will feed message array */
-      $message = array();
-      if(!$save_object_directly){
-        $message = $this->systab->check();
-      }else{
-        $found = false;
 
-        /* Set gotoMode to active if we there was an ogroup selected . (save_object_directly) */
-        foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
-          if(isset($this->systab->by_object[$tab]->gotoMode)) {
-            $found = true;
-            $this->systab->by_object[$tab]->gotoMode = $value;
-          }
-        }
-        if(!$found){
-          print_red(sprintf(_("Can't set gotoMode to status 'active', the current object couldn't be identified.")));
-        }
+    /* Dirty workaround - MSG_DIALOG - OK
+      If a message dialog is shown and we press 'OK'
+       then try to save again.
+     */
+    foreach($_POST as $name => $value){
+      if(preg_match("/^MSG_OK/",$name)){
+        $_POST[$this->last_action] = TRUE;
+      }
+    }
 
+    if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config))){
+
+      /* If the save routine gets interrupted by a confirm dialog, 
+          store last action so we can trigger it again after 'Ok' was pressed.
+         (This is the case if a system gets modified while it is installing - GOsa si)
+       */
+      $this->last_action = ""; 
+      if(isset($_POST['edit_finish'])){
+        $this->last_action = "edit_finish"; 
+      }elseif(isset($_POST['edit_apply'])){
+        $this->last_action = "edit_apply";
       }
-      /* Save, or display error message? */
-      if (count($message) == 0){
 
-        /* Incoming behavior; you can select a system type and an ogroup membership.
-         * If this object is an Incoming object, session::get('SelectedSystemType') isset.
-         * Check if we must add the new object to an object group.
-         *
-         * If this is done, delete the old incoming entry... it is still there, because this is a new
-         * entry and not an edited one, so we will delete it.
-         *
-         */
+      /* Check tabs, will feed message array */
+      $message = $this->systab->check();
 
-        if(session::is_set('SelectedSystemType')){
-          $SelectedSystemType = session::get('SelectedSystemType');
-          if($SelectedSystemType['ogroup'] != "none"){
-            $og = new ogroup($this->config,$SelectedSystemType['ogroup']);
-            if($og){
-              $og->AddDelMembership($this->systab->dn);
-              $og->save();
-            }
-          }
-        }
+      /* Save, or display error message? */
+      if (count($message) == 0){
 
-        /* Save terminal data to ldap */
-        $SelectedSystemType = session::get('SelectedSystemType');
-        if(isset($SelectedSystemType['ogroup']) && $SelectedSystemType['ogroup'] != 'none'){
-          foreach (array("workservice", "termservice") as $cls){
-            if (isset($this->systab->by_object[$cls])){
-              $this->systab->by_object[$cls]->gotoXMouseport= "";
-              $this->systab->by_object[$cls]->gotoXMouseType= "";
-              $this->systab->by_object[$cls]->gotoXResolution= "";
-              $this->systab->by_object[$cls]->gotoXColordepth= "";
-            }
-          }
-        }
 
         $this->systab->save();
 
-        if(session::is_set('SelectedSystemType')){
-          session::un_set('SelectedSystemType');
-          if(!isset($ldap)){
-            $ldap = $this->config->get_ldap_link();
-          }
-          $ldap->cd ($this->dn);
-          $ldap->cat($this->dn, array('dn'));
-          if(count($ldap->fetch())){
-            $ldap->cd($this->dn);
-            $ldap->rmDir($this->dn);
-          }
-          $ldap->cd($this->config->current['BASE']);
-        }
-
         /* Terminal has been saved successfully, remove lock from LDAP. */
         if (!isset($_POST['edit_apply'])){
           if ($this->dn != "new"){
-            del_lock ($this->dn);
+            $this->remove_lock();
           }
 
           unset ($this->systab);
           $this->systab= NULL;
           session::un_set('objectinfo');
+        }else{
+      
+          /* Reinitialize tab */
+          if($this->systab instanceof tabs){
+            $this->systab->re_init();
+          }
         }
       } else {
         /* Ok. There seem to be errors regarding to the tab data,
            show message and continue as usual. */
-        show_errors($message);
+        msg_dialog::displayChecks($message);
       }
     }
 
@@ -827,16 +1119,11 @@ class systems extends plugin
     /* Cancel dialogs */
     if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel']) || isset($_POST['SystemTypeAborted'])){
       if (isset($this->systab)){
-        del_lock ($this->systab->dn);
+        $this->remove_lock();
         unset ($this->systab);
       }
       $this->systab= NULL;
       session::un_set('objectinfo');
-
-      /* Remove ogroup selection, which was set while editing a new incoming entry */
-      if(session::is_set('SelectedSystemType')){
-        session::un_set('SelectedSystemType');
-      }
     }
 
     /********************
@@ -851,6 +1138,7 @@ class systems extends plugin
 
       $dialog     = FALSE;
       $hide_apply = $this->dn == "new";
+      $hide_apply = ($this->dn == "new") || (preg_match("/".normalizePreg(get_ou("incomingou"))."/",$this->dn));
       if(is_object($this->systab) && !isset($this->systab->by_object)){
         $dialog = TRUE;
         $hide_apply = TRUE;
@@ -867,13 +1155,13 @@ class systems extends plugin
 
       if (!$dialog){
         $display.= "<p style=\"text-align:right\">\n";
-        $display.= "<input type=\"submit\" name=\"edit_finish\" style=\"width:80px\" value=\""._("Ok")."\">\n";
+        $display.= "<input type=\"submit\" name=\"edit_finish\" style=\"width:80px\" value=\"".msgPool::okButton()."\">\n";
         $display.= "&nbsp;\n";
         if (!$hide_apply){
-          $display.= "<input type=submit name=\"edit_apply\" value=\""._("Apply")."\">\n";
+          $display.= "<input type=submit name=\"edit_apply\" value=\"".msgPool::applyButton()."\">\n";
           $display.= "&nbsp;\n";
         }
-        $display.= "<input type=\"submit\" name=\"edit_cancel\" value=\""._("Cancel")."\">\n";
+        $display.= "<input type=\"submit\" name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">\n";
         $display.= "</p>";
       }
       return ($display);
@@ -881,7 +1169,7 @@ class systems extends plugin
 
     /* Check if there is a snapshot dialog open */
     $base = $this->DivListSystem->selectedBase;
-    if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases())){
+    if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases(),$this)){
       return($str);
     }
 
@@ -891,7 +1179,13 @@ class systems extends plugin
 
     /* Add departments if subsearch is disabled */
     if(!$this->DivListSystem->SubSearch){
-      $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,3,1);
+
+      /* Add FAIstate to attributes if FAI is activated */
+      if($this->fai_activated){
+        $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,4,1);
+      }else{
+        $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,3,1);
+      }
     }
     $this->reload();
     $this->DivListSystem->setEntries($this->terminals);
@@ -939,6 +1233,9 @@ class systems extends plugin
   function save_object()
   {
     $this->DivListSystem->save_object();
+    if(is_object($this->CopyPasteHandler)){
+      $this->CopyPasteHandler->save_object();
+    }
   }
 
 
@@ -953,7 +1250,7 @@ class systems extends plugin
   {
   }
 
-  function adapt_from_template($dn)
+  function adapt_from_template($dn, $skip= array())
   {
   }
 
@@ -998,7 +1295,7 @@ class systems extends plugin
     }
 
     /* Attributes to fetch */
-    $sys_attrs        = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode");
+    $sys_attrs        = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode","FAIclass");
     $sys_categories   = array("terminal", "workstation", "server", "phone" ,"printer","incoming");
 
     /* Add FAIstate to attributes if FAI is activated */
@@ -1013,20 +1310,14 @@ class systems extends plugin
         if($this->DivListSystem->SubSearch){
           if($oc['CLASS'] != ""){
             $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
-            $new_res = get_sub_list($filter, $sys_categories ,preg_replace("/,.*$/","",$base), $base,$sys_attrs, GL_NONE | GL_SUBSEARCH | GL_SIZELIMIT);
-      
-            /* Remove all objects that are not in the expected sub department */
-            foreach($new_res as $key => $obj){
-              if(preg_match("/^[^,]+,".normalizePreg($oc['TREE'])."/",$obj['dn'])){
-                $res[$obj['dn']] = $obj;
-              }
-            }
+            $new_res = get_sub_list($filter, $sys_categories ,$oc['TREE'], $base,$sys_attrs, GL_SUBSEARCH | GL_SIZELIMIT);
+            $res = array_merge($res,$new_res);
           }
         }else{
           /* User filter? */
           if($oc['CLASS'] != ""){
             $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
-            $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs, GL_NONE | GL_SIZELIMIT));
+            $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs,  GL_SIZELIMIT));
           }
         }
       } 
@@ -1034,7 +1325,7 @@ class systems extends plugin
 
     /* Search for incoming objects */ 
     $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))";
-    $res = array_merge($res,get_list($filter,$sys_categories, get_ou('incomingou').$base,$sys_attrs, GL_NONE | GL_SIZELIMIT));
+    $res = array_merge($res,get_list($filter,$sys_categories, get_ou('incomingou').$base,$sys_attrs, GL_SIZELIMIT));
 
     /* Get all gotoTerminal's */
     foreach ($res as $value){
@@ -1100,9 +1391,9 @@ class systems extends plugin
             $terminal['location'] = array_search($tmp, $this->config->departments);
             $terminal['message']  = _("Workstation template for")."&nbsp;'".$dn_name."'&nbsp;";
           }
-          if (isset($value["FAIstate"][0])){
-            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
-          }
+#          if (isset($value["FAIstate"][0])){
+#            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
+#          }
         }
       } elseif (in_array_ics('gotoPrinter', $value["objectClass"])){
        
@@ -1120,9 +1411,9 @@ class systems extends plugin
 
           $terminal             = $value;
           $terminal['type']     = "S";
-          if (isset($value["FAIstate"][0])){
-            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
-          }
+#          if (isset($value["FAIstate"][0])){
+#            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
+#          }
         }
       } elseif (in_array_ics('goFonHardware', $value["objectClass"])){
 
@@ -1188,6 +1479,12 @@ class systems extends plugin
     if (isset($this->systab->dn)){
       del_lock ($this->systab->dn);
     }
+    if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
+      del_lock($this->dn);
+    }
+    if(isset($this->dns) && is_array($this->dns) && count($this->dns)){
+      del_lock($this->dns);
+    }
   }
 
 
@@ -1198,6 +1495,7 @@ class systems extends plugin
       return("");
     }
 
+    $ui = get_userinfo();
 
     $tabs = array(
         "terminal"    => array( "CLASS"     =>"TERMTABS",     "TABNAME" =>"termgeneric",     
@@ -1224,9 +1522,15 @@ class systems extends plugin
 
       $tab_o  = $tabs[$type]['CLASS'];
       $tab_c  = $tabs[$type]['TABCLASS'];
+      $acl_c  = $tabs[$type]['TABNAME'];
       $acl    = $tabs[$type]['ACL'];
 
-      $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl);
+      if($s_action == "copy" && $ui->is_copyable($dn,$acl,$acl_c)){
+        $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl);
+      }
+      if($s_action == "cut" && $ui->is_cutable($dn,$acl,$acl_c)){
+        $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl);
+      }
     }
 
     /* Add entries to queue */
@@ -1244,12 +1548,13 @@ class systems extends plugin
         if(isset($tabs[$type])){
           $tab_o  = $tabs[$type]['CLASS'];
           $tab_c  = $tabs[$type]['TABCLASS'];
+          $acl_c  = $tabs[$type]['TABNAME'];
           $acl    = $tabs[$type]['ACL'];
 
-          if($s_action == "copy_multiple"){
+          if($s_action == "copy_multiple" && $ui->is_copyable($dn,$acl,$acl_c)){ 
             $this->CopyPasteHandler->add_to_queue($dn,"copy",$tab_c,$tab_o,$acl);
           }
-          if($s_action == "cut_multiple"){
+          if($s_action == "cut_multiple" && $ui->is_cutable($dn,$acl,$acl_c)){
             $this->CopyPasteHandler->add_to_queue($dn,"cut",$tab_c,$tab_o,$acl);
           }
         }
@@ -1263,12 +1568,9 @@ class systems extends plugin
   
     /* Return C&P dialog */
     if($this->start_pasting_copied_objects && $this->CopyPasteHandler->entries_queued()){
-    
-      /* Load entry from queue and set base */
-      $this->CopyPasteHandler->load_entry_from_queue();
-      $this->CopyPasteHandler->SetVar("base",$this->DivListSystem->selectedBase);
 
       /* Get dialog */
+      $this->CopyPasteHandler->SetVar("base",$this->DivListSystem->selectedBase);
       $data = $this->CopyPasteHandler->execute();
 
       /* Return dialog data */
@@ -1317,30 +1619,82 @@ class systems extends plugin
   function convert_list($input)
   {
     $temp= "";
-    $conv= array(      
-        "NQ" => array("select_newsystem.png",_("New System from incoming")),
+
+    $conv= array(
         "D" => array("select_default.png",_("Template")),
-        "T" => array("select_terminal.png",_("Terminal")),
-        "L" => array("select_workstation.png",_("Workstation")),
-        "GL" => array("select_workstation_green.png",_("Workstation is installing")),
-        "YL" => array("select_workstation_yellow.png",_("Workstation is waiting for action")),
-        "RL" => array("select_workstation_red.png",_("Workstation installation failed")),
         "F" => array("select_phone.png",_("Phone")),
+        "C" => array("select_component.png",_("Network device")),
+        "P" => array("select_printer.png",_("Printer")),
+
+        "W" => array("select_winstation.png",_("Win workstation")),
+
+        "L" => array("select_workstation.png",_("Workstation")),
         "S" => array("select_server.png",_("Server")),
-        "GS" => array("select_server_green.png",_("Server is installing")),
-        "YS" => array("select_server_yellow.png",_("Server is waiting for action")),
-        "RS" => array("select_server_red.png",_("Server installation failed")),
-        "W" => array("select_winstation.png",_("Winstation")),
-        "C" => array("select_component.png",_("Network Device")),
-        "NT"=> array("select_new_terminal.png",_("New Terminal")),
-        "NL"=> array("select_new_workstation.png",_("New Workstation")),
-        "P" => array("select_printer.png",_("Printer")));
+        "T" => array("select_terminal.png",_("Terminal")),
+
+        "LX" => array("workstation_locked.png",_("Locked workstation")),
+        "SX" => array("server_locked.png",_("Locked server")),
+        "TX" => array("terminal_locked.png",_("Locked terminal")),
 
+        "LE" => array("workstation_error.png",_("Workstation error")),
+        "SE" => array("server_error.png",_("Server error")),
+        "TE" => array("terminal_error.png",_("Terminal error")),
+
+        "LB" => array("workstation_busy.png",_("Workstation busy")),
+        "SB" => array("server_busy.png",_("Server busy")),
+
+        "NQ" => array("select_newsystem.png",_("New system from incoming")),
+        "NT"=> array("select_new_terminal.png",_("New terminal")),
+        "NL"=> array("select_new_workstation.png",_("New workstation")));
+
+    /* Use locked icons 
+     */
+    if( in_array($input['type'],array("S","T","L")) && 
+        isset($input['gotoMode'][0]) && 
+        preg_match("/locked/",$input['gotoMode'][0])){
+      $input['type'].="X";
+    } elseif(in_array($input['type'],array("S","L")) &&
+        isset($input['FAIstate'][0])){
+
+    /* Add FAI state icons 
+     */
+      $type= "";
+      switch (preg_replace('/:.*$/', '', $input['FAIstate'][0])) {
+        case 'error':
+          $type= 'E';
+          break;
+        case 'installing':
+        case 'install':
+        case 'sysinfo':
+        case 'softupdate':
+        case 'scheduledupdate':
+          $type= 'B';
+          break;
+      }
+
+      $input['type'].= $type;
+    }   
+
+    /* Use new images if object is from incoming 
+     */
     if((isset($input['is_new']))&&(!empty($input['is_new']))){
       $input['type']="N".$input['type'];
     }
+
+    /* Check which flags this objects uses 
+     */
     foreach ($conv  as $key => $value){
-      if($input['type']==$key){
+      $found = TRUE;
+      if(strlen($key) != strlen($input['type'])) {
+        $found = FALSE;
+      }
+      for($i = 0 ; $i < strlen($key) ; $i++){
+        if(!preg_match("/".$key[$i]."/",$input['type'])){
+          $found = FALSE;
+        }
+      }
+
+      if($found){
         $tmp['img'] ="<img class='center' src='images/".$value[0]."' alt='".$key."' title='".$value['1']."'>";
         $tmp['class']=$key;
         return $tmp;
@@ -1348,28 +1702,6 @@ class systems extends plugin
     }
   }
 
-  
-  function getState($type, $state)
-  {
-    switch (preg_replace('/:.*$/', '', $state)) {
-      case 'installing':
-                $type= 'G'.$type;
-                break;
-      case 'error':
-                $type= 'R'.$type;
-                break;
-      case 'install':
-      case 'sysinfo':
-      case 'softupdate':
-      case 'scheduledupdate':
-                $type= 'Y'.$type;
-                break;
-    }
-
-
-    return ($type);
-  }
-
 
   function list_get_selected_items()
   {
@@ -1401,10 +1733,6 @@ class systems extends plugin
             
           ));
   }
-
-
-  
-
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: