yore 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +0 -6
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/bin/yore +0 -2
- data/lib/yore/yore_core.rb +27 -114
- data/yore.gemspec +5 -8
- metadata +3 -13
    
        data/README.rdoc
    CHANGED
    
    | @@ -15,12 +15,6 @@ and can use Amazon S3 for storage. | |
| 15 15 | 
             
            * Compressed, encrypted, single file backups of folders and mysql databases
         | 
| 16 16 | 
             
            * Can be called regularly eg. by cron
         | 
| 17 17 | 
             
            * Backups can be uploaded to Amazon S3
         | 
| 18 | 
            -
            * will later remove old files that don't match the configurable scheme for backup history,
         | 
| 19 | 
            -
            but keeping a useful history eg. 
         | 
| 20 | 
            -
            - backup every day
         | 
| 21 | 
            -
            - keep 2 weeks of daily backups
         | 
| 22 | 
            -
            - keep 12 weeks of friday backups
         | 
| 23 | 
            -
            - keep the first friday backup of each month forever
         | 
| 24 18 | 
             
            * Can automatically collect and compress database all user data from particular applications
         | 
| 25 19 | 
             
            to a single file, and restore to another server. Known applications are Rails-centric but others
         | 
| 26 20 | 
             
            can be manually configured. 
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -12,9 +12,8 @@ begin | |
| 12 12 | 
             
                gem.authors = ["buzzware"]
         | 
| 13 13 | 
             
                gem.rubyforge_project = "buzzware"
         | 
| 14 14 | 
             
                gem.add_dependency('cmdparse', '>= 2.0.2')
         | 
| 15 | 
            -
                gem.add_dependency('buzzcore', '>= 0. | 
| 15 | 
            +
                gem.add_dependency('buzzcore', '>= 0.3.1')
         | 
| 16 16 | 
             
                gem.add_dependency('nokogiri', '>= 1.3.3')
         | 
| 17 | 
            -
                gem.add_dependency('buzzcore', '>= 0.2.6')
         | 
| 18 17 | 
             
                gem.add_dependency('aws-s3', '>= 0.6.2')
         | 
| 19 18 | 
             
                gem.add_development_dependency "thoughtbot-shoulda"
         | 
| 20 19 | 
             
            		#gem.files.include %w(
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.2. | 
| 1 | 
            +
            0.2.1
         | 
    
        data/bin/yore
    CHANGED
    
    
    
        data/lib/yore/yore_core.rb
    CHANGED
    
    | @@ -13,64 +13,6 @@ THIS_DIR = File.dirname(THIS_FILE) | |
| 13 13 |  | 
| 14 14 | 
             
            module YoreCore
         | 
| 15 15 |  | 
| 16 | 
            -
              class KeepDaily
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                  attr_reader :keep_age
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def initialize(aKeepAge=14)
         | 
| 21 | 
            -
                    @keep_age = aKeepAge
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def is?
         | 
| 25 | 
            -
                    true
         | 
| 26 | 
            -
                  end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                  def age(aDate)
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
                  def keep?(aDate)
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
              end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
              class KeepWeekly
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                  attr_reader :keep_age
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                  def initialize(aKeepAge=14)
         | 
| 41 | 
            -
                    @keep_age = aKeepAge
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                  def is?
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
                  def age(aDate)
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
                  def keep?(aDate)
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
              end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
              class KeepMonthly
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                  attr_reader :keep_age
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                  def initialize(aKeepAge=14)
         | 
| 60 | 
            -
                    @keep_age = aKeepAge
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                  def is?
         | 
| 64 | 
            -
             | 
| 65 | 
            -
                  end
         | 
| 66 | 
            -
                  def age(aDate)
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                  end
         | 
| 69 | 
            -
                  def keep?(aDate)
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                  end
         | 
| 72 | 
            -
              end
         | 
| 73 | 
            -
             | 
| 74 16 | 
             
              class Yore
         | 
| 75 17 |  | 
| 76 18 | 
             
                DEFAULT_CONFIG = {
         | 
| @@ -78,9 +20,6 @@ module YoreCore | |
| 78 20 | 
             
            			:basepath => String,
         | 
| 79 21 | 
             
            			:backup_id => String,
         | 
| 80 22 | 
             
            			:backup_email => String,
         | 
| 81 | 
            -
                  :keep_daily => 14,
         | 
| 82 | 
            -
                  :keep_weekly => 12,
         | 
| 83 | 
            -
                  :keep_monthly => 12,
         | 
| 84 23 | 
             
                  :crypto_iv => "3A63775C1E3F291B0925578165EB917E",    # apparently a string of up to 32 random hex digits
         | 
| 85 24 | 
             
                  :crypto_key => "07692FC8656F04AE5518B80D38681E038A3C12050DF6CC97CEEC33D800D5E2FE",   # apparently a string of up to 64 random hex digits
         | 
| 86 25 | 
             
                  :first_hour => 4,
         | 
| @@ -105,7 +44,6 @@ module YoreCore | |
| 105 44 | 
             
                attr_reader :config
         | 
| 106 45 | 
             
                attr_reader :logger
         | 
| 107 46 | 
             
                attr_reader :reporter
         | 
| 108 | 
            -
                attr_reader :keepers
         | 
| 109 47 | 
             
                attr_reader :s3client
         | 
| 110 48 |  | 
| 111 49 | 
             
                def initialize(aConfig=nil)
         | 
| @@ -133,7 +71,7 @@ module YoreCore | |
| 133 71 | 
             
            		#aOptions may require {:basepath => File.dirname(File.expand_path(job))}
         | 
| 134 72 | 
             
            		def self.launch(aConfigXml,aCmdOptions=nil,aOptions=nil)
         | 
| 135 73 | 
             
            			if !aConfigXml
         | 
| 136 | 
            -
            				path = MiscUtils. | 
| 74 | 
            +
            				path = MiscUtils.canonize_path('yore.config.xml',aOptions && aOptions[:basepath])
         | 
| 137 75 | 
             
            				aConfigXml = path if File.exists?(path)				
         | 
| 138 76 | 
             
            			end
         | 
| 139 77 | 
             
            			result = Yore.new()
         | 
| @@ -163,46 +101,33 @@ module YoreCore | |
| 163 101 | 
             
            			return dbyml[aRailsEnv] && dbyml[aRailsEnv].symbolize_keys
         | 
| 164 102 | 
             
            		end
         | 
| 165 103 |  | 
| 166 | 
            -
            		def self.find_upwards(aStartPath,aPath)
         | 
| 167 | 
            -
            			curr_path = File.expand_path(aStartPath)
         | 
| 168 | 
            -
            			while curr_path && !(test_path_exists = File.exists?(test_path = File.join(curr_path,aPath))) do
         | 
| 169 | 
            -
            				curr_path = MiscUtils.path_parent(curr_path)
         | 
| 170 | 
            -
            			end
         | 
| 171 | 
            -
            			curr_path && test_path_exists ? test_path : nil
         | 
| 172 | 
            -
            		end
         | 
| 173 | 
            -
             | 
| 174 104 | 
             
            		def expand_app_option(kind=nil)
         | 
| 175 105 | 
             
            			kind = config[:kind] unless kind && !kind.empty?
         | 
| 176 106 | 
             
            			return nil unless kind && !kind.empty?
         | 
| 177 107 | 
             
            			config.xmlRoot = create_empty_config_xml() if !config.xmlRoot
         | 
| 108 | 
            +
            			xmlSources = XmlUtils.single_node(config.xmlRoot,'/Yore/Sources') || XmlUtils.add_xml_from_string('<Sources/>',XmlUtils.single_node(config.xmlRoot,'/Yore'))
         | 
| 178 109 | 
             
            			case kind
         | 
| 179 110 | 
             
            				when 'spree'
         | 
| 180 111 | 
             
            					# add file source
         | 
| 181 | 
            -
            					 | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 187 | 
            -
            						EOS
         | 
| 188 | 
            -
            						XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 189 | 
            -
            					end
         | 
| 112 | 
            +
            					strSource = <<-EOS
         | 
| 113 | 
            +
            						<Source Type="File">
         | 
| 114 | 
            +
            							<IncludePath BasePath="public/assets">products</IncludePath>
         | 
| 115 | 
            +
            						</Source>
         | 
| 116 | 
            +
            					EOS
         | 
| 117 | 
            +
            					XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 190 118 | 
             
            					expand_app_option('rails')	# do again
         | 
| 191 119 | 
             
            				# 
         | 
| 192 120 | 
             
            				# if capistrano deployed, uploads are assumed to be in shared/uploads
         | 
| 193 121 | 
             
            				#
         | 
| 194 122 | 
             
            				when 'browsercms'
         | 
| 195 123 | 
             
            					# add file source
         | 
| 196 | 
            -
            					 | 
| 197 | 
            -
            					 | 
| 198 | 
            -
            						 | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
            						EOS
         | 
| 204 | 
            -
            						XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 205 | 
            -
            					end
         | 
| 124 | 
            +
            					uploadParent = MiscUtils.expand_magic_path('.../shared',config[:basepath]) || File.join(config[:basepath],'tmp')
         | 
| 125 | 
            +
            					strSource = <<-EOS
         | 
| 126 | 
            +
            						<Source Type="File">
         | 
| 127 | 
            +
            							<IncludePath BasePath="#{uploadParent}">uploads</IncludePath>
         | 
| 128 | 
            +
            						</Source>
         | 
| 129 | 
            +
            					EOS
         | 
| 130 | 
            +
            					XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 206 131 | 
             
            					expand_app_option('rails')	# do again
         | 
| 207 132 | 
             
            				when 'rails'
         | 
| 208 133 | 
             
            					# * add db source from database.yml
         | 
| @@ -210,18 +135,16 @@ module YoreCore | |
| 210 135 | 
             
            					#if (dbyml = YAML::load(File.open(File.expand_path('config/database.yml',config[:basepath]))) rescue nil)
         | 
| 211 136 | 
             
            					#	if env = (config[:RAILS_ENV] && config[:RAILS_ENV]!='' && config[:RAILS_ENV])
         | 
| 212 137 | 
             
            					#		if (db_details = dbyml[env]) &&
         | 
| 213 | 
            -
             | 
| 214 | 
            -
            					 | 
| 215 | 
            -
             | 
| 216 | 
            -
            						 | 
| 217 | 
            -
            							< | 
| 218 | 
            -
            								< | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 223 | 
            -
            						XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 224 | 
            -
            					end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            					#<Database Name="#{db_details[:database]}" Host="#{db_details[:host]}" User="#{db_details[:username]}" Password="#{db_details[:password]}">
         | 
| 140 | 
            +
            					strSource = <<-EOS
         | 
| 141 | 
            +
            						<Source Type="MySql" >
         | 
| 142 | 
            +
            							<Database Yml="config/database.yml">
         | 
| 143 | 
            +
            								<ArchiveFile>rails_app.sql</ArchiveFile>
         | 
| 144 | 
            +
            							</Database>
         | 
| 145 | 
            +
            						</Source>
         | 
| 146 | 
            +
            					EOS
         | 
| 147 | 
            +
            					XmlUtils.add_xml_from_string(strSource,xmlSources)
         | 
| 225 148 | 
             
            			end
         | 
| 226 149 | 
             
            		end
         | 
| 227 150 |  | 
| @@ -230,7 +153,7 @@ module YoreCore | |
| 230 153 | 
             
                def configure(aConfig,aCmdOptions = nil,aOptions = nil)
         | 
| 231 154 | 
             
                  config_to_read = {}
         | 
| 232 155 | 
             
            			if aConfig.is_a?(String)
         | 
| 233 | 
            -
            				aConfig =  | 
| 156 | 
            +
            				aConfig = MiscUtils.canonize_path(aConfig)
         | 
| 234 157 | 
             
            				logger.info "Job file: #{aConfig}"
         | 
| 235 158 | 
             
            				op = {:basepath => File.dirname(aConfig)}
         | 
| 236 159 | 
             
            				xmlString = MiscUtils.string_from_file(aConfig)
         | 
| @@ -257,15 +180,10 @@ module YoreCore | |
| 257 180 | 
             
                  aCmdOptions.each{|k,v| config_to_read[k.to_sym] = v} if aCmdOptions		# merge command options
         | 
| 258 181 | 
             
                  config_to_read.merge!(aOptions) if aOptions														# merge options
         | 
| 259 182 | 
             
            			config.read(config_to_read)
         | 
| 260 | 
            -
            			config[:basepath] =  | 
| 183 | 
            +
            			config[:basepath] = MiscUtils.canonize_path(config[:basepath],Dir.pwd)
         | 
| 261 184 |  | 
| 262 185 | 
             
            			expand_app_option()
         | 
| 263 186 |  | 
| 264 | 
            -
                  @keepers = Array.new
         | 
| 265 | 
            -
                  @keepers << KeepDaily.new(config[:keep_daily])
         | 
| 266 | 
            -
                  @keepers << KeepWeekly.new(config[:keep_weekly])
         | 
| 267 | 
            -
                  @keepers << KeepMonthly.new(config[:keep_monthly])
         | 
| 268 | 
            -
            			
         | 
| 269 187 | 
             
            			@s3client = ::AWSS3Client.new()
         | 
| 270 188 | 
             
            			logger.info "Using S3 key #{@s3client.credentials[:s3_access_key_id]}"
         | 
| 271 189 | 
             
                end
         | 
| @@ -310,11 +228,6 @@ module YoreCore | |
| 310 228 | 
             
                  filemap
         | 
| 311 229 | 
             
                end
         | 
| 312 230 |  | 
| 313 | 
            -
                def keep_file?(aFile)
         | 
| 314 | 
            -
             | 
| 315 | 
            -
                end
         | 
| 316 | 
            -
             | 
| 317 | 
            -
             | 
| 318 231 | 
             
                # By default, GNU tar suppresses a leading slash on absolute pathnames while creating or reading a tar archive. (You can suppress this with the -p option.)
         | 
| 319 232 | 
             
                # tar : http://my.safaribooksonline.com/0596102461/I_0596102461_CHP_3_SECT_9#snippet
         | 
| 320 233 |  | 
    
        data/yore.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{yore}
         | 
| 8 | 
            -
              s.version = "0.2. | 
| 8 | 
            +
              s.version = "0.2.1"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["buzzware"]
         | 
| 12 | 
            -
              s.date = %q{2010-01- | 
| 12 | 
            +
              s.date = %q{2010-01-16}
         | 
| 13 13 | 
             
              s.default_executable = %q{yore}
         | 
| 14 14 | 
             
              s.description = %q{yore (as in "days of yore") is a user data management utility for web applications.}
         | 
| 15 15 | 
             
              s.email = %q{contact@buzzware.com.au}
         | 
| @@ -64,24 +64,21 @@ Gem::Specification.new do |s| | |
| 64 64 |  | 
| 65 65 | 
             
                if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
         | 
| 66 66 | 
             
                  s.add_runtime_dependency(%q<cmdparse>, [">= 2.0.2"])
         | 
| 67 | 
            -
                  s.add_runtime_dependency(%q<buzzcore>, [">= 0. | 
| 67 | 
            +
                  s.add_runtime_dependency(%q<buzzcore>, [">= 0.3.1"])
         | 
| 68 68 | 
             
                  s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
         | 
| 69 | 
            -
                  s.add_runtime_dependency(%q<buzzcore>, [">= 0.2.6"])
         | 
| 70 69 | 
             
                  s.add_runtime_dependency(%q<aws-s3>, [">= 0.6.2"])
         | 
| 71 70 | 
             
                  s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
         | 
| 72 71 | 
             
                else
         | 
| 73 72 | 
             
                  s.add_dependency(%q<cmdparse>, [">= 2.0.2"])
         | 
| 74 | 
            -
                  s.add_dependency(%q<buzzcore>, [">= 0. | 
| 73 | 
            +
                  s.add_dependency(%q<buzzcore>, [">= 0.3.1"])
         | 
| 75 74 | 
             
                  s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
         | 
| 76 | 
            -
                  s.add_dependency(%q<buzzcore>, [">= 0.2.6"])
         | 
| 77 75 | 
             
                  s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
         | 
| 78 76 | 
             
                  s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
         | 
| 79 77 | 
             
                end
         | 
| 80 78 | 
             
              else
         | 
| 81 79 | 
             
                s.add_dependency(%q<cmdparse>, [">= 2.0.2"])
         | 
| 82 | 
            -
                s.add_dependency(%q<buzzcore>, [">= 0. | 
| 80 | 
            +
                s.add_dependency(%q<buzzcore>, [">= 0.3.1"])
         | 
| 83 81 | 
             
                s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
         | 
| 84 | 
            -
                s.add_dependency(%q<buzzcore>, [">= 0.2.6"])
         | 
| 85 82 | 
             
                s.add_dependency(%q<aws-s3>, [">= 0.6.2"])
         | 
| 86 83 | 
             
                s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
         | 
| 87 84 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: yore
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - buzzware
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2010-01- | 
| 12 | 
            +
            date: 2010-01-16 00:00:00 +08:00
         | 
| 13 13 | 
             
            default_executable: yore
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -30,7 +30,7 @@ dependencies: | |
| 30 30 | 
             
                requirements: 
         | 
| 31 31 | 
             
                - - ">="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 33 | 
            -
                    version: 0. | 
| 33 | 
            +
                    version: 0.3.1
         | 
| 34 34 | 
             
                version: 
         | 
| 35 35 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 36 36 | 
             
              name: nokogiri
         | 
| @@ -42,16 +42,6 @@ dependencies: | |
| 42 42 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 43 43 | 
             
                    version: 1.3.3
         | 
| 44 44 | 
             
                version: 
         | 
| 45 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 46 | 
            -
              name: buzzcore
         | 
| 47 | 
            -
              type: :runtime
         | 
| 48 | 
            -
              version_requirement: 
         | 
| 49 | 
            -
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 50 | 
            -
                requirements: 
         | 
| 51 | 
            -
                - - ">="
         | 
| 52 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 53 | 
            -
                    version: 0.2.6
         | 
| 54 | 
            -
                version: 
         | 
| 55 45 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 56 46 | 
             
              name: aws-s3
         | 
| 57 47 | 
             
              type: :runtime
         |