diff --git a/gosa-plugins/systems/admin/systems/class_systemManagement.inc b/gosa-plugins/systems/admin/systems/class_systemManagement.inc
index 3845cef7b06118c69a13bf3846ea06d7711fdab2..aecf4289d509dd112f4f52575a83097d7ebbfa20 100644 (file)
}
$this->storagePoints = array_unique($sP);
-# // Build filter
+ // Build filter
# if (session::global_is_set(get_class($this)."_filter")){
# $filter= session::global_get(get_class($this)."_filter");
# } else {
- $filter = new filter(get_template_path("system-filter.xml", true));
- $filter->setObjectStorage($this->storagePoints);
+ $filter = new filter(get_template_path("system-filter.xml", true));
+ $filter->setObjectStorage($this->storagePoints);
# }
- $this->setFilter($filter);
+ $this->setFilter($filter);
+
+ // Build headpage
+ $headpage = new listing(get_template_path("system-list.xml", true));
+ $headpage->setFilter($filter);
+ $filter->setConverter('INCOMING', 'systemManagement::incomingFilterConverter');
+
+ // Register Daemon Events
+ if(class_available("DaemonEvent") && class_available("gosaSupportDaemon")){
+ $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);
+ foreach($events['TRIGGERED'] as $name => $data){
+ $this->registerAction("T_".$name,"handleEvent");
+ $this->registerAction("S_".$name,"handleEvent");
+ }
+ $this->registerAction("DaemonEvent_activate","handleEvent");
+ }
+ $this->registerAction("saveEvent","saveEventDialog");
+
+ // Add copy&paste and snapshot handler.
+ if ($this->config->boolValueIsTrue("main", "copyPaste")){
+ $this->cpHandler = new CopyPasteHandler($this->config);
+ }
+ if($this->config->get_cfg_value("enableSnapshots") == "true"){
+ $this->snapHandler = new SnapshotHandler($this->config);
+ }
- // Build headpage
- $headpage = new listing(get_template_path("system-list.xml", true));
- $headpage->setFilter($filter);
+ // Check if we are able to communicate with the GOsa supprot daemon
+ if(class_available("gosaSupportDaemon")){
+ $o = new gosaSupportDaemon();
+ $this->si_active = $o->connect() && class_available("DaemonEvent");
+ }
+
+ // Check if we are able to communicate with the GOsa supprot daemon
+ if(class_available("opsi")){
+ $this->opsi = new opsi($this->config);
+ }
- $filter->setConverter('INCOMING', 'systemManagement::incomingFilterConverter');
- // Add copy&paste and snapshot handler.
- if ($this->config->boolValueIsTrue("main", "copyPaste")){
- $this->cpHandler = new CopyPasteHandler($this->config);
+ parent::__construct($config, $ui, "systems", $headpage);
}
- if($this->config->get_cfg_value("enableSnapshots") == "true"){
- $this->snapHandler = new SnapshotHandler($this->config);
+
+
+ /*! \brief Handle GOsa-si events
+ * All events are handled here.
+ */
+ function handleEvent($action="",$target=array(),$all=array())
+ {
+ // Detect whether this event is scheduled or triggered.
+ $triggered = TRUE;
+ if(preg_match("/^S_/",$action)){
+ $triggered = FALSE;
+ }
+
+ // Detect triggere or scheduled actions
+ $headpage = $this->getHeadpage();
+ if(preg_match("/^[TS]_/", $action)){
+
+ // Send special reinstall action for opsi hosts
+ $event = preg_replace("/^[TS]_/","",$action);
+ if($event == "DaemonEvent_reinstall" && $this->si_active && $this->opsi){
+ foreach($target as $key => $dn){
+ $type = $headpage->getType($dn);
+
+ // Send Reinstall event for opsi hosts
+ if($type == "FAKE_OC_OpsiHost"){
+ $obj = $headpage->getEntry($dn);
+ $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]);
+ unset($target[$key]);
+ }
+ }
+ }
+ }
+
+ // Now send remaining FAI/GOsa-si events here.
+ if(count($target) && $this->si_active){
+ $mac= array();
+
+ // Collect target mac addresses
+ $ldap = $this->config->get_ldap_link();
+ $tD = $this->getObjectDefinitions();
+ $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
+ $o_queue = new gosaSupportDaemon();
+ foreach($target as $dn){
+ $type = $headpage->getType($dn);
+ if($tD[$type]['sendEvents']){
+ $obj = $headpage->getEntry($dn);
+ if(isset($obj['macAddress'][0])){
+ $mac[] = $obj['macAddress'][0];
+ }
+ }
+ }
+
+ /* Skip installation or update trigerred events,
+ * if this entry is currently processing.
+ */
+ if($triggered && in_array($event,array("DaemonEvent_reinstall","DaemonEvent_update"))){
+ foreach($mac as $key => $mac_address){
+ foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
+ $entry['STATUS'] = strtoupper($entry['STATUS']);
+ if($entry['STATUS'] == "PROCESSING" &&
+ isset($events['QUEUED'][$entry['HEADERTAG']]) &&
+ in_array($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
+ unset($mac[$key]);
+
+ new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
+ break;
+ }
+ }
+ }
+ }
+
+ // Prepare event to be added
+ if(count($mac) && isset($events['BY_CLASS'][$event]) && $this->si_active){
+ $event = $events['BY_CLASS'][$event];
+ $this->dialogObject = new $event['CLASS_NAME']($this->config);
+ $this->dialogObject->add_targets($mac);
+
+ if($triggered){
+ $this->dialogObject->set_type(TRIGGERED_EVENT);
+ $o_queue->append($this->dialogObject);
+ if($o_queue->is_error()){
+ msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+ }else{
+ $this->closeDialogs();
+ }
+ }else{
+ $this->dialogObject->set_type(SCHEDULED_EVENT);
+ }
+ }
+ }
+
+ // Handle system activation
+ if($action == "DaemonEvent_activate"){
+ echo "Aktivieren!";
+ }
}
- parent::__construct($config, $ui, "systems", $headpage);
+
+
+ function saveEventDialog()
+ {
+ $o_queue = new gosaSupportDaemon();
+ $o_queue->append($this->dialogObject);
+ if($o_queue->is_error()){
+ msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+ }else{
+ $this->closeDialogs();
+ }
+
}
+
+ /*! \brief Update filter part for INCOMING.
+ * Allows us to search for "systemIncomingRDN".
+ */
static function incomingFilterConverter($filter)
{
$rdn = preg_replace("/^[^=]*=/", "", get_ou('systemIncomingRDN'));
return(preg_replace("/%systemIncomingRDN/", $rdn,$filter));
}
- function editEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
+
+ /*! \brief Queue selected objects to be removed.
+ * Checks ACLs, Locks and ask for confirmation.
+ */
+ protected function removeEntryRequested($action="",$target=array(),$all=array())
{
+ $disallowed = array();
+ $this->dns = array();
+
+ @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel requested!");
+
+ // Check permissons for each target
+ $tInfo = $this->getObjectDefinitions();
$headpage = $this->getHeadpage();
- foreach($target as $id){
- $type = $headpage->getType($id);
- echo $type."<br>";
+ foreach($target as $dn){
+ $type = $headpage->getType($dn);
+ if(!isset($tInfo[$type])){
+ trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
+ }else{
+ $info = $tInfo[$type];
+ $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
+ if(preg_match("/d/",$acl)){
+ $this->dns[] = $dn;
+ }else{
+ $disallowed[] = $dn;
+ }
+ }
+ }
+ if(count($disallowed)){
+ msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
+ }
+
+ // We've at least one entry to delete.
+ if(count($this->dns)){
+
+ // check locks
+ if ($user= get_multiple_locks($this->dns)){
+ return(gen_locked_message($user,$this->dns));
+ }
+
+ // Add locks
+ $dns_names = array();
+ foreach($this->dns as $dn){
+ $dns_names[] =LDAP::fix($dn);
+ }
+ add_lock ($this->dns, $this->ui->dn);
+
+ // Display confirmation dialog.
+ $smarty = get_smarty();
+ $smarty->assign("info", msgPool::deleteInfo($dns_names,_($this->objectName)));
+ $smarty->assign("multiple", true);
+ return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
}
}
+ /*! \brief Object removal was confirmed, now remove the requested entries.
+ *
+ * @param String 'action' The name of the action which was the used as trigger.
+ * @param Array 'target' A list of object dns, which should be affected by this method.
+ * @param Array 'all' A combination of both 'action' and 'target'.
+ */
+ function removeEntryConfirmed($action="",$target=array(),$all=array(),
+ $altTabClass="",$altTabType="",$altAclCategory="")
+ {
+ @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel confirmed!");
+
+ // Check permissons for each target
+ $tInfo = $this->getObjectDefinitions();
+ $headpage = $this->getHeadpage();
+ $disallowed = array();
+ foreach($this->dns as $key => $dn){
+ $type = $headpage->getType($dn);
+ if(!isset($tInfo[$type])){
+ trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
+ }else{
+
+ $info = $tInfo[$type];
+ $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
+ if(preg_match("/d/",$acl)){
+
+ // Delete the object
+ $this->dn = $dn;
+ $this->tabObject= new $info['tabClass']($this->config,$this->config->data['TABS'][$info['tabDesc']],
+ $this->dn, $info['aclCategory'], true, true);
+ $this->tabObject->set_acl_base($this->dn);
+ $this->tabObject->parent = &$this;
+ $this->tabObject->delete ();
+
+ // Remove the lock for the current object.
+ del_lock($this->dn);
+
+ }else{
+ $disallowed[] = $dn;
+ new log("security","groups/".get_class($this),$dn,array(),"Tried to trick deletion.");
+ }
+ }
+ }
+ if(count($disallowed)){
+ msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
+ }
+
+ // Cleanup
+ $this->remove_lock();
+ $this->closeDialogs();
+ }
+
+
+ /*! \brief Edit the selected system type.
+ *
+ * @param String 'action' The name of the action which was the used as trigger.
+ * @param Array 'target' A list of object dns, which should be affected by this method.
+ * @param Array 'all' A combination of both 'action' and 'target'.
+ */
+ function editEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
+ {
+ if(count($target) == 1){
+ $tInfo = $this->getObjectDefinitions();
+ $headpage = $this->getHeadpage();
+ $dn = $target[0];
+ $type = $tInfo[$headpage->getType($dn)];
+ return(management::editEntry($action,$target,$all,$type['tabClass'],$type['tabDesc'],$type['aclCategory']));
+ }
+ }
+
+
+ /*! \brief Detects actions/events send by the ui
+ * and the corresponding targets.
+ */
+ function detectPostActions()
+ {
+ $action= management::detectPostActions();
+ if(isset($_POST['abort_event_dialog'])) $action['action'] = "cancel";
+ if(isset($_POST['save_event_dialog'])) $action['action'] = "saveEvent";
+ return($action);
+ }
+
/*! \brief Overridden render method of class mangement.
* this allows us to add a release selection box.
public function getObjectDefinitions()
{
-
-# "workstation" => array(
-# "RDN" => get_ou('workstationRDN'),
-# "CLASS" => "WORKTABS",
-# "TABNAME" => "workgeneric",
-# "TABCLASS"=> "worktabs",
-# "ACLC" => "workstation",
-# "ACL" => "workstation/workgeneric" ),
-
-
$tabs = array(
"FAKE_OC_OpsiHost" => array(
"ou" => "",
"tabClass" => "opsi_tabs",
"tabDesc" => "OPSITABS",
"aclClass" => "opsiGeneric",
+ "sendEvents" => TRUE,
"aclCategory" => "opsi"),
"goServer" => array(
"tabClass" => "servtabs",
"tabDesc" => "SERVTABS",
"aclClass" => "servgeneric",
+ "sendEvents" => TRUE,
"aclCategory" => "server"),
"gotoWorkstation" => array(
"tabClass" => "worktabs",
"tabDesc" => "WORKTABS",
"aclClass" => "workstation",
+ "sendEvents" => TRUE,
"aclCategory" => "workgeneric"),
"gotoTerminal" => array(
"ou" => get_ou('terminalRDN'),
"plugClass" => "termgeneric",
"tabClass" => "termtabs",
+ "sendEvents" => TRUE,
"tabDesc" => "TERMTABS",
"aclClass" => "terminal",
"aclCategory" => "termgeneric"),
"ou" => get_ou('printerRDN'),
"plugClass" => "printgeneric",
"tabClass" => "printtabs",
- "tabDesc" => "PRINTABS",
+ "tabDesc" => "PRINTTABS",
"aclClass" => "printer",
+ "sendEvents" => FALSE,
"aclCategory" => "printgeneric"),
"FAKE_OC_NewDevice" => array(
"ou" => get_ou('systemIncomingRDN'),
"plugClass" => "termgeneric",
"tabClass" => "termtabs",
+ "sendEvents" => TRUE,
"tabDesc" => "TERMTABS",
"aclClass" => "terminal",
"aclCategory" => "termgeneric"),
"plugClass" => "phoneGeneric",
"tabClass" => "phonetabs",
"tabDesc" => "PHONETABS",
+ "sendEvents" => FALSE,
"aclClass" => "phone",
"aclCategory" => "phoneGeneric"),
"FAKE_OC_winstation" => array(
"ou" => get_winstations_ou(),
"plugClass" => "wingeneric",
+ "sendEvents" => TRUE,
"tabClass" => "wintabs",
"tabDesc" => "WINTABS",
"aclClass" => "wingeneric",
"ieee802Device" => array(
"ou" => get_ou('componentRDN'),
"plugClass" => "componentGeneric",
+ "sendEvents" => FALSE,
"tabClass" => "componenttabs",
"tabDesc" => "COMPONENTTABS",
"aclClass" => "componentGeneric",
$tabs['gotoTerminal__IS_LOCKED'] = &$tabs['gotoTerminal'];
$tabs['goServer__IS_BUSY'] = &$tabs['goServer'];
$tabs['goServer__IS_ERROR'] = &$tabs['goServer'];
- $tabs['goServer__ISLOCKED'] = &$tabs['goServer'];
+ $tabs['goServer__IS_LOCKED'] = &$tabs['goServer'];
$tabs['FAKE_OC_NewUnknownDevice'] = &$tabs['FAKE_OC_NewDevice'];