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