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 = "Systems";
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 }
86 $this->storagePoints = array_unique($sP);
88 // Build filter
89 if (session::global_is_set(get_class($this)."_filter")){
90 $filter= session::global_get(get_class($this)."_filter");
91 } else {
92 $filter = new filter(get_template_path("system-filter.xml", true));
93 $filter->setObjectStorage($this->storagePoints);
94 }
95 $this->setFilter($filter);
97 // Build headpage
98 $headpage = new listing(get_template_path("system-list.xml", true));
99 $headpage->registerElementFilter("systemRelease", "systemManagement::systemRelease");
100 $headpage->setFilter($filter);
101 $filter->setConverter('INCOMING', 'systemManagement::incomingFilterConverter');
103 // Register Daemon Events
104 if(class_available("DaemonEvent") && class_available("gosaSupportDaemon")){
105 $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);
106 foreach($events['TRIGGERED'] as $name => $data){
107 $this->registerAction("T_".$name,"handleEvent");
108 $this->registerAction("S_".$name,"handleEvent");
109 }
110 $this->registerAction("activateMultiple","activateMultiple");
111 }
112 $this->registerAction("saveEvent","saveEventDialog");
113 $this->registerAction("createISO","createISO");
114 $this->registerAction("initiateISOcreation","initiateISOcreation");
115 $this->registerAction("performIsoCreation","performIsoCreation");
116 $this->registerAction("systemTypeChosen","systemTypeChosen");
117 $this->registerAction("handleActivationQueue","handleActivationQueue");
119 $this->registerAction("new_goServer", "newEntry");
120 $this->registerAction("new_gotoWorkstation", "newEntry");
121 $this->registerAction("new_gotoTerminal", "newEntry");
122 $this->registerAction("new_gotoPrinter", "newEntry");
123 $this->registerAction("new_goFonHardware", "newEntry");
124 $this->registerAction("new_ieee802Device", "newEntry");
125 $this->registerAction("new_FAKE_OC_OpsiHost", "newEntry");
127 $this->registerAction("setPassword", "setPassword");
128 $this->registerAction("passwordChangeConfirmed", "passwordChangeConfirmed");
130 // Add copy&paste and snapshot handler.
131 if ($this->config->boolValueIsTrue("main", "copyPaste")){
132 $this->cpHandler = new CopyPasteHandler($this->config);
133 }
134 if($this->config->get_cfg_value("enableSnapshots") == "true"){
135 $this->snapHandler = new SnapshotHandler($this->config);
136 }
138 // Check if we are able to communicate with the GOsa supprot daemon
139 if(class_available("gosaSupportDaemon")){
140 $o = new gosaSupportDaemon();
141 $this->si_active = $o->connect() && class_available("DaemonEvent");
142 }
144 // Check if we are able to communicate with the GOsa supprot daemon
145 if(class_available("opsi")){
146 $this->opsi = new opsi($this->config);
147 }
148 parent::__construct($config, $ui, "systems", $headpage);
149 }
152 /*! \brief Act on password change requests.
153 */
154 function setPassword($action,$target)
155 {
156 if(count($target) == 1){
157 $tDefs= $this->getObjectDefinitions();
158 $headpage = $this->getHeadpage();
159 $dn = array_pop($target);
160 $type = $headpage->getType($dn);
161 $entry = $headpage->getEntry($dn);
162 $ui = get_userinfo();
163 $smarty = get_smarty();
164 if(in_array("FAKE_OC_PWD_changeAble", $entry['objectClass'])){
165 $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
166 $tabacl = $ui->get_permissions($dn,$acl,"userPassword");
167 if(preg_match("/w/",$tabacl)){
168 $this->dn= $dn;
169 set_object_info($this->dn);
170 return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
171 }else{
172 msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
173 }
174 }
175 }
176 }
179 /*! \brief This method is used to queue and process copy&paste actions.
180 * Allows to copy, cut and paste mutliple entries at once.
181 * @param String 'action' The name of the action which was the used as trigger.
182 * @param Array 'target' A list of object dns, which should be affected by this method.
183 * @param Array 'all' A combination of both 'action' and 'target'.
184 */
185 function copyPasteHandler($action="",$target=array(),$all=array(),
186 $altTabClass ="", $altTabType = "", $altAclCategory="",$altAclPlugin="")
187 {
188 // Return without any actions while copy&paste handler is disabled.
189 if(!is_object($this->cpHandler)) return("");
191 // Save user input
192 $this->cpHandler->save_object();
194 // Add entries to queue
195 if($action == "copy" || $action == "cut"){
197 $tDefs= $this->getObjectDefinitions();
198 $headpage = $this->getHeadpage();
199 $ui = get_userinfo();
200 $this->cpHandler->cleanup_queue();
201 foreach($target as $dn){
203 $type = $headpage->getType($dn);
204 $entry = $headpage->getEntry($dn);
206 $aclCategory = $tDefs[$type]['aclCategory'];
207 $aclPlugin = $tDefs[$type]['aclClass'];
208 $tabClass = $tDefs[$type]['tabClass'];
209 $tabType = $tDefs[$type]['tabDesc'];
211 if($action == "copy" && $this->ui->is_copyable($dn,$aclCategory,$aclPlugin)){
212 $this->cpHandler->add_to_queue($dn,"copy",$tabClass,$tabType,$aclCategory,$this);
213 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry copied!");
214 }
215 if($action == "cut" && $this->ui->is_cutable($dn,$aclCategory,$aclPlugin)){
216 $this->cpHandler->add_to_queue($dn,"cut",$tabClass,$tabType,$aclCategory,$this);
217 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry cutted!");
218 }
219 }
220 }
222 // Initiate pasting
223 if($action == "paste"){
224 $this->cpPastingStarted = TRUE;
225 }
227 // Display any c&p dialogs, eg. object modifications required before pasting.
228 if($this->cpPastingStarted && $this->cpHandler->entries_queued()){
229 $headpage = $this->getHeadpage();
230 $this->cpHandler->SetVar("base",$headpage->getBase());
231 $data = $this->cpHandler->execute();
232 if(!empty($data)){
233 return($data);
234 }
235 }
237 // Automatically disable pasting process since there is no entry left to paste.
238 if(!$this->cpHandler->entries_queued()){
239 $this->cpPastingStarted = FALSE;
240 }
241 return("");
242 }
245 /*! \brief Password change confirmed, now try to change the systems pwd.
246 */
247 function passwordChangeConfirmed()
248 {
249 $tDefs= $this->getObjectDefinitions();
250 $headpage = $this->getHeadpage();
251 $type = $headpage->getType($this->dn);
252 $entry = $headpage->getEntry($this->dn);
253 $ui = get_userinfo();
254 $smarty = get_smarty();
256 if(!in_array('FAKE_OC_PWD_changeAble', $entry['objectClass'])){
257 trigger_error("Tried to change pwd, for invalid object!");
258 }elseif ($_POST['new_password'] != $_POST['repeated_password']){
259 msg_dialog::display(_("Error"),
260 _("The passwords you've entered as 'New password' and 'Repeated password' do not match!"), ERROR_DIALOG);
261 return($smarty->fetch(get_template_path('password.tpl', TRUE)));
262 }else{
263 $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
264 $tabacl = $ui->get_permissions($this->dn,$acl,"userPassword");
266 // Check acls
267 if(!preg_match("/w/",$tabacl)){
268 msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
269 }else{
270 $ldap = $this->config->get_ldap_link();
271 $ldap->cd($this->dn);
272 $ldap->cat($this->dn);
273 $old_attrs = $ldap->fetch();
275 $attrs= array();
276 if ($_POST['new_password'] == ""){
278 /* Remove password attribute
279 */
280 if(in_array("simpleSecurityObject",$old_attrs['objectClass'])){
281 $attrs['objectClass'] = array();
282 for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
283 if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){
284 $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
285 }
286 }
287 }
288 $attrs['userPassword']= array();
289 } else {
291 /* Add/modify password attribute
292 */
293 if(!in_array("simpleSecurityObject",$old_attrs['objectClass'])){
294 $attrs['objectClass'] = array();
295 for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
296 $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
297 }
298 $attrs['objectClass'][] = "simpleSecurityObject";
299 }
301 if(class_available("passwordMethodCrypt")){
302 $pwd_m = new passwordMethodCrypt($this->config);
303 $pwd_m->set_hash("crypt/md5");
304 $attrs['userPassword'] = $pwd_m->generate_hash($_POST['new_password']);
305 }else{
306 msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password."));
307 $attrs = array();
308 }
309 }
310 $ldap->modify($attrs);
311 if (!$ldap->success()){
312 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type));
313 }else{
314 if(class_available($tDefs[$type]['plugClass'])){
315 $plug = $tDefs[$type]['plugClass'];
316 $p = new $plug($this->config,$this->dn);
317 $p->handle_post_events("modify");
318 }
319 }
320 new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error());
321 }
322 set_object_info();
323 }
324 }
327 /*! \brief The method gets called when somebody clicked the CD icon
328 * in the system listing.
329 * A confirmation will be shown to acknowledge the creation.
330 */
331 function createISO($action,$target)
332 {
333 if(count($target) == 1){
334 $smarty = get_smarty();
335 $this->dn= array_pop($target);
336 set_object_info($this->dn);
337 return ($smarty->fetch(get_template_path('goto/gencd.tpl', TRUE)));
339 }
340 }
343 /*! \brief Once the user has confirmed the ISO creation in 'createISO',
344 * this method gets called.
345 * An iFrame is shown which then used 'performIsoCreation' as contents.
346 */
347 function initiateISOcreation()
348 {
349 $smarty = get_smarty();
350 $smarty->assign("src", "?plug=".$_GET['plug']."&PerformIsoCreation");
351 return ($smarty->fetch(get_template_path('goto/gencd_frame.tpl', TRUE)));
352 }
355 /*! \brief ISO creation confirmed and iFrame is visible, now create the ISO
356 * and display the status to fill the iFrame.
357 */
358 function performIsoCreation()
359 {
360 $return_button = "<form method='get' action='main.php' target='_parent'>
361 <input type='submit' value='"._("Back")."'>
362 <input type='hidden' name='plug' value='".$_GET['plug']."'/>
363 </form>";
365 $dsc = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
367 /* Get and check command */
368 $command= $this->config->search("workgeneric", "SYSTEMISOHOOK",array('tabs'));
369 if (check_command($command)){
370 @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
372 /* Print out html introduction */
373 echo ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
374 <html>
375 <head>
376 <title></title>
377 <style type="text/css">@import url("themes/default/style.css");</style>
378 <script language="javascript" src="include/focus.js" type="text/javascript"></script>
379 </head>
380 <body style="background: none; margin:4px;" id="body" >
381 <pre>';
383 /* Open process handle and check if it is a valid process */
384 $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
385 if (is_resource($process)) {
386 fclose($pipes[0]);
388 /* Print out returned lines && write JS to scroll down each line */
389 while (!feof($pipes[1])){
390 $cur_dat = fgets($pipes[1], 1024);
391 echo $cur_dat;
392 echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
393 flush();
394 }
395 }
397 /* Get error string && close streams */
398 $buffer= stream_get_contents($pipes[2]);
400 fclose($pipes[1]);
401 fclose($pipes[2]);
402 echo "</pre>";
404 /* Check return code */
405 $ret= proc_close($process);
406 if ($ret != 0){
407 echo "<h1 style='color:red'>"._("Creating the image failed. Please see the report below.")."</h1>";
408 echo "<pre style='color:red'>$buffer</pre>";
409 }
410 echo $return_button."<br>";
411 } else {
412 $tmp= "<h1 style='color:red'>".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."</h1>";
413 echo $tmp;
414 echo $return_button."<br>";
415 }
417 /* Scroll down completly */
418 echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
419 echo '</body></html>';
420 flush();
421 exit;
422 }
425 /*! \brief Handle GOsa-si events
426 * All schedules and triggered events are handled here.
427 */
428 function handleEvent($action="",$target=array(),$all=array())
429 {
430 // Detect whether this event is scheduled or triggered.
431 $triggered = TRUE;
432 if(preg_match("/^S_/",$action)){
433 $triggered = FALSE;
434 }
436 // Detect triggere or scheduled actions
437 $headpage = $this->getHeadpage();
438 $event = preg_replace("/^[TS]_/","",$action);
439 if(preg_match("/^[TS]_/", $action)){
441 // Send special reinstall action for opsi hosts
442 if($event == "DaemonEvent_reinstall" && $this->si_active && $this->opsi){
443 foreach($target as $key => $dn){
444 $type = $headpage->getType($dn);
446 // Send Reinstall event for opsi hosts
447 if($type == "FAKE_OC_OpsiHost"){
448 $obj = $headpage->getEntry($dn);
449 $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]);
450 unset($target[$key]);
451 }
452 }
453 }
454 }
456 // Now send remaining FAI/GOsa-si events here.
457 if(count($target) && $this->si_active){
458 $mac= array();
460 // Collect target mac addresses
461 $ldap = $this->config->get_ldap_link();
462 $tD = $this->getObjectDefinitions();
463 $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
464 $o_queue = new gosaSupportDaemon();
465 foreach($target as $dn){
466 $type = $headpage->getType($dn);
467 if($tD[$type]['sendEvents']){
468 $obj = $headpage->getEntry($dn);
469 if(isset($obj['macAddress'][0])){
470 $mac[] = $obj['macAddress'][0];
471 }
472 }
473 }
475 /* Skip installation or update trigerred events,
476 * if this entry is currently processing.
477 */
478 if($triggered && in_array($event,array("DaemonEvent_reinstall","DaemonEvent_update"))){
479 foreach($mac as $key => $mac_address){
480 foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
481 $entry['STATUS'] = strtoupper($entry['STATUS']);
482 if($entry['STATUS'] == "PROCESSING" &&
483 isset($events['QUEUED'][$entry['HEADERTAG']]) &&
484 in_array($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
485 unset($mac[$key]);
487 new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
488 break;
489 }
490 }
491 }
492 }
494 // Prepare event to be added
495 if(count($mac) && isset($events['BY_CLASS'][$event]) && $this->si_active){
496 $event = $events['BY_CLASS'][$event];
497 $this->dialogObject = new $event['CLASS_NAME']($this->config);
498 $this->dialogObject->add_targets($mac);
500 if($triggered){
501 $this->dialogObject->set_type(TRIGGERED_EVENT);
502 $o_queue->append($this->dialogObject);
503 if($o_queue->is_error()){
504 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
505 }else{
506 $this->closeDialogs();
507 }
508 }else{
509 $this->dialogObject->set_type(SCHEDULED_EVENT);
510 }
511 }
512 }
513 }
516 /*! \brief Close all dialogs and reset the activationQueue.
517 */
518 function cancelEdit()
519 {
520 management::cancelEdit();
521 $this->activationQueue = array();
522 }
525 /*! \brief Save event dialogs.
526 * And append the new GOsa-si event.
527 */
528 function saveEventDialog()
529 {
530 $o_queue = new gosaSupportDaemon();
531 $o_queue->append($this->dialogObject);
532 if($o_queue->is_error()){
533 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
534 }else{
535 $this->closeDialogs();
536 }
537 }
540 /*! \brief Update filter part for INCOMING.
541 * Allows us to search for "systemIncomingRDN".
542 */
543 static function incomingFilterConverter($filter)
544 {
545 $rdn = preg_replace("/^[^=]*=/", "", get_ou('systemIncomingRDN'));
546 $rdn = preg_replace("/,.*$/","",$rdn);
547 return(preg_replace("/%systemIncomingRDN/", $rdn,$filter));
548 }
551 /*! \brief Queue selected objects to be removed.
552 * Checks ACLs, Locks and ask for confirmation.
553 */
554 protected function removeEntryRequested($action="",$target=array(),$all=array())
555 {
556 $disallowed = array();
557 $this->dns = array();
559 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel requested!");
561 // Check permissons for each target
562 $tInfo = $this->getObjectDefinitions();
563 $headpage = $this->getHeadpage();
564 foreach($target as $dn){
565 $type = $headpage->getType($dn);
566 if(!isset($tInfo[$type])){
567 trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
568 }else{
569 $info = $tInfo[$type];
570 $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
571 if(preg_match("/d/",$acl)){
572 $this->dns[] = $dn;
573 }else{
574 $disallowed[] = $dn;
575 }
576 }
577 }
578 if(count($disallowed)){
579 msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
580 }
582 // We've at least one entry to delete.
583 if(count($this->dns)){
585 // check locks
586 if ($user= get_multiple_locks($this->dns)){
587 return(gen_locked_message($user,$this->dns));
588 }
590 // Add locks
591 $dns_names = array();
592 foreach($this->dns as $dn){
593 $dns_names[] =LDAP::fix($dn);
594 }
595 add_lock ($this->dns, $this->ui->dn);
597 // Display confirmation dialog.
598 $smarty = get_smarty();
599 $smarty->assign("info", msgPool::deleteInfo($dns_names,_($this->objectName)));
600 $smarty->assign("multiple", true);
601 return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
602 }
603 }
606 /*! \brief Object removal was confirmed, now remove the requested entries.
607 *
608 * @param String 'action' The name of the action which was the used as trigger.
609 * @param Array 'target' A list of object dns, which should be affected by this method.
610 * @param Array 'all' A combination of both 'action' and 'target'.
611 */
612 function removeEntryConfirmed($action="",$target=array(),$all=array(),
613 $altTabClass="",$altTabType="",$altAclCategory="")
614 {
615 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel confirmed!");
617 // Check permissons for each target
618 $tInfo = $this->getObjectDefinitions();
619 $headpage = $this->getHeadpage();
620 $disallowed = array();
621 foreach($this->dns as $key => $dn){
622 $type = $headpage->getType($dn);
623 if(!isset($tInfo[$type])){
624 trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
625 }else{
627 $info = $tInfo[$type];
628 $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
629 if(preg_match("/d/",$acl)){
631 // Delete the object
632 $this->dn = $dn;
633 if($info['tabClass'] == "phonetabs"){
634 $this->tabObject= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $dn,$type);
635 $this->tabObject->set_acl_base($dn);
636 $this->tabObject->by_object['phoneGeneric']->remove_from_parent ();
637 }else{
638 $this->tabObject= new $info['tabClass']($this->config,$this->config->data['TABS'][$info['tabDesc']],
639 $this->dn, $info['aclCategory'], true, true);
640 $this->tabObject->set_acl_base($this->dn);
641 $this->tabObject->parent = &$this;
642 $this->tabObject->delete ();
643 }
645 // Remove the lock for the current object.
646 del_lock($this->dn);
648 }else{
649 $disallowed[] = $dn;
650 new log("security","system/".get_class($this),$dn,array(),"Tried to trick deletion.");
651 }
652 }
653 }
654 if(count($disallowed)){
655 msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
656 }
658 // Cleanup
659 $this->remove_lock();
660 $this->closeDialogs();
661 }
664 /*! \brief Edit the selected system type.
665 * NewDevice and ArpNewDevice are handled here separately
666 */
667 function editEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
668 {
669 if(count($target) == 1){
670 $tInfo = $this->getObjectDefinitions();
671 $headpage = $this->getHeadpage();
672 $dn = $target[0];
673 $type =$headpage->getType($dn);
674 $tData = $tInfo[$type];
676 if($type == "FAKE_OC_ArpNewDevice"){
677 if(!class_available("ArpNewDeviceTabs")){
678 msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG);
679 }else{
680 return(management::editEntry($action,$target,$all,"ArpNewDeviceTabs","ARPNEWDEVICETABS","incoming"));
681 }
682 }elseif($type == "FAKE_OC_NewDevice"){
683 if(!class_available("SelectDeviceType")){
684 msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG);
685 }else{
686 $this->activationQueue[$dn] = array();
687 $this->dialogObject = new SelectDeviceType($this->config,$dn);
688 $this->skipFooter = TRUE;
689 $this->displayApplyBtn = FALSE;
690 // see condition -$s_action == "::systemTypeChosen"- for further handling
691 }
692 }else{
693 return(management::editEntry($action,$target,$all,$tData['tabClass'],$tData['tabDesc'],$tData['aclCategory']));
694 }
695 }
696 }
699 /*! \brief Edit the selected system type.
700 *
701 * @param String 'action' The name of the action which was the used as trigger.
702 * @param Array 'target' A list of object dns, which should be affected by this method.
703 * @param Array 'all' A combination of both 'action' and 'target'.
704 */
705 function newEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
706 {
707 $tInfo = $this->getObjectDefinitions();
708 $info = preg_replace("/^new_/","",$action);
709 if(!isset($tInfo[$info])){
710 trigger_error("Unknown action type '".$action."' cant create a new system!");
711 }else{
712 return(management::newEntry($action,$target,$all,
713 $tInfo[$info]['tabClass'],
714 $tInfo[$info]['tabDesc'],
715 $tInfo[$info]['aclCategory']));
716 }
717 }
720 /*! \brief Activates all selcted 'NewDevices' at once.
721 * Enqueues the selected Devices in the activation queue.
722 */
723 function activateMultiple($action,$target)
724 {
725 $headpage = $this->getHeadpage();
726 foreach($target as $dn) {
727 if($headpage->getType($dn) == "FAKE_OC_NewDevice"){
728 $this->activationQueue[$dn] = array();
729 }
730 }
731 if(count($this->activationQueue)){
732 $this->dialogObject = new SelectDeviceType($this->config, array_keys($this->activationQueue));
733 $this->skipFooter = TRUE;
734 }
735 }
738 /*! \brief The system selection dialog was closed.
739 * We will now queue the given entry to be activated.
740 */
741 function systemTypeChosen()
742 {
743 // Detect the systems target type
744 $tInfo = $this->getObjectDefinitions();
745 $selected_group = "none";
746 if(isset($_POST['ObjectGroup'])){
747 $selected_group = $_POST['ObjectGroup'];
748 }
749 $selected_system = $_POST['SystemType'];
750 $tmp = array();
751 foreach($this->activationQueue as $dn => $data){
752 $tmp[$dn]['OG'] = $selected_group;
753 $tmp[$dn]['SS'] = $selected_system;
754 }
755 $this->closeDialogs();
756 $this->activationQueue = $tmp;
757 return($this->handleActivationQueue());
758 }
761 /*! \brief Activate queued goto systems.
762 */
763 function handleActivationQueue()
764 {
765 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
766 'Entries left: '.count($this->activationQueue), "<b>Handling system activation queue!</b>");
768 if(!count($this->activationQueue)) return("");
770 $ldap = $this->config->get_ldap_link();
771 $pInfo = $this->getObjectDefinitions();
772 $ui = get_userinfo();
773 $headpage = $this->getHeadpage();
774 $ldap->cd($this->config->current['BASE']);
776 // Walk through systems to activate
777 while(count($this->activationQueue)){
779 // Get next entry
780 reset($this->activationQueue);
781 $dn = key($this->activationQueue);
782 $data= $this->activationQueue[$dn];
784 // Validate the given system type.
785 if(!isset($data['SS'])) continue;
786 $sysType = $data['SS'];
787 if(!isset($pInfo[$sysType])){
788 trigger_error('Unknown type \''.$sysType.'\'!');
789 continue;
790 }
791 $type = $pInfo[$sysType];
793 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
794 $dn, "<b>Try to activate:</b>");
796 // Get target type definition
797 $plugClass = $type["plugClass"];
798 $tabClass = $type["tabClass"];
799 $aclCategory = $type["aclCategory"];
800 $tabDesc = $type["tabDesc"];
802 if(!class_available($tabClass)){
803 msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
804 unset($this->activationQueue[$dn]);
805 continue;
806 }else{
808 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
809 $sysType, "<b>System type:</b>");
811 // Load permissions for selected 'dn' and check if we're allowed to create this 'dn'
812 $this->dn = $dn;
813 $acls = $ui->get_permissions($this->dn,$aclCategory."/".$plugClass);
815 // Check permissions
816 if(!preg_match("/c/",$acls)){
817 unset($this->activationQueue[$dn]);
818 msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
820 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
821 $acls, "<b>Insufficient permissions!</b>");
822 continue;
823 }else{
825 // Open object an preset some values like the objects base
826 del_lock($dn);
827 management::editEntry('editEntry',array($dn),array(),$tabClass,$tabDesc, $aclCategory);
828 $this->displayApplyBtn = FALSE;
829 $this->tabObject->set_acl_base($headpage->getBase());
831 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
832 $data['OG'], "<b>Selected ogroup:</b>");
834 if($data['OG'] != "none"){
835 $this->tabObject->base = preg_replace("/^[^,]+,".preg_quote(get_ou('ogroupRDN'), '/')."/i", "", $data['OG']);
836 $this->tabObject->by_object[$plugClass]->baseSelector->setBase($this->tabObject->base);
837 } else {
838 $this->tabObject->by_object[$plugClass]->baseSelector->setBase($headpage->getBase());
839 $this->tabObject->base = $headpage->getBase();
840 }
842 // Assign some default values for opsi hosts
843 if($this->tabObject instanceOf opsi_tabs){
844 $ldap = $this->config->get_ldap_link();
845 $ldap->cat($dn);
846 $source_attrs = $ldap->fetch();
847 foreach(array("macAddress" => "mac" ,"cn" => "hostId","description" => "description") as $src => $attr){
848 if(isset($source_attrs[$src][0])){
849 $this->tabObject->by_object['opsiGeneric']->$attr = $source_attrs[$src][0];
850 }
851 }
852 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
853 "", "<b>OPSI attributes adapted</b>");
854 }
856 // Queue entry to be activated, when it is saved.
857 if($data['OG'] != "none"){
859 // Set gotoMode to active if there was an ogroup selected.
860 $found = false;
861 foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
862 if(isset($this->tabObject->by_object[$tab]->gotoMode)) {
863 $found = true;
864 $this->tabObject->by_object[$tab]->gotoMode = $value;
865 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
866 $tab."->gotoMode = {$value}", "<b>Setting gotoMode to: </b>");
867 }
868 }
869 if(!$found){
870 msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG);
871 }
873 // Update object group membership
874 $og = new ogroup($this->config,$data['OG']);
875 if($og){
876 $og->AddDelMembership($this->tabObject->dn);
877 $og->save();
878 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
879 $og->dn, "<b>Adding system to ogroup</b>");
880 }
882 // Set default system specific attributes
883 foreach (array("workgeneric", "termgeneric") as $cls){
884 if (isset($this->tabObject->by_object[$cls])){
885 $this->tabObject->by_object[$cls]->set_everything_to_inherited();
886 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
887 $og->dn, "<b>Calling {$cls}->set_everything_to_inherited()</b>");
888 }
889 }
891 // Enable activation
892 foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){
893 if (isset($this->tabObject->by_object[$cls])){
894 $this->tabObject->by_object[$cls]->auto_activate= TRUE;
895 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
896 $cls, "<b>Setting auto_activate=TRUE for</b>");
897 }
898 }
900 // Enable sending of LDAP events
901 if (isset($this->tabObject->by_object["workstartup"])){
902 $this->tabObject->by_object["workstartup"]->gotoLdap_inherit= TRUE;
903 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
904 "", "<b>Setting workstartup->gotoLdap_inherit=TRUE</b>");
905 }
906 }
908 // Try to inherit everythin from the selected object group and then save
909 // the entry, normally this should work without any problems.
910 // But if there is any, then display the dialogs.
911 if($data['OG'] != "none"){
912 $str = $this->saveChanges();
914 // There was a problem, skip activation here and allow to fix the problems..
915 if(is_object($this->tabObject)){
916 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
917 "", "<b>Automatic saving failed, let the user fix the issues now.</b>");
918 return;
919 }
920 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
921 "", "<b>System activated!</b>");
922 }else{
923 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
924 "", "<b>Open dialogs now</b>");
925 return;
926 }
927 }
928 }
929 }
930 }
933 /*! \brief Save object modifications here and any dialogs too.
934 * After a successfull update of the object data, close
935 * the dialogs.
936 */
937 protected function saveChanges()
938 {
939 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
940 get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Save</b>");
942 // Handle 'New Unknown Devices' here.
943 if($this->tabObject instanceOf ArpNewDeviceTabs){
944 $this->tabObject->save_object();
946 if($this->tabObject->by_object['ArpNewDevice']->gotoIntegration){
947 $message = $this->tabObject->check();
948 if(count($message)){
949 msg_dialog::displayChecks($message);
950 }else{
951 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
952 get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Queued for goto activation</b>");
953 $this->tabObject->save();
954 $this->activationQueue[$this->tabObject->dn]=array();
955 $this->closeDialogs();
956 $this->systemTypeChosen();
957 }
958 return;
959 }
960 }
962 // Try to save changes here.
963 $str = management::saveChanges();
964 if($this->tabObject) return("");
966 // Activate system if required..
967 if(isset($this->activationQueue[$this->last_dn])){
968 $dn = $this->last_tabObject->dn;
969 $this->activate_new_device($dn);
970 unset($this->activationQueue[$this->last_dn]);
971 }
973 /* Post handling for activated systems
974 target opsi -> Remove source.
975 target gosa -> Activate system.
976 */
977 if($this->last_tabObject instanceOf opsi_tabs){
978 $ldap = $this->config->get_ldap_link();
979 $ldap->cd($this->config->current['BASE']);
980 $ldap->rmdir ($this->last_tabObject->dn);
981 @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
982 "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
984 $hostId = $this->last_tabObject->by_object['opsiGeneric']->hostId;
985 $mac = $this->last_tabObject->by_object['opsiGeneric']->mac;
986 $this->opsi->job_opsi_activate_client($hostId,$mac);
988 }elseif(isset($this->last_tabObject->was_activated) && $this->last_tabObject->was_activated){
989 $this->activate_new_device($this->last_tabObject->dn);
990 }
992 // Avoid using values from an older input dialog
993 $_POST = array();
994 $this->handleActivationQueue();
995 }
998 /*! \brief Save object modifications here and any dialogs too.
999 * Keep dialogs opened.
1000 */
1001 protected function applyChanges()
1002 {
1003 $str = management::applyChanges();
1004 if($str) return($str);
1006 /* Post handling for activated systems
1007 target opsi -> Remove source.
1008 target gosa -> Activate system.
1009 */
1010 if($this->tabObject instanceOf opsi_tabs){
1011 $ldap = $this->config->get_ldap_link();
1012 $ldap->cd($this->config->current['BASE']);
1013 $ldap->rmdir ($this->tabObject->dn);
1014 @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
1015 "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
1017 $hostId = $this->tabObject->by_object['opsiGeneric']->hostId;
1018 $mac = $this->tabObject->by_object['opsiGeneric']->mac;
1019 $this->opsi->job_opsi_activate_client($hostId,$mac);
1021 }elseif(isset($this->tabObject->was_activated) && $this->tabObject->was_activated){
1022 $this->activate_new_device($this->tabObject->dn);
1023 }
1024 }
1027 /*! \brief Sets FAIstate to "install" for "New Devices".
1028 This function is some kind of "Post handler" for activated systems,
1029 it is called directly after the object (workstabs,servtabs) gets saved.
1030 @param String $dn The dn of the newly activated object.
1031 @return Boolean TRUE if activated else FALSE
1032 */
1033 function activate_new_device($dn)
1034 {
1035 // finally add entry to ogroup, with its new dn not the source dn with 'ou=incoming.'
1036 if(isset($this->activationQueue[$this->last_dn])){
1037 $data =$this->activationQueue[$this->last_dn];
1039 // Update object group membership
1040 $og = new ogroup($this->config,$data['OG']);
1041 if($og){
1042 $og->AddDelMembership($this->last_tabObject->dn);
1043 $og->save();
1044 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1045 $og->dn, "<b>Adding system to ogroup</b>");
1046 }
1047 }
1049 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1050 $dn, "<b>Activating system:</b>");
1051 $ldap = $this->config->get_ldap_link();
1052 $ldap->cd($this->config->current['BASE']);
1053 $ldap->cat($dn);
1054 if($ldap->count()){
1055 $attrs = $ldap->fetch();
1056 if(count(array_intersect(array('goServer','gotoWorkstation'), $attrs['objectClass']))){
1057 $ocs = $attrs['objectClass'];
1058 unset($ocs['count']);
1059 $new_attrs = array();
1060 if(!in_array("FAIobject",$ocs)){
1061 $ocs[] = "FAIobject";
1062 $new_attrs['objectClass'] = $ocs;
1063 }
1064 $new_attrs['FAIstate'] = "install";
1065 $ldap->cd($dn);
1066 $ldap->modify($new_attrs);
1067 if (!$ldap->success()){
1068 msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn,
1069 LDAP_MOD, "activate_new_device($dn)"));
1070 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1071 $dn, "<b>Failed!</b>");
1072 }else{
1073 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1074 $dn, "<b>Success</b>");
1075 return(TRUE);
1076 }
1077 }else{
1078 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
1079 $dn, "<b>FAIstate not set to install, this is only done for gotoWorkstation/goServer!</b>");
1080 }
1081 }
1082 return(FALSE);
1083 }
1086 /*! \brief Opens the snapshot creation dialog for the given target.
1087 *
1088 * @param String 'action' The name of the action which was the used as trigger.
1089 * @param Array 'target' A list of object dns, which should be affected by this method.
1090 * @param Array 'all' A combination of both 'action' and 'target'.
1091 */
1092 function createSnapshotDialog($action="",$target=array(),$all=array())
1093 {
1094 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Snaptshot creation initiated!");
1096 $pInfo = $this->getObjectDefinitions();
1097 $headpage = $this->getHeadpage();
1098 foreach($target as $dn){
1100 $entry = $headpage->getEntry($dn);
1101 $type = $headpage->getType($dn);
1102 if(!isset($pInfo[$type])) {
1103 trigger_error('Unknown system type \''.$type.'\'!');
1104 return;
1105 }
1107 if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
1108 $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
1109 $this->dialogObject->aclCategories = array($pInfo[$type]['aclCategory']);
1110 $this->dialogObject->parent = &$this;
1112 }else{
1113 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to create a snapshot for %s."),$dn),
1114 ERROR_DIALOG);
1115 }
1116 }
1117 }
1120 /*! \brief Displays the "Restore snapshot dialog" for a given target.
1121 * If no target is specified, open the restore removed object
1122 * dialog.
1123 * @param String 'action' The name of the action which was the used as trigger.
1124 * @param Array 'target' A list of object dns, which should be affected by this method.
1125 * @param Array 'all' A combination of both 'action' and 'target'.
1126 */
1127 function restoreSnapshotDialog($action="",$target=array(),$all=array())
1128 {
1129 // Set current restore base for snapshot handling.
1130 $headpage = $this->getHeadpage();
1131 $pInfo = $this->getObjectDefinitions();
1132 if(is_object($this->snapHandler)){
1133 $bases = array();
1134 foreach($this->storagePoints as $sp){
1135 $bases[] = $sp.$headpage->getBase();
1136 }
1137 }
1139 // No bases specified? Try base
1140 if(!count($bases)) $bases[] = $this->headpage->getBase();
1142 // No target, open the restore removed object dialog.
1143 if(!count($target)){
1145 $cats = array();
1146 foreach($pInfo as $data){
1147 $cats[] = $data['aclCategory'];
1148 }
1149 $cats = array_unique($cats);
1151 $entry = $headpage->getBase();
1152 if(!empty($entry) && $this->ui->allow_snapshot_restore($entry,$cats)){
1153 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$entry,"Snaptshot restoring initiated!");
1154 $this->dialogObject = new SnapShotDialog($this->config,$entry,$this);
1155 $this->dialogObject->set_snapshot_bases($bases);
1156 $this->dialogObject->display_all_removed_objects = true;
1157 $this->dialogObject->display_restore_dialog = true;
1158 $this->dialogObject->parent = &$this;
1159 }else{
1160 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$entry),
1161 ERROR_DIALOG);
1162 }
1163 }else{
1165 // Display the restore points for a given object.
1166 $dn = array_pop($target);
1167 $entry = $headpage->getEntry($dn);
1168 $type = $headpage->getType($dn);
1169 if(!isset($pInfo[$type])) {
1170 trigger_error('Unknown system type \''.$type.'\'!');
1171 return;
1172 }
1174 if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
1175 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restoring initiated!");
1176 $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
1177 $this->dialogObject->set_snapshot_bases($bases);
1178 $this->dialogObject->display_restore_dialog = true;
1179 $this->dialogObject->parent = &$this;
1180 }else{
1181 msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$dn),
1182 ERROR_DIALOG);
1183 }
1184 }
1185 }
1188 /*! \brief Restores a snapshot object.
1189 * The dn of the snapshot entry has to be given as ['target'] parameter.
1190 *
1191 * @param String 'action' The name of the action which was the used as trigger.
1192 * @param Array 'target' A list of object dns, which should be affected by this method.
1193 * @param Array 'all' A combination of both 'action' and 'target'.
1194 */
1195 function restoreSnapshot($action="",$target=array(),$all=array())
1196 {
1197 $dn = array_pop($target);
1198 $this->snapHandler->restore_snapshot($dn);
1199 @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restored!");
1200 $this->closeDialogs();
1201 }
1204 /*! \brief Detects actions/events send by the ui
1205 * and the corresponding targets.
1206 */
1207 function detectPostActions()
1208 {
1209 $action= management::detectPostActions();
1210 if(isset($_POST['abort_event_dialog'])) $action['action'] = "cancel";
1211 if(isset($_POST['save_event_dialog'])) $action['action'] = "saveEvent";
1212 if(isset($_POST['cd_create'])) $action['action'] = "initiateISOcreation";
1213 if(isset($_GET['PerformIsoCreation'])) $action['action'] = "performIsoCreation";
1214 if(isset($_POST['SystemTypeAborted'])) $action['action'] = "cancel";
1215 if(isset($_POST['password_cancel'])) $action['action'] = "cancel";
1216 if(isset($_POST['password_finish'])) $action['action'] = "passwordChangeConfirmed";
1218 if(isset($_POST['new_goServer'])) $action['action'] = "new_goServer";
1219 if(isset($_POST['new_gotoWorkstation'])) $action['action'] = "new_gotoWorkstation";
1220 if(isset($_POST['new_gotoTerminal'])) $action['action'] = "new_gotoTerminal";
1221 if(isset($_POST['new_gotoPrinter'])) $action['action'] = "new_gotoPrinter";
1222 if(isset($_POST['new_goFonHardware'])) $action['action'] = "new_goFonHardware";
1223 if(isset($_POST['new_ieee802Device'])) $action['action'] = "new_ieee802Device";
1224 if(isset($_POST['new_FAKE_OC_OpsiHost'])) $action['action'] = "new_FAKE_OC_OpsiHost";
1226 if(!is_object($this->tabObject) && !is_object($this->dialogObject)){
1227 if(count($this->activationQueue)) $action['action'] = "handleActivationQueue";
1228 }
1230 if(isset($_POST['systemTypeChosen'])) $action['action'] = "systemTypeChosen";
1232 return($action);
1233 }
1236 /*! \brief Overridden render method of class management.
1237 * this allows us to add a release selection box.
1238 */
1239 function renderList()
1240 {
1241 $headpage = $this->getHeadpage();
1242 $headpage->update();
1244 $tD = $this->getObjectDefinitions();
1245 $smarty = get_smarty();
1246 foreach($tD as $name => $obj){
1247 $smarty->assign("USE_".$name, (empty($obj['TABNAME']) || class_available($obj['TABNAME'])));
1248 }
1250 $display = $headpage->render();
1251 return($this->getHeader().$display);
1252 }
1255 public function getObjectDefinitions()
1256 {
1257 $tabs = array(
1258 "FAKE_OC_OpsiHost" => array(
1259 "ou" => "",
1260 "plugClass" => "opsiGeneric",
1261 "tabClass" => "opsi_tabs",
1262 "tabDesc" => "OPSITABS",
1263 "aclClass" => "opsiGeneric",
1264 "sendEvents" => TRUE,
1265 "aclCategory" => "opsi"),
1267 "goServer" => array(
1268 "ou" => get_ou('serverRDN'),
1269 "plugClass" => "servgeneric",
1270 "tabClass" => "servtabs",
1271 "tabDesc" => "SERVTABS",
1272 "aclClass" => "servgeneric",
1273 "sendEvents" => TRUE,
1274 "aclCategory" => "server"),
1276 "gotoWorkstation" => array(
1277 "ou" => get_ou('workstationRDN'),
1278 "plugClass" => "workgeneric",
1279 "tabClass" => "worktabs",
1280 "tabDesc" => "WORKTABS",
1281 "aclClass" => "workgeneric",
1282 "sendEvents" => TRUE,
1283 "aclCategory" => "workstation"),
1285 "gotoTerminal" => array(
1286 "ou" => get_ou('terminalRDN'),
1287 "plugClass" => "termgeneric",
1288 "tabClass" => "termtabs",
1289 "sendEvents" => TRUE,
1290 "tabDesc" => "TERMTABS",
1291 "aclClass" => "termgeneric",
1292 "aclCategory" => "terminal"),
1294 "gotoPrinter" => array(
1295 "ou" => get_ou('printerRDN'),
1296 "plugClass" => "printgeneric",
1297 "tabClass" => "printtabs",
1298 "tabDesc" => "PRINTTABS",
1299 "aclClass" => "printgeneric",
1300 "sendEvents" => FALSE,
1301 "aclCategory" => "printer"),
1303 "FAKE_OC_NewDevice" => array(
1304 "ou" => get_ou('systemIncomingRDN'),
1305 "plugClass" => "termgeneric",
1306 "tabClass" => "termtabs",
1307 "sendEvents" => TRUE,
1308 "tabDesc" => "TERMTABS",
1309 "aclClass" => "termgeneric",
1310 "aclCategory" => "terminal"),
1312 "goFonHardware" => array(
1313 "ou" => get_ou('phoneRDN'),
1314 "plugClass" => "phoneGeneric",
1315 "tabClass" => "phonetabs",
1316 "tabDesc" => "PHONETABS",
1317 "sendEvents" => FALSE,
1318 "aclClass" => "phoneGeneric",
1319 "aclCategory" => "phone"),
1321 "FAKE_OC_winstation" => array(
1322 "ou" => get_winstations_ou(),
1323 "plugClass" => "wingeneric",
1324 "sendEvents" => TRUE,
1325 "tabClass" => "wintabs",
1326 "tabDesc" => "WINTABS",
1327 "aclClass" => "wingeneric",
1328 "aclCategory" => "winworkstation"),
1330 "ieee802Device" => array(
1331 "ou" => get_ou('componentRDN'),
1332 "plugClass" => "componentGeneric",
1333 "sendEvents" => FALSE,
1334 "tabClass" => "componenttabs",
1335 "tabDesc" => "COMPONENTTABS",
1336 "aclClass" => "componentGeneric",
1337 "aclCategory" => "component"),
1338 );
1340 // Now map some special types
1341 $tabs['FAKE_OC_NewWorkstation'] = &$tabs['gotoWorkstation'];
1342 $tabs['FAKE_OC_NewTerminal'] = &$tabs['gotoTerminal'];
1343 $tabs['FAKE_OC_NewServer'] = &$tabs['gotoWorkstation'];
1344 $tabs['gotoWorkstation__IS_BUSY'] = &$tabs['gotoWorkstation'];
1345 $tabs['gotoWorkstation__IS_ERROR'] = &$tabs['gotoWorkstation'];
1346 $tabs['gotoWorkstation__IS_LOCKED'] = &$tabs['gotoWorkstation'];
1347 $tabs['gotoTerminal__IS_BUSY'] = &$tabs['gotoTerminal'];
1348 $tabs['gotoTerminal__IS_ERROR'] = &$tabs['gotoTerminal'];
1349 $tabs['gotoTerminal__IS_LOCKED'] = &$tabs['gotoTerminal'];
1350 $tabs['FAKE_OC_TerminalTemplate'] = &$tabs['gotoTerminal'];
1351 $tabs['FAKE_OC_WorkstationTemplate'] = &$tabs['gotoTerminal'];
1352 $tabs['goServer__IS_BUSY'] = &$tabs['goServer'];
1353 $tabs['goServer__IS_ERROR'] = &$tabs['goServer'];
1354 $tabs['goServer__IS_LOCKED'] = &$tabs['goServer'];
1356 $tabs['FAKE_OC_ArpNewDevice'] = &$tabs['FAKE_OC_NewDevice'];
1358 return($tabs);
1359 }
1362 static function systemRelease($a,$b,$c,$objectclasses= null,$class= null)
1363 {
1364 global $config;
1366 // No objectclasses set - go ahead
1367 if(!$objectclasses) return(" ");
1369 // Skip non fai objects
1370 if (!in_array_ics("FAIobject", $objectclasses)) {
1371 return " ";
1372 }
1374 // If we've an own fai class, just use this
1375 if ($class && is_array($class)) {
1376 foreach (explode(' ', $class[0]) as $element) {
1377 if ($element[0] == ":") {
1378 return " <img class='center' src='images/empty.png'> ".mb_substr($element, 1);
1379 }
1380 }
1381 }
1383 // Load information if needed
1384 $ldap = $config->get_ldap_link();
1385 $ldap->cd($config->current['BASE']);
1386 $ldap->search("(&(objectClass=gosaGroupOfNames)(FAIclass=*)(member=".$b."))",array('FAIclass','cn'));
1387 while($attrs = $ldap->fetch()){
1388 $rel = preg_replace("/^.*:/","",$attrs['FAIclass'][0]);
1389 $sys = sprintf(_("Inherited from %s"),$attrs['cn'][0]);
1390 $str = " <img class='center' src='plugins/ogroups/images/ogroup.png'
1391 title='".$sys."'
1392 alt='".$sys."' > ".$rel;
1393 return($str);
1394 }
1396 return(" ");
1397 }
1400 /*! \brief !! Incoming dummy acls, required to defined acls for incoming objects
1401 */
1402 static function plInfo()
1403 {
1404 return (array(
1405 "plShortName" => _("Incoming objects"),
1406 "plDescription" => _("Incoming objects"),
1407 "plSelfModify" => FALSE,
1408 "plDepends" => array(),
1409 "plPriority" => 99,
1410 "plSection" => array("administration"),
1411 "plCategory" => array("incoming" => array( "description" => _("Incoming"),
1412 "objectClass" => "")),
1413 "plProvidedAcls"=> array()
1414 ));
1415 }
1416 }
1417 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1418 ?>