From cfdc0673410fdcdf9abf54c7c59a46148bdecd7b Mon Sep 17 00:00:00 2001 From: hickert Date: Fri, 17 Aug 2007 12:20:58 +0000 Subject: [PATCH] Updated gotomassesschedule git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@7067 594d385d-05f5-0310-b6e9-bd551577e9d8 --- plugins/addons/gotomasses/class_goto_task.inc | 261 +++++++++++++++++ .../addons/gotomasses/class_gotomasses.inc | 35 ++- .../addons/gotomasses/class_target_list.inc | 268 ++++++++++++++++++ plugins/addons/gotomasses/goto_task.tpl | 174 ++++++++++++ 4 files changed, 729 insertions(+), 9 deletions(-) create mode 100644 plugins/addons/gotomasses/class_goto_task.inc create mode 100644 plugins/addons/gotomasses/class_target_list.inc create mode 100644 plugins/addons/gotomasses/goto_task.tpl diff --git a/plugins/addons/gotomasses/class_goto_task.inc b/plugins/addons/gotomasses/class_goto_task.inc new file mode 100644 index 000000000..e5d464f4d --- /dev/null +++ b/plugins/addons/gotomasses/class_goto_task.inc @@ -0,0 +1,261 @@ +parent = $parent; + + /* Intialize plugin */ + $this->config = $config; + if(count($data)){ + + $tmp = $this->get_array_values(); + foreach($this->attributes as $attr){ + if(!isset($data[$attr])){ + trigger_error("Missing parameter: '".$attr."' for goto_task contruction."); + }else{ + $this->$attr = $data[$attr]; + + /* Check if given value will be selectable via dropdown menus, else enable expert mode */ + if(in_array($attr, array("Minute","Hour","Day","Month","Weekday")) && !isset($tmp[$attr][$data[$attr]])){ + $this->Expert = TRUE; + } + } + } + } + + /* Prepare list of available actions */ + $this->Actions = $this->parent->get_actions(); + } + + + function execute() + { + /******** + * Handle Posts + ********/ + + /* Handle Target options */ + foreach($_POST as $name => $value){ + if(preg_match("/^remove_/",$name)){ + $value = preg_replace("/^remove_([0-9]*)_(x|y)$/i","\\1",$name); + if(isset($this->Target[$value])){ + unset($this->Target[$value]); + } + } + } + + /* Add target */ + if(isset($_POST['add_target']) && !empty($_POST['target_text'])){ + $target = get_post("target_text"); + if($this->is_valid_target($target) && !in_array($target,$this->Target)){ + $this->Target[] = $target; + } + } + + + /******** + * Add target from list + ********/ + + /* If add from list is was requsted, display this list */ + if(isset($_POST['add_from_list'])){ + $this->dialog = new target_list($this->config,$this->Target); + } + + /* Save selected objects as target */ + if(isset($_POST['SaveMultiSelectWindow'])){ + $this->dialog->save_object(); + $ret = $this->dialog->save(); + foreach($ret as $entry){ + $this->Target[] = $entry['cn'][0]; + } + $this->dialog = NULL; + } + + /* Cancel object listing */ + if(isset($_POST['CloseMultiSelectWindow'])){ + $this->dialog = NULL; + } + + /* Display object Listing */ + if($this->dialog){ + $this->dialog->save_object(); + return($this->dialog->execute()); + } + + + /******** + * Display this plugin + ********/ + + $divlist = new divlist("goto_task"); + $divlist->SetWidth("100%"); + $divlist->SetHeight("160"); + $divlist->SetEntriesPerPage(0); + + $divlist->SetHeader(array( + array("string" => "Target"), + array("string" => "Actions" , "attach" => "style='width:40px;'"))); + + $acl_target = $this->parent->getacl("Target"); + foreach($this->Target as $key => $target){ + + $field1 = array("string" => $target); + if(preg_match("/w/i",$acl_target)){ + $field2 = array("string" => "" , + "attach" => "style='width:44px;'"); + }else{ + $field2 = array("string" => "", + "attach" => "style='width:44px;'"); + } + + $divlist->AddEntry(array($field1,$field2)); + } + + $smarty = get_smarty(); + + foreach($this->attributes as $attr){ + $smarty->assign($attr."ACL", $this->parent->getacl($attr)); + $smarty->assign($attr,$this->$attr); + } + + $tmp = $this->get_array_values(); + $smarty->assign("Minutes" , $tmp['Minute']); + $smarty->assign("Hours" , $tmp['Hour']); + $smarty->assign("Days" , $tmp['Day']); + $smarty->assign("Months" , $tmp['Month']); + $smarty->assign("Weekdays", $tmp['Weekday']); + + $smarty->assign("Expert" , $this->Expert); + + $smarty->assign("Actions" , $this->Actions); + $smarty->assign("Target_list" , $divlist->DrawList()); + return ($smarty->fetch (get_template_path('goto_task.tpl', TRUE))); + } + + + /* Map acl function, to be able to use plugin::save_object() */ + function acl_is_writeable($str) + { + return($this->parent->acl_is_writeable($str)); + } + + + function save_object() + { + if(isset($_POST['goto_task_posted'])){ + plugin::save_object(); + + if(isset($_POST['ToggleExpertMode'])){ + $this->Expert = !$this->Expert; + } + } + } + + + /* Check if given target is vald. + * It must either be a valid MAC address or an existing object group + */ + function is_valid_target($str) + { + if(is_mac($str)){ + return(TRUE); + }else{ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClassgosaGroupOfNames)(cn=".$str."))",array("cn")); + if($ldap->count()){ + return(TRUE); + } + } + } + + + /* Return values for listboxes. + */ + function get_array_values() + { + $ret = array(); + + /* Create minute array */ + $Minute = array( "*" => "*", + "*/1" => "*/1", + "*/3" => "*/3", + "*/5" => "*/5", + "*/10" => "*/10", + "*/15" => "*/15", + "*/30" => "*/30", + "*/45" => "*/45", + "*/60" => "*/60"); + for($i = 0; $i < 60 ; $i ++){ + $Minute[$i] = $i; + } + + /* Create hour array */ + $Hour = array( "*" => "*"); + for($i = 1 ; $i < 24 ; $i ++ ){ + $Hour["*/".$i] = "*/".$i; + } + for($i = 0 ; $i < 24 ; $i ++ ){ + $Hour[$i] = $i; + } + + /* Create hour array */ + $Day = array( "*" => "*"); + for($i = 1 ; $i < 32 ; $i ++ ){ + $Day["*/".$i] = "*/".$i; + } + for($i = 1 ; $i < 32 ; $i ++ ){ + $Day[$i] = $i; + } + + /* Create month array */ + $Month = array( "*" => "*"); + for($i = 1 ; $i <= 12 ; $i ++ ){ + $Month["*/".$i] = "*/".$i; + } + for($i = 1 ; $i <= 12 ; $i ++ ){ + $Month[$i] = $i; + } + + /* Create week day array */ + $Weekday = array( "*" => "*"); + for($i = 1 ; $i <= 7 ; $i ++ ){ + $Weekday["*/".$i] = "*/".$i; + } + for($i = 0 ; $i <= 7 ; $i ++ ){ + $Weekday[$i] = $i; + } + + foreach(array("Minute","Weekday","Hour","Day","Month") as $var){ + $ret[$var] = $$var; + } + return($ret); + } +} +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/plugins/addons/gotomasses/class_gotomasses.inc b/plugins/addons/gotomasses/class_gotomasses.inc index 8588da5ce..c81ec3bd0 100644 --- a/plugins/addons/gotomasses/class_gotomasses.inc +++ b/plugins/addons/gotomasses/class_gotomasses.inc @@ -52,7 +52,7 @@ class gotomasses extends plugin /* Edit selected entry */ if($s_action == "edit" && isset($this->tasks[$s_entry])){ $entry = $this->tasks[$s_entry]; - $this->dialog = new goto_task($this->config,$entry); + $this->dialog = new goto_task($this->config,$this,$entry); } /* Close dialog */ @@ -61,7 +61,8 @@ class gotomasses extends plugin } /* Close dialog */ - if(isset($_POST['close_goto_task'])){ + if(isset($_POST['save_goto_task'])){ + $this->dialog->save_object(); $this->dialog = NULL; } @@ -139,12 +140,7 @@ class gotomasses extends plugin { $ui = get_userinfo(); - if(!$this->acl_is_readable("ACL missing")){ - $this->tasks =array(); - print_red(_("Your are not allowed to view contents of this plugin.")); - return(FALSE); - } - + if(!file_exists($this->file_to_read) || !is_readable($this->file_to_read)){ print_red(sprintf(_("Can't locate or read csv storage file '%s'."),$this->file_to_read)); return(FALSE); @@ -232,6 +228,20 @@ class gotomasses extends plugin } + function get_actions() + { + /* Prepare list of available actions */ + $actions = array( "reboot" => _("Reboot"), + "localboot" => _("Localboot"), + "halt" => _("Halt system"), + "update" => _("Update"), + "reinstall" => _("(Re)Install"), + "rescan" => _("Rescan"), + "memcheck" => _("Memory check")); + return($actions); + } + + function plInfo() { return (array( @@ -242,7 +252,14 @@ class gotomasses extends plugin "plPriority" => 0, "plSection" => array("addon"), "plCategory" => array("gotomasses" => array("objectClass" => "none", "description" => _("System mass deployment"))), - "plProvidedAcls" => array() + "plProvidedAcls" => array("Comment" => _("Description"), + "Action" => _("Action"), + "Day" => _("Day"), + "Minute" => _("Minute"), + "Hour" => _("Hour"), + "Month" => _("Month"), + "Weekday" => _("Week day"), + "Target" => _("Target")) )); } } diff --git a/plugins/addons/gotomasses/class_target_list.inc b/plugins/addons/gotomasses/class_target_list.inc new file mode 100644 index 000000000..bb91452dd --- /dev/null +++ b/plugins/addons/gotomasses/class_target_list.inc @@ -0,0 +1,268 @@ +AddCheckBox */ + var $ogroups ; + var $servers ; + var $workstations ; + + + /* Subsearch checkbox */ + var $SubSearch ; + var $parent ; + var $ui ; + + + + function target_list($config,$Targets_used) + { + MultiSelectWindow::MultiSelectWindow($config, "Targetselection", array("ogroup","gotomasses")); + + $this->SetInformation( _("Select the target objects for your scheduled action.")); + $this->SetTitle( _("Available targets")); + $this->SetSummary( _("Available targets")); + $this->SetHeadpageMode(FALSE); + + /* set Page header */ + $chk = ""; + $this->AddHeader(array("string"=> $chk, "attach"=>"style='width:20px;'")); + + $this->AddHeader(array("string" => " ", "attach" => "style='text-align:center;width:20px;'")); + $this->AddHeader(array("string" => _("Object name"), "attach" => "style=''")); + + /* Text ,Value, Name, Is selected */ + $this->AddCheckBox("ogroups", _("Select to see object groups"), _("Show object object groups"), true); + $this->AddCheckBox("servers", _("Select to see servers") , _("Show servers"), true); + $this->AddCheckBox("workstations", _("Select to see workstations"),_("Show workstations"), true); + + /* Add SubSearch checkbox */ + $this->AddCheckBox(SEPERATOR); + $this->AddCheckBox("SubSearch", _("Select to search within subtrees"), _("Search in subtrees"), false); + + /* Name,Text,Default , Connect with alphabet */ + $this->AddRegex ("Regex", _("Regular expression for matching group names"), "*" , true); + $this->EnableAplhabet(TRUE); + } + + + function GenHeader() + { + $options= ""; + + /* Get all departments within this subtree */ + $ui= get_userinfo(); + $first = ""; + $found = FALSE; + $base = $this->config->current['BASE']; + + /* Add base */ + $tmp = array(); + $tmp[] = array("dn"=>$this->config->current['BASE']); + $tmp= array_merge($tmp,get_list("(&(|(ou=*)(description=*))(objectClass=gosaDepartment))", $this->module, $base, + array("ou", "description"), GL_SIZELIMIT | GL_SUBSEARCH)); + + $deps = array(); + foreach($tmp as $tm){ + $deps[$tm['dn']] = $tm['dn']; + } + + /* Load possible departments */ + $ui= get_userinfo(); + $tdeps= $ui->get_module_departments("ogroups"); + $ids = $this->config->idepartments; + $first = ""; + $found = FALSE; + foreach($ids as $dep => $name){ + if(isset($deps[$dep]) && in_array_ics($dep, $tdeps)){ + + /* Keep first base dn in mind, we could need this + * info if no valid base was found + */ + if(empty($first)) { + $first = $dep['dn']; + } + + $value = $ids[$dep]; + if ($this->selectedBase == $dep){ + $found = TRUE; + $options.= ""; + } else { + $options.= ""; + } + } + } + + /* The currently used base is not visible with your acl setup. + * Set base to first useable base. + */ + if(!$found){ + $this->selectedBase = $first; + } + + /* Get copy & paste icon */ + $acls = $ui->get_permissions($this->selectedBase,"ogroups/ogroup"); + $acl_all= $ui->has_complete_category_acls($this->selectedBase,"ogroups"); + + /* Add default header */ + $listhead = MultiSelectWindow::get_default_header(); + + /* Add department selector */ + $listhead .= _("Base")." ". + "  "; + $listhead .=""; + + $this->SetListHeader($listhead); + } + + + function execute() + { + $this->ClearElementsList(); + $this->GenHeader(); + $this->reload(); + $this->SetEntries($this->list); + foreach($this->list as $key => $data){ + + } + return($this->Draw()); + } + + + function SetEntries($list) + { + /* Add Copy & Paste buttons if copy&paste is enabled + */ + // Defining Links + $linkopen = "%s"; + $editlink = "%s"; + + $ui = get_userinfo(); + + // Assigning ogroups + foreach($list as $key => $val){ + + $title = "title='".preg_replace('/ /', ' ', @LDAP::fix($val['dn']))."'"; + if(!isset($val['description'][0])){ + $desc = ""; + }else{ + $desc = " - [ ".$val['description'][0]." ]"; + } + + $img ="Hmm"; + if(in_array("goServer",$val['objectClass'])){ + $img = ""._("Server").""; + }elseif(in_array("gotoWorkstation",$val['objectClass'])){ + $img = ""._("Workstation").""; + }elseif(in_array("gosaGroupOfNames",$val['objectClass'])){ + $img = ""._("Object group").""; + } + + /* Create each field */ + $field0 = array("string" => "" , + "attach" => "style='width:20px;'"); + $field1 = array("string" => $img, + "attach" => "style='text- align:center;width: 20px;'"); + $field2 = array("string" => $val['cn'][0].$desc, + "attach" => "style='border-right:0px;' ".$title); + + $this->AddElement(array($field0,$field1,$field2)); + } + } + + + function save() + { + $ret = array(); + $items = $this->list_get_selected_items(); + foreach($items as $item){ + $ret[] = $this->list[$item]; + } + return($ret); + } + + + function save_object() + { + MultiSelectWindow::save_object(); + } + + + function reload() + { + /* Set base for all searches && initialise some vars */ + $this->list= array(); + $base = $this->selectedBase; + $filter = ""; + $Regex = $this->Regex; + + $chk = array( + "ogroups" => "(objectClass=gosaGroupOfNames)" , + "servers" => "(objectClass=goServer)" , + "workstations" => "(objectClass=gotoWorkstation)"); + + /* Create filter */ + foreach($chk as $chkBox => $FilterPart){ + if($this->$chkBox){ + $filter .= $FilterPart; + } + } + $filter= "(&(cn=".$Regex.")(|".$filter."))"; + + if($this->SubSearch){ + $res= get_list($filter, array("ogroups","workstations","servers"), $base, + array("cn","objectClass","gosaGroupObjects"), GL_SIZELIMIT | GL_SUBSEARCH); + }else{ + $res= get_list($filter, "ogroups", get_groups_ou().$base, + array("cn","objectClass"), GL_SIZELIMIT ); + $res= array_merge($res,get_list($filter, "workstation", "ou=workstations,ou=systems,".$base, + array("cn","objectClass"), GL_SIZELIMIT )); + $res= array_merge($res,get_list($filter, "server", "ou=servers,ou=systems,".$base, + array("cn","objectClass"), GL_SIZELIMIT )); + + } + + $this->list= $res; + ksort ($this->list); + reset ($this->list); + $tmp=array(); + foreach($this->list as $tkey => $val ){ + $tmp[strtolower($val['cn'][0]).$val['cn'][0]]=$val; + } + ksort($tmp); + $this->list=array(); + foreach($tmp as $val){ + $this->list[]=$val; + } + reset ($this->list); + } + + function list_get_selected_items() + { + $ids = array(); + foreach($_POST as $name => $value){ + if(preg_match("/^item_selected_[0-9]*$/",$name)){ + $id = preg_replace("/^item_selected_/","",$name); + $ids[$id] = $id; + } + } + return($ids); + } +} + + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/plugins/addons/gotomasses/goto_task.tpl b/plugins/addons/gotomasses/goto_task.tpl new file mode 100644 index 000000000..6988b0ab3 --- /dev/null +++ b/plugins/addons/gotomasses/goto_task.tpl @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + +
+

{t}Generic{/t}

+
+ + + + + +
+ {t}Description{/t} + + {render acl=$CommentACL} + + {/render} +
+
+ + + + + +
+ {t}Action{/t} + + {render acl=$ActionACL} + + {/render} +
+ +
+

{t}Target systems{/t}

+
+ + + + +
+
+ {render acl=$TargetACL} + {$Target_list} + {/render} +
+ {render acl=$TargetACL} + + {/render} + {render acl=$TargetACL} + + {/render} + {render acl=$TargetACL} + + {/render} +
+ +
+

{t}Schedule{/t}

+
+ {if $Expert} + + + + + + + + + +
+ {t}Minute{/t}  + {render acl=$MinuteACL} + + {/render} + + {render acl=$HourACL} + {t}Hour{/t}  + + {/render} + + {t}Day{/t}  + {render acl=$DayACL} + + {/render} + + {t}Month{/t}  + {render acl=$MonthACL} + + {/render} + + {t}Week day{/t}  + {render acl=$WeekdayACL} + + {/render} +
+ {else} + + + + + + + + + + + + + + + +
{t}Minute{/t} + + {render acl=$MinuteACL} + + {/render} + {t}Hour{/t} + + {render acl=$HourACL} + + {/render} + {t}Day{/t} + + {render acl=$DayACL} + + {/render} + {t}Month{/t} + + {render acl=$MonthACL} + + {/render} + {t}Week day{/t} + + {render acl=$WeekdayACL} + + {/render} +
+ {/if} + +
+ +

+ + +

-- 2.30.2