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 =
[
  :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)


41
42
43
44
# File 'lib/puppet/util/checksums.rb', line 41

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.



363
364
365
366
367
368
369
370
371
372
373
# File 'lib/puppet/util/checksums.rb', line 363

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



375
376
377
378
# File 'lib/puppet/util/checksums.rb', line 375

def checksum_stream(digest, block, lite = false)
  block.call(DigestLite.new(digest, lite))
  digest.hexdigest
end

.ctime(content) ⇒ Object



301
302
303
# File 'lib/puppet/util/checksums.rb', line 301

def ctime(content)
  ""
end

.ctime?(string) ⇒ Boolean

Returns:

  • (Boolean)


305
306
307
308
309
310
311
# File 'lib/puppet/util/checksums.rb', line 305

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.



314
315
316
# File 'lib/puppet/util/checksums.rb', line 314

def ctime_file(filename)
  Puppet::FileSystem.stat(filename).ctime
end

.ctime_stream(&block) ⇒ Object



318
319
320
# File 'lib/puppet/util/checksums.rb', line 318

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.



24
25
26
# File 'lib/puppet/util/checksums.rb', line 24

def known_checksum_types
  KNOWN_CHECKSUMS
end

.md5(content) ⇒ Object

Calculate a checksum using Digest::MD5.



185
186
187
# File 'lib/puppet/util/checksums.rb', line 185

def md5(content)
  Digest::MD5.hexdigest(content)
end

.md5?(string) ⇒ Boolean

Returns:

  • (Boolean)


189
190
191
# File 'lib/puppet/util/checksums.rb', line 189

def md5?(string)
  string =~ /^\h{32}$/
end

.md5_file(filename, lite = false) ⇒ Object

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



194
195
196
197
# File 'lib/puppet/util/checksums.rb', line 194

def md5_file(filename, lite = false)
  digest = Digest::MD5.new
  checksum_file(digest, filename, lite)
end

.md5_hex_lengthObject



204
205
206
# File 'lib/puppet/util/checksums.rb', line 204

def md5_hex_length
  32
end

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



199
200
201
202
# File 'lib/puppet/util/checksums.rb', line 199

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.



209
210
211
# File 'lib/puppet/util/checksums.rb', line 209

def md5lite(content)
  md5(content[0..511])
end

.md5lite?(string) ⇒ Boolean

Returns:

  • (Boolean)


213
214
215
# File 'lib/puppet/util/checksums.rb', line 213

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.



218
219
220
# File 'lib/puppet/util/checksums.rb', line 218

def md5lite_file(filename)
  md5_file(filename, true)
end

.md5lite_hex_lengthObject



226
227
228
# File 'lib/puppet/util/checksums.rb', line 226

def md5lite_hex_length
  md5_hex_length
end

.md5lite_stream(&block) ⇒ Object



222
223
224
# File 'lib/puppet/util/checksums.rb', line 222

def md5lite_stream(&block)
  md5_stream(true, &block)
end

.mtime(content) ⇒ Object



230
231
232
# File 'lib/puppet/util/checksums.rb', line 230

def mtime(content)
  ""
end

.mtime?(string) ⇒ Boolean

Returns:

  • (Boolean)


234
235
236
237
238
239
240
# File 'lib/puppet/util/checksums.rb', line 234

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.



243
244
245
# File 'lib/puppet/util/checksums.rb', line 243

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)


249
250
251
252
253
# File 'lib/puppet/util/checksums.rb', line 249

def mtime_stream(&block)
  noop_digest = FakeChecksum.new
  yield noop_digest
  nil
end

.none(content) ⇒ Object



322
323
324
# File 'lib/puppet/util/checksums.rb', line 322

def none(content)
  ""
end

.none?(string) ⇒ Boolean

Returns:

  • (Boolean)


326
327
328
# File 'lib/puppet/util/checksums.rb', line 326

def none?(string)
  string.empty?
end

.none_file(filename) ⇒ Object

Return a “no checksum”



331
332
333
# File 'lib/puppet/util/checksums.rb', line 331

def none_file(filename)
  ""
end

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

Yields:

  • (noop_digest)


335
336
337
338
339
# File 'lib/puppet/util/checksums.rb', line 335

def none_stream
  noop_digest = FakeChecksum.new
  yield noop_digest
  ""
end

.sha1(content) ⇒ Object

Calculate a checksum using Digest::SHA1.



256
257
258
# File 'lib/puppet/util/checksums.rb', line 256

def sha1(content)
  Digest::SHA1.hexdigest(content)
end

.sha1?(string) ⇒ Boolean

Returns:

  • (Boolean)


260
261
262
# File 'lib/puppet/util/checksums.rb', line 260

def sha1?(string)
  string =~ /^\h{40}$/
end

.sha1_file(filename, lite = false) ⇒ Object

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



265
266
267
268
# File 'lib/puppet/util/checksums.rb', line 265

def sha1_file(filename, lite = false)
  digest = Digest::SHA1.new
  checksum_file(digest, filename, lite)
end

.sha1_hex_lengthObject



275
276
277
# File 'lib/puppet/util/checksums.rb', line 275

def sha1_hex_length
  40
end

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



270
271
272
273
# File 'lib/puppet/util/checksums.rb', line 270

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.



280
281
282
# File 'lib/puppet/util/checksums.rb', line 280

def sha1lite(content)
  sha1(content[0..511])
end

.sha1lite?(string) ⇒ Boolean

Returns:

  • (Boolean)


284
285
286
# File 'lib/puppet/util/checksums.rb', line 284

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.



289
290
291
# File 'lib/puppet/util/checksums.rb', line 289

def sha1lite_file(filename)
  sha1_file(filename, true)
end

.sha1lite_hex_lengthObject



297
298
299
# File 'lib/puppet/util/checksums.rb', line 297

def sha1lite_hex_length
  sha1_hex_length
end

.sha1lite_stream(&block) ⇒ Object



293
294
295
# File 'lib/puppet/util/checksums.rb', line 293

def sha1lite_stream(&block)
  sha1_stream(true, &block)
end

.sha224(content) ⇒ Object

Calculate a checksum using Digest::SHA224.



158
159
160
161
# File 'lib/puppet/util/checksums.rb', line 158

def sha224(content)
  require_relative '../../puppet/ssl/openssl_loader'
  OpenSSL::Digest.new('SHA224').hexdigest(content)
end

.sha224?(string) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/puppet/util/checksums.rb', line 163

def sha224?(string)
  string =~ /^\h{56}$/
end

.sha224_file(filename, lite = false) ⇒ Object



167
168
169
170
171
172
# File 'lib/puppet/util/checksums.rb', line 167

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



180
181
182
# File 'lib/puppet/util/checksums.rb', line 180

def sha224_hex_length
  56
end

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



174
175
176
177
178
# File 'lib/puppet/util/checksums.rb', line 174

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.



57
58
59
60
# File 'lib/puppet/util/checksums.rb', line 57

def sha256(content)
  require 'digest/sha2'
  Digest::SHA256.hexdigest(content)
end

.sha256?(string) ⇒ Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/puppet/util/checksums.rb', line 62

def sha256?(string)
  string =~ /^\h{64}$/
end

.sha256_file(filename, lite = false) ⇒ Object



66
67
68
69
70
71
# File 'lib/puppet/util/checksums.rb', line 66

def sha256_file(filename, lite = false)
  require 'digest/sha2'

  digest = Digest::SHA256.new
  checksum_file(digest, filename, lite)
end

.sha256_hex_lengthObject



79
80
81
# File 'lib/puppet/util/checksums.rb', line 79

def sha256_hex_length
  64
end

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



73
74
75
76
77
# File 'lib/puppet/util/checksums.rb', line 73

def sha256_stream(lite = false, &block)
  require 'digest/sha2'
  digest = Digest::SHA256.new
  checksum_stream(digest, block, lite)
end

.sha256lite(content) ⇒ Object



83
84
85
# File 'lib/puppet/util/checksums.rb', line 83

def sha256lite(content)
  sha256(content[0..511])
end

.sha256lite?(string) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/puppet/util/checksums.rb', line 87

def sha256lite?(string)
  sha256?(string)
end

.sha256lite_file(filename) ⇒ Object



91
92
93
# File 'lib/puppet/util/checksums.rb', line 91

def sha256lite_file(filename)
  sha256_file(filename, true)
end

.sha256lite_hex_lengthObject



99
100
101
# File 'lib/puppet/util/checksums.rb', line 99

def sha256lite_hex_length
  sha256_hex_length
end

.sha256lite_stream(&block) ⇒ Object



95
96
97
# File 'lib/puppet/util/checksums.rb', line 95

def sha256lite_stream(&block)
  sha256_stream(true, &block)
end

.sha384(content) ⇒ Object

Calculate a checksum using Digest::SHA384.



104
105
106
107
# File 'lib/puppet/util/checksums.rb', line 104

def sha384(content)
  require 'digest/sha2'
  Digest::SHA384.hexdigest(content)
end

.sha384?(string) ⇒ Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/puppet/util/checksums.rb', line 109

def sha384?(string)
  string =~ /^\h{96}$/
end

.sha384_file(filename, lite = false) ⇒ Object



113
114
115
116
117
118
# File 'lib/puppet/util/checksums.rb', line 113

def sha384_file(filename, lite = false)
  require 'digest/sha2'

  digest = Digest::SHA384.new
  checksum_file(digest, filename, lite)
end

.sha384_hex_lengthObject



126
127
128
# File 'lib/puppet/util/checksums.rb', line 126

def sha384_hex_length
  96
end

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



120
121
122
123
124
# File 'lib/puppet/util/checksums.rb', line 120

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.



131
132
133
134
# File 'lib/puppet/util/checksums.rb', line 131

def sha512(content)
  require 'digest/sha2'
  Digest::SHA512.hexdigest(content)
end

.sha512?(string) ⇒ Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/puppet/util/checksums.rb', line 136

def sha512?(string)
  string =~ /^\h{128}$/
end

.sha512_file(filename, lite = false) ⇒ Object



140
141
142
143
144
145
# File 'lib/puppet/util/checksums.rb', line 140

def sha512_file(filename, lite = false)
  require 'digest/sha2'

  digest = Digest::SHA512.new
  checksum_file(digest, filename, lite)
end

.sha512_hex_lengthObject



153
154
155
# File 'lib/puppet/util/checksums.rb', line 153

def sha512_hex_length
  128
end

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



147
148
149
150
151
# File 'lib/puppet/util/checksums.rb', line 147

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



47
48
49
# File 'lib/puppet/util/checksums.rb', line 47

def sumdata(checksum)
  checksum =~ /^\{(\w+)\}(.+)/ ? ::Regexp.last_match(2) : nil
end

.sumtype(checksum) ⇒ Object

Strip the checksum type from an existing checksum



52
53
54
# File 'lib/puppet/util/checksums.rb', line 52

def sumtype(checksum)
  checksum =~ /^\{(\w+)\}/ ? ::Regexp.last_match(1) : nil
end

.valid_checksum?(type, value) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
31
32
# File 'lib/puppet/util/checksums.rb', line 28

def valid_checksum?(type, value)
  !!send("#{type}?", value)
rescue NoMethodError
  false
end