Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Sun, Mar 22, 3:28 AM
diff --git a/app/controllers/admin/clients_controller.rb b/app/controllers/admin/clients_controller.rb
new file mode 100644
index 0000000..9d8ce6e
--- /dev/null
+++ b/app/controllers/admin/clients_controller.rb
@@ -0,0 +1,38 @@
+class Admin::ClientsController < Admin::BaseController
+ before_action :fetch_client, only: [:show]
+
+ # Shows all available clients
+ #
+ # GET /admin/clients
+ def index
+ @clients = Client.includes(:jobs).all
+ @client_ids = @clients.map(&:id)
+ fetch_jobs_info
+ end
+
+ # Shows a specific client
+ #
+ # GET /admin/clients/1
+ def show
+ @client_ids = [@client.id]
+ get_logs
+ get_charts
+ end
+
+ private
+
+ # Fetches the client based on the given id
+ def fetch_client
+ @client = Client.find(params[:id])
+ end
+
+ def fetch_jobs_info
+ @stats = JobStats.new
+ end
+
+ def get_charts
+ days_ago = params.fetch(:days_back, 7).to_i rescue 7
+ @job_status = ChartGenerator.job_statuses(@client_ids, days_ago)
+ @job_stats = ChartGenerator.job_stats(@client_ids, days_ago - 1)
+ end
+end
diff --git a/app/views/admin/clients/_client.html.erb b/app/views/admin/clients/_client.html.erb
new file mode 100644
index 0000000..bfc21bf
--- /dev/null
+++ b/app/views/admin/clients/_client.html.erb
@@ -0,0 +1,12 @@
+<tr>
+ <td><%= link_to "##{client.id}", admin_client_path(client) %></td>
+ <td><%= link_to client.name, admin_client_path(client) %></td>
+ <td><%= client.uname %></td>
+ <td><%= @stats.active_jobs[client.id] || 0 %></td>
+ <td><%= @stats.last_jobs[client.id] %></td>
+ <td><%= client.file_retention_days %></td>
+ <td><%= client.job_retention_days %></td>
+ <td><%= number_to_human_size(@stats.jobs_sizes[client.id]) %></td>
+ <td><%= number_by_magnitude(@stats.jobs_files[client.id]) %></td>
+ <td><%= client.auto_prune_human %></td>
+</tr>
diff --git a/app/views/admin/clients/_client_details.html.erb b/app/views/admin/clients/_client_details.html.erb
new file mode 100644
index 0000000..161b7bd
--- /dev/null
+++ b/app/views/admin/clients/_client_details.html.erb
@@ -0,0 +1,44 @@
+<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>
diff --git a/app/views/admin/clients/_client_graphs.html.erb b/app/views/admin/clients/_client_graphs.html.erb
new file mode 100644
index 0000000..0d1a682
--- /dev/null
+++ b/app/views/admin/clients/_client_graphs.html.erb
@@ -0,0 +1,18 @@
+<br />
+<div class='row'>
+ <div class="col-xs-4">
+ <div id="jobs_status"></div>
+ </div>
+ <div class="col-xs-4">
+ <div id="jobs_stats"></div>
+ </div>
+ <div class="col-xs-4">
+ <%= bootstrap_form_tag(url: path, method: :get, layout: :inline) do |f| %>
+ <%= f.select(:days_back, [['1 week', 7], ['2 weeks', 14], ['1 month', 30]]) %>
+ <%= f.submit 'See Stats', class: "btn btn-primary" %>
+ <% end %>
+ </div>
+</div>
+
+<%= baas_chart('jobs_status', @job_status) %>
+<%= baas_chart('jobs_stats', @job_stats) %>
diff --git a/app/views/admin/clients/_job.html.erb b/app/views/admin/clients/_job.html.erb
new file mode 100644
index 0000000..f10eda8
--- /dev/null
+++ b/app/views/admin/clients/_job.html.erb
@@ -0,0 +1,7 @@
+<tr>
+ <td><%= job.name %></td>
+ <td><%= job.job_type %></td>
+ <td><%= job.fileset.try(:name) %></td>
+ <td><%= job.schedule_human %></td>
+ <td><%= I18n.l(job.created_at, format: :long) %></td>
+</tr>
diff --git a/app/views/admin/clients/_jobs.html.erb b/app/views/admin/clients/_jobs.html.erb
new file mode 100644
index 0000000..d7a4d0f
--- /dev/null
+++ b/app/views/admin/clients/_jobs.html.erb
@@ -0,0 +1,18 @@
+<div class="col-xs-12">
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Type</th>
+ <th>Fileset</th>
+ <th>Schedule</th>
+ <th>Created</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%= render partial: 'job', collection: @client.persisted_jobs, object: :job %>
+ </tbody>
+ </table>
+ </div>
+</div>
diff --git a/app/views/admin/clients/_log.html.erb b/app/views/admin/clients/_log.html.erb
new file mode 100644
index 0000000..589a415
--- /dev/null
+++ b/app/views/admin/clients/_log.html.erb
@@ -0,0 +1,8 @@
+<tr>
+ <td><%= log.log_id %></td>
+ <td><%= log.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/admin/clients/_logs.html.erb b/app/views/admin/clients/_logs.html.erb
new file mode 100644
index 0000000..adcfe45
--- /dev/null
+++ b/app/views/admin/clients/_logs.html.erb
@@ -0,0 +1,23 @@
+<div class='row'>
+ <div class='col-xs-3'>
+ <h3>Logs</h3>
+ </div>
+
+ <div class="col-xs-12">
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th>LogId</th>
+ <th>Job</th>
+ <th>Time</th>
+ <th>Text</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%= render partial: 'log', collection: @logs %>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
diff --git a/app/views/admin/clients/_recent_job.html.erb b/app/views/admin/clients/_recent_job.html.erb
new file mode 100644
index 0000000..109626b
--- /dev/null
+++ b/app/views/admin/clients/_recent_job.html.erb
@@ -0,0 +1,11 @@
+<tr class="<%= success_class(recent_job.job_status) %>">
+ <td><%= recent_job.name %></td>
+ <td><%= 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><%= number_to_human_size(recent_job.job_bytes) %></td>
+ <td><%= number_by_magnitude(recent_job.job_files) %></td>
+ <td><%= recent_job.status_human %>
+</tr>
diff --git a/app/views/admin/clients/_recent_jobs.html.erb b/app/views/admin/clients/_recent_jobs.html.erb
new file mode 100644
index 0000000..a444a8e
--- /dev/null
+++ b/app/views/admin/clients/_recent_jobs.html.erb
@@ -0,0 +1,22 @@
+<div class="col-xs-12">
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>JobId</th>
+ <th>Level</th>
+ <th>Fileset</th>
+ <th>Started At</th>
+ <th>Finished At</th>
+ <th>Bytes</th>
+ <th>Files</th>
+ <th>Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <%= render partial: 'recent_job', collection: @client.recent_jobs %>
+ </tbody>
+ </table>
+ </div>
+</div>
diff --git a/app/views/admin/clients/index.html.erb b/app/views/admin/clients/index.html.erb
new file mode 100644
index 0000000..98e580f
--- /dev/null
+++ b/app/views/admin/clients/index.html.erb
@@ -0,0 +1,24 @@
+<h1>Bacula Clients</h1>
+
+<div class="table-responsive">
+ <table class="table table-striped table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th>ClientId</th>
+ <th>Name</th>
+ <th>Uname</th>
+ <th>Active Jobs</th>
+ <th>Last Backup</th>
+ <th>FileRetention (days)</th>
+ <th>JobRetention (days)</th>
+ <th>Space Used</th>
+ <th>File count</th>
+ <th>AutoPrune</th>
+ </tr>
+ </thead>
+
+ <tbody>
+ <%= render partial: 'client', collection: @clients %>
+ </tbody>
+ </table>
+</div>
diff --git a/app/views/admin/clients/show.html.erb b/app/views/admin/clients/show.html.erb
new file mode 100644
index 0000000..f30a0c7
--- /dev/null
+++ b/app/views/admin/clients/show.html.erb
@@ -0,0 +1,44 @@
+<p id="notice"><%= notice %></p>
+<% if @client.host %>
+ <div class="row right">
+ <%= link_to 'Manage Client', 'admin_host_path(@client.host)', class: "btn btn-primary", role: "button" %>
+ </div>
+<% end %>
+
+<h2><%= @client.name %></h2>
+
+<div class="row">
+ <div class="col-xs-4">
+ <h3>Client Details</h3>
+ </div>
+ <div class="col-xs-6">
+ <h3>Bacula Jobs</h3>
+ </div>
+</div>
+
+<div class="row">
+ <%= render partial: 'client_details' %>
+ <div class="col-xs-8">
+ <div class="row">
+ <% if @client.host %>
+ <%= render partial: 'jobs' %>
+ <% end %>
+ </div>
+ <div class="row">
+ <div class="col-xs-6">
+ <h3>Recent Jobs</h3>
+ </div>
+ </div>
+ <div class="row">
+ <%= render partial: 'recent_jobs' %>
+ </div>
+ </div>
+</div>
+
+<br/>
+
+<%= render partial: 'client_graphs', locals: { path: admin_client_path(@client) } %>
+
+<br/>
+
+<%= render partial: 'logs' %>
diff --git a/app/views/shared/_nav.html.erb b/app/views/shared/_nav.html.erb
index fefa4ff..654d8cc 100644
--- a/app/views/shared/_nav.html.erb
+++ b/app/views/shared/_nav.html.erb
@@ -1,34 +1,35 @@
<!-- Fixed navbar -->
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Baas</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="/clients">Clients</a></li>
<li><a href="/contact">Contact</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Profile <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Logout</a></li>
<li class="divider"></li>
<li class="dropdown-header">Profile</li>
<li><a href="#">Edit</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<% if current_user.admin? %>
<li><%= link_to 'Admin', admin_path %></li>
+ <li><%= link_to 'Clients', admin_clients_path %></li>
<% end %>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
diff --git a/config/routes.rb b/config/routes.rb
index d8f978d..d2fd087 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,28 +1,30 @@
Rails.application.routes.draw do
root 'clients#index'
resources :clients, only: [:index, :show]
resources :hosts, only: [:new, :create, :show, :edit, :update, :destroy] do
member do
post :submit_config
get :restore
post :run_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
namespace :admin do
get '/' => 'base#index'
+
+ resources :clients, only: [:index, :show]
end
end

Event Timeline