Module: Puppet::Util::Checksums

Included in:
DataSync, FileBucket::Dipper, FileBucketFile::File, FileServing::Metadata, Resource::Catalog::Compiler
Defined in:
lib/puppet/util/checksums.rb

Overview

A stand-alone module for calculating checksums in a generic way.

Defined Under Namespace

Classes: DigestLite, FakeChecksum

Constant Summary collapse

KNOWN_CHECKSUMS =

If you modify this, update puppet/type/file/checksum.rb too

[ :sha256, :sha256lite, :md5, :md5lite, :sha1, :sha1lite, :sha512, :sha384, :sha224, :mtime, :ctime, :none ].freeze

Class Method Summary collapse

Class Method Details

.checksum?(string) ⇒ Boolean

Is the provided string a checksum?

Returns:

  • (Boolean)
 42 43 44 45
# File 'lib/puppet/util/checksums.rb', line 42 def checksum?(string) # 'sha256lite'.length == 10  string =~ /^\{(\w{3,10})\}\S+/ end

.checksum_file(digest, filename, lite = false) ⇒ Object

Perform an incremental checksum on a file.

 364 365 366 367 368 369 370 371 372 373 374
# File 'lib/puppet/util/checksums.rb', line 364 def checksum_file(digest, filename, lite = false) buffer = lite ? 512 : 4096 File.open(filename, 'rb') do |file| while content = file.read(buffer) # rubocop:disable Lint/AssignmentInCondition  digest << content break if lite end end digest.hexdigest end

.checksum_stream(digest, block, lite = false) ⇒ Object

 376 377 378 379
# File 'lib/puppet/util/checksums.rb', line 376 def checksum_stream(digest, block, lite = false) block.call(DigestLite.new(digest, lite)) digest.hexdigest end

.ctime(content) ⇒ Object

 302 303 304
# File 'lib/puppet/util/checksums.rb', line 302 def ctime(content) "" end

.ctime?(string) ⇒ Boolean

Returns:

  • (Boolean)
 306 307 308 309 310 311 312
# File 'lib/puppet/util/checksums.rb', line 306 def ctime?(string) return true if string.is_a? Time !!DateTime.parse(string) rescue false end

.ctime_file(filename) ⇒ Object

Return the :ctime of a file.

 315 316 317
# File 'lib/puppet/util/checksums.rb', line 315 def ctime_file(filename) Puppet::FileSystem.stat(filename).ctime end

.ctime_stream(&block) ⇒ Object

 319 320 321
# File 'lib/puppet/util/checksums.rb', line 319 def ctime_stream(&block) mtime_stream(&block) end

.known_checksum_typesObject

It’s not a good idea to use some of these in some contexts: for example, I wouldn’t try bucketing a file using the :none checksum type.

 25 26 27
# File 'lib/puppet/util/checksums.rb', line 25 def known_checksum_types KNOWN_CHECKSUMS end

.md5(content) ⇒ Object

Calculate a checksum using Digest::MD5.

 186 187 188
# File 'lib/puppet/util/checksums.rb', line 186 def md5(content) Digest::MD5.hexdigest(content) end

.md5?(string) ⇒ Boolean

Returns:

  • (Boolean)
 190 191 192
# File 'lib/puppet/util/checksums.rb', line 190 def md5?(string) string =~ /^\h{32}$/ end

.md5_file(filename, lite = false) ⇒ Object

Calculate a checksum of a file’s content using Digest::MD5.

 195 196 197 198
# File 'lib/puppet/util/checksums.rb', line 195 def md5_file(filename, lite = false) digest = Digest::MD5.new checksum_file(digest, filename, lite) end

.md5_hex_lengthObject

 205 206 207
# File 'lib/puppet/util/checksums.rb', line 205 def md5_hex_length 32 end

.md5_stream(lite = false, &block) ⇒ Object

 200 201 202 203
# File 'lib/puppet/util/checksums.rb', line 200 def md5_stream(lite = false, &block) digest = Digest::MD5.new checksum_stream(digest, block, lite) end

.md5lite(content) ⇒ Object

Calculate a checksum of the first 500 chars of the content using Digest::MD5.

 210 211 212
# File 'lib/puppet/util/checksums.rb', line 210 def md5lite(content) md5(content[0..511]) end

.md5lite?(string) ⇒ Boolean

Returns:

  • (Boolean)
 214 215 216
# File 'lib/puppet/util/checksums.rb', line 214 def md5lite?(string) md5?(string) end

.md5lite_file(filename) ⇒ Object

Calculate a checksum of the first 500 chars of a file’s content using Digest::MD5.

 219 220 221
# File 'lib/puppet/util/checksums.rb', line 219 def md5lite_file(filename) md5_file(filename, true) end

.md5lite_hex_lengthObject

 227 228 229
# File 'lib/puppet/util/checksums.rb', line 227 def md5lite_hex_length md5_hex_length end

.md5lite_stream(&block) ⇒ Object

 223 224 225
# File 'lib/puppet/util/checksums.rb', line 223 def md5lite_stream(&block) md5_stream(true, &block) end

.mtime(content) ⇒ Object

 231 232 233
# File 'lib/puppet/util/checksums.rb', line 231 def mtime(content) "" end

.mtime?(string) ⇒ Boolean

Returns:

  • (Boolean)
 235 236 237 238 239 240 241
# File 'lib/puppet/util/checksums.rb', line 235 def mtime?(string) return true if string.is_a? Time !!DateTime.parse(string) rescue false end

.mtime_file(filename) ⇒ Object

Return the :mtime timestamp of a file.

 244 245 246
# File 'lib/puppet/util/checksums.rb', line 244 def mtime_file(filename) Puppet::FileSystem.stat(filename).mtime end

.mtime_stream {|noop_digest| ... } ⇒ Object

by definition this doesn’t exist but we still need to execute the block given

Yields:

  • (noop_digest)
 250 251 252 253 254
# File 'lib/puppet/util/checksums.rb', line 250 def mtime_stream(&block) noop_digest = FakeChecksum.new yield noop_digest nil end

.none(content) ⇒ Object

 323 324 325
# File 'lib/puppet/util/checksums.rb', line 323 def none(content) "" end

.none?(string) ⇒ Boolean

Returns:

  • (Boolean)
 327 328 329
# File 'lib/puppet/util/checksums.rb', line 327 def none?(string) string.empty? end

.none_file(filename) ⇒ Object

Return a “no checksum”

 332 333 334
# File 'lib/puppet/util/checksums.rb', line 332 def none_file(filename) "" end

.none_stream {|noop_digest| ... } ⇒ Object

Yields:

  • (noop_digest)
 336 337 338 339 340
# File 'lib/puppet/util/checksums.rb', line 336 def none_stream noop_digest = FakeChecksum.new yield noop_digest "" end

.sha1(content) ⇒ Object

Calculate a checksum using Digest::SHA1.

 257 258 259
# File 'lib/puppet/util/checksums.rb', line 257 def sha1(content) Digest::SHA1.hexdigest(content) end

.sha1?(string) ⇒ Boolean

Returns:

  • (Boolean)
 261 262 263
# File 'lib/puppet/util/checksums.rb', line 261 def sha1?(string) string =~ /^\h{40}$/ end

.sha1_file(filename, lite = false) ⇒ Object

Calculate a checksum of a file’s content using Digest::SHA1.

 266 267 268 269
# File 'lib/puppet/util/checksums.rb', line 266 def sha1_file(filename, lite = false) digest = Digest::SHA1.new checksum_file(digest, filename, lite) end

.sha1_hex_lengthObject

 276 277 278
# File 'lib/puppet/util/checksums.rb', line 276 def sha1_hex_length 40 end

.sha1_stream(lite = false, &block) ⇒ Object

 271 272 273 274
# File 'lib/puppet/util/checksums.rb', line 271 def sha1_stream(lite = false, &block) digest = Digest::SHA1.new checksum_stream(digest, block, lite) end

.sha1lite(content) ⇒ Object

Calculate a checksum of the first 500 chars of the content using Digest::SHA1.

 281 282 283
# File 'lib/puppet/util/checksums.rb', line 281 def sha1lite(content) sha1(content[0..511]) end

.sha1lite?(string) ⇒ Boolean

Returns:

  • (Boolean)
 285 286 287
# File 'lib/puppet/util/checksums.rb', line 285 def sha1lite?(string) sha1?(string) end

.sha1lite_file(filename) ⇒ Object

Calculate a checksum of the first 500 chars of a file’s content using Digest::SHA1.

 290 291 292
# File 'lib/puppet/util/checksums.rb', line 290 def sha1lite_file(filename) sha1_file(filename, true) end

.sha1lite_hex_lengthObject

 298 299 300
# File 'lib/puppet/util/checksums.rb', line 298 def sha1lite_hex_length sha1_hex_length end

.sha1lite_stream(&block) ⇒ Object

 294 295 296
# File 'lib/puppet/util/checksums.rb', line 294 def sha1lite_stream(&block) sha1_stream(true, &block) end

.sha224(content) ⇒ Object

Calculate a checksum using Digest::SHA224.

 159 160 161 162
# File 'lib/puppet/util/checksums.rb', line 159 def sha224(content) require_relative '../../puppet/ssl/openssl_loader' OpenSSL::Digest.new('SHA224').hexdigest(content) end

.sha224?(string) ⇒ Boolean

Returns:

  • (Boolean)
 164 165 166
# File 'lib/puppet/util/checksums.rb', line 164 def sha224?(string) string =~ /^\h{56}$/ end

.sha224_file(filename, lite = false) ⇒ Object

 168 169 170 171 172 173
# File 'lib/puppet/util/checksums.rb', line 168 def sha224_file(filename, lite = false) require_relative '../../puppet/ssl/openssl_loader' digest = OpenSSL::Digest.new('SHA224') checksum_file(digest, filename, lite) end

.sha224_hex_lengthObject

 181 182 183
# File 'lib/puppet/util/checksums.rb', line 181 def sha224_hex_length 56 end

.sha224_stream(lite = false, &block) ⇒ Object

 175 176 177 178 179
# File 'lib/puppet/util/checksums.rb', line 175 def sha224_stream(lite = false, &block) require_relative '../../puppet/ssl/openssl_loader' digest = OpenSSL::Digest.new('SHA224') checksum_stream(digest, block, lite) end

.sha256(content) ⇒ Object

Calculate a checksum using Digest::SHA256.

 58 59 60 61
# File 'lib/puppet/util/checksums.rb', line 58 def sha256(content) require 'digest/sha2' Digest::SHA256.hexdigest(content) end

.sha256?(string) ⇒ Boolean

Returns:

  • (Boolean)
 63 64 65
# File 'lib/puppet/util/checksums.rb', line 63 def sha256?(string) string =~ /^\h{64}$/ end

.sha256_file(filename, lite = false) ⇒ Object

 67 68 69 70 71 72
# File 'lib/puppet/util/checksums.rb', line 67 def sha256_file(filename, lite = false) require 'digest/sha2' digest = Digest::SHA256.new checksum_file(digest, filename, lite) end

.sha256_hex_lengthObject

 80 81 82
# File 'lib/puppet/util/checksums.rb', line 80 def sha256_hex_length 64 end

.sha256_stream(lite = false, &block) ⇒ Object

 74 75 76 77 78
# File 'lib/puppet/util/checksums.rb', line 74 def sha256_stream(lite = false, &block) require 'digest/sha2' digest = Digest::SHA256.new checksum_stream(digest, block, lite) end

.sha256lite(content) ⇒ Object

 84 85 86
# File 'lib/puppet/util/checksums.rb', line 84 def sha256lite(content) sha256(content[0..511]) end

.sha256lite?(string) ⇒ Boolean

Returns:

  • (Boolean)
 88 89 90
# File 'lib/puppet/util/checksums.rb', line 88 def sha256lite?(string) sha256?(string) end

.sha256lite_file(filename) ⇒ Object

 92 93 94
# File 'lib/puppet/util/checksums.rb', line 92 def sha256lite_file(filename) sha256_file(filename, true) end

.sha256lite_hex_lengthObject

 100 101 102
# File 'lib/puppet/util/checksums.rb', line 100 def sha256lite_hex_length sha256_hex_length end

.sha256lite_stream(&block) ⇒ Object

 96 97 98
# File 'lib/puppet/util/checksums.rb', line 96 def sha256lite_stream(&block) sha256_stream(true, &block) end

.sha384(content) ⇒ Object

Calculate a checksum using Digest::SHA384.

 105 106 107 108
# File 'lib/puppet/util/checksums.rb', line 105 def sha384(content) require 'digest/sha2' Digest::SHA384.hexdigest(content) end

.sha384?(string) ⇒ Boolean

Returns:

  • (Boolean)
 110 111 112
# File 'lib/puppet/util/checksums.rb', line 110 def sha384?(string) string =~ /^\h{96}$/ end

.sha384_file(filename, lite = false) ⇒ Object

 114 115 116 117 118 119
# File 'lib/puppet/util/checksums.rb', line 114 def sha384_file(filename, lite = false) require 'digest/sha2' digest = Digest::SHA384.new checksum_file(digest, filename, lite) end

.sha384_hex_lengthObject

 127 128 129
# File 'lib/puppet/util/checksums.rb', line 127 def sha384_hex_length 96 end

.sha384_stream(lite = false, &block) ⇒ Object

 121 122 123 124 125
# File 'lib/puppet/util/checksums.rb', line 121 def sha384_stream(lite = false, &block) require 'digest/sha2' digest = Digest::SHA384.new checksum_stream(digest, block, lite) end

.sha512(content) ⇒ Object

Calculate a checksum using Digest::SHA512.

 132 133 134 135
# File 'lib/puppet/util/checksums.rb', line 132 def sha512(content) require 'digest/sha2' Digest::SHA512.hexdigest(content) end

.sha512?(string) ⇒ Boolean

Returns:

  • (Boolean)
 137 138 139
# File 'lib/puppet/util/checksums.rb', line 137 def sha512?(string) string =~ /^\h{128}$/ end

.sha512_file(filename, lite = false) ⇒ Object

 141 142 143 144 145 146
# File 'lib/puppet/util/checksums.rb', line 141 def sha512_file(filename, lite = false) require 'digest/sha2' digest = Digest::SHA512.new checksum_file(digest, filename, lite) end

.sha512_hex_lengthObject

 154 155 156
# File 'lib/puppet/util/checksums.rb', line 154 def sha512_hex_length 128 end

.sha512_stream(lite = false, &block) ⇒ Object

 148 149 150 151 152
# File 'lib/puppet/util/checksums.rb', line 148 def sha512_stream(lite = false, &block) require 'digest/sha2' digest = Digest::SHA512.new checksum_stream(digest, block, lite) end

.sumdata(checksum) ⇒ Object

Strip the checksum type from an existing checksum

 48 49 50
# File 'lib/puppet/util/checksums.rb', line 48 def sumdata(checksum) checksum =~ /^\{(\w+)\}(.+)/ ? ::Regexp.last_match(2) : nil end

.sumtype(checksum) ⇒ Object

Strip the checksum type from an existing checksum

 53 54 55
# File 'lib/puppet/util/checksums.rb', line 53 def sumtype(checksum) checksum =~ /^\{(\w+)\}/ ? ::Regexp.last_match(1) : nil end

.valid_checksum?(type, value) ⇒ Boolean

Returns:

  • (Boolean)
 29 30 31 32 33
# File 'lib/puppet/util/checksums.rb', line 29 def valid_checksum?(type, value) !!send("#{type}?", value) rescue NoMethodError false end