Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F1615747
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
Sun, Mar 22, 3:28 AM
Size
12 KB
Mime Type
text/x-diff
Expires
Tue, Mar 24, 3:28 AM (2 h, 1 m)
Engine
blob
Format
Raw Data
Handle
354563
Attached To
rARCHIVING archiving
View Options
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
Log In to Comment