allsum-client 0.1.0

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.
@@ -0,0 +1,3 @@
1
+ -
2
+ ChangeLog.*
3
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour --format documentation
@@ -0,0 +1 @@
1
+ --markup rdoc --title "allsum-client Documentation" --protected
@@ -0,0 +1,4 @@
1
+ === 0.1.0 / 2011-06-28
2
+
3
+ * Initial release:
4
+
@@ -0,0 +1,6 @@
1
+ Copyright (c) 2011 "J. Brett Cunningham"
2
+
3
+ Allsum is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4
+
5
+ Fuzzy.dll included in the repository is licensed under version 2 of the GNU General Public Licence. Written by Jesse Kornblum (http://ssdeep.sourceforge.net/).
6
+
@@ -0,0 +1,31 @@
1
+ # allsum-client
2
+
3
+ * {Homepage}[http://rubygems.org/gems/allsum-client]
4
+ * {Documentation}[http://rubydoc.info/gems/allsum-client/frames]
5
+
6
+ ## Description
7
+
8
+ TODO: Description
9
+
10
+ ## Features
11
+
12
+ ## Examples
13
+
14
+ ``` ruby
15
+ require 'allsum/client'
16
+ ```
17
+
18
+ ## Requirements
19
+
20
+ ## Install
21
+
22
+ ``` shell
23
+ $ gem install allsum-client
24
+ ```
25
+
26
+ ## Copyright
27
+
28
+ Copyright (c) 2011 "J. Brett Cunningham"
29
+
30
+ See LICENSE.txt for details.
31
+
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'rake'
5
+
6
+ begin
7
+ gem 'ore-tasks', '~> 0.4'
8
+ require 'ore/tasks'
9
+
10
+ Ore::Tasks.new
11
+ rescue LoadError => e
12
+ STDERR.puts e.message
13
+ STDERR.puts "Run `gem install ore-tasks` to install 'ore/tasks'."
14
+ end
15
+
16
+ begin
17
+ gem 'rspec', '~> 2.4'
18
+ require 'rspec/core/rake_task'
19
+
20
+ RSpec::Core::RakeTask.new
21
+ rescue LoadError => e
22
+ task :spec do
23
+ abort "Please run `gem install rspec` to install RSpec."
24
+ end
25
+ end
26
+
27
+ task :test => :spec
28
+ task :default => :spec
29
+
30
+ begin
31
+ gem 'yard', '~> 0.7.0'
32
+ require 'yard'
33
+
34
+ YARD::Rake::YardocTask.new
35
+ rescue LoadError => e
36
+ task :yard do
37
+ abort "Please run `gem install yard` to install YARD."
38
+ end
39
+ end
40
+ task :doc => :yard
41
+
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+
3
+ require 'yaml'
4
+
5
+ Gem::Specification.new do |gemspec|
6
+ files = if File.directory?('.git')
7
+ `git ls-files`.split($/)
8
+ elsif File.directory?('.hg')
9
+ `hg manifest`.split($/)
10
+ elsif File.directory?('.svn')
11
+ `svn ls -R`.split($/).select { |path| File.file?(path) }
12
+ else
13
+ Dir['{**/}{.*,*}'].select { |path| File.file?(path) }
14
+ end
15
+
16
+ filter_files = lambda { |paths|
17
+ case paths
18
+ when Array
19
+ (files & paths)
20
+ when String
21
+ (files & Dir[paths])
22
+ end
23
+ }
24
+
25
+ version = {
26
+ :file => 'lib/client/version.rb',
27
+ :constant => 'Allsum::Client::VERSION'
28
+ }
29
+
30
+ defaults = {
31
+ 'name' => File.basename(File.dirname(__FILE__)),
32
+ 'files' => files,
33
+ 'executables' => filter_files['bin/*'].map { |path| File.basename(path) },
34
+ 'test_files' => filter_files['{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'],
35
+ 'extra_doc_files' => filter_files['*.{txt,rdoc,md,markdown,tt,textile}'],
36
+ }
37
+
38
+ metadata = defaults.merge(YAML.load_file('gemspec.yml'))
39
+
40
+ gemspec.name = metadata.fetch('name',defaults[:name])
41
+ gemspec.version = if metadata['version']
42
+ metadata['version']
43
+ elsif File.file?(version[:file])
44
+ require File.join('.',version[:file])
45
+ eval(version[:constant])
46
+ end
47
+
48
+ gemspec.summary = metadata.fetch('summary',metadata['description'])
49
+ gemspec.description = metadata.fetch('description',metadata['summary'])
50
+
51
+ case metadata['license']
52
+ when Array
53
+ gemspec.licenses = metadata['license']
54
+ when String
55
+ gemspec.license = metadata['license']
56
+ end
57
+
58
+ case metadata['authors']
59
+ when Array
60
+ gemspec.authors = metadata['authors']
61
+ when String
62
+ gemspec.author = metadata['authors']
63
+ end
64
+
65
+ gemspec.email = metadata['email']
66
+ gemspec.homepage = metadata['homepage']
67
+
68
+ case metadata['require_paths']
69
+ when Array
70
+ gemspec.require_paths = metadata['require_paths']
71
+ when String
72
+ gemspec.require_path = metadata['require_paths']
73
+ end
74
+
75
+ gemspec.files = filter_files[metadata['files']]
76
+
77
+ gemspec.executables = metadata['executables']
78
+ gemspec.extensions = metadata['extensions']
79
+
80
+ if Gem::VERSION < '1.7.'
81
+ gemspec.default_executable = gemspec.executables.first
82
+ end
83
+
84
+ gemspec.test_files = filter_files[metadata['test_files']]
85
+
86
+ unless gemspec.files.include?('.document')
87
+ gemspec.extra_rdoc_files = metadata['extra_doc_files']
88
+ end
89
+
90
+ gemspec.post_install_message = metadata['post_install_message']
91
+ gemspec.requirements = metadata['requirements']
92
+
93
+ if gemspec.respond_to?(:required_ruby_version=)
94
+ gemspec.required_ruby_version = metadata['required_ruby_version']
95
+ end
96
+
97
+ if gemspec.respond_to?(:required_rubygems_version=)
98
+ gemspec.required_rubygems_version = metadata['required_ruby_version']
99
+ end
100
+
101
+ parse_versions = lambda { |versions|
102
+ case versions
103
+ when Array
104
+ versions.map { |v| v.to_s }
105
+ when String
106
+ versions.split(/,\s*/)
107
+ end
108
+ }
109
+
110
+ if metadata['dependencies']
111
+ metadata['dependencies'].each do |name,versions|
112
+ gemspec.add_dependency(name,parse_versions[versions])
113
+ end
114
+ end
115
+
116
+ if metadata['runtime_dependencies']
117
+ metadata['runtime_dependencies'].each do |name,versions|
118
+ gemspec.add_runtime_dependency(name,parse_versions[versions])
119
+ end
120
+ end
121
+
122
+ if metadata['development_dependencies']
123
+ metadata['development_dependencies'].each do |name,versions|
124
+ gemspec.add_development_dependency(name,parse_versions[versions])
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,12 @@
1
+ client:
2
+ included: [ 'C:\WINDOWS' ]
3
+ excluded: [ 'C:\WINDOWS\test1', 'C:\WINDOWS\test2' ]
4
+ filetypes: [ 'exe', 'dll' ]
5
+
6
+ server:
7
+ host: 192.168.45.162
8
+ port: 3306
9
+ username: root
10
+ password: BumbleBeeTuna89
11
+ table: hashdb
12
+
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib_dir = File.expand_path(File.join(File.dirname(__FILE__),'..','lib'))
4
+ unless $LOAD_PATH.include?(lib_dir)
5
+ $LOAD_PATH << lib_dir
6
+ end
7
+
8
+ require 'allsum-client'
9
+ Allsum.setup
Binary file
@@ -0,0 +1,18 @@
1
+ name: allsum-client
2
+ summary: "Compute checksums of files and store in a database"
3
+ description: "Compute MD5, SHA1, SHA256 and fuzzyhash (CTPH) of specified filetypes in specified directories."
4
+ license: GPLv2
5
+ authors: J. Brett Cunningham
6
+ email: brettcu@gmail.com
7
+ homepage: http://rubygems.org/gems/allsum-client
8
+
9
+ dependencies:
10
+ file-find: ~> 0.0
11
+ datamapper: ~> 1.1.0
12
+ ffi-ssdeep: ~> 0.1.1
13
+
14
+ development_dependencies:
15
+ ore-tasks: ~> 0.4
16
+ rspec: ~> 2.4
17
+ yard: ~> 0.7.0
18
+
@@ -0,0 +1 @@
1
+ require 'allsum/client'
@@ -0,0 +1,2 @@
1
+ require 'allsum/client/check'
2
+
@@ -0,0 +1,66 @@
1
+ # code reused by CF BILL (http://cf-bill.blogspot.com/2007/02/ruby-directory-traversal.html)
2
+ # and AShelly (http://stackoverflow.com/questions/76472/checking-version-of-file-in-ruby-on-windows)
3
+ # no use reinventing the wheel
4
+
5
+ require 'find'
6
+ require 'pathname'
7
+ require 'allsum/client/complicator'
8
+ require 'allsum/client/config'
9
+ require 'allsum/client/models'
10
+ require 'allsum/client/logger'
11
+ require 'yaml'
12
+
13
+
14
+ def Allsum.setup
15
+ yaml_path = File.absolute_path(File.dirname($0)) + '/../allsum_config.yml'
16
+ puts "Reading config file: #{yaml_path}" if @debug || @verbose
17
+ raw_config = File.read(yaml_path)
18
+ config = YAML.load(raw_config)
19
+
20
+
21
+ @debug = true
22
+ @verbose = true
23
+ puts @rootDirectory = config["client"]["included"] if @debug
24
+ puts @excludedDirectoryNames = config["client"]["excluded"] if @debug
25
+ puts @includedFileTypes = config["client"]["filetypes"] if @debug
26
+ puts host = config["server"]["host"] if @debug
27
+ puts port = config["server"]["port"] if @debug
28
+ puts user = config["server"]["username"] if @debug
29
+ puts pass = config["server"]["password"] if @debug
30
+ puts table = config["server"]["table"] if @debug
31
+
32
+ Allsum::Client::Logger.new(host, port, user, pass, table, @debug, @verbose)
33
+
34
+ Allsum::Client::Models::Filename.new()
35
+ @rootDirectory.find.each do |gooddir|
36
+ Find.find(gooddir) do |path|
37
+
38
+ if FileTest.directory?(path)
39
+ #determine if this is a directory we don't like...
40
+ @excludedDirectoryNames.each do |baddir|
41
+ if baddir.include?(File.basename(path.downcase))
42
+ Find.prune #don't look in this directory
43
+ puts "excluded directory #{path}" if @debug
44
+ end
45
+ end
46
+ else #we have a file
47
+ puts "we have a file #{path}" if @debug
48
+ filetype = Allsum::Client::Complicator.file_type(path)
49
+ @includedFileTypes.each do |includeFile|
50
+ puts "Incl type: " + includeFile if @debug || @verbose
51
+ puts "File type: " + filetype if @debug || @verbose
52
+ if includeFile.include?(filetype)
53
+ puts path if @debug || @verbose
54
+
55
+ Allsum::Client::Complicator.filename(path)
56
+ Allsum::Client::Complicator.file_size(path)
57
+ Allsum::Client::Complicator.calculate_checksums(path)
58
+ Allsum::Client::Complicator.version_info(path)
59
+ Allsum::Client::Complicator.log_to_db(path)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
@@ -0,0 +1,77 @@
1
+ require "Win32API"
2
+ require "digest"
3
+ require "allsum/client/logger"
4
+ require "ssdeep"
5
+
6
+ module Allsum
7
+ module Client
8
+
9
+ class Complicator
10
+ @debug = true
11
+ @verbose = true
12
+
13
+ def self.filename(path)
14
+ @filename = Pathname.new(path).basename
15
+ end
16
+
17
+ def self.version_info(file)
18
+ vsize=Win32API.new('version.dll', 'GetFileVersionInfoSize', ['P', 'P'], 'L').call(file, "") # "" was s
19
+ #p vsize if @debug
20
+ if (vsize > 0)
21
+ result = ' '*vsize
22
+ Win32API.new('version.dll', 'GetFileVersionInfo', ['P', 'L', 'L', 'P'], 'L').call(file, 0, vsize, result)
23
+ rstring = result.unpack('v*').map{|s| s.chr if s<256}*''
24
+ r = /FileVersion..(.*?)\000/.match(rstring)
25
+ puts "FileVersion = #{r ? r[1] : '??' }" if @verbose || @debug
26
+ @fileversion = r ? r[1] : '??'
27
+ else
28
+ puts "No Version Info" if @verbose || @debug
29
+ end
30
+ end
31
+
32
+ def self.calculate_checksums(file)
33
+ begin
34
+ puts "Filename: #{@filename}"
35
+ puts "[x]calculating checksums" if @debug || @verbose
36
+ #md5
37
+ @md5digest = Digest::MD5.hexdigest(File.read(file))
38
+ puts " MD5 checksum: #{@md5digest}" if @debug || @verbose
39
+ #sha1
40
+ @sha1digest = Digest::SHA1.hexdigest(File.read(file))
41
+ puts " SHA1 checksum: #{@sha1digest}" if @debug || @verbose
42
+ #sha256
43
+ @sha256digest = Digest::SHA256.hexdigest(File.read(file))
44
+ puts " SHA256 checksum: #{@sha256digest}" if @debug || @verbose
45
+ #fuzzy hash
46
+ @fuzzyhash = Ssdeep::FuzzyHash.from_file(file)
47
+ puts " Fuzzy hash: #{@fuzzyhash}" if @debug || @verbose
48
+ rescue Errno::EACCESS
49
+ puts "Perrmission denied when attempting to read #{@filename}" if @debug || @verbose
50
+ end
51
+ end
52
+
53
+ def self.file_type(path)
54
+ puts "[x]checking file type" if @debug || @verbose
55
+ @filetype = File.basename(path.downcase).split(".").last
56
+ end
57
+
58
+ def self.file_size(path)
59
+ puts "[x]checking file size" if @debug || @verbose
60
+ @filesize = File.size?(path)
61
+
62
+ puts "Filesize: #{@filesize}" if @debug || @verbose
63
+ @filepath = path
64
+ end
65
+
66
+ def self.log_to_db(file)
67
+ # schema: uid | file name | size | file type | product | version info | modification date | ms bulletin | build | md5 | sha1 | sha256 | comment(?)
68
+ puts "[x]logging to database" if @debug || @verbose
69
+
70
+ Allsum::Client::Logger.paper(@filename, @filetype, @md5digest, @sha1digest, @sha256digest, @filepath, @fuzzyhash,
71
+ @fileversion, @filesize)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+
@@ -0,0 +1,10 @@
1
+ module Allsum
2
+ module Client
3
+
4
+ class Config
5
+
6
+
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,54 @@
1
+ require 'dm-migrations'
2
+ require 'allsum/client/models'
3
+
4
+ module Allsum
5
+ module Client
6
+
7
+ class Logger
8
+ def self.new(host, port, user, pass, table, debug, verbose)
9
+ @debug = debug
10
+ @verbose = verbose
11
+
12
+ @db = DataMapper.setup(:default, "mysql://#{user}:#{pass}@#{host}:#{port}/#{table}")
13
+ puts @db if @debug
14
+
15
+ DataMapper.finalize
16
+ DataMapper.auto_upgrade!
17
+ end
18
+
19
+
20
+ def self.paper(file, filetype, md5digest, sha1digest, sha256digest, filepath, fuzzyhash, fileversion, filesize)
21
+
22
+ puts "file #{file}" if @debug || @verbose
23
+ puts filetype if @debug
24
+ puts fileversion if @debug
25
+ puts md5digest if @debug
26
+
27
+ begin
28
+ saved = Allsum::Client::Models::Filename.create(
29
+ :filename => file.to_s,
30
+ :filetype => filetype.to_s,
31
+ :created_at => Time.now,
32
+ :size => filesize.to_i,
33
+ :version => fileversion.to_s,
34
+ :datemodified => Time.now,
35
+ :filepath => filepath.to_s,
36
+ :md5 => md5digest.to_s,
37
+ :sha1 => sha1digest.to_s,
38
+ :sha256 => sha256digest.to_s,
39
+ :fuzzyhash => fuzzyhash.to_s
40
+ )
41
+
42
+ #saved.save!
43
+
44
+ puts saved if @debug
45
+
46
+ rescue DataObjects::IntegrityError
47
+ puts "Already in DB" if @debug || @verbose
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+
@@ -0,0 +1,2 @@
1
+ require 'allsum/client/models/filename'
2
+
@@ -0,0 +1,27 @@
1
+ module Allsum
2
+ module Client
3
+ module Models
4
+
5
+ class Filename
6
+ require 'dm-migrations'
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial, :key => true
10
+ property :filename, Text # done
11
+ property :filetype, String # needs work
12
+ property :created_at, DateTime # done
13
+ property :datemodified, DateTime
14
+ property :size, Integer # done
15
+ property :version, Text # done
16
+ property :filepath, Text # not done
17
+ property :md5, String # done
18
+ property :sha1, String # done
19
+ property :sha256, Text, :unique => true # done
20
+ property :fuzzyhash, Text #done
21
+
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,6 @@
1
+ module Allsum
2
+ module Client
3
+ # allsum-client version
4
+ VERSION = "0.1.0"
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+ require 'allsum/client'
3
+
4
+ describe Allsum::Client do
5
+ it "should have a VERSION constant" do
6
+ subject.const_get('VERSION').should_not be_empty
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ gem 'rspec', '~> 2.4'
2
+ require 'rspec'
3
+ require 'allsum/client/version'
4
+
5
+ include Allsum::Client
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: allsum-client
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - J. Brett Cunningham
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-29 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: datamapper
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 19
29
+ segments:
30
+ - 1
31
+ - 1
32
+ - 0
33
+ version: 1.1.0
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: file-find
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 11
45
+ segments:
46
+ - 0
47
+ - 0
48
+ version: "0.0"
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: ffi-ssdeep
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 25
60
+ segments:
61
+ - 0
62
+ - 1
63
+ - 1
64
+ version: 0.1.1
65
+ type: :runtime
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: ore-tasks
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ - 4
79
+ version: "0.4"
80
+ type: :development
81
+ version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: yard
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ - 7
94
+ - 0
95
+ version: 0.7.0
96
+ type: :development
97
+ version_requirements: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec
100
+ prerelease: false
101
+ requirement: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ hash: 11
107
+ segments:
108
+ - 2
109
+ - 4
110
+ version: "2.4"
111
+ type: :development
112
+ version_requirements: *id006
113
+ description: Compute MD5, SHA1, SHA256 and fuzzyhash (CTPH) of specified filetypes in specified directories.
114
+ email:
115
+ - brettcu@gmail.com
116
+ executables:
117
+ - fuzzy.dll
118
+ - allsum-client
119
+ extensions: []
120
+
121
+ extra_rdoc_files:
122
+ - README.md
123
+ - LICENSE.txt
124
+ - ChangeLog.rdoc
125
+ files:
126
+ - spec/spec_helper.rb
127
+ - lib/allsum/client/check.rb
128
+ - gemspec.yml
129
+ - ChangeLog.rdoc
130
+ - .rspec
131
+ - allsum-client.gemspec
132
+ - .yardopts
133
+ - lib/allsum/client/models.rb
134
+ - lib/allsum/client.rb
135
+ - bin/fuzzy.dll
136
+ - spec/client_spec.rb
137
+ - allsum_config.yml
138
+ - Rakefile
139
+ - README.md
140
+ - LICENSE.txt
141
+ - lib/allsum/client/complicator.rb
142
+ - lib/allsum-client.rb
143
+ - bin/allsum-client
144
+ - lib/allsum/client/version.rb
145
+ - lib/allsum/client/config.rb
146
+ - lib/allsum/client/models/filename.rb
147
+ - lib/allsum/client/logger.rb
148
+ - .document
149
+ homepage: http://rubygems.org/gems/allsum-client
150
+ licenses:
151
+ - GPLv2
152
+ post_install_message:
153
+ rdoc_options: []
154
+
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ hash: 3
172
+ segments:
173
+ - 0
174
+ version: "0"
175
+ requirements: []
176
+
177
+ rubyforge_project: allsum-client
178
+ rubygems_version: 1.7.2
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Compute checksums of files and store in a database
182
+ test_files:
183
+ - spec/client_spec.rb