diff --git a/lib/bacula_handler.rb b/lib/bacula_handler.rb index a559c24..8d34fa5 100644 --- a/lib/bacula_handler.rb +++ b/lib/bacula_handler.rb @@ -1,118 +1,129 @@ class BaculaHandler require 'net/scp' attr_accessor :host, :tempfile # Initializes a BaculaHandler instance. # # Sets `host` and `template` attributes. # # @param host[Host] A the host instance the the bacula handler will act upon def initialize(host) @host = host @tempfile = get_config_file end # Deploys the host's config to the bacula director by # # * uploading the configuration # * reloadind the bacula director # # Updates the host's status accordingly # # @return [Boolean] false if something went wrong def deploy_config return false unless send_config if reload_bacula host.set_deployed else host.dispatch || host.redispatch end end # Removes the host's configuration from the bacula director by # # * removing the host's configuration files # * reloading the bacula director # # Updates the host's status accordingly # # @return [Boolean] false if something went wrong def undeploy_config return false unless remove_config host.disable if reload_bacula end # Schedules an immediate backup to the bacula director for the given host and job # # @params job_name[String] the job's name def backup_now(job_name) job = host.job_templates.enabled.find_by(name: job_name) return false unless job command = "echo \"run job=\\\"#{job.name_for_config}\\\" yes\" | #{bconsole}" - Rails.logger.warn("[BaculaHandler] : #{command}") + log(command) + exec_with_timeout(command, 2) + end + + # Schedules an immediate restore to the bacula director for the given host. + def restore + command = "echo \"restore client=\\\"#{host.name}\\\" where=\\\"/tmp/bacula-restore\\\" select current all done yes\" | #{bconsole}" + log(command) exec_with_timeout(command, 2) end private def get_config_file file = Tempfile.new(host.name) file.chmod(0666) file.write host.baculize_config.join("\n") file.close file end def send_config begin Net::SCP.upload!( ssh_settings[:host], ssh_settings[:username], tempfile.path, ssh_settings[:path] + host.name + '.conf', ssh: { keys: [ssh_settings[:key_file]] } ) rescue return false end true end def remove_config begin Net::SSH.start(ssh_settings[:host], ssh_settings[:username], keys: ssh_settings[:key_file]) do |ssh| ssh.exec!("rm #{ssh_settings[:path] + host.name}.conf") end rescue return false end true end def reload_bacula command = "echo \"reload quit\" | #{bconsole}" exec_with_timeout(command, 2) end def exec_with_timeout(command, sec) begin Timeout::timeout(sec) do `#{command}` end rescue return false end true end def bconsole "bconsole -c #{Rails.root}/config/bconsole.conf" end def ssh_settings @ssh_settings ||= YAML::load(File.open("#{Rails.root}/config/ssh.yml"))[Rails.env]. symbolize_keys end + + def log(msg) + Rails.logger.warn("[BaculaHandler]: #{msg}") + end end