X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-plugins%2Fsystems%2Fadmin%2Fsystems%2Fclass_systemManagement.inc;h=e6423173c36b632761505afbc960f606f857ac91;hb=a4a0b280fb17abb0861596cb6720f6b5b01aa71e;hp=36f11ef485ebe0c26dee772620b125f1eb3f797e;hpb=891251e624c9021bdb30782c574cc6e4df3050aa;p=gosa.git diff --git a/gosa-plugins/systems/admin/systems/class_systemManagement.inc b/gosa-plugins/systems/admin/systems/class_systemManagement.inc index 36f11ef48..e6423173c 100644 --- a/gosa-plugins/systems/admin/systems/class_systemManagement.inc +++ b/gosa-plugins/systems/admin/systems/class_systemManagement.inc @@ -48,6 +48,8 @@ class systems extends plugin var $acl_module = array("incoming","terminal","workstation","server","printer","phone","winworkstation","component"); + var $opsi = NULL; + function systems (&$config, $ui) { /* Save configuration for internal use */ @@ -60,11 +62,8 @@ class systems extends plugin $this->fai_activated = TRUE; } - /* Creat dialog object */ - $this->DivListSystem = new divListSystem($this->config,$this); - /* Copy & Paste enabled ?*/ - if((isset($this->config->data['MAIN']['ENABLECOPYPASTE']))&&(preg_match("/true/i",$this->config->data['MAIN']['ENABLECOPYPASTE']))){ + if ($this->config->get_cfg_value("copyPaste") == "true"){ $this->CopyPasteHandler = new CopyPasteHandler($this->config); } @@ -79,6 +78,15 @@ class systems extends plugin $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); + } + + /* Creat dialog object */ + $this->DivListSystem = new divListSystem($this->config,$this); } @@ -213,7 +221,7 @@ class systems extends plugin ********************/ if ($s_action=="gen_cd"){ $this->dn= $this->terminals[$s_entry]['dn']; - session::set('objectinfo',$this->dn); + set_object_info($this->dn); return ($smarty->fetch(get_template_path('gencd.tpl', TRUE))); } @@ -235,7 +243,7 @@ class systems extends plugin $dsc = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w")); /* Get and check command */ - $command= $this->config->search("workgeneric", "ISOCMD",array('tabs')); + $command= $this->config->search("workgeneric", "SYSTEMISOHOOK",array('tabs')); if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -297,20 +305,23 @@ class systems extends plugin /******************** - New Device hanlding (Ogroup/System select dialog.) + New Device handling (Ogroup/System select dialog.) ********************/ + /* All objects that have to be activated are listed in + $this->system_activation_object[] = "dn"; + + If there is an object group selected we simply adopt all + settings from these group and then directly save the entry again. + If no object group was selected, then we keep the "edit" dialog of + the target system opened to allow to edit the objects attributes. + */ + if($s_action == "SelectedSystemType"){ /* Possible destination system types */ - $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", - "TABCLASS" =>"termtabs", "ACL"=> "terminal"), - "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", - "TABCLASS" =>"worktabs", "ACL"=> "workstation"), - "server" => array("CLASS"=>"SERVTABS", "TABNAME"=>"servgeneric", - "TABCLASS" =>"servtabs", "ACL"=> "server")); + $tabs = $this->get_tab_defs(); /* Remember dialog selection. */ @@ -326,14 +337,16 @@ class systems extends plugin $class = $tabs[$selected_system]["CLASS"]; $tabname = $tabs[$selected_system]["TABNAME"]; $tabclass = $tabs[$selected_system]["TABCLASS"]; - $acl_cat = $tabs[$selected_system]["ACL"]; + $acl_cat = $tabs[$selected_system]["ACLC"]; if(!class_available($tabclass)){ msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG); }else{ - /* Go through all objects that should be activated */ + /* Go through all objects that should be activated + Contains alls object dns that have to be activated ("New Devices" not unknown) + */ foreach($this->system_activation_object as $key => $dn){ /* Remove entry from list, to avoid page-reload problems */ @@ -352,11 +365,28 @@ class systems extends plugin $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase; $this->systab->base = $this->DivListSystem->selectedBase; + /* This will be used when the object is saved, to set FAIstate to 'install' + and to preset maybe other attributes. + */ + $this->systab->was_activated = TRUE; + + /* Assign some default values for opsi hosts + */ + if($this->systab instanceOf opsi_tabs){ + $ldap = $this->config->get_ldap_link(); + $ldap->cat($dn); + $source_attrs = $ldap->fetch(); + foreach(array("macAddress" => "mac" ,"cn" => "hostId","description","description") as $src => $attr){ + if(isset($source_attrs[$src][0])){ + $this->systab->by_object['opsiGeneric']->$attr = $source_attrs[$src][0]; + } + } + } if($selected_group != "none"){ /******* - * Set gotoMode to active if we there was an ogroup selected. + * Set gotoMode to active if there was an ogroup selected. */ $found = false; foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){ @@ -409,6 +439,10 @@ class systems extends plugin */ if($selected_group != "none"){ $this->systab->save(); + + /* Post handling for activated new devices + */ + $this->activate_new_device($this->systab->dn); $this->systab = NULL; if(!isset($ldap)){ @@ -444,19 +478,13 @@ class systems extends plugin } $this->dn= "new"; - $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), - "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", "TABCLASS" =>"worktabs", "ACL"=> "workstation"), - "server" => array("CLASS"=>"SERVTABS", "TABNAME"=>"servgeneric", "TABCLASS" =>"servtabs", "ACL"=> "server"), - "printer" => array("CLASS"=>"PRINTTABS", "TABNAME"=>"printgeneric", "TABCLASS" =>"printtabs", "ACL"=> "printer"), - "phone" => array("CLASS"=>"PHONETABS", "TABNAME"=>"phoneGeneric", "TABCLASS" =>"phonetabs", "ACL"=> "phone"), - "component" => array("CLASS"=>"COMPONENTTABS","TABNAME"=>"componentGeneric","TABCLASS" =>"componenttabs", "ACL"=> "component")); - + $tabs = $this->get_tab_defs(); + if(isset($tabs[$sw])){ $class = $tabs[$sw]["CLASS"]; $tabname = $tabs[$sw]["TABNAME"]; $tabclass = $tabs[$sw]["TABCLASS"]; - $acl_cat = $tabs[$sw]["ACL"]; + $acl_cat = $tabs[$sw]["ACLC"]; /* Load permissions for selected 'dn' and check if we're allowed to remove this 'dn' */ @@ -478,7 +506,6 @@ class systems extends plugin } } - /******************** System activation ********************/ @@ -511,53 +538,47 @@ class systems extends plugin /* Check locking, save current plugin in 'back_plugin', so the dialog knows where to return. */ if (($user= get_lock($this->dn)) != ""){ - return(gen_locked_message ($user, $this->dn)); + return(gen_locked_message ($user, $this->dn,TRUE)); } /* Find out more about the object type */ - $ldap= $this->config->get_ldap_link(); - $ldap->cat($this->dn, array('objectClass','gotoMode')); - $attrs= $ldap->fetch(); + $attrs = $this->terminals[$s_entry]; $type= $this->get_system_type($attrs); - + /* Lock the current entry, so everyone will get the above dialog */ - $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), - "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation"), - "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server"), - "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer"), - "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone"), - "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation"), - "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component")); - + $tabs = $this->get_tab_defs(); if($type == "ArpNewDevice"){ if(!class_available("ArpNewDeviceTabs")){ msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG); }else{ + add_lock ($this->dn, $this->ui->dn); $this->systab = new ArpNewDeviceTabs($this->config,$this->config->data['TABS']['ARPNEWDEVICETABS'],$this->dn); } }elseif($type == "NewDevice"){ if(!class_available("SelectDeviceType")){ msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG); }else{ + add_lock ($this->dn, $this->ui->dn); $this->system_activation_object= array($this->dn); $this->systab = new SelectDeviceType($this->config,$this->dn) ; + + // see condition -$s_action == "SelectedSystemType"- for further handling } }elseif(isset($tabs[$type])){ $class = $tabs[$type]["CLASS"]; - $acl_cat = $tabs[$type]["ACL"]; + $acl_cat = $tabs[$type]["ACLC"]; $tabclass = $tabs[$type]["TABCLASS"]; if(!class_available($tabclass)){ msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG); }else{ + add_lock ($this->dn, $this->ui->dn); $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$acl_cat); $this->systab->set_acl_base($this->dn); - session::set('objectinfo',$this->dn); - add_lock ($this->dn, $this->ui->dn); + set_object_info($this->dn); } }else{ msg_dialog::display(_("Error"), _("Editing this type of object is not supported yet!"), ERROR_DIALOG); @@ -572,16 +593,7 @@ class systems extends plugin /* Set terminals root password */ if ($s_action=="change_pw"){ - $tabs = array( - "ArpNewDevice"=> array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "NewDevice" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric"), - "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric"), - "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric"), - "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer/printgeneric"), - "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone/phoneGeneric"), - "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation/wingeneric"), - "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric")); + $tabs = $this->get_tab_defs(); $dn = $this->terminals[$s_entry]['dn']; $type = $this->get_system_type($this->terminals[$s_entry]); @@ -593,7 +605,7 @@ class systems extends plugin $tabacl = $ui->get_permissions($dn,$acl,"userPassword"); if(preg_match("/w/",$tabacl)){ $this->dn= $this->terminals[$s_entry]['dn']; - session::set('objectinfo',$this->dn); + set_object_info($this->dn); return ($smarty->fetch(get_template_path('password.tpl', TRUE))); }else{ msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG); @@ -622,13 +634,8 @@ class systems extends plugin $_POST['new_password'] == $_POST['repeated_password']){ /* Check if user is allowed to set password */ - $tabs = array( - "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric" ,"PLUG"=>"termgeneric"), - "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric" ,"PLUG"=>"workgeneric"), - "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric" ,"PLUG"=>"servgeneric"), - "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric","PLUG"=>"componentGeneric")); + $tabs = $this->get_tab_defs(); - /* Detect object type */ $type = ""; foreach($this->terminals as $terminal){ if($terminal['dn'] == $this->dn){ @@ -642,11 +649,10 @@ class systems extends plugin if(!empty($type) && in_array($type,$allow_for)){ /* Get infos */ - $plug = $tabs[$type]["PLUG"]; - $class = $tabs[$type]["CLASS"]; + $plug = $tabs[$type]["TABNAME"]; $acl = $tabs[$type]["ACL"]; $tabclass = $tabs[$type]["TABCLASS"]; - + /* Get acls */ $ui = get_userinfo(); $tabacl = $ui->get_permissions($this->dn,$acl,"userPassword"); @@ -695,9 +701,9 @@ class systems extends plugin } $ldap->modify($attrs); if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class())); + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type)); }else{ - if(class_available($plug)){ + if(class_available($plug)){ $p = new $plug($this->config,$this->dn); $p->handle_post_events("modify"); } @@ -710,7 +716,7 @@ class systems extends plugin }else{ msg_dialog::display(_("Error"), _("Cannot determine object to change password!"), ERROR_DIALOG); } - session::un_set('objectinfo'); + set_object_info(); } @@ -721,7 +727,7 @@ class systems extends plugin /* Delete terminal canceled? */ if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){ $this->remove_lock(); - session::un_set('objectinfo'); + set_object_info(); } @@ -737,15 +743,33 @@ class systems extends plugin $this->dns = array(); $ids = $this->list_get_selected_items(); + /* Handle opsi actions */ + if($s_action == "trigger_event_DaemonEvent_reinstall"){ + foreach($ids as $key => $id){ + if($this->terminals[$id]['type'] == "O"){ + $obj = $this->terminals[$id]; + $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]); + unset($ids[$key]); + } + } + } + if(count($ids) && class_available("DaemonEvent")){ $mac= array(); + /* Collect target mac addresses */ $ldap = $this->config->get_ldap_link(); foreach($ids as $id){ - $ldap->cat ($this->terminals[$id]['dn'], array("macAddress")); - $attrs= $ldap->fetch(); - if (isset($attrs['macAddress'][0])){ - $mac[]= $attrs['macAddress'][0]; + $type = $this->get_system_type($this->terminals[$id]); + if(!in_array($type,array("terminal","server","workstation","opsi_client","winstation "))) continue; + if(isset($this->terminals[$id]['macAddress'][0])){ + $mac[] = $this->terminals[$id]['macAddress'][0]; + }else{ + $ldap->cat ($this->terminals[$id]['dn'], array("macAddress")); + $attrs= $ldap->fetch(); + if (isset($attrs['macAddress'][0])){ + $mac[]= $attrs['macAddress'][0]; + } } } $events = DaemonEvent::get_event_types(SYSTEM_EVENT); @@ -822,17 +846,7 @@ class systems extends plugin } $ui = get_userinfo(); - $tabs = array( - "ArpNewDevice"=> array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "NewDevice" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric"), - "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric"), - "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric"), - "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer/printgeneric"), - "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone/phoneGeneric"), - "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation/wingeneric"), - "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric")); - + $tabs = $this->get_tab_defs(); if(count($ids)){ @@ -864,7 +878,7 @@ class systems extends plugin $dns_names = array(); foreach($this->dns as $dn){ add_lock ($dn, $this->ui->dn); - $dns_names[] = @LDAP::fix($dn); + $dns_names[] = LDAP::fix($dn); } /* Lock the current entry, so nobody will edit it during deletion */ @@ -884,17 +898,7 @@ class systems extends plugin if (isset($_POST['delete_multiple_system_confirm'])){ $ui = get_userinfo(); - $tabs = array( - "ArpNewDevice"=> array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "NewDevice" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "incoming/systems"), - "terminal" => array("CLASS"=>"TERMTABS", "TABCLASS" =>"termtabs", "ACL"=> "terminal/termgeneric"), - "workstation" => array("CLASS"=>"WORKTABS", "TABCLASS" =>"worktabs", "ACL"=> "workstation/workgeneric"), - "server" => array("CLASS"=>"SERVTABS", "TABCLASS" =>"servtabs", "ACL"=> "server/servgeneric"), - "printer" => array("CLASS"=>"PRINTTABS", "TABCLASS" =>"printtabs", "ACL"=> "printer/printgeneric"), - "phone" => array("CLASS"=>"PHONETABS", "TABCLASS" =>"phonetabs", "ACL"=> "phone/phoneGeneric"), - "winstation" => array("CLASS"=>"WINTABS", "TABCLASS" =>"wintabs", "ACL"=> "winworkstation/wingeneric"), - "component" => array("CLASS"=>"COMPONENTTABS","TABCLASS" =>"componenttabs", "ACL"=> "component/componentGeneric")); - + $tabs = $this->get_tab_defs(); /* Remove user by user and check acls before removeing them */ foreach($this->dns as $key => $dn){ @@ -995,10 +999,21 @@ class systems extends plugin /* Save, or display error message? */ if (count($message) == 0){ - - $this->systab->save(); + /* Post handling for activated systems + target opsi -> Remove source. + target gosa -> Activate system. + */ + if($this->systab instanceOf opsi_tabs && $this->systab->was_activated){ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->rmdir ($this->systab->dn); + @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,"Source removed: ".$this->systab->dn,"Opsi host activated."); + }elseif(isset($this->systab->was_activated) && $this->systab->was_activated){ + $this->activate_new_device($this->systab->dn); + } + /* Terminal has been saved successfully, remove lock from LDAP. */ if (!isset($_POST['edit_apply'])){ if ($this->dn != "new"){ @@ -1007,7 +1022,7 @@ class systems extends plugin unset ($this->systab); $this->systab= NULL; - session::un_set('objectinfo'); + set_object_info(); }else{ /* Reinitialize tab */ @@ -1033,7 +1048,7 @@ class systems extends plugin unset ($this->systab); } $this->systab= NULL; - session::un_set('objectinfo'); + set_object_info(); } /******************** @@ -1042,13 +1057,18 @@ class systems extends plugin /* Show tab dialog if object is present */ if (isset($this->systab->config)){ + + if($this->systab instanceOf plugin && !($this->systab instanceOf tabs)){ + $this->systab->save_object(); + } + $display= $this->systab->execute(); /* Don't show buttons if tab dialog requests this */ $dialog = FALSE; $hide_apply = $this->dn == "new"; - $hide_apply = ($this->dn == "new") || (preg_match("/".normalizePreg(get_ou("incomingou"))."/",$this->dn)); + $hide_apply = ($this->dn == "new") || (preg_match("/".preg_quote(get_ou("systemIncomingRDN"), '/')."/",$this->dn)); if(is_object($this->systab) && !isset($this->systab->by_object)){ $dialog = TRUE; $hide_apply = TRUE; @@ -1063,7 +1083,11 @@ class systems extends plugin $dialog = TRUE; } - if (!$dialog){ + if(($this->systab instanceOf tabs || $this->systab instanceOf plugin) && $this->systab->read_only == TRUE){ + $display.= "

+ +

"; + }elseif (!$dialog){ $display.= "

\n"; $display.= "\n"; $display.= " \n"; @@ -1111,14 +1135,14 @@ class systems extends plugin /* Check acls, if we are not allowed to create and write each plugin tab, skip this object */ $tabs = array( - "terminal" => get_ou('terminalou'), - "workstation" => get_ou('workstationou'), - "incoming" => get_ou('incomingou'), - "server" => get_ou('serverou'), - "printer" => get_ou('printerou'), - "phone" => get_ou('phoneou'), + "terminal" => get_ou('terminalRDN'), + "workstation" => get_ou('workstationRDN'), + "incoming" => get_ou('systemIncomingRDN'), + "server" => get_ou('serverRDN'), + "printer" => get_ou('printerRDN'), + "phone" => get_ou('phoneRDN'), "winworkstation" => get_winstations_ou(), - "component" => get_ou('componentou') + "component" => get_ou('componentRDN') ); foreach($tabs as $acl_cat => $dn){ @@ -1175,6 +1199,7 @@ class systems extends plugin $res = array(); $this->terminals = array(); $userregex = ""; + $opsi_clients = array(); /* Set base for all searches */ $base= $this->DivListSystem->selectedBase; @@ -1182,7 +1207,7 @@ class systems extends plugin /* Prepare samba class name */ $samba =""; if ($this->DivListSystem->ShowWinWorkstations){ - if ($this->config->current['SAMBAVERSION'] == "3"){ + if ($this->config->get_cfg_value("sambaversion") == "3"){ $samba= "sambaSamAccount"; } else { $samba= "sambaAccount"; @@ -1191,12 +1216,12 @@ class systems extends plugin /* This array represents the combination between checkboxes and search filters */ $objs = array( - "ShowServers" => array("TAB" => "servtabs", "CLASS" => "goServer" ,"TREE" => get_ou('serverou')), - "ShowTerminals" => array("TAB" => "termtabs", "CLASS" => "gotoTerminal" ,"TREE" => get_ou('terminalou')), - "ShowPrinters" => array("TAB" => "printtabs", "CLASS" => "gotoPrinter" ,"TREE" => get_ou('printerou')), - "ShowDevices" => array("TAB" => "componenttabs", "CLASS" => "ieee802Device" ,"TREE" => get_ou('componentou')), - "ShowPhones" => array("TAB" => "phonetabs", "CLASS" => "goFonHardware" ,"TREE" => get_ou('phoneou')), - "ShowWorkstations" => array("TAB" => "worktabs", "CLASS" => "gotoWorkstation" ,"TREE" => get_ou('workstationou')), + "ShowServers" => array("TAB" => "servtabs", "CLASS" => "goServer" ,"TREE" => get_ou('serverRDN')), + "ShowTerminals" => array("TAB" => "termtabs", "CLASS" => "gotoTerminal" ,"TREE" => get_ou('terminalRDN')), + "ShowPrinters" => array("TAB" => "printtabs", "CLASS" => "gotoPrinter" ,"TREE" => get_ou('printerRDN')), + "ShowDevices" => array("TAB" => "componenttabs", "CLASS" => "ieee802Device" ,"TREE" => get_ou('componentRDN')), + "ShowPhones" => array("TAB" => "phonetabs", "CLASS" => "goFonHardware" ,"TREE" => get_ou('phoneRDN')), + "ShowWorkstations" => array("TAB" => "worktabs", "CLASS" => "gotoWorkstation" ,"TREE" => get_ou('workstationRDN')), "ShowWinWorkstations"=> array("TAB" => "wintabs", "CLASS" => $samba ,"TREE" => get_winstations_ou() )); /* Include the 'Display Systems of user' attribute */ @@ -1206,7 +1231,7 @@ class systems extends plugin /* Attributes to fetch */ $sys_attrs = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode","FAIclass"); - $sys_categories = array("terminal", "workstation", "server", "phone" ,"printer","incoming"); + $sys_categories = array("terminal", "workstation", "server", "phone" ,"printer","incoming","winworkstation","component"); /* Add FAIstate to attributes if FAI is activated */ $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs')); @@ -1236,9 +1261,24 @@ class systems extends plugin /* Search for incoming objects */ $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))"; - $res = array_merge($res,get_list($filter,$sys_categories, get_ou('incomingou').$base,$sys_attrs, GL_SIZELIMIT)); + $res = array_merge($res,get_list($filter,$sys_categories, get_ou('systemIncomingRDN').$base,$sys_attrs, GL_SIZELIMIT)); + /* Append opsi systems, the opsi extension have to installed. + (Only, if we are allowed to view opsi hosts) + */ + if($this->opsi instanceof opsi && $this->opsi->enabled() && $this->DivListSystem->ShowOpsiHosts){ + $o_acl = $this->ui->get_permissions($base,"opsi/opsiGeneric",""); + if(preg_match("/r/",$o_acl)){ + $opsi_clients = $this->opsi->get_hosts_for_system_management(); + if($this->opsi->is_error()){ + msg_dialog::display(_("Error"),msgPool::siError($this->opsi->get_error()),ERROR_DIALOG); + } + } + } + /* Get all gotoTerminal's */ + $t_id = 0; + $opsi_map = array(); foreach ($res as $value){ $tmp= $value['dn']; @@ -1252,13 +1292,13 @@ class systems extends plugin } /* Create a string containing the last part of the department. */ - $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(@LDAP::fix($tmp))); + $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(LDAP::fix($tmp))); if(empty($dn_name)){ $dn_name = "/"; } /* check if current object is a new one */ - if (preg_match ("/,".get_ou('incomingou')."/i", $tmp)){ + if (preg_match ("/,".get_ou('systemIncomingRDN')."/i", $tmp)){ if (in_array_ics('gotoTerminal', $value['objectClass'])){ $add= "- "._("New terminal"); }elseif (in_array_ics('gotoWorkstation', $value['objectClass'])){ @@ -1272,7 +1312,14 @@ class systems extends plugin /* Detect type of object and create an entry for $this->terminals */ $terminal = array(); - if (in_array_ics('gotoTerminal', $value["objectClass"])){ + + if (0 && in_array_ics('gosa_opsi_client', $value["objectClass"])){ + + /* check acl */ + $terminal = $value; + $terminal['type'] = "O"; + + } elseif (in_array_ics('gotoTerminal', $value["objectClass"])){ /* check acl */ $acl = $ui->get_permissions($value['dn'],"terminal/termgeneric"); @@ -1345,8 +1392,9 @@ class systems extends plugin $terminal['type'] = "Q"; $terminal['is_new'] = $add; } - } elseif (in_array_ics('ieee802Device', $value["objectClass"])){ - + } elseif (in_array_ics('ieee802Device', $value["objectClass"]) && + !( in_array_ics('sambaAccount', $value["objectClass"]) || in_array_ics('sambaSamAccount', $value["objectClass"]))){ + $type= "winstation"; $acl = $ui->get_permissions($value['dn'],"component/componentGeneric"); if($add != "" || preg_match("/r/",$acl)) { @@ -1369,9 +1417,27 @@ class systems extends plugin } } + /* Append collected data to the host list. + */ if(count($terminal)){ - $this->terminals[]=$terminal; + $t_id ++ ; + $this->terminals[$t_id]=$terminal; + $opsi_map[preg_replace('/\$$/',"",$value['cn'][0])] = $t_id; + } + } + + + /* Merge real hosts with opsi hosts. + If there is a samba host, then merge it with the opsi host, + to avoid duplicate entries. + */ + foreach($opsi_clients as $entry){ + if(isset($opsi_map[$entry['cn'][0]])){ + continue; } + $terminal = $entry; + $terminal['type'] = "O"; + $this->terminals[] = $terminal; } $tmp =array(); @@ -1392,8 +1458,7 @@ class systems extends plugin { if (isset($this->systab->dn)){ del_lock ($this->systab->dn); - } - if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){ + }elseif(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){ del_lock($this->dn); } if(isset($this->dns) && is_array($this->dns) && count($this->dns)){ @@ -1410,20 +1475,8 @@ class systems extends plugin } $ui = get_userinfo(); - - $tabs = array( - "terminal" => array( "CLASS" =>"TERMTABS", "TABNAME" =>"termgeneric", - "TABCLASS" =>"termtabs", "ACL" =>"terminal"), - "workstation" => array( "CLASS" =>"WORKTABS", "TABNAME" =>"workgeneric", - "TABCLASS" =>"worktabs", "ACL" =>"workstation"), - "server" => array( "CLASS" =>"SERVTABS", "TABNAME" =>"servgeneric", - "TABCLASS" =>"servtabs", "ACL" =>"server"), - "printer" => array( "CLASS" =>"PRINTTABS", "TABNAME" =>"printgeneric", - "TABCLASS" =>"printtabs", "ACL" =>"printer"), - "phone" => array( "CLASS" =>"PHONETABS", "TABNAME" =>"phoneGeneric", - "TABCLASS" =>"phonetabs", "ACL" =>"phone"), - "component" => array( "CLASS" =>"COMPONENTTABS","TABNAME" =>"componentGeneric", - "TABCLASS" =>"componenttabs","ACL" =>"component")); + + $tabs = $this->get_tab_defs(); /* Add a single entry to queue */ if($s_action == "cut" || $s_action == "copy"){ @@ -1437,7 +1490,7 @@ class systems extends plugin $tab_o = $tabs[$type]['CLASS']; $tab_c = $tabs[$type]['TABCLASS']; $acl_c = $tabs[$type]['TABNAME']; - $acl = $tabs[$type]['ACL']; + $acl = $tabs[$type]['ACLC']; if($s_action == "copy" && $ui->is_copyable($dn,$acl,$acl_c)){ $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl); @@ -1463,7 +1516,7 @@ class systems extends plugin $tab_o = $tabs[$type]['CLASS']; $tab_c = $tabs[$type]['TABCLASS']; $acl_c = $tabs[$type]['TABNAME']; - $acl = $tabs[$type]['ACL']; + $acl = $tabs[$type]['ACLC']; if($s_action == "copy_multiple" && $ui->is_copyable($dn,$acl,$acl_c)){ $this->CopyPasteHandler->add_to_queue($dn,"copy",$tab_c,$tab_o,$acl); @@ -1506,7 +1559,12 @@ class systems extends plugin $classes = $attrs['objectClass']; $type= ""; - if (in_array_ics('ieee802Device', $classes)){ + if (in_array_ics('gosa_opsi_client', $classes)){ + $type= "opsi_client"; + }elseif (in_array_ics('sambaAccount', $classes) || + in_array_ics('sambaSamAccount', $classes)){ + $type= "winstation"; + }elseif (in_array_ics('ieee802Device', $classes)){ $type= "component"; }elseif (in_array_ics('gotoTerminal', $classes)){ $type= "terminal"; @@ -1522,9 +1580,6 @@ class systems extends plugin $type= "ArpNewDevice"; }elseif (in_array_ics('GOhard', $classes)){ $type= "NewDevice"; - }elseif (in_array_ics('sambaAccount', $classes) || - in_array_ics('sambaSamAccount', $classes)){ - $type= "winstation"; } return ($type); } @@ -1538,28 +1593,33 @@ class systems extends plugin "D" => array("plugins/systems/images/select_default.png",_("Template")), "F" => array("plugins/systems/images/select_phone.png",_("Phone")), "C" => array("plugins/systems/images/select_component.png",_("Network device")), - "P" => array("images/select_printer.png",_("Printer")), + "P" => array("plugins/systems/images/select_printer.png",_("Printer")), - "W" => array("images/select_winstation.png",_("Win workstation")), + "W" => array("plugins/systems/images/select_winstation.png",_("Windows workstation")), - "L" => array("images/select_workstation.png",_("Workstation")), - "S" => array("images/select_server.png",_("Server")), - "T" => array("images/select_terminal.png",_("Terminal")), + "L" => array("plugins/systems/images/select_workstation.png",_("Workstation")), + "S" => array("plugins/systems/images/select_server.png",_("Server")), + "T" => array("plugins/systems/images/select_terminal.png",_("Terminal")), - "LX" => array("images/workstation_locked.png",_("Locked workstation")), - "SX" => array("images/server_locked.png",_("Locked server")), - "TX" => array("images/terminal_locked.png",_("Locked terminal")), + "LX" => array("plugins/systems/images/workstation_locked.png",_("Locked workstation")), + "SX" => array("plugins/systems/images/server_locked.png",_("Locked server")), + "TX" => array("plugins/systems/images/terminal_locked.png",_("Locked terminal")), - "LE" => array("images/workstation_error.png",_("Workstation error")), - "SE" => array("images/server_error.png",_("Server error")), - "TE" => array("images/terminal_error.png",_("Terminal error")), + "LE" => array("plugins/systems/images/workstation_error.png",_("Workstation error")), + "SE" => array("plugins/systems/images/server_error.png",_("Server error")), + "TE" => array("plugins/systems/images/terminal_error.png",_("Terminal error")), - "LB" => array("images/workstation_busy.png",_("Workstation busy")), - "SB" => array("images/server_busy.png",_("Server busy")), + "LB" => array("plugins/systems/images/workstation_busy.png",_("Workstation busy")), + "SB" => array("plugins/systems/images/server_busy.png",_("Server busy")), "NQ" => array("plugins/systems/images/select_newsystem.png",_("New system from incoming")), - "NT"=> array("images/select_new_terminal.png",_("New terminal")), - "NL"=> array("images/select_new_workstation.png",_("New workstation"))); + "NT" => array("plugins/systems/images/select_new_terminal.png",_("New terminal")), + "NL" => array("plugins/systems/images/select_new_workstation.png",_("New workstation"))); + + /* Add opsi client to system types */ + if($this->opsi != NULL){ + $conv["O"] = array("plugins/systems/images/select_winstation.png",_("Opsi client")); + } /* Use locked icons */ @@ -1606,7 +1666,7 @@ class systems extends plugin if(!preg_match("/".$key[$i]."/",$input['type'])){ $found = FALSE; } - } + } if($found){ $tmp['img'] ="".$key.""; @@ -1630,6 +1690,129 @@ class systems extends plugin } + public function get_tab_defs() + { + $tabs = array( + "incoming" => array( + "CLASS" => "", + "TABNAME" => "", + "TABCLASS" => "", + "ACLC" => "incoming", + "ACL" => "incoming/systems"), + + "ArpNewDevice"=> array( + "CLASS" => "TERMTABS", + "TABNAME" => "termgeneric" , + "TABCLASS" => "termtabs", + "ACLC" => "incoming", + "ACL" => "incoming/systems"), + + "NewDevice" => array( + "CLASS" => "TERMTABS", + "TABNAME" => "termgeneric", + "TABCLASS" => "termtabs", + "ACLC" => "incoming", + "ACL" => "incoming/systems"), + + "terminal" => array( + "CLASS" => "TERMTABS", + "TABNAME" => "termgeneric", + "TABCLASS" => "termtabs", + "ACLC" => "terminal", + "ACL" => "terminal/termgeneric"), + + "workstation" => array( + "CLASS" => "WORKTABS", + "TABNAME" => "workgeneric", + "TABCLASS"=> "worktabs", + "ACLC" => "workstation", + "ACL" => "workstation/workgeneric" ), + + "server" => array( + "CLASS" => "SERVTABS", + "TABNAME" => "servgeneric", + "TABCLASS"=> "servtabs", + "ACLC" => "server", + "ACL" => "server/servgeneric"), + + "printer" => array( + "CLASS" => "PRINTTABS", + "TABNAME" => "printgeneric", + "TABCLASS"=> "printtabs", + "ACLC" => "printer", + "ACL" => "printer/printgeneric"), + + "phone" => array( + "CLASS" => "PHONETABS", + "TABNAME" => "phoneGeneric", + "TABCLASS"=> "phonetabs", + "ACLC" => "phone", + "ACL" => "phone/phoneGeneric"), + + "winstation" => array( + "CLASS" => "WINTABS", + "TABNAME" => "wingeneric", + "TABCLASS"=> "wintabs", + "ACLC" => "winworkstation", + "ACL" => "winworkstation/wingeneric"), + + "component" => array( + "CLASS" => "COMPONENTTABS", + "TABNAME" => "componentGeneric", + "TABCLASS"=> "componenttabs", + "ACLC" => "component", + "ACL" => "component/componentGeneric")); + + if($this->opsi != NULL){ + $tabs["opsi_client"] = array( + "CLASS" => "OPSITABS", + "TABNAME" => "opsiGeneric" , + "TABCLASS"=> "opsi_tabs", + "ACLC" => "opsi" , + "ACL" => "opsi/opsiGeneric"); + } + + return($tabs); + } + + + /*! \brief Sets FAIstate to "install" for "New Devices". + This function is some kind of "Post handler" for activated systems, + it is called directly after the object (workstabs,servtabs) gets saved. + @param String $dn The dn of the newly activated object. + @return Boolean TRUE if activated else FALSE + */ + function activate_new_device($dn) + { + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->cat($dn); + if($ldap->count()){ + $attrs = $ldap->fetch(); + $type = $this->get_system_type($attrs); + if(!in_array($type,array("workstation","server"))) { + $ocs = $attrs['objectClass']; + unset($ocs['count']); + $new_attrs = array(); + if(!in_array("FAIobject",$ocs)){ + $ocs[] = "FAIobject"; + $new_attrs['objectClass'] = $ocs; + } + $new_attrs['FAIstate'] = "install"; + $ldap->cd($dn); + $ldap->modify($new_attrs); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, + LDAP_MOD, "activate_new_device($dn)")); + }else{ + return(TRUE); + } + } + } + return(FALSE); + } + + /* !! Incoming dummy acls, required to defined acls for incoming objects */ static function plInfo()