Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F1615312
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Mar 21, 11:19 PM
Size
8 KB
Mime Type
text/x-diff
Expires
Mon, Mar 23, 11:19 PM (22 h, 38 m)
Engine
blob
Format
Raw Data
Handle
354356
Attached To
rARCHIVING archiving
View Options
diff --git a/app/controllers/hosts_controller.rb b/app/controllers/hosts_controller.rb
index d6907a0..971f7f1 100644
--- a/app/controllers/hosts_controller.rb
+++ b/app/controllers/hosts_controller.rb
@@ -1,64 +1,71 @@
class HostsController < ApplicationController
- before_action :fetch_host, only: [:show, :edit, :update, :destroy, :submit_config, :revoke]
+ before_action :fetch_host, only: [:show, :edit, :update, :destroy, :submit_config,
+ :revoke, :restore]
# GET /hosts/new
def new
@host = Host.new
end
# POST /hosts
def create
@host = Host.new(fetch_params)
if @host.save
current_user.hosts << @host
redirect_to host_path @host
else
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
redirect_to host_path @host
else
render :edit
end
end
# DELETE /hosts/1
def destroy
@host.destroy
redirect_to root_path
end
# POST /hosts/1/submit_config
def submit_config
@host.dispatch_to_bacula
redirect_to host_path(@host)
end
# DELETE /hosts/1/revoke
def revoke
@host.remove_from_bacula
redirect_to root_path
end
+ # POST /hosts/1/restore
+ def restore
+ @host.restore
+ redirect_to client_path(@host.client)
+ end
+
private
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
end
diff --git a/app/models/client.rb b/app/models/client.rb
index e9d5bbd..eb68a58 100644
--- a/app/models/client.rb
+++ b/app/models/client.rb
@@ -1,84 +1,91 @@
class Client < ActiveRecord::Base
self.table_name = :Client
self.primary_key = :ClientId
alias_attribute :name, :Name
alias_attribute :uname, :Uname
alias_attribute :auto_prune, :AutoPrune
alias_attribute :file_retention, :FileRetention
alias_attribute :job_retention, :JobRetention
has_many :jobs, foreign_key: :ClientId
has_one :host, foreign_key: :name, primary_key: :Name
scope :for_user, ->(user_id) { joins(host: :users).where(users: { id: user_id }) }
DAY_SECS = 60 * 60 * 24
RECENT_JOBS_COUNT = 5
# Fetches the client's job_templates that are already persisted to
# Bacula's configuration
#
# @return [ActiveRecord::Relation] of `JobTemplate`
def persisted_jobs
host.job_templates.where(baculized: true).includes(:fileset, :schedule)
end
# Fetches the client's performed jobs in reverse chronological order
#
# @return [ActiveRecord::Relation] of `Job`
def recent_jobs
jobs.order(EndTime: :desc).limit(RECENT_JOBS_COUNT).includes(:file_set)
end
# Helper method. It shows the client's job retention,
# (which is expressed in seconds) in days.
#
# @return [Integer]
def job_retention_days
job_retention / DAY_SECS
end
# Helper method. It shows the client's file retention,
# (which is expressed in seconds) in days.
#
# @return [Integer]
def file_retention_days
file_retention / DAY_SECS
end
# Helper method for auto_prune
#
# @return [String] 'yes' or 'no'
def auto_prune_human
auto_prune == 1 ? 'yes' : 'no'
end
# Helper method for displayin the last job's datetime in a nice format.
def last_job_date_formatted
if job_time = jobs.backup_type.last.try(:end_time)
I18n.l(job_time, format: :long)
end
end
+ # Shows if a client has any backup jobs to Bacule config
+ #
+ # @return [Boolean]
+ def is_backed_up?
+ jobs.backup_type.any?
+ end
+
# Shows the total file size of the jobs that run for a specific client
#
# @return [Integer] Size in Bytes
def backup_jobs_size
jobs.backup_type.map(&:job_bytes).sum
end
# Shows the total files' count for the jobs that run for a specific client
#
# @return [Integer] File count
def files_count
jobs.map(&:job_files).sum
end
# Fetches the client's jobs that are running at the moment
#
# @return [Integer]
def running_jobs
jobs.running.count
end
end
diff --git a/app/views/clients/_client_details.html.erb b/app/views/clients/_client_details.html.erb
index fe365ec..8057c98 100644
--- a/app/views/clients/_client_details.html.erb
+++ b/app/views/clients/_client_details.html.erb
@@ -1,47 +1,54 @@
<div class="col-xs-4">
<div class="table-responsive">
<table class="table table-striped table-bordered table-condensed ">
<tr>
<td>Name</td>
<td><%= @client.name %></td>
</tr>
<tr>
<td>Uname</td>
<td><%= @client.uname %></td>
</tr>
<tr>
<td>Active Jobs</td>
<td><%= @client.running_jobs %></td>
</tr>
<tr>
<td>Last Backup</td>
<td>
<%= @client.last_job_date_formatted %>
</td>
</tr>
<tr>
<td>File Retention</td>
<td><%= @client.file_retention_days %> days</td>
</tr>
<tr>
<td>Job Retention</td>
<td><%= @client.job_retention_days %> days</td>
</tr>
<tr>
<td>Total Space Used</td>
<td><%= number_to_human_size @client.backup_jobs_size %></td>
</tr>
<tr>
<td>Files count</td>
<td><%= number_by_magnitude(@client.files_count) %></td>
</tr>
<tr>
<td>Auto Prune</td>
<td><%= @client.auto_prune_human %></td>
</tr>
</table>
</div>
<div>
- <%= link_to 'Restore Files', '#', class: "btn btn-warning", role: "button" %>
+ <% if @client.is_backed_up? %>
+ <%= link_to 'Restore Files', restore_host_path(@client.host),
+ class: "btn btn-warning", role: "button", method: :post,
+ data: {
+ confirm: "This will restore all your files at the most recent backup (#{@client.last_job_date_formatted})"
+ }
+ %>
+ <% end %>
</div>
</div>
diff --git a/config/routes.rb b/config/routes.rb
index e4ad367..dad4797 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,22 +1,23 @@
Rails.application.routes.draw do
resources :clients, only: [:index, :show]
resources :hosts, only: [:new, :create, :show, :edit, :update, :destroy] do
member do
post :submit_config
+ post :restore
delete :revoke
end
resources :jobs, only: [:new, :create, :show, :edit, :update, :destroy] do
member do
patch :toggle_enable
post :backup_now
end
end
resources :filesets, only: [:show, :new, :create, :destroy]
resources :schedules, only: [:show, :new, :edit, :create, :update, :destroy]
end
root 'clients#index'
end
diff --git a/spec/routing/host_routing_spec.rb b/spec/routing/host_routing_spec.rb
index 4b2e28d..3d02b1c 100644
--- a/spec/routing/host_routing_spec.rb
+++ b/spec/routing/host_routing_spec.rb
@@ -1,37 +1,42 @@
require 'spec_helper'
describe HostsController do
it 'routes GET /hosts/new' do
expect(get('/hosts/new')).to route_to(controller: 'hosts', action: 'new')
end
it 'routes POST /hosts' do
expect(post('/hosts')).to route_to(controller: 'hosts', action: 'create')
end
it 'routes GET /hosts/1' do
expect(get('/hosts/1')).to route_to(controller: 'hosts', action: 'show', id: '1')
end
it 'routes GET /hosts/1/edit' do
expect(get('/hosts/1/edit')).to route_to(controller: 'hosts', action: 'edit', id: '1')
end
it 'routes PUT /hosts/1' do
expect(put('/hosts/1')).to route_to(controller: 'hosts', action: 'update', id: '1')
end
it 'routes DELETE /hosts/1' do
expect(delete('/hosts/1')).to route_to(controller: 'hosts', action: 'destroy', id: '1')
end
it 'routes POST /hosts/1/submit_config' do
expect(post('/hosts/1/submit_config')).
to route_to(controller: 'hosts', action: 'submit_config', id: '1')
end
it 'routes DELETE /hosts/1/revoke' do
expect(delete('/hosts/1/revoke')).
to route_to(controller: 'hosts', action: 'revoke', id: '1')
end
+
+ it 'routes POST /hosts/1/restore' do
+ expect(post('/hosts/1/restore')).
+ to route_to(controller: 'hosts', action: 'restore', id: '1')
+ end
end
Event Timeline
Log In to Comment