Code

Updated workstation - Startup
[gosa.git] / plugins / admin / systems / class_terminalService.inc
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);
68    
69     /* Get list of available xdrivers */
70     $this->XDrivers = $this->getListOfXDrivers();
71     array_unshift($this->XDrivers, "["._("unknown")."]");
72     
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");
128  
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\">&nbsp;<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));
288   
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   }
528 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
529 ?>