diff --git a/gosa-plugins/systems/admin/systems/class_systemManagement.inc b/gosa-plugins/systems/admin/systems/class_systemManagement.inc
index 1859951cf1bfd276d6ed46be135c95ae00af43f3..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");
- // Build headpage
- $headpage = new listing(get_template_path("system-list.xml", true));
- $headpage->setFilter($filter);
+ // 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);
+ }
- $filter->setConverter('INCOMING', 'systemManagement::incomingFilterConverter');
+ // 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");
+ }
- // Add copy&paste and snapshot handler.
- if ($this->config->boolValueIsTrue("main", "copyPaste")){
- $this->cpHandler = new CopyPasteHandler($this->config);
+ // Check if we are able to communicate with the GOsa supprot daemon
+ if(class_available("opsi")){
+ $this->opsi = new opsi($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".
}
+ /*! \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){
}
+ /*! \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.
"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"),
"tabClass" => "printtabs",
"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",