allsum-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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