Code

Fixed list handling
[gosa.git] / plugins / addons / gotomasses / class_gotomasses.inc
index 216e9966531a9612f7fb37643c8959b116ec2bf3..1dc2d9fc08ce739ee5e329f988d54173bed3d388 100644 (file)
@@ -3,42 +3,49 @@
 class gotomasses extends plugin
 {
   /* Definitions */
-  var $plHeadline     = "System mass deployment";
+  var $plHeadline     = "System deployment";
   var $plDescription  = "This does something";
 
   /* attribute list for save action */
   var $attributes= array();
   var $objectclasses= array();
 
-  /* Source file that contains the csv data */
-  var $file_to_read = "Undefined"; #Set in constructor 
+  /* Source file that contains the gotomasses data */
+  var $data_file = "Undefined"; #Set in constructor 
 
   /* Queue tasks */
   var $tasks = array();
   var $current =false;
-  var $dialog = NULL;
+  var $dialog = FALSE;
+  var $ids_to_remove = array();
+  var $divlist = NULL;
 
-  function gotomasses($config, $dn= NULL)
+  function gotomasses(&$config, $dn= NULL)
   {
-    /* Define source file */
-    $this->file_to_read = CONFIG_DIR."/gotomasses_machines";
-  
     /* Include config object */
-    $this->config= $config;
+    $this->config= &$config;
 
-    $this->load_csv_data();
+    /* Define source file */
+    $this->data_file = CONFIG_DIR."/gotomasses_machines";
+    $file = $this->config->search("gotomasses", "STORAGE_FILE",array('menu'));
+    if(!empty($file)){
+      $this->data_file = $file;
+    }
+    $this->divlist = new divListMasses($this->config,$this);
+    $this->load_gotomasses_data();
   }
 
 
-
   function execute()
   {
+    $smarty = get_smarty();
     /************
      * Handle posts 
      ************/
 
     $s_entry = $s_action = "";
-    $arr = array("/^edit_/"=>"edit","/^remove_/"=>"remove");
+    $arr = array( "/^edit_task_/"=>"edit","/^remove_task_/"=>"remove",
+                  "/^new_task_/"=>"new_task","/^remove_multiple_task_/" => "remove_multiple");
     foreach($arr as $regex => $action){
       foreach($_POST as $name => $value){
         if(preg_match($regex,$name)){
@@ -49,13 +56,72 @@ class gotomasses extends plugin
       }
     }
 
+    /* Edit posted from list link */
+    if(isset($_GET['act']) && $_GET['act'] == "edit" && isset($_GET['id']) && isset($this->tasks[$_GET['id']])){
+      $s_action = "edit";
+      $s_entry = $_GET['id'];
+    }
+
     /************
      * List posts 
      ************/
 
+    /* Remove multiple */
+    if($s_action == "remove_multiple"){
+      if(!$this->acl_is_removeable()){
+        print_red(_("You are not allowed to remove a task."));
+      }else{
+        $this->ids_to_remove = $this->list_get_selected_items();
+        $tmp = "";
+        foreach($this->ids_to_remove as $key => $id){
+          if(isset($this->tasks[$id])){
+            $task = $this->tasks[$id];
+            $tmp.= "\n".$this->target_to_string($task);
+          }else{
+            unset($this->ids_to_remove[$key]);
+          }
+        }
+        $smarty->assign("multiple", TRUE); 
+        $smarty->assign("info",sprintf(_("Your are about to delete the following tasks: %s"),"<pre>".$tmp."</pre>"));
+        $this->current = $s_entry;
+        return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
+      }
+    }
+
+    /* Remove specified tasks */
+    if(count($this->ids_to_remove) && isset($_POST['delete_multiple_confirm'])){
+      foreach($this->ids_to_remove as $id){
+        if(isset($this->tasks[$id])){
+          unset($this->tasks[$id]);
+        }
+      }
+      $this->save();
+    }
+
     /* Remove entry from list */
     if($s_action == "remove" && isset($this->tasks[$s_entry])){
-      unset($this->tasks[$s_entry]);
+      if(!$this->acl_is_removeable()){
+        print_red(_("You are not allowed to remove a task."));
+      }else{
+        $entry = $this->tasks[$s_entry];
+        $this->current = $s_entry;
+        $smarty->assign("info",sprintf(_("Your are about to delete the following tasks: %s"),
+                                    "<pre>".$this->target_to_string($entry)."</pre>"));
+        $smarty->assign("multiple", FALSE); 
+        return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
+      }
+    }
+
+    /* Remove entry, remove is confirmed */
+    if($this->current != -1 && isset($_POST['delete_confirm'])){
+      unset($this->tasks[$this->current]);
+      $this->current = -1;
+      $this->save();
+    }
+
+    /* Remove aborted */
+    if(isset($_POST['delete_cancel'])){
+      $this->ids_to_remove = array();;
     }
 
     /* Edit selected entry */
@@ -64,14 +130,21 @@ class gotomasses extends plugin
       $this->dialog = new goto_task($this->config,$this,$entry);
       $this->current = $s_entry;
     }
+
+    /* New entry */
+    if($s_action== "new_task" && $this->acl_is_createable()){
+      $this->dialog = new goto_task($this->config,$this);
+      $this->current = -1;
+    }
   
     /* Close dialog */
     if(isset($_POST['close_goto_task'])){
-      $this->dialog = NULL;
+      $this->dialog = FALSE;
+      $this->current = -1;
     }
 
     /* Close dialog */
-    if(isset($_POST['save_goto_task'])){
+    if((isset($_POST['save_goto_task']) || isset($_POST['apply_goto_task'])) && is_object($this->dialog) ){
       $this->dialog->save_object();
       $msgs = $this->dialog->check();
       if(count($msgs)){
@@ -79,11 +152,19 @@ class gotomasses extends plugin
           print_red($msg);  
         }
       }else{
-        $this->tasks[$this->current] = $this->dialog->save();
-        $this->dialog = NULL;
+        if(isset($this->tasks[$this->current]) && $this->current != -1){
+          $this->tasks[$this->current] = $this->dialog->save();
+        }else{
+          $this->tasks[] = $this->dialog->save();
+        }
+        if(!isset($_POST['apply_goto_task'])){
+          $this->dialog = FALSE;
+          $this->current = -1;
+        }
+        $this->save();
       }
     }
+
     /* Display dialogs if currently opened */
     if(is_object($this->dialog)){
       $this->dialog->save_object();
@@ -95,45 +176,24 @@ class gotomasses extends plugin
      * Handle Divlist 
      ************/
 
-    $smarty = get_smarty();
-    $plug = $_GET['plug'];
-    $divlist = new divlist("gotomasses");
-    $divlist->SetWidth("100%");
-    $divlist->SetHeader(array(  array("string"=>"<a href='?plug=".$plug."&amp;sort=object'>"._("Target")."</a>"),
-                                array("string"=>"<a href='?plug=".$plug."&amp;sort=schedule'>"._("Schedule")."</a>",
-                                      "attach"=>"style='width:150px;'"),
-                                array("string"=>"<a href='?plug=".$plug."&amp;sort=action'>"._("Type")."</a>",
-                                      "attach"=>"style='width:50px;'"),
-                                array("string"=>_("Action"),
-                                      "attach"=>"style='border-right:0px;width:50px;'")));
-
-   
-    foreach($this->tasks as $key => $task){
-  
-      $action = "<input type='image' src='images/edit.png' name='edit_".$key."' class='center' alt='"._("Edit")."'>";
-      $action.= "<input type='image' src='images/edittrash.png' name='remove_".$key."' class='center' alt='"._("Reomve")."'>";
-
-      $field1 = array("string" => $this->target_to_string($task));
-      $field2 = array("string" => $this->time_to_string($task));
-      $field3 = array("string" => $this->action_to_string($task));
-      $field4 = array("string" => $action,"attach" => "style='border-right:0px;'");
-      
-      $divlist->AddEntry(array($field1,$field2,$field3,$field4));
-    }
-    $smarty->assign("divlist" , $divlist->DrawList());
-    $smarty->assign("contents_modified" , TRUE );
-    return ($smarty->fetch (get_template_path('contents.tpl', TRUE)));
+    $this->divlist->execute();
+    $this->divlist->SetEntries($this->tasks); 
+    return($this->divlist->Draw());
   }
 
   
   function target_to_string($data)
   {
     $ret = "";
-    foreach($data['Target'] as $target){
-      $ret .= preg_replace("/^[^:]+:/i","",$target).", ";
-    } 
+    if($data['Action'] == "initial_install"){
+      foreach($data['Initial_Target'] as $target){
+        $ret .= $target['MAC'].", ";
+      } 
+    }else{
+      foreach($data['Target'] as $target){
+        $ret .= $target.", ";
+      } 
+    }
     return(preg_replace("/, $/","",$ret));
   }
 
@@ -146,30 +206,29 @@ class gotomasses extends plugin
   
   function action_to_string($data)
   {
-    switch($data['Action']){
-
-      case 'reinstall' : return("Reinstall");break;
-      case 'install' : return("Install");break;
-      case 'reboot' : return("Restart");break;
-      case 'update' : return("Update");break;
-      default : return("Unknown");
+    $tmp = $this->get_actions();
+    if(isset($tmp[$data['Action']])){
+      return($tmp[$data['Action']]);
+    }else{
+      return(_("Unknown"));
     }
   }
 
   
-  function load_csv_data()
+  function load_gotomasses_data()
   {
     $ui = get_userinfo();
 
-    
-    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));
+    /* Check file existence */
+    if(!file_exists($this->data_file) || !is_readable($this->data_file)){
+      print_red(sprintf(_("Can't locate or read gotomasses storage file '%s'."),$this->data_file));
       return(FALSE);
     }
 
-    $fp = @fopen($this->file_to_read,"r");
+    /* check if file is readable */
+    $fp = @fopen($this->data_file,"r");
     if(!$fp){
-      print_red(sprintf(_("Can't read csv storage file '%s'."),$this->file_to_read));
+      print_red(sprintf(_("Can't read gotomasses storage file '%s'."),$this->data_file));
       return(FALSE);
     }
 
@@ -204,7 +263,7 @@ class gotomasses extends plugin
       $row    = preg_replace('/  */umi'," ",$row);
       $parts  = split(" ",$row);
 
-      if(count($parts) != 8){
+      if(count($parts) != 10){
         print_red(_("Entry broken, skipped."));
       }else{
 
@@ -216,7 +275,22 @@ class gotomasses extends plugin
         $entry['Weekday'] = $parts[4];  
         $entry['Action']  = $parts[5];  
         $entry['OGroup']  = $parts[6];  
-        $entry['Target']  = split(",",$parts[7]);  
+        $entry['Zone']    = $parts[7];  
+        $entry['Section'] = $parts[8];  
+        if($entry['Action'] == "initial_install"){
+          $tmp2 = split(";",$parts[9]);
+          foreach($tmp2 as $target){
+            $tmp = split(",",$target);
+            $entry['Initial_Target'][]  = array(
+                          "MAC"     => $tmp[0],
+                          "IP"      => $tmp[1],
+                          "NAME"    => $tmp[2]);
+          }
+          $entry['Target']  = array();
+        }else{
+          $entry['Initial_Target']  = array();
+          $entry['Target']  = split(";",$parts[7]);
+        }
         $entry['Comment'] = $comment;  
         $this->tasks []   = $entry;
       }
@@ -224,15 +298,61 @@ class gotomasses extends plugin
   }
 
 
-  function save_csv_data()
+  function save_gotomasses_data()
   {
+    $str = "#GOsa generated file, please just modify if you really know what you do.";
+    foreach($this->tasks as $task){
+      $str .= "\n#".trim($task['Comment']);
+      $str .= "\n";
+      if($task['Action'] == "initial_install"){
+        $str .= "*     *     *     *     *     ";
+      }else{
+        $str .= str_pad($task['Minute'] ,5," ")." ";
+        $str .= str_pad($task['Hour']   ,5," ")." ";
+        $str .= str_pad($task['Day']    ,5," ")." ";
+        $str .= str_pad($task['Month']  ,5," ")." ";
+        $str .= str_pad($task['Weekday'],5," ")." ";
+      }
+      $str .= str_pad($task['Action'] ,5," ")." ";
+      $str .= str_pad($task['OGroup'] ,5," ")." ";
+      $str .= str_pad($task['Zone']   ,5," ")." ";
+      $str .= str_pad($task['Section'],5," ")." ";
+      if($task['Action'] == "initial_install"){
+        foreach($task['Initial_Target'] as $target){
+          $str .= trim($target['MAC']).",".trim($target['IP']).",".trim($target['NAME']).";";
+        }
+      }else{
+        foreach($task['Target'] as $target){
+          $str .= $target.";";
+        }
+      }
+      $str = preg_replace("/;$/","",$str);
+    }
+
+    /* check file existence*/
+    $ui = get_userinfo();
+    if(!file_exists($this->data_file) || !is_writeable($this->data_file)){
+      print_red(sprintf(_("Can't locate or write gotomasses storage file '%s'."),$this->data_file));
+      return(FALSE);
+    }
+
+    /* check permissions */
+    $fp = @fopen($this->data_file,"w");
+    if(!$fp){
+      print_red(sprintf(_("Can't read gotomasses storage file '%s'."),$this->data_file));
+      return(FALSE);
+    }
+
+    /* Write contents */
+    $str .= "\n";
+    fwrite($fp,$str);
+    fclose($fp);
   }
 
 
   function save_object()
   {
-    if(isset($_POST['gotomasses'])){
-    }
+    $this->divlist->save_object();
   }
 
 
@@ -249,16 +369,37 @@ class gotomasses extends plugin
     return($ret); 
   }
 
+  
+  function save()
+  {
+    $this->save_gotomasses_data();
+  }
+
+
+  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);
+  }
+
 
   function get_actions()
   {
     /* Prepare list of available actions */
-    $actions = array( "reboot"          => _("Reboot"),
+    $actions = array(       "reboot"          => _("Reboot"),
                             "localboot"       => _("Localboot"),
                             "halt"            => _("Halt system"),
+                            "initial_install" => _("Initial installation"),
                             "update"          => _("Update"),
                             "reinstall"       => _("(Re)Install"),
                             "rescan"          => _("Rescan"),
+                            "wake"            => _("Wake"),
                             "memcheck"        => _("Memory check"));
     return($actions);
   }