checkzilla 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.
- data/bin/checkzilla +9 -0
- data/lib/checkzilla.rb +15 -0
- data/lib/checkzilla/check/npm.rb +25 -0
- data/lib/checkzilla/check/pacman.rb +29 -0
- data/lib/checkzilla/check/rubygem.rb +66 -0
- data/lib/checkzilla/cli.rb +11 -0
- data/lib/checkzilla/model.rb +30 -0
- data/lib/checkzilla/notifier/console.rb +22 -0
- data/lib/checkzilla/notifier/email.rb +33 -0
- data/lib/checkzilla/notifier/hipchat.rb +35 -0
- metadata +122 -0
data/bin/checkzilla
ADDED
data/lib/checkzilla.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module CheckZilla
|
2
|
+
|
3
|
+
LIBRARY_PATH = File.join(File.dirname(__FILE__), 'checkzilla')
|
4
|
+
CHECK_UPDATE_PATH = File.join(LIBRARY_PATH, 'check')
|
5
|
+
NOTIFIER_PATH = File.join(LIBRARY_PATH, 'notifier')
|
6
|
+
|
7
|
+
[CHECK_UPDATE_PATH, NOTIFIER_PATH].each do |ext|
|
8
|
+
Dir["#{ext}/*.rb"].each { |lib| require lib }
|
9
|
+
end
|
10
|
+
|
11
|
+
%w{
|
12
|
+
model
|
13
|
+
cli
|
14
|
+
}.each {|lib| require File.join(LIBRARY_PATH, lib) }
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CheckZilla
|
2
|
+
module Check
|
3
|
+
class Npm
|
4
|
+
|
5
|
+
attr_accessor :results
|
6
|
+
attr_accessor :path
|
7
|
+
|
8
|
+
def initialize &block
|
9
|
+
@results = {}
|
10
|
+
instance_eval(&block) if block_given?
|
11
|
+
raise "npm: path required" if !@path
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform!
|
16
|
+
raise "npm: directory doesn't exist" unless File.exists?(@path)
|
17
|
+
raw_result = `cd #{@path}; npm outdated --silent`
|
18
|
+
raw_result.split("\n").each do |outdated_package|
|
19
|
+
outdated_hash = outdated_package.match /^(.+)@(.+)\s.+\s.+=(.+)$/
|
20
|
+
@results[outdated_hash[1]] = [outdated_hash[3], outdated_hash[2]]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
# requires package-query
|
5
|
+
module CheckZilla
|
6
|
+
module Check
|
7
|
+
class Pacman
|
8
|
+
|
9
|
+
attr_accessor :results
|
10
|
+
|
11
|
+
def initialize &block
|
12
|
+
@results = {}
|
13
|
+
instance_eval(&block) if block_given?
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform!
|
18
|
+
cmd = ''
|
19
|
+
cmd = "sudo pacman -Sy > /dev/null ; package-query -AQu -f '%n %l %V'"
|
20
|
+
packages = `#{cmd}`.split("\n")
|
21
|
+
|
22
|
+
packages.each do |package|
|
23
|
+
package_name, package_current_version, package_db_version = package.split(' ')
|
24
|
+
@results[package_name] = [package_current_version, package_db_version]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
module CheckZilla
|
6
|
+
module Check
|
7
|
+
# Try to determine your gems dependencies and which are not up to date
|
8
|
+
|
9
|
+
# If a path is defined and a Gemfile.lock exists in the repository
|
10
|
+
# it will parse it via bundler
|
11
|
+
|
12
|
+
# Otherwise it will parse the output of the `gem list` command (ideal for system wide ruby)
|
13
|
+
|
14
|
+
# Finally it's matching your gem version against the last version in the rubygem api
|
15
|
+
# to determine what is up-to-date
|
16
|
+
class Rubygem
|
17
|
+
|
18
|
+
attr_accessor :path
|
19
|
+
attr_accessor :results
|
20
|
+
|
21
|
+
def initialize &block
|
22
|
+
@results = {}
|
23
|
+
instance_eval(&block) if block_given?
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def perform!
|
28
|
+
dependencies = @path && gemfilelock_exists? ? deps_from_gemfilelock : deps_from_gem_list
|
29
|
+
dependencies.each do |gem_name, gem_version|
|
30
|
+
rubygems_response = Net::HTTP.get_response("rubygems.org","/api/v1/gems/#{gem_name}.json")
|
31
|
+
if rubygems_response.code.to_i >= 400
|
32
|
+
puts "#{rubygems_response.code} on rubygems.org for #{gem_name}: #{rubygems_response.body}"
|
33
|
+
next
|
34
|
+
end
|
35
|
+
newer_version = JSON.parse(rubygems_response.body)['version']
|
36
|
+
@results[gem_name] = [gem_version, newer_version] if gem_version != newer_version
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def deps_from_gem_list
|
43
|
+
gems = `gem list`.split("\n")
|
44
|
+
gems.inject({}) do |list, gem|
|
45
|
+
gem_name = gem.split(' ')[0]
|
46
|
+
gem_versions = gem.match(/^.+ (\(.+\))$/)[1][1..-2].split(', ')
|
47
|
+
list[gem_name] = gem_versions[0]
|
48
|
+
list
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def deps_from_gemfilelock
|
53
|
+
list = {}
|
54
|
+
specs = Bundler::LockfileParser.new(Bundler.read_file(File.join(@path, "Gemfile.lock"))).specs
|
55
|
+
specs.each do |gem|
|
56
|
+
list[gem.name] = gem.version.to_s
|
57
|
+
end
|
58
|
+
list
|
59
|
+
end
|
60
|
+
|
61
|
+
def gemfilelock_exists?
|
62
|
+
File.exists?(File.join(@path, "Gemfile.lock"))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module CheckZilla
|
2
|
+
class CLI < Clamp::Command
|
3
|
+
parameter "CONFIGURATION ...", "the configuration file", :attribute_name => :config_file
|
4
|
+
|
5
|
+
def execute
|
6
|
+
conf_relative_path = File::join(Dir.pwd, config_file)
|
7
|
+
require conf_relative_path
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CheckZilla
|
2
|
+
class Model
|
3
|
+
|
4
|
+
attr_reader :checkers, :notifiers
|
5
|
+
|
6
|
+
def initialize(title = "Report", &block)
|
7
|
+
@title = title
|
8
|
+
@checkers = []
|
9
|
+
@notifiers = []
|
10
|
+
|
11
|
+
instance_eval(&block) if block_given?
|
12
|
+
|
13
|
+
@checkers.each do |checker|
|
14
|
+
checker.perform!
|
15
|
+
end
|
16
|
+
|
17
|
+
@notifiers.each do |notifier|
|
18
|
+
notifier.perform! @checkers
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_updates klass, &block
|
23
|
+
@checkers << CheckZilla::Check.const_get(klass.to_s.capitalize).new(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def notify_by klass, &block
|
27
|
+
@notifiers << CheckZilla::Notifier.const_get(klass.to_s.capitalize).new(&block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module CheckZilla
|
2
|
+
module Notifier
|
3
|
+
class Console
|
4
|
+
def initialize &block
|
5
|
+
end
|
6
|
+
|
7
|
+
def perform! checkers
|
8
|
+
checkers.each do |checker|
|
9
|
+
checker_name = checker.class.name.split("::").last
|
10
|
+
title = "#{checker_name} Report"
|
11
|
+
puts "#{title}\n#{"="*title.size}"
|
12
|
+
|
13
|
+
checker.results.each do |name, versions|
|
14
|
+
local_version = versions[0]
|
15
|
+
newer_version = versions[1]
|
16
|
+
puts "#{name} from #{local_version} to #{newer_version}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'pony'
|
2
|
+
|
3
|
+
module CheckZilla
|
4
|
+
module Notifier
|
5
|
+
class Email
|
6
|
+
|
7
|
+
attr_accessor :pony_settings
|
8
|
+
|
9
|
+
def initialize &block
|
10
|
+
instance_eval(&block) if block_given?
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def perform! checkers
|
15
|
+
body = []
|
16
|
+
checkers.each do |checker|
|
17
|
+
checker_name = checker.class.name.split("::").last
|
18
|
+
title = "#{checker_name} Report"
|
19
|
+
body << "#{title}\n#{"="*title.size}"
|
20
|
+
|
21
|
+
checker.results.each do |name, versions|
|
22
|
+
local_version = versions[0]
|
23
|
+
newer_version = versions[1]
|
24
|
+
body << "#{name} from #{local_version} to #{newer_version}"
|
25
|
+
end
|
26
|
+
body << ["\n\n"]
|
27
|
+
end
|
28
|
+
binding.pry
|
29
|
+
Pony.mail(@pony_settings.merge(:body => body.join("\n")))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'hipchat'
|
2
|
+
|
3
|
+
module CheckZilla
|
4
|
+
module Notifier
|
5
|
+
class Hipchat
|
6
|
+
|
7
|
+
attr_accessor :api_token
|
8
|
+
attr_accessor :room
|
9
|
+
attr_accessor :username
|
10
|
+
|
11
|
+
def initialize &block
|
12
|
+
instance_eval(&block) if block_given?
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def perform! checkers
|
17
|
+
client = HipChat::Client.new(@api_token)
|
18
|
+
notify_users = false
|
19
|
+
|
20
|
+
checkers.each do |checker|
|
21
|
+
checker_name = checker.class.name.split("::").last
|
22
|
+
title = "#{checker_name} Updates:"
|
23
|
+
|
24
|
+
body = []
|
25
|
+
checker.results.each do |name, versions|
|
26
|
+
local_version = versions[0]
|
27
|
+
newer_version = versions[1]
|
28
|
+
body << "#{name} (#{local_version} -> #{newer_version})"
|
29
|
+
end
|
30
|
+
client[@room].send(@username, "#{title} #{body.join(', ')}", :notify => true, :color => 'red')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: checkzilla
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Bensoussan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: clamp
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: hipchat
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: clamp
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.3.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.3.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pony
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: CheckZilla is a command line tool allowing you to check and be notified
|
79
|
+
of outdated software.
|
80
|
+
email:
|
81
|
+
- mbensoussan.is@gmail.com
|
82
|
+
executables:
|
83
|
+
- checkzilla
|
84
|
+
extensions: []
|
85
|
+
extra_rdoc_files: []
|
86
|
+
files:
|
87
|
+
- ./lib/checkzilla.rb
|
88
|
+
- ./lib/checkzilla/notifier/email.rb
|
89
|
+
- ./lib/checkzilla/notifier/console.rb
|
90
|
+
- ./lib/checkzilla/notifier/hipchat.rb
|
91
|
+
- ./lib/checkzilla/check/npm.rb
|
92
|
+
- ./lib/checkzilla/check/rubygem.rb
|
93
|
+
- ./lib/checkzilla/check/pacman.rb
|
94
|
+
- ./lib/checkzilla/cli.rb
|
95
|
+
- ./lib/checkzilla/model.rb
|
96
|
+
- ./bin/checkzilla
|
97
|
+
- bin/checkzilla
|
98
|
+
homepage: http://github.com/mickey/checkzilla
|
99
|
+
licenses: []
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 1.3.6
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project: checkzilla
|
118
|
+
rubygems_version: 1.8.24
|
119
|
+
signing_key:
|
120
|
+
specification_version: 3
|
121
|
+
summary: CLI allowing to check and be notified of outdated software
|
122
|
+
test_files: []
|