Code

Fixed images in FAI list
[gosa.git] / gosa-plugins / goto / admin / systems / goto / class_terminalService.inc
index b9c2a3dcda34c92adea275cf0b5b9943c799d266..360054533daadc85a204f2a33386a8c3ad761dc9 100644 (file)
@@ -2,15 +2,9 @@
 
 class termservice extends plugin
 {
-  /* CLI vars */
-  var $cli_summary= "Manage terminal service aspects";
-  var $cli_description= "Some longer text\nfor help";
-  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
   /* Generic terminal attributes */
-  var $gotoLpdEnable= FALSE;
   var $gotoXMonitor= "";
-  var $gotoXMethod= "";
+  var $gotoXMethod= "default";
   var $gotoXdmcpServer= "";
   var $gotoXDriver= "";
   var $gotoXResolution= "";
@@ -29,6 +23,8 @@ class termservice extends plugin
   var $gotoScannerBackend= "";
   var $goFonHardware= "automatic";
 
+  var $gotoLpdEnable = array();
+
   var $AutoSync = false;
   var $view_logged = FALSE;
 
@@ -51,9 +47,9 @@ class termservice extends plugin
 
 
   /* attribute list for save action */
-  var $attributes= array("cn", "gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
+  var $attributes= array("gotoLpdEnable", "gotoXMonitor", "gotoXMethod", "gotoXdmcpServer",
       "gotoXDriver", "gotoXResolution", "gotoXColordepth",
-      "gotoXHsync", "gotoXVsync", "gotoLpdEnable", "gotoLpdServer",
+      "gotoXHsync", "gotoXVsync", "gotoLpdServer",
       "gotoScannerEnable", "gotoScannerModel", "gotoScannerClients",
       "gotoScannerBackend", "gotoXKbModel", "gotoXKbLayout", "gotoXKbVariant",
       "gotoXMouseType", "gotoXMouseport", "goFonHardware");
@@ -62,6 +58,9 @@ class termservice extends plugin
   var $is_ogroup        = FALSE;
   var $is_ogroup_member = FALSE;
 
+  var $selected_xdmcp_servers = array();
+  var $inherited_xdmcp_servers = array();
+
   function termservice (&$config, $dn= NULL, $parent= NULL)
   {
     plugin::plugin ($config, $dn, $parent);
@@ -78,11 +77,21 @@ class termservice extends plugin
      */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))");
+    $ldap->search("(&(|(objectClass=gotoTerminalTemplate)(objectClass=gotoWorkstationTemplate))(member=".LDAP::prepare4filter($this->dn)."))");
     if($ldap->count()){
       $this->is_ogroup_member = TRUE;
     }
 
+    /* Load gotoLpdEnable
+     */
+    $this->gotoLpdEnable = array();
+    if(isset($this->attrs['gotoLpdEnable']['count'])){
+      for($i = 0 ; $i < $this->attrs['gotoLpdEnable']['count']; $i ++){
+        $this->gotoLpdEnable[] = $this->attrs['gotoLpdEnable'][$i];
+      }
+    }
+    $this->gotoLpdEnable_dialog = new gotoLpdEnable($this->config,$this->gotoLpdEnable,$this); 
+
     /* Get list of available xdrivers */
     $this->XDrivers = $this->getListOfXDrivers();
 
@@ -97,11 +106,11 @@ class termservice extends plugin
           "1400x1050" =>  "1400x1050",
           "1600x1200" =>  "1600x1200");
 
-    if(isset($this->config->data['MAIN']['RESOLUTION_HOOK'])){
-      $file = $this->config->data['MAIN']['RESOLUTION_HOOK'];
+    if($this->config->get_cfg_value("resolutions") != ""){
+      $file = $this->config->get_cfg_value("resolutions");
       if(is_readable($file)){
         $str = file_get_contents($file);
-        $lines = split("\n",$str);
+        $lines = preg_split("/\n/",$str);
         foreach($lines as $line){
           $line = trim($line);
           if(!empty($line)){
@@ -109,7 +118,7 @@ class termservice extends plugin
           }
         }
       }else{
-        print_red(sprintf(_("You have specified an external resolution hook which can't be read, please check the permission of the file '%s'."),$file));
+        msg_dialog::display(_("Configuration error"), msgPool::cannotReadFile($file), WARNING_DIALOG);
       }
     }
 
@@ -134,25 +143,32 @@ class termservice extends plugin
     }
 
     /* Additional values will be extracted from CONFIG_DIR.keyboardLayouts */
-    $this->XKbLayouts = array("de"=> "de","intl" =>"intl","us" =>"us");
+    $this->XKbLayouts = array("de"=> "de","en" =>"en", "es" => "es", "us" =>"us", "fr" => "fr");
     $this->XKbVariants= array("nodeadkeys"=>"nodeadkeys", "basic"=>"basic");
-    $this->MouseTypes = array("ImPS/2"=>"ImPS/2","PS/2"=>"PS/2",
-                              "Microsoft"=>"Microsoft","Logitech"=>"Logitech");
-    $this->MousePorts = array("/dev/ttyS0"=>"/dev/ttyS0",
-                              "/dev/ttyS1"=>"/dev/ttyS1","/dev/psaux"=>"/dev/psaux", 
-                              "/dev/input/mice"=>"/dev/input/mice");
+
+    $this->MouseTypes= array("auto" => "auto", 
+                             "explorerps/2" => "explorerps/2",
+                             "ImPS/2" => "ImPS/2",
+                             "PS/2" => "PS/2", 
+                             "Microsoft" => "Microsoft",
+                             "Logitech" => "Logitech",);
+
+    $this->MousePorts= array("/dev/input/mice" => "/dev/input/mice",
+                             "/dev/mouse" => "/dev/mouse",
+                             "/dev/psaux" => "/dev/psaux",
+                             "/dev/ttyS0" => "/dev/ttyS0",
+                             "/dev/ttyS1" => "/dev/ttyS1");
 
     /* Try to read additional keyboard layouts
      */
     if(file_exists(CONFIG_DIR."/keyboardLayouts")){
       if(is_readable(CONFIG_DIR."/keyboardLayouts")){
         $str = file_get_contents(CONFIG_DIR."/keyboardLayouts");
-        $tmp = split("\n",$str);
+        $tmp = preg_split("/\n/",$str);
         foreach($tmp as $entry){
           if((!empty($entry)) && (!preg_match("/^#/",$entry))){
             $entry = trim($entry);
-            $tmp2 = split ("\:",$entry);
+            $tmp2 = explode(":",$entry);
             $la =   trim($tmp2[0]);   // What would be saved to ldap
             $da =   trim($tmp2[1]);   // This wis displayed in the listbox
             $this->XKbLayouts [ $la] = $da;
@@ -161,46 +177,61 @@ class termservice extends plugin
       }
     }
 
-    /* Terminal server methods 
-     */
-    $this->XMethods["default"]= _("default");
-    $this->XMethods["xdmcp"]  = _("XDMCP");
-    $this->XMethods["ldm"]    = _("LDM");
-    $this->XMethods["rdp"]    = _("Windows RDP");
-    $this->XMethods["citrix"] = _("ICA client");
-
+    /* Terminal server methods supported by LTSP */
+    if($this->is_ogroup_member){
+      $this->XMethods["default"]= _("inherited");
+    }
+    $this->XMethods["xdmcp"]   = _("XDMCP");
+    $this->XMethods["ldm"]     = _("LDM");
+    $this->XMethods["shell"]   = _("Shell");
+    $this->XMethods["telnet"]  = _("Telnet");
+    $this->XMethods["rdp"]     = _("Windows RDP");
+    #$this->XMethods["citrix"] = _("ICA client");
+
+    /* Get selected gotoXdmcpServer */
+    $this->selected_xdmcp_servers = array();
+    if(isset($this->attrs['gotoXdmcpServer'])){
+      for($i = 0 ; $i < $this->attrs['gotoXdmcpServer']['count'] ; $i++){
+        $this->selected_xdmcp_servers[] = $this->attrs['gotoXdmcpServer'][$i];
+      }
+    }
 
     /* Load phone hardware list 
      */
-    $ldap= $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
-    while ($attrs= $ldap->fetch()){
+    $tmp = get_sub_list("(objectClass=goFonHardware)","",array(get_ou("phoneRDN")), 
+                  $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
+    foreach($tmp as $attrs){
       $cn= $attrs['cn'][0];
+      $description= "";
       if (isset($attrs['description'])){
         $description= " - ".$attrs['description'][0];
-      } else {
-        $description= "";
       }
       $this->hardware_list[$cn]= "$cn$description";
     }
-
-    /* Eventually colorize phones */
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(goFonHardware=*)",array('cn','dn','goFonHardware'));
-    while($attrs = $ldap->fetch()){
-        $cn = $attrs['goFonHardware'][0];
-        if(isset($this->hardware_list[$cn])){
-          $this->used_hardware[$cn]= $cn;
-        }
-    }
     $this->hardware_list["automatic"]= _("automatic");
     ksort($this->hardware_list);
 
-    /* Convert gotoLpdEnable 
+    /* These departments may contain objects that have 
+        goFonHardware set. 
      */
-    $this->gotoLpdEnable= preg_match("/yes/i",$this->gotoLpdEnable);
-
+    $deps_a = array(
+        get_people_ou(),
+        get_ou("ogroupRDN"),
+        get_ou("serverRDN"),
+        get_ou("terminalRDN"),
+        get_ou("workstationRDN"),
+        get_ou("printerRDN"),
+        get_ou("componentRDN"),
+        get_ou("phoneRDN"));
+
+    $tmp = get_sub_list("(goFonHardware=*)","",$deps_a,$this->config->current['BASE'],
+        array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
+    foreach($tmp as $attrs){
+      $cn = $attrs['goFonHardware'][0];
+      if(isset($this->hardware_list[$cn])){
+        $this->used_hardware[$cn]= $cn;
+      }
+    }
 
     /* Load hardware list */
     $ldap= $this->config->get_ldap_link();
@@ -210,12 +241,13 @@ class termservice extends plugin
         "gotoXColordepth", 
         "gotoXKbModel", 
         "gotoXKbLayout",
-#        "gotoXDriver",
+        "gotoXDriver",
+        "gotoXdmcpServer",
         "gotoXKbVariant",
         "gotoXMouseType", 
         "gotoXMethod",
         "gotoXMouseport");
-    $ldap->search("(&(objectClass=gotoWorkstationTemplate)(member=".LDAP::prepare4filter($this->dn)."))",$map);
+    $ldap->search("(&(|(objectClass=gotoTerminalTemplate)(objectClass=gotoWorkstationTemplate))(member=".LDAP::prepare4filter($this->dn)."))",$map);
     if ($ldap->count() == 1){
       $attrs= $ldap->fetch();
       foreach ($map as $name){
@@ -224,11 +256,16 @@ class termservice extends plugin
         }
 
         switch ($name){
-#         case 'gotoXDriver': 
-#           $this->XDrivers = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XDrivers;
-#           break;
+         case 'gotoXDriver': 
+           $this->XDrivers = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XDrivers;
+           break;
           case 'gotoXMethod': 
             $this->XMethods = array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XMethods;
+            if(isset($attrs['gotoXdmcpServer'])){
+              for($i = 0 ; $i < $attrs['gotoXdmcpServer']['count'] ; $i++){
+                $this->inherited_xdmcp_servers[] = $attrs['gotoXdmcpServer'][$i];
+              }
+            }
             break;
           case 'gotoXResolution':
             $this->XResolutions= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XResolutions;
@@ -246,10 +283,10 @@ class termservice extends plugin
             $this->XKbVariants= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->XKbVariants;
             break;
           case 'gotoXMouseType':
-            $this->MouseTypes= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
+            $this->MouseTypes= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MouseTypes;
             break;
           case 'gotoXMouseport':
-            $this->MousePorts= array('AUTO' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
+            $this->MousePorts= array('default' => _("inherited").' ['.$attrs[$name][0].']' ) + $this->MousePorts;
             break;
         }
       }
@@ -280,13 +317,14 @@ class termservice extends plugin
 
     /* Do we represent a valid terminal? */
     if (!$this->is_account && $this->parent === NULL){
-      $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
+      $display= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\">&nbsp;<b>".
         _("This 'dn' has no terminal features.")."</b>";
       return ($display);
     }
 
     /* Show main page */
     $smarty= get_smarty();
+    $smarty->assign("gotoLpdEnable_dialog", $this->gotoLpdEnable_dialog->execute());
 
     /* Assign acls */
     $tmp= $this->plInfo();
@@ -294,22 +332,68 @@ class termservice extends plugin
       $smarty->assign($name."ACL",$this->getacl($name));
     }
 
+    if(isset($_POST['gotoXdmcpServer_add']) && isset($_POST['XdmcpAddServer'])){
+      if(!in_array($_POST['gotoXdmcpServer_add'],$this->selected_xdmcp_servers)){
+        $this->selected_xdmcp_servers[] = $_POST['gotoXdmcpServer_add'];
+      }
+    }
+
+    if(isset($_POST['selected_xdmcp_servers']) && isset($_POST['XdmcpDelServer'])){
+      $tmp = array();
+      foreach($this->selected_xdmcp_servers as $name){
+        if(!in_array($name,$_POST['selected_xdmcp_servers'])){
+          $tmp[] =  $name;
+        }
+      }
+      $this->selected_xdmcp_servers = $tmp;
+    }
 
     /* Arrays */ 
     foreach(array("XMethods", "XDrivers", "XResolutions", "XColordepths",
-          "XKbModels","XKbVariants",
-          "MouseTypes", "MousePorts") as $val){
+          "XKbModels","XKbVariants","MouseTypes", "MousePorts") as $val){
       $smarty->assign("$val", $this->$val);
     }
     $smarty->assign("XKbLayouts",   $this->XKbLayouts);
     $smarty->assign("XKbLayoutKeys",array_flip($this->XKbLayouts));
-  
-    $smarty->assign("xdmcpservers", $this->config->data['SERVERS']['TERMINAL']);
     $smarty->assign("nfsservers", $this->config->data['SERVERS']['NFS']);
+  
+    
+    /* Create a list of useable servers for the currently selected 
+     *  connection type.
+     */ 
+    $xdmcp_types =  $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
+    $available_servers = array();
+    foreach($xdmcp_types as $servername =>$supported_types){
+      if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
+        $available_servers[]  = $servername;
+      }
+    }
+
+    /* Append additional information to invalid server selections.
+     */
+    $tmp = array();
+    foreach($this->selected_xdmcp_servers as $server){
+      if(in_array($server,$available_servers)){
+        $tmp[$server] = $server;
+      }else{
+        $tmp[$server] = $server."&nbsp;-&nbsp;"._("Unsupported");
+      }
+    }
+
+    /* Remove already selected servers from available list. 
+     */
+    foreach($available_servers as $key => $server){
+      if(isset($tmp[$server])){
+        unset($available_servers[$key]);
+      }
+    }
+
+    $smarty->assign("selected_xdmcp_servers", $tmp);
+    $smarty->assign("inherited_xdmcp_servers", $this->inherited_xdmcp_servers);
+    $smarty->assign("available_xdmcp_servers", $available_servers);
 
     /* Variables - select */
-    foreach(array("gotoXMethod", "gotoXdmcpServer", 
-          "gotoXDriver", "gotoXResolution", "gotoXColordepth", 
+    foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth", 
           "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
           "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
 
@@ -320,10 +404,9 @@ class termservice extends plugin
     foreach(array("gotoXHsync", "gotoXVsync") as $val){
       $smarty->assign($val, $this->$val);
     }
-    $smarty->assign("staticAddress", "");
 
     /* Checkboxes */
-    foreach(array("gotoLpdEnable", "gotoScannerEnable") as $val){
+    foreach(array("gotoScannerEnable") as $val){
       if ($this->$val == TRUE) {
         $smarty->assign("$val", "checked");
       } else {
@@ -377,9 +460,16 @@ class termservice extends plugin
   {
     plugin::save_object();
 
+    $this->gotoLpdEnable_dialog->save_object();
+    if($this->gotoLpdEnable_dialog->is_account){
+      $this->gotoLpdEnable = $this->gotoLpdEnable_dialog->save();
+    }else{
+      $this->gotoLpdEnable = array();
+    }
+
     /* Save checkbox state */
     if (isset ($_POST['gotoXMethod'])){
-      foreach (array("gotoLpdEnable", "gotoScannerEnable") as $val){
+      foreach (array("gotoScannerEnable") as $val){
 
         if($this->acl_is_writeable($val)){
           if (!isset ($_POST["$val"])){
@@ -408,13 +498,12 @@ class termservice extends plugin
         /* Check vsync for correct usage */
         $val= preg_replace ("/\s/", "", $this->gotoXVsync);
         if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXVsync")){
-
-          $message[]= _("Please specify a valid VSync range.");
+          $message[]= msgPool::invalid(_("VSync range"));
         } elseif ($this->acl_is_writeable("gotoXVsync")){
           list($v1,$v2)= preg_split ("/[-+]/", $val);
           if ($v2 != ""){
             if ($v1 > $v2){
-              $message[]= _("Please specify a valid VSync range.");
+              $message[]= msgPool::invalid(_("VSync range"));
             }
           }
         }
@@ -422,13 +511,12 @@ class termservice extends plugin
         /* Check hsync for correct usage */
         $val= preg_replace ("/\s/", "", $this->gotoXHsync);
         if (!preg_match ("/^\d+(\.\d+)?([-]\d+(\.\d+)?)?$/", $val) && $this->acl_is_writeable("gotoXHsync")){
-
-          $message[]= _("Please specify a valid HSync range.");
+          $message[]= msgPool::invalid(_("HSync range"));
         } elseif ($this->acl_is_writeable("gotoXHsync")){
           list($v1,$v2)= preg_split ("/[-+]/", $val);
           if ($v2 != ""){
             if ($v1 > $v2){
-              $message[]= _("Please specify a valid HSync range.");
+              $message[]= msgPool::invalid(_("HSync range"));
             }
           }
         }
@@ -442,6 +530,24 @@ class termservice extends plugin
   {
     /* Call common method to give check the hook */
     $message= plugin::check();
+    $message = array_merge($message,$this->gotoLpdEnable_dialog->check());
+
+    if($this->gotoXMethod != "default"){
+      $xdmcp_types =  $this->config->data['SERVERS']['TERMINAL_SESSION_TYPES'];
+      $available_servers = array();
+      foreach($xdmcp_types as $servername =>$supported_types){
+        if(in_array(strtoupper($this->gotoXMethod),$supported_types)){
+          $available_servers[]  = $servername;
+        }
+      }
+      foreach($this->selected_xdmcp_servers as $server){
+        if(!in_array($server,$available_servers)){
+          $message[] = _("Remote desktop settings contains servers that do not support the selected connection method.");
+          break;
+        }
+      }
+    }
+
     return ($message);
   }
 
@@ -449,24 +555,15 @@ class termservice extends plugin
   /* Save to LDAP */
   function save()
   {
-    /* Convert to string */
-    $this->gotoLpdEnable= $this->gotoLpdEnable?"Yes":"No";
-
+    /* remove objectclass GOhard if this is an ogroup tab */
     if(isset($this->parent->by_object['ogroup'])){
-      $this->objectclasses = array("gotoWorkstationTemplate");
-    }elseif(isset($this->parent->by_object['terminalgeneric'])){
-      $this->objectclasses = array("GOhard");
-    }else{
-      print "Object Type Configuration : unknown";
-      exit();
+           $this->objectclasses = array();
     }
 
-
     plugin::save();
 
     /* Strip out 'default' values */
-    foreach(array("gotoXMethod", "gotoXdmcpServer",
-          "gotoXDriver", "gotoXResolution", "gotoXColordepth",
+    foreach(array("gotoXMethod","gotoXDriver", "gotoXResolution", "gotoXColordepth",
           "gotoLpdServer", "gotoXKbModel", "gotoXKbLayout",
           "gotoXKbVariant", "gotoXMouseType", "gotoXMouseport") as $val){
 
@@ -475,6 +572,14 @@ class termservice extends plugin
       }
     }
 
+    if($this->gotoXMethod == "default"){
+      $this->attrs['gotoXdmcpServer'] = array();
+      $this->attrs['gotoXMethod'] = array();
+    }else{
+      $this->attrs['gotoXdmcpServer'] = array_values($this->selected_xdmcp_servers);
+    }
+
+
     if($this->AutoSync){
       $this->attrs['gotoXHsync'] = "30+55";
       $this->attrs['gotoXVsync'] = "50+70";
@@ -487,14 +592,21 @@ class termservice extends plugin
     $ldap->modify ($this->attrs); 
     new log("modify","terminal/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
 
-    show_ldap_error($ldap->get_error(), sprintf(_("Saving of object system terminal/service with dn '%s' failed."),$this->dn));
+    if (!$ldap->success()){
+      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+    }
     $this->handle_post_events("modify");
+
+    /* Send goto reload event to gosaSupportDaemon */
+    if(count($this->attrs)){
+           $this->send_goto_reload();
+    }
   }
 
 
   function getListOfXDrivers()
   {
-    $drivers = array("unknown" => "["._("unknown")."]");
+    $drivers = array("default" => "["._("unknown")."]");
 
     /* Generate a list of xdrivers from CONFIG_DIR/xdrivers */
     if (file_exists(CONFIG_DIR.'/xdrivers')){
@@ -507,16 +619,82 @@ class termservice extends plugin
     } else {
       foreach( array(
           "ati", "atimisc", "chips", "cirrus", "cyrix", "fbdev", "fglrx",
-          "i128", "i740", "i810", "imstt", "mga", "neomagic", "newport", "nsc",  "nv", "nvidia",
+          "i128", "i740", "i810", "intel", "imstt", "mga", "neomagic", "newport", "nsc",  "nv", "nvidia",
           "r128", "radeon", "rendition", "s3", "s3virge", "savage", "siliconmotion",
           "sis", "tdfx", "tga", "trident", "tseng", "vesa", "vga", "vmware") as $driver){
         $drivers[] = $driver;
       }
     }
-    return($drivers);
+
+    $tmp = array();
+    foreach($drivers as $name){
+      $tmp[$name] = $name;
+    }
+    return($tmp);
+  }
+
+  function send_goto_reload()
+  {
+    if(count($this->attrs) && class_available("DaemonEvent")){
+      $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);
+      $o_queue = new gosaSupportDaemon();
+      if(isset($events['TRIGGERED']['DaemonEvent_goto_reload'])){
+        $evt = $events['TRIGGERED']['DaemonEvent_goto_reload'];
+        $macs = array();
+
+        /* Get list of macAddresses
+         */
+        if(isset($this->parent->by_object['ogroup'])){
+
+          /* If we are an object group, add all member macs
+           */
+          $p = $this->parent->by_object['ogroup'];
+          foreach($p->memberList as $dn => $obj){
+            if(preg_match("/".preg_quote(get_ou("systemIncomingRDN"), '/')."/",$dn)) continue;
+            if(isset($p->objcache[$dn]['macAddress']) && !empty($p->objcache[$dn]['macAddress'])){
+              $macs[] = $p->objcache[$dn]['macAddress'];
+            }
+          }
+        }elseif(isset($this->parent->by_object['workgeneric']->netConfigDNS->macAddress)){
+
+          /* We are a workstation. Add current mac.
+           */
+          $mac = $this->parent->by_object['workgeneric']->netConfigDNS->macAddress;
+          if(!empty($mac) && !preg_match("/".preg_quote(get_ou("systemIncomingRDN"), '/')."/",$this->orig_dn)){
+            $macs[] = $mac;
+          }
+        }
+
+        /* Trigger event for all member objects
+         */
+        if(count($macs)){
+          $tmp = new $evt['CLASS_NAME']($this->config);
+          $tmp->set_type(TRIGGERED_EVENT);
+          $target = $o_queue->get_host().":".$o_queue->get_port();
+          $tmp->add_targets(array($target));
+          $tmp->set_macs($macs);
+          if(!$o_queue->append($tmp,TRUE)){
+            msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+          }
+        }
+      }
+    }
   }
 
 
+  function PrepareForCopyPaste($source)
+  {
+    plugin::PrepareForCopyPaste($source);
+
+    $source_o = new termservice ($this->config, $source['dn']);
+
+    foreach(array("gotoXdmcpServer","selected_xdmcp_servers") as $attr){
+      $this->$attr = $source_o->$attr;
+    }
+  }
+
+
+
   /* Return plugin informations for acl handling */
   static function plInfo()
   {
@@ -530,23 +708,24 @@ class termservice extends plugin
           "plCategory"    => array("terminal"),
 
           "plProvidedAcls"=> array(
+          
             "gotoXMonitor"            => _("Monitor"),
             "gotoXMethod"             => _("Method"),
             "gotoXdmcpServer"         => _("Remote desktop"),
             "gotoXDriver"             => _("Gfx driver"),
             "gotoXResolution"         => _("Gfx resolution"),
             "gotoXColordepth"         => _("Gfx color depth"),
-            "gotoXHsync"              => _("Hsync"),
-            "gotoXVsync"              => _("Vsync"),
+            "gotoXHsync"              => _("HSync"),
+            "gotoXVsync"              => _("VSync"),
             "AutoSync"                => _("Auto-Sync"),
-            "gotoLpdEnable"           => _("Printer service enabled"),
-            "gotoLpdServer"           => _("Spool server"),
             "gotoScannerEnable"       => _("Scanner enabled"),
+            "gotoLpdEnable"           => _("Printer enabled"),
             "gotoXKbModel"            => _("Keyboard model"),
             "gotoXKbLayout"           => _("Keyboard layout"),
             "gotoXKbVariant"          => _("Keyboard variant"),
             "gotoXMouseType"          => _("Mouse type"),
             "gotoXMouseport"          => _("Mouse port"),
+            "gotoLpdEnable"         => _("Printer enabled"),
             "goFonHardware"           => _("Telephone hardware"))
           ));
   }