X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fsystems%2Fclass_servService.inc;h=1233484180d1b477faa62b5abf16a864dea77bcf;hb=ccaa264984e691fb1371b7e93e22e4fd9a2a6ba9;hp=e4984e3dead1910763bc60a64a5bba0fdf7d78d1;hpb=99de02aa3597e4d9fd13fb4fa062c17d3663a4f9;p=gosa.git diff --git a/plugins/admin/systems/class_servService.inc b/plugins/admin/systems/class_servService.inc index e4984e3de..123348418 100644 --- a/plugins/admin/systems/class_servService.inc +++ b/plugins/admin/systems/class_servService.inc @@ -8,6 +8,7 @@ class servservice extends plugin var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); var $goExportEntry = array(); + var $goExportEntryList= array(); var $goTimeSource = array(); var $goLdapBase = ""; var $goXdmcpIsEnabled = ""; @@ -35,9 +36,21 @@ class servservice extends plugin "goMailServer" => array(), "goCupsServer" => array()); - function servservice ($config, $dn= NULL) + var $allow_mounts = false; //do we allow mount entries? + var $mounts_to_add = array(); + var $mounts_to_remove = array(); + var $oldone = NULL; //temp dave for old mount entry + + function servservice ($config, $dn= NULL, $parent= NULL) { - plugin::plugin ($config, $dn); + + plugin::plugin ($config, $dn, $parent); + + $ldap = $this->config->get_ldap_link(); + $avl_objectclasses = $ldap->get_objectclasses(); + if (isset($avl_objectclasses["mount"])) { + $this->allow_mounts = true; + } /* Assemble final object class list */ foreach ($this->additionaloc as $oc => $dummy){ @@ -57,19 +70,17 @@ class servservice extends plugin $this->$name= $tmp; } - $tmp =array(); $tmp2=array(); if(isset($this->attrs['goExportEntry'])){ - unset($this->attrs['goExportEntry']['count']); - if((isset($this->attrs['goExportEntry']))&&(isset($this->attrs['goExportEntry']))){ - foreach($this->attrs['goExportEntry'] as $entry){ - $tmp2= split("\|",$entry); - $tmp[$tmp2[0]]= $entry; + if(isset($this->attrs['goExportEntry']['count'])){ + for($i= 0; $i<$this->attrs['goExportEntry']['count']; $i++){ + $entry= $this->attrs['goExportEntry'][$i]; + $tmp[preg_replace('/\|.*$/', '', $entry)]= $entry; } } } - $this->goExportEntry = $tmp; + $this->goExportEntryList = $tmp; /* Always is account... */ $this->is_account= TRUE; @@ -84,36 +95,78 @@ class servservice extends plugin function addToList($entry){ $key = key($entry); - $this->goExportEntry[$key]=$entry[$key]; + $this->goExportEntryList[$key]=$entry[$key]; } function deleteFromList($id){ - unset($this->goExportEntry[$id]); + /* Check if the share is used by someone */ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(|(gotoProfileServer=*|$id)(gotoShare=*|$id|*))", array("cn")); + $cnt= $ldap->count(); + if ($cnt){ + $msg= sprintf(_("The share can't be removed since it is still used by %d users:"), $cnt); + $msg.= "

"._("Please correct the share-/profile settings of these users"); + print_red($msg); + + } else { + /* Finally remove it */ + unset($this->goExportEntryList[$id]); + } + } + + function addToMountList($entry) { + $key = key($entry); + $type = $this->get_share_type($entry[$key]); + if (($type == "netatalk") || ($type == "NFS")) { + $this->mounts_to_add[$entry[$key]] = $entry[$key]; + unset($this->mounts_to_remove[$entry[$key]]); + } + } + + function deleteFromMountList($entry) { + $type = $this->get_share_type($entry); + if (($type == "netatalk") || ($type == "NFS")) { + $this->mounts_to_remove[$entry] = $entry; + unset($this->mounts_to_add[$entry]); + } } - function execute() { - /* Call parent execute */ - plugin::execute(); + /* Call parent execute */ + plugin::execute(); /* Fill templating stuff */ $smarty= get_smarty(); - $smarty->assign("staticAddress", ""); - if((isset($_POST['DelNfsEnt']))&&(isset($_POST['goExportEntry']))){ - $this->deleteFromList($_POST['goExportEntry']); + if((isset($_POST['DelNfsEnt']))&&(isset($_POST['goExportEntryList']))){ + if($this->allow_mounts){ + foreach($_POST['goExportEntryList'] as $entry){ + $this->deleteFromMountList($this->goExportEntryList[$entry]); + } + } + foreach($_POST['goExportEntryList'] as $entry){ + $this->deleteFromList($entry); + } } if(isset($_POST['NewNfsAdd'])){ - $this->o_subWindow = new servnfs($this->config, $this->dn); + $this->oldone = NULL; + $this->o_subWindow = new servnfs($this->config,$this->acl, $this->allow_mounts, $this->dn); $this->dialog = true; } - if((isset($_POST['NewNfsEdit']))&&(isset($_POST['goExportEntry']))){ - $entry = $this->goExportEntry[$_POST['goExportEntry']]; - $this->o_subWindow = new servnfs($this->config, $this->dn,$entry); + if((isset($_POST['NewNfsEdit']))&&(isset($_POST['goExportEntryList']))){ + $entry = $this->goExportEntryList[$_POST['goExportEntryList'][0]]; + $add_mount=isset($this->mounts_to_add[$entry]); + $this->oldone=$entry; + $this->o_subWindow = new servnfs($this->config,$this->acl,$this->allow_mounts,$this->dn,$entry,$add_mount); $this->dialog = true; } @@ -130,7 +183,15 @@ class servservice extends plugin }else{ $this->o_subWindow->save_object(); $newone = $this->o_subWindow->save(); - $this->addToList($newone) ; + $this->addToList($newone); + if($this->allow_mounts){ + if($this->oldone) { + $this->deleteFromMountList($this->oldone); + } + if ($this->o_subWindow->should_create_mount()) { + $this->addToMountList($newone); + } + } unset($this->o_subWindow); $this->dialog = false; } @@ -138,6 +199,7 @@ class servservice extends plugin /* Cancel NFS setup */ if(isset($_POST['NFScancel'])){ + $this->oldone = NULL; unset($this->o_subWindow); $this->dialog = false; } @@ -170,10 +232,10 @@ class servservice extends plugin } $tellSmarty=array(); - ksort($this->goExportEntry); - foreach($this->goExportEntry as $name=>$values){ + ksort($this->goExportEntryList); + foreach($this->goExportEntryList as $name=>$values){ $tmp = split("\|",$values); - $tellSmarty[$name] = $tmp[0]." ".$tmp[4]; + $tellSmarty[$name] = $tmp[0]." ".$tmp[4]." (".$tmp[2].")"; } $smarty->assign("goExportEntry",array_keys($tellSmarty)); $smarty->assign("goExportEntryKeys",($tellSmarty)); @@ -226,6 +288,7 @@ class servservice extends plugin /* Save data to object */ function save_object() { + plugin::save_object(); if (isset($_POST['servicetab'])){ $tmp = $this->goTimeSource; @@ -303,12 +366,17 @@ class servservice extends plugin $this->attrs['objectClass']= $tmp; /* Arrays */ - foreach (array("goTimeSource", "goExportEntry") as $name){ - $this->attrs[$name]= array(); - foreach ($this->$name as $element){ - $this->attrs[$name][]= $element; + foreach (array("goTimeSource"=>"goTimeSource", "goExportEntryList"=>"goExportEntry") as $source => $destination){ + $this->attrs[$destination]= array(); + foreach ($this->$source as $element){ + $this->attrs[$destination][]= $element; } } + + /* Process netatalk mounts */ + if($this->allow_mounts) { + $this->process_mounts(); + } /* Remove illegal attributes */ foreach ($this->additionaloc as $oc => $attrs){ @@ -323,21 +391,116 @@ class servservice extends plugin $ldap= $this->config->get_ldap_link(); $ldap->cd($this->dn); $this->cleanup(); -$ldap->modify ($this->attrs); + $ldap->modify ($this->attrs); - show_ldap_error($ldap->get_error()); + show_ldap_error($ldap->get_error(), _("Saving server service object failed")); /* Optionally execute a command after we're done */ if ($this->initially_was_account == $this->is_account){ if ($this->is_modified){ - $this->handle_post_events("mofify"); + $this->handle_post_events("modify"); } } else { $this->handle_post_events("add"); } } + + function process_mounts() { + + $clip = "cn=" . $this->cn . ",ou=servers,ou=systems,"; + $mountsdn = "cn=mounts," . substr($this->dn, strlen($clip)); + + $mounts = array( + "objectClass" => "container", + "cn" => "mounts" + ); + + # load data from mounts container + $ldap = $this->config->get_ldap_link(); + $ldap->cat($mountsdn, array('dn')); + $attrs = $ldap->fetch(); + + # mounts container not present yet, so we create it + if (count($attrs) == 0) { + $ldap->cd($mountsdn); + $ldap->add($mounts); + show_ldap_error($ldap->get_error(), _("Creating mount container failed")); + gosa_log("Mount container '$mountsdn' has been created"); + } -} + # remove deleted mounts from the container + foreach ($this->mounts_to_remove as $entry) { + $mount=$this->returnMountEntry($entry); + $mountdn = "cn=".$mount["cn"].","."$mountsdn"; + $ldap->cat($mountdn, array('dn')); + $attrs = $ldap->fetch(); + + if (count($attrs) != 0) { + $ldap->rmdir($mountdn); + show_ldap_error($ldap->get_error(), _("Removing mount container failed")); + gosa_log("Mount object '".$mountdn."' has been removed"); + } + } + + # add new mounts to the container + foreach ($this->mounts_to_add as $entry) { + + $mount=$this->returnMountEntry($entry); + $mountdn = "cn=".$mount["cn"].","."$mountsdn"; + $ldap->cd($mountdn); + $ldap->add($mount); + show_ldap_error($ldap->get_error(), _("Saving mount container failed")); + gosa_log("Mount object '".$mountdn."' has been added"); + } + } + + function get_share_type($share) { + $tmp = split("\|", $share); + return $tmp[2]; + } + + + function returnMountEntry($entry) { + $item = split("\|", $entry); + $name = $item[0]; + $description = $item[1]; + $type = $item[2]; + $charset = $item[3]; + $path = $item[4]; + $options = $item[5]; + + switch ($type) { + case "netatalk" : { + $mount = array( + "mountDirectory" => "/Network/Servers/", + "mountOption" => array( + "net", + "url==afp://;AUTH=NO%20USER%20AUTHENT@".$this->cn."/$name/" + ), + "mountType" => "url", + "objectClass" => "mount", + "cn" => $this->cn .":/".$name + ); + break; + } + case "NFS" : { + $mount = array( + "mountDirectory" => "/Network/Servers/", + "mountOption" => "net", + "mountType" => "nfs", + "objectClass" => "mount", + "cn" => $this->cn .":".$path + ); + break; + } + default : { + continue; + } + } + return $mount; + } + +} // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>