Code

Removed show_ldap_error() calls
[gosa.git] / gosa-plugins / goto / admin / systems / goto / class_terminalService.inc
index 54e1d865d2f43f4c0aa2e2998d0512bc5ea2e006..63fe1fce14b105c05e6f178ddf7524cc7c7bb075 100644 (file)
@@ -2,17 +2,11 @@
 
 class termservice extends plugin
 {
-  /* CLI vars */
-  var $cli_summary= "Manage terminal service aspects";
-  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 $gotoLpdEnable= FALSE;
   var $gotoXMonitor= "";
-  var $gotoXMethod= "";
+  var $gotoXMethod= "default";
   var $gotoXdmcpServer= "";
-  var $gotoFontPath= "";
   var $gotoXDriver= "";
   var $gotoXResolution= "";
   var $gotoXColordepth= "";
@@ -47,42 +41,62 @@ class termservice extends plugin
   var $XKbVariants= array ();
   var $MouseTypes= array();
   var $MousePorts= array();
-  var $gotoScannerModels= array();
   var $hardware_list= array();
   var $used_hardware= array();
 
 
   /* attribute list for save action */
-  var $attributes= array("cn", "gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
-      "gotoFontPath", "gotoXDriver", "gotoXResolution", "gotoXColordepth",
+  var $attributes= array("gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
+      "gotoXDriver", "gotoXResolution", "gotoXColordepth",
       "gotoXHsync", "gotoXVsync", "gotoLpdEnable", "gotoLpdServer",
       "gotoScannerEnable", "gotoScannerModel", "gotoScannerClients",
       "gotoScannerBackend", "gotoXKbModel", "gotoXKbLayout", "gotoXKbVariant",
       "gotoXMouseType", "gotoXMouseport", "goFonHardware");
   var $objectclasses= array("GOhard");
 
+  var $is_ogroup        = FALSE;
+  var $is_ogroup_member = FALSE;
+
+  var $selected_xdmcp_servers = array();
+  var $inherited_xdmcp_servers = array();
 
   function termservice (&$config, $dn= NULL, $parent= NULL)
   {
     plugin::plugin ($config, $dn, $parent);
-   
+    $this->orig_dn= $this->dn;
+
+    /* Check if we are a part of an ogroup.
+     * In this case, we have to hide all the inherit stuff.
+     */ 
+    if(isset($parent) && get_class($parent) == "ogroup"){
+      $this->is_ogroup = TRUE;
+    }
+
+    /* Check if we are member of an object group.
+     */
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
+    if($ldap->count()){
+      $this->is_ogroup_member = TRUE;
+    }
+
     /* Get list of available xdrivers */
     $this->XDrivers = $this->getListOfXDrivers();
-    array_unshift($this->XDrivers, "["._("unknown")."]");
-    
+
+    /* Create a list of available resolutions.
+     */     
     $this->XResolutions= array(
-        "default"   =>  "["._("inherited")."]"  ,
-        "640x480"   =>  "640x480",
-        "800x600"   =>  "800x600",
-        "1024x768"  =>  "1024x768",
-        "1152x864"  =>  "1152x864",
-        "1280x1024" =>  "1280x1024",
-        "1400x1050" =>  "1400x1050",
-        "1600x1200" =>  "1600x1200");
+          "640x480"   =>  "640x480",
+          "800x600"   =>  "800x600",
+          "1024x768"  =>  "1024x768",
+          "1152x864"  =>  "1152x864",
+          "1280x1024" =>  "1280x1024",
+          "1400x1050" =>  "1400x1050",
+          "1600x1200" =>  "1600x1200");
 
     if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
       $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
-
       if(is_readable($file)){
         $str = file_get_contents($file);
         $lines = split("\n",$str);
@@ -92,20 +106,23 @@ class termservice extends plugin
             $this->XResolutions[$line]=$line;
           }
         }
-        //natcasesort($this->gotoXResolutions);
       }else{
         print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
       }
     }
 
+    /* Create a set of selectable color depths
+     */
     $this->XColordepths= array(
-        "default"  => "["._("inherited")."]",
         "8"        => "8 " ._("bit"),
         "15"       => "15 "._("bit"),
         "16"       => "16 "._("bit"),
         "24"       => "24 "._("bit"));
 
-    $this->XKbModels['default']= "["._("inherited")."]";
+    
+    /* Create a set of selectable keyboard models
+     */
+    $this->XKbModels = array();
     foreach(array ("btc9000", "chicony", "compaq", "dell", "dell101", "everex",
           "flexpro", "geniuscomfy", "hp", "itouch", "jp106", "logicordless",
           "logiinetnav", "logiinternet", "macintosh", "microsoft",
@@ -115,19 +132,16 @@ class termservice extends plugin
     }
 
     /* Additional values will be extracted from CONFIG_DIR.keyboardLayouts */
-    $this->XKbLayouts= array ("default"=>"["._("inherited")."]","de"=> "de","intl" =>"intl","us" =>"us");
-    $this->XKbVariants= array ("default"=>"["._("inherited")."]", "nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
-
-    $this->MouseTypes= array( "AUTO"      =>  "["._("inherited")."]" ,  "ImPS/2"      => "ImPS/2", 
-                              "PS/2"      =>  "PS/2"                 ,  "Microsoft"   => "Microsoft", 
-                              "Logitech"  =>  "Logitech");
-
-    $this->MousePorts= array("AUTO"             =>"["._("inherited")."]"   , "/dev/ttyS0"  => "/dev/ttyS0", 
-                             "/dev/ttyS1"       => "/dev/ttyS1"            , "/dev/psaux"  => "/dev/psaux", 
-                             "/dev/input/mice"  =>"/dev/input/mice");
+    $this->XKbLayouts = array("de"=> "de","intl" =>"intl","us" =>"us");
+    $this->XKbVariants= array("nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
+    $this->MouseTypes = array("ImPS/2"=>"ImPS/2","PS/2"=>"PS/2", "explorerps/2"=>"explorerps/2",
+                              "Microsoft"=>"Microsoft","Logitech"=>"Logitech");
+    $this->MousePorts = array("/dev/ttyS0"=>"/dev/ttyS0",
+                              "/dev/ttyS1"=>"/dev/ttyS1","/dev/psaux"=>"/dev/psaux", 
+                              "/dev/input/mice"=>"/dev/input/mice");
  
 
-    /* try to read additional keyboard layouts
+    /* Try to read additional keyboard layouts
      */
     if(file_exists(CONFIG_DIR."/keyboardLayouts")){
       if(is_readable(CONFIG_DIR."/keyboardLayouts")){
@@ -145,97 +159,125 @@ class termservice extends plugin
       }
     }
 
-    /* Load scanner models */
-    $fcontents = file (CONFIG_DIR."/scanner-list");
-    while (list ($line_num, $line) = each ($fcontents)) {
-      preg_match('/^(\w+) "([^"]+)" "([^"]+)" "([^"]+)"/', "$line", $matches);
-      $this->gotoScannerModels[$matches[2]." - ".$matches[3]]= $matches[1]."|".$matches[4];
+    /* Terminal server methods 
+     */
+    if($this->is_ogroup_member){
+      $this->XMethods["default"]= _("inherited");
     }
-    ksort ($this->gotoScannerModels);
-
-    /* Initialize methods */
-    $this->XMethods["default"]= _("default");
-    $this->XMethods["indirect"]= _("show chooser");
-    $this->XMethods["query"]= _("direct");
-#$this->XMethods["squery"]= _("direct via ssh");
-#$this->XMethods["nquery"]= _("direct via nx");
-    $this->XMethods["load"]= _("load balanced");
-#$this->XMethods["sload"]= _("load balanced via ssh");
-#$this->XMethods["nload"]= _("load balanced via nx");
-    $this->XMethods["rdp"]= _("Windows RDP");
-    $this->XMethods["citrix"]= _("ICA client");
+    $this->XMethods["xdmcp"]  = _("XDMCP");
+    $this->XMethods["ldm"]    = _("LDM");
+    $this->XMethods["rdp"]    = _("Windows RDP");
+    $this->XMethods["citrix"] = _("ICA client");
 
-    $this->orig_dn= $this->dn;
+    /* Get selected gotoXdmcpServer 
+     */
+    $this->selected_xdmcp_servers = array();
+    if(isset($this->attrs['gotoXdmcpServer'])){
+      for($i = 0 ; $i < $this->attrs['gotoXdmcpServer']['count'] ; $i++){
+        $this->selected_xdmcp_servers[] = $this->attrs['gotoXdmcpServer'][$i];
+      }
+    }
 
-    /* Load hardware list */
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
-    while ($attrs= $ldap->fetch()){
+    /* Load phone hardware list 
+     */
+    $tmp = get_sub_list("(objectClass=goFonHardware)","",array(get_ou("phoneou")), 
+                  $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
+    foreach($tmp as $attrs){
       $cn= $attrs['cn'][0];
+      $description= "";
       if (isset($attrs['description'])){
         $description= " - ".$attrs['description'][0];
-      } else {
-        $description= "";
       }
       $this->hardware_list[$cn]= "$cn$description";
     }
-
-    /* Eventually colorize phones */
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(goFonHardware=*)",array('cn','dn','goFonHardware'));
-    while($attrs = $ldap->fetch()){
-        $cn = $attrs['goFonHardware'][0];
-        if(isset($this->hardware_list[$cn])){
-          $this->used_hardware[$cn]= $cn;
-        }
-    }
-
     $this->hardware_list["automatic"]= _("automatic");
     ksort($this->hardware_list);
 
-    /* Convert gotoLpdEnable */
+    /* These departments may contain objects that have 
+        goFonHardware set. 
+     */
+    $deps_a = array(
+        get_people_ou(),
+        get_ou("ogroupou"),
+        get_ou("serverou"),
+        get_ou("terminalou"),
+        get_ou("workstationou"),
+        get_ou("printerou"),
+        get_ou("componentou"),
+        get_ou("phoneou"));
+
+    $tmp = get_sub_list("(goFonHardware=*)","",$deps_a,$this->config->current['BASE'],
+        array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
+    foreach($tmp as $attrs){
+      $cn = $attrs['goFonHardware'][0];
+      if(isset($this->hardware_list[$cn])){
+        $this->used_hardware[$cn]= $cn;
+      }
+    }
+
+    /* Convert gotoLpdEnable 
+     */
     $this->gotoLpdEnable= preg_match("/yes/i",$this->gotoLpdEnable);
 
     /* Load hardware list */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
+    $map= array(
+        "gotoXResolution", 
+        "gotoXColordepth", 
+        "gotoXKbModel", 
+        "gotoXKbLayout",
+#        "gotoXDriver",
+        "gotoXdmcpServer",
+        "gotoXKbVariant",
+        "gotoXMouseType", 
+        "gotoXMethod",
+        "gotoXMouseport");
+    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))",$map);
     if ($ldap->count() == 1){
-      $map= array("gotoXResolution", "gotoXColordepth", "gotoXKbModel", "gotoXKbLayout",
-                  "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport");
       $attrs= $ldap->fetch();
-
       foreach ($map as $name){
         if (!isset($attrs[$name][0])){
           continue;
         }
 
         switch ($name){
+#         case 'gotoXDriver': 
+#           $this->XDrivers = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XDrivers;
+#           break;
+          case 'gotoXMethod': 
+            $this->XMethods = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XMethods;
+            if(isset($attrs['gotoXdmcpServer'])){
+              for($i = 0 ; $i < $attrs['gotoXdmcpServer']['count'] ; $i++){
+                $this->inherited_xdmcp_servers[] = $attrs['gotoXdmcpServer'][$i];
+              }
+            }
+            break;
           case 'gotoXResolution':
-            $this->XResolutions['default'] = _("inherited").' ['.$attrs[$name][0].']' ;
+            $this->XResolutions= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XResolutions;
             break;
           case 'gotoXColordepth':
-            $this->XColordepths['default'] =  _("inherited").' ['.$attrs[$name][0].' '._('Bit').']';
+            $this->XColordepths= array('default' => _("inherited").' ['.$attrs[$name][0].' '._('Bit').']') + $this->XColordepths;
             break;
           case 'gotoXKbModel':
-            $this->XKbModels['default'] =  _("inherited").' ['.$attrs[$name][0].']';
+            $this->XKbModels= array('default' => _("inherited").' ['.$attrs[$name][0].']') + $this->XKbModels;
             break;
           case 'gotoXKbLayout':
-            $this->XKbLayouts['default'] =  _("inherited").' ['.$attrs[$name][0].']';
+            $this->XKbLayouts= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbLayouts;
             break;
           case 'gotoXKbVariant':
-            $this->XKbVariants['default'] = _("inherited").' ['.$attrs[$name][0].']' ;
+            $this->XKbVariants= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbVariants;
             break;
           case 'gotoXMouseType':
-            $this->MouseTypes['AUTO'] = _("inherited").' ['.$attrs[$name][0].']' ;
+            $this->MouseTypes= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
             break;
           case 'gotoXMouseport':
-            $this->MousePorts['AUTO'] = _("inherited").' ['.$attrs[$name][0].']' ;
+            $this->MousePorts= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
             break;
         }
       }
     }
+
     if(preg_match("/\+/",$this->gotoXHsync)){
       $this->AutoSync = true;
       $this->gotoXHsync = preg_replace("/\+/","-",$this->gotoXHsync);
@@ -243,6 +285,7 @@ class termservice extends plugin
     }
   }
 
+
   function execute()
   {
     /* Call parent execute */
@@ -274,25 +317,69 @@ class termservice extends plugin
       $smarty->assign($name."ACL",$this->getacl($name));
     }
 
+    if(isset($_POST['gotoXdmcpServer_add']) && isset($_POST['XdmcpAddServer'])){
+      if(!in_array($_POST['gotoXdmcpServer_add'],$this->selected_xdmcp_servers)){
+        $this->selected_xdmcp_servers[] = $_POST['gotoXdmcpServer_add'];
+      }
+    }
+
+    if(isset($_POST['selected_xdmcp_servers']) && isset($_POST['XdmcpDelServer'])){
+      $tmp = array();
+      foreach($this->selected_xdmcp_servers as $name){
+        if(!in_array($name,$_POST['selected_xdmcp_servers'])){
+          $tmp[] =  $name;
+        }
+      }
+      $this->selected_xdmcp_servers = $tmp;
+    }
 
     /* Arrays */ 
     foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
-          "gotoScannerModels", "XKbModels","XKbVariants",
-          "MouseTypes", "MousePorts") as $val){
+          "XKbModels","XKbVariants","MouseTypes", "MousePorts") as $val){
       $smarty->assign("$val", $this->$val);
     }
     $smarty->assign("XKbLayouts",   $this->XKbLayouts);
     $smarty->assign("XKbLayoutKeys",array_flip($this->XKbLayouts));
-  
-    $smarty->assign("xdmcpservers", $this->config->data['SERVERS']['TERMINAL']);
-    $smarty->assign("fontservers", $this->config->data['SERVERS']['FONT']);
-    $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
     $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
+  
+    
+    /* Create a list of useable servers for the currently selected 
+     *  connection type.
+     */ 
+    $xdmcp_types =  $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
+    $available_servers = array();
+    foreach($xdmcp_types as $servername =>$supported_types){
+      if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
+        $available_servers[]  = $servername;
+      }
+    }
+
+    /* Append additional information to invalid server selections.
+     */
+    $tmp = array();
+    foreach($this->selected_xdmcp_servers as $server){
+      if(in_array($server,$available_servers)){
+        $tmp[$server] = $server;
+      }else{
+        $tmp[$server] = $server."&nbsp;-&nbsp;"._("Unsupported");
+      }
+    }
+
+    /* Remove already selected servers from available list. 
+     */
+    foreach($available_servers as $key => $server){
+      if(isset($tmp[$server])){
+        unset($available_servers[$key]);
+      }
+    }
+
+    $smarty->assign("selected_xdmcp_servers", $tmp);
+    $smarty->assign("inherited_xdmcp_servers", $this->inherited_xdmcp_servers);
+    $smarty->assign("available_xdmcp_servers", $available_servers);
 
     /* Variables - select */
-    foreach(array("gotoXMethod", "gotoXdmcpServer", "gotoFontPath", 
-          "gotoXDriver", "gotoXResolution", "gotoXColordepth", 
-          "gotoLpdServer", "gotoScannerModel", "gotoXKbModel", "gotoXKbLayout",
+    foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth", 
+          "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
           "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
 
       $smarty->assign($val."_select", $this->$val);
@@ -344,13 +431,21 @@ class termservice extends plugin
     }
 
     /* Show main page */
-    return($smarty->fetch (get_template_path('terminalService.tpl', TRUE)));
+    return($smarty->fetch (get_template_path('terminalService.tpl', TRUE,dirname(__FILE__))));
   }
 
   function remove_from_parent()
   {
     new log("remove","terminal/".get_class($this),$this->dn,array_keys($this->attrs));
     $this->handle_post_events("remove");
+
+    plugin::remove_from_parent();
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cd($this->dn);
+    $ldap->modify($this->attrs);
+    if (!$ldap->success()){
+      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+    }
   }
 
 
@@ -424,6 +519,23 @@ class termservice extends plugin
   {
     /* Call common method to give check the hook */
     $message= plugin::check();
+
+    if($this->gotoXMethod != "default"){
+      $xdmcp_types =  $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
+      $available_servers = array();
+      foreach($xdmcp_types as $servername =>$supported_types){
+        if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
+          $available_servers[]  = $servername;
+        }
+      }
+      foreach($this->selected_xdmcp_servers as $server){
+        if(!in_array($server,$available_servers)){
+          $message[] = _("Remote desktop settings contains servers that do not support the selected connection method.");
+          break;
+        }
+      }
+    }
+
     return ($message);
   }
 
@@ -434,12 +546,17 @@ class termservice extends plugin
     /* Convert to string */
     $this->gotoLpdEnable= $this->gotoLpdEnable?"Yes":"No";
 
+    if($this->is_ogroup){
+      $this->objectclasses = array("gotoWorkstationTemplate");
+    }else{
+      $this->objectclasses = array("GOhard");
+    }
+
     plugin::save();
 
     /* Strip out 'default' values */
-    foreach(array("gotoXMethod", "gotoXdmcpServer", "gotoFontPath",
-          "gotoXDriver", "gotoXResolution", "gotoXColordepth",
-          "gotoLpdServer", "gotoScannerModel", "gotoXKbModel", "gotoXKbLayout",
+    foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth",
+          "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
           "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
 
       if ($this->attrs[$val] == "default"){
@@ -447,6 +564,14 @@ class termservice extends plugin
       }
     }
 
+    if($this->gotoXMethod == "default"){
+      $this->attrs['gotoXdmcpServer'] = array();
+      $this->attrs['gotoXMethod'] = array();
+    }else{
+      $this->attrs['gotoXdmcpServer'] = array_values($this->selected_xdmcp_servers);
+    }
+
+
     if($this->AutoSync){
       $this->attrs['gotoXHsync'] = "30+55";
       $this->attrs['gotoXVsync'] = "50+70";
@@ -459,14 +584,16 @@ class termservice extends plugin
     $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 object system terminal/service with dn '%s' failed."),$this->dn));
+    if (!$ldap->success()){
+      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+    }
     $this->handle_post_events("modify");
   }
 
 
   function getListOfXDrivers()
   {
-    $drivers = array();
+    $drivers = array("default" => "["._("unknown")."]");
 
     /* Generate a list of xdrivers from CONFIG_DIR/xdrivers */
     if (file_exists(CONFIG_DIR.'/xdrivers')){
@@ -477,10 +604,13 @@ class termservice extends plugin
         }
       }
     } else {
-      $drivers = array("ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
+      foreach( array(
+          "ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
           "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc",  "nv", "nvidia",
           "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
-          "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware");
+          "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware") as $driver){
+        $drivers[] = $driver;
+      }
     }
     return($drivers);
   }
@@ -502,7 +632,6 @@ class termservice extends plugin
             "gotoXMonitor"            => _("Monitor"),
             "gotoXMethod"             => _("Method"),
             "gotoXdmcpServer"         => _("Remote desktop"),
-            "gotoFontPath"            => _("Font path"),
             "gotoXDriver"             => _("Gfx driver"),
             "gotoXResolution"         => _("Gfx resolution"),
             "gotoXColordepth"         => _("Gfx color depth"),
@@ -512,7 +641,6 @@ class termservice extends plugin
             "gotoLpdEnable"           => _("Printer service enabled"),
             "gotoLpdServer"           => _("Spool server"),
             "gotoScannerEnable"       => _("Scanner enabled"),
-            "gotoScannerModel"        => _("Scanner model"),
             "gotoXKbModel"            => _("Keyboard model"),
             "gotoXKbLayout"           => _("Keyboard layout"),
             "gotoXKbVariant"          => _("Keyboard variant"),