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 phone hardware list
150 */
151 $tmp = get_sub_list("(objectClass=goFonHardware)","",array(get_ou("phoneou")),
152 $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
153 foreach($tmp as $attrs){
154 $cn= $attrs['cn'][0];
155 $description= "";
156 if (isset($attrs['description'])){
157 $description= " - ".$attrs['description'][0];
158 }
159 $this->hardware_list[$cn]= "$cn$description";
160 }
161 $this->hardware_list["automatic"]= _("automatic");
162 ksort($this->hardware_list);
164 /* These departments may contain objects that have
165 goFonHardware set.
166 */
167 $deps_a = array(
168 get_ou("ogroupou"),
169 get_ou("serverou"),
170 get_ou("terminalou"),
171 get_ou("workstationou"),
172 get_ou("printerou"),
173 get_ou("componentou"),
174 get_ou("phoneou"));
176 $tmp = get_sub_list("(goFonHardware=*)","",$deps_a,$this->config->current['BASE'],
177 array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
178 foreach($tmp as $attrs){
179 $cn = $attrs['goFonHardware'][0];
180 if(isset($this->hardware_list[$cn])){
181 $this->used_hardware[$cn]= $cn;
182 }
183 }
185 if(preg_match("/\+/",$this->gotoXHsync)){
186 $this->AutoSync = true;
187 $this->gotoXHsync = preg_replace("/\+/","-",$this->gotoXHsync);
188 $this->gotoXVsync = preg_replace("/\+/","-",$this->gotoXVsync);
189 }
191 /* Load hardware list */
192 $ldap= $this->config->get_ldap_link();
193 $ldap->cd($this->config->current['BASE']);
194 $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
195 if ($ldap->count() == 1){
196 $map= array("gotoXResolution", "gotoXColordepth", "gotoXKbModel", "gotoXKbLayout",
197 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport");
198 $attrs= $ldap->fetch();
200 foreach ($map as $name){
201 if (!isset($attrs[$name][0])){
202 continue;
203 }
205 switch ($name){
206 case 'gotoXResolution':
207 $this->XResolutions= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XResolutions;
208 break;
209 case 'gotoXColordepth':
210 $this->XColordepths= array('default' => _("inherited").' ['.$attrs[$name][0].' '._('Bit').']') + $this->XColordepths;
211 break;
212 case 'gotoXKbModel':
213 $this->XKbModels= array('default' => _("inherited").' ['.$attrs[$name][0].']') + $this->XKbModels;
214 break;
215 case 'gotoXKbLayout':
216 $this->XKbLayouts= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbLayouts;
217 break;
218 case 'gotoXKbVariant':
219 $this->XKbVariants= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbVariants;
220 break;
221 case 'gotoXMouseType':
222 $this->MouseTypes= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
223 break;
224 case 'gotoXMouseport':
225 $this->MousePorts= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
226 break;
227 }
229 }
231 }
233 /* Workaround to fill in inherited values if we've specified an objectclass */
234 $SelectedSystemType = session::get("SelectedSystemType");
235 if (isset($SelectedSystemType['ogroup']) && $SelectedSystemType['ogroup'] != 'none'){
236 $this->XResolutions= array('default' => _("inherited"));
237 $this->XColordepths= array('default' => _("inherited"));
238 $this->XKbModels= array('default' => _("inherited"));
239 $this->XKbLayouts= array('default' => _("inherited"));
240 $this->XKbVariants= array('default' => _("inherited"));
241 $this->MouseTypes= array('AUTO' => _("inherited"));
242 $this->MousePorts= array('AUTO' => _("inherited"));
243 }
244 }
246 function execute()
247 {
248 /* Call parent execute */
249 plugin::execute();
251 if($this->is_account && !$this->view_logged){
252 $this->view_logged = TRUE;
253 new log("view","workstation/".get_class($this),$this->dn);
254 }
256 /* Do we need to flip is_account state? */
257 if (isset($_POST['modify_state'])){
258 $this->is_account= !$this->is_account;
259 }
261 /* Do we need to flip is_account state? */
262 if(isset($_POST['modify_state'])){
263 if($this->is_account && $this->acl_is_removeable()){
264 $this->is_account= FALSE;
265 }elseif(!$this->is_account && $this->acl_is_createable()){
266 $this->is_account= TRUE;
267 }
268 }
270 /* Show main page */
271 $smarty= get_smarty();
273 /* Assign ACLs */
274 $tmp = $this->plInfo();
275 foreach($tmp['plProvidedAcls'] as $name => $translated){
276 $smarty->assign($name."ACL",$this->getacl($name));
277 }
279 /* Arrays */
280 foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
281 "XKbModels", "XKbVariants",
282 "MouseTypes", "MousePorts") as $val){
283 $smarty->assign("$val", $this->$val);
284 }
285 $smarty->assign("XKbLayouts" ,$this->XKbLayouts);
286 $smarty->assign("XKbLayoutKeys" ,array_flip($this->XKbLayouts));
288 $smarty->assign("xdmcpservers", $this->config->data['SERVERS']['TERMINAL']);
289 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
290 $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
292 /* Variables - select */
293 foreach(array(
294 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
295 "gotoXKbModel", "gotoXKbLayout","gotoScannerEnable",
296 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
298 $smarty->assign($val."_select", $this->$val);
299 }
301 /* Variables */
302 foreach(array("gotoXHsync", "gotoXVsync") as $val){
303 $smarty->assign($val, $this->$val);
304 }
305 $smarty->assign("staticAddress", "");
307 /* Checkboxes */
308 foreach(array("gotoScannerEnable") as $val){
309 if ($this->$val == TRUE) {
310 $smarty->assign("$val", "checked");
311 } else {
312 $smarty->assign("$val", "");
313 }
314 }
316 /* Phone stuff */
317 $smarty->assign ("goFonHardware", $this->goFonHardware);
319 $perms = "";
320 if(!$this->acl_is_writeable("goFonHardware")){
321 $perms = " disabled ";
322 }
324 $hl= "<select size=\"1\" name=\"goFonHardware\" ".$perms." title=\"".
325 _("Choose the phone located at the current terminal")."\" >";
326 foreach ($this->hardware_list as $cn => $description){
327 if ($cn == $this->goFonHardware){
328 $selected= "selected";
329 } else {
330 $selected= "";
331 }
332 if (isset($this->used_hardware[$cn])){
333 $color= "style=\"color:#A0A0A0\"";
334 } else {
335 $color= "";
336 }
337 $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
338 }
339 $hl.= "</select>\n";
340 $smarty->assign ("hardware_list", $hl);
341 $smarty->assign ("gotoXMonitor", $this->gotoXMonitor);
343 if($this->AutoSync){
344 $smarty->assign("AutoSyncCHK"," checked ");
345 $smarty->assign("hiddenState"," disabled ");
346 }else{
347 $smarty->assign("AutoSyncCHK"," ");
348 $smarty->assign("hiddenState","");
349 }
351 /* Show main page */
352 return($smarty->fetch (get_template_path('workstationService.tpl',TRUE,dirname(__FILE__))));
353 }
355 function remove_from_parent()
356 {
357 $this->handle_post_events("remove");
358 new log("remove","workstation/".get_class($this),$this->dn);
359 }
361 /* Save data to object */
362 function save_object()
363 {
364 plugin::save_object();
366 if((isset($_POST['gotoXDriver'])) && $this->acl_is_writeable("AutoSync")) {
367 if(isset($_POST['AutoSync'])){
368 $this->AutoSync = true;
369 }else{
370 $this->AutoSync = false;
371 }
372 }
373 }
375 /* Check supplied data */
376 function check()
377 {
378 /* Call common method to give check the hook */
379 $message= plugin::check();
381 /* Default entries can use blank hsync/vsync entries */
382 if ($this->dn != "" && $this->cn != "default" && $this->cn != "wdefault"){
384 /* But only if no auto sync is enabled... */
385 if (!$this->AutoSync){
387 /* Check vsync for correct usage */
388 $val= preg_replace ("/\s/", "", $this->gotoXVsync);
390 if($this->acl_is_writeable("gotoXVsync")){
391 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val)){
392 $message[]= _("Please specify a valid VSync range.");
393 } else{
394 list($v1,$v2)= preg_split ("/[-+]/", $val);
395 if ($v2 != ""){
396 if ($v1 > $v2){
397 $message[]= _("Please specify a valid VSync range.");
398 }
399 }
400 }
401 }
403 /* Check hsync for correct usage */
404 $val= preg_replace ("/\s/", "", $this->gotoXHsync);
405 if($this->acl_is_writeable("gotoXHsync")){
406 if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val)){
407 $message[]= _("Please specify a valid HSync range.");
408 } else{
409 list($v1,$v2)= preg_split ("/[-+]/", $val);
410 if ($v2 != ""){
411 if ($v1 > $v2){
412 $message[]= _("Please specify a valid HSync range.");
413 }
414 }
415 }
416 }
417 }
418 }
420 return ($message);
421 }
424 /* Save to LDAP */
425 function save()
426 {
427 /* remove objectclass GOhard if this is an ogroup tab */
428 if(isset($this->parent->by_object['ogroup'])){
429 $this->objectclasses = array();
430 }
432 plugin::save();
434 /* Strip out 'default' values */
435 foreach(array(
436 "gotoXDriver", "gotoXResolution", "gotoXColordepth",
437 "gotoXKbModel", "gotoXKbLayout",
438 "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
440 if ($this->attrs[$val] == "default"){
441 $this->attrs[$val]= array();
442 }
443 }
445 if($this->AutoSync){
446 $this->attrs['gotoXHsync'] = "30+55";
447 $this->attrs['gotoXVsync'] = "50+70";
448 }
450 /* Write back to ldap */
451 $ldap= $this->config->get_ldap_link();
452 $ldap->cd($this->dn);
453 $this->cleanup();
454 $ldap->modify ($this->attrs);
455 new log("modify","workstation/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
456 show_ldap_error($ldap->get_error(), sprintf(_("Saving of system workstation/service with dn '%s' failed."),$this->dn));
457 $this->handle_post_events("modify");
458 }
461 function getListOfXDrivers()
462 {
463 /* Generate a list of xdrivers from CONFIG_DIR./xdrivers */
464 $drivers = array();
465 if (file_exists(CONFIG_DIR.'/xdrivers')){
466 $xdrivers = file (CONFIG_DIR.'/xdrivers');
467 foreach ($xdrivers as $line){
468 if (!preg_match ("/^#/", $line)){
469 $drivers[]= trim($line);
470 }
471 }
472 } else {
473 $drivers = array("ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
474 "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc", "nv", "nvidia",
475 "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
476 "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware");
477 }
478 return($drivers);
479 }
482 /* Return plugin informations for acl handling */
483 static function plInfo()
484 {
485 return (array(
486 "plShortName" => _("Service"),
487 "plDescription" => _("Workstation service"),
488 "plSelfModify" => FALSE,
489 "plDepends" => array(),
490 "plPriority" => 10,
491 "plSection" => array("administration"),
492 "plCategory" => array("workstation","ogroups"),
494 "plProvidedAcls"=> array(
495 "gotoXMonitor" => _("Monitor"),
496 "gotoXDriver" => _("Gfx driver"),
497 "gotoXResolution" => _("Gfx resolution"),
498 "gotoXColordepth" => _("Gfx color depth"),
499 "gotoXHsync" => _("Hsync"),
500 "gotoXVsync" => _("Vsync"),
501 "AutoSync" => _("Use DDC"),
502 "gotoScannerEnable" => _("Scanner enabled"),
503 "gotoXKbModel" => _("Keyboard model"),
504 "gotoXKbLayout" => _("Keyboard layout"),
505 "gotoXKbVariant" => _("Keyboard variant"),
506 "gotoXMouseType" => _("Mouse type"),
507 "gotoXMouseport" => _("Mouse port"),
508 "goFonHardware" => _("Telephone hardware"))
509 ));
510 }
511 }
513 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
514 ?>