X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-plugins%2Fgoto%2Fadmin%2Fsystems%2Fgoto%2Fclass_workstationStartup.inc;h=f902a92e0608c4a8a6f759164175b8cf81f13f1b;hb=84795129287efd59af4a0f0e4817d0e6655de076;hp=555ddd8b4e02ddefe4527889ddfe781330f06244;hpb=72b3e1800ce430688a467297503aad6375689f89;p=gosa.git diff --git a/gosa-plugins/goto/admin/systems/goto/class_workstationStartup.inc b/gosa-plugins/goto/admin/systems/goto/class_workstationStartup.inc index 555ddd8b4..f902a92e0 100644 --- a/gosa-plugins/goto/admin/systems/goto/class_workstationStartup.inc +++ b/gosa-plugins/goto/admin/systems/goto/class_workstationStartup.inc @@ -1,18 +1,15 @@ "Eins ist toll", "zwei" => "Zwei ist noch besser"); - /* Ldap server list */ var $gotoLdapServers = array(); var $gotoLdapServerList = array(); var $gotoLdap_inherit = FALSE; /* Generic terminal attributes */ - var $bootmode = "G"; + # This is disabled as long there is no possiblilty to set these parameters + #var $bootmode = "G"; + var $bootmode = ""; var $gotoBootKernel = "default-inherited"; var $gotoKernelParameters = ""; var $gotoLdapServer = "default-inherited"; @@ -34,14 +31,15 @@ class workstartup extends plugin var $gotoAvailableShares= array();// Available Shares for this account /* Helper */ - var $customParameters = ""; var $orig_dn = ""; var $ignore_account = TRUE; /* FAI class selection */ var $FAIclass = array(); // The currently selected classes - var $FAIrelease = ""; - var $FAIdebianMirror = "auto"; + var $FAIrelease = ""; + var $FAIdebianMirror = "auto"; + var $si_active = FALSE; + var $si_fai_action_failed = FALSE; var $cache = array(); // Used as cache in fai mehtods @@ -64,7 +62,7 @@ class workstartup extends plugin { /* Check if FAI is active */ $tmp= $config->search("faiManagement", "CLASS",array('menu','tabs')); - if(!empty($tmp)){ + if(!empty($tmp) && class_available("faiManagement")){ $this->fai_activated = TRUE; }else{ $this->attributes = array("gotoLdapServer", "gotoBootKernel", "gotoKernelParameters", "gotoShare"); @@ -73,6 +71,9 @@ class workstartup extends plugin plugin::plugin ($config, $dn, $parent); + /* Check for si daemon */ + $this->si_active = $this->config->get_cfg_value("gosaSupportURI") != ""; + /* Check object group membership */ if(!isset($this->parent->by_object['ogroup'])){ $ldap = $this->config->get_ldap_link(); @@ -90,8 +91,14 @@ class workstartup extends plugin */ $ldap = $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - foreach($this->config->data['SERVERS']['LDAP'] as $server) { - $this->gotoLdapServerList[]= $server; + $ui = get_userinfo(); + foreach($this->config->data['SERVERS']['LDAP'] as $dn => $data){ + if($ui->get_category_permissions($data['dn'],"server",TRUE)){ + for($i = 0; $i < $data['goLdapBase']['count']; $i ++){ + $name = $data["cn"][0].":".$data["goLdapBase"][$i]; + $this->gotoLdapServerList[]= $name; + } + } } /* Get list of assigned ldap servers @@ -102,7 +109,9 @@ class workstartup extends plugin foreach($this->attrs['gotoLdapServer'] as $value){ $this->gotoLdapServers[] = preg_replace("/^[0-9]*:/","",$value); } - } + } + natcasesort($this->gotoLdapServerList); + if(!count($this->gotoLdapServers) && $this->member_of_ogroup){ $this->gotoLdap_inherit = TRUE; } @@ -112,8 +121,6 @@ class workstartup extends plugin */ if($this->fai_activated) { - $this->update_fai_cache(TRUE); - /* Parse used FAIclasses (stored as string). * The single classes are seperated by ' '. * There is also the release type given, after first @@ -121,7 +128,7 @@ class workstartup extends plugin */ $this->FAIclass =array(); if(isset($this->attrs['FAIclass'][0])){ - $tmp = split(" ",$this->attrs['FAIclass'][0]); + $tmp = explode(" ",$this->attrs['FAIclass'][0]); $tmp2 =array(); foreach($tmp as $class){ @@ -148,28 +155,12 @@ class workstartup extends plugin $this->$val= array_unique($this->$val); } - /* Parse Kernel Parameters to decide what boot mode is enabled */ - if (preg_match("/ splash=silent/", $this->gotoKernelParameters)){ - $this->bootmode= "G"; - } elseif (preg_match("/ debug/", $this->gotoKernelParameters)){ - $this->bootmode= "D"; - } elseif ($this->gotoKernelParameters == "") { - $this->bootmode= "G"; - } else { - $this->bootmode= "T"; - } - if (preg_match("/ o /", $this->gotoKernelParameters)){ - $this->customParameters= preg_replace ("/^.* o /", "", $this->gotoKernelParameters); - } else { - $this->customParameters= ""; - } - /* Prepare Shares */ if((isset($this->attrs['gotoShare']))&&(is_array($this->attrs['gotoShare']))){ unset($this->attrs['gotoShare']['count']); foreach($this->attrs['gotoShare'] as $share){ $tmp = $tmp2 = array(); - $tmp = split("\|",$share); + $tmp = explode("|",$share); $tmp2['server'] =$tmp[0]; $tmp2['name'] =$tmp[1]; $tmp2['mountPoint'] =$tmp[2]; @@ -220,8 +211,8 @@ class workstartup extends plugin break; case 'FAIclass': - $str = split(":",$attrs[$name][0]); - $this->InheritedFAIclass = split("\ ",trim($str[0])); + $str = explode(":",$attrs[$name][0]); + $this->InheritedFAIclass = explode(" ",trim($str[0])); $this->InheritedFAIrelease = trim($str[1]); break; @@ -232,21 +223,20 @@ class workstartup extends plugin } } + $this->update_fai_cache(); - if($this->fai_activated){ + if($this->fai_activated && !$this->si_fai_action_failed && $this->si_active){ /* Check if the current mirror is available */ if(!isset($this->cache['SERVERS'][$this->FAIdebianMirror])){ if(count($this->FAIclass)){ - print_red(sprintf(_("The selected FAI mirror '%s' is no longer available, the mirror was set to 'auto'."), - $this->FAIdebianMirror)); + msg_dialog::display(_("Error"), sprintf(_("FAI mirror '%s' is not available - setting to mirror 'auto'!"), $this->FAIdebianMirror), ERROR_DIALOG); } $this->FAIdebianMirror = "auto"; $this->FAIrelease = key($this->cache['SERVERS'][$this->FAIdebianMirror]); - $this->cache =array(); + $this->cache['CLASSES'] = array(); $this->update_fai_cache(); - } /* Check if the current mirror is available @@ -254,44 +244,23 @@ class workstartup extends plugin if(!isset($this->cache['SERVERS'][$this->FAIdebianMirror][$this->FAIrelease])){ $new_release = key($this->cache['SERVERS'][$this->FAIdebianMirror]); if(count($this->FAIclass)){ - print_red(sprintf(_("The selected FAI release '%s' is not available for mirror '%s', the release was set to '%s'."), - $this->FAIrelease,$this->FAIdebianMirror,$new_release)); + msg_dialog::display(_("Error"), sprintf(_("FAI release '%s' is not available on mirror '%s' - setting to release '%s'!"), $this->FAIrelease, $this->FAIdebianMirror,$new_release), ERROR_DIALOG); } $this->FAIrelease = $new_release; - $this->cache =array(); + $this->cache['CLASSES'] = array(); $this->update_fai_cache(); } } - /* Get list of boot kernels */ - if (isset($this->config->data['TABS'])){ - $command= $this->config->search(get_class($this), "KERNELS",array('tabs')); - if (!check_command($command)){ - $message[]= sprintf(_("Command '%s', specified as KERNELS hook for plugin '%s' doesn't seem to exist."), $command, - get_class($this)); - } else { - $fh= popen($command, "r"); - while (!feof($fh)) { - $buffer= trim(fgets($fh, 256)); - if(!empty($buffer)){ - $name=$value = $buffer; - if(preg_match("/:/",$buffer)){ - $name = preg_replace("/:.*$/","",$buffer); - $value= preg_replace("/^.*:/","",$buffer); - $this->gotoBootKernels[$name]= $name.":".$value; - }else{ - $this->gotoBootKernels[$name]= $value; - } - } - } - pclose($fh); - } - } - /* Turn to default, if we've nothing to inherit */ - if (!isset($this->gotoBootKernels['default-inherited']) && $this->gotoBootKernel == "default-inherited"){ - $this->gotoBootKernel= "default"; - } + // Prepare lists + $this->ldapList = new sortableListing(array(),array(), TRUE); + $this->ldapList->setDeleteable(true); + $this->ldapList->setEditable(false); + $this->ldapList->setWidth("100%"); + $this->ldapList->setHeight("100px"); + $this->ldapList->setHeader(array(_("LDAP server"))); + $this->ldapList->setDefaultSortColumn(0); } @@ -320,32 +289,22 @@ class workstartup extends plugin new log("view","workstation/".get_class($this),$this->dn); } - /* Do we need to flip is_account state? */ - if(isset($_POST['modify_state'])){ - if($this->is_account && $this->acl_is_removeable()){ - $this->is_account= FALSE; - }elseif(!$this->is_account && $this->acl_is_createable()){ - $this->is_account= TRUE; - } - } - /* Do we represent a valid terminal? */ if (!$this->is_account && $this->parent === NULL){ - $display= "\"\" ". - _("This 'dn' has no terminal features.").""; + $display= image("images/small-error.png")."".msgPool::noValidExtension(_("workstation")).""; return ($display); } /* Add module */ if (isset ($_POST['add_module'])){ - if ($_POST['module'] != "" && $this->acl_is_writeable("gotoModule")){ + if ($_POST['module'] != "" && $this->acl_is_writeable("gotoModules")){ $this->add_list ($this->gotoModules, $_POST['module']); } } /* Delete module */ if (isset ($_POST['delete_module'])){ - if (count($_POST['modules_list']) && $this->acl_is_writeable("gotoModule")){ + if (count($_POST['modules_list']) && $this->acl_is_writeable("gotoModules")){ $this->del_list ($this->gotoModules, $_POST['modules_list']); } } @@ -371,7 +330,7 @@ class workstartup extends plugin } if((isset($this->FAIclassInfo[$_POST['FAIclassesSel']]['FAIpartitionTable']))&&($found>0)){ - print_red(_("There is already a profile in your selection that contain partition table configurations.")); + msg_dialog::display(_("Error"), _("There is already a profile containing a partition table in your configuration!") , ERROR_DIALOG); }else{ $this->FAIclass[$_POST['FAIclassesSel']]=$_POST['FAIclassesSel']; } @@ -392,7 +351,7 @@ class workstartup extends plugin } if(($sort_type)&&(!$sort)){ - $value = base64_decode(preg_replace("/_.*$/i","",preg_replace("/".$sort_type."/i","",$name))); + $value = postDecode(preg_replace("/_.*$/i","",preg_replace("/".$sort_type."/i","",$name))); $sort = true; $last = -1; @@ -439,7 +398,7 @@ class workstartup extends plugin } if(preg_match("/fai_remove/i",$name)){ - $value = base64_decode(preg_replace("/_.*$/i","",preg_replace("/fai_remove_/i","",$name))); + $value = postDecode(preg_replace("/fai_remove_/i","",$name)); unset($this->FAIclass[$value]); } } @@ -476,12 +435,13 @@ class workstartup extends plugin /* if $_POST['gotoShareAdd'] is set, we will try to add a new entry * This entry will be, a combination of mountPoint and sharedefinitions */ - if((isset($_POST['gotoShareAdd'])) && ($this->acl_is_writeable("gotoShare"))) { + if((isset($_POST['gotoShareAdd'])) && isset($_POST['gotoShareSelection']) && ($this->acl_is_writeable("gotoShare"))) { /* We assign a share to this user, if we don't know where to mount the share */ if((!isset($_POST['gotoShareMountPoint']))||(empty($_POST['gotoShareMountPoint']))||(preg_match("/[\|]/i",$_POST['gotoShareMountPoint']))){ - print_red(_("You must specify a valid mount point.")); + msg_dialog::display(_("Error"), msgPool::required(_("Mount point")), ERROR_DIALOG); }else{ - if(count($this->gotoAvailableShares)){ + + if(isset($this->gotoAvailableShares[$_POST['gotoShareSelection']])){ $a_share = $this->gotoAvailableShares[$_POST['gotoShareSelection']]; $s_mount = $_POST['gotoShareMountPoint']; /* Preparing the new assignment */ @@ -503,13 +463,13 @@ class workstartup extends plugin $smarty->assign("gotoShareKeys",array_flip($this->printOutAssignedShares())); $smarty->assign("gotoBootKernels",$this->gotoBootKernels); - /* Create divSelectBox for ldap server selection - */ - $SelectBoxLdapServer = new divSelectBox("LdapServer"); - $SelectBoxLdapServer->SetHeight(130); + $this->ldapList->setAcl($this->getacl('gotoLdapServer')); /* Add new ldap server to the list */ - if(!$this->gotoLdap_inherit && isset($_POST['add_ldap_server']) && isset($_POST['ldap_server_to_add'])){ + if($this->acl_is_writeable("gotoLdapServer") && + !$this->gotoLdap_inherit && + isset($_POST['add_ldap_server']) && + isset($_POST['ldap_server_to_add'])){ if(isset($this->gotoLdapServerList[$_POST['ldap_server_to_add']])){ $to_add = $this->gotoLdapServerList[$_POST['ldap_server_to_add']]; if(!in_array($to_add,$this->gotoLdapServers)){ @@ -519,52 +479,38 @@ class workstartup extends plugin } /* Move ldap servers up and down */ - if(!$this->gotoLdap_inherit){ - foreach($_POST as $name => $value){ - if(preg_match("/sort_ldap_up_/",$name)){ - $id = preg_replace("/^sort_ldap_up_([0-9]*)_(x|y)$/","\\1",$name); - $from = $id; - $to = $id -1; - $tmp = $this->array_switch_item($this->gotoLdapServers,$from,$to); - if($tmp){ - $this->gotoLdapServers = $tmp; - } - break; - } - if(preg_match("/sort_ldap_down_/",$name)){ - $id = preg_replace("/^sort_ldap_down_([0-9]*)_(x|y)$/","\\1",$name); - $from = $id; - $to = $id +1; - $tmp = $this->array_switch_item($this->gotoLdapServers,$from,$to); - if($tmp){ - $this->gotoLdapServers = $tmp; - } - break; - } - if(preg_match("/gotoLdapRemove_/",$name)){ - $id = preg_replace("/^gotoLdapRemove_([0-9]*)_(x|y)$/","\\1",$name); - $value = $this->gotoLdapServers[$id]; - $this->gotoLdapServers = array_remove_entries(array($value),$this->gotoLdapServers); - break; - } - } + $this->ldapList->save_object(); + $action = $this->ldapList->getAction(); + if($action['action'] == 'reorder'){ + $this->gotoLdapServers = array_values($this->ldapList->getMaintainedData()); } - - /* Add Entries - */ + if($action['action'] == 'delete'){ + $id = $this->ldapList->getKey($action['targets'][0]); + $value = $this->gotoLdapServers[$id]; + $this->gotoLdapServers = array_remove_entries(array($value),$this->gotoLdapServers); + } + + /* Add Entries */ + $data = $lData = array(); foreach($this->gotoLdapServers as $key => $server){ - if(!in_array($server,$this->gotoLdapServerList)){ - $server = $server." (missing)"; - } + $data[$key]=$server; - $SelectBoxLdapServer->AddEntry( - array(array("string" => $server), - array("string" => - " ". - " ". - "", - "attach" => "style='text-align:right;width:40px;border-right:0px;'"))); - } + /* Announce missing entries */ + if(!in_array($server,$this->gotoLdapServerList)){ + $server = $server." (missing)"; + } + + /* Convert old style entry */ + if (!preg_match('%:ldaps?://%', $server)){ + $server= "ldap://".preg_replace('/^([^:]+):/', '\1/', $server); + } else { + $server= preg_replace("/^[^:]+:/", "", $server); + $lData[$key] = array('data'=>array($server)); + } + } + $this->ldapList->setListData($data,$lData); + $this->ldapList->update(); + $smarty->assign("usePrototype", "true"); if($this->gotoLdap_inherit){ $smarty->assign("gotoLdapServerACL_inherit", preg_replace("/w/","",$this->getacl("gotoLdapServer")));; @@ -575,10 +521,20 @@ class workstartup extends plugin $list = array(); foreach($this->gotoLdapServerList as $key => $entry){ if(!in_array($entry,$this->gotoLdapServers)){ + + /* Convert old style entry */ + if (!preg_match('%:ldap[s]*://%', $entry)){ + $entry= "ldap://".preg_replace('/^([^:]+):/', '\1/', $entry); + + /* Beautify new style entries */ + } else { + $entry= preg_replace("/^[^:]+:/", "", $entry); + } + $list[$key] = $entry; } } - $smarty->assign("gotoLdapServers", $SelectBoxLdapServer->DrawList()); + $smarty->assign("gotoLdapServers", $this->ldapList->render()); $smarty->assign("gotoLdapServerList", $list); $smarty->assign("gotoLdap_inherit", $this->gotoLdap_inherit); $smarty->assign("JS", session::get('js')); @@ -588,30 +544,47 @@ class workstartup extends plugin } /* Values */ - foreach(array("gotoBootKernel", "customParameters", "gotoShare","FAIclasses","FAIclass","FAIdebianMirror","FAIrelease") as $val){ + foreach(array("gotoBootKernel","gotoShare","FAIclasses","FAIclass","FAIdebianMirror","FAIrelease") as $val){ $smarty->assign($val, $this->$val); } $smarty->assign("fai_activated",$this->fai_activated); /* Create FAI output */ - if($this->fai_activated){ + $this->update_fai_cache(); + $smarty->assign("si_fai_action_failed",$this->si_fai_action_failed); + $smarty->assign("si_active",$this->si_active); - $this->update_fai_cache(); + $div = new divSelectBox("WSFAIscriptClasses"); + $div -> SetHeight("100"); + + if(!$this->si_fai_action_failed && $this->si_active && $this->fai_activated){ $smarty->assign("FAIservers" , $this->cache['SERVERS']); $smarty->assign("FAIdebianMirror",$this->FAIdebianMirror); $smarty->assign("FAIrelease" , $this->FAIrelease); $smarty->assign("FAIclasses" , $this->selectable_classes()); + /* Get classes for release from cache. + * Or build cache + */ + if($this->FAIdebianMirror == "inherited"){ + $release = $this->InheritedFAIrelease; + }else{ + $release = $this->FAIrelease; + } + + $smarty->assign("gotoBootKernels",$this->cache['KERNELS'][$release]); $smarty->assign("InheritedFAIrelease",$this->InheritedFAIrelease); - $div = new divSelectBox("WSFAIscriptClasses"); - $div -> SetHeight("110"); - $str_up = "  "; - $str_down = "  "; - $str_remove = "  "; - $str_empty = "  \"\""; + $str_empty = image('images/empty.png'); + if($this->acl_is_writeable("FAIclass")){ + $str_up = image('images/lists/sort-up.png','sort_up_%s'); + $str_down = image('images/lists/sort-down.png','sort_down_%s'); + $str_remove = image('images/lists/trash.png','fai_remove_%s'); + }else{ + $str_up=$str_down=$str_remove=$str_empty; + } /* Get classes */ if($this->FAIdebianMirror == "inherited"){ @@ -625,57 +598,71 @@ class workstartup extends plugin /* Draw every single entry */ $i = 1; - foreach($tmp as $class){ + if($this->acl_is_readable("FAIclass")){ + foreach($tmp as $class){ - /* Mark invalid classes. (Not in selected release) - */ - $marker = ""; - if(in_array_ics($class,$invalid)){ - $marker = " ("._("Not available in current setup").")"; - } + /* Mark invalid classes. (Not in selected release) + */ + $marker = ""; + if(in_array_ics($class,$invalid)){ + $marker = " ("._("Not available in current setup").")"; + } - /* Create up/down priority icons - * Skip this, if we have inherited the FAI classes. - */ - if($this->FAIdebianMirror == "inherited"){ - $str = ""; - }else{ - if($i==1){ - $str = $str_empty.$str_down.$str_remove; - }elseif($i == count($this->FAIclass)){ - $str = $str_up.$str_empty.$str_remove; + /* Create up/down priority icons + * Skip this, if we have inherited the FAI classes. + */ + if($this->FAIdebianMirror == "inherited"){ + $str = ""; }else{ - $str = $str_up.$str_down.$str_remove; + 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 ++ ; - - /* Get Description tag - * There may be several FAI objects with the same class name, - * use the description from FAIprofile, if possible. - */ - $desc = ""; - if(isset($this->cache['CLASSES'][$this->FAIrelease][$class])){ - foreach($this->cache['CLASSES'][$this->FAIrelease][$class] as $types ){ - if(isset($types['Desc'])){ - $desc= $types['Desc']; - if($types['Type'] == "FAIprofile"){ - break; + $i ++ ; + + /* Get Description tag + * There may be several FAI objects with the same class name, + * use the description from FAIprofile, if possible. + */ + $desc = ""; + + $objects = array( + "Pl" => array("IMG"=> "plugins/fai/images/fai_partitionTable.png"), + "Pt" => array("IMG"=> "plugins/fai/images/fai_packages.png"), + "S" => array("IMG"=> "plugins/fai/images/fai_script.png"), + "V" => array("IMG"=> "plugins/fai/images/fai_variable.png"), + "H" => array("IMG"=> "plugins/fai/images/fai_hook.png"), + "P" => array("IMG"=> "plugins/fai/images/fai_profile.png"), + "T" => array("IMG"=> "plugins/fai/images/fai_template.png")); + + if(isset($this->cache['CLASSES'][$this->FAIrelease][$class])){ + $desc =""; + foreach($this->cache['CLASSES'][$this->FAIrelease][$class] as $types ){ + if(isset($types['Abbr'])){ + $desc.= image($objects[$types['Abbr']]['IMG']); + if($types['Type'] == "FAIprofile"){ + break; + } } } } - } - if(!empty($desc)){ - $desc = " [".trim($desc)."]"; - } - - $div->AddEntry(array( - array("string"=>$class.$desc.$marker), - array("string"=>preg_replace("/\%s/",base64_encode($class),$str),"attach"=>"style='width:50px;border-right:none;'") - )); - } - $smarty->assign("FAIScriptlist",$div->DrawList()); + if(!empty($desc)){ + $desc = " ".trim($desc).""; + } + + $div->AddEntry(array( + array("string"=>$class.$marker), + array("string"=>$desc), + array("string"=>preg_replace("/\%s/",postEncode($class),$str),"attach"=>"style='width:60px;border-right:none;'") + )); + } + }// END FAI output generation }// END FAI output generation + $smarty->assign("FAIScriptlist",$div->DrawList()); /* Radio button group */ if (preg_match("/G/", $this->bootmode)) { @@ -695,6 +682,7 @@ class workstartup extends plugin } /* Show main page */ + $smarty->assign("gotoKernelParameters",$this->gotoKernelParameters); return($smarty->fetch (get_template_path('workstationStartup.tpl', TRUE,dirname(__FILE__)))); } @@ -730,11 +718,6 @@ class workstartup extends plugin if ($this->acl_is_writeable("bootmode") && isset($_POST["bootmode"])){ $this->bootmode= $_POST["bootmode"]; } - - /* Save kernel parameters */ - if ($this->acl_is_writeable("gotoKernelParameters") && isset($_POST["customParameters"])){ - $this->customParameters= $_POST["customParameters"]; - } } } @@ -755,7 +738,9 @@ class workstartup extends plugin }elseif(isset($this->parent->by_object['servgeneric'])){ $this->objectclasses = array("GOhard","gotoWorkstationTemplate"); }else{ - print "Object Type Configuration : unknown"; + msg_dialog::display(_("Fatal error"), + "Object Type Configuration is unknown. Please contact the GOsa developers.", + FATAL_ERROR_DIALOG); exit(); } @@ -771,7 +756,7 @@ class workstartup extends plugin $ldap= $this->config->get_ldap_link(); /* Strip relevant part from dn, keep trailing ',' */ - $tmp= preg_replace("/^cn=[^,]+,".get_ou('terminalou')."/i", "", $this->dn); + $tmp= preg_replace("/^cn=[^,]+,".preg_quote(get_ou('terminalRDN'), '/')."/i", "", $this->dn); $tmp= preg_replace("/".$this->config->current['BASE']."$/i", "", $tmp); /* Walk from top to base and try to load default values for @@ -779,7 +764,7 @@ class workstartup extends plugin while (TRUE){ $tmp= preg_replace ("/^[^,]+,/", "", $tmp); - $ldap->cat("cn=default,".get_ou('terminalou').$tmp. + $ldap->cat("cn=default,".get_ou('terminalRDN').$tmp. $this->config->current['BASE'], array('gotoTerminalPath')); $attrs= $ldap->fetch(); if (isset($attrs['gotoTerminalPath'])){ @@ -794,46 +779,28 @@ class workstartup extends plugin } } - /* Add semi automatic values */ - // FIXME: LDAP Server may not be set here... - $this->gotoKernelParameters= "ldap=".base64_encode($this->gotoLdapServer); - - switch ($this->bootmode){ - case "D": - $this->gotoKernelParameters.= " debug"; - break; - case "G": - $this->gotoKernelParameters.= " splash=silent"; - break; - } - if ($this->customParameters != ""){ - $this->gotoKernelParameters.= " o ".$this->customParameters; - } - plugin::save(); unset( $this->attrs['FAIrelease'] ); - $str = ""; /* Skip FAI attribute handling if not necessary */ - if($this->fai_activated){ + if($this->fai_activated && !$this->si_fai_action_failed){ if($this->FAIdebianMirror == "inherited"){ - $this->attrs['FAIclass'] = $this->attrs['FAIrelease'] = $this->attrs['FAIdebianMirror'] = array(); + $this->attrs['FAIclass'] = $this->attrs['FAIrelease'] = $this->attrs['FAIdebianMirror'] = array(); }else{ foreach($this->FAIclass as $class){ $str .= $class." "; } - $str .= ":" . $this->FAIrelease; - $this->attrs['FAIclass']= ""; - $this->attrs['FAIclass']= trim($str); - + $str = trim($str); if(empty($this->attrs['FAIclass'])){ $this->attrs['FAIclass'] = array(); + }else{ + $this->attrs['FAIclass']= $str." :".$this->FAIrelease; } } } - + /* Add missing arrays */ foreach (array("gotoFilesystem", "gotoAutoFs", "gotoModules") as $val){ if (isset ($this->$val) && count ($this->$val) != 0){ @@ -853,10 +820,7 @@ class workstartup extends plugin } } - /* Check if LDAP server has changed */ - $ldap_changed= ($this->attrs['gotoLdapServer'] != $this->saved_attributes['gotoLdapServer']); - - if (($this->attrs['gotoBootKernel'] == "default-inherited") || ($this->attrs['gotoBootKernel'] == "%default%")){ + if ($this->attrs['gotoBootKernel'] == "default-inherited"){ $this->attrs['gotoBootKernel']= array(); } @@ -871,7 +835,7 @@ class workstartup extends plugin /* Skip FAI attribute handling if not necessary */ - if($this->fai_activated){ + if($this->fai_activated && !$this->si_fai_action_failed && $this->si_active){ $ldap->cat($this->dn,array("FAIstate")); $checkFAIstate = $ldap->fetch(); @@ -880,30 +844,81 @@ class workstartup extends plugin $this->attrs['FAIclass'] = array(); $this->attrs['FAIdebianMirror'] = array(); } - } + }else{ + /* Don't touch FAI objects if something went wrong with the si daemon. + */ + if(isset($this->attrs['FAIclass'])) unset($this->attrs['FAIclass']); + if(isset($this->attrs['FAIdebianMirror'])) unset($this->attrs['FAIdebianMirror']); + } /* prepare share settings */ $tmp = array(); foreach($this->gotoShares as $name => $settings){ - $tmp2= split("\|",$name); + $tmp2= explode("|",$name); $name = $tmp2[0]; $tmp[] = $settings['server']."|".$name."|".$settings['mountPoint']; } $this->attrs['gotoShare']=$tmp; - $this->cleanup(); $ldap->modify ($this->attrs); new log("modify","workstation/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); - show_ldap_error($ldap->get_error(), sprintf(_("Saving of system workstation/startup with dn '%s' failed."),$this->dn)); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class())); + } $this->handle_post_events("modify"); /* Check if LDAP server has changed */ - if ($ldap_changed){ - gosaSupportDaemon::send("gosa_reload_ldap_config", $this->parent->by_object['workgeneric']->netConfigDNS->macAddress); - } + if ((isset($this->attrs['gotoLdapServer']) && class_available("DaemonEvent")) || $this->gotoLdap_inherit){ + $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT); + $o_queue = new gosaSupportDaemon(); + if(isset($events['TRIGGERED']['DaemonEvent_reload_ldap_config'])){ + $evt = $events['TRIGGERED']['DaemonEvent_reload_ldap_config']; + $macs = array(); + + /* Get list of macAddresses + */ + if(isset($this->parent->by_object['ogroup'])){ + + /* If we are an object group, add all member macs + */ + $p = $this->parent->by_object['ogroup']; + foreach($p->memberList as $dn => $obj){ + if(isset($p->objcache[$dn]['macAddress']) && !empty($p->objcache[$dn]['macAddress'])){ + $macs[] = $p->objcache[$dn]['macAddress']; + } + } + }elseif(isset($this->parent->by_object['workgeneric']->netConfigDNS->macAddress)){ + + /* We are a workstation. Add current mac. + */ + $mac = $this->parent->by_object['workgeneric']->netConfigDNS->macAddress; + if(!empty($mac)){ + $macs[] = $mac; + } + }elseif(isset($this->parent->by_object['servgeneric']->netConfigDNS->macAddress)){ + + /* We are a server. Add current mac. + */ + $mac = $this->parent->by_object['servgeneric']->netConfigDNS->macAddress; + if(!empty($mac)){ + $macs[] = $mac; + } + } + /* Trigger event for all member objects + */ + foreach($macs as $mac){ + $tmp = new $evt['CLASS_NAME']($this->config); + $tmp->set_type(TRIGGERED_EVENT); + $tmp->add_targets(array($mac)); + if(!$o_queue->append($tmp)){ + msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG); + } + } + } + } } @@ -951,7 +966,8 @@ class workstartup extends plugin plugin::PrepareForCopyPaste($source); $source_o = new workstartup ($this->config, $source['dn']); foreach(array("FAIclass","gotoModules", "gotoAutoFs", "gotoFilesystem", - "gotoKernelParameters","gotoShares","customParameters") as $attr){ + "gotoKernelParameters","gotoShares","gotoLdapServers","gotoLdapServerList", + "gotoLdap_inherit") as $attr){ $this->$attr = $source_o->$attr; } } @@ -991,6 +1007,7 @@ class workstartup extends plugin "plProvidedAcls"=> array( "gotoLdapServer" => _("Ldap server"), "gotoBootKernel" => _("Boot kernel"), + "bootmode" => _("Boot mode"), "gotoKernelParameters" => _("Kernel parameter"), "gotoModules" => _("Kernel modules"), @@ -1012,49 +1029,41 @@ class workstartup extends plugin function update_fai_cache($first_call = FALSE) { $force = FALSE; + if(!$this->si_active) return; + $start = microtime(TRUE); + + if($this->si_fai_action_failed && !isset($_POST['fai_si_retry'])) return; + + $this->si_fai_action_failed = FALSE; /* Get the list of available servers and their releases. */ if($force || !isset($this->cache['SERVERS'])){ - $ldap = $this->config->get_ldap_link(); - $ldap->cd($this->config->current['BASE']); - $ldap->search("(&(FAIrepository=*)(objectClass=FAIrepositoryServer))",array("FAIrepository")); - $this->cache['SERVERS'] = array(); - /* Only add inherit option, if we are part in an object group - */ - if($this->member_of_ogroup){ - $this->cache['SERVERS']['inherited']=array(); - } + $o_queue = new gosaSupportDaemon(); + $tmp = $o_queue->FAI_get_server(); + if($o_queue->is_error()){ + msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG); + $this->si_fai_action_failed = TRUE; + $this->cache = array(); + return; + }else{ - /* Add auto value - */ - $this->cache['SERVERS']['auto'] = array(); - $sort_by = array("auto"); - $server_tmp = array("auto"=>array()); - while($attr = $ldap->fetch()){ - if(isset($attr['FAIrepository'])){ - for($i = 0 ; $i < $attr['FAIrepository']['count'] ; $i ++ ){ - $rep = $attr['FAIrepository'][$i]; - $tmp = split("\|",$rep); - if(count($tmp)==4){ - $sections = split(",",$tmp[3]); - $release = $tmp[2]; - $server = $tmp[1]; - $url = $tmp[0]; - $server_tmp[$url][$release]=$release; - $server_tmp['auto'][$release]=$release; - $sort_by[$url] = $url; - } - } + foreach($tmp as $entry){ + $rel = $entry['FAI_RELEASE']; + $this->cache['SERVERS']['auto'][$rel] = $rel; + $this->cache['SERVERS'][$entry['SERVER']][$rel] = $rel; + uksort($this->cache['SERVERS']['auto'], 'strnatcasecmp'); + uksort($this->cache['SERVERS'][$entry['SERVER']], 'strnatcasecmp'); } } - natcasesort($sort_by); - foreach($sort_by as $name){ - $releases = $server_tmp[$name]; - natcasesort($releases); - $this->cache['SERVERS'][$name] = $releases; - } + } + + /* Ensure that our selection is valid, else we get several PHP warnings + if there is no FAI configuration at all. + */ + if(!isset($this->cache['SERVERS'][$this->FAIdebianMirror])){ + $this->cache['SERVERS'][$this->FAIdebianMirror][''] =''; } /* Build up arrays, without checks */ @@ -1069,7 +1078,10 @@ class workstartup extends plugin /* Check if the selected release is available */ if($this->FAIdebianMirror != "inherited" && !isset($this->cache['SERVERS'][$this->FAIdebianMirror][$this->FAIrelease])){ - trigger_error("There was a problem with the selected FAIrelease. This release ('".$this->FAIrelease."') is not available"); + + if($this->FAIrelease != ""){ + trigger_error("There was a problem with the selected FAIrelease. This release ('".$this->FAIrelease."') is not available"); + } $this->FAIrelease = key($this->cache['SERVERS'][$this->FAIdebianMirror]); } } @@ -1082,75 +1094,83 @@ class workstartup extends plugin }else{ $release = $this->FAIrelease; } - if($force || !isset($this->cache['CLASSES'][$release])){ - /* Create a list of available releases. - * $this->cache['RELEASE_DNS'][ou=siga...,c=de] = "siga"; - * $this->cache['RELEASE_DNS'][ou=siga,ou=rc1,...,c=de] = "siga/rc1"; - */ - if($force || !isset($this->cache['RELEASE_DNS'])){ - $this->cache['RELEASE_DNS'] = array(); - $fai_ou_parts = preg_replace("/\/.*$/","",$this->FAIrelease); - $ldap = $this->config->get_ldap_link(); - $ldap->cd($this->config->current['BASE']); - $ldap->search("(objectClass=FAIbranch)",array("ou")); - while($attrs = $ldap->fetch()){ - if(preg_match("/".normalizePreg(get_ou("faiou"))."/",$attrs['dn'])){ - $this->cache['RELEASE_DNS'][$attrs['dn']] = $this->dn_to_release_name($attrs['dn']); - } - } - } + if($force || !isset($this->cache['CLASSES'][$release]) && $release != ""){ - /* Create list of available classes for the currenlty selected release. + /* Get the list of available servers and their releases. */ - $base = array_search($release,$this->cache['RELEASE_DNS']); - $this->cache['CLASSES'][$release] = array(); + $o_queue = new gosaSupportDaemon(); + $tmp = $o_queue->FAI_get_classes($release); - if(class_exists("FAI")){ - if(!empty($base)){ - $filter = "(|(objectClass=FAIpackageList)(objectClass=FAItemplate)(objectClass=FAIvariable)". - "(objectClass=FAIscript)(objectClass=FAIhook)(objectClass=FAIprofile)". - "(objectClass=FAIpartitionTable))"; - $list = FAI::get_all_objects_for_given_base($base,$filter,TRUE); - foreach($list as $attrs){ - $info = $this->analyse_fai_object($attrs); - if(count($info)){ - $this->cache['CLASSES'][$release][$attrs['cn'][0]][] = $info; - } - } - } + $this->cache['CLASSES'][$release] = array(); + if($o_queue->is_error()){ + msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG); + $this->si_fai_action_failed = TRUE; + $this->cache=array(); + return; }else{ - print_red(_("Could not load available classes, the fai extension plugin seems not to be installed.")); + foreach($tmp as $entry){ + $class = $entry['CLASS']; + $this->cache['CLASSES'][$release][$class][] = $this->analyse_fai_object($entry); + } } /* Add object caught from external hook */ $lines= $this->GetHookElements(); foreach ($lines as $hline){ - $entries= split(";", $hline); + $entries= explode(";", $hline); $server = $entries['0']; $url = $entries['1']; if (!empty($url)){ - + /* Split releases */ if (isset($entries[2])){ - $releases= split(",", $entries[2]); + $releases= explode(",", $entries[2]); foreach ($releases as $release_data){ - $release= preg_replace('/:.*$/', '', $release_data); - $sections = split(':', preg_replace('/^[^:]+:([^|]+)|.*$/', '\1', $release_data)); - $classes = split('\|', preg_replace('/^[^|]+\|(.*)$/', '\1', $release_data)); - $this->cache['SERVERS'][$url][$release]=$release; - $this->cache['SERVERS']['auto'][$release]=$release; - foreach ($classes as $class){ - if ($class != ""){ - $this->cache['CLASSES'][$release][$class]= array(); + $release_c = preg_replace('/:.*$/', '', $release_data); + $sections_c = explode(':', preg_replace('/^[^:]+:([^|]+)|.*$/', '\1', $release_data)); + $classes_c = explode('|', preg_replace('/^[^|]+\|(.*)$/', '\1', $release_data)); + + if($release_c == $release){ + $this->cache['SERVERS'][$url][$release_c]=$release_c; + $this->cache['SERVERS']['auto'][$release_c]=$release_c; + foreach ($classes_c as $class){ + if ($class != ""){ + $this->cache['CLASSES'][$release_c][$class]= array(); + } } } } } } } + uksort($this->cache['SERVERS'], 'strnatcasecmp'); + + /* Only add inherit option, if we are part in an object group + */ + if($this->member_of_ogroup){ + $this->cache['SERVERS'] = array_merge(array('inherited' => array()),$this->cache['SERVERS']); + } + } + + /* Get list of available kernel for this release + */ + if(!isset($this->cache['KERNELS'])) $this->cache['KERNELS'] = array(); + + if($force || !isset($this->cache['KERNELS'][$release])){ + $o_queue = new gosaSupportDaemon(); + $tmp = $o_queue->FAI_get_kernels($release); + $this->cache['KERNELS'][$release] = array(); + foreach($this->gotoBootKernels as $name => $default){ + $this->cache['KERNELS'][$release][$name] = $default; + } + foreach($tmp as $kernel){ + if(empty($kernel)) continue; + $this->cache['KERNELS'][$release][$kernel]=$kernel; + } + ksort($this->cache['KERNELS'][$release]); } } @@ -1161,10 +1181,12 @@ class workstartup extends plugin function get_invalid_classes($classes) { $this->update_fai_cache(); - if($this->FAIdebianMirror == "inherited"){ + if($this->FAIdebianMirror == "inherited" && isset($this->cache['CLASSES'][$this->InheritedFAIrelease])){ $release_classes = $this->cache['CLASSES'][$this->InheritedFAIrelease]; - }else{ + }elseif(isset($this->cache['CLASSES'][$this->FAIrelease])){ $release_classes = $this->cache['CLASSES'][$this->FAIrelease]; + }else{ + $release_classes = array(); } @@ -1187,16 +1209,19 @@ class workstartup extends plugin { $this->update_fai_cache(); - if($this->FAIdebianMirror == "inherited"){ + if($this->FAIdebianMirror == "inherited" && isset($this->cache['CLASSES'][$this->InheritedFAIrelease])){ $classes = $this->cache['CLASSES'][$this->InheritedFAIrelease]; - }else{ + }elseif(isset($this->cache['CLASSES'][$this->FAIrelease])){ $classes = $this->cache['CLASSES'][$this->FAIrelease]; + }else{ + $classes = array(); } $Abbr =""; $ret= array(); foreach($classes as $class_name => $class_types){ if(!in_array($class_name,$this->FAIclass)){ + $Abbr = ""; foreach($class_types as $type){ if(!preg_match("/".$type['Abbr']."/",$Abbr)){ $Abbr .= $type['Abbr']." "; @@ -1215,46 +1240,40 @@ class workstartup extends plugin */ function analyse_fai_object($attr) { - $tmp2 = array(); - if(!isset($attr['description'])){ - $attr['description'][0] =""; - } - if(in_array('FAIpackageList',$attr['objectClass'])){ - $tmp2["Type"] = 'FAIpackageList'; - $tmp2["Abbr"] = 'Pl'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAItemplate',$attr['objectClass'])){ - $tmp2["Type"] = 'FAItemplate'; - $tmp2["Abbr"] = 'T'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAIvariable',$attr['objectClass'])){ - $tmp2["Type"] = 'FAIvariable'; - $tmp2["Abbr"] = 'V'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAIscript',$attr['objectClass'])){ - $tmp2["Type"] = 'FAIscript'; - $tmp2["Abbr"] = 'S'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAIhook',$attr['objectClass'])){ - $tmp2["Type"] = 'FAIhook'; - $tmp2["Abbr"] = 'H'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAIpartitionTable',$attr['objectClass'])){ - $tmp2["Type"]= 'FAIpartitionTable'; - $tmp2["Abbr"]= 'Pt'; - $tmp2["Desc"] = $attr['description'][0]; - } - if(in_array('FAIprofile',$attr['objectClass'])){ - $tmp2["Type"]= 'FAIprofile'; - $tmp2["Abbr"]= 'P'; - $tmp2["Desc"] = $attr['description'][0]; - } - return($tmp2); + $tmp = array(); + switch($attr['TYPE']){ + + case 'FAIpackageList': + $tmp["Type"]= 'FAIpackageList'; + $tmp["Abbr"]= 'Pl'; + break; + case 'FAItemplate': + $tmp["Type"]= 'FAItemplate'; + $tmp["Abbr"]= 'T'; + break; + case 'FAIvariable': + $tmp["Type"]= 'FAIvariable'; + $tmp["Abbr"]= 'V'; + break; + case 'FAIscript': + $tmp["Type"]= 'FAIscript'; + $tmp["Abbr"]= 'S'; + break; + case 'FAIhook': + $tmp["Type"]= 'FAIhook'; + $tmp["Abbr"]= 'H'; + break; + case 'FAIpartitionTable': + $tmp["Type"]= 'FAIpartitionTable'; + $tmp["Abbr"]= 'Pt'; + break; + case 'FAIprofile': + $tmp["Type"]= 'FAIprofile'; + $tmp["Abbr"]= 'P'; + break; + default: trigger_error("Unknown FAI object type!");; + } + return($tmp); } @@ -1263,16 +1282,16 @@ class workstartup extends plugin function GetHookElements() { $ret = array(); - $cmd= $this->config->search("servrepository", "REPOSITORY_HOOK",array('tabs')); + $cmd= $this->config->search("servrepository", "repositoryBranchHook",array('tabs')); if(!empty($cmd)){ $res = shell_exec($cmd); $res2 = trim($res); if((!$res)){ - print_red(sprintf(_("Can't execute specified REPOSITORY_HOOK '%s' please check your gosa.conf."),$cmd)); + msg_dialog::display(_("Configuration error"), msgPool::cmdexecfailed("repositoryBranchHook", $cmd), ERROR_DIALOG); }elseif(empty($res2)){ - print_red(sprintf(_("The specified REPOSITORY_HOOK '%s', specified in your gosa.conf, returns an empty string."),$cmd)); + msg_dialog::display(_("Configuration error"), _("'repositoryBranchHook' returned no result!"), ERROR_DIALOG); }else{ - $tmp = split("\n",$res); + $tmp = preg_split("/\n/",$res); foreach($tmp as $line){ if(empty($line)) continue; $ret[]= $line; @@ -1288,8 +1307,8 @@ class workstartup extends plugin */ function dn_to_release_name($dn) { - $relevant = preg_replace("/,".normalizePreg(get_ou("faiou")).".*$/","",$dn); - $parts = array_reverse(split("\,",$relevant)); + $relevant = preg_replace("/,".preg_quote(get_ou("faiBaseRDN"), '/').".*$/i","",$dn); + $parts = array_reverse(explode(",",$relevant)); $str =""; foreach($parts as $part){ $str .= preg_replace("/^ou=/","",$part)."/";