X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fsystems%2Fclass_systemManagement.inc;h=ac36a2034057729f02f3d917f9962884c62053dd;hb=9695395f399e680d3fbb0c6b7a2df7d8b37d17c8;hp=6b59c1d7afd8d434b2f896ea8e5257936ef9df83;hpb=1f56f14cf6e1b6cac9f04e167201814a4795bcb6;p=gosa.git diff --git a/plugins/admin/systems/class_systemManagement.inc b/plugins/admin/systems/class_systemManagement.inc index 6b59c1d7a..ac36a2034 100644 --- a/plugins/admin/systems/class_systemManagement.inc +++ b/plugins/admin/systems/class_systemManagement.inc @@ -29,15 +29,15 @@ require "tabs_winstation.inc"; class systems extends plugin { /* Definitions */ - var $plHeadline= "Systems"; - var $plDescription= "This does something"; - var $departments=array(); + var $plHeadline = "Systems"; + var $plDescription = "This does something"; + var $departments = array(); /* Dialog attributes */ - var $systab= NULL; + var $systab = NULL; var $terminals= array(); - var $ui= NULL; - var $acl= ""; + var $ui = NULL; + var $DivListSystem; function systems ($config, $ui) { @@ -45,24 +45,8 @@ class systems extends plugin $this->config= $config; $this->ui= $ui; - /* Get global filter config */ - if (!is_global("terminalfilter")){ - $base = get_base_from_people($ui->dn); - $terminalfilter= array("workstations" => "checked", - "thins" => "checked", - "winstations" => "checked", - "servers" => "checked", - "printers" => "checked", - "phones" => "checked", - "netdev" => "checked", - "user" => "*", - "regex" => "*"); - register_global("terminalfilter", $terminalfilter); - } - if(!isset($_SESSION['CurrentMainBase'])){ - $ui = get_userinfo(); - $_SESSION['CurrentMainBase'] = get_base_from_people($ui->dn); - } + /* Creat dialog object */ + $this->DivListSystem = new divListSystem($this->config,$this); } function execute() @@ -70,46 +54,7 @@ class systems extends plugin /* Call parent execute */ plugin::execute(); - $_SESSION['LOCK_VARS_TO_USE'] = array("/^user_edit_/i","/^user_del_/","/^act/","/^id/"); - - /******************** - Filter handling, check posted filter options and store them in our Session obejct - ********************/ - - /* Save posted filter data */ - $terminalfilter= get_global("terminalfilter"); - if(isset($_POST['SystemHeadpagePosted'])){ - foreach( array("user", "regex") as $type){ - if (isset($_POST[$type])){ - $terminalfilter[$type]= $_POST[$type]; - } - } - } - - if(isset($_POST['CurrentMainBase'])){ - $_SESSION['CurrentMainBase'] = $_POST['CurrentMainBase']; - } - - /* Check if filter checkboxes are selected */ - if (isset($_POST['SystemHeadpagePosted'])){ - foreach( array("workstations", "thins", "winstations", "printers", "phones", "servers", "netdev") as $type){ - if (isset($_POST[$type])) { - $terminalfilter[$type]= "checked"; - } else { - $terminalfilter[$type]= ""; - } - } - } - - /* Check for search post */ - if (isset($_GET['search'])){ - $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*"; - if ($s == "**"){ - $s= "*"; - } - $terminalfilter['regex']= $s; - } - + $_SESSION['LOCK_VARS_TO_USE'] = array("/^system_edit_/i","/^system_del_/","/^act/","/^id/"); /******************** Check for functional posts, edit|delete|add|... system devices @@ -119,51 +64,41 @@ class systems extends plugin $base_back = ""; // The Link for Backbutton $smarty = get_smarty(); - /* check if base was changed */ - if(isset($_GET['act'])&&($_GET['act']=="dep_open")){ - $s_action="open"; - $s_entry = base64_decode($_GET['dep_id']); - $_SESSION['CurrentMainBase']= $this->config->departments[trim($s_entry)]; - $this->reload(); - } - /* Test Posts */ foreach($_POST as $key => $val){ // Post for delete - if(preg_match("/user_del.*/",$key)){ + if(preg_match("/system_del.*/",$key)){ $s_action = "del"; - $s_entry = preg_replace("/user_".$s_action."_/i","",$key); + $s_entry = preg_replace("/system_del_/i","",$key); // Post for edit - }elseif(preg_match("/user_edit_.*/",$key)){ + }elseif(preg_match("/system_edit_.*/",$key)){ $s_action="edit"; - $s_entry = preg_replace("/user_".$s_action."_/i","",$key); + $s_entry = preg_replace("/system_edit_/i","",$key); // Post for new - }elseif(preg_match("/dep_back.*/i",$key)){ - $s_action="back"; - }elseif(preg_match("/user_new.*/",$key)){ + }elseif(preg_match("/system_new.*/",$key)){ $s_action="new"; - }elseif(preg_match("/dep_home.*/i",$key)){ - $s_action="home"; - }elseif(preg_match("/user_tplnew.*/i",$key)){ + }elseif(preg_match("/system_tplnew.*/i",$key)){ $s_action="new_tpl"; - }elseif(preg_match("/user_setpwd_.*/i",$key)){ + }elseif(preg_match("/system_setpwd_.*/i",$key)){ $s_action="change_pw"; - $s_entry = preg_replace("/user_setpwd_/i","",$key); - }elseif(preg_match("/dep_root.*/i",$key)){ - $s_action="root"; + $s_entry = preg_replace("/system_setpwd_/i","",$key); + }elseif(preg_match("/gen_cd_.*/i",$key)){ + $s_action="gen_cd"; + $s_entry = preg_replace("/gen_cd_/i","",$key); }elseif(preg_match("/newsystem_.*/i",$key)){ $s_action="newsystem"; $s_entry = preg_replace("/newsystem_/i","",$key); } } - /* 09.02.2006 : New incoming handling ; hickert + /* Incoming handling * If someone made a systemtype and ogroup selection * Display the new requested entry type ... servtab in case of server and so on. */ if(isset($_POST['SystemTypeChoosen'])){ $s_action = "SelectedSystemType"; $s_entry = $_POST['SystemType']; + $_SESSION['SelectedSystemType']['ogroup'] = $_POST['ObjectGroup']; $this->systab = NULL; } @@ -176,54 +111,108 @@ class systems extends plugin $s_entry = $_GET['id']; } - /* Department changed? */ - if(isset($_POST['CurrentMainBase']) && $_POST['CurrentMainBase']){ - $_SESSION['CurrentMainBase']= $_POST['CurrentMainBase']; + /* Check for exeeded sizelimit */ + if (($message= check_sizelimit()) != ""){ + return($message); } - /* Homebutton is posted */ - if($s_action=="home"){ - $_SESSION['CurrentMainBase']=(preg_replace("/^[^,]+,/","",$this->ui->dn)); - $_SESSION['CurrentMainBase']=(preg_replace("/^[^,]+,/","",$_SESSION['CurrentMainBase'])); + /* Try to get informations about what kind of system to create */ + if ($s_action=="new") { + return ($smarty->fetch(get_template_path('chooser.tpl', TRUE))); } - /* back to the roots ^^ */ - if($s_action=="root"){ - $_SESSION['CurrentMainBase']=($this->config->current['BASE']); + + /******************** + Create FAI CD ... + ********************/ + if ($s_action=="gen_cd"){ + $this->dn= $this->terminals[$s_entry]['dn']; + $_SESSION['objectinfo']= $this->dn; + return ($smarty->fetch(get_template_path('gencd.tpl', TRUE))); } - /* If Backbutton is Posted */ - if($s_action=="back"){ - $base_back = preg_replace("/^[^,]+,/","", $_SESSION['CurrentMainBase']); - $base_back = convert_department_dn($base_back); - if(isset($this->config->departments[trim($base_back)])){ - $_SESSION['CurrentMainBase']= $this->config->departments[trim($base_back)]; - }else{ - $_SESSION['CurrentMainBase']= $this->config->departments["/"]; - } + /* Start CD-Creation */ + if ((isset($_POST["cd_create"])) && !empty($this->dn)){ + $smarty->assign("src", "?plug=".$_GET['plug']."&PerformIsoCreation"); + return ($smarty->fetch(get_template_path('gencd_frame.tpl', TRUE))); } - /* Save Termfilter .... */ - register_global("terminalfilter", $terminalfilter); - $this->reload(); - - /* Check for exeeded sizelimit */ - if (($message= check_sizelimit()) != ""){ - return($message); - } - /* Try to get informations about what kind of system to create */ - if ($s_action=="new") { - return ($smarty->fetch(get_template_path('chooser.tpl', TRUE))); + if ($this->dn != "" && isset($_GET['PerformIsoCreation'])){ + + $return_button = "
+ + +
"; + + $dsc = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w")); + + /* Get and check command */ + $command= search_config($this->config->data['TABS'], "workgeneric", "ISOCMD"); + if (check_command($command)){ + @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); + + /* Print out html introduction */ + echo ' + + + + + + + +
';
+
+        /* Open process handle and check if it is a valid process */
+        $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
+        if (is_resource($process)) {
+          fclose($pipes[0]);
+
+          /* Print out returned lines && write JS to scroll down each line */
+          while (!feof($pipes[1])){
+            $cur_dat = fgets($pipes[1], 1024);
+            echo $cur_dat;
+            echo '' ;
+            flush();
+          }
+        }
+
+        /* Get error string && close streams */
+        $buffer= stream_get_contents($pipes[2]);
+
+        fclose($pipes[1]);
+        fclose($pipes[2]);
+        echo "
"; + + /* Check return code */ + $ret= proc_close($process); + if ($ret != 0){ + echo "

"._("Creating the image failed. Please see the report below.")."

"; + echo "
$buffer
"; + } + + + + echo $return_button."
"; + + } else { + $tmp= "

".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."

"; + echo $tmp; + } + + /* Scroll down completly */ + echo '' ; + echo ''; + flush(); + exit; } + /******************** - Create new system ... + Create new system ... ********************/ /* Create new default terminal - * - * 09.02.2006 ; New incoming handling ; hickert * Or create specified object of selected system type, from given incoming object */ if (isset($_POST['create_system'])||$s_action=="newsystem"||$s_action == "SelectedSystemType") { @@ -233,114 +222,48 @@ class systems extends plugin */ if($s_action == "SelectedSystemType") { $sw = $s_entry; - $dn_backup = $this->dn; }else{ if(isset($_POST['system'])){ $sw = $_POST['system']; }else{ $sw = $s_entry; } + $this->dn= "new"; } - - $this->dn= "new"; - $this->acl= array(":all"); - - switch ($sw){ - case 'terminal': - $this->systab= new termtabs($this->config, - $this->config->data['TABS']['TERMTABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['termgeneric']->cn= "default"; - $this->systab->by_object['termservice']->cn= "default"; - $this->systab->by_object['termgeneric']->base = $_SESSION['CurrentMainBase']; - break; - - case 'workstation': - $this->systab= new worktabs($this->config, - $this->config->data['TABS']['WORKTABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['workgeneric']->cn= "wdefault"; - $this->systab->by_object['workservice']->cn= "default"; - $this->systab->by_object['workgeneric']->base = $_SESSION['CurrentMainBase']; - break; - - case 'server': - $this->systab= new servtabs($this->config, - $this->config->data['TABS']['SERVTABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['servgeneric']->base = $_SESSION['CurrentMainBase']; - break; - - case 'printer': - $this->systab= new printtabs($this->config, - $this->config->data['TABS']['PRINTTABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['printgeneric']->base = $_SESSION['CurrentMainBase']; - break; - - case 'phone': - $this->systab= new phonetabs($this->config, - $this->config->data['TABS']['PHONETABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['phonegeneric']->base = $_SESSION['CurrentMainBase']; - break; - - case 'component': - $this->systab= new componenttabs($this->config, - $this->config->data['TABS']['COMPONENTTABS'], $this->dn); - $this->systab->set_acl ($this->acl); - $this->systab->by_object['componentgeneric']->base = $_SESSION['CurrentMainBase']; - break; - } - - /* 09.02.2006 ; New incoming handling ; hickert. - * We must create a NEW object of given system type (Posted from SelectDeviceType). - * But we have to use the same attributes as used in incoming object, thats - * what we do here. - */ - if($s_action == "SelectedSystemType"){ - - /* Store some informations, to be able to add this object to - * To specified objectgroup and delete incoming object - */ - $_SESSION['SelectedSystemType']['dn'] = $this->dn; - $_SESSION['SelectedSystemType']['server'] = $s_entry; - $_SESSION['SelectedSystemType']['ogroup'] = $_POST['ObjectGroup']; - - /* restore dn */ - $this->dn = $dn_backup; - - /* Get properties from incoming object */ - $ldap = $this->config->get_ldap_link(); - $ldap->cd($this->dn); - $ldap->cat($this->dn); - $res = $ldap->fetch(); - - /* Unset not needed attributes */ - unset($res['dn']); - unset($res['objectClass']); - - /* Walk through all tabs and set attributes if available */ - foreach($this->systab->by_object as $name => $value){ - foreach($this->systab->by_object[$name]->attributes as $atr){ - if((isset($value))&&(isset($res[$atr]))){ - $this->systab->by_object[$name]->$atr = $res[$atr][0]; - } - } + $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")); + + if(isset($tabs[$sw])){ + $class = $tabs[$sw]["CLASS"]; + $tabname = $tabs[$sw]["TABNAME"]; + $tabclass = $tabs[$sw]["TABCLASS"]; + $acl_cat = $tabs[$sw]["ACL"]; + + /* Load permissions for selected 'dn' and check if + we're allowed to remove this 'dn' */ + $ui = get_userinfo(); + $tabacl = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname); + if(preg_match("/c/",$tabacl)){ + $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$sw); + $this->systab->set_acl_base($this->DivListSystem->selectedBase); + $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase; + $this->systab->base = $this->DivListSystem->selectedBase; + }else{ + print_red(_("You are not allowed to create a new object of this type.")); } } - - /* set base ... of current divlist position */ - $this->systab->base = $_SESSION['CurrentMainBase']; } - /******************** - Edit system ... + Edit system ... ********************/ /* User wants to edit data? */ -// if ($s_action == "edit"){ if (($s_action == "edit") && (!isset($this->systab->config))){ $this->dn= $this->terminals[$s_entry]['dn']; @@ -351,108 +274,72 @@ class systems extends plugin return(gen_locked_message ($user, $this->dn)); } - /* Set up the users ACL's for this 'dn' */ - $acl= get_permissions ($this->dn, $this->ui->subtreeACL); - /* Find out more about the object type */ $ldap= $this->config->get_ldap_link(); - $ldap->cat($this->dn); + $ldap->cat($this->dn, array('objectClass')); $attrs= $ldap->fetch(); $type= $this->get_system_type($attrs['objectClass']); /* Lock the current entry, so everyone will get the above dialog */ - - switch ($type){ - case "NewDevice" : - $this->systab = new SelectDeviceType($this->config,$this->dn) ; - break; - case "terminal": - /* Register systab to trigger edit dialog */ - $this->systab= new termtabs($this->config, - $this->config->data['TABS']['TERMTABS'], $this->dn); - $this->systab->set_acl($acl); + $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")); + + + if($type == "NewDevice"){ + $this->systab = new SelectDeviceType($this->config,$this->dn) ; + }elseif(isset($tabs[$type])){ + + $class = $tabs[$type]["CLASS"]; + $acl_cat = $tabs[$type]["ACL"]; + $tabclass = $tabs[$type]["TABCLASS"]; + + $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$acl_cat); + $this->systab->set_acl_base($this->dn); $_SESSION['objectinfo']= $this->dn; add_lock ($this->dn, $this->ui->dn); - break; - - case "server": - - /* Register systab to trigger edit dialog */ - $this->systab= new servtabs($this->config,$this->config->data['TABS']['SERVTABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - case "workstation": - /* Register systab to trigger edit dialog */ - $this->systab= new worktabs($this->config, - $this->config->data['TABS']['WORKTABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - case "printer": - /* Register systab to trigger edit dialog */ - $this->systab= new printtabs($this->config, - $this->config->data['TABS']['PRINTTABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - case "phone": - /* Register systab to trigger edit dialog */ - $this->systab= new phonetabs($this->config, - $this->config->data['TABS']['PHONETABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - case "component": - /* Register systab to trigger edit dialog */ - $this->systab= new componenttabs($this->config, - $this->config->data['TABS']['COMPONENTTABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - case "winstation": - /* Register systab to trigger edit dialog */ - $this->systab= new wintabs($this->config, - $this->config->data['TABS']['WINTABS'], $this->dn); - $this->systab->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - add_lock ($this->dn, $this->ui->dn); - break; - - - default: + }else{ print_red (_("You can't edit this object type yet!")); del_lock($this->dn); - break; } } - + /******************** - Change password ... + Change password ... ********************/ /* Set terminals root password */ if ($s_action=="change_pw"){ - $this->dn= $this->terminals[$s_entry]['dn']; - $_SESSION['objectinfo']= $this->dn; - return ($smarty->fetch(get_template_path('password.tpl', TRUE))); + $tabs = array( + "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), + "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", "TABCLASS" =>"worktabs", "ACL"=> "workstation")); + + $type = $this->get_system_type($this->terminals[$s_entry]['objectClass']); + $class = $tabs[$type]["CLASS"]; + $tabname = $tabs[$type]["TABNAME"]; + $acl_cat = $tabs[$type]["ACL"]; + $tabclass = $tabs[$type]["TABCLASS"]; + $ui = get_userinfo(); + $tabacl = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd"); + if(preg_match("/w/",$tabacl)){ + $this->dn= $this->terminals[$s_entry]['dn']; + $_SESSION['objectinfo']= $this->dn; + return ($smarty->fetch(get_template_path('password.tpl', TRUE))); + }else{ + print_red(_("You are not allowed to change the password for this object.")); + } } /******************** - Password cahnge finish, but check if entered data is ok + Password change finish, but check if entered data is ok ********************/ /* Correctly specified? */ @@ -472,23 +359,50 @@ class systems extends plugin $_POST['new_password'] == $_POST['repeated_password']){ /* Check if user is allowed to set password */ - $acl= get_permissions ($this->dn, $this->ui->subtreeACL); - $acl= get_module_permission($acl, "terminal", $this->dn); - if (chkacl($acl, "password") != ""){ - print_red (_("You are not allowed to set this systems password!")); - } else { - $ldap= $this->config->get_ldap_link(); - $ldap->cd($this->dn); + $tabs = array( + "terminal" => array("CLASS"=>"TERMTABS", "TABNAME"=>"termgeneric", "TABCLASS" =>"termtabs", "ACL"=> "terminal"), + "workstation" => array("CLASS"=>"WORKTABS", "TABNAME"=>"workgeneric", "TABCLASS" =>"worktabs", "ACL"=> "workstation")); + + /* Detect object type */ + $type = ""; + foreach($this->terminals as $terminal){ + if($terminal['dn'] == $this->dn){ + $type = $this->get_system_type($terminal['objectClass']); + break; + } + } - $attrs= array(); - if ($_POST['new_password'] == ""){ - $attrs['gotoRootPasswd']= array(); - } else { - $attrs['gotoRootPasswd']= crypt($_POST['new_password'], - substr(session_id(),0,2)); + /* Type detected */ + if(!empty($type)){ + + /* Get infos */ + $class = $tabs[$type]["CLASS"]; + $tabname = $tabs[$type]["TABNAME"]; + $acl_cat = $tabs[$type]["ACL"]; + $tabclass = $tabs[$type]["TABCLASS"]; + + /* Get acls */ + $ui = get_userinfo(); + $tabacl = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname,"gotoRootPasswd"); + + /* Check acls */ + if(preg_match("/w/",$tabacl)){ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->dn); + + $attrs= array(); + if ($_POST['new_password'] == ""){ + $attrs['gotoRootPasswd']= array(); + } else { + $attrs['gotoRootPasswd']= crypt($_POST['new_password'],substr(session_id(),0,2)); + } + $ldap->modify($attrs); + gosa_log ("Password for '".$this->dn."' has been changed"); + }else{ + print_red(_("You are not allowed to change the password for this object.")); } - $ldap->modify($attrs); - gosa_log ("Password for '".$this->dn."' has been changed"); + }else{ + print_red(_("Can't detect object to change password.")); } unset($_SESSION['objectinfo']); } @@ -513,13 +427,34 @@ class systems extends plugin if ($s_action=="del"){ /* Get 'dn' from posted termlinst */ - $this->dn= $this->terminals[$s_entry]['dn']; + $this->dn = $this->terminals[$s_entry]['dn']; + $attrs = $this->terminals[$s_entry]; + + $type= $this->get_system_type($attrs['objectClass']); + $ui = get_userinfo(); + $tabs = array( + "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")); + + + /* get object type */ + $tabtype = "termtabs"; + $tabobj = "TERMTABS"; + $tabacl = ""; + if(isset($tabs[$type])){ + $tabtype = $tabs[$type]['TABCLASS']; + $tabobj = $tabs[$type]['CLASS']; + $tabacl = $ui->get_permissions($this->dn,$tabs[$type]['ACL']); + } /* Load permissions for selected 'dn' and check if we're allowed to remove this 'dn' */ - $acl= get_permissions ($this->dn, $this->ui->subtreeACL); - $this->acl= get_module_permission($acl, "terminal", $this->dn); - if (chkacl($this->acl, "delete") == ""){ + if(preg_match("/d/",$tabacl)){ /* Check locking, save current plugin in 'back_plugin', so the dialog knows where to return. */ @@ -529,7 +464,7 @@ class systems extends plugin /* Lock the current entry, so nobody will edit it during deletion */ add_lock ($this->dn, $this->ui->dn); - $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), LDAP::fix($this->dn))); + $smarty->assign("warning", sprintf(_("You're about to delete all information about the component at '%s'."), @LDAP::fix($this->dn))); return($smarty->fetch(get_template_path('remove.tpl', TRUE))); } else { @@ -539,69 +474,58 @@ class systems extends plugin } } - + /******************** Delete system, confirmed ********************/ /* Confirmation for deletion has been passed. Terminal should be deleted. */ if (isset($_POST['delete_terminal_confirm'])){ - /* Some nice guy may send this as POST, so we've to check - for the permissions again. */ - if (chkacl($this->acl, "delete") == ""){ - - /* Find out more about the object type */ - $ldap= $this->config->get_ldap_link(); - $ldap->cat($this->dn); - $attrs= $ldap->fetch(); - $type= $this->get_system_type($attrs['objectClass']); - - switch ($type){ - case "terminal": - $tabtype = "termtabs"; - $tabobj = "TERMTABS"; - break; - - case "workstation": - $tabtype = "worktabs"; - $tabobj = "WORKTABS"; - break; - - case "phone": - $tabtype = "phonetabs"; - $tabobj = "PHONETABS"; - break; + /* Find out more about the object type */ + $ldap= $this->config->get_ldap_link(); + $ldap->cat($this->dn, array('objectClass')); + $attrs= $ldap->fetch(); + $type= $this->get_system_type($attrs['objectClass']); - case "server": - $tabtype = "servtabs"; - $tabobj = "SERVTABS"; - break; + $ui = get_userinfo(); + + $tabs = array( + "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")); + + /* get object type */ + $tabtype = "termtabs"; + $tabobj = "TERMTABS"; + $tabacl = ""; + if(isset($tabs[$type])){ + $tabtype = $tabs[$type]['TABCLASS']; + $tabobj = $tabs[$type]['CLASS']; + $tabacl = $ui->get_permissions($this->dn,$tabs[$type]['ACL']); + } - default: - $tabtype = "termtabs"; - $tabobj = "TERMTABS"; - break; - } + /* Check if we are allowed to remove this object */ + if(preg_match("/d/",$tabacl)){ /* Delete request is permitted, perform LDAP action */ if($tabtype=="phonetabs"){ - $this->systab= new $tabtype($this->config, - $this->config->data['TABS'][$tabobj], $this->dn); - $this->systab->set_acl(array($this->acl)); + $this->systab= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $this->dn,$type); + $this->systab->set_acl_base($this->dn); $this->systab->by_object['phonegeneric']->remove_from_parent (); }else{ - $this->systab= new $tabtype($this->config, - $this->config->data['TABS'][$tabobj], $this->dn); - $this->systab->set_acl(array($this->acl)); + $this->systab= new $tabtype($this->config,$this->config->data['TABS'][$tabobj], $this->dn,$type); + $this->systab->set_acl_base($this->dn); $this->systab->delete(); - #$this->systab->by_object['termgeneric']->remove_from_parent (); } unset ($this->systab); gosa_log ("System object'".$this->dn."' has been removed"); $this->systab= NULL; /* Terminal list has changed, reload it. */ - $this->reload (); } else { /* Normally this shouldn't be reached, send some extra @@ -622,7 +546,7 @@ class systems extends plugin /* Finish user edit is triggered by the tabulator dialog, so the user wants to save edited data. Check and save at this point. */ - if ((isset($_POST['edit_finish'])) && (isset($this->systab->config))){ + if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config))){ /* Check tabs, will feed message array */ $message= $this->systab->check(); @@ -631,22 +555,27 @@ class systems extends plugin if (count($message) == 0){ /* Save terminal data to ldap */ - gosa_log ("System object'".$this->dn."' has been saved"); + if(isset($_SESSION['SelectedSystemType']['ogroup'])){ + foreach (array("workservice", "termservice") as $cls){ + if (isset($this->systab->by_object[$cls])){ + $this->systab->by_object[$cls]->gotoXMouseport= ""; + $this->systab->by_object[$cls]->gotoXMouseType= ""; + $this->systab->by_object[$cls]->gotoXResolution= ""; + $this->systab->by_object[$cls]->gotoXColordepth= ""; + } + } + } $this->systab->save(); + gosa_log ("System object'".$this->dn."' has been saved"); - /* Terminal has been saved successfully, remove lock from - LDAP. */ - - /* 09.02.2006 Hickert - * New System incoming behavior; you can select a system type and an ogroup membership. + /* Incoming behavior; you can select a system type and an ogroup membership. * If this object is an Incoming object, $_SESSION['SelectedSystemType'] isset. * Check if we must add the new object to an object group. - * !! Don't forget to unset the $_SESSION['SelectedSystemType']... else all edited objects - * !! will be added to the object group. * * If this is done, delete the old incoming entry... it is still there, because this is a new - * entry and not an edited one. + * entry and not an edited one, so we will delete it. */ + if(isset($_SESSION['SelectedSystemType'])){ $SelectedSystemType= $_SESSION['SelectedSystemType']; unset($_SESSION['SelectedSystemType']); @@ -654,14 +583,14 @@ class systems extends plugin $og = new ogroup($this->config,$SelectedSystemType['ogroup']); if($og){ $og->AddDelMembership($this->systab->dn); + $og->save(); } - $og->save(); } if(!isset($ldap)){ $ldap = $this->config->get_ldap_link(); } $ldap->cd ($this->dn); - $ldap->cat($this->dn); + $ldap->cat($this->dn, array('dn')); if(count($ldap->fetch())){ $ldap->cd($this->dn); $ldap->rmDir($this->dn); @@ -669,26 +598,24 @@ class systems extends plugin $ldap->cd($this->config->current['BASE']); } - if ($this->dn != "new"){ - del_lock ($this->dn); - } - - /* There's no page reload so we have to read new terminals at - this point. */ - $this->reload (); - unset ($this->systab); - $this->systab= NULL; - unset($_SESSION['objectinfo']); + if (!isset($_POST['edit_apply'])){ + /* Terminal has been saved successfully, remove lock from + LDAP. */ + if ($this->dn != "new"){ + del_lock ($this->dn); + } + unset ($this->systab); + $this->systab= NULL; + unset($_SESSION['objectinfo']); + } } else { /* Ok. There seem to be errors regarding to the tab data, show message and continue as usual. */ show_errors($message); } - } - /******************** Edit system was canceled ********************/ @@ -701,250 +628,83 @@ class systems extends plugin $this->systab= NULL; unset($_SESSION['objectinfo']); - /* 09.02.2006 ; New incoming handling ; hickert - * remove session object which stores our ogroup selection - * for the new incoming handling - */ + /* Remove ogroup selection, which was set while editing a new incoming entry */ if(isset($_SESSION['SelectedSystemType'])){ unset($_SESSION['SelectedSystemType']); } } - /******************** - Display edit dialog, or some other + Display edit dialog, or some other ********************/ /* Show tab dialog if object is present */ if (isset($this->systab->config)){ $display= $this->systab->execute(); - /* Don't show buttons if tab dialog requests this */ if ((isset($this->systab->by_object))&&(!$this->systab->by_object[$this->systab->current]->dialog)){ $display.= "

\n"; - $display.= "\n"; + $display.= "\n"; $display.= " \n"; + if ($this->dn != "new"){ + $display.= "\n"; + $display.= " \n"; + } $display.= "\n"; $display.= "

"; } return ($display); } - - /******************** - Entry handling finished (edit delete ... ) - Now the list generation is the next part of this script. - ********************/ - - /* Prepare departments, - which are shown in the listbox on top of the listbox - */ - $options= ""; - foreach ($this->config->idepartments as $key => $value){ - if ($_SESSION['CurrentMainBase'] == $key){ - $options.= ""; - } else { - $options.= ""; - } + /* Check if there is a snapshot dialog open */ + $base = $this->DivListSystem->selectedBase; + if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases())){ + return($str); } + /* Display dialog with system list */ + $this->DivListSystem->parent = $this; + $this->DivListSystem->execute(); - /* NEW LIST MANAGMENT */ - - /* Create list header - */ - $listhead = "
". - "  ". - "  ". - "  ". - "  ". - "  ". - " ". - " ". - " ". - " ". - " ". - " ". - "  "._("Base")." ". - " ". - "  ". - "
"; - - - /* Edit delete link for system types - */ - $action= ""; - $action.= ""; - $linkopen = "%s"; - - /* Create new divlist, and add the header elements - */ - $divlist = new divlist("systemstab"); - $divlist->SetSummary(_("This table displays all systems, in the selected tree.")); - $divlist->SetEntriesPerPage(0); - $divlist->SetHeader(array( - array("string" => " ", "attach" => "style='text-align:center;width:20px;'"), - array("string" => _("System")." / "._("Department"), "attach" => "style=''"), - array("string" => _("Actions"), "attach" => "style='width:60px;border-right:0px;text-align:right;'" ))); - - - /* Add departments, to be able to switch into them - */ - foreach($this->departments as $key=> $val){ - - /* Add missing entries ... */ - if(!isset($this->config->departments[trim($key)])){ - $this->config->departments[trim($key)]=""; - } - - /* check if this department contains sub-departments - Display different image in this case - */ - $non_empty=""; - $keys= str_replace("/","\/",$key); - foreach($this->config->departments as $keyd=>$vald ){ - if(preg_match("/".$keys."\/.*/",$keyd)){ - $non_empty="full"; - } - } - - /* Add to divlist */ - $field1 = array("string" => "department", "attach" => "style='text-align:center;width:20px;'"); - $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''"); - $field3 = array("string" => " ", "attach" => "style='width:60px;border-right:0px;text-align:right;'"); - $divlist->AddEntry(array($field1,$field2,$field3)); - } - - // Iamge spacer - $empty =" "; - - // User and Template Images - $editlink = "%s"; - - // Pictures for Extensions - $img1 = "C"; - $img2 = "L"; - $img3 = "L"; - $img4 = "M"; - $img5 = "I"; - $img6 = "F"; - $img7 = "K"; - $img8 = "A"; - $img9 = "F"; - $img10 = "L"; - - // Test Every Entry and generate divlist Array - foreach($this->terminals as $key => $val){ - // Specify Pics for Extensions - if(in_array("goLdapServer" ,$val['objectClass'])){ - - } - - /* Generate picture list, which is currently disabled */ - if(in_array("goCupsServer" ,$val['objectClass'])) $cups = $img1; else $cups =$empty; - if(in_array("goLogDBServer" ,$val['objectClass'])) $logdb = $img2; else $logdb =$empty; - if(in_array("goSyslogServer" ,$val['objectClass'])) $syslog = $img3; else $syslog=$empty; - if(in_array("goImapServer" ,$val['objectClass'])) $imap = $img4; else $imap =$empty; - if(in_array("sambaSamAccount" ,$val['objectClass'])) $samba = $img5; else $samba =$empty; - if(in_array("goShareServer" ,$val['objectClass'])) $nfs = $img6; else $nfs =$empty; - if(in_array("goKrbServer" ,$val['objectClass'])) $krb = $img7; else $krb =$empty; - if(in_array("goFonServer" ,$val['objectClass'])) $fon = $img8; else $fon =$empty; - if(in_array("goFaxServer" ,$val['objectClass'])) $fax = $img9; else $fax =$empty; - if(in_array("goLdapServer" ,$val['objectClass'])) $ldap = $img10; else $ldap =$empty; - $pics = $cups.$logdb.$syslog.$imap.$samba.$nfs.$krb.$fon.$fax.$ldap; - $pics = ""; - - $val['cn'][0]= preg_replace('/\$$/', '', $val['cn'][0]); - - // Generate Array to Add - if((isset($val['is_new']))&&(!empty($val['is_new']))){ - $display= "".$val["cn"][0]." ".$val['is_new']; - }else{ - $display= "".$val["cn"][0].""; - } - - if((in_array("gotoTerminal",$val['objectClass']))||(in_array("gotoWorkstation",$val['objectClass']))){ - $action2 = ""; - }else{ - $action2 = ""; - } - - if(isset($val['message'])){ - $display.= " (".$val['message']." '".$this->config->idepartments[$_SESSION['CurrentMainBase']]."' )"; - } - - $img=$this->convert_list($val); - - $field1 = array("string" => sprintf($img['img'],$val['dn']), "attach" => "style='text-align:center;width:20px;'"); - $field2 = array("string" => sprintf($editlink,$key,$display), "attach" => "style='' title='".@LDAP::fix($val['dn'])."'"); - $field3 = array("string" => preg_replace("/%KEY%/", "$key", $action2.$action), "attach" => "style='width:60px;border-right:0px;text-align:right;'"); - $divlist->AddEntry( array($field1,$field2,$field3)); + /* Add departments if subsearch is disabled */ + if(!$this->DivListSystem->SubSearch){ + $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase); } + $this->reload(); + $this->DivListSystem->setEntries($this->terminals); + return($this->DivListSystem->Draw()); + } - /* Show main page */ - $smarty->assign("terminalshead", $listhead); - $smarty->assign("terminals", $divlist->DrawList()); - $smarty->assign("search_image", get_template_path('images/search.png')); - $smarty->assign("searchu_image", get_template_path('images/search_user.png')); - $smarty->assign("tree_image", get_template_path('images/tree.png')); - $smarty->assign("infoimage", get_template_path('images/info.png')); - $smarty->assign("launchimage", get_template_path('images/launch.png')); - foreach( array( "user", "regex", "workstations", "thins", "servers", - "winstations", "printers", "phones", "netdev") as $type){ - - $smarty->assign("$type", $terminalfilter[$type]); - } - $smarty->assign("deplist", $this->config->idepartments); - $smarty->assign("CurrentMainBase", $_SESSION['CurrentMainBase']); - /* Extend if we are not using javascript */ - $smarty->assign("apply", apply_filter()); - $smarty->assign("alphabet", generate_alphabet()); - $smarty->assign("hint", print_sizelimit_warning()); + /* Return departments, that will be included within snapshot detection */ + function get_used_snapshot_bases() + { + $tmp = array(); - return($smarty->fetch(get_template_path('headpage.tpl', TRUE))); - } + /* Check acls, if we are not allowed to create and write each plugin tab, skip this object */ + $tabs = array( + "terminal" => "ou=terminals,ou=systems,", + "workstation" => "ou=workstations,ou=systems,", + "server" => "ou=servers,ou=systems,", + "printer" => "ou=printers,ou=systems,", + "phone" => "ou=phones,ou=systems,", + "winworkstation" => get_winstations_ou(), + "component" => "ou=netdevices,ou=systems," + ); - function convert_list($input) - { - $temp= ""; - $conv= array( - "NQ" => array("select_newsystem.png",_("New System from incoming")), - "D" => array("select_default.png",_("Template")), - "T" => array("select_terminal.png",_("Terminal")), - "L" => array("select_workstation.png",_("Workstation")), - "F" => array("select_phone.png",_("Phone")), - "S" => array("select_server.png",_("Server")), - "W" => array("select_winstation.png",_("Winstation")), - "C" => array("select_component.png",_("Network Device")), - "NT"=> array("select_new_terminal.png",_("New Terminal")), - "NL"=> array("select_new_workstation.png",_("New Workstation")), - "P" => array("select_printer.png",_("Printer"))); + foreach($tabs as $acl_cat => $dn){ - if((isset($input['is_new']))&&(!empty($input['is_new']))){ - $input['type']="N".$input['type']; - } - foreach ($conv as $key => $value){ - if($input['type']==$key){ - $tmp['img'] ="".$key.""; - $tmp['class']=$key; - return $tmp; + $acl_all = $this->ui->has_complete_category_acls($dn.$this->DivListSystem->selectedBase,$acl_cat); + if(preg_match("/(c.*w|w.*c)/",$acl_all)){ + $tmp[] = $dn.$this->DivListSystem->selectedBase; } } + return($tmp); } + function remove_from_parent() { /* Optionally execute a command after we're done */ @@ -955,6 +715,7 @@ class systems extends plugin /* Save data to object */ function save_object() { + $this->DivListSystem->save_object(); } @@ -977,195 +738,118 @@ class systems extends plugin { } - function show_header($button_text, $text, $disabled= FALSE) - { - } - function reload() { - /* Load terminal shortcuts */ - $responsible= array(); - foreach ($this->config->departments as $key => $value){ - if (get_module_permission(get_permissions ($value, $this->ui->subtreeACL), - "terminal", $value) == "#all#"){ - $responsible[$key]= $value; - } - } - - /* Get config */ - $terminalfilter= get_global('terminalfilter'); - $filter= ""; + /* some var init */ + $ui = get_userinfo(); + $res = array(); + $this->terminals = array(); + $userregex = ""; /* Set base for all searches */ - $base= $_SESSION['CurrentMainBase']; + $base= $this->DivListSystem->selectedBase; - /* Regex filter? */ - if ($terminalfilter['regex'] != ""){ - $regex= $terminalfilter['regex']; - } else { - $regex= "*"; - } - - /* Get list of terminals to be shown */ - if ($terminalfilter['thins'] == "checked"){ - $termfilter= "(&(objectClass=goHard)(cn=$regex))"; - } else { - $termfilter= ""; - } - if ($terminalfilter['workstations'] == "checked"){ - $workfilter= "(&(objectClass=gotoWorkstation)(cn=$regex))"; - } else { - $workfilter= ""; - } - if ($terminalfilter['winstations'] == "checked"){ + /* Prepare samba class name */ + $samba =""; + if ($this->DivListSystem->ShowWinWorkstations){ if ($this->config->current['SAMBAVERSION'] == "3"){ $samba= "sambaSamAccount"; } else { $samba= "sambaAccount"; } - $winfilter= "(&(objectClass=$samba)(cn=$regex\$))"; - } else { - $winfilter= ""; - } - if ($terminalfilter['printers'] == "checked"){ - $printfilter= "(&(objectClass=gotoPrinter)(cn=$regex))"; - } else { - $printfilter= ""; - } - if ($terminalfilter['phones'] == "checked"){ - $phonefilter= "(&(objectClass=goFonHardware)(cn=$regex))"; - } else { - $phonefilter= ""; - } - if ($terminalfilter['netdev'] == "checked"){ - $netfilter= "(&(objectClass=ieee802Device)(cn=$regex))"; - } else { - $netfilter= ""; - } - if ($terminalfilter['servers'] == "checked"){ - $serverfilter= "(&(objectClass=goServer)(cn=$regex))"; - } else { - $serverfilter= ""; } - /* User filter? */ - if ($terminalfilter['user'] != "" && $terminalfilter['user'] != "*"){ - $filter.= "(gotoLastUser=".$terminalfilter['user'].")"; + /* This array represents the combination between checkboxes and search filters */ + $objs = array( "ShowServers" => array("CLASS" => "goServer" ,"TREE" => "ou=servers,ou=systems," ), + "ShowTerminals" => array("CLASS" => "gotoTerminal" ,"TREE" => "ou=terminals,ou=systems,"), + "ShowPrinters" => array("CLASS" => "gotoPrinter" ,"TREE" => "ou=printers,ou=systems," ), + "ShowDevices" => array("CLASS" => "ieee802Device" ,"TREE" => "ou=netdevices,ou=systems," ), + "ShowPhones" => array("CLASS" => "goFonHardware" ,"TREE" => "ou=phones,ou=systems," ), + "ShowWorkstations" => array("CLASS" => "gotoWorkstation" ,"TREE" => "ou=workstations,ou=systems," ), + "ShowWinWorkstations"=> array("CLASS" => $samba ,"TREE" => get_winstations_ou() )); + + /* Include the 'Display Systems of user' attribute */ + if ((!empty($this->DivListSystem->UserRegex)) && ($this->DivListSystem->UserRegex!= "*")){ + $userregex = "(gotoLastUser=".$this->DivListSystem->UserRegex.")"; } - /* Get all gotoTerminal's */ - $this->terminals= array(); - - //FIXME: All get_list calls are called without GL_SIZELIMIT? All contain sambaDomainName??? - $res= get_list("(|$termfilter)", $this->ui->subtreeACL, "ou=terminals,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE); - - $res= array_merge($res, - get_list("(|$termfilter)", $this->ui->subtreeACL, "ou=incoming,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$serverfilter)", $this->ui->subtreeACL, "ou=servers,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$phonefilter)", $this->ui->subtreeACL, "ou=phones,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$netfilter)", $this->ui->subtreeACL, "ou=netdevices,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$printfilter)", $this->ui->subtreeACL, "ou=printers,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$workfilter)", $this->ui->subtreeACL, "ou=workstations,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - - $res= array_merge($res, - get_list("(|$winfilter)", $this->ui->subtreeACL, "ou=winstations,ou=systems,".$base, - array("cn", "description", "macAddress", "objectClass", "sambaDomainName"), GL_NONE)); - -/* NEW LIST MANAGMENT - * We also need to search for the departments - * So we are able to navigate like in konquerer - */ - - $peopleOU = get_people_ou(); - - if(empty($peopleOU)){ - $base2 = $base; - }else{ - $base2 = preg_replace("/".$peopleOU."/i","",$base); - } - - $res3= get_list("(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))", $this->ui->subtreeACL, - $base2, array("ou", "description"), GL_SIZELIMIT | GL_CONVERT); - - $this->departments= array(); - $tmp = array(); - foreach ($res3 as $value){ - $tmp[strtolower($value['dn']).$value['dn']]=$value; - } - ksort($tmp); - foreach($tmp as $value){ - if(isset($value["description"][0])){ - $this->departments[$value['dn']]= get_sub_department($value['dn'])." - [".$value["description"][0]."]"; - }else{ - $this->departments[$value['dn']]= get_sub_department($value['dn']);//$value["description"][0]; - } + /* Attributes to fetch */ + $sys_attrs = array("cn", "description", "macAddress", "objectClass", "sambaDomainName"); + $sys_categories = array("terminal", "workstation", "server", "phone" ,"printer"); + + /* Add FAIstate to attributes if FAI is activated */ + $tmp = search_config($this->config->data,"faiManagement","CLASS"); + if(!empty($tmp)){ + $sys_attrs[] = "FAIstate"; + } + + /* Walk through all possible search combinations, and search for some objects if the checkbox is enabled */ + foreach($objs as $checkBox => $oc){ + if($this->DivListSystem->$checkBox){ + if($this->DivListSystem->SubSearch){ + if($oc['CLASS'] != ""){ + $filter = "(|(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex.")))"; + $new_res = get_list($filter, $sys_categories , $base,$sys_attrs, GL_NONE | GL_SUBSEARCH | GL_SIZELIMIT); + + /* Remove all objects that are not in the expected sub department */ + foreach($new_res as $key => $obj){ + if(preg_match("/^[^,]+,".normalizePreg($oc['TREE'])."/",$obj['dn'])){ + $res[$obj['dn']] = $obj; + } + } + } + }else{ + /* User filter? */ + if($oc['CLASS'] != ""){ + $filter = "(|(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex.")))"; + $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs, GL_NONE | GL_SIZELIMIT)); + } + } + } } - /* END NEW LIST MANAGMENT - */ - + /* Search for incoming objects */ + $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))"; + $res = array_merge($res,get_list($filter,$sys_categories,"ou=incoming,".$base,$sys_attrs, GL_NONE | GL_SIZELIMIT)); + /* Get all gotoTerminal's */ foreach ($res as $value){ - /* Look for new terminals and mark them with '+' */ - $tmp= ""; - if (preg_match('/,ou=terminals,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=terminals,ou=systems,/i", "", $value["dn"]); - } - if (preg_match('/,ou=workstations,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=workstations,ou=systems,/i", "", $value["dn"]); - } - if (preg_match('/,ou=servers,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=servers,ou=systems,/i", "", $value["dn"]); - } - if (preg_match('/,'.get_winstations_ou().'/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*".get_winstations_ou()."/i", "", $value["dn"]); - } - if (preg_match('/,ou=printers,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=printers,ou=systems,/i", "", $value["dn"]); - } - if (preg_match('/,ou=phones,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=phones,ou=systems,/i", "", $value["dn"]); - } - if (preg_match('/,ou=netdevices,ou=systems,/i', $value["dn"])){ - $tmp= preg_replace("/^[^,]+,[^o]*ou=netdevices,ou=systems,/i", "", $value["dn"]); + $tmp= $value['dn']; + $add= ""; + + /* Extract base */ + foreach($objs as $obj){ + if(preg_match("/,".$obj['TREE']."/i",$value['dn'])){ + $tmp = trim( preg_replace("/^[^,]+,[^o]*".$obj['TREE']."/i","",$value['dn'])); + } } - if ($tmp == ""){ - $tmp= $value["dn"]; + + /* Create a string containing the last part of the department. */ + $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 ("/,ou=incoming,/i", $tmp)){ - if (in_array('gotoTerminal', $value['objectClass'])){ + if (in_array_ics('gotoTerminal', $value['objectClass'])){ $add= "- "._("New terminal"); - }elseif (in_array('gotoWorkstation', $value['objectClass'])){ + }elseif (in_array_ics('gotoWorkstation', $value['objectClass'])){ $add= "- "._("New workstation"); - }elseif (in_array('GOhard', $value['objectClass'])){ + }elseif (in_array_ics('GOhard', $value['objectClass'])){ $add= "- "._("New Device"); } - } else { - $add= ""; - } + } + /* Detect type of object and create an entry for $this->terminals */ $terminal = array(); - - if (in_array ($tmp, $responsible) || $add != ""){ - if (in_array('gotoTerminal', $value["objectClass"])){ + + if (in_array_ics('gotoTerminal', $value["objectClass"])){ + + /* check acl */ + $acl = $ui->get_permissions($value['dn'],"terminal/termgeneric"); + if($add != "" || preg_match("/r/",$acl)) { if (isset($value["macAddress"][0]) && $value["macAddress"][0] != "-"){ $terminal = $value; $terminal['type'] = "T"; @@ -1173,10 +857,14 @@ class systems extends plugin } else { $terminal = $value; $terminal['type'] = "D"; - $terminal['message'] = _("Terminal template for"); + $terminal['message'] = _("Terminal template for")." '".$dn_name."' "; $terminal['location'] = array_search($tmp, $this->config->departments); } - } elseif (in_array('gotoWorkstation', $value["objectClass"])){ + } + } elseif (in_array_ics('gotoWorkstation', $value["objectClass"])){ + + $acl = $ui->get_permissions($value['dn'],"workstation/workgeneric"); + if($add != "" || preg_match("/r/",$acl)) { if (isset($value["macAddress"][0]) && $value["macAddress"][0] != "-"){ $terminal = $value; $terminal['type'] = "L"; @@ -1185,35 +873,73 @@ class systems extends plugin $terminal = $value; $terminal['type'] = "D"; $terminal['location'] = array_search($tmp, $this->config->departments); - $terminal['message'] = _("Workstation template for"); + $terminal['message'] = _("Workstation template for")." '".$dn_name."' "; } - } elseif (in_array('gotoPrinter', $value["objectClass"])){ - $terminal = $value; - $terminal['type'] = "P"; - } elseif (in_array('goServer', $value["objectClass"])){ - $terminal = $value; - $terminal['type'] = "S"; - } elseif (in_array('goFonHardware', $value["objectClass"])){ - $terminal = $value; - $terminal['type'] = "F"; - }elseif (in_array("GOhard",$value['objectClass'])){ + if (isset($value["FAIstate"][0])){ + $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); + } + } + } elseif (in_array_ics('gotoPrinter', $value["objectClass"])){ + + + $acl = $ui->get_permissions($value['dn'],"printer/printgeneric"); + if($add != "" || preg_match("/r/",$acl)) { + + $terminal = $value; + $terminal['type'] = "P"; + } + } elseif (in_array_ics('goServer', $value["objectClass"])){ + + $acl = $ui->get_permissions($value['dn'],"server/servgeneric"); + if($add != "" || preg_match("/r/",$acl)) { + + $terminal = $value; + $terminal['type'] = "S"; + if (isset($value["FAIstate"][0])){ + $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]); + } + } + } elseif (in_array_ics('goFonHardware', $value["objectClass"])){ + + $acl = $ui->get_permissions($value['dn'],"phone/phoneGeneric"); + if($add != "" || preg_match("/r/",$acl)) { + + $terminal = $value; + $terminal['type'] = "F"; + } + }elseif (in_array_ics("GOhard",$value['objectClass'])){ + + $acl = $ui->get_permissions($value['dn'],"server/servgeneric"). + $ui->get_permissions($value['dn'],"terminal/termgeneric"). + $ui->get_permissions($value['dn'],"workstation/workgeneric"); + if($add != "" || preg_match("/r/",$acl)) { + $terminal = $value; $terminal['type'] = "Q"; $terminal['is_new'] = $add; - } elseif (in_array('ieee802Device', $value["objectClass"])){ - $terminal = $value; - $terminal['type'] = "C"; - } else{ - $name= preg_replace('/\$$/', '', $value['cn'][0]); - if (isset($value['sambaDomainName'])){ - $domain= " [".$value['sambaDomainName'][0]."]"; - } else { - $domain= ""; - } - $terminal=$value; - $terminal['type'] ="W"; - $terminal['domain'] = $name.$domain; } + } elseif (in_array_ics('ieee802Device', $value["objectClass"])){ + + $acl = $ui->get_permissions($value['dn'],"component/componentGeneric"); + if($add != "" || preg_match("/r/",$acl)) { + + $terminal = $value; + $terminal['type'] = "C"; + } + } else{ + + $name= preg_replace('/\$$/', '', $value['cn'][0]); + if (isset($value['sambaDomainName'])){ + $domain= " [".$value['sambaDomainName'][0]."]"; + } else { + $domain= ""; + } + $terminal=$value; + $terminal['type'] ="W"; + $terminal['domain'] = $name.$domain; + } + + if(count($terminal)){ $this->terminals[]=$terminal; } } @@ -1241,32 +967,83 @@ class systems extends plugin function get_system_type($classes) { $type= ""; - - if (in_array('ieee802Device', $classes)){ + if (in_array_ics('ieee802Device', $classes)){ $type= "component"; - }else - if (in_array('gotoTerminal', $classes)){ + }elseif (in_array_ics('gotoTerminal', $classes)){ $type= "terminal"; - }else - if (in_array('gotoWorkstation', $classes)){ + }elseif (in_array_ics('gotoWorkstation', $classes)){ $type= "workstation"; - }else - if (in_array('gotoPrinter', $classes)){ + }elseif (in_array_ics('gotoPrinter', $classes)){ $type= "printer"; - }else - if (in_array('goFonHardware', $classes)){ + }elseif (in_array_ics('goFonHardware', $classes)){ $type= "phone"; - }else - if (in_array('goServer', $classes)){ + }elseif (in_array_ics('goServer', $classes)){ $type= "server"; - }else - if (in_array('GOhard', $classes)){ + }elseif (in_array_ics('GOhard', $classes)){ $type= "NewDevice"; - }else - if (in_array('sambaAccount', $classes) || - in_array('sambaSamAccount', $classes)){ + }elseif (in_array_ics('sambaAccount', $classes) || + in_array_ics('sambaSamAccount', $classes)){ $type= "winstation"; } + return ($type); + } + + + function convert_list($input) + { + $temp= ""; + $conv= array( + "NQ" => array("select_newsystem.png",_("New System from incoming")), + "D" => array("select_default.png",_("Template")), + "T" => array("select_terminal.png",_("Terminal")), + "L" => array("select_workstation.png",_("Workstation")), + "GL" => array("select_workstation_green.png",_("Workstation is installing")), + "YL" => array("select_workstation_yellow.png",_("Workstation is waiting for action")), + "RL" => array("select_workstation_red.png",_("Workstation installation failed")), + "F" => array("select_phone.png",_("Phone")), + "S" => array("select_server.png",_("Server")), + "GS" => array("select_server_green.png",_("Server is installing")), + "YS" => array("select_server_yellow.png",_("Server is waiting for action")), + "RS" => array("select_server_red.png",_("Server installation failed")), + "W" => array("select_winstation.png",_("Winstation")), + "C" => array("select_component.png",_("Network Device")), + "NT"=> array("select_new_terminal.png",_("New Terminal")), + "NL"=> array("select_new_workstation.png",_("New Workstation")), + "P" => array("select_printer.png",_("Printer"))); + + if((isset($input['is_new']))&&(!empty($input['is_new']))){ + $input['type']="N".$input['type']; + } + foreach ($conv as $key => $value){ + if($input['type']==$key){ + $tmp['img'] ="".$key.""; + $tmp['class']=$key; + return $tmp; + } + } + } + + + function getState($type, $state) + { + switch (preg_replace('/:.*$/', '', $state)) { + case 'installing': + $type= 'G'.$type; + break; + case 'error': + $type= 'R'.$type; + break; + case 'install': + $type= 'Y'.$type; + break; + case 'sysinfo': + $type= 'Y'.$type; + break; + case 'softupdate': + $type= 'Y'.$type; + break; + } + return ($type); }