Code

Save posted values
[gosa.git] / gosa-plugins / goto / admin / systems / goto / class_terminalStartup.inc
index 2e7675e2fc0e261e7578147280e1055a02070077..407af739456ea436c02ac5bc7cbd0e5d4c06c0d5 100644 (file)
 <?php
 class termstartup extends plugin
 {
-  /* CLI vars */
-  var $cli_summary= "Manage terminal startup options";
-  var $cli_description= "Some longer text\nfor help";
-  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
-  /* Generic terminal attributes */
-  var $bootmode= "G";
-  var $goLdapServerList= array();
-  var $gotoBootKernel= "default-inherit";
-  var $gotoKernelParameters= "";
-  var $gotoLdapServer= "";
-  var $gotoModules= array();
-  var $gotoTerminalPath= "";
-  var $gotoBootKernels= array();
-
-  /* Ldap server list */
-  var $gotoLdapServers    = array();
-  var $gotoLdapServerList = array();
-  var $gotoLdap_inherit   = FALSE;
-
-  /* Share */
-  var $gotoShares         = array();// Currently Share Option
-  var $gotoShare          = "";     // currently selected Share Option
-  var $gotoShareSelections= array();// Available Shares for this account in Listbox format
-  var $gotoAvailableShares= array();// Available Shares for this account
-
-
-  /* attribute list for save action */
-  var $attributes= array("gotoLdapServer", "gotoBootKernel", "gotoKernelParameters","gotoModules");
-  var $objectclasses= array("GOhard");
-  var $view_logged = FALSE;
-
-  /* Helper */
-  var $customParameters= "";
-  var $orig_dn= "";
-  var $ignore_account= TRUE;
-
-  function termstartup (&$config, $dn= NULL, $parent= NULL)
-  {
-    plugin::plugin ($config, $dn, $parent);
-
-    $this->gotoBootKernels = array("default-inherit"=>"["._("inherited")."]");
-
-    /* Get arrays */
-    foreach (array("gotoModules") as $val){
-      $this->$val = array();
-      if (isset($this->attrs["$val"]["count"])){
-        for ($i= 0; $i<$this->attrs["count"]; $i++){
-          if (isset($this->attrs["$val"][$i])){
-            array_push($this->$val, $this->attrs["$val"][$i]);
-          }
-        }
-      }
-      sort ($this->$val);
-      $this->$val= array_unique($this->$val);
-    }
+    /* Generic terminal attributes */
+    var $goLdapServerList= array();
+    var $gotoBootKernel= "default-inherited";
+    var $gotoKernelParameters= "";
+    var $gotoLdapServer= "default-inherited";
+    var $gotoModules= array();
+    var $gotoTerminalPath= "";
+    var $gotoBootKernels= array();
+
+    /* Ldap server list */
+    var $gotoLdapServers    = array();
+    var $gotoLdapServerList = array();
+    var $gotoLdap_inherit   = FALSE;
+
+    /* Share */
+    var $gotoShares         = array();// Currently Share Option
+    var $gotoShare          = "";     // currently selected Share Option
+    var $gotoShareSelections= array();// Available Shares for this account in Listbox format
+    var $gotoAvailableShares= array();// Available Shares for this account
+
+
+    /* attribute list for save action */
+    var $attributes= array("gotoLdapServer", "gotoBootKernel", "gotoKernelParameters","gotoModules");
+    var $objectclasses= array("GOhard");
+    var $view_logged = FALSE;
+    var $member_of_ogroup = FALSE;
+    var $o_group_dn       = "";
+
+    /* Helper */
+    var $orig_dn= "";
+    var $ignore_account= TRUE;
+
+    function termstartup (&$config, $dn= NULL, $parent= NULL)
+    {
+        plugin::plugin ($config, $dn, $parent);
+
+        $this->gotoBootKernels = array("default"=> ("default"));
+
+        /* Get arrays */
+        foreach (array("gotoModules") as $val){
+            $this->$val = array();
+            if (isset($this->attrs["$val"]["count"])){
+                for ($i= 0; $i<$this->attrs["count"]; $i++){
+                    if (isset($this->attrs["$val"][$i])){
+                        array_push($this->$val, $this->attrs["$val"][$i]);
+                    }
+                }
+            }
+            sort ($this->$val);
+            $this->$val= array_unique($this->$val);
+        }
 
-    /* Parse Kernel Parameters to decide what boot mode is enabled */
-    if (preg_match("/ splash=silent/", $this->gotoKernelParameters)){
-      $this->bootmode= "G";
-    } elseif (preg_match("/ debug/", $this->gotoKernelParameters)){
-      $this->bootmode= "D";
-    } elseif ($this->gotoKernelParameters == "") {
-      $this->bootmode= "G";
-    } else {
-      $this->bootmode= "T";
-    }
-    if (preg_match("/ o /", $this->gotoKernelParameters)){
-      $this->customParameters= preg_replace ("/^.* o /", "", $this->gotoKernelParameters);
-    } else {
-      $this->customParameters= "";
-    }
+        /* Prepare Shares */
+        if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){
+            unset($this->attrs['gotoShare']['count']);
+            foreach($this->attrs['gotoShare'] as $share){
+                $tmp = $tmp2 = array();
+                $tmp = explode("|",$share);
+                $tmp2['server']      =$tmp[0];
+                $tmp2['name']        =$tmp[1];
+                $tmp2['mountPoint']  =$tmp[2];
+                $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
+            }
+        }
 
-    /* Prepare Shares */
-    if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){
-      unset($this->attrs['gotoShare']['count']);
-      foreach($this->attrs['gotoShare'] as $share){
-        $tmp = $tmp2 = array();
-        $tmp = split("\|",$share);
-        $tmp2['server']      =$tmp[0];
-        $tmp2['name']        =$tmp[1];
-        $tmp2['mountPoint']  =$tmp[2];
-        $this->gotoShares[$tmp[1]."|".$tmp[0]]=$tmp2;
-      }
-    }
+        $this->gotoShareSelections= $config->getShareList(true);
+        $this->gotoAvailableShares= $config->getShareList(false);
+
+        $this->orig_dn= $this->dn;
+
+        /* Creating a list of valid Mirrors
+         * none will not be saved to ldap.
+         */
+        $ldap   = $this->config->get_ldap_link();
+        $ldap->cd($this->config->current['BASE']);
+        $ui = get_userinfo();
+        foreach($this->config->data['SERVERS']['LDAP'] as $dn => $data){
+            if($ui->get_category_permissions($data['dn'],"server",TRUE)){
+                for($i = 0; $i < $data['goLdapBase']['count']; $i ++){
+                    $name = $data["cn"][0].":".$data["goLdapBase"][$i];
+                    $this->gotoLdapServerList[]= $name;
+                }
+            }
+        }
 
-    $this->gotoShareSelections= $config->getShareList(true);
-    $this->gotoAvailableShares= $config->getShareList(false);
-
-    $this->orig_dn= $this->dn;
-
-    /* Get list of boot kernels */
-    if (isset($this->config->data['TABS'])){
-      $command= $this->config->search(get_class($this), "KERNELS",array('tabs'));
-
-      if (!check_command($command)){
-        $message[]= sprintf(_("Command '%s', specified as KERNELS hook for plugin '%s' doesn't seem to exist."), $command,
-            get_class($this));
-      } else {
-        $fh= popen($command, "r");
-        while (!feof($fh)) {
-          $buffer= trim(fgets($fh, 256));
-          
-          if(!empty($buffer)){
-          
-            $name=$value = $buffer;
-
-            if(preg_match("/:/",$buffer)){
-              $name = preg_replace("/:.*$/","",$buffer);
-              $value= preg_replace("/^.*:/","",$buffer);
-              $this->gotoBootKernels[$name]= $name.":".$value;
-            }else{
-              $this->gotoBootKernels[$name]= $value;
+        if(isset($this->attrs['gotoLdapServer'])){
+            unset($this->attrs['gotoLdapServer']['count']);
+            sort($this->attrs['gotoLdapServer']);
+            foreach($this->attrs['gotoLdapServer'] as $value){
+                $this->gotoLdapServers[] = preg_replace("/^[0-9]*:/","",$value);
+            }
+        }
+        natcasesort($this->gotoLdapServerList);
+
+        /* Load hardware list */
+        $ldap= $this->config->get_ldap_link();
+        $ldap->cd($this->config->current['BASE']);
+        $ldap->search("(&(|(objectClass=gotoTerminalTemplate)(objectClass=gotoWorkstationTemplate))(member=".LDAP::prepare4filter($this->dn)."))");
+        if ($ldap->count() == 1){
+            $map= array("gotoLdapServer","gotoBootKernel");
+            $attrs= $ldap->fetch();
+            $this->member_of_ogroup = TRUE;
+            $this->o_group_dn = $attrs['dn'];
+
+            foreach ($map as $name){
+                if (!isset($attrs[$name][0])){
+                    continue;
+                }
+                switch ($name){
+                    case 'gotoBootKernel':
+                        /* Handle inheritance value "default" */
+                        if ($this->member_of_ogroup){
+                            $this->gotoBootKernels["default-inherited"]= _("inherited")." [".$attrs['gotoBootKernel'][0]."]";
+                        }
+                        break;
+                    case 'gotoLdapServer':
+                        $this->goLdapServerList= array_merge(array('default-inherit' => _("inherited").' ['.$attrs[$name][0].']' ), $this->goLdapServerList);
+                        break;
+                }
             }
-          }
         }
-        pclose($fh);
-      }
 
-    }
-    
-    foreach($this->config->data['SERVERS']['LDAP'] as $server) {
-      $this->gotoLdapServerList[]= $server;
-    }
-    if(isset($this->attrs['gotoLdapServer'])){
-      unset($this->attrs['gotoLdapServer']['count']);
-      sort($this->attrs['gotoLdapServer']);
-      foreach($this->attrs['gotoLdapServer'] as $value){
-        $this->gotoLdapServers[] = preg_replace("/^[0-9]*:/","",$value);
-      }
-    }
-    if(!count($this->gotoLdapServers)){
-      $this->gotoLdap_inherit = TRUE;
+        if(!count($this->gotoLdapServers) && $this->member_of_ogroup){
+            $this->gotoLdap_inherit = TRUE;
+        }
+
+        /* Get list of boot kernels */
+        if (isset($this->config->data['TABS'])){
+            $command= $this->config->get_cfg_value('termstartup', "systemKernelsHook");
+
+            if (!check_command($command)){
+                $message[]= sprintf(_("Command '%s', specified as systemKernelsHook for plug-in '%s' doesn't seem to exist."), $command,
+                        get_class($this));
+            } else {
+                $fh= popen($command, "r");
+                while (!feof($fh)) {
+                    $buffer= trim(fgets($fh, 256));
+
+                    if(!empty($buffer)){
+
+                        $name=$value = $buffer;
+
+                        if(preg_match("/:/",$buffer)){
+                            $name = preg_replace("/:.*$/","",$buffer);
+                            $value= preg_replace("/^.*:/","",$buffer);
+                            $this->gotoBootKernels[$name]= $name.":".$value;
+                        }else{
+                            $this->gotoBootKernels[$name]= $value;
+                        }
+                    }
+                }
+                pclose($fh);
+            }
+
+        }
+
+        // Prepare lists
+        $this->ldapList = new sortableListing(array(),array(), TRUE);
+        $this->ldapList->setDeleteable(true);
+        $this->ldapList->setEditable(false);
+        $this->ldapList->setWidth("100%");
+        $this->ldapList->setHeight("100px");
+        $this->ldapList->setHeader(array(_("LDAP server")));
+        $this->ldapList->setDefaultSortColumn(0);
+
     }
 
-    /* Load hardware list */
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
-    if ($ldap->count() == 1){
-      $map= array("gotoLdapServer");
-      $attrs= $ldap->fetch();
+    function execute()
+    {
+        /* Call parent execute */
+        plugin::execute();
 
-      foreach ($map as $name){
-        if (!isset($attrs[$name][0])){
-          continue;
+        if($this->is_account && !$this->view_logged){
+            $this->view_logged = TRUE;
+            new log("view","terminal/".get_class($this),$this->dn);
         }
 
-        switch ($name){
-          case 'gotoLdapServer':
-            $this->goLdapServerList= array_merge(array('default-inherit' => _("inherited").' ['.$attrs[$name][0].']' ), $this->goLdapServerList);
-            break;
+        /* Do we need to flip is_account state? */
+        if (isset($_POST['modify_state'])){
+            $this->is_account= !$this->is_account;
         }
-      }
-    }
-  }
 
-  function execute()
-  {
-    /* Call parent execute */
-    plugin::execute();
+        /* Do we represent a valid terminal? */
+        if (!$this->is_account && $this->parent === NULL){
+            $display= "<img alt=\"\" src=\"images/small-error.png\" align=middle>&nbsp;<b>".
+                msgPool::noValidExtension(_("terminal"))."</b>";
+            return ($display);
+        }
 
-    if($this->is_account && !$this->view_logged){
-      $this->view_logged = TRUE;
-      new log("view","terminal/".get_class($this),$this->dn);
-    }
+        /* Add module */
+        if (isset ($_POST['add_module'])){
+            if ($_POST['module'] != "" && $this->acl_is_writeable("gotoMode")){
+                $this->add_list ($this->gotoModules, $_POST['module']);
+            }
+        }
 
-    /* Do we need to flip is_account state? */
-    if (isset($_POST['modify_state'])){
-      $this->is_account= !$this->is_account;
-    }
+        /* Delete module */
+        if (isset ($_POST['delete_module'])){
+            if (count($_POST['modules_list']) && $this->acl_is_writeable("gotoMode")){
+                $this->del_list ($this->gotoModules, $_POST['modules_list']);
+            }
+        }
 
-    /* Do we represent a valid terminal? */
-    if (!$this->is_account && $this->parent === NULL){
-      $display= "<img alt=\"\" src=\"images/stop.png\" align=middle>&nbsp;<b>".
-        _("This 'dn' has no terminal features.")."</b>";
-      return ($display);
-    }
+        /* Show main page */
+        $smarty= get_smarty();
 
-    /* Add module */
-    if (isset ($_POST['add_module'])){
-      if ($_POST['module'] != "" && $this->acl_is_writeable("gotoMode")){
-        $this->add_list ($this->gotoModules, $_POST['module']);
-      }
-    }
+        /* Assign acls */
+        $tmp = $this->plInfo();
+        foreach($tmp['plProvidedAcls'] as $name => $translation){
+            $smarty->assign($name."ACL",$this->getacl($name));
+        }
 
-    /* Delete module */
-    if (isset ($_POST['delete_module'])){
-      if (count($_POST['modules_list']) && $this->acl_is_writeable("gotoMode")){
-        $this->del_list ($this->gotoModules, $_POST['modules_list']);
-      }
-    }
+        $smarty->assign("member_of_ogroup",$this->member_of_ogroup);
+
+        /* In this section server shares will be defined
+         * A user can select one of the given shares and a mount point
+         *  and attach this combination to his setup.
+         */
+        $smarty->assign("gotoShareSelections",    $this->gotoShareSelections);
+        $smarty->assign("gotoShareSelectionKeys", array_flip($this->gotoShareSelections));
+        $smarty->assign("gotoBootKernels",$this->gotoBootKernels);
+
+        /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry
+         * This entry will be, a combination of mountPoint and sharedefinitions
+         */
+        if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){
+            /* We assign a share to this user, if we don't know where to mount the share */
+            if((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){
+                msg_dialog::display(_("Error"), msgPool::invalid(_("Mount point")), WARNING_DIALOG);
+            }elseif(isset($_POST['gotoShareSelection']) && isset($this->gotoAvailableShares[$_POST['gotoShareSelection']])){
+                $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
+                $s_mount = $_POST['gotoShareMountPoint'];
+                /* Preparing the new assignment */
+                $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share;
+                $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
+            }
+        }
 
-    /* Show main page */
-    $smarty= get_smarty();
+        /* if the Post  gotoShareDel is set, someone asked GOsa to delete the selected entry (if there is one selected)
+         * If there is no defined share selected, we will abort the deletion without any message
+         */
+        if((isset($_POST['gotoShareDel']))&&(isset($_POST['gotoShare'])) && $this->acl_is_writeable("gotoShare")){
+            unset($this->gotoShares[$_POST['gotoShare']]);
+        }
 
-    /* Assign acls */
-    $tmp = $this->plInfo();
-    foreach($tmp['plProvidedAcls'] as $name => $translation){
-      $smarty->assign($name."ACL",$this->getacl($name));
-    }
+        $smarty->assign("gotoShares",$this->printOutAssignedShares());
+        $smarty->assign("gotoSharesCount",count($this->printOutAssignedShares()));
+        $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares()));
 
 
-       /* In this section server shares will be defined
-     * A user can select one of the given shares and a mount point
-     *  and attach this combination to his setup.
-     */
-    $smarty->assign("gotoShareSelections",    $this->gotoShareSelections);
-    $smarty->assign("gotoShareSelectionKeys", array_flip($this->gotoShareSelections));
-    $smarty->assign("gotoBootKernels",$this->gotoBootKernels);
+        /* Add new ldap server to the list */
+        if(!$this->gotoLdap_inherit && isset($_POST['add_ldap_server']) && isset($_POST['ldap_server_to_add'])){
+            if(isset($this->gotoLdapServerList[$_POST['ldap_server_to_add']])){
+                $to_add = $this->gotoLdapServerList[$_POST['ldap_server_to_add']];
+                if(!in_array($to_add,$this->gotoLdapServers)){
+                    $this->gotoLdapServers[] = $to_add;
+                }
+            }
+        }
 
-    /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry
-     * This entry will be, a combination of mountPoint and sharedefinitions
-     */
-    if(isset($_POST['gotoShareAdd']) && $this->acl_is_writeable("gotoShare")){
-      /* We assign a share to this user, if we don't know where to mount the share */
-      if((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){
-        print_red(_("You must specify a valid mount point."));
-      }else{
-        $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']];
-        $s_mount = $_POST['gotoShareMountPoint'];
-        /* Preparing the new assignment */
-        $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share;
-        $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount;
-      }
-    }
 
-    /* if the Post  gotoShareDel is set, someone asked GOsa to delete the selected entry (if there is one selected)
-     * If there is no defined share selected, we will abort the deletion without any message
-     */
-    if((isset($_POST['gotoShareDel']))&&(isset($_POST['gotoShare'])) && $this->acl_is_writeable("gotoShare")){
-      unset($this->gotoShares[$_POST['gotoShare']]);
-    }
+        /* Move ldap servers up and down */
+        $this->ldapList->save_object();
+        $action = $this->ldapList->getAction();
+        if($action['action'] == 'reorder'){
+            $this->gotoLdapServers = array_values($this->ldapList->getMaintainedData());
+        }
+        if($action['action'] == 'delete'){
+            $id = $this->ldapList->getKey($action['targets'][0]);
+            $value = $this->gotoLdapServers[$id];
+            $this->gotoLdapServers = array_remove_entries(array($value),$this->gotoLdapServers);
+        }
 
-    $smarty->assign("gotoShares",$this->printOutAssignedShares());
-    $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares()));
+        $this->ldapList->setAcl($this->getacl('gotoLdapServer'));
 
-    /* Create divSelectBox for ldap server selection
-     */
-    $SelectBoxLdapServer = new divSelectBox("LdapServer");
-    $SelectBoxLdapServer->SetHeight(80);
+        /* Add Entries */
+        $data = $lData = array();
+        foreach($this->gotoLdapServers as $key => $server){
+            $data[$key]=$server;
+
+            /* Announce missing entries */
+            if(!in_array($server,$this->gotoLdapServerList)){
+                $server = $server."&nbsp;<font style='color:red'>(missing)</font>";
+            }
 
/* Add new ldap server to the list */
-    if(!$this->gotoLdap_inherit && isset($_POST['add_ldap_server']) && isset($_POST['ldap_server_to_add'])){
-      if(isset($this->gotoLdapServerList[$_POST['ldap_server_to_add']])){
-        $to_add = $this->gotoLdapServerList[$_POST['ldap_server_to_add']];
-        if(!in_array($to_add,$this->gotoLdapServers)){
-          $this->gotoLdapServers[] = $to_add;
           /* Convert old style entry */
+            if (!preg_match('%:ldaps?://%', $server)){
+                $server= "ldap://".preg_replace('/^([^:]+):/', '\1/', $server);
+        } else {
+            $server= preg_replace("/^[^:]+:/", "", $server);
+            $lData[$key] = array('data'=>array($server));
         }
-      }
-    }
+        }
+        $this->ldapList->setListData($data,$lData);
+        $this->ldapList->update();
 
-    /* Move ldap servers up and down */
-    if(!$this->gotoLdap_inherit){
-      foreach($_POST as $name => $value){
-        if(preg_match("/sort_ldap_up_/",$name)){
-          $id = preg_replace("/^sort_ldap_up_([0-9]*)_(x|y)$/","\\1",$name);
-          $from =  $id;
-          $to   =  $id -1;
-          $tmp = $this->array_switch_item($this->gotoLdapServers,$from,$to);
-          if($tmp){
-            $this->gotoLdapServers = $tmp;
-          }
-          break;
-        }
-        if(preg_match("/sort_ldap_down_/",$name)){
-          $id = preg_replace("/^sort_ldap_down_([0-9]*)_(x|y)$/","\\1",$name);
-          $from =  $id;
-          $to   =  $id +1;
-          $tmp = $this->array_switch_item($this->gotoLdapServers,$from,$to);
-          if($tmp){
-            $this->gotoLdapServers = $tmp;
-          }
-          break;
-        }
-        if(preg_match("/gotoLdapRemove_/",$name)){
-          $id = preg_replace("/^gotoLdapRemove_([0-9]*)_(x|y)$/","\\1",$name);
-          $value = $this->gotoLdapServers[$id];
-          $this->gotoLdapServers = array_remove_entries(array($value),$this->gotoLdapServers);
-          break;
-        }
-      }
-    }
-  /* Add Entries
-     */
-    foreach($this->gotoLdapServers as $key => $server){
-      if(!in_array($server,$this->gotoLdapServerList)){
-        $server = $server."&nbsp;<font style='color:red'>(missing)</font>";
-      }
-
-      $SelectBoxLdapServer->AddEntry(
-          array(array("string" => $server),
-            array("string" =>
-              "<input class='center' type='image' src='images/sort_up.png' name='sort_ldap_up_".$key."'>&nbsp;".
-              "<input class='center' type='image' src='images/sort_down.png' name='sort_ldap_down_".$key."'>&nbsp;".
-              "<input class='center' type='image' src='images/edittrash.png' name='gotoLdapRemove_".$key."'>",
-              "attach" => "style='text-align:right;width:40px;border-right:0px;'")));
-    }
 
-    if($this->gotoLdap_inherit){
-      $smarty->assign("gotoLdapServerACL_inherit", preg_replace("/w/","",$this->getacl("gotoLdapServer")));;
-    }else{
-      $smarty->assign("gotoLdapServerACL_inherit", $this->getacl("gotoLdapServer"));
-    }
 
-    $list = array();
-    foreach($this->gotoLdapServerList as $key => $entry){
-      if(!in_array($entry,$this->gotoLdapServers)){
-        $list[$key] = $entry;
-      }
-    }
-    $smarty->assign("gotoLdapServers",    $SelectBoxLdapServer->DrawList());
-    $smarty->assign("gotoLdapServerList", $list);
-    $smarty->assign("gotoLdap_inherit",   $this->gotoLdap_inherit);
-    $smarty->assign("JS",  session::get('js'));
 
-    foreach (array("gotoModules" ) as $val){
-      $smarty->assign("$val", $this->$val);
-    }
+        if($this->gotoLdap_inherit){
+            $smarty->assign("gotoLdapServerACL_inherit", preg_replace("/w/","",$this->getacl("gotoLdapServer")));;
+        }else{
+            $smarty->assign("gotoLdapServerACL_inherit", $this->getacl("gotoLdapServer"));
+        }
 
-    /* Values */
-    foreach(array("gotoBootKernel", "customParameters") as $val){
-      $smarty->assign($val, $this->$val);
-    }
+        $list = array();
+        foreach($this->gotoLdapServerList as $key => $entry){
+            if(!in_array($entry,$this->gotoLdapServers)){
+                $list[$key] = $entry;
+            }
+        }
+        $smarty->assign("gotoLdapServers",    $this->ldapList->render());
+        $smarty->assign("gotoLdapServerList", $list);
+        $smarty->assign("gotoLdap_inherit",   $this->gotoLdap_inherit);
+        $smarty->assign("JS",  session::get('js'));
 
-    /* Radio button group */
-    if (preg_match("/G/", $this->bootmode)) {
-      $smarty->assign("graphicalbootup", "checked");
-    } else {
-      $smarty->assign("graphicalbootup", "");
-    }
-    if (preg_match("/T/", $this->bootmode)) {
-      $smarty->assign("textbootup", "checked");
-    } else {
-      $smarty->assign("textbootup", "");
+        foreach (array("gotoModules" ) as $val){
+            $smarty->assign("$val", $this->$val);
+        }
+
+        /* Values */
+        foreach(array("gotoBootKernel", "gotoKernelParameters") as $val){
+            $smarty->assign($val, $this->$val);
+        }
+
+        /* Show main page */
+        return($smarty->fetch (get_template_path('terminalStartup.tpl', TRUE,dirname(__FILE__))));
     }
-    if (preg_match("/D/", $this->bootmode)) {
-      $smarty->assign("debugbootup", "checked");
-    } else {
-      $smarty->assign("debugbootup", "");
+
+    function remove_from_parent()
+    {
+        if($this->acl_is_removeable()){
+            $this->handle_post_events("remove");
+            new log("remove","terminal/".get_class($this),$this->dn,array_keys($this->attrs));
+        }
     }
 
-    /* Show main page */
-    return($smarty->fetch (get_template_path('terminalStartup.tpl', TRUE,dirname(__FILE__))));
-  }
 
-  function remove_from_parent()
-  {
-    if($this->acl_is_removeable()){
-      $this->handle_post_events("remove");
-      new log("remove","terminal/".get_class($this),$this->dn,array_keys($this->attrs));
-    }
-  }
-
-
-  /* Save data to object */
-  function save_object()
-  {
-    plugin::save_object();
-
-    if(isset($_POST['TerminalStarttabPosted'])){
-      if(isset($_POST['gotoLdap_inherit'])){
-        $this->gotoLdap_inherit = TRUE;
-      }else{
-        $this->gotoLdap_inherit = FALSE;
-      }
-
-      /* Save group radio buttons */
-      if ($this->acl_is_writeable("bootmode") && isset($_POST["bootmode"])){
-        $this->bootmode= $_POST["bootmode"];
-      }
-
-      /* Save kernel parameters */
-      if ($this->acl_is_writeable("gotoKernelParameters") && isset($_POST["customParameters"])){
-        $this->customParameters= $_POST["customParameters"];
-      }
+    /* Save data to object */
+    function save_object()
+    {
+        plugin::save_object();
+
+        if(isset($_POST['TerminalStarttabPosted'])){
+            if(isset($_POST['gotoLdap_inherit'])){
+                $this->gotoLdap_inherit = TRUE;
+            }else{
+                $this->gotoLdap_inherit = FALSE;
+            }
+        }
     }
-  }
 
 
-  /* Save to LDAP */
-  function save()
-  {
-    /* Find proper terminal path for tftp configuration
-       FIXME: This is suboptimal when the default has changed to
-       another location! */
-    if ($this->gotoTerminalPath == "default-inherit"){
-      $ldap= $this->config->get_ldap_link();
+    /* Save to LDAP */
+    function save()
+    {
+        /* Depending on the baseobject (Ogroup / WS) we
+         *  use another set of objectClasses
+         * In case of TS itself, we use  "array("GOhard");"
+         * if we are currently editing from ogroup menu we use (array("goTerminalTemplate"))
+         */
+        if(isset($this->parent->by_object['ogroup'])){
+            $this->objectclasses = array("gotoTerminalTemplate");
+        }elseif(isset($this->parent->by_object['termgeneric'])){
+            $this->objectclasses = array("GOhard");
+        }else{
+            msg_dialog::display(_("Fatal error"),
+                    "Object Type Configuration is unknown. Please contact the GOsa developers.",
+                    FATAL_ERROR_DIALOG);
+            exit();
+        }
+
 
-      /* Strip relevant part from dn, keep trailing ',' */
-      $tmp= preg_replace("/^cn=[^,]+,".get_ou('terminalou')."/i", "", $this->dn);
-      $tmp= preg_replace("/".$this->config->current['BASE']."$/i", "", $tmp);
+        plugin::save();
 
-      /* Walk from top to base and try to load default values for
-         'gotoTerminalPath'. Abort when an entry is found. */
-      while (TRUE){
-        $tmp= preg_replace ("/^[^,]+,/", "", $tmp);
+        /* Add missing arrays */
+        foreach (array("gotoModules") as $val){
+            if (isset ($this->$val) && count ($this->$val) != 0){
 
-        $ldap->cat("cn=default,".get_ou('terminalou').$tmp.
-            $this->config->current['BASE'], array('gotoTerminalPath'));
-        $attrs= $ldap->fetch();
-        if (isset($attrs['gotoTerminalPath'])){
-          $this->gotoTerminalPath= $attrs['gotoTerminalPath'][0];
-          break;
+                $this->attrs["$val"]= array_unique($this->$val);
+            }
+            if(!isset($this->attrs["$val"])){
+                $this->attrs["$val"]=array();
+            }
         }
 
-        /* Nothing left? */
-        if ($tmp == ""){
-          break;
+        /* Prepare list of ldap servers */
+        $this->attrs['gotoLdapServer'] = array();
+        if(!$this->gotoLdap_inherit){
+            $i = 0;
+            foreach($this->gotoLdapServers as $server){
+                $i ++;
+                $this->attrs['gotoLdapServer'][] = $i.":".$server;
+            }
         }
-      }
-    }
-    
-    /* Add semi automatic values */
-    // FIXME: LDAP Server may not be set here...
-    $this->gotoKernelParameters= "root=/dev/nfs nfsroot=".
-      $this->gotoTerminalPath.
-      ",ro,hard,nolock,fg,rsize=8192 ".
-      "ip=::::::dhcp ldap=".base64_encode($this->gotoLdapServer);
-
-    switch ($this->bootmode){
-      case "D":
-        $this->gotoKernelParameters.= " debug";
-      break;
-      case "G":
-        $this->gotoKernelParameters.= " splash=silent";
-      break;
-    }
-    if ($this->customParameters != ""){
-      $this->gotoKernelParameters.= " o ".$this->customParameters;
-    }
 
-    plugin::save();
-
-    /* Add missing arrays */
-    foreach (array("gotoModules") as $val){
-      if (isset ($this->$val) && count ($this->$val) != 0){
-    
-        $this->attrs["$val"]= array_unique($this->$val);
-      }
-      if(!isset($this->attrs["$val"])){
-       $this->attrs["$val"]=array();
-      }
-    }
+        /* Strip out 'default' values */
+        if ($this->attrs['gotoBootKernel'] == "default-inherited"){
+            $this->attrs['gotoBootKernel']= array();
+        }
 
-    /* Prepare list of ldap servers */
-    $this->attrs['gotoLdapServer'] = array();
-    if(!$this->gotoLdap_inherit){
-      $i = 0;
-      foreach($this->gotoLdapServers as $server){
-        $i ++;
-        $this->attrs['gotoLdapServer'][] = $i.":".$server;
-      }
-    }
+        /* prepare share settings */
+        $tmp = array();
+        foreach($this->gotoShares as $name => $settings){
+            $tmp2 = explode("|",$name);
+            $name = $tmp2[0];
+            $tmp[] = $settings['server']."|".$name."|".$settings['mountPoint'];
+        }
+        $this->attrs['gotoShare']=$tmp;
 
-    /* Strip out 'default' values */
-    foreach(array("gotoBootKernel") as $value){
-      if (!isset($this->attrs[$value]) || $this->attrs[$value] == "default-inherit"){
-        $this->attrs[$value] = array();
-      } 
-    }
+        /* Write back to ldap */
+        $ldap= $this->config->get_ldap_link();
+        $ldap->cd($this->dn);
 
-     /* prepare share settings */
-    $tmp = array();
-    foreach($this->gotoShares as $name => $settings){
-      $tmp2 = split("\|",$name);
-      $name = $tmp2[0];
-      $tmp[] = $settings['server']."|".$name."|".$settings['mountPoint'];
+        $this->cleanup();
+        $ldap->modify ($this->attrs); 
+
+        new log("modify","terminal/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
+
+        if (!$ldap->success()){
+            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+        }
+        $this->handle_post_events("modify");
     }
-    $this->attrs['gotoShare']=$tmp;
-
-    /* Write back to ldap */
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->dn);
-    
-    $this->cleanup();
-    $ldap->modify ($this->attrs); 
-
-    new log("modify","terminal/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-
-    show_ldap_error($ldap->get_error(), sprintf(_("Saving of system terminal/startup with dn '%s' failed."),$this->dn));
-    $this->handle_post_events("modify");
-  }
-
-  /* Add value to array, check if unique */
-  function add_list (&$array, $value)
-  {
-    if ($value != ""){
-      $array[]= $value;
-      sort($array);
-      array_unique ($array);
+
+    /* Add value to array, check if unique */
+    function add_list (&$array, $value)
+    {
+        if ($value != ""){
+            $array[]= $value;
+            sort($array);
+            array_unique ($array);
+        }
     }
-  }
 
 
-  /* Delete value to array, check if unique */
-  function del_list (&$array, $list)
-  {
-    $tmp= array();
-    foreach ($array as $mod){
-      if (!in_array($mod, $list)){
-        $tmp[]= $mod;
-      }
+    /* Delete value to array, check if unique */
+    function del_list (&$array, $list)
+    {
+        $tmp= array();
+        foreach ($array as $mod){
+            if (!in_array($mod, $list)){
+                $tmp[]= $mod;
+            }
+        }
+        $array= $tmp;
     }
-    $array= $tmp;
-  }
-
-   /* Generate ListBox frindly output for the defined shares
-   * Possibly Add or remove an attribute here,
-   */
-  function printOutAssignedShares()
-  {
-    $a_return = array();
-    if(is_array($this->gotoShares)){
-      foreach($this->gotoShares as $share){
-        $a_return[$share['name']."|".$share['server']]= $share['name']." [".$share['server']."]";
-      }
+
+    /* Generate ListBox frindly output for the defined shares
+     * Possibly Add or remove an attribute here,
+     */
+    function printOutAssignedShares()
+    {
+        $a_return = array();
+        if(is_array($this->gotoShares)){
+            foreach($this->gotoShares as $share){
+                $a_return[$share['name']."|".$share['server']]= $share['name']." [".$share['server']."]";
+            }
+        }
+        return($a_return);
     }
-    return($a_return);
-  }
 
 
-  function PrepareForCopyPaste($source)
-  {
-    plugin::PrepareForCopyPaste($source);
+    function PrepareForCopyPaste($source)
+    {
+        plugin::PrepareForCopyPaste($source);
 
-    $source_o = new termstartup ($this->config, $source['dn']);
+        $source_o = new termstartup ($this->config, $source['dn']);
 
-    foreach(array("gotoModules", "gotoKernelParameters","gotoShares","customParameters","bootmode","gotoTerminalPath","gotoShares","goLdapServerList","gotoBootKernel","gotoLdapServer","gotoBootKernels") as $attr){
-      $this->$attr = $source_o->$attr;
+        foreach(array("gotoModules", "gotoKernelParameters","gotoShare",
+                    "gotoKernelParameters","gotoShares",
+                    "goLdapServerList","gotoBootKernel","gotoLdapServer",
+                    "gotoBootKernels","gotoLdapServers","gotoLdapServers",
+                    "gotoLdapServerList","gotoLdap_inherit","gotoShareSelections",
+                    "gotoAvailableShares") as $attr){
+            $this->$attr = $source_o->$attr;
+        }
     }
-  }
 
 
-  function array_switch_item($ar,$from,$to)
-  {
-    if(!is_array($ar)){
-      return(false);
-    }
-    if(!isset($ar[$from])){
-      return(false);
-    }
-    if(!isset($ar[$to])){
-      return(false);
-    }
+    function array_switch_item($ar,$from,$to)
+    {
+        if(!is_array($ar)){
+            return(false);
+        }
+        if(!isset($ar[$from])){
+            return(false);
+        }
+        if(!isset($ar[$to])){
+            return(false);
+        }
 
-    $tmp = $ar[$from];
-    $ar[$from] = $ar[$to];
-    $ar[$to] = $tmp;
-    return($ar);
-  }
-
-
-  /* Return plugin informations for acl handling */
-  static function plInfo()
-  {
-    return (array(
-          "plShortName"   => _("Startup"),
-          "plDescription" => _("Terminal startup"),
-          "plSelfModify"  => FALSE,
-          "plDepends"     => array(),
-          "plPriority"    => 5,
-          "plSection"     => array("administration"),
-          "plCategory"    => array("terminal"),
-
-          "plProvidedAcls"=> array(
-            "gotoLdapServer"      => _("Ldap server"),
-            "gotoShare"           => _("Shares"),
-            "gotoModules"         => _("Kernel modules"),
-            "gotoBootKernel"      => _("Boot kernel"), 
-            "gotoKernelParameters"=> _("Kernel parameter"))
-          ));
-  }
+        $tmp = $ar[$from];
+        $ar[$from] = $ar[$to];
+        $ar[$to] = $tmp;
+        return($ar);
+    }
+
+
+    /* Return plugin informations for acl handling */
+    static function plInfo()
+    {
+        return (array(
+                    "plShortName"   => _("Startup"),
+                    "plDescription" => _("Terminal startup"),
+                    "plSelfModify"  => FALSE,
+                    "plDepends"     => array(),
+                    "plPriority"    => 5,
+                    "plSection"     => array("administration"),
+                    "plCategory"    => array("terminal"),
+
+                    "plProperties" => array(
+
+                        array(
+                            "name"          => "systemKernelsHook",
+                            "type"          => "command",
+                            "default"       => "",
+                            "description"   => _("For the workstations and terminals, you can define the 'systemKernelsHook' keyword. It can load additional kernels that are not retrieveable by standard GOsa/FAI mechanisms."),
+                            "check"         => "gosaProperty::isCommand",
+                            "migrate"       => "",
+                            "group"         => "system",
+                            "mandatory"     => FALSE)
+                        ),
+
+                    "plProvidedAcls"=> array(
+                            "gotoLdapServer"      => _("LDAP server"),
+                            "gotoShare"           => _("Shares"),
+                            "gotoModules"         => _("Kernel modules"),
+                            "gotoBootKernel"      => _("Boot kernel"), 
+                            "gotoKernelParameters"=> _("Kernel parameter"))
+                        ));
+    }
 
 
 }