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= "";
14 var $gotoXdmcpServer= "";
15 var $gotoFontPath= "";
16 var $gotoXDriver= "";
17 var $gotoXResolution= "";
18 var $gotoXColordepth= "";
19 var $gotoXHsync= "";
20 var $gotoXVsync= "";
21 var $gotoXKbModel= "";
22 var $gotoXKbLayout= "";
23 var $gotoXKbVariant= "";
24 var $gotoXMouseType= "";
25 var $gotoXMouseport= "";
26 var $gotoLpdServer= "";
27 var $gotoScannerEnable= "";
28 var $gotoScannerModel= "";
29 var $gotoScannerClients= "";
30 var $gotoScannerBackend= "";
31 var $goFonHardware= "automatic";
33 var $AutoSync = false;
34 var $view_logged = FALSE;
36 /* Needed values and lists */
37 var $ignore_account= TRUE;
38 var $base= "";
39 var $cn= "";
40 var $orig_dn= "";
41 var $XMethods= array();
42 var $XDrivers= array();
43 var $XResolutions= array();
44 var $XColordepths= array();
45 var $XKbModels= array ();
46 var $XKbLayouts= array ();
47 var $XKbVariants= array ();
48 var $MouseTypes= array();
49 var $MousePorts= array();
50 var $gotoScannerModels= array();
51 var $hardware_list= array();
52 var $used_hardware= array();
55 /* attribute list for save action */
56 var $attributes= array("cn", "gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
57 "gotoFontPath", "gotoXDriver", "gotoXResolution", "gotoXColordepth",
58 "gotoXHsync", "gotoXVsync", "gotoLpdEnable", "gotoLpdServer",
59 "gotoScannerEnable", "gotoScannerModel", "gotoScannerClients",
60 "gotoScannerBackend", "gotoXKbModel", "gotoXKbLayout", "gotoXKbVariant",
61 "gotoXMouseType", "gotoXMouseport", "goFonHardware");
62 var $objectclasses= array("GOhard");
65 function termservice (&$config, $dn= NULL, $parent= NULL)
66 {
67 plugin::plugin ($config, $dn, $parent);
69 /* Get list of available xdrivers */
70 $this->XDrivers = $this->getListOfXDrivers();
71 array_unshift($this->XDrivers, "["._("unknown")."]");
73 $this->XResolutions= array(
74 "default" => "["._("inherited")."]" ,
75 "640x480" => "640x480",
76 "800x600" => "800x600",
77 "1024x768" => "1024x768",
78 "1152x864" => "1152x864",
79 "1280x1024" => "1280x1024",
80 "1400x1050" => "1400x1050",
81 "1600x1200" => "1600x1200");
83 if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
84 $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
86 if(is_readable($file)){
87 $str = file_get_contents($file);
88 $lines = split("\n",$str);
89 foreach($lines as $line){
90 $line = trim($line);
91 if(!empty($line)){
92 $this->XResolutions[$line]=$line;
93 }
94 }
95 //natcasesort($this->gotoXResolutions);
96 }else{
97 print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
98 }
99 }
101 $this->XColordepths= array(
102 "default" => "["._("inherited")."]",
103 "8" => "8 " ._("bit"),
104 "15" => "15 "._("bit"),
105 "16" => "16 "._("bit"),
106 "24" => "24 "._("bit"));
108 $this->XKbModels['default']= "["._("inherited")."]";
109 foreach(array ("btc9000", "chicony", "compaq", "dell", "dell101", "everex",
110 "flexpro", "geniuscomfy", "hp", "itouch", "jp106", "logicordless",
111 "logiinetnav", "logiinternet", "macintosh", "microsoft",
112 "microsoftpro", "omnikey101", "pc101", "pc102", "pc104",
113 "pc105", "rapidaccess", "rapidaccess2", "winbook") as $type){
114 $this->XKbModels[$type] = $type;
115 }
117 /* Additional values will be extracted from CONFIG_DIR.keyboardLayouts */
118 $this->XKbLayouts= array ("default"=>"["._("inherited")."]","de"=> "de","intl" =>"intl","us" =>"us");
119 $this->XKbVariants= array ("default"=>"["._("inherited")."]", "nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
121 $this->MouseTypes= array( "AUTO" => "["._("inherited")."]" , "ImPS/2" => "ImPS/2",
122 "PS/2" => "PS/2" , "Microsoft" => "Microsoft",
123 "Logitech" => "Logitech");
125 $this->MousePorts= array("AUTO" =>"["._("inherited")."]" , "/dev/ttyS0" => "/dev/ttyS0",
126 "/dev/ttyS1" => "/dev/ttyS1" , "/dev/psaux" => "/dev/psaux",
127 "/dev/input/mice" =>"/dev/input/mice");
130 /* try to read additional keyboard layouts
131 */
132 if(file_exists(CONFIG_DIR."/keyboardLayouts")){
133 if(is_readable(CONFIG_DIR."/keyboardLayouts")){
134 $str = file_get_contents(CONFIG_DIR."/keyboardLayouts");
135 $tmp = split("\n",$str);
136 foreach($tmp as $entry){
137 if((!empty($entry)) && (!preg_match("/^#/",$entry))){
138 $entry = trim($entry);
139 $tmp2 = split ("\:",$entry);
140 $la = trim($tmp2[0]); // What would be saved to ldap
141 $da = trim($tmp2[1]); // This wis displayed in the listbox
142 $this->XKbLayouts [ $la] = $da;
143 }
144 }
145 }
146 }
148 /* Load scanner models */
149 $fcontents = file ($this->config->basedir."/include/scanner.inc");
150 while (list ($line_num, $line) = each ($fcontents)) {
151 preg_match('/^(\w+) "([^"]+)" "([^"]+)" "([^"]+)"/', "$line", $matches);
152 $this->gotoScannerModels[$matches[2]." - ".$matches[3]]= $matches[1]."|".$matches[4];
153 }
154 ksort ($this->gotoScannerModels);
156 /* Initialize methods */
157 $this->XMethods["default"]= _("default");
158 $this->XMethods["indirect"]= _("show chooser");
159 $this->XMethods["query"]= _("direct");
160 #$this->XMethods["squery"]= _("direct via ssh");
161 #$this->XMethods["nquery"]= _("direct via nx");
162 $this->XMethods["load"]= _("load balanced");
163 #$this->XMethods["sload"]= _("load balanced via ssh");
164 #$this->XMethods["nload"]= _("load balanced via nx");
165 $this->XMethods["rdp"]= _("Windows RDP");
166 $this->XMethods["citrix"]= _("ICA client");
168 $this->orig_dn= $this->dn;
170 /* Load hardware list */
171 $ldap= $this->config->get_ldap_link();
172 $ldap->cd($this->config->current['BASE']);
173 $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
174 while ($attrs= $ldap->fetch()){
175 $cn= $attrs['cn'][0];
176 if (isset($attrs['description'])){
177 $description= " - ".$attrs['description'][0];
178 } else {
179 $description= "";
180 }
181 $this->hardware_list[$cn]= "$cn$description";
182 }
184 /* Eventually colorize phones */
185 $ldap->cd($this->config->current['BASE']);
186 foreach ($this->hardware_list as $cn => $desc){
187 $ldap->search("(goFonHardware=$cn)", array('cn'));
188 if ($ldap->count() > 0){
189 $ldap->fetch();
190 if ($ldap->getDN() != $this->dn){
191 $this->used_hardware[$cn]= $ldap->getDN();
192 }
193 }
194 }
196 $this->hardware_list["automatic"]= _("automatic");
197 ksort($this->hardware_list);
199 /* Convert gotoLpdEnable */
200 $this->gotoLpdEnable= preg_match("/yes/i",$this->gotoLpdEnable);
202 /* Load hardware list */
203 $ldap= $this->config->get_ldap_link();
204 $ldap->cd($this->config->current['BASE']);
205 $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".$this->dn."))");
206 if ($ldap->count() == 1){
207 $map= array("gotoXResolution", "gotoXColordepth", "gotoXKbModel", "gotoXKbLayout",
208 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport");
209 $attrs= $ldap->fetch();
211 foreach ($map as $name){
212 if (!isset($attrs[$name][0])){
213 continue;
214 }
216 switch ($name){
217 case 'gotoXResolution':
218 $this->XResolutions['default'] = _("inherited").' ['.$attrs[$name][0].']' ;
219 break;
220 case 'gotoXColordepth':
221 $this->XColordepths['default'] = _("inherited").' ['.$attrs[$name][0].' '._('Bit').']';
222 break;
223 case 'gotoXKbModel':
224 $this->XKbModels['default'] = _("inherited").' ['.$attrs[$name][0].']';
225 break;
226 case 'gotoXKbLayout':
227 $this->XKbLayouts['default'] = _("inherited").' ['.$attrs[$name][0].']';
228 break;
229 case 'gotoXKbVariant':
230 $this->XKbVariants['default'] = _("inherited").' ['.$attrs[$name][0].']' ;
231 break;
232 case 'gotoXMouseType':
233 $this->MouseTypes['AUTO'] = _("inherited").' ['.$attrs[$name][0].']' ;
234 break;
235 case 'gotoXMouseport':
236 $this->MousePorts['AUTO'] = _("inherited").' ['.$attrs[$name][0].']' ;
237 break;
238 }
239 }
240 }
241 if(preg_match("/\+/",$this->gotoXHsync)){
242 $this->AutoSync = true;
243 $this->gotoXHsync = preg_replace("/\+/","-",$this->gotoXHsync);
244 $this->gotoXVsync = preg_replace("/\+/","-",$this->gotoXVsync);
245 }
246 }
248 function execute()
249 {
250 /* Call parent execute */
251 plugin::execute();
253 if($this->is_account && !$this->view_logged){
254 $this->view_logged = TRUE;
255 new log("view","terminal/".get_class($this),$this->dn);
256 }
258 /* Do we need to flip is_account state? */
259 if (isset($_POST['modify_state'])){
260 $this->is_account= !$this->is_account;
261 }
263 /* Do we represent a valid terminal? */
264 if (!$this->is_account && $this->parent === NULL){
265 $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
266 _("This 'dn' has no terminal features.")."</b>";
267 return ($display);
268 }
270 /* Show main page */
271 $smarty= get_smarty();
273 /* Assign acls */
274 $tmp= $this->plInfo();
275 foreach($tmp['plProvidedAcls'] as $name => $translation){
276 $smarty->assign($name."ACL",$this->getacl($name));
277 }
280 /* Arrays */
281 foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
282 "gotoScannerModels", "XKbModels","XKbVariants",
283 "MouseTypes", "MousePorts") as $val){
284 $smarty->assign("$val", $this->$val);
285 }
286 $smarty->assign("XKbLayouts", $this->XKbLayouts);
287 $smarty->assign("XKbLayoutKeys",array_flip($this->XKbLayouts));
289 $smarty->assign("xdmcpservers", $this->config->data['SERVERS']['TERMINAL']);
290 $smarty->assign("fontservers", $this->config->data['SERVERS']['FONT']);
291 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
292 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
294 /* Variables - select */
295 foreach(array("gotoXMethod", "gotoXdmcpServer", "gotoFontPath",
296 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
297 "gotoLpdServer", "gotoScannerModel", "gotoXKbModel", "gotoXKbLayout",
298 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
300 $smarty->assign($val."_select", $this->$val);
301 }
303 /* Variables */
304 foreach(array("gotoXHsync", "gotoXVsync") as $val){
305 $smarty->assign($val, $this->$val);
306 }
307 $smarty->assign("staticAddress", "");
309 /* Checkboxes */
310 foreach(array("gotoLpdEnable", "gotoScannerEnable") as $val){
311 if ($this->$val == TRUE) {
312 $smarty->assign("$val", "checked");
313 } else {
314 $smarty->assign("$val", "");
315 }
316 }
318 /* Phone stuff */
319 $smarty->assign ("goFonHardware", $this->goFonHardware);
320 $hl= "<select size=\"1\" name=\"goFonHardware\" title=\"".
321 _("Choose the phone located at the current terminal")."\" >\n";
322 foreach ($this->hardware_list as $cn => $description){
323 if ($cn == $this->goFonHardware){
324 $selected= "selected";
325 } else {
326 $selected= "";
327 }
328 if (isset($this->used_hardware[$cn])){
329 $color= "style=\"color:#A0A0A0\"";
330 } else {
331 $color= "";
332 }
333 $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
334 }
335 $hl.= "</select>\n";
336 $smarty->assign ("hardware_list", $hl);
337 $smarty->assign ("gotoXMonitor", $this->gotoXMonitor);
339 $smarty->assign("AutoSyncACL",$this->getacl("AutoSync"));
341 $smarty->assign("AutoSyncCHK"," ");
342 if($this->AutoSync){
343 $smarty->assign("AutoSyncCHK"," checked ");
344 $smarty->assign("gotoXVsyncACL", preg_replace("/w/","",$this->getacl("gotoXVsync")));
345 $smarty->assign("gotoXHsyncACL", preg_replace("/w/","",$this->getacl("gotoXHsync")));
346 }
348 /* Show main page */
349 return($smarty->fetch (get_template_path('terminalService.tpl', TRUE)));
350 }
352 function remove_from_parent()
353 {
354 new log("remove","terminal/".get_class($this),$this->dn,array_keys($this->attrs));
355 $this->handle_post_events("remove");
356 }
359 /* Save data to object */
360 function save_object()
361 {
362 plugin::save_object();
364 /* Save checkbox state */
365 if (isset ($_POST['gotoXMethod'])){
366 foreach (array("gotoLpdEnable", "gotoScannerEnable") as $val){
368 if($this->acl_is_writeable($val)){
369 if (!isset ($_POST["$val"])){
370 $this->$val= FALSE;
371 } else {
372 $this->$val= TRUE;
373 }
374 }
375 }
376 }
378 if(isset($_POST['gotoXDriver'])){
379 if(isset($_POST['AutoSync'])){
380 $this->AutoSync = true;
381 }else{
382 $this->AutoSync = false;
383 }
384 }
386 /* Default entries can use blank hsync/vsync entries */
387 if ($this->dn != "" && $this->cn != "default" && $this->cn != "default"){
389 /* But only if no auto sync is enabled... */
390 if (!$this->AutoSync){
392 /* Check vsync for correct usage */
393 $val= preg_replace ("/\s/", "", $this->gotoXVsync);
394 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXVsync")){
396 $message[]= _("Please specify a valid VSync range.");
397 } elseif ($this->acl_is_writeable("gotoXVsync")){
398 list($v1,$v2)= preg_split ("/[-+]/", $val);
399 if ($v2 != ""){
400 if ($v1 > $v2){
401 $message[]= _("Please specify a valid VSync range.");
402 }
403 }
404 }
406 /* Check hsync for correct usage */
407 $val= preg_replace ("/\s/", "", $this->gotoXHsync);
408 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXHsync")){
410 $message[]= _("Please specify a valid HSync range.");
411 } elseif ($this->acl_is_writeable("gotoXHsync")){
412 list($v1,$v2)= preg_split ("/[-+]/", $val);
413 if ($v2 != ""){
414 if ($v1 > $v2){
415 $message[]= _("Please specify a valid HSync range.");
416 }
417 }
418 }
419 }
420 }
421 }
424 /* Check supplied data */
425 function check()
426 {
427 /* Call common method to give check the hook */
428 $message= plugin::check();
429 return ($message);
430 }
433 /* Save to LDAP */
434 function save()
435 {
436 /* Convert to string */
437 $this->gotoLpdEnable= $this->gotoLpdEnable?"Yes":"No";
439 plugin::save();
441 /* Strip out 'default' values */
442 foreach(array("gotoXMethod", "gotoXdmcpServer", "gotoFontPath",
443 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
444 "gotoLpdServer", "gotoScannerModel", "gotoXKbModel", "gotoXKbLayout",
445 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
447 if ($this->attrs[$val] == "default"){
448 $this->attrs[$val]= array();
449 }
450 }
452 if($this->AutoSync){
453 $this->attrs['gotoXHsync'] = "30+55";
454 $this->attrs['gotoXVsync'] = "50+70";
455 }
457 /* Write back to ldap */
458 $ldap= $this->config->get_ldap_link();
459 $ldap->cd($this->dn);
460 $this->cleanup();
461 $ldap->modify ($this->attrs);
462 new log("modify","terminal/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
464 show_ldap_error($ldap->get_error(), sprintf(_("Saving of object system terminal/service with dn '%s' failed."),$this->dn));
465 $this->handle_post_events("modify");
466 }
469 function getListOfXDrivers()
470 {
471 $drivers = array();
473 /* Generate a list of xdrivers from CONFIG_DIR/xdrivers */
474 if (file_exists(CONFIG_DIR.'/xdrivers')){
475 $xdrivers = file (CONFIG_DIR.'/xdrivers');
476 foreach ($xdrivers as $line){
477 if (!preg_match ("/^#/", $line)){
478 $drivers[]= trim($line);
479 }
480 }
481 } else {
482 $drivers = array("ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
483 "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc", "nv", "nvidia",
484 "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
485 "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware");
486 }
487 return($drivers);
488 }
491 /* Return plugin informations for acl handling */
492 function plInfo()
493 {
494 return (array(
495 "plShortName" => _("Service"),
496 "plDescription" => _("Terminal service"),
497 "plSelfModify" => FALSE,
498 "plDepends" => array(),
499 "plPriority" => 3,
500 "plSection" => array("administration"),
501 "plCategory" => array("terminal"),
503 "plProvidedAcls"=> array(
504 "gotoXMonitor" => _("Monitor"),
505 "gotoXMethod" => _("Method"),
506 "gotoXdmcpServer" => _("Remote desktop"),
507 "gotoFontPath" => _("Font path"),
508 "gotoXDriver" => _("Gfx driver"),
509 "gotoXResolution" => _("Gfx resolution"),
510 "gotoXColordepth" => _("Gfx color depth"),
511 "gotoXHsync" => _("Hsync"),
512 "gotoXVsync" => _("Vsync"),
513 "AutoSync" => _("Auto-Sync"),
514 "gotoLpdEnable" => _("Printer service enabled"),
515 "gotoLpdServer" => _("Spool server"),
516 "gotoScannerEnable" => _("Scanner enabled"),
517 "gotoScannerModel" => _("Scanner model"),
518 "gotoXKbModel" => _("Keyboard model"),
519 "gotoXKbLayout" => _("Keyboard layout"),
520 "gotoXKbVariant" => _("Keyboard variant"),
521 "gotoXMouseType" => _("Mouse type"),
522 "gotoXMouseport" => _("Mouse port"),
523 "goFonHardware" => _("Telephone hardware"))
524 ));
525 }
526 }
528 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
529 ?>