Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Fri, Aug 29, 3:30 PM
diff --git a/app/controllers/clients_controller.rb b/app/controllers/clients_controller.rb
index 31ccb97..e0f252a 100644
--- a/app/controllers/clients_controller.rb
+++ b/app/controllers/clients_controller.rb
@@ -1,189 +1,191 @@
class ClientsController < ApplicationController
before_action :require_logged_in
before_action :fetch_client, only: [:show, :jobs, :logs, :stats, :users, :restore, :run_restore,
:restore_selected, :remove_user]
- before_action :fetch_logs, only: [:logs]
before_action :require_non_blocked_client, only: [:restore, :restore_selected, :run_restore]
# GET /clients
# POST /clients
def index
@client_ids = Client.for_user(current_user.id).pluck(:ClientId)
@clients = Client.where(ClientId: @client_ids).includes(:jobs)
@hosts = current_user.hosts.not_baculized
fetch_jobs_info
get_charts
end
# GET /clients/1
def show
@schedules = @client.host.job_templates.map(&:schedule)
@filesets = @client.host.job_templates.map(&:fileset)
@jobs = @client.jobs.backup_type.terminated.group(:name).maximum(:EndTime)
end
# GET /clients/1/jobs
def jobs
@jobs = @client.recent_jobs.page(params[:page])
end
- # GET /clients/1/logs
- def logs; end
+ # GET /clients/1/logs?job_id=1
+ def logs
+ @job = @client.jobs.find(params[:job_id])
+ @logs = @job.logs.page(params[:page]).per(50)
+ end
# GET /clients/1/stats
# POST /clients/1/stats
def stats
get_charts
end
# GET /clients/1/users
def users
@users = @client.host.users
if @client.manually_inserted?
@invitation = @client.host.invitations.new
excluded_ids = @users.pluck(:id) + @client.host.invitations.pluck(:user_id)
@available_users = User.where(enabled: true).institutional.
where.not(id: excluded_ids).pluck(:username, :id)
end
end
# DELETE /clients/1/user
def remove_user
user = @client.host.users.find(params[:user_id])
redirect_path = users_client_path(@client)
if @client.host.users.count == 1
flash[:alert] = 'You can not remove the last user'
elsif @client.host.users.delete(user)
flash[:success] =
if @client.manually_inserted?
'User successfully removed'
else
'User must be removed from the VM\'s list from your VM provider too (ViMa or Okeanos).'
end
if user.id == current_user.id
redirect_path = clients_path
end
else
flash[:alert] = 'User not removed, something went wrong'
end
redirect_to redirect_path
end
# GET /clients/1/restore
def restore
@restore_clients = Client.for_user(current_user.id)
return if @client.is_backed_up?
flash[:error] = 'Can not issue a restore for this client'
redirect_to client_path(@client)
end
# POST /clients/1/run_restore
def run_restore
@location = params[:restore_location].blank? ? '/tmp/bacula_restore' : params[:restore_location]
fileset = params[:fileset]
fetch_restore_point
fetch_restore_client
if params[:commit] == 'Restore All Files'
if @location.nil? || fileset.nil? ||
!@client.host.restore(fileset, @location, @restore_point, @restore_client)
flash[:error] = 'Something went wrong, try again later'
else
msg = "Restore job issued successfully, files will be soon available in #{@location}"
msg << " of client #{@restore_client}" if @restore_client.present?
flash[:success] = msg
end
render js: "window.location = '#{client_path(@client)}'"
else
session[:job_ids] = @client.get_job_ids(fileset, @restore_point)
session[:restore_client] = @restore_client
Bvfs.new(@client, session[:job_ids]).update_cache
render 'select_files'
end
end
# POST /clients/1/restore_selected
def restore_selected
Bvfs.new(@client, session[:job_ids]).
restore_selected_files(params[:files], params[:location], nil, session[:restore_client])
session.delete(:job_ids)
session.delete(:restore_client)
flash[:success] =
"Restore job issued successfully, files will be soon available in #{params[:location]}"
redirect_to client_path(@client)
end
# GET /clients/1/tree?id=1
def tree
@client = Client.for_user(current_user.id).find(params[:client_id])
bvfs = Bvfs.new(@client, session[:job_ids])
pathid = params[:id].to_i
if pathid.nonzero?
bvfs.fetch_dirs(pathid)
else
bvfs.fetch_dirs
end
tree = bvfs.extract_dir_id_and_name.map do |id, name|
{ id: id, text: name, state: { checkbox_disabled: true }, children: true }
end
if pathid.nonzero?
bvfs.fetch_files(pathid)
bvfs.extract_file_id_and_name.each do |id, name|
tree << { id: id, text: name, type: 'file' }
end
end
render json: tree
end
private
def require_non_blocked_client
if @client.host.blocked?
flash[:error] = 'Client disabled by admins'
redirect_to clients_path
end
end
def fetch_client
@client = Client.for_user(current_user.id).find(params[:id])
@client_ids = [@client.id]
end
def fetch_restore_client
if params[:restore_client]
@restore_client = Client.for_user(current_user.id).find_by(ClientId: params[:restore_client]).try(:name)
end
end
def fetch_jobs_info
@stats = JobStats.new(@client_ids)
end
def get_charts
@job_status = ChartGenerator.job_statuses(@client_ids, days_ago)
@job_stats = ChartGenerator.job_stats(@client_ids, days_ago - 1)
end
def fetch_restore_point
if params['restore_time(4i)'].blank? || params['restore_time(5i)'].blank? ||
params[:restore_date].blank?
return nil
end
@restore_point =
begin
DateTime.parse(
"#{params[:restore_date]} #{params['restore_time(4i)']}:#{params['restore_time(5i)']}:00").
strftime('%Y-%m-%d %H:%M:%S')
rescue
nil
end
end
end
diff --git a/app/views/clients/_header.html.erb b/app/views/clients/_header.html.erb
index 881b1de..863d3a5 100644
--- a/app/views/clients/_header.html.erb
+++ b/app/views/clients/_header.html.erb
@@ -1,10 +1,10 @@
<p id="notice"><%= notice %></p>
<%= tabs_with Client: client_path(@client), 'Recent Jobs' => jobs_client_path(@client),
- Stats: stats_client_path(@client), Logs: logs_client_path(@client),
+ Stats: stats_client_path(@client),
Users: users_client_path(@client) %>
<h2>
<%= @client.name %>
<%= host_status_label(@client.host) %>
</h2>
diff --git a/app/views/clients/_log.html.erb b/app/views/clients/_log.html.erb
index 0826e59..ddeee99 100644
--- a/app/views/clients/_log.html.erb
+++ b/app/views/clients/_log.html.erb
@@ -1,9 +1,9 @@
<tr>
<td><%= log.log_id %></td>
- <td><%= log.job.id %></td>
- <td><%= log.job.name %></td>
+ <td><%= @job.id %></td>
+ <td><%= @job.name %></td>
<td><%= log.time_formatted %></td>
<td style='max-width: 650px'><pre class='pre-scrollable'>
<%= log.log_text %>
</pre></td>
</tr>
diff --git a/app/views/clients/_recent_job.html.erb b/app/views/clients/_recent_job.html.erb
index a7ff17c..fbf12aa 100644
--- a/app/views/clients/_recent_job.html.erb
+++ b/app/views/clients/_recent_job.html.erb
@@ -1,12 +1,12 @@
<tr class="<%= success_class(recent_job.job_status) %>">
<td><%= recent_job.name %></td>
- <td><%= recent_job.job_id %></td>
+ <td><%= link_to recent_job.job_id, logs_client_path(@client.id, job_id: recent_job.job_id) %></td>
<td><%= recent_job.level_human %></td>
<td><%= recent_job.fileset %></td>
<td><%= recent_job.start_time_formatted %></td>
<td><%= recent_job.end_time_formatted %></td>
<td><%= recent_job.duration %></td>
<td><%= number_to_human_size(recent_job.job_bytes) %></td>
<td><%= number_by_magnitude(recent_job.job_files) %></td>
<td><%= recent_job.status_human %></td>
</tr>
diff --git a/app/views/clients/logs.html.erb b/app/views/clients/logs.html.erb
index 5388966..90be2b4 100644
--- a/app/views/clients/logs.html.erb
+++ b/app/views/clients/logs.html.erb
@@ -1,46 +1,57 @@
-<%= render partial: 'header' %>
+<p id="notice"><%= notice %></p>
+
+<ul class="nav nav-tabs" role="tablist">
+ <li role="presentation">
+ <%= link_to 'Client', client_path(@client), 'aria-controls' => 'client', 'role' => 'tab' %>
+ </li>
+ <li class="active" role="presentation">
+ <%= link_to 'Recent Jobs', jobs_client_path(@client),
+ 'aria-controls' => 'recent jobs', 'role' => 'tab' %>
+ </li>
+ <li role="presentation">
+ <%= link_to 'Stats', stats_client_path(@client),
+ 'aria-controls' => 'stats', 'role' => 'tab' %>
+ </li>
+ <li role="presentation">
+ <%= link_to 'Users', users_client_path(@client),
+ 'aria-controls' => 'users', 'role' => 'tab' %>
+ </li>
+</ul>
+
+<h2>
+ <%= @client.name %>
+ <%= host_status_label(@client.host) %>
+</h2>
<div class='row'>
<div class='col-xs-3'>
<h3>Logs <small>(<%= @logs.count %>)</small></h3>
</div>
<div class="col-xs-4 right text-right">
<%= page_entries_info @logs, entry_name: 'log' %>
<%= paginate @logs %>
</div>
</div>
<div class="row">
<div class="col-xs-12">
- <%= bootstrap_form_tag(url: '', method: :get, layout: :inline) do |form| %>
- <%= form.text_field :start_date, value: @dates[:start],
- class: 'datepicker' %>
- <%= form.text_field :end_date, value: @dates[:end],
- class: 'datepicker' %>
- <%= form.submit 'Show Logs', class: 'btn btn-default' %>
- <% end %>
- </div>
-</div>
-
-<div class="row">
- <div class="col-xs-12">
<div class="datatable-wrapper">
<div class="table-responsive">
<table id="logs" class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<th>LogId</th>
<th>JobId</th>
<th>Job</th>
<th>Time</th>
<th class="no-order">Text</th>
</tr>
</thead>
<tbody>
<%= render partial: 'log', collection: @logs %>
</tbody>
</table>
</div>
</div>
</div>
</div>

Event Timeline