X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fsystems%2Fclass_workstationStartup.inc;h=07a925b61fed2d0d44e97c36b1ccb5ff5f66c9ac;hb=e99742e600fa6fa4b514d9209ee7641ea51260c5;hp=ea0ec3a0c2d106a05a5dff60b14c95b5963555b1;hpb=1c81fb45e2b074332e18e61a97fe8c250d51f4e4;p=gosa.git diff --git a/plugins/admin/systems/class_workstationStartup.inc b/plugins/admin/systems/class_workstationStartup.inc index ea0ec3a0c..07a925b61 100644 --- a/plugins/admin/systems/class_workstationStartup.inc +++ b/plugins/admin/systems/class_workstationStartup.inc @@ -7,24 +7,25 @@ class workstartup extends plugin var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); /* Generic terminal attributes */ - var $bootmode= "G"; - var $goLdapServerList= array("default"); - var $gotoBootKernel= "default"; - var $gotoKernelParameters= ""; - var $gotoLdapServer= ""; - var $gotoModules= array(); - var $gotoAutoFs= array(); - var $gotoFilesystem= array(); - var $gotoTerminalPath= ""; - var $FAIstatus= ""; - var $FAIclass = array(); - var $FAIclasses = array(); - var $FAIclassInfo = array(); + var $bootmode = "G"; + var $goLdapServerList = array("default"); + var $gotoBootKernel = "default"; + var $gotoKernelParameters = ""; + var $gotoLdapServer = ""; + var $gotoModules = array(); + var $gotoAutoFs = array(); + var $gotoFilesystem = array(); + var $gotoTerminalPath = ""; + var $FAIstatus = ""; + var $FAIclass = array(); + var $FAIclasses = array(); + var $FAIclassInfo = array(); + var $FAIdebianMirror = "auto"; /* attribute list for save action */ - var $attributes= array("gotoLdapServer", "gotoBootKernel", "gotoKernelParameters", "FAIclass", "FAIstatus", "gotoShare"); - var $objectclasses= array("GOhard", "FAIobject"); + var $attributes = array("gotoLdapServer", "gotoBootKernel", "gotoKernelParameters", "FAIclass", "FAIstatus", "gotoShare","FAIdebianMirror"); + var $objectclasses = array("GOhard", "FAIobject"); /* Share */ var $gotoShares = array();// Currently Share Option @@ -33,14 +34,44 @@ class workstartup extends plugin var $gotoAvailableShares= array();// Available Shares for this account /* Helper */ - var $customParameters= ""; - var $orig_dn= ""; - var $ignore_account= TRUE; + var $customParameters = ""; + var $orig_dn = ""; + var $ignore_account = TRUE; + var $FAIdebianMirrors = array(); function workstartup ($config, $dn= NULL) { plugin::plugin ($config, $dn); + /* Creating a list of valid Mirrors + * none will not be saved to ldap. + */ + $this->FAIdebianMirrors = array(); + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(objectClass=FAIrepositoryServer)",array("FAIrepository")); + + /* attach all attributes with "index => cn" to avoid multiple entries */ + $ret = array(); + while($attr = $ldap->fetch()){ + if(isset($attr['FAIrepository'])){ + + unset($attr['FAIrepository']['count']); + + foreach($attr['FAIrepository'] as $rep){ + $tmp = split("\|",$rep); + $str = ""; + if(count($tmp)==4){ + $sections = split(",",$tmp[3]); + $str = $tmp[0]; + $ret[$str]=$sections; + } + } + } + } + ksort($ret); + $this->FAIdebianMirrors = $ret; + /* Get arrays */ foreach (array("gotoModules", "gotoAutoFs", "gotoFilesystem") as $val){ if (isset($this->attrs["$val"]["count"])){ @@ -85,95 +116,118 @@ class workstartup extends plugin $this->gotoShareSelections= $config->getShareList(true); $this->gotoAvailableShares= $config->getShareList(false); - - $tmp = array(); - $ldap = $this->config->get_ldap_link(); - $ldap->search("(objectClass=FAIprofile)",array("*")); - while($attr = $ldap->fetch()){ - $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; - $base = "ou=fai,".preg_replace("/^.*ou=fai,/","",$attr['dn']); - $cn = $attr['cn'][0]; - $tmp[$cn] = $base; - } - - $tmp2 = array(); - foreach($tmp as $cn => $base){ - - $ldap->cd($base); - $ldap->search("(&(objectClass=*)(cn=".$cn."))",array("objectClass","cn")); - while($attr = $ldap->fetch()){ - - if(in_array('FAIpackageList',$attr['objectClass'])){ - $tmp2[$cn]['FAIpackageList']['obj'] = 'FAIpackageList'; - $tmp2[$cn]['FAIpackageList']['kzl'] = 'P'; - } - if(in_array('FAItemplate',$attr['objectClass'])){ - $tmp2[$cn]['FAItemplate']['obj'] = 'FAItemplate'; - $tmp2[$cn]['FAItemplate']['kzl'] = 'T'; - } - if(in_array('FAIvariable',$attr['objectClass'])){ - $tmp2[$cn]['FAIvariable']['obj'] = 'FAIvariable'; - $tmp2[$cn]['FAIvariable']['kzl'] = 'V'; - } - if(in_array('FAIscript',$attr['objectClass'])){ - $tmp2[$cn]['FAIscript']['obj'] = 'FAIscript'; - $tmp2[$cn]['FAIscript']['kzl'] = 'S'; - } - if(in_array('FAIhook',$attr['objectClass'])){ - $tmp2[$cn]['FAIhook']['obj'] = 'FAIhook'; - $tmp2[$cn]['FAIhook']['kzl'] = 'H'; - } - if(in_array('FAIpartitionTable',$attr['objectClass'])){ - $tmp2[$cn]['FAIpartitionTable']['obj']= 'FAIpartitionTable'; - $tmp2[$cn]['FAIpartitionTable']['kzl']= 'Pt'; - } + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + /* Search all FAI objects */ + $ldap->search("(| (objectClass=FAIpackageList)(objectClass=FAItemplate) + (objectClass=FAIvariable)(objectClass=FAIscript)(objectClass=FAIhook)(objectClass=FAIprofile) + (objectClass=FAIpartitionTable))",array("*"),true); + /* Sort all entries, and attach elementtype. + * To be able to show the types in the listbox. + */ + while($attr = $ldap->fetch()){ + $cn = $attr['cn'][0]; + if(in_array('FAIpackageList',$attr['objectClass'])){ + $tmp2[$cn]['FAIpackageList']['obj'] = 'FAIpackageList'; + $tmp2[$cn]['FAIpackageList']['kzl'] = 'Pl'; + $tmp2[$cn]['FAIpackageList']['sec'] = $attr['FAIdebianSection']; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAItemplate',$attr['objectClass'])){ + $tmp2[$cn]['FAItemplate']['obj'] = 'FAItemplate'; + $tmp2[$cn]['FAItemplate']['kzl'] = 'T'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAIvariable',$attr['objectClass'])){ + $tmp2[$cn]['FAIvariable']['obj'] = 'FAIvariable'; + $tmp2[$cn]['FAIvariable']['kzl'] = 'V'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAIscript',$attr['objectClass'])){ + $tmp2[$cn]['FAIscript']['obj'] = 'FAIscript'; + $tmp2[$cn]['FAIscript']['kzl'] = 'S'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAIhook',$attr['objectClass'])){ + $tmp2[$cn]['FAIhook']['obj'] = 'FAIhook'; + $tmp2[$cn]['FAIhook']['kzl'] = 'H'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAIpartitionTable',$attr['objectClass'])){ + $tmp2[$cn]['FAIpartitionTable']['obj']= 'FAIpartitionTable'; + $tmp2[$cn]['FAIpartitionTable']['kzl']= 'Pt'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; + } + if(in_array('FAIprofile',$attr['objectClass'])){ + $tmp2[$cn]['FAIprofile']['obj']= 'FAIprofile'; + $tmp2[$cn]['FAIprofile']['kzl']= 'P'; + $this->FAIclasses[$attr['cn'][0]]=$attr['cn'][0]; } } + if(is_array($this->FAIclasses)){ + natcasesort($this->FAIclasses); + } $this->FAIclassInfo = $tmp2; - if(isset($this->attrs['FAIclass'])){ + if((isset($this->FAIclass))&&(!is_array($this->FAIclass))){ $tmp = array(); - $tmp2 = $this->attrs['FAIclass']; - unset($tmp2['count']); - foreach($tmp2 as $class){ - $tmp[$class] = $class; + $tmp = split(" ",$this->FAIclass); + $tmp2 =array(); + + foreach($tmp as $class){ + $tmp2[$class] = $class; } - $this->FAIclass = $tmp; + $this->FAIclass = $tmp2; } if(!is_array($this->FAIclass)){ - $this->FAIclass = array(); + $this->FAIclass =array(); } - $this->orig_dn= $this->dn; } + /* Create array to display available classes/profiles in a selectbox */ function selectFriendlyClasses(){ $tmp=array(); foreach($this->FAIclasses as $class){ $str = ""; + $skip = false; + if(isset($this->FAIclassInfo[$class])){ foreach($this->FAIclassInfo[$class] as $objs){ $str .= $objs['kzl']." "; } } - $tmp[$class] = $class."  [".$str."]"; + $tmp[$class] = $class."  [".$str."]"; + } + return($tmp); + } + + function check() + { + $messages = array(); + /* If there are packages selected, but no mirror show error */ + if(($this->FAIdebianMirror == "none")&&(count($this->FAIclass)>0)){ + $messages[]=_("Please select a 'FAI server' or remove the 'FAI classes'."); } - return($tmp); + return($messages); } function execute() { + /* Call parent execute */ + plugin::execute(); + /* Do we need to flip is_account state? */ if (isset($_POST['modify_state'])){ $this->is_account= !$this->is_account; } - /* Do we represent a valid terminal? */ if (!$this->is_account && $this->parent == NULL){ $display= "\"\" ". @@ -197,9 +251,11 @@ class workstartup extends plugin /* FAI class management */ if((isset($_POST['AddClass']))&&(isset($_POST['FAIclassesSel']))){ - $found = 0 ; + /* If this new class/profile will attach a second partition table + * to our list of classes, abort and show a message. + */ foreach($this->FAIclass as $name){ if(isset($this->FAIclassInfo[$name])){ foreach($this->FAIclassInfo[$name] as $atr){ @@ -210,13 +266,79 @@ class workstartup extends plugin } } - if((isset($this->FAIclassInfo[$_POST['FAIclassesSel']]['FAIpackageList']))&&($found>0)){ - print_red(_("There is already a profile in your selection that contain partition table configuratons.")); + if((isset($this->FAIclassInfo[$_POST['FAIclassesSel']]['FAIpartitionTable']))&&($found>0)){ + print_red(_("There is already a profile in your selection that contain partition table configurations.")); }else{ $this->FAIclass[$_POST['FAIclassesSel']]=$_POST['FAIclassesSel']; } } + $sort = false; + foreach($_POST as $name => $val){ + + $sort_type = false; + if((preg_match("/sort_up/",$name))&&(!$sort)){ + $sort_type = "sort_up_"; + } + if((preg_match("/sort_down/",$name))&&(!$sort)){ + $sort_type = "sort_down_"; + } + + if(($sort_type)&&(!$sort)){ + $value = base64_decode(preg_replace("/_.*$/i","",preg_replace("/".$sort_type."/i","",$name))); + $sort = true; + + $last = -1; + $change_down = -1; + + /* Create array with numeric index */ + $tmp = array(); + foreach($this->FAIclass as $class){ + $tmp [] = $class; + } + + /* Walk trough array */ + foreach($tmp as $key => $faiName){ + if($faiName == $value){ + if($sort_type == "sort_up_"){ + if($last != -1){ + $change_down= $last; + } + }else{ + if(isset($tmp[$key+1])){ + $change_down = $key; + } + } + } + $last = $key; + } + + $tmp2 = array(); + $skip = false; + + foreach($tmp as $ky => $vl){ + + if($ky == $change_down){ + $skip = $vl; + }else{ + $tmp2[$vl] = $vl; + } + if(($skip != false)&&($ky != $change_down)){ + $tmp2[$skip] = $skip; + $skip =false; + } + } + $this->FAIclass = $tmp2; + } + + + if(preg_match("/fai_remove/i",$name)){ + $value = base64_decode(preg_replace("/_.*$/i","",preg_replace("/fai_remove_/i","",$name))); + unset($this->FAIclass[$value]); + } + } + + /* Delete selected class from our list */ if((isset($_POST['DelClass']))&&(isset($_POST['FAIclassSel']))){ if(isset($this->FAIclass[$_POST['FAIclassSel']])){ unset($this->FAIclass[$_POST['FAIclassSel']]); @@ -244,8 +366,8 @@ class workstartup extends plugin $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']]; $s_mount = $_POST['gotoShareMountPoint']; /* Preparing the new assignment */ - $this->gotoShares[$a_share['name']]=$a_share; - $this->gotoShares[$a_share['name']]['mountPoint']=$s_mount; + $this->gotoShares[$a_share['name']."|".$a_share['server']]=$a_share; + $this->gotoShares[$a_share['name']."|".$a_share['server']]['mountPoint']=$s_mount; } } @@ -268,12 +390,40 @@ class workstartup extends plugin } /* Values */ - foreach(array("gotoBootKernel", "customParameters", "gotoShare","FAIclasses","FAIclass") as $val){ + foreach(array("gotoBootKernel", "customParameters", "gotoShare","FAIclasses","FAIclass","FAIdebianMirror") as $val){ $smarty->assign($val, $this->$val); $smarty->assign($val."ACL", chkacl($this->acl, $val)); } - + + $div = new divSelectBox("WSFAIscriptClasses"); + $div -> SetHeight("110"); + + $str_up = "  "; + $str_down = "  "; + $str_remove = "  "; + $str_empty = "  \"\""; + + $i = 1; + + foreach($this->FAIclass as $class){ + if($i==1){ + $str = $str_empty.$str_down.$str_remove; + }elseif($i == count($this->FAIclass)){ + $str = $str_up.$str_empty.$str_remove; + }else{ + $str = $str_up.$str_down.$str_remove; + } + $i ++ ; + + $div->AddEntry(array( + array("string"=>$class), + array("string"=>preg_replace("/\%s/",base64_encode($class),$str),"attach"=>"style='width:50px;border-right:none;'") + )); + } + + $smarty->assign("FAIScriptlist",$div->DrawList()); + $smarty->assign("FAIdebianMirrors",$this->getFAIdebianMirrors()); $smarty->assign("FAIclasses",$this->selectFriendlyClasses()); $smarty->assign("FAIclassesKeys",array_flip($this->selectFriendlyClasses())); $smarty->assign("FAIclassKeys",$this->FAIclass); @@ -301,18 +451,50 @@ class workstartup extends plugin } /* Show main page */ - return($smarty->fetch (get_template_path('workstationStartup.tpl', TRUE))); + return($smarty->fetch (get_template_path('workstationStartup.tpl', TRUE,dirname(__FILE__)))); } function remove_from_parent() { - $ldap= $this->config->get_ldap_link(); - $ldap->rmdir($this->dn); - show_ldap_error($ldap->get_error()); $this->handle_post_events("remove"); } + function getFAIdebianMirrors() + { + $ret = array(); + $ret['auto']=_("automatic"); + $secs = array(); + if(is_array($this->FAIclass)){ + foreach($this->FAIclass as $classes){ + if(isset($this->FAIclassInfo[ $classes]['FAIpackageList']['sec'])){ + if(isset($this->FAIclassInfo[ $classes]['FAIpackageList']['sec']['count'])){ + unset($this->FAIclassInfo[ $classes]['FAIpackageList']['sec']['count']); + } + if(is_array($this->FAIclassInfo[ $classes]['FAIpackageList']['sec'])){ + foreach($this->FAIclassInfo[ $classes]['FAIpackageList']['sec'] as $sec => $value){ + $secs[$value]= $value; + } + } + } + } + } + if(is_array($this->FAIdebianMirrors)){ + foreach($this->FAIdebianMirrors as $mirr=>$sections){ + $allok = true; + foreach($secs as $sec){ + if(!in_array($sec,$sections)){ + $allok = false; + } + } + if($allok){ + $ret[$mirr]=$mirr; + } + } + } + return($ret); + } + /* Save data to object */ function save_object() { @@ -333,6 +515,21 @@ class workstartup extends plugin /* Save to LDAP */ function save() { + + /* Depending on the baseobject (Ogroup / WS) we + * use another set of objectClasses + * In case of WS itself, we use "array("GOhard", "FAIobject");" + * if we are currently editing from ogroup menu we use (array("gotWorkstationTemplate","GOhard", "FAIobject")) + */ + if(isset($this->parent->by_object['ogroup'])){ + $this->objectclasses = array("gotoWorkstationTemplate","GOhard", "FAIobject"); + }elseif(isset($this->parent->by_object['workgeneric'])){ + $this->objectclasses = array("GOhard", "FAIobject"); + }else{ + print "unknown"; + exit(); + } + /* Find proper terminal path for tftp configuration FIXME: This is suboptimal when the default has changed to another location! */ @@ -382,13 +579,18 @@ class workstartup extends plugin $this->gotoKernelParameters.= " o ".$this->customParameters; } - $tmp = array(); + plugin::save(); + + $str = ""; foreach($this->FAIclass as $class){ - $tmp[] = $class; + $str .= $class." "; } - $this->FAIclass = $tmp; + $this->attrs['FAIclass']= ""; + $this->attrs['FAIclass']= trim($str); - plugin::save(); + if(empty($this->attrs['FAIclass'])){ + $this->attrs['FAIclass'] = array(); + } /* Add missing arrays */ foreach (array("gotoFilesystem", "gotoAutoFs", "gotoModules") as $val){ @@ -403,24 +605,31 @@ class workstartup extends plugin unset ($this->attrs['gotoLdapServer']); } - $tmp = array(); - foreach($this->FAIclass as $class){ - $tmp[] = $class; + /* if mirror == none stop saving this attribute */ + if($this->FAIdebianMirror == "none"){ + $this->FAIdebianMirror = ""; } - $this->attrs['FAIclass'] = $tmp; - /* Write back to ldap */ - - if(count($this->attrs['FAIclass'])==0){ + + if((count($this->attrs['FAIclass'])==0)&&(empty($this->FAIdebianMirror))){ $tmp = array(); foreach($this->attrs['objectClass'] as $class){ if($class != "FAIobject"){ $tmp[] = $class; } } - $this->attrs['objectClass'] = $tmp; - $this->attrs['FAIclass'] = array();; + $this->attrs['objectClass'] = $tmp; + $this->attrs['FAIclass'] = array(); + $this->attrs['FAIdebianMirror'] = array(); } - + + /* prepare share settings */ + $tmp = array(); + foreach($this->gotoShares as $name => $settings){ + $tmp2= split("\|",$name); + $name = $tmp2[0]; + $tmp[] = $settings['server']."|".$name."|".$settings['mountPoint']; + } + $this->attrs['gotoShare']=$tmp; $ldap= $this->config->get_ldap_link(); $ldap->cd($this->dn);