Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F5493891
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
Wed, Sep 30, 11:48 AM
Size
11 KB
Mime Type
text/x-diff
Expires
Fri, Oct 2, 11:48 AM (23 h, 28 m)
Engine
blob
Format
Raw Data
Handle
458087
Attached To
rARCHIVING archiving
View Options
diff --git a/app/assets/javascripts/filesets.js b/app/assets/javascripts/filesets.js
index 1cf8042..0ffab2e 100644
--- a/app/assets/javascripts/filesets.js
+++ b/app/assets/javascripts/filesets.js
@@ -1,47 +1,47 @@
$(document).ready(function() {
if ($('.include_files-plus-sign').size() > 0) {
$(".include_files-plus-sign").click(function() {
addIncludedFileTextArea();
});
};
if ($('.exclude_directions-plus-sign').size() > 0) {
$(".exclude_directions-plus-sign").click(function() {
addExcludeDirectionsTextArea();
});
};
if ($('.include_files-remove-sign').size() > 0) {
$(".include_files-remove-sign").click(function() {
removeIncludedFileTextArea($(this));
});
};
if ($('.exclude_directions-remove-sign').size() > 0) {
$(".exclude_directions-remove-sign").click(function() {
removeExcludeDirectionsTextArea($(this));
});
};
});
function addIncludedFileTextArea() {
var textArrea = $('.templates .include_files:last').clone(true).val("");
textArrea.insertBefore('.here-included');
if ($('.include_files').size() > 1) {
$('.include_files-remove-sign').show();
};
}
function addExcludeDirectionsTextArea() {
var textArrea = $('.templates .exclude_directions:last').clone(true).val("");
textArrea.insertAfter('.here-excluded');
$('.exclude_directions:last input').val("");
}
function removeIncludedFileTextArea(element) {
element.closest('div.include_files').remove();
- if ($('.include_files').size() <= 1) {
+ if ($('form .include_files').size() <= 1) {
$('.include_files-remove-sign').hide();
};
}
function removeExcludeDirectionsTextArea(element) {
element.closest('div.exclude_directions').remove()
}
diff --git a/app/controllers/filesets_controller.rb b/app/controllers/filesets_controller.rb
index 3cde529..438f879 100644
--- a/app/controllers/filesets_controller.rb
+++ b/app/controllers/filesets_controller.rb
@@ -1,94 +1,94 @@
class FilesetsController < ApplicationController
before_action :require_logged_in
before_action :fetch_host, only: [:new, :create, :show, :edit, :update]
before_action :fetch_job_id, only: [:new, :create, :edit, :update]
before_action :fetch_fileset, only: [:show, :edit, :update]
# GET /hosts/:host_id/filesets/new
def new
@fileset = @host.filesets.new
@fileset.include_directions = { 'file' => [nil] }
@fileset.exclude_directions = ['']
end
# GET /hosts/:host_id/filesets/:id
def show
@fileset = @host.filesets.find(params[:id])
respond_to do |format|
format.js {}
end
end
# GET /hosts/:host_id/filesets/:id/edit
def edit
@fileset.include_files = @fileset.include_directions['file']
- @fileset.exclude_directions ||= ['']
+ @fileset.exclude_directions = [''] if @fileset.exclude_directions.empty?
end
# PATCH /hosts/:host_id/filesets/:id/
def update
fileset_params = fetch_params
if fileset_params[:exclude_directions].nil?
fileset_params[:exclude_directions] = []
end
if @fileset.update(fileset_params)
flash[:success] = 'Fileset updated successfully'
participating_hosts = @fileset.participating_hosts
if participating_hosts.size.nonzero?
participating_hosts.each(&:recalculate)
flash[:alert] = 'You will need to redeploy the afffected clients: ' +
participating_hosts.map(&:name).join(', ')
end
if @job_id
redirect_to edit_host_job_path(@host, @job_id, fileset_id: @fileset.id)
else
redirect_to new_host_job_path(@host, fileset_id: @fileset.id)
end
else
render :edit
end
end
# POST /hosts/:host_id/filesets
def create
@fileset = @host.filesets.new(fetch_params)
if @fileset.save
flash[:success] = 'Fileset created'
if @job_id.present?
redirect_to edit_host_job_path(@host, @job_id, fileset_id: @fileset.id)
else
redirect_to new_host_job_path(@host, fileset_id: @fileset.id)
end
else
@fileset.include_files = nil
@fileset.exclude_directions = ['']
@fileset.include_directions = { 'file' => [nil] }
render :new
end
end
# DELETE /hosts/:host_id/filesets/:id
def destroy
end
private
def fetch_host
@host = current_user.hosts.find(params[:host_id])
end
def fetch_job_id
@job_id = @host.job_templates.find(params[:job_id]).id if params[:job_id].present?
end
def fetch_fileset
@fileset = @host.filesets.find(params[:id])
end
def fetch_params
params.require(:fileset).permit(:name, exclude_directions: [], include_files: [])
end
end
diff --git a/app/models/fileset.rb b/app/models/fileset.rb
index 981b640..659f905 100644
--- a/app/models/fileset.rb
+++ b/app/models/fileset.rb
@@ -1,140 +1,143 @@
# Fileset model is the application representation of Bacula's Fileset.
# It has references to a host and job templates.
class Fileset < ActiveRecord::Base
establish_connection ARCHIVING_CONF
serialize :exclude_directions, Array
serialize :include_directions, JSON
attr_accessor :include_files
belongs_to :host
has_many :job_templates
validates :name, presence: true, uniqueness: { scope: :host }
validate :has_included_files, on: :create
validates_with NameValidator
before_save :sanitize_exclude_directions, :sanitize_include_directions
DEFAULT_EXCLUDED = %w{/var/lib/bacula /proc /tmp /.journal /.fsck /bacula}
DEFAULT_INCLUDE_OPTIONS = { signature: :SHA1, compression: :GZIP }
DEFAULT_INCLUDE_FILE_LIST = ['/']
# Constructs an array where each element is a line for the Fileset's bacula config
#
# @return [Array]
def to_bacula_config_array
['FileSet {'] +
[" Name = \"#{name_for_config}\""] +
include_directions_to_config_array +
exclude_directions_to_config_array +
['}']
end
# Provides a human readable projection of the fileset
#
# @return [String]
def human_readable
result = "Directories:\n"
result << "\t* " << include_directions['file'].join("\n\t* ")
if exclude_directions.present?
result << "\n\nExcluded:\n"
result << "\t* " << exclude_directions.join("\n\t*")
end
result
end
# Generates a name that will be used for the configuration file.
# It is the name that will be sent to Bacula through the configuration
# files.
#
# @return [String]
def name_for_config
[host.name, name].join(' ')
end
# Returns the hosts that have enabled jobs that use this fileset
#
# @return [ActiveRecord::Relation] the participating hosts
def participating_hosts
Host.joins(:job_templates).where(job_templates: { enabled: true, fileset_id: id }).uniq
end
# Creates a default fileset resource for a simple config
def default_resource(name, time_hex, opts = {})
@include_files = opts[:files].presence || DEFAULT_INCLUDE_FILE_LIST
self.name = "files_#{name}_#{time_hex}"
self.exclude_directions = DEFAULT_EXCLUDED
save!
self
end
private
def has_included_files
if include_files.blank? || include_files.all?(&:blank?)
errors.add(:include_files, :cant_be_blank)
end
end
def sanitize_include_directions
files = include_files.compact.uniq.keep_if(&:present?) rescue nil
- return false if files.blank?
+ if files.blank?
+ self.errors[:include_files] << "Include files can't be empty"
+ return false
+ end
files = files.map {|file| Shellwords.escape(file) }
self.include_directions = { options: DEFAULT_INCLUDE_OPTIONS, file: files }
end
def sanitize_exclude_directions
self.exclude_directions =
begin
exclude_directions.keep_if(&:present?).uniq.map do |x|
Shellwords.escape(x)
end
rescue
nil
end
end
def exclude_directions_to_config_array
return [] if exclude_directions.empty?
[' Exclude {'] +
exclude_directions.map { |x| " File = \"#{x}\"" } +
[' }']
end
def include_directions_to_config_array
return [] if include_directions.blank?
[" Include {"] +
included_options +
included_files +
[' }']
end
def included_options
formatted = [" Options {"]
options = include_directions.deep_symbolize_keys[:options].
reverse_merge(DEFAULT_INCLUDE_OPTIONS)
options.each do |k,v|
if not [:wildfile].include? k
formatted << " #{k} = #{v}"
else
formatted << v.map { |f| " #{k} = \"#{f}\"" }
end
end
formatted << " }"
formatted
end
def included_files
include_directions['file'].map { |f| " File = #{f}" }
end
def included_wildfile
include_directions['wildfile'].map { |f| " wildfile = \"#{f}\"" }.join("\n")
end
end
diff --git a/app/views/filesets/_form.html.erb b/app/views/filesets/_form.html.erb
index 78c7f5f..5a28390 100644
--- a/app/views/filesets/_form.html.erb
+++ b/app/views/filesets/_form.html.erb
@@ -1,59 +1,58 @@
<%= bootstrap_form_for(@fileset, url: url, method: method, layout: :horizontal,
label_col: 'col-xs-3', control_col: 'col-xs-8') do |f| %>
<div>
<%= f.text_field :name %>
<% no_remove_sign = @fileset.include_directions['file'].length <= 1 %>
<% @fileset.include_directions['file'].each do |file| %>
<%= text_with_errors_and_remove(
@fileset, :fileset, :include_files, 'Files', '/', file, no_remove_sign) %>
<% end %>
<p class='here-included' />
<div class="form-group">
<div class="col-xs-offset-3 col-xs-1">
- <%= link_to '#', class: 'include_files-plus-sign' do %>
+ <%= link_to '#', class: 'include_files-plus-sign', title: 'New File' do %>
<span class="glyphicon glyphicon-plus text-success"></span>
<% end %>
</div>
</div>
<hr />
<% @fileset.exclude_directions.each do |file| %>
<%= text_with_errors_and_remove(@fileset, :fileset, :exclude_directions, 'Exclude', '/an_exluded_dir', file) %>
<% end %>
<p class='here-excluded' />
<div class="form-group">
<div class="col-xs-offset-3 col-xs-1">
- <%= link_to '#', class: 'exclude_directions-plus-sign' do %>
+ <%= link_to '#', class: 'exclude_directions-plus-sign', title: 'New Excluded File' do %>
<span class="glyphicon glyphicon-plus text-success"></span>
<% end %>
</div>
</div>
<%= (hidden_field_tag :job_id, @job_id) if @job_id%>
</div>
- <div class='templates hidden'>
- <%= text_with_errors_and_remove(@fileset, :fileset, :include_files, 'Files', '/') %>
- <%= text_with_errors_and_remove(@fileset, :fileset, :exclude_directions, 'Exclude',
- '/an_excluded_dir', '') %>
- </div>
-
-
<div class="form-group">
<div class="col-xs-offset-3 col-xs-3">
<%= f.submit class: 'btn btn-success' %>
</div>
<div class="col-xs-3">
<%= link_to 'Cancel',
@job_id.present? ? edit_host_job_path(@host, @job_id) : new_host_job_path(@host),
role: 'button', class: 'btn btn-danger'%>
</div>
</div>
<% end %>
+
+<div class='templates hidden'>
+ <%= text_with_errors_and_remove(@fileset, :fileset, :include_files, 'Files', '/', '') %>
+ <%= text_with_errors_and_remove(@fileset, :fileset, :exclude_directions, 'Exclude',
+ '/an_excluded_dir', '') %>
+</div>
Event Timeline
Log In to Comment