1 <?php
3 class workservice 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 var $gotoScannerEnable;
11 /* Generic terminal attributes */
12 var $gotoXMonitor= "";
13 var $gotoXDriver= "";
14 var $gotoXResolution= "";
15 var $gotoXColordepth= "";
16 var $gotoXHsync= "";
17 var $gotoXVsync= "";
18 var $AutoSync = false;
19 var $gotoXKbModel= "";
20 var $gotoXKbLayout= "";
21 var $gotoXKbVariant= "";
22 var $gotoXMouseType= "";
23 var $gotoXMouseport= "";
24 var $gotoScannerClients= "";
25 var $gotoScannerBackend= "";
26 var $goFonHardware= "automatic";
27 var $view_logged = FALSE;
29 /* Needed values and lists */
30 var $ignore_account= TRUE;
31 var $base= "";
32 var $cn= "";
33 var $orig_dn= "";
34 var $XMethods= array();
35 var $XDrivers= array();
36 var $XResolutions = array();
37 var $MouseTypes= array();
38 var $MousePorts= array();
39 var $hardware_list= array();
40 var $used_hardware= array();
43 /* attribute list for save action */
44 var $attributes= array("gotoXMonitor",
45 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
46 "gotoXHsync", "gotoXVsync",
47 "gotoScannerEnable", "gotoScannerClients",
48 "gotoScannerBackend", "gotoXKbModel", "gotoXKbLayout", "gotoXKbVariant",
49 "gotoXMouseType", "gotoXMouseport", "goFonHardware");
50 var $objectclasses= array("GOhard");
52 var $XColordepths =array();
53 var $XKbModels =array();
54 var $XKbLayouts =array();
55 var $XKbVariants =array();
57 function workservice (&$config, $dn= NULL, $parent= NULL)
58 {
59 plugin::plugin ($config, $dn, $parent);
61 $this->XResolutions= array(
62 "640x480" => "640x480",
63 "800x600" => "800x600",
64 "1024x768" => "1024x768",
65 "1152x864" => "1152x864",
66 "1280x1024" => "1280x1024",
67 "1400x1050" => "1400x1050",
68 "1600x1200" => "1600x1200");
70 if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
71 $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
73 if(is_readable($file)){
74 $str = file_get_contents($file);
75 $lines = split("\n",$str);
76 foreach($lines as $line){
77 $line = trim($line);
78 if(!empty($line)){
79 $this->XResolutions[$line]=$line;
80 }
81 }
82 //natcasesort($this->gotoXResolutions);
83 }else{
84 print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
85 }
86 }
88 /* Get list of available xdrivers */
89 $this->XDrivers = $this->getListOfXDrivers();
91 array_unshift($this->XDrivers, "["._("unknown")."]");
93 $this->XColordepths= array(
94 "8" => "8 " ._("bit"),
95 "15" => "15 "._("bit"),
96 "16" => "16 "._("bit"),
97 "24" => "24 "._("bit"));
99 foreach(array ("btc9000", "chicony", "compaq", "dell", "dell101", "everex",
100 "flexpro", "geniuscomfy", "hp", "itouch", "jp106", "logicordless",
101 "logiinetnav", "logiinternet", "macintosh", "microsoft",
102 "microsoftpro", "omnikey101", "pc101", "pc102", "pc104",
103 "pc105", "rapidaccess", "rapidaccess2", "winbook") as $type){
104 $this->XKbModels[$type] = $type;
105 }
107 $this->MouseTypes= array("ImPS/2" => "ImPS/2", "PS/2" => "PS/2", "Microsoft" => "Microsoft",
108 "Logitech" => "Logitech","explorerps/2"=>"explorerps/2",);
110 $this->MousePorts= array("/dev/ttyS0" =>"/dev/ttyS0",
111 "/dev/ttyS1" => "/dev/ttyS1", "/dev/psaux" =>"/dev/psaux",
112 "/dev/input/mice" => "/dev/input/mice");
114 /* Additional values will be extracted from CONFIG_DIR./keyboardLayouts */
115 $this->XKbLayouts= array ("de"=> "de","intl" =>"intl","us" =>"us");
116 $this->XKbVariants= array ("nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
118 /* try to read additional keyboard layouts
119 */
120 if(file_exists(CONFIG_DIR."/keyboardLayouts")){
121 if(is_readable(CONFIG_DIR."/keyboardLayouts")){
122 $str = file_get_contents(CONFIG_DIR."/keyboardLayouts");
123 $tmp = split("\n",$str);
124 foreach($tmp as $entry){
125 if((!empty($entry)) && (!preg_match("/^#/",$entry))){
126 $entry = trim($entry);
127 $tmp2 = split ("\:",$entry);
128 $la = trim($tmp2[0]); // What would be saved to ldap
129 $da = trim($tmp2[1]); // This wis displayed in the listbox
130 $this->XKbLayouts [ $la] = $da;
131 }
132 }
133 }
134 }
136 /* Initialize methods */
137 $this->XMethods["indirect"]= _("show chooser");
138 $this->XMethods["query"]= _("direct");
139 #$this->XMethods["squery"]= _("direct via ssh");
140 #$this->XMethods["nquery"]= _("direct via nx");
141 $this->XMethods["load"]= _("load balanced");
142 #$this->XMethods["sload"]= _("load balanced via ssh");
143 #$this->XMethods["nload"]= _("load balanced via nx");
144 $this->XMethods["rdp"]= _("Windows RDP");
145 $this->XMethods["citrix"]= _("ICA client");
147 $this->orig_dn= $this->dn;
149 /* Load hardware list */
150 $ldap= $this->config->get_ldap_link();
151 $ldap->cd($this->config->current['BASE']);
152 $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
153 while ($attrs= $ldap->fetch()){
154 $cn= $attrs['cn'][0];
155 if (isset($attrs['description'])){
156 $description= " - ".$attrs['description'][0];
157 } else {
158 $description= "";
159 }
160 $this->hardware_list[$cn]= "$cn$description";
161 }
163 /* Eventually colorize phones */
164 $ldap->cd($this->config->current['BASE']);
165 $ldap->search("(goFonHardware=*)",array('cn','dn','goFonHardware'));
166 while($attrs = $ldap->fetch()){
167 $cn = $attrs['goFonHardware'][0];
168 if(isset($this->hardware_list[$cn])){
169 $this->used_hardware[$cn]= $cn;
170 }
171 }
173 if(preg_match("/\+/",$this->gotoXHsync)){
174 $this->AutoSync = true;
175 $this->gotoXHsync = preg_replace("/\+/","-",$this->gotoXHsync);
176 $this->gotoXVsync = preg_replace("/\+/","-",$this->gotoXVsync);
177 }
179 $this->hardware_list["automatic"]= _("automatic");
180 ksort($this->hardware_list);
182 /* Load hardware list */
183 $ldap= $this->config->get_ldap_link();
184 $ldap->cd($this->config->current['BASE']);
185 $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
186 if ($ldap->count() == 1){
187 $map= array("gotoXResolution", "gotoXColordepth", "gotoXKbModel", "gotoXKbLayout",
188 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport");
189 $attrs= $ldap->fetch();
191 foreach ($map as $name){
192 if (!isset($attrs[$name][0])){
193 continue;
194 }
196 switch ($name){
197 case 'gotoXResolution':
198 $this->XResolutions= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XResolutions;
199 break;
200 case 'gotoXColordepth':
201 $this->XColordepths= array('default' => _("inherited").' ['.$attrs[$name][0].' '._('Bit').']') + $this->XColordepths;
202 break;
203 case 'gotoXKbModel':
204 $this->XKbModels= array('default' => _("inherited").' ['.$attrs[$name][0].']') + $this->XKbModels;
205 break;
206 case 'gotoXKbLayout':
207 $this->XKbLayouts= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbLayouts;
208 break;
209 case 'gotoXKbVariant':
210 $this->XKbVariants= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbVariants;
211 break;
212 case 'gotoXMouseType':
213 $this->MouseTypes= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
214 break;
215 case 'gotoXMouseport':
216 $this->MousePorts= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
217 break;
218 }
220 }
222 }
224 /* Workaround to fill in inherited values if we've specified an objectclass */
225 $SelectedSystemType = session::get("SelectedSystemType");
226 if (isset($SelectedSystemType['ogroup']) && $SelectedSystemType['ogroup'] != 'none'){
227 $this->XResolutions= array('default' => _("inherited"));
228 $this->XColordepths= array('default' => _("inherited"));
229 $this->XKbModels= array('default' => _("inherited"));
230 $this->XKbLayouts= array('default' => _("inherited"));
231 $this->XKbVariants= array('default' => _("inherited"));
232 $this->MouseTypes= array('AUTO' => _("inherited"));
233 $this->MousePorts= array('AUTO' => _("inherited"));
234 }
235 }
237 function execute()
238 {
239 /* Call parent execute */
240 plugin::execute();
242 if($this->is_account && !$this->view_logged){
243 $this->view_logged = TRUE;
244 new log("view","workstation/".get_class($this),$this->dn);
245 }
247 /* Do we need to flip is_account state? */
248 if (isset($_POST['modify_state'])){
249 $this->is_account= !$this->is_account;
250 }
252 /* Do we need to flip is_account state? */
253 if(isset($_POST['modify_state'])){
254 if($this->is_account && $this->acl_is_removeable()){
255 $this->is_account= FALSE;
256 }elseif(!$this->is_account && $this->acl_is_createable()){
257 $this->is_account= TRUE;
258 }
259 }
261 /* Show main page */
262 $smarty= get_smarty();
264 /* Assign ACLs */
265 $tmp = $this->plInfo();
266 foreach($tmp['plProvidedAcls'] as $name => $translated){
267 $smarty->assign($name."ACL",$this->getacl($name));
268 }
270 /* Arrays */
271 foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
272 "XKbModels", "XKbVariants",
273 "MouseTypes", "MousePorts") as $val){
274 $smarty->assign("$val", $this->$val);
275 }
276 $smarty->assign("XKbLayouts" ,$this->XKbLayouts);
277 $smarty->assign("XKbLayoutKeys" ,array_flip($this->XKbLayouts));
279 $smarty->assign("xdmcpservers", $this->config->data['SERVERS']['TERMINAL']);
280 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
281 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
283 /* Variables - select */
284 foreach(array(
285 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
286 "gotoXKbModel", "gotoXKbLayout","gotoScannerEnable",
287 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
289 $smarty->assign($val."_select", $this->$val);
290 }
292 /* Variables */
293 foreach(array("gotoXHsync", "gotoXVsync") as $val){
294 $smarty->assign($val, $this->$val);
295 }
296 $smarty->assign("staticAddress", "");
298 /* Checkboxes */
299 foreach(array("gotoScannerEnable") as $val){
300 if ($this->$val == TRUE) {
301 $smarty->assign("$val", "checked");
302 } else {
303 $smarty->assign("$val", "");
304 }
305 }
307 /* Phone stuff */
308 $smarty->assign ("goFonHardware", $this->goFonHardware);
310 $perms = "";
311 if($this->acl_is_writeable("goFonHardware")){
312 $perms = " disabled ";
313 }
315 $hl= "<select size=\"1\" name=\"goFonHardware\" ".$perms." title=\"".
316 _("Choose the phone located at the current terminal")."\" >";
317 foreach ($this->hardware_list as $cn => $description){
318 if ($cn == $this->goFonHardware){
319 $selected= "selected";
320 } else {
321 $selected= "";
322 }
323 if (isset($this->used_hardware[$cn])){
324 $color= "style=\"color:#A0A0A0\"";
325 } else {
326 $color= "";
327 }
328 $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
329 }
330 $hl.= "</select>\n";
331 $smarty->assign ("hardware_list", $hl);
332 $smarty->assign ("gotoXMonitor", $this->gotoXMonitor);
334 if($this->AutoSync){
335 $smarty->assign("AutoSyncCHK"," checked ");
336 $smarty->assign("hiddenState"," disabled ");
337 }else{
338 $smarty->assign("AutoSyncCHK"," ");
339 $smarty->assign("hiddenState","");
340 }
342 /* Show main page */
343 return($smarty->fetch (get_template_path('workstationService.tpl',TRUE,dirname(__FILE__))));
344 }
346 function remove_from_parent()
347 {
348 $this->handle_post_events("remove");
349 new log("remove","workstation/".get_class($this),$this->dn);
350 }
352 /* Save data to object */
353 function save_object()
354 {
355 plugin::save_object();
357 if((isset($_POST['gotoXDriver'])) && $this->acl_is_writeable("AutoSync")) {
358 if(isset($_POST['AutoSync'])){
359 $this->AutoSync = true;
360 }else{
361 $this->AutoSync = false;
362 }
363 }
364 }
366 /* Check supplied data */
367 function check()
368 {
369 /* Call common method to give check the hook */
370 $message= plugin::check();
372 /* Default entries can use blank hsync/vsync entries */
373 if ($this->dn != "" && $this->cn != "default" && $this->cn != "wdefault"){
375 /* But only if no auto sync is enabled... */
376 if (!$this->AutoSync){
378 /* Check vsync for correct usage */
379 $val= preg_replace ("/\s/", "", $this->gotoXVsync);
381 if($this->acl_is_writeable("gotoXVsync")){
382 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val)){
383 $message[]= _("Please specify a valid VSync range.");
384 } else{
385 list($v1,$v2)= preg_split ("/[-+]/", $val);
386 if ($v2 != ""){
387 if ($v1 > $v2){
388 $message[]= _("Please specify a valid VSync range.");
389 }
390 }
391 }
392 }
394 /* Check hsync for correct usage */
395 $val= preg_replace ("/\s/", "", $this->gotoXHsync);
396 if($this->acl_is_writeable("gotoXHsync")){
397 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val)){
398 $message[]= _("Please specify a valid HSync range.");
399 } else{
400 list($v1,$v2)= preg_split ("/[-+]/", $val);
401 if ($v2 != ""){
402 if ($v1 > $v2){
403 $message[]= _("Please specify a valid HSync range.");
404 }
405 }
406 }
407 }
408 }
409 }
411 return ($message);
412 }
415 /* Save to LDAP */
416 function save()
417 {
418 /* remove objectclass GOhard if this is an ogroup tab */
419 if(isset($this->parent->by_object['ogroup'])){
420 $this->objectclasses = array();
421 }
423 plugin::save();
425 /* Strip out 'default' values */
426 foreach(array(
427 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
428 "gotoXKbModel", "gotoXKbLayout",
429 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
431 if ($this->attrs[$val] == "default"){
432 $this->attrs[$val]= array();
433 }
434 }
436 if($this->AutoSync){
437 $this->attrs['gotoXHsync'] = "30+55";
438 $this->attrs['gotoXVsync'] = "50+70";
439 }
441 /* Write back to ldap */
442 $ldap= $this->config->get_ldap_link();
443 $ldap->cd($this->dn);
444 $this->cleanup();
445 $ldap->modify ($this->attrs);
446 new log("modify","workstation/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
447 show_ldap_error($ldap->get_error(), sprintf(_("Saving of system workstation/service with dn '%s' failed."),$this->dn));
448 $this->handle_post_events("modify");
449 }
452 function getListOfXDrivers()
453 {
454 /* Generate a list of xdrivers from CONFIG_DIR./xdrivers */
455 $drivers = array();
456 if (file_exists(CONFIG_DIR.'/xdrivers')){
457 $xdrivers = file (CONFIG_DIR.'/xdrivers');
458 foreach ($xdrivers as $line){
459 if (!preg_match ("/^#/", $line)){
460 $drivers[]= trim($line);
461 }
462 }
463 } else {
464 $drivers = array("ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
465 "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc", "nv", "nvidia",
466 "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
467 "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware");
468 }
469 return($drivers);
470 }
473 /* Return plugin informations for acl handling */
474 static function plInfo()
475 {
476 return (array(
477 "plShortName" => _("Service"),
478 "plDescription" => _("Workstation service"),
479 "plSelfModify" => FALSE,
480 "plDepends" => array(),
481 "plPriority" => 10,
482 "plSection" => array("administration"),
483 "plCategory" => array("workstation","ogroups"),
485 "plProvidedAcls"=> array(
486 "gotoXMonitor" => _("Monitor"),
487 "gotoXDriver" => _("Gfx driver"),
488 "gotoXResolution" => _("Gfx resolution"),
489 "gotoXColordepth" => _("Gfx color depth"),
490 "gotoXHsync" => _("Hsync"),
491 "gotoXVsync" => _("Vsync"),
492 "AutoSync" => _("Use DDC"),
493 "gotoScannerEnable" => _("Scanner enabled"),
494 "gotoXKbModel" => _("Keyboard model"),
495 "gotoXKbLayout" => _("Keyboard layout"),
496 "gotoXKbVariant" => _("Keyboard variant"),
497 "gotoXMouseType" => _("Mouse type"),
498 "gotoXMouseport" => _("Mouse port"),
499 "goFonHardware" => _("Telephone hardware"))
500 ));
501 }
502 }
504 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
505 ?>