test on empty list
[opensuse:yast-web-client.git] / plugins / patch_updates / app / controllers / patch_updates_controller.rb
1 require 'yast/service_resource'
2
3 class PatchUpdatesController < ApplicationController
4
5   before_filter :login_required
6   layout 'main'
7   include ProxyLoader
8   # GET /patch_updates
9   # GET /patch_updates.xml
10   def index
11     @patch_updates = load_proxy 'org.opensuse.yast.system.patches', :all
12     logger.debug "Available patches: #{@patch_updates.inspect}"
13   end
14
15   # this action is rendered as a partial, so it can't throw
16   def show_summary
17     error = nil
18     patch_updates = nil    
19     begin
20       patch_updates = load_proxy 'org.opensuse.yast.system.patches', :all
21     rescue Exception => e
22       error = e
23       patch_updates = nil
24     end
25
26     patches_summary = nil
27
28     if patch_updates
29       patches_summary = { :security => 0, :important => 0, :optional => 0}
30
31       [:security, :important, :optional].each do |patch_type|
32         patches_summary[patch_type] = patch_updates.find_all { |p| p.kind == patch_type.to_s }.size
33       end
34     else
35       erase_redirect_results #reset all redirects
36       erase_render_results
37       flash.clear #no flash from load_proxy
38     end
39
40     respond_to do |format|
41       format.html { render :partial => "patch_summary", :locals => { :patch => patches_summary, :error => error } }
42       format.json  { render :json => patches_summary }
43     end    
44   end
45
46   def load_filtered
47     @patch_updates = load_proxy 'org.opensuse.yast.system.patches', :all
48     kind = params[:value]
49     unless kind == "all"
50       @patch_updates = @patch_updates.find_all { |patch| patch.kind == kind }
51     end
52     render :partial => "patches"
53   end
54
55   # POST /patch_updates/start_install_all
56   # Starting installation of all proposed patches
57   def start_install_all
58     logger.debug "Start installation of all patches"
59
60     respond_to do |format|
61       format.html { render :partial => "patch_installation", :locals => { :patch => _("Installing all patches..."), :error => nil  , :go_on => true }}
62     end    
63   end
64
65   def stop_install_all
66     logger.debug "Stopping installation of all patches"
67
68     respond_to do |format|
69       format.html { render :partial => "patch_installation", :locals => { :patch => _("Installation stopped"), :error => nil  , :go_on => false }}
70     end    
71   end
72
73   # POST /patch_updates/install_all
74   # Install each patch. This function will be called periodically from the controll center
75   def install_all
76     logger.debug "Installing one available patch...."
77
78     error = nil
79     patch_updates = nil    
80     begin
81       patch_updates = load_proxy 'org.opensuse.yast.system.patches', :all
82     rescue Exception => e
83       error = e
84       patch_updates = nil
85     end
86
87     flash.clear #no flash from load_proxy
88     last_patch = ""
89     if patch_updates.size > 0
90       #installing the first available patch
91       logger.info "Installing patch :#{patch_updates[0].name}"
92       begin
93         patch_updates[0].save
94         logger.debug "updated #{patch_updates[0].name}"
95       rescue ActiveResource::ClientError => e
96         error = e
97       end        
98       last_patch = patch_updates[0].name
99     else
100       erase_redirect_results #reset all redirects
101       erase_render_results
102     end
103
104     respond_to do |format|
105       if last_patch.blank?
106         format.html { render :partial => "patch_installation", :locals => { :patch => _("Installation finished"), :error => error  , :go_on => false }}
107       else
108         format.html { render :partial => "patch_installation", :locals => { :patch => _("#{last_patch} installed.") , :error => error }}
109       end
110     end    
111   end
112
113   # POST /patch_updates/install
114   # Installing one or more patches which has given via param 
115
116   def install    
117     update_array = []
118
119     #search for patches and collect the ids
120     params.each { |key, value|
121       if key =~ /\D*_\d/ || key == "id"
122         update_array << value
123       end
124     }
125     update_array.each do |patch_id|
126       update = YaST::ServiceResource.proxy_for('org.opensuse.yast.system.patches').new(
127                              :repo=>nil, 
128                              :kind=>nil, 
129                              :name=>nil, 
130                              :arch=>nil, 
131                              :version=>nil,
132                              :summary=>nil, 
133                              :resolvable_id=>patch_id)
134       begin
135         update.save
136         logger.debug "updated #{patch_id}"
137         flash[:notice] = _("Patch has been installed.")
138       rescue ActiveResource::ClientError => e
139         flash[:error] = YaST::ServiceResource.error(e)
140       end        
141     end
142     redirect_to({:controller=>"patch_updates", :action=>"index"})
143   end
144 end