X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fsystems%2Fclass_servService.inc;h=1233484180d1b477faa62b5abf16a864dea77bcf;hb=ccaa264984e691fb1371b7e93e22e4fd9a2a6ba9;hp=b596f22cb485a7bce37d282a3de479636afa2544;hpb=7fd1693a64a3dd902bd29f54639761690d445556;p=gosa.git diff --git a/plugins/admin/systems/class_servService.inc b/plugins/admin/systems/class_servService.inc index b596f22cb..123348418 100644 --- a/plugins/admin/systems/class_servService.inc +++ b/plugins/admin/systems/class_servService.inc @@ -7,146 +7,247 @@ class servservice extends plugin var $cli_description= "Some longer text\nfor help"; var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); - - var $goExportEntry = array(); - var $goTimeSource = array(); - var $goLdapBase= ""; - var $goXdmcpIsEnabled =""; - var $goFontPath= ""; - var $goNTPServer=""; - var $goLdapServer=""; - var $goTerminalServer=""; - var $goSyslogServer=""; - var $goCupsServer=""; - + var $goExportEntry = array(); + var $goExportEntryList= array(); + var $goTimeSource = array(); + var $goLdapBase = ""; + var $goXdmcpIsEnabled = ""; + var $goFontPath = ""; + var $goNTPServer = ""; + var $goShareServer = false; + var $goLdapServer = ""; + var $goTerminalServer = ""; + var $goSyslogServer = ""; + var $goCupsServer = ""; + var $goMailServer = ""; + var $o_subWindow = NULL; /* attribute list for save action */ - var $attributes = array("goExportEntry","goTimeSource","goLdapBase","goXdmcpIsEnabled","goFontPath" ); - var $objectclasses = array("top","goServer"); - var $additionaloc = array( - - "goNfsServer" => array("goExportEntry"), - "goNtpServer" => array("goTimeSource"), - "goLdapServer" => array("goLdapBase"), - "goTerminalServer"=> array("goXdmcpIsEnabled", "goFontPath"), - "goSyslogServer" => array(), - "goCupsServer" => array() - ); - - - - - - - - - - function servservice ($config, $dn= NULL) + var $ignore_account= TRUE; + var $attributes = array("goLdapBase","goXdmcpIsEnabled","goFontPath","goExportEntry","goTimeSource"); + var $possible_objectclasses= array( "goShareServer", "goNtpServer", "goServer", "GOhard", "goLdapServer", + "goTerminalServer", "goSyslogServer", "goCupsServer","goMailServer"); + var $objectclasses = array( "top","goServer", "GOhard"); + var $additionaloc = array( "goShareServer" => array("goExportEntry"), + "goNtpServer" => array("goTimeSource"), + "goLdapServer" => array("goLdapBase"), + "goTerminalServer"=> array("goXdmcpIsEnabled", "goFontPath"), + "goSyslogServer" => array(), + "goMailServer" => array(), + "goCupsServer" => array()); + + 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){ if (isset($this->attrs['objectClass']) && in_array($oc, $this->attrs['objectClass'])){ $this->objectclasses[$oc]= $oc; } } + + /* Load arrays */ + foreach (array("goTimeSource") as $name){ + $tmp= array(); + if (isset($this->attrs[$name])){ + for ($i= 0; $i<$this->attrs[$name]['count']; $i++){ + $tmp[$this->attrs[$name][$i]]= $this->attrs[$name][$i]; + } + } + $this->$name= $tmp; + } + + $tmp =array(); + $tmp2=array(); + if(isset($this->attrs['goExportEntry'])){ + 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->goExportEntryList = $tmp; + /* Always is account... */ $this->is_account= TRUE; + + /* Check if goShareServer is defined */ + if((isset($this->attrs['objectClass']))&&(is_array($this->attrs['objectClass']))){ + if(in_array("goShareServer",$this->attrs['objectClass'])){ + $this->goShareServer = true; + } + } } + function addToList($entry){ + $key = key($entry); + $this->goExportEntryList[$key]=$entry[$key]; + } + function deleteFromList($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(); + /* Fill templating stuff */ $smarty= get_smarty(); + $smarty->assign("staticAddress", ""); - - /* - Handling for Nfs Export Entries - */ - - /* Here we add a new entry */ - if(isset($_POST['NewNfsAdd'])) - { - $this->attrs['goExportEntry'][]=$_POST['NewNfsExport']; - } - - /* Deleting an Entry, is a bit more complicated than adding one*/ - if(isset($_POST['DelNfsEnt'])) - { - /* Go through all entries an skip the selected (The one we want to delete)*/ - foreach($this->attrs['goExportEntry'] as $key => $val) - { - /* Add all entries in an new Array, because when deleting one entry, the could be broken*/ - if(($val != $_POST['goExportEntry'] )) - { - /* Skip the entry that we want to delete*/ - $new_arr[]=$val; - } + if((isset($_POST['DelNfsEnt']))&&(isset($_POST['goExportEntryList']))){ + if($this->allow_mounts){ + foreach($_POST['goExportEntryList'] as $entry){ + $this->deleteFromMountList($this->goExportEntryList[$entry]); } - /* Deleting complete so add result to the attrs */ - $this->attrs['goExportEntry']=$new_arr; } - - /* Set the entry which we want to show in the frontend */ - if(isset($this->attrs['goExportEntry'])) - { - $this->goExportEntry = ($this->attrs['goExportEntry']); - unset($this->goExportEntry['count']); + foreach($_POST['goExportEntryList'] as $entry){ + $this->deleteFromList($entry); } + } + + if(isset($_POST['NewNfsAdd'])){ + $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['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; + } - /* - Handling for NTP Export Entries - */ + if(isset($this->o_subWindow)){ + $this->o_subWindow->save_object(TRUE); + } - /* Here we add a new entry */ - if(isset($_POST['NewNTPAdd'])) - { - $this->attrs['goTimeSource'][]=$_POST['NewNTPExport']; - } - - /*Deleting an Entry, is a bit more complicated than adding one*/ - if(isset($_POST['DelNTPEnt'])) - { - /* Go through all entries an skip the selected (The one we want to delete)*/ - foreach($this->attrs['goTimeSource'] as $key => $val) - { - /* Add all entries in an new Array, because wehn deleting one entry, the could be broken*/ - if($val != $_POST['goTimeSource'] ) - { - /* Skip the entry that we want to delete*/ - $new_arr[]=$val; + /* Save NFS setup */ + if(isset($_POST['NFSsave'])){ + if(count($this->o_subWindow->check())>0){ + foreach($this->o_subWindow->check() as $msg) { + print_red($msg); + } + }else{ + $this->o_subWindow->save_object(); + $newone = $this->o_subWindow->save(); + $this->addToList($newone); + if($this->allow_mounts){ + if($this->oldone) { + $this->deleteFromMountList($this->oldone); + } + if ($this->o_subWindow->should_create_mount()) { + $this->addToMountList($newone); } } - /* Deleting complete so add result to the attrs */ - $this->attrs['goTimeSource']=$new_arr; - } - - /* Set the entry which we want to show in the frontend */ - if(isset($this->attrs['goTimeSource'])) - { - $this->goTimeSource = ($this->attrs['goTimeSource']); - unset($this->goTimeSource['count']); + unset($this->o_subWindow); + $this->dialog = false; } + } + + /* Cancel NFS setup */ + if(isset($_POST['NFScancel'])){ + $this->oldone = NULL; + unset($this->o_subWindow); + $this->dialog = false; + } + + /* Execute NFS setup dialog*/ + if(isset($this->o_subWindow)){ + return $this->o_subWindow->execute(); + } + /* Here we add a new entry */ + if(isset($_POST['NewNTPAdd']) && $_POST['NewNTPExport'] != "") { + $this->goTimeSource[$_POST['NewNTPExport']]= $_POST['NewNTPExport']; + asort($this->goTimeSource); + } + /* Deleting an Entry, is a bit more complicated than adding one*/ + if(isset($_POST['DelNTPEnt'])) { + foreach ($_POST['goTimeSource'] as $entry){ + if (isset($this->goTimeSource[$entry])){ + unset($this->goTimeSource[$entry]); + } + } + } - - /* Attributes... */ + /* Attributes */ foreach ($this->attributes as $attr){ $smarty->assign("$attr", $this->$attr); $smarty->assign("$attr"."ACL", chkacl($this->acl, $attr)); - if($this->$attr) - $smarty->assign($attr."State",""); - else - $smarty->assign($attr."State","disabled"); + $smarty->assign($attr."State",""); } + + $tellSmarty=array(); + ksort($this->goExportEntryList); + foreach($this->goExportEntryList as $name=>$values){ + $tmp = split("\|",$values); + $tellSmarty[$name] = $tmp[0]." ".$tmp[4]." (".$tmp[2].")"; + } + $smarty->assign("goExportEntry",array_keys($tellSmarty)); + $smarty->assign("goExportEntryKeys",($tellSmarty)); + $smarty->assign("goExportEntryACL", chkacl($this->acl, "goExportEntry")); + $smarty->assign("goTimeSource", $this->goTimeSource); + $smarty->assign("goTimeSourceACL", chkacl($this->acl, "goTimeSource")); + $smarty->assign("goTimeSourceState",""); + /* Classes... */ -foreach ($this->additionaloc as $oc => $dummy){ + foreach ($this->additionaloc as $oc => $dummy){ if (isset($this->objectclasses[$oc])){ $smarty->assign("$oc", "checked"); $smarty->assign("$oc"."State", ""); @@ -154,18 +255,30 @@ foreach ($this->additionaloc as $oc => $dummy){ } else { $smarty->assign("$oc", ""); - $smarty->assign("$oc"."ACL", ""); + $smarty->assign("$oc"."ACL", chkacl($this->acl, $oc)); $smarty->assign("$oc"."State", "disabled"); } } + if(!$this->goShareServer){ + $smarty->assign("goShareServerState", " disabled "); + $smarty->assign("goExportEntryACL", " disabled "); + }else{ + $smarty->assign("goShareServerState", " "); + $smarty->assign("goExportEntryACL", " "); + } - if(isset($this->attrs['goXdmcpIsEnabled'])&&($this->attrs['goXdmcpIsEnabled']=="1")) - $smarty->assign("goXdmcpIsEnabled","checked"); + /* Different handling for checkbox */ + if($this->goXdmcpIsEnabled == "true"){ + $smarty->assign("goXdmcpIsEnabled","checked"); + } else { + $smarty->assign("goXdmcpIsEnabled",""); + } - return($smarty->fetch (get_template_path('servservice.tpl', TRUE))); + return($smarty->fetch (get_template_path('servservice.tpl', TRUE))); } + function remove_from_parent() { /* This cannot be removed... */ @@ -175,24 +288,54 @@ foreach ($this->additionaloc as $oc => $dummy){ /* Save data to object */ function save_object() { - plugin::save_object(); + plugin::save_object(); + if (isset($_POST['servicetab'])){ + $tmp = $this->goTimeSource; + + if(isset($_POST['goLdapBase'])){ + $this->goLdapBase = $_POST['goLdapBase']; + } + + /* Save checkbox state */ + foreach ($this->additionaloc as $oc => $dummy){ +// if($oc == "goNtpServer") continue; + if (chkacl($this->acl, $oc) == ""){ + if (isset($_POST[$oc]) && $_POST[$oc] == '1'){ + $this->objectclasses[$oc]= $oc; + } else { + unset($this->objectclasses[$oc]); + } + } + } - /* Save checkbox state */ - foreach ($this->additionaloc as $oc => $dummy){ - if (isset($_POST[$oc]) && $_POST[$oc] == '1'){ - $this->objectclasses[$oc]= $oc; + /* Save xdmcp is enabled flag */ + if (isset($_POST['goXdmcpIsEnabled'])){ + $this->goXdmcpIsEnabled= "true"; + } else { + $this->goXdmcpIsEnabled= "false"; + } + + /* Save xdmcp is enabled flag */ + if (isset($_POST['goShareServer'])){ + $this->goShareServer = true; } else { - unset($this->objectclasses[$oc]); + $this->goShareServer = false; } + $this->goTimeSource = array(); + $this->goTimeSource = $tmp; } - } /* Check supplied data */ function check() { - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); + + if((isset($_POST['goTerminalServer']))&&(empty($this->goFontPath))){ + $message[]=_("Terminal server, must have fontpath specified."); + } return ($message); } @@ -201,62 +344,163 @@ foreach ($this->additionaloc as $oc => $dummy){ /* Save to LDAP */ function save() { - - /* Normalize lazy objectclass arrays */ - $objectclasses= array(); - foreach($this->objectclasses as $oc){ - $objectclasses[]= $oc; - } plugin::save(); - - $test = $this->objectclasses; - $tmp = array_flip($this->attrs['objectClass']); - + + $tmp= array(); + + /* Remove all from this plugin */ + foreach($this->attrs['objectClass'] as $oc){ + if (!in_array_ics($oc, $this->possible_objectclasses)){ + $tmp[]= $oc; + } + } - - foreach($this->additionaloc as $key=>$val) { - unset($tmp[$key]); + /* Merge our current objectclasses */ + foreach($this->objectclasses as $oc){ + if (!in_array_ics($oc, $tmp)){ + $tmp[]= $oc; } - - - $classes = (array_flip(array_merge(array_flip($test),$tmp))); + } - unset($this->attrs['objectClass']); + /* Reassign cleaned value */ + $this->attrs['objectClass']= $tmp; - foreach($classes as $class){ - $this->attrs['objectClass'][]=$class; + /* Arrays */ + foreach (array("goTimeSource"=>"goTimeSource", "goExportEntryList"=>"goExportEntry") as $source => $destination){ + $this->attrs[$destination]= array(); + foreach ($this->$source as $element){ + $this->attrs[$destination][]= $element; + } } - - - /* Remove unneeded attributes */ + + /* Process netatalk mounts */ + if($this->allow_mounts) { + $this->process_mounts(); + } + + /* Remove illegal attributes */ foreach ($this->additionaloc as $oc => $attrs){ - if (!in_array($oc, $this->attrs['objectClass'])){ + if (!in_array($oc, $this->objectclasses)){ foreach ($attrs as $attr){ $this->attrs[$attr]= array(); } } } - $this->attrs = array_reverse($this->attrs); - -// print_a($this->attrs); - + /* Write to LDAP */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->dn); - $ldap->modify($this->attrs); - show_ldap_error($ldap->get_error()); + $this->cleanup(); + $ldap->modify ($this->attrs); + + 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: ?>