diff --git a/bucket-tool b/bucket-tool old mode 100644 new mode 100755 index bc9b662..3416ddf --- a/bucket-tool +++ b/bucket-tool @@ -6,6 +6,8 @@ require 'digest' # END: Requires + + # BEGIN: Helper Functions def usage @@ -24,6 +26,7 @@ Actions: list-files : List all files/paths that have been backed up to the bucket get : Get the content of a specific entry (by hash) restore : Restore previous state of file stored in bucket. Value can be hash or filename/filepath + backup : Backup the file to the bucket Global Flags: -d | --debug : Set debug flag @@ -180,6 +183,7 @@ end $CONFIG = Hash.new $CONFIG[:bucket_dir]=` #{puppet_exe} agent --configprint clientbucketdir `.strip() +$CONFIG[:puppet_version]=` #{puppet_exe} --version ` $CONFIG[:action]="" $CONFIG[:search_term]="" $CONFIG[:log_file]="" @@ -187,7 +191,7 @@ $CONFIG[:info_format]="inline" File.open('/etc/hostname') do |file| $HOSTNAME=file.read().strip() end -FLAG_REGEX=/\-+\S+/ +FLAG_REGEX=/^\-+\S+/ # END: Variables @@ -207,7 +211,7 @@ if not (ARGV & ['-d', '--debug']).empty? end i=0 case ARGV[i] - when 'search', 'get', 'restore' + when 'search', 'get', 'restore', 'backup' $CONFIG[:action]=ARGV[i] log "$CONFIG[:action] was set to #{ARGV[i]}" log "user provided search action ARGV[i.next] == #{ARGV[i.next]}" @@ -265,6 +269,11 @@ case $CONFIG[:action] exit end + when 'backup' + if not File.exist? $CONFIG[:search_term] + puts "File #{$CONFIG[:search_term]} does not exist. Please check to make sure that there are not typos and attempt the run again." + exit + end end ## END: Checks @@ -470,6 +479,88 @@ def restore_entry (bucket) end end +def backup_file (bucket) + hash="" + if Gem::Version.new($CONFIG[:puppet_version]) >= Gem::Version.new("7.0.0") + log "Puppet Version is +7.* so hashing algo will be SHA256" + File.open($CONFIG[:search_term],'r') do |file| + hash = Digest::SHA2.hexdigest file.read() + end + + else + log "Puppet Version is not 7.* so hashing algo will be MD5" + File.open($CONFIG[:search_term],'r') do |file| + hash = Digest::MD5.hexdigest file.read() + end + end + + log "Hash for #{$CONFIG[:search_term]} was generated to be #{hash}" + + if bucket.entries.has_key? hash + log "Hash was found to already be backed up to bucket" + puts "This file (hash: #{hash} has already been backed up in the bucket" + puts bucket.entries[hash].info + exit + end + + puppet_uid=0 + puppet_gid=0 + File.open('/etc/passwd','r') do |file| + log "Getting puppet UID & GID from /etc/passwd" + passd = file.read.split(/\n/).select{|line| line =~ /puppet.+/}.first + puppet_uid=Integer(passd.split(':')[2]) + log "Retrieved Puppet UID as #{puppet_uid}" + puppet_gid=Integer(passd.split(':')[3]) + log "Retrieved Puppet GID as #{puppet_gid}" + end + + log "Created preceeding directorys to hash directory" + dir=$CONFIG[:bucket_dir] + hash.chars[0,8].map{|char| + dir+="/#{char}" + log "Checking to make sure that #{dir} doesn't exist" + if not Dir.exist? dir + log "#{dir} didn't exist so creating the directory & changing the UID to #{puppet_uid} & GID #{puppet_gid}" + Dir.mkdir dir + File.chown(puppet_gid, puppet_uid, dir) + end + } + + entry_dir="#{dir}/#{hash}" + if not Dir.exist? entry_dir + log "#{entry_dir} didn't exist so creating the directory & changing the UID to #{puppet_uid} & GID #{puppet_gid}" + Dir.mkdir entry_dir + File.chown(puppet_gid, puppet_uid, entry_dir) + end + + contents_path="#{entry_dir}/contents" + log "#{contents_path} will be created" + paths_path="#{entry_dir}/paths" + log "#{paths_path} will be created" + + log "Creating #{contents_path}" + File.open(contents_path, 'w') do |contents_file| + log "Opened #{contents_path} to be written to" + File.open($CONFIG[:search_term], 'r') do |source_file| + log "Opened #{$CONFIG[:search_term]} to be read from" + contents_file.write(source_file.read) + contents_file.chown(puppet_gid, puppet_uid) + log "#{contents_path} was created & was chowned to UID to #{puppet_uid} & GID #{puppet_gid}" + end + end + + log "Creating #{paths_path}" + File.open(paths_path, 'w') do |paths_file| + log "Opened #{paths_path} to be written to" + paths_file.write($CONFIG[:search_term]) + log "Just wrote #{$CONFIG[:search_term]} to #{paths_path}" + paths_file.chown(puppet_gid, puppet_uid) + log "#{paths_path} was created & was chowned to UID to #{puppet_uid} & GID #{puppet_gid}" + end + + puts "File #{$CONFIG[:search_term]} was backed up to #{entry_dir}" +end + # END: Work Functions @@ -494,6 +585,8 @@ if __FILE__ == $0 when 'restore' restore_entry bucket + when 'backup' + backup_file bucket end end