1 <?php
2 /*
3 * This code is part of GOsa (http://www.gosa-project.org)
4 * Copyright (C) 2003-2008 GONICUS GmbH
5 *
6 * ID: $$Id$$
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
24 #
25 # NewDevices
26 # -> Edit
27 # |- SelectDeviceType() (Allows to select target SystemType and OGroup)
28 # -> Save
29 # |-> systemTypeChosen() (Queue entry to be activated)
30 # |-> handleActivationQueue() (Now acticvate queued objects)
31 # |-> Ogroup selected
32 # | |-> Try to adapt values from ogroup and save directly.
33 # |
34 # |-> NO Ogroup selected
35 # | |-> Open dialogs of the target system type and allow modifcations.
36 # |
37 # |->activate_new_device() (Finally activate the device - FAIsate=..)
38 #
39 #
40 # NewArpDevices (NewUnknwonDevices )
41 # -> Edit
42 # |-> editEntry - ArpNewDeviceTabs
43 # -> Save
44 # |-> NO gotoIntegeration
45 # | |-> Save DHCP and DNS entries, then remove the source entry from ldap.
46 # |
47 # |-> gotoIntegration selected (Handle object like a NewDevice now)
48 # |-> systemTypeChosen() (Queue entry to be activated)
49 # |-> handleActivationQueue() (Now acticvate queued objects)
50 # |-> Ogroup selected
51 # | |-> Try to adapt values from ogroup and save directly.
52 # |
53 # |-> NO Ogroup selected
54 # | |-> Open dialogs of the target system type and allow modifcations.
55 # |
56 # |->activate_new_device() (Finally activate the device - FAIsate=..)
57 #
58 class systemManagement extends management
59 {
60 var $plHeadline = "Systems";
61 var $plDescription = "Manage systems, their services and prepare them for use with GOsa";
62 var $plIcon = "plugins/systems/images/plugin.png";
64 // Tab definition
65 protected $tabClass = "";
66 protected $tabType = "";
67 protected $aclCategory = "";
68 protected $aclPlugin = "";
69 protected $objectName = "system";
70 protected $objectInfo = array();
71 protected $opsi = NULL;
72 protected $activationQueue = array();
74 function __construct($config,$ui)
75 {
76 $this->config = $config;
77 $this->ui = $ui;
79 // Set storage points
80 $tD = $this->getObjectDefinitions();
81 $sP = array();
82 foreach($tD as $entry){
83 if(!empty($entry['ou']))
84 $sP[] = $entry['ou'];
85 }
87 $this->storagePoints = array_unique($sP);
89 // Build filter
90 if (session::global_is_set(get_class($this)."_filter")){
91 $filter= session::global_get(get_class($this)."_filter");
92 } else {
93 $filter = new filter(get_template_path("system-filter.xml", true));
94 $filter->setObjectStorage($this->storagePoints);
95 }
96 $this->setFilter($filter);
98 // Build headpage
99 $headpage = new listing(get_template_path("system-list.xml", true));
100 $headpage->registerElementFilter("systemRelease", "systemManagement::systemRelease");
101 $headpage->registerElementFilter("filterSystemDescription", "systemManagement::filterSystemDescription");
102 $headpage->setFilter($filter);
103 $filter->setConverter('systemManagement::incomingFilterConverter');
105 // Register Daemon Events
106 if(class_available("DaemonEvent") && class_available("gosaSupportDaemon")){
107 $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);
108 foreach($events['TRIGGERED'] as $name => $data){
109 $this->registerAction("T_".$name,"handleEvent");
110 $this->registerAction("S_".$name,"handleEvent");
111 }
112 $this->registerAction("activateMultiple","activateMultiple");
113 }
114 $this->registerAction("saveEvent","saveEventDialog");
115 $this->registerAction("createISO","createISO");
116 $this->registerAction("initiateISOcreation","initiateISOcreation");
117 $this->registerAction("performIsoCreation","performIsoCreation");
118 $this->registerAction("systemTypeChosen","systemTypeChosen");
119 $this->registerAction("handleActivationQueue","handleActivationQueue");
121 $this->registerAction("new_goServer", "newEntry");
122 $this->registerAction("new_gotoWorkstation", "newEntry");
123 $this->registerAction("new_gotoTerminal", "newEntry");
124 $this->registerAction("new_gotoPrinter", "newEntry");
125 $this->registerAction("new_goFonHardware", "newEntry");
126 $this->registerAction("new_ieee802Device", "newEntry");
127 $this->registerAction("new_FAKE_OC_OpsiHost", "newEntry");
129 $this->registerAction("setPassword", "setPassword");
130 $this->registerAction("passwordChangeConfirmed", "passwordChangeConfirmed");
132 // Add copy&paste and snapshot handler.
133 if ($this->config->boolValueIsTrue("core", "copyPaste")){
134 $this->cpHandler = new CopyPasteHandler($this->config);
135 }
136 if($this->config->get_cfg_value("core","enableSnapshots") == "true"){
137 $this->snapHandler = new SnapshotHandler($this->config);
138 }
140 // Check if we are able to communicate with the GOsa supprot daemon
141 if(class_available("gosaSupportDaemon")){
142 $o = new gosaSupportDaemon();
143 $this->si_active = $o->connect() && class_available("DaemonEvent");
144 }
146 // Check if we are able to communicate with the GOsa supprot daemon
147 if(class_available("opsi")){
148 $this->opsi = new opsi($this->config);
149 }
150 parent::__construct($config, $ui, "systems", $headpage);
151 }
154 /*! \brief Act on password change requests.
155 */
156 function setPassword($action,$target)
157 {
158 if(count($target) == 1){
159 $tDefs= $this->getObjectDefinitions();
160 $headpage = $this->getHeadpage();
161 $dn = array_pop($target);
162 $type = $headpage->getType($dn);
163 $entry = $headpage->getEntry($dn);
164 $ui = get_userinfo();
165 $smarty = get_smarty();
166 if(in_array("FAKE_OC_PWD_changeAble", $entry['objectClass'])){
167 $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
168 $tabacl = $ui->get_permissions($dn,$acl,"userPassword");
169 if(preg_match("/w/",$tabacl)){
170 $this->dn= $dn;
171 set_object_info($this->dn);
172 return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
173 }else{
174 msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
175 }
176 }
177 }
178 }
181 /*! \brief This method is used to queue and process copy&paste actions.
182 * Allows to copy, cut and paste mutliple entries at once.
183 * @param String 'action' The name of the action which was the used as trigger.
184 * @param Array 'target' A list of object dns, which should be affected by this method.
185 * @param Array 'all' A combination of both 'action' and 'target'.
186 */
187 function copyPasteHandler($action="",$target=array(),$all=array(),
188 $altTabClass ="", $altTabType = "", $altAclCategory="",$altAclPlugin="")
189 {
190 // Return without any actions while copy&paste handler is disabled.
191 if(!is_object($this->cpHandler)) return("");
193 // Save user input
194 $this->cpHandler->save_object();
196 // Add entries to queue
197 if($action == "copy" || $action == "cut"){
199 $tDefs= $this->getObjectDefinitions();
200 $headpage = $this->getHeadpage();
201 $ui = get_userinfo();
202 $this->cpHandler->cleanup_queue();
203 foreach($target as $dn){
205 $type = $headpage->getType($dn);
206 $entry = $headpage->getEntry($dn);
208 $aclCategory = $tDefs[$type]['aclCategory'];
209 $aclPlugin = $tDefs[$type]['aclClass'];
210 $tabClass = $tDefs[$type]['tabClass'];
211 $tabType = $tDefs[$type]['tabDesc'];
213 if($action == "copy" && $this->ui->is_copyable($dn,$aclCategory,$aclPlugin)){
214 $this->cpHandler->add_to_queue($dn,"copy",$tabClass,$tabType,$aclCategory,$this);
215 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry copied!");
216 }
217 if($action == "cut" && $this->ui->is_cutable($dn,$aclCategory,$aclPlugin)){
218 $this->cpHandler->add_to_queue($dn,"cut",$tabClass,$tabType,$aclCategory,$this);
219 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry cutted!");
220 }
221 }
222 }
224 // Initiate pasting
225 if($action == "paste"){
226 $this->cpPastingStarted = TRUE;
227 }
229 // Display any c&p dialogs, eg. object modifications required before pasting.
230 if($this->cpPastingStarted && $this->cpHandler->entries_queued()){
231 $headpage = $this->getHeadpage();
232 $this->cpHandler->SetVar("base",$headpage->getBase());
233 $data = $this->cpHandler->execute();
234 if(!empty($data)){
235 return($data);
236 }
237 }
239 // Automatically disable pasting process since there is no entry left to paste.
240 if(!$this->cpHandler->entries_queued()){
241 $this->cpPastingStarted = FALSE;
242 }
243 return("");
244 }
247 /*! \brief Password change confirmed, now try to change the systems pwd.
248 */
249 function passwordChangeConfirmed()
250 {
251 $tDefs= $this->getObjectDefinitions();
252 $headpage = $this->getHeadpage();
253 $type = $headpage->getType($this->dn);
254 $entry = $headpage->getEntry($this->dn);
255 $ui = get_userinfo();
256 $smarty = get_smarty();
258 if(!in_array('FAKE_OC_PWD_changeAble', $entry['objectClass'])){
259 trigger_error("Tried to change pwd, for invalid object!");
260 }elseif (get_post('new_password') != get_post('repeated_password')){
261 msg_dialog::display(_("Error"),
262 _("The passwords you've entered as 'New password' and 'Repeated password' do not match!"), ERROR_DIALOG);
263 return($smarty->fetch(get_template_path('password.tpl', TRUE)));
264 }else{
265 $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
266 $tabacl = $ui->get_permissions($this->dn,$acl,"userPassword");
268 // Check acls
269 if(!preg_match("/w/",$tabacl)){
270 msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
271 }else{
272 $ldap = $this->config->get_ldap_link();
273 $ldap->cd($this->dn);
274 $ldap->cat($this->dn);
275 $old_attrs = $ldap->fetch();
277 $attrs= array();
278 if ($_POST['new_password'] == ""){
280 /* Remove password attribute
281 */
282 if(in_array("simpleSecurityObject",$old_attrs['objectClass'])){
283 $attrs['objectClass'] = array();
284 for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
285 if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){
286 $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
287 }
288 }
289 }
290 $attrs['userPassword']= array();
291 } else {
293 /* Add/modify password attribute
294 */
295 if(!in_array("simpleSecurityObject",$old_attrs['objectClass'])){
296 $attrs['objectClass'] = array();
297 for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
298 $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
299 }
300 $attrs['objectClass'][] = "simpleSecurityObject";
301 }
303 if(class_available("passwordMethodCrypt")){
304 $pwd_m = new passwordMethodCrypt($this->config);
305 $pwd_m->set_hash("crypt/md5");
306 $attrs['userPassword'] = $pwd_m->generate_hash(get_post('new_password'));
307 }else{
308 msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password."));
309 $attrs = array();
310 }
311 }
312 $ldap->modify($attrs);
313 if (!$ldap->success()){
314 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type));
315 }else{
316 if(class_available($tDefs[$type]['plugClass'])){
317 $plug = $tDefs[$type]['plugClass'];
318 $p = new $plug($this->config,$this->dn);
319 $p->handle_post_events("modify");
320 }
321 }
322 new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error());
323 }
324 set_object_info();
325 }
326 }
329 /*! \brief The method gets called when somebody clicked the CD icon
330 * in the system listing.
331 * A confirmation will be shown to acknowledge the creation.
332 */
333 function createISO($action,$target)
334 {
335 if(count($target) == 1){
336 $smarty = get_smarty();
337 $this->dn= array_pop($target);
338 set_object_info($this->dn);
339 return ($smarty->fetch(get_template_path('goto/gencd.tpl', TRUE)));
341 }
342 }
345 /*! \brief Once the user has confirmed the ISO creation in 'createISO',
346 * this method gets called.
347 * An iFrame is shown which then used 'performIsoCreation' as contents.
348 */
349 function initiateISOcreation()
350 {
351 $smarty = get_smarty();
352 $smarty->assign("src", "?plug=".$_GET['plug']."&PerformIsoCreation");
353 return ($smarty->fetch(get_template_path('goto/gencd_frame.tpl', TRUE)));
354 }
357 /*! \brief ISO creation confirmed and iFrame is visible, now create the ISO
358 * and display the status to fill the iFrame.
359 */
360 function performIsoCreation()
361 {
362 $return_button = "<form method='get' action='main.php' target='_parent'>
363 <input type='submit' value='"._("Back")."'>
364 <input type='hidden' name='plug' value='".$_GET['plug']."'/>
365 </form>";
367 $dsc = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
369 /* Get and check command */
370 $command= $this->config->get_cfg_value("workgeneric", "systemIsoHook");
371 if (check_command($command)){
372 @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
374 /* Print out html introduction */
375 echo ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
376 <html>
377 <head>
378 <title></title>
379 <style type="text/css">@import url("themes/default/style.css");</style>
380 <script language="javascript" src="include/focus.js" type="text/javascript"></script>
381 </head>
382 <body style="background: none; margin:4px;" id="body" >
383 <pre>';
385 /* Open process handle and check if it is a valid process */
386 $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
387 if (is_resource($process)) {
388 fclose($pipes[0]);
390 /* Print out returned lines && write JS to scroll down each line */
391 while (!feof($pipes[1])){
392 $cur_dat = fgets($pipes[1], 1024);
393 echo $cur_dat;
394 echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
395 flush();
396 }
397 }
399 /* Get error string && close streams */
400 $buffer= stream_get_contents($pipes[2]);
402 fclose($pipes[1]);
403 fclose($pipes[2]);
404 echo "</pre>";
406 /* Check return code */
407 $ret= proc_close($process);
408 if ($ret != 0){
409 echo "<h1 style='color:red'>"._("Creating the image failed. Please see the report below.")."</h1>";
410 echo "<pre style='color:red'>$buffer</pre>";
411 }
412 echo $return_button."<br>";
413 } else {
414 $tmp= "<h1 style='color:red'>".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."</h1>";
415 echo $tmp;
416 echo $return_button."<br>";
417 }
419 /* Scroll down completly */
420 echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
421 echo '</body></html>';
422 flush();
423 exit;
424 }
427 /*! \brief Handle GOsa-si events
428 * All schedules and triggered events are handled here.
429 */
430 function handleEvent($action="",$target=array(),$all=array())
431 {
432 // Detect whether this event is scheduled or triggered.
433 $triggered = TRUE;
434 if(preg_match("/^S_/",$action)){
435 $triggered = FALSE;
436 }
438 // Detect triggere or scheduled actions
439 $headpage = $this->getHeadpage();
440 $event = preg_replace("/^[TS]_/","",$action);
441 if(preg_match("/^[TS]_/", $action)){
443 // Send special reinstall action for opsi hosts
444 if($event == "DaemonEvent_reinstall" && $this->si_active && $this->opsi){
445 foreach($target as $key => $dn){
446 $type = $headpage->getType($dn);
448 // Send Reinstall event for opsi hosts
449 if($type == "FAKE_OC_OpsiHost"){
450 $obj = $headpage->getEntry($dn);
451 $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]);
452 unset($target[$key]);
453 }
454 }
455 }
456 }
458 // Now send remaining FAI/GOsa-si events here.
459 if(count($target) && $this->si_active){
460 $mac= array();
462 // Collect target mac addresses
463 $ldap = $this->config->get_ldap_link();
464 $tD = $this->getObjectDefinitions();
465 $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
466 $o_queue = new gosaSupportDaemon();
467 foreach($target as $dn){
468 $type = $headpage->getType($dn);
469 if($tD[$type]['sendEvents']){
470 $obj = $headpage->getEntry($dn);
471 if(isset($obj['macAddress'][0])){
472 $mac[] = $obj['macAddress'][0];
473 }
474 }
475 }
477 /* Skip installation or update trigerred events,
478 * if this entry is currently processing.
479 */
480 if($triggered && in_array($event,array("DaemonEvent_reinstall","DaemonEvent_update"))){
481 foreach($mac as $key => $mac_address){
482 foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
483 $entry['STATUS'] = strtoupper($entry['STATUS']);
484 if($entry['STATUS'] == "PROCESSING" &&
485 isset($events['QUEUED'][$entry['HEADERTAG']]) &&
486 in_array($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
487 unset($mac[$key]);
489 new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
490 break;
491 }
492 }
493 }
494 }
496 // Prepare event to be added
497 if(count($mac) && isset($events['BY_CLASS'][$event]) && $this->si_active){
498 $event = $events['BY_CLASS'][$event];
499 $this->dialogObject = new $event['CLASS_NAME']($this->config);
500 $this->dialogObject->add_targets($mac);
502 if($triggered){
503 $this->dialogObject->set_type(TRIGGERED_EVENT);
504 $o_queue->append($this->dialogObject);
505 if($o_queue->is_error()){
506 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
507 }else{
508 $this->closeDialogs();
509 }
510 }else{
511 $this->dialogObject->set_type(SCHEDULED_EVENT);
512 }
513 }
514 }
515 }
518 /*! \brief Close all dialogs and reset the activationQueue.
519 */
520 function cancelEdit()
521 {
522 management::cancelEdit();
523 $this->activationQueue = array();
524 }
527 /*! \brief Save event dialogs.
528 * And append the new GOsa-si event.
529 */
530 function saveEventDialog()
531 {
532 $o_queue = new gosaSupportDaemon();
533 $o_queue->append($this->dialogObject);
534 if($o_queue->is_error()){
535 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
536 }else{
537 $this->closeDialogs();
538 }
539 }
542 /*! \brief Update filter part for INCOMING.
543 * Allows us to search for "systemIncomingRDN".
544 */
545 static function incomingFilterConverter($filter)
546 {
547 $rdn = preg_replace("/^[^=]*=/", "", get_ou("ArpNewDevice", "systemIncomingRDN"));
548 $rdn = preg_replace("/,.*$/","",$rdn);
549 return(preg_replace("/%systemIncomingRDN/", $rdn,$filter));
550 }
553 /*! \brief Queue selected objects to be removed.
554 * Checks ACLs, Locks and ask for confirmation.
555 */
556 protected function removeEntryRequested($action="",$target=array(),$all=array())
557 {
558 // Close dialogs and remove locks for currently handled dns
559 $this->cancelEdit();
561 $disallowed = array();
562 $this->dns = array();
564 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel requested!");
566 // Check permissons for each target
567 $tInfo = $this->getObjectDefinitions();
568 $headpage = $this->getHeadpage();
569 foreach($target as $dn){
570 $type = $headpage->getType($dn);
571 if(!isset($tInfo[$type])){
572 trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
573 }else{
574 $info = $tInfo[$type];
575 $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
576 if(preg_match("/d/",$acl)){
577 $this->dns[] = $dn;
578 }else{
579 $disallowed[] = $dn;
580 }
581 }
582 }
583 if(count($disallowed)){
584 msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
585 }
587 // We've at least one entry to delete.
588 if(count($this->dns)){
590 // check locks
591 if ($user= get_multiple_locks($this->dns)){
592 return(gen_locked_message($user,$this->dns));
593 }
595 // Add locks
596 $dns_names = array();
597 $types = array();
598 $h = $this->getHeadpage();
600 // Build list of object -labels
601 foreach($h->objectTypes as $type){
602 $map[$type['objectClass']]= $type['label'];
603 }
605 foreach($this->dns as $dn){
606 $tmp = $h->getType($dn);
607 if(isset($map[$tmp])){
608 $dns_names[] = '('._($map[$tmp]).') - '.LDAP::fix($dn);
609 }else{
610 $dns_names[] =LDAP::fix($dn);
611 }
612 }
613 add_lock ($this->dns, $this->ui->dn);
615 // Display confirmation dialog.
616 $smarty = get_smarty();
617 $smarty->assign("info", msgPool::deleteInfo($dns_names));
618 return($smarty->fetch(get_template_path('removeEntries.tpl')));
619 }
620 }
623 /*! \brief Object removal was confirmed, now remove the requested entries.
624 *
625 * @param String 'action' The name of the action which was the used as trigger.
626 * @param Array 'target' A list of object dns, which should be affected by this method.
627 * @param Array 'all' A combination of both 'action' and 'target'.
628 */
629 function removeEntryConfirmed($action="",$target=array(),$all=array(),
630 $altTabClass="",$altTabType="",$altAclCategory="", $aclPlugin="")
631 {
632 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel confirmed!");
634 // Check permissons for each target
635 $tInfo = $this->getObjectDefinitions();
636 $headpage = $this->getHeadpage();
637 $disallowed = array();
638 foreach($this->dns as $key => $dn){
639 $type = $headpage->getType($dn);
640 if(!isset($tInfo[$type])){
641 trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
642 }else{
644 $info = $tInfo[$type];
645 $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
646 if(preg_match("/d/",$acl)){
648 // Delete the object
649 $this->dn = $dn;
650 if($info['tabClass'] == "phonetabs"){
651 $this->tabObject= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $dn,$type);
652 $this->tabObject->set_acl_base($dn);
653 $this->tabObject->by_object['phoneGeneric']->remove_from_parent ();
654 }else{
655 $this->tabObject= new $info['tabClass']($this->config,$this->config->data['TABS'][$info['tabDesc']],
656 $this->dn, $info['aclCategory'], true, true);
657 $this->tabObject->set_acl_base($this->dn);
658 $this->tabObject->parent = &$this;
659 $this->tabObject->delete ();
660 }
662 // Remove the lock for the current object.
663 del_lock($this->dn);
665 }else{
666 $disallowed[] = $dn;
667 new log("security","system/".get_class($this),$dn,array(),"Tried to trick deletion.");
668 }
669 }
670 }
671 if(count($disallowed)){
672 msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
673 }
675 // Cleanup
676 $this->remove_lock();
677 $this->closeDialogs();
678 }
681 /*! \brief Edit the selected system type.
682 * NewDevice and ArpNewDevice are handled here separately
683 */
684 function editEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
685 {
686 if(count($target) == 1){
687 $tInfo = $this->getObjectDefinitions();
688 $headpage = $this->getHeadpage();
689 $dn = $target[0];
690 $type =$headpage->getType($dn);
691 $tData = $tInfo[$type];
693 if($type == "FAKE_OC_ArpNewDevice"){
694 if(!class_available("ArpNewDeviceTabs")){
695 msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG);
696 }else{
697 return(management::editEntry($action,$target,$all,"ArpNewDeviceTabs","ARPNEWDEVICETABS","incoming"));
698 }
699 }elseif($type == "FAKE_OC_NewDevice"){
700 if(!class_available("SelectDeviceType")){
701 msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG);
702 }else{
703 $this->activationQueue[$dn] = array();
704 $this->dialogObject = new SelectDeviceType($this->config,$dn);
705 $this->dialogObject->set_acl_category("incoming");
706 $this->skipFooter = TRUE;
707 $this->displayApplyBtn = FALSE;
708 // see condition -$s_action == "::systemTypeChosen"- for further handling
709 }
710 }else{
711 return(management::editEntry($action,$target,$all,$tData['tabClass'],$tData['tabDesc'],$tData['aclCategory']));
712 }
713 }
714 }
717 /*! \brief Edit the selected system type.
718 *
719 * @param String 'action' The name of the action which was the used as trigger.
720 * @param Array 'target' A list of object dns, which should be affected by this method.
721 * @param Array 'all' A combination of both 'action' and 'target'.
722 */
723 function newEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
724 {
725 $tInfo = $this->getObjectDefinitions();
726 $info = preg_replace("/^new_/","",$action);
727 if(!isset($tInfo[$info])){
728 trigger_error("Unknown action type '".$action."' cant create a new system!");
729 }else{
730 return(management::newEntry($action,$target,$all,
731 $tInfo[$info]['tabClass'],
732 $tInfo[$info]['tabDesc'],
733 $tInfo[$info]['aclCategory']));
734 }
735 }
738 /*! \brief Activates all selcted 'NewDevices' at once.
739 * Enqueues the selected Devices in the activation queue.
740 */
741 function activateMultiple($action,$target)
742 {
743 $headpage = $this->getHeadpage();
744 foreach($target as $dn) {
745 if($headpage->getType($dn) == "FAKE_OC_NewDevice"){
746 $this->activationQueue[$dn] = array();
747 }
748 }
749 if(count($this->activationQueue)){
750 $this->dialogObject = new SelectDeviceType($this->config, array_keys($this->activationQueue));
751 $this->skipFooter = TRUE;
752 }
753 }
756 /*! \brief The system selection dialog was closed.
757 * We will now queue the given entry to be activated.
758 */
759 function systemTypeChosen()
760 {
761 // Detect the systems target type
762 $tInfo = $this->getObjectDefinitions();
763 $selected_group = "none";
764 if(isset($_POST['ObjectGroup'])){
765 $selected_group = get_post('ObjectGroup');
766 }
767 $selected_system = get_post('SystemType');
768 $tmp = array();
769 foreach($this->activationQueue as $dn => $data){
770 $tmp[$dn]['OG'] = $selected_group;
771 $tmp[$dn]['SS'] = $selected_system;
772 }
773 $this->closeDialogs();
774 $this->activationQueue = $tmp;
775 return($this->handleActivationQueue());
776 }
779 /*! \brief Activate queued goto systems.
780 */
781 function handleActivationQueue()
782 {
783 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
784 'Entries left: '.count($this->activationQueue), "<b>Handling system activation queue!</b>");
786 if(!count($this->activationQueue)) return("");
788 $ldap = $this->config->get_ldap_link();
789 $pInfo = $this->getObjectDefinitions();
790 $ui = get_userinfo();
791 $headpage = $this->getHeadpage();
792 $ldap->cd($this->config->current['BASE']);
794 // Walk through systems to activate
795 while(count($this->activationQueue)){
797 // Get next entry
798 reset($this->activationQueue);
799 $dn = key($this->activationQueue);
800 $data= $this->activationQueue[$dn];
802 // Validate the given system type.
803 if(!isset($data['SS'])) continue;
804 $sysType = $data['SS'];
805 if(!isset($pInfo[$sysType])){
806 trigger_error('Unknown type \''.$sysType.'\'!');
807 continue;
808 }
809 $type = $pInfo[$sysType];
811 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
812 $dn, "<b>Try to activate:</b>");
814 // Get target type definition
815 $plugClass = $type["plugClass"];
816 $tabClass = $type["tabClass"];
817 $aclCategory = $type["aclCategory"];
818 $tabDesc = $type["tabDesc"];
820 if(!class_available($tabClass)){
821 msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
822 unset($this->activationQueue[$dn]);
823 continue;
824 }else{
826 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
827 $sysType, "<b>System type:</b>");
829 // Load permissions for selected 'dn' and check if we're allowed to create this 'dn'
830 $this->dn = $dn;
831 $acls = $ui->get_permissions($this->dn,$aclCategory."/".$plugClass);
833 // Check permissions
834 if(!preg_match("/c/",$acls)){
835 unset($this->activationQueue[$dn]);
836 msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
838 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
839 $acls, "<b>Insufficient permissions!</b>");
840 continue;
841 }else{
843 // Open object an preset some values like the objects base
844 del_lock($dn);
845 management::editEntry('editEntry',array($dn),array(),$tabClass,$tabDesc, $aclCategory);
846 $this->displayApplyBtn = FALSE;
847 $this->tabObject->set_acl_base($headpage->getBase());
849 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
850 $data['OG'], "<b>Selected ogroup:</b>");
852 if($data['OG'] != "none"){
853 $this->tabObject->base = preg_replace("/^[^,]+,".preg_quote(get_ou("group", "ogroupRDN"), '/')."/i", "", $data['OG']);
854 $this->tabObject->by_object[$plugClass]->baseSelector->setBase($this->tabObject->base);
855 } else {
856 $this->tabObject->by_object[$plugClass]->baseSelector->setBase($headpage->getBase());
857 $this->tabObject->base = $headpage->getBase();
858 }
860 // Assign some default values for opsi hosts
861 if($this->tabObject instanceOf opsi_tabs){
862 $ldap = $this->config->get_ldap_link();
863 $ldap->cat($dn);
864 $source_attrs = $ldap->fetch();
865 foreach(array("macAddress" => "mac" ,"cn" => "hostId","description" => "description") as $src => $attr){
866 if(isset($source_attrs[$src][0])){
867 $this->tabObject->by_object['opsiGeneric']->$attr = $source_attrs[$src][0];
868 }
869 }
870 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
871 "", "<b>OPSI attributes adapted</b>");
872 }
874 // Queue entry to be activated, when it is saved.
875 if($data['OG'] != "none"){
877 // Set gotoMode to active if there was an ogroup selected.
878 $found = false;
879 foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
880 if(isset($this->tabObject->by_object[$tab]->gotoMode)) {
881 $found = true;
882 $this->tabObject->by_object[$tab]->gotoMode = $value;
883 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
884 $tab."->gotoMode = {$value}", "<b>Setting gotoMode to: </b>");
885 }
886 }
887 if(!$found){
888 msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG);
889 }
891 // Update object group membership
892 $og = new ogroup($this->config,$data['OG']);
893 if($og){
894 $og->AddDelMembership($this->tabObject->dn);
895 $og->save();
896 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
897 $og->dn, "<b>Adding system to ogroup</b>");
898 }
900 // Set default system specific attributes
901 foreach (array("workgeneric", "termgeneric") as $cls){
902 if (isset($this->tabObject->by_object[$cls])){
903 $this->tabObject->by_object[$cls]->set_everything_to_inherited();
904 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
905 $og->dn, "<b>Calling {$cls}->set_everything_to_inherited()</b>");
906 }
907 }
909 // Enable activation
910 foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){
911 if (isset($this->tabObject->by_object[$cls])){
912 $this->tabObject->by_object[$cls]->auto_activate= TRUE;
913 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
914 $cls, "<b>Setting auto_activate=TRUE for</b>");
915 }
916 }
918 // Enable sending of LDAP events
919 if (isset($this->tabObject->by_object["workstartup"])){
920 $this->tabObject->by_object["workstartup"]->gotoLdap_inherit= TRUE;
921 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
922 "", "<b>Setting workstartup->gotoLdap_inherit=TRUE</b>");
923 }
924 }
926 // Try to inherit everythin from the selected object group and then save
927 // the entry, normally this should work without any problems.
928 // But if there is any, then display the dialogs.
929 if($data['OG'] != "none"){
930 $str = $this->saveChanges();
932 // There was a problem, skip activation here and allow to fix the problems..
933 if(is_object($this->tabObject)){
934 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
935 "", "<b>Automatic saving failed, let the user fix the issues now.</b>");
936 return;
937 }
938 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
939 "", "<b>System activated!</b>");
940 }else{
941 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
942 "", "<b>Open dialogs now</b>");
943 return;
944 }
945 }
946 }
947 }
948 }
951 /*! \brief Save object modifications here and any dialogs too.
952 * After a successfull update of the object data, close
953 * the dialogs.
954 */
955 protected function saveChanges()
956 {
957 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
958 get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Save</b>");
960 // Handle 'New Unknown Devices' here.
961 if($this->tabObject instanceOf ArpNewDeviceTabs){
962 $this->tabObject->save_object();
964 if($this->tabObject->by_object['ArpNewDevice']->gotoIntegration){
965 $message = $this->tabObject->check();
966 if(count($message)){
967 msg_dialog::displayChecks($message);
968 }else{
969 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
970 get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Queued for goto activation</b>");
971 $this->tabObject->save();
972 $this->activationQueue[$this->tabObject->dn]=array();
973 $this->closeDialogs();
974 $this->systemTypeChosen();
975 }
976 return;
977 }
978 }
980 // Try to save changes here.
981 $str = management::saveChanges();
982 if($this->tabObject) return("");
984 // Activate system if required..
985 if(isset($this->activationQueue[$this->last_dn])){
986 $dn = $this->last_tabObject->dn;
987 $this->activate_new_device($dn);
988 unset($this->activationQueue[$this->last_dn]);
989 }
991 /* Post handling for activated systems
992 target opsi -> Remove source.
993 target gosa -> Activate system.
994 */
995 if($this->last_tabObject instanceOf opsi_tabs){
996 $ldap = $this->config->get_ldap_link();
997 $ldap->cd($this->config->current['BASE']);
998 $ldap->rmdir ($this->last_tabObject->dn);
999 @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
1000 "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
1002 $hostId = $this->last_tabObject->by_object['opsiGeneric']->hostId;
1003 $mac = $this->last_tabObject->by_object['opsiGeneric']->mac;
1004 $this->opsi->job_opsi_activate_client($hostId,$mac);
1006 }elseif(isset($this->last_tabObject->was_activated) && $this->last_tabObject->was_activated){
1007 $this->activate_new_device($this->last_tabObject->dn);
1008 }
1010 // Avoid using values from an older input dialog
1011 $_POST = array();
1012 $this->handleActivationQueue();
1013 }
1016 /*! \brief Save object modifications here and any dialogs too.
1017 * Keep dialogs opened.
1018 */
1019 protected function applyChanges()
1020 {
1021 $str = management::applyChanges();
1022 if($str) return($str);
1024 /* Post handling for activated systems
1025 target opsi -> Remove source.
1026 target gosa -> Activate system.
1027 */
1028 if($this->tabObject instanceOf opsi_tabs){
1029 $ldap = $this->config->get_ldap_link();
1030 $ldap->cd($this->config->current['BASE']);
1031 $ldap->rmdir ($this->tabObject->dn);
1032 @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
1033 "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
1035 $hostId = $this->tabObject->by_object['opsiGeneric']->hostId;
1036 $mac = $this->tabObject->by_object['opsiGeneric']->mac;
1037 $this->opsi->job_opsi_activate_client($hostId,$mac);
1038 $this->tabObject->set_acl_base($this->dn);
1040 }elseif(isset($this->tabObject->was_activated) && $this->tabObject->was_activated){
1041 $this->activate_new_device($this->tabObject->dn);
1042 }
1043 }
1046 /*! \brief Sets FAIstate to "install" for "New Devices".
1047 This function is some kind of "Post handler" for activated systems,
1048 it is called directly after the object (workstabs,servtabs) gets saved.
1049 @param String $dn The dn of the newly activated object.
1050 @return Boolean TRUE if activated else FALSE
1051 */
1052 function activate_new_device($dn)
1053 {
1054 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1055 $dn, "<b>Activating system:</b>");
1056 $ldap = $this->config->get_ldap_link();
1057 $ldap->cd($this->config->current['BASE']);
1058 $ldap->cat($dn);
1059 if($ldap->count()){
1060 $attrs = $ldap->fetch();
1061 if(count(array_intersect(array('goServer','gotoWorkstation'), $attrs['objectClass']))){
1062 $ocs = $attrs['objectClass'];
1063 unset($ocs['count']);
1064 $new_attrs = array();
1065 if(!in_array("FAIobject",$ocs)){
1066 $ocs[] = "FAIobject";
1067 $new_attrs['objectClass'] = $ocs;
1068 }
1069 $new_attrs['FAIstate'] = "install";
1070 $ldap->cd($dn);
1071 $ldap->modify($new_attrs);
1072 if (!$ldap->success()){
1073 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn,
1074 LDAP_MOD, "activate_new_device($dn)"));
1075 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1076 $dn, "<b>Failed!</b>");
1077 }else{
1078 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1079 $dn, "<b>Success</b>");
1080 return(TRUE);
1081 }
1082 }else{
1083 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1084 $dn, "<b>FAIstate not set to install, this is only done for gotoWorkstation/goServer!</b>");
1085 }
1086 }
1087 return(FALSE);
1088 }
1091 /*! \brief Opens the snapshot creation dialog for the given target.
1092 *
1093 * @param String 'action' The name of the action which was the used as trigger.
1094 * @param Array 'target' A list of object dns, which should be affected by this method.
1095 * @param Array 'all' A combination of both 'action' and 'target'.
1096 */
1097 function createSnapshotDialog($action="",$target=array(),$all=array())
1098 {
1099 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Snaptshot creation initiated!");
1101 $pInfo = $this->getObjectDefinitions();
1102 $headpage = $this->getHeadpage();
1103 foreach($target as $dn){
1105 $entry = $headpage->getEntry($dn);
1106 $type = $headpage->getType($dn);
1107 if(!isset($pInfo[$type])) {
1108 trigger_error('Unknown system type \''.$type.'\'!');
1109 return;
1110 }
1112 if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
1113 $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
1114 $this->dialogObject->aclCategories = array($pInfo[$type]['aclCategory']);
1115 $this->dialogObject->parent = &$this;
1117 }else{
1118 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to create a snapshot for %s."),$dn),
1119 ERROR_DIALOG);
1120 }
1121 }
1122 }
1125 /*! \brief Displays the "Restore snapshot dialog" for a given target.
1126 * If no target is specified, open the restore removed object
1127 * dialog.
1128 * @param String 'action' The name of the action which was the used as trigger.
1129 * @param Array 'target' A list of object dns, which should be affected by this method.
1130 * @param Array 'all' A combination of both 'action' and 'target'.
1131 */
1132 function restoreSnapshotDialog($action="",$target=array(),$all=array())
1133 {
1134 // Set current restore base for snapshot handling.
1135 $headpage = $this->getHeadpage();
1136 $pInfo = $this->getObjectDefinitions();
1137 if(is_object($this->snapHandler)){
1138 $bases = array();
1139 foreach($this->storagePoints as $sp){
1140 $bases[] = $sp.$headpage->getBase();
1141 }
1142 }
1144 // No bases specified? Try base
1145 if(!count($bases)) $bases[] = $this->headpage->getBase();
1147 // No target, open the restore removed object dialog.
1148 if(!count($target)){
1150 $cats = array();
1151 foreach($pInfo as $data){
1152 $cats[] = $data['aclCategory'];
1153 }
1154 $cats = array_unique($cats);
1156 $entry = $headpage->getBase();
1157 if(!empty($entry) && $this->ui->allow_snapshot_restore($entry,$cats)){
1158 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$entry,"Snaptshot restoring initiated!");
1159 $this->dialogObject = new SnapShotDialog($this->config,$entry,$this);
1160 $this->dialogObject->set_snapshot_bases($bases);
1161 $this->dialogObject->display_all_removed_objects = true;
1162 $this->dialogObject->display_restore_dialog = true;
1163 $this->dialogObject->parent = &$this;
1164 }else{
1165 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$entry),
1166 ERROR_DIALOG);
1167 }
1168 }else{
1170 // Display the restore points for a given object.
1171 $dn = array_pop($target);
1172 $entry = $headpage->getEntry($dn);
1173 $type = $headpage->getType($dn);
1174 if(!isset($pInfo[$type])) {
1175 trigger_error('Unknown system type \''.$type.'\'!');
1176 return;
1177 }
1179 if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
1180 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restoring initiated!");
1181 $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
1182 $this->dialogObject->set_snapshot_bases($bases);
1183 $this->dialogObject->display_restore_dialog = true;
1184 $this->dialogObject->parent = &$this;
1185 }else{
1186 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$dn),
1187 ERROR_DIALOG);
1188 }
1189 }
1190 }
1193 /*! \brief Restores a snapshot object.
1194 * The dn of the snapshot entry has to be given as ['target'] parameter.
1195 *
1196 * @param String 'action' The name of the action which was the used as trigger.
1197 * @param Array 'target' A list of object dns, which should be affected by this method.
1198 * @param Array 'all' A combination of both 'action' and 'target'.
1199 */
1200 function restoreSnapshot($action="",$target=array(),$all=array())
1201 {
1202 $dn = array_pop($target);
1203 $this->snapHandler->restore_snapshot($dn);
1204 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restored!");
1205 $this->closeDialogs();
1206 }
1209 /*! \brief Detects actions/events send by the ui
1210 * and the corresponding targets.
1211 */
1212 function detectPostActions()
1213 {
1214 $action= management::detectPostActions();
1215 if(isset($_POST['abort_event_dialog'])) $action['action'] = "cancel";
1216 if(isset($_POST['save_event_dialog'])) $action['action'] = "saveEvent";
1217 if(isset($_POST['cd_create'])) $action['action'] = "initiateISOcreation";
1218 if(isset($_GET['PerformIsoCreation'])) $action['action'] = "performIsoCreation";
1219 if(isset($_POST['SystemTypeAborted'])) $action['action'] = "cancel";
1220 if(isset($_POST['password_cancel'])) $action['action'] = "cancel";
1221 if(isset($_POST['password_finish'])) $action['action'] = "passwordChangeConfirmed";
1223 if(isset($_POST['new_goServer'])) $action['action'] = "new_goServer";
1224 if(isset($_POST['new_gotoWorkstation'])) $action['action'] = "new_gotoWorkstation";
1225 if(isset($_POST['new_gotoTerminal'])) $action['action'] = "new_gotoTerminal";
1226 if(isset($_POST['new_gotoPrinter'])) $action['action'] = "new_gotoPrinter";
1227 if(isset($_POST['new_goFonHardware'])) $action['action'] = "new_goFonHardware";
1228 if(isset($_POST['new_ieee802Device'])) $action['action'] = "new_ieee802Device";
1229 if(isset($_POST['new_FAKE_OC_OpsiHost'])) $action['action'] = "new_FAKE_OC_OpsiHost";
1231 if(!is_object($this->tabObject) && !is_object($this->dialogObject)){
1232 if(count($this->activationQueue)) $action['action'] = "handleActivationQueue";
1233 }
1235 if(isset($_POST['systemTypeChosen'])) $action['action'] = "systemTypeChosen";
1237 return($action);
1238 }
1241 /*! \brief Overridden render method of class management.
1242 * this allows us to add a release selection box.
1243 */
1244 function renderList()
1245 {
1246 $headpage = $this->getHeadpage();
1247 $headpage->update();
1249 $tD = $this->getObjectDefinitions();
1250 $smarty = get_smarty();
1251 foreach($tD as $name => $obj){
1252 $smarty->assign("USE_".$name, (empty($obj['TABNAME']) || class_available($obj['TABNAME'])));
1253 }
1255 $display = $headpage->render();
1256 return($this->getHeader().$display);
1257 }
1260 public function getObjectDefinitions()
1261 {
1262 $tabs = array(
1263 "FAKE_OC_OpsiHost" => array(
1264 "ou" => "",
1265 "plugClass" => "opsiGeneric",
1266 "tabClass" => "opsi_tabs",
1267 "tabDesc" => "OPSITABS",
1268 "aclClass" => "opsiGeneric",
1269 "sendEvents" => TRUE,
1270 "aclCategory" => "opsi"),
1272 "goServer" => array(
1273 "ou" => get_ou("servgeneric", "serverRDN"),
1274 "plugClass" => "servgeneric",
1275 "tabClass" => "servtabs",
1276 "tabDesc" => "SERVTABS",
1277 "aclClass" => "servgeneric",
1278 "sendEvents" => TRUE,
1279 "aclCategory" => "server"),
1281 "gotoWorkstation" => array(
1282 "ou" => get_ou("workgeneric", "workstationRDN"),
1283 "plugClass" => "workgeneric",
1284 "tabClass" => "worktabs",
1285 "tabDesc" => "WORKTABS",
1286 "aclClass" => "workgeneric",
1287 "sendEvents" => TRUE,
1288 "aclCategory" => "workstation"),
1290 "gotoTerminal" => array(
1291 "ou" => get_ou("termgeneric", "terminalRDN"),
1292 "plugClass" => "termgeneric",
1293 "tabClass" => "termtabs",
1294 "sendEvents" => TRUE,
1295 "tabDesc" => "TERMTABS",
1296 "aclClass" => "termgeneric",
1297 "aclCategory" => "terminal"),
1299 "gotoPrinter" => array(
1300 "ou" => get_ou("printgeneric", "printerRDN"),
1301 "plugClass" => "printgeneric",
1302 "tabClass" => "printtabs",
1303 "tabDesc" => "PRINTTABS",
1304 "aclClass" => "printgeneric",
1305 "sendEvents" => FALSE,
1306 "aclCategory" => "printer"),
1308 "FAKE_OC_NewDevice" => array(
1309 "ou" => get_ou("ArpNewDevice", "systemIncomingRDN"),
1310 "plugClass" => "termgeneric",
1311 "tabClass" => "termtabs",
1312 "sendEvents" => TRUE,
1313 "tabDesc" => "TERMTABS",
1314 "aclClass" => "termgeneric",
1315 "aclCategory" => "terminal"),
1317 "goFonHardware" => array(
1318 "ou" => get_ou("phoneGeneric", "phoneRDN"),
1319 "plugClass" => "phoneGeneric",
1320 "tabClass" => "phonetabs",
1321 "tabDesc" => "PHONETABS",
1322 "sendEvents" => FALSE,
1323 "aclClass" => "phoneGeneric",
1324 "aclCategory" => "phone"),
1326 "FAKE_OC_winstation" => array(
1327 "ou" => get_winstations_ou(),
1328 "plugClass" => "wingeneric",
1329 "sendEvents" => TRUE,
1330 "tabClass" => "wintabs",
1331 "tabDesc" => "WINTABS",
1332 "aclClass" => "wingeneric",
1333 "aclCategory" => "winworkstation"),
1335 "ieee802Device" => array(
1336 "ou" => get_ou("componentGeneric", "componentRDN"),
1337 "plugClass" => "componentGeneric",
1338 "sendEvents" => FALSE,
1339 "tabClass" => "componenttabs",
1340 "tabDesc" => "COMPONENTTABS",
1341 "aclClass" => "componentGeneric",
1342 "aclCategory" => "component"),
1343 );
1345 // Now map some special types
1346 $tabs['FAKE_OC_NewWorkstation'] = &$tabs['gotoWorkstation'];
1347 $tabs['FAKE_OC_NewTerminal'] = &$tabs['gotoTerminal'];
1348 $tabs['FAKE_OC_NewServer'] = &$tabs['gotoWorkstation'];
1349 $tabs['gotoWorkstation__IS_BUSY'] = &$tabs['gotoWorkstation'];
1350 $tabs['gotoWorkstation__IS_ERROR'] = &$tabs['gotoWorkstation'];
1351 $tabs['gotoWorkstation__IS_LOCKED'] = &$tabs['gotoWorkstation'];
1352 $tabs['gotoTerminal__IS_BUSY'] = &$tabs['gotoTerminal'];
1353 $tabs['gotoTerminal__IS_ERROR'] = &$tabs['gotoTerminal'];
1354 $tabs['gotoTerminal__IS_LOCKED'] = &$tabs['gotoTerminal'];
1355 $tabs['FAKE_OC_TerminalTemplate'] = &$tabs['gotoTerminal'];
1356 $tabs['FAKE_OC_WorkstationTemplate'] = &$tabs['gotoTerminal'];
1357 $tabs['goServer__IS_BUSY'] = &$tabs['goServer'];
1358 $tabs['goServer__IS_ERROR'] = &$tabs['goServer'];
1359 $tabs['goServer__IS_LOCKED'] = &$tabs['goServer'];
1361 $tabs['FAKE_OC_ArpNewDevice'] = &$tabs['FAKE_OC_NewDevice'];
1363 return($tabs);
1364 }
1367 static function filterSystemDescription($row,$dn,$pid,$state,$description=array())
1368 {
1369 $dn= LDAP::fix(func_get_arg(1));
1370 $desc = isset($description[0])?$description[0]:"";
1371 $rc = "";
1372 switch($state){
1373 case 'locked' : $rc = "<rowClass:entry-locked/><rowLabel:locked/>"; break;
1374 case 'error' : $rc = "<rowClass:entry-error/><rowLabel:error/>"; break;
1375 case 'busy' : $rc = "<rowClass:entry-busy/><rowLabel:busy/>"; break;
1376 case 'warning' : $rc = "<rowClass:entry-warning/><rowLabel:warning/>"; break;
1377 }
1378 return("<a href='?plug=".$_GET['plug']."&PID={$pid}&act=listing_edit_{$row}' title='{$dn}'>".set_post($desc)."</a>{$rc}");
1379 }
1381 static function systemRelease($a,$b,$c,$objectclasses= null,$class= null)
1382 {
1383 global $config;
1385 // No objectclasses set - go ahead
1386 if(!$objectclasses) return(" ");
1388 // Skip non fai objects
1389 if (!in_array_ics("FAIobject", $objectclasses)) {
1390 return " ";
1391 }
1393 // If we've an own fai class, just use this
1394 if ($class && is_array($class)) {
1395 foreach (explode(' ', $class[0]) as $element) {
1396 if ($element[0] == ":") {
1397 return " ".image('images/empty.png')." ".mb_substr($element, 1);
1398 }
1399 }
1400 }
1402 // Load information if needed
1403 $ldap = $config->get_ldap_link();
1404 $ldap->cd($config->current['BASE']);
1405 $ldap->search("(&(objectClass=gosaGroupOfNames)(FAIclass=*)(member=".$b."))",array('FAIclass','cn'));
1406 while($attrs = $ldap->fetch()){
1407 $rel = preg_replace("/^.*:/","",$attrs['FAIclass'][0]);
1408 $sys = sprintf(_("Inherited from %s"),$attrs['cn'][0]);
1409 $str = " ".image('plugins/ogroups/images/ogroup.png', "", $sys)." ".$rel;
1410 return($str);
1411 }
1413 return(" ");
1414 }
1417 /*! \brief !! Incoming dummy acls, required to defined acls for incoming objects
1418 */
1419 static function plInfo()
1420 {
1421 return (array(
1422 "plShortName" => _("Incoming objects"),
1423 "plDescription" => _("Incoming objects"),
1424 "plSelfModify" => FALSE,
1425 "plDepends" => array(),
1426 "plPriority" => 99,
1427 "plSection" => array("administration"),
1429 "plProperties" =>
1430 array(
1431 array(
1432 "name" => "systemRDN",
1433 "type" => "rdn",
1434 "default" => "ou=systems,",
1435 "description" => _("The 'systemRDN' statement defines the location where new systems will be created. The default is 'ou=systems,'."),
1436 "check" => "gosaProperty::isRdn",
1437 "migrate" => "migrate_systemRDN",
1438 "group" => "plugin",
1439 "mandatory" => FALSE
1440 )
1441 ),
1444 "plCategory" => array("incoming" => array( "description" => _("Incoming"))),
1445 "plProvidedAcls"=> array()
1446 ));
1447 }
1448 }
1449 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1450 ?>