1 <?php
3 class termservice extends plugin
4 {
5 /* CLI vars */
6 var $cli_summary= "Manage terminal service aspects";
7 var $cli_description= "Some longer text\nfor help";
8 var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
10 /* Generic terminal attributes */
11 var $gotoLpdEnable= FALSE;
12 var $gotoXMonitor= "";
13 var $gotoXMethod= "default";
14 var $gotoXdmcpServer= "";
15 var $gotoXDriver= "";
16 var $gotoXResolution= "";
17 var $gotoXColordepth= "";
18 var $gotoXHsync= "";
19 var $gotoXVsync= "";
20 var $gotoXKbModel= "";
21 var $gotoXKbLayout= "";
22 var $gotoXKbVariant= "";
23 var $gotoXMouseType= "";
24 var $gotoXMouseport= "";
25 var $gotoLpdServer= "";
26 var $gotoScannerEnable= "";
27 var $gotoScannerModel= "";
28 var $gotoScannerClients= "";
29 var $gotoScannerBackend= "";
30 var $goFonHardware= "automatic";
32 var $AutoSync = false;
33 var $view_logged = FALSE;
35 /* Needed values and lists */
36 var $ignore_account= TRUE;
37 var $base= "";
38 var $cn= "";
39 var $orig_dn= "";
40 var $XMethods= array();
41 var $XDrivers= array();
42 var $XResolutions= array();
43 var $XColordepths= array();
44 var $XKbModels= array ();
45 var $XKbLayouts= array ();
46 var $XKbVariants= array ();
47 var $MouseTypes= array();
48 var $MousePorts= array();
49 var $hardware_list= array();
50 var $used_hardware= array();
53 /* attribute list for save action */
54 var $attributes= array("gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
55 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
56 "gotoXHsync", "gotoXVsync", "gotoLpdEnable", "gotoLpdServer",
57 "gotoScannerEnable", "gotoScannerModel", "gotoScannerClients",
58 "gotoScannerBackend", "gotoXKbModel", "gotoXKbLayout", "gotoXKbVariant",
59 "gotoXMouseType", "gotoXMouseport", "goFonHardware");
60 var $objectclasses= array("GOhard");
62 var $is_ogroup = FALSE;
63 var $is_ogroup_member = FALSE;
65 var $selected_xdmcp_servers = array();
66 var $inherited_xdmcp_servers = array();
68 function termservice (&$config, $dn= NULL, $parent= NULL)
69 {
70 plugin::plugin ($config, $dn, $parent);
71 $this->orig_dn= $this->dn;
73 /* Check if we are a part of an ogroup.
74 * In this case, we have to hide all the inherit stuff.
75 */
76 if(isset($parent) && get_class($parent) == "ogroup"){
77 $this->is_ogroup = TRUE;
78 }
80 /* Check if we are member of an object group.
81 */
82 $ldap= $this->config->get_ldap_link();
83 $ldap->cd($this->config->current['BASE']);
84 $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
85 if($ldap->count()){
86 $this->is_ogroup_member = TRUE;
87 }
89 /* Get list of available xdrivers */
90 $this->XDrivers = $this->getListOfXDrivers();
92 /* Create a list of available resolutions.
93 */
94 $this->XResolutions= array(
95 "640x480" => "640x480",
96 "800x600" => "800x600",
97 "1024x768" => "1024x768",
98 "1152x864" => "1152x864",
99 "1280x1024" => "1280x1024",
100 "1400x1050" => "1400x1050",
101 "1600x1200" => "1600x1200");
103 if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
104 $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
105 if(is_readable($file)){
106 $str = file_get_contents($file);
107 $lines = split("\n",$str);
108 foreach($lines as $line){
109 $line = trim($line);
110 if(!empty($line)){
111 $this->XResolutions[$line]=$line;
112 }
113 }
114 }else{
115 print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
116 }
117 }
119 /* Create a set of selectable color depths
120 */
121 $this->XColordepths= array(
122 "8" => "8 " ._("bit"),
123 "15" => "15 "._("bit"),
124 "16" => "16 "._("bit"),
125 "24" => "24 "._("bit"));
128 /* Create a set of selectable keyboard models
129 */
130 $this->XKbModels = array();
131 foreach(array ("btc9000", "chicony", "compaq", "dell", "dell101", "everex",
132 "flexpro", "geniuscomfy", "hp", "itouch", "jp106", "logicordless",
133 "logiinetnav", "logiinternet", "macintosh", "microsoft",
134 "microsoftpro", "omnikey101", "pc101", "pc102", "pc104",
135 "pc105", "rapidaccess", "rapidaccess2", "winbook") as $type){
136 $this->XKbModels[$type] = $type;
137 }
139 /* Additional values will be extracted from CONFIG_DIR.keyboardLayouts */
140 $this->XKbLayouts = array("de"=> "de","intl" =>"intl","us" =>"us");
141 $this->XKbVariants= array("nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
142 $this->MouseTypes = array("ImPS/2"=>"ImPS/2","PS/2"=>"PS/2", "explorerps/2"=>"explorerps/2",
143 "Microsoft"=>"Microsoft","Logitech"=>"Logitech");
144 $this->MousePorts = array("/dev/ttyS0"=>"/dev/ttyS0",
145 "/dev/ttyS1"=>"/dev/ttyS1","/dev/psaux"=>"/dev/psaux",
146 "/dev/input/mice"=>"/dev/input/mice");
149 /* Try to read additional keyboard layouts
150 */
151 if(file_exists(CONFIG_DIR."/keyboardLayouts")){
152 if(is_readable(CONFIG_DIR."/keyboardLayouts")){
153 $str = file_get_contents(CONFIG_DIR."/keyboardLayouts");
154 $tmp = split("\n",$str);
155 foreach($tmp as $entry){
156 if((!empty($entry)) && (!preg_match("/^#/",$entry))){
157 $entry = trim($entry);
158 $tmp2 = split ("\:",$entry);
159 $la = trim($tmp2[0]); // What would be saved to ldap
160 $da = trim($tmp2[1]); // This wis displayed in the listbox
161 $this->XKbLayouts [ $la] = $da;
162 }
163 }
164 }
165 }
167 /* Terminal server methods
168 */
169 if($this->is_ogroup_member){
170 $this->XMethods["default"]= _("inherited");
171 }
172 $this->XMethods["xdmcp"] = _("XDMCP");
173 $this->XMethods["ldm"] = _("LDM");
174 $this->XMethods["rdp"] = _("Windows RDP");
175 $this->XMethods["citrix"] = _("ICA client");
177 /* Get selected gotoXdmcpServer
178 */
179 $this->selected_xdmcp_servers = array();
180 if(isset($this->attrs['gotoXdmcpServer'])){
181 for($i = 0 ; $i < $this->attrs['gotoXdmcpServer']['count'] ; $i++){
182 $this->selected_xdmcp_servers[] = $this->attrs['gotoXdmcpServer'][$i];
183 }
184 }
186 /* Load phone hardware list
187 */
188 $ldap= $this->config->get_ldap_link();
189 $ldap->cd($this->config->current['BASE']);
190 $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
191 while ($attrs= $ldap->fetch()){
192 $cn= $attrs['cn'][0];
193 if (isset($attrs['description'])){
194 $description= " - ".$attrs['description'][0];
195 } else {
196 $description= "";
197 }
198 $this->hardware_list[$cn]= "$cn$description";
199 }
205 /* Eventually colorize phones */
207 $deps = array();
208 $ou = preg_replace("/,.*$/","",get_ou("phoneou"));
210 if(!empty($ou)){
211 $ldap->cd($this->config->current['BASE']);
212 $ldap->search("(&(objectClass=organizationalUnit)(".$ou."))",array("dn"));
213 while($attrs = $ldap->fetch()){
214 $deps[] = $attrs['dn'];
215 }
216 }else{
218 /* Phone ou seems to be empty, fall back to overall base .
219 */
220 $deps[] = $this->config->current['BASE'];
221 }
223 foreach($deps as $dep){
224 $ldap->cd($dep);
225 $ldap->search("(goFonHardware=*)",array('cn','dn','goFonHardware'));
226 while($attrs = $ldap->fetch()){
227 $cn = $attrs['goFonHardware'][0];
228 if(isset($this->hardware_list[$cn])){
229 $this->used_hardware[$cn]= $cn;
230 }
231 }
232 }
233 $this->hardware_list["automatic"]= _("automatic");
235 ksort($this->hardware_list);
237 /* Convert gotoLpdEnable
238 */
239 $this->gotoLpdEnable= preg_match("/yes/i",$this->gotoLpdEnable);
242 /* Load hardware list */
243 $ldap= $this->config->get_ldap_link();
244 $ldap->cd($this->config->current['BASE']);
245 $map= array(
246 "gotoXResolution",
247 "gotoXColordepth",
248 "gotoXKbModel",
249 "gotoXKbLayout",
250 # "gotoXDriver",
251 "gotoXdmcpServer",
252 "gotoXKbVariant",
253 "gotoXMouseType",
254 "gotoXMethod",
255 "gotoXMouseport");
256 $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))",$map);
257 if ($ldap->count() == 1){
258 $attrs= $ldap->fetch();
259 foreach ($map as $name){
260 if (!isset($attrs[$name][0])){
261 continue;
262 }
264 switch ($name){
265 # case 'gotoXDriver':
266 # $this->XDrivers = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XDrivers;
267 # break;
268 case 'gotoXMethod':
269 $this->XMethods = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XMethods;
270 if(isset($attrs['gotoXdmcpServer'])){
271 for($i = 0 ; $i < $attrs['gotoXdmcpServer']['count'] ; $i++){
272 $this->inherited_xdmcp_servers[] = $attrs['gotoXdmcpServer'][$i];
273 }
274 }
275 break;
276 case 'gotoXResolution':
277 $this->XResolutions= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XResolutions;
278 break;
279 case 'gotoXColordepth':
280 $this->XColordepths= array('default' => _("inherited").' ['.$attrs[$name][0].' '._('Bit').']') + $this->XColordepths;
281 break;
282 case 'gotoXKbModel':
283 $this->XKbModels= array('default' => _("inherited").' ['.$attrs[$name][0].']') + $this->XKbModels;
284 break;
285 case 'gotoXKbLayout':
286 $this->XKbLayouts= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbLayouts;
287 break;
288 case 'gotoXKbVariant':
289 $this->XKbVariants= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbVariants;
290 break;
291 case 'gotoXMouseType':
292 $this->MouseTypes= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
293 break;
294 case 'gotoXMouseport':
295 $this->MousePorts= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
296 break;
297 }
298 }
299 }
301 if(preg_match("/\+/",$this->gotoXHsync)){
302 $this->AutoSync = true;
303 $this->gotoXHsync = preg_replace("/\+/","-",$this->gotoXHsync);
304 $this->gotoXVsync = preg_replace("/\+/","-",$this->gotoXVsync);
305 }
306 }
309 function execute()
310 {
311 /* Call parent execute */
312 plugin::execute();
314 if($this->is_account && !$this->view_logged){
315 $this->view_logged = TRUE;
316 new log("view","terminal/".get_class($this),$this->dn);
317 }
319 /* Do we need to flip is_account state? */
320 if (isset($_POST['modify_state'])){
321 $this->is_account= !$this->is_account;
322 }
324 /* Do we represent a valid terminal? */
325 if (!$this->is_account && $this->parent === NULL){
326 $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
327 _("This 'dn' has no terminal features.")."</b>";
328 return ($display);
329 }
331 /* Show main page */
332 $smarty= get_smarty();
334 /* Assign acls */
335 $tmp= $this->plInfo();
336 foreach($tmp['plProvidedAcls'] as $name => $translation){
337 $smarty->assign($name."ACL",$this->getacl($name));
338 }
340 if(isset($_POST['gotoXdmcpServer_add']) && isset($_POST['XdmcpAddServer'])){
341 if(!in_array($_POST['gotoXdmcpServer_add'],$this->selected_xdmcp_servers)){
342 $this->selected_xdmcp_servers[] = $_POST['gotoXdmcpServer_add'];
343 }
344 }
346 if(isset($_POST['selected_xdmcp_servers']) && isset($_POST['XdmcpDelServer'])){
347 $tmp = array();
348 foreach($this->selected_xdmcp_servers as $name){
349 if(!in_array($name,$_POST['selected_xdmcp_servers'])){
350 $tmp[] = $name;
351 }
352 }
353 $this->selected_xdmcp_servers = $tmp;
354 }
356 /* Arrays */
357 foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
358 "XKbModels","XKbVariants","MouseTypes", "MousePorts") as $val){
359 $smarty->assign("$val", $this->$val);
360 }
361 $smarty->assign("XKbLayouts", $this->XKbLayouts);
362 $smarty->assign("XKbLayoutKeys",array_flip($this->XKbLayouts));
363 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
366 /* Create a list of useable servers for the currently selected
367 * connection type.
368 */
369 $xdmcp_types = $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
370 $available_servers = array();
371 foreach($xdmcp_types as $servername =>$supported_types){
372 if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
373 $available_servers[] = $servername;
374 }
375 }
377 /* Append additional information to invalid server selections.
378 */
379 $tmp = array();
380 foreach($this->selected_xdmcp_servers as $server){
381 if(in_array($server,$available_servers)){
382 $tmp[$server] = $server;
383 }else{
384 $tmp[$server] = $server." - "._("Unsupported");
385 }
386 }
388 /* Remove already selected servers from available list.
389 */
390 foreach($available_servers as $key => $server){
391 if(isset($tmp[$server])){
392 unset($available_servers[$key]);
393 }
394 }
396 $smarty->assign("selected_xdmcp_servers", $tmp);
397 $smarty->assign("inherited_xdmcp_servers", $this->inherited_xdmcp_servers);
398 $smarty->assign("available_xdmcp_servers", $available_servers);
400 /* Variables - select */
401 foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth",
402 "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
403 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
405 $smarty->assign($val."_select", $this->$val);
406 }
408 /* Variables */
409 foreach(array("gotoXHsync", "gotoXVsync") as $val){
410 $smarty->assign($val, $this->$val);
411 }
412 $smarty->assign("staticAddress", "");
414 /* Checkboxes */
415 foreach(array("gotoLpdEnable", "gotoScannerEnable") as $val){
416 if ($this->$val == TRUE) {
417 $smarty->assign("$val", "checked");
418 } else {
419 $smarty->assign("$val", "");
420 }
421 }
423 /* Phone stuff */
424 $smarty->assign ("goFonHardware", $this->goFonHardware);
425 $hl= "<select size=\"1\" name=\"goFonHardware\" title=\"".
426 _("Choose the phone located at the current terminal")."\" >\n";
427 foreach ($this->hardware_list as $cn => $description){
428 if ($cn == $this->goFonHardware){
429 $selected= "selected";
430 } else {
431 $selected= "";
432 }
433 if (isset($this->used_hardware[$cn])){
434 $color= "style=\"color:#A0A0A0\"";
435 } else {
436 $color= "";
437 }
438 $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
439 }
440 $hl.= "</select>\n";
441 $smarty->assign ("hardware_list", $hl);
442 $smarty->assign ("gotoXMonitor", $this->gotoXMonitor);
444 $smarty->assign("AutoSyncACL",$this->getacl("AutoSync"));
446 $smarty->assign("AutoSyncCHK"," ");
447 if($this->AutoSync){
448 $smarty->assign("AutoSyncCHK"," checked ");
449 $smarty->assign("gotoXVsyncACL", preg_replace("/w/","",$this->getacl("gotoXVsync")));
450 $smarty->assign("gotoXHsyncACL", preg_replace("/w/","",$this->getacl("gotoXHsync")));
451 }
453 /* Show main page */
454 return($smarty->fetch (get_template_path('terminalService.tpl', TRUE,dirname(__FILE__))));
455 }
457 function remove_from_parent()
458 {
459 new log("remove","terminal/".get_class($this),$this->dn,array_keys($this->attrs));
460 $this->handle_post_events("remove");
462 plugin::remove_from_parent();
463 $ldap = $this->config->get_ldap_link();
464 $ldap->cd($this->dn);
465 $ldap->modify($this->attrs);
466 show_ldap_error($ldap->get_error(),_("Could not remove terminal service."));
467 }
470 /* Save data to object */
471 function save_object()
472 {
473 plugin::save_object();
475 /* Save checkbox state */
476 if (isset ($_POST['gotoXMethod'])){
477 foreach (array("gotoLpdEnable", "gotoScannerEnable") as $val){
479 if($this->acl_is_writeable($val)){
480 if (!isset ($_POST["$val"])){
481 $this->$val= FALSE;
482 } else {
483 $this->$val= TRUE;
484 }
485 }
486 }
487 }
489 if(isset($_POST['gotoXDriver'])){
490 if(isset($_POST['AutoSync'])){
491 $this->AutoSync = true;
492 }else{
493 $this->AutoSync = false;
494 }
495 }
497 /* Default entries can use blank hsync/vsync entries */
498 if ($this->dn != "" && $this->cn != "default" && $this->cn != "default"){
500 /* But only if no auto sync is enabled... */
501 if (!$this->AutoSync){
503 /* Check vsync for correct usage */
504 $val= preg_replace ("/\s/", "", $this->gotoXVsync);
505 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXVsync")){
507 $message[]= _("Please specify a valid VSync range.");
508 } elseif ($this->acl_is_writeable("gotoXVsync")){
509 list($v1,$v2)= preg_split ("/[-+]/", $val);
510 if ($v2 != ""){
511 if ($v1 > $v2){
512 $message[]= _("Please specify a valid VSync range.");
513 }
514 }
515 }
517 /* Check hsync for correct usage */
518 $val= preg_replace ("/\s/", "", $this->gotoXHsync);
519 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXHsync")){
521 $message[]= _("Please specify a valid HSync range.");
522 } elseif ($this->acl_is_writeable("gotoXHsync")){
523 list($v1,$v2)= preg_split ("/[-+]/", $val);
524 if ($v2 != ""){
525 if ($v1 > $v2){
526 $message[]= _("Please specify a valid HSync range.");
527 }
528 }
529 }
530 }
531 }
532 }
535 /* Check supplied data */
536 function check()
537 {
538 /* Call common method to give check the hook */
539 $message= plugin::check();
541 if($this->gotoXMethod != "default"){
542 $xdmcp_types = $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
543 $available_servers = array();
544 foreach($xdmcp_types as $servername =>$supported_types){
545 if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
546 $available_servers[] = $servername;
547 }
548 }
549 foreach($this->selected_xdmcp_servers as $server){
550 if(!in_array($server,$available_servers)){
551 $message[] = _("Remote desktop settings contains servers that do not support the selected connection method.");
552 break;
553 }
554 }
555 }
557 return ($message);
558 }
561 /* Save to LDAP */
562 function save()
563 {
564 /* Convert to string */
565 $this->gotoLpdEnable= $this->gotoLpdEnable?"Yes":"No";
567 if($this->is_ogroup){
568 $this->objectclasses = array("gotoWorkstationTemplate");
569 }else{
570 $this->objectclasses = array("GOhard");
571 }
573 plugin::save();
575 /* Strip out 'default' values */
576 foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth",
577 "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
578 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
580 if ($this->attrs[$val] == "default"){
581 $this->attrs[$val]= array();
582 }
583 }
585 if($this->gotoXMethod == "default"){
586 $this->attrs['gotoXdmcpServer'] = array();
587 $this->attrs['gotoXMethod'] = array();
588 }else{
589 $this->attrs['gotoXdmcpServer'] = array_values($this->selected_xdmcp_servers);
590 }
593 if($this->AutoSync){
594 $this->attrs['gotoXHsync'] = "30+55";
595 $this->attrs['gotoXVsync'] = "50+70";
596 }
598 /* Write back to ldap */
599 $ldap= $this->config->get_ldap_link();
600 $ldap->cd($this->dn);
601 $this->cleanup();
602 $ldap->modify ($this->attrs);
603 new log("modify","terminal/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
605 show_ldap_error($ldap->get_error(), sprintf(_("Saving of object system terminal/service with dn '%s' failed."),$this->dn));
606 $this->handle_post_events("modify");
607 }
610 function getListOfXDrivers()
611 {
612 $drivers = array("default" => "["._("unknown")."]");
614 /* Generate a list of xdrivers from CONFIG_DIR/xdrivers */
615 if (file_exists(CONFIG_DIR.'/xdrivers')){
616 $xdrivers = file (CONFIG_DIR.'/xdrivers');
617 foreach ($xdrivers as $line){
618 if (!preg_match ("/^#/", $line)){
619 $drivers[]= trim($line);
620 }
621 }
622 } else {
623 foreach( array(
624 "ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
625 "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc", "nv", "nvidia",
626 "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
627 "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware") as $driver){
628 $drivers[] = $driver;
629 }
630 }
631 return($drivers);
632 }
635 /* Return plugin informations for acl handling */
636 static function plInfo()
637 {
638 return (array(
639 "plShortName" => _("Service"),
640 "plDescription" => _("Terminal service"),
641 "plSelfModify" => FALSE,
642 "plDepends" => array(),
643 "plPriority" => 3,
644 "plSection" => array("administration"),
645 "plCategory" => array("terminal"),
647 "plProvidedAcls"=> array(
648 "gotoXMonitor" => _("Monitor"),
649 "gotoXMethod" => _("Method"),
650 "gotoXdmcpServer" => _("Remote desktop"),
651 "gotoXDriver" => _("Gfx driver"),
652 "gotoXResolution" => _("Gfx resolution"),
653 "gotoXColordepth" => _("Gfx color depth"),
654 "gotoXHsync" => _("Hsync"),
655 "gotoXVsync" => _("Vsync"),
656 "AutoSync" => _("Auto-Sync"),
657 "gotoLpdEnable" => _("Printer service enabled"),
658 "gotoLpdServer" => _("Spool server"),
659 "gotoScannerEnable" => _("Scanner enabled"),
660 "gotoXKbModel" => _("Keyboard model"),
661 "gotoXKbLayout" => _("Keyboard layout"),
662 "gotoXKbVariant" => _("Keyboard variant"),
663 "gotoXMouseType" => _("Mouse type"),
664 "gotoXMouseport" => _("Mouse port"),
665 "goFonHardware" => _("Telephone hardware"))
666 ));
667 }
668 }
670 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
671 ?>