diff --git a/app/controllers/hosts_controller.rb b/app/controllers/hosts_controller.rb index 2a05c42..6089e57 100644 --- a/app/controllers/hosts_controller.rb +++ b/app/controllers/hosts_controller.rb @@ -1,104 +1,119 @@ class HostsController < ApplicationController before_action :require_logged_in before_action :fetch_host, only: [:show, :edit, :update, :destroy, :submit_config, :revoke, :restore, :run_restore] + before_action :fetch_hosts_of_user, only: [:new, :edit, :create] # GET /hosts/new def new @host = Host.new + @host.port = 9102 end # POST /hosts def create @host = Host.new(fetch_params) - if @host.save + + @host.verified = current_user.needs_host_list? + + if user_can_add_this_host? && @host.save flash[:success] = 'Host created successfully' current_user.hosts << @host redirect_to host_path @host else flash[:error] = 'Host was not created' render :new end end # GET /hosts/1 def show; end # GET /hosts/1/edit def edit; end # PATCH /hosts/1 def update updates = fetch_params.slice(:port, :password) if updates.present? && @host.update_attributes(updates) @host.recalculate flash[:success] = 'Host updated successfully. You must update your file deamon accordingly.' redirect_to host_path @host else render :edit end end # DELETE /hosts/1 def destroy if @host.destroy flash[:success] = 'Host destroyed successfully' else flash[:error] = 'Host not destroyed' end redirect_to root_path end # POST /hosts/1/submit_config def submit_config if @host.dispatch_to_bacula flash[:success] = 'Host configuration sent to Bacula successfully' else flash[:error] = 'Something went wrong, try again later' end redirect_to host_path(@host) end # DELETE /hosts/1/revoke def revoke if @host.remove_from_bacula flash[:success] = 'Host configuration removed from Bacula successfully' else flash[:error] = 'Something went wrong, try again later' end redirect_to root_path end # GET /hosts/1/restore def restore if !@host.restorable? flash[:error] = "Can not issue a restore for this client" redirect_to @host.client.present? ? client_path(@host.client) : root_path end end # POST /hosts/1/run_estore def run_restore location = params[:restore_location] if location.present? && @host.restore(location) flash[:success] = "Restore job issued successfully, files will be soon available in #{location}" else flash[:error] = 'Something went wrong, try again later' end redirect_to client_path(@host.client) end private + def fetch_hosts_of_user + return if not current_user.needs_host_list? + + @hosts_of_user = session[:vms] - current_user.hosts.pluck(:fqdn) + end + def fetch_host @host = current_user.hosts.includes(job_templates: [:fileset, :schedule]).find(params[:id]) end def fetch_params params.require(:host).permit(:fqdn, :port, :password) end + + def user_can_add_this_host? + !current_user.needs_host_list? || @hosts_of_user.include?(@host.fqdn) + end end diff --git a/app/views/hosts/_form.html.erb b/app/views/hosts/_form.html.erb index 629becc..061bbfc 100644 --- a/app/views/hosts/_form.html.erb +++ b/app/views/hosts/_form.html.erb @@ -1,16 +1,21 @@ <%= bootstrap_form_for(@host, layout: :horizontal, label_col: 'col-xs-3', control_col: 'col-xs-8') do |f| %>
- <%= f.text_field :fqdn, disabled: @host.persisted? %> - <%= f.text_field :password %> - <%= f.number_field :port, value: 9102 %> + <% if current_user.needs_host_list? %> + <%= f.select :fqdn, options_for_select(@hosts_of_user, @host.fqdn), {}, + disabled: @host.persisted? %> + <% else %> + <%= f.text_field :fqdn, disabled: @host.persisted? %> + <% end %> + <%= f.password_field :password %> + <%= f.number_field :port, min: 1 %>
<%= f.submit class: 'btn btn-success' %>
<% end %>