jah 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +62 -13
- data/Rakefile +4 -3
- data/VERSION +1 -1
- data/bin/jah +4 -2
- data/jah.gemspec +73 -21
- data/lib/jah/act_pkg/apt.rb +13 -0
- data/lib/jah/act_pkg/base.rb +17 -0
- data/lib/jah/act_pkg/emerge.rb +4 -0
- data/lib/jah/act_pkg/pacman.rb +59 -0
- data/lib/jah/act_pkg/pkg.rb +52 -0
- data/lib/jah/act_pkg/ports.rb +9 -0
- data/lib/jah/act_pkg/slack.rb +8 -0
- data/lib/jah/act_pkg/urpm.rb +7 -0
- data/lib/jah/act_pkg/yum.rb +31 -0
- data/lib/jah/act_pkg/zypp.rb +12 -0
- data/lib/jah/act_pkg.rb +41 -0
- data/lib/jah/agent.rb +14 -6
- data/lib/jah/agents/xmpp.rb +164 -23
- data/lib/jah/cli.rb +15 -46
- data/lib/jah/command.rb +10 -5
- data/lib/jah/commands/cpu.rb +38 -0
- data/lib/jah/commands/disk.rb +35 -0
- data/lib/jah/commands/mem.rb +49 -0
- data/lib/jah/{collectors/net.rb → commands/netstat.rb} +11 -9
- data/lib/jah/commands/packages.rb +25 -0
- data/lib/jah/commands/prok.rb +97 -0
- data/lib/jah/commands/services.rb +14 -0
- data/lib/jah/commands/status.rb +1 -41
- data/lib/jah/commands/who.rb +27 -0
- data/lib/jah/history.rb +25 -0
- data/lib/jah/install.rb +12 -18
- data/lib/jah/opt.rb +87 -0
- data/lib/jah/prayer.rb +75 -0
- data/lib/jah.rb +21 -13
- data/lib/locales/en_us.yml +9 -1
- data/lib/locales/pt_br.yml +9 -1
- data/spec/jah/act_pkg/apt_spec.rb +40 -0
- data/spec/jah/act_pkg/pacman_spec.rb +141 -0
- data/spec/jah/act_pkg/pkg_spec.rb +51 -0
- data/spec/jah/act_pkg/ports_spec.rb +36 -0
- data/spec/jah/act_pkg/yum_spec.rb +55 -0
- data/spec/jah/act_pkg_spec.rb +41 -0
- data/spec/jah/agent_spec.rb +8 -0
- data/spec/jah/agents/xmpp_spec.rb +8 -0
- data/spec/jah/cli_spec.rb +47 -0
- data/spec/jah/command_spec.rb +5 -0
- data/spec/jah/commands/cpu_spec.rb +51 -0
- data/spec/jah/commands/disk_spec.rb +49 -0
- data/spec/jah/commands/mem_spec.rb +60 -0
- data/spec/jah/commands/netstat_spec.rb +13 -0
- data/spec/jah/commands/prok_spec.rb +248 -0
- data/spec/jah/commands/who_spec.rb +25 -0
- data/spec/jah/history_spec.rb +35 -0
- data/spec/jah/install_spec.rb +15 -0
- data/spec/jah/opt_spec.rb +37 -0
- data/spec/jah/prayer_spec.rb +8 -0
- data/spec/jah_spec.rb +4 -2
- data/spec/spec_helper.rb +3 -1
- metadata +67 -16
- data/lib/jah/collector.rb +0 -12
- data/lib/jah/collectors/cpu.rb +0 -35
- data/lib/jah/collectors/disk.rb +0 -14
- data/lib/jah/collectors/mem.rb +0 -51
- data/lib/jah/collectors/prok.rb +0 -88
- data/lib/jah/collectors/services.rb +0 -13
- data/lib/jah/collectors/who.rb +0 -20
- data/lib/jah/commands/pub.rb +0 -34
- data/lib/jah/god.rb +0 -24
- data/lib/jah.yaml.template +0 -26
data/lib/jah/commands/status.rb
CHANGED
@@ -3,58 +3,18 @@ module Jah
|
|
3
3
|
class Status
|
4
4
|
include Command
|
5
5
|
register(:ok, 'ok\??$')
|
6
|
-
register(:who, 'who\??$')
|
7
|
-
register(:mem, 'mem\??$')
|
8
|
-
register(:cpu, 'cpu\??$')
|
9
|
-
register(:net, 'net\??$')
|
10
|
-
register(:disk, 'disk\??$')
|
11
|
-
register(:proks, 'prok$|top$')
|
12
6
|
|
13
7
|
|
14
8
|
class << self
|
15
9
|
|
16
10
|
def ok
|
17
|
-
I18n.t("states." + case Jah::Cpu.
|
11
|
+
I18n.t("states." + case Jah::Cpu.med
|
18
12
|
when 0..0.5 then :green
|
19
13
|
when 0.51..0.7 then :yellow
|
20
14
|
else :red
|
21
15
|
end.to_s)
|
22
16
|
end
|
23
17
|
|
24
|
-
def mem
|
25
|
-
Mem.get.percent.to_s + "%"
|
26
|
-
end
|
27
|
-
|
28
|
-
def cpu
|
29
|
-
Cpu.get.load
|
30
|
-
end
|
31
|
-
|
32
|
-
def net
|
33
|
-
out = ""
|
34
|
-
Net.connections.each do |c|
|
35
|
-
out << "#{c[0]} => #{c[1]} connections\n"
|
36
|
-
end
|
37
|
-
out << "Total: #{Net.count}"
|
38
|
-
end
|
39
|
-
|
40
|
-
def disk
|
41
|
-
Disk.all.map do |d|
|
42
|
-
"\n*#{d[:path]}* => #{d[:percent]}"
|
43
|
-
end.join("\n")
|
44
|
-
end
|
45
|
-
|
46
|
-
def who
|
47
|
-
Who.all.map do |w|
|
48
|
-
"#{w[:who]} Logado via #{w[:terminal]} desde a data: #{w[:date]}"
|
49
|
-
end.join("\n")
|
50
|
-
end
|
51
|
-
|
52
|
-
def proks(find = nil)
|
53
|
-
Ps.all.map do |p|
|
54
|
-
next if find && p.comm !~ /#{find}/i
|
55
|
-
"#{p.comm} => #{p.mem}\n"
|
56
|
-
end
|
57
|
-
end
|
58
18
|
|
59
19
|
end
|
60
20
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Jah
|
2
|
+
|
3
|
+
class Who
|
4
|
+
include Command
|
5
|
+
register(:snap, 'who\??$')
|
6
|
+
|
7
|
+
def self.snap
|
8
|
+
all.map do |w|
|
9
|
+
"#{w[:who]} Logado via #{w[:terminal]} desde a data: #{w[:date]}"
|
10
|
+
end.join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.all
|
14
|
+
@who = `who`.to_a.map do |l|
|
15
|
+
l = l.split(" ")
|
16
|
+
|
17
|
+
hash = {}
|
18
|
+
|
19
|
+
hash[:who] = l[0]
|
20
|
+
hash[:tty] = l[1]
|
21
|
+
2.times{ l.delete(l[0]) }
|
22
|
+
hash[:date] = l.join(" ")
|
23
|
+
hash
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/jah/history.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Jah
|
2
|
+
|
3
|
+
class History
|
4
|
+
|
5
|
+
@cache = []
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def set(jid, body, time = Time.now)
|
10
|
+
@cache << [jid, body, time]
|
11
|
+
end
|
12
|
+
alias :add :set
|
13
|
+
|
14
|
+
def all(filter = nil)
|
15
|
+
filter ? @cache.select { |i| i[0] =~ /#{filter}/ } : @cache
|
16
|
+
end
|
17
|
+
|
18
|
+
# delegate?
|
19
|
+
def method_missing(*meth)
|
20
|
+
@cache.send(*meth)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/jah/install.rb
CHANGED
@@ -16,20 +16,16 @@ module Jah
|
|
16
16
|
|
17
17
|
Hello, thanks for trying Jah!
|
18
18
|
|
19
|
-
Looks like #{
|
19
|
+
Looks like #{Opt.hostname} doesn`t have a config file, shall we create one?
|
20
20
|
|
21
21
|
Jah needs to know how it will run: xmpp, post or dump.
|
22
22
|
|
23
23
|
END_MODE
|
24
24
|
mode = nil
|
25
25
|
print "Enter mode: "
|
26
|
-
while mode
|
27
|
-
|
28
|
-
|
29
|
-
when /post/i then :post
|
30
|
-
when /dumpp/i then :dump
|
31
|
-
else print "Valid: xmpp, post or dump: "; nil
|
32
|
-
end
|
26
|
+
while mode !~ /xmpp|post|dump/i
|
27
|
+
print "Valid: xmpp, post or dump: "
|
28
|
+
mode = gets.strip
|
33
29
|
end
|
34
30
|
@config[:mode] = mode
|
35
31
|
end
|
@@ -122,7 +118,7 @@ Use commas to separate multiple ones.
|
|
122
118
|
|
123
119
|
END_INTRO
|
124
120
|
print "ACL: "
|
125
|
-
@config[:acl] = gets.strip
|
121
|
+
@config[:acl] = gets.split(",").map(&:strip)
|
126
122
|
end
|
127
123
|
|
128
124
|
#
|
@@ -139,7 +135,7 @@ Use commas to separate multiple ones.
|
|
139
135
|
|
140
136
|
END_INTRO
|
141
137
|
print "Groups: "
|
142
|
-
@config[:groups] = gets.strip
|
138
|
+
@config[:groups] = gets.split(",").map(&:strip)
|
143
139
|
end
|
144
140
|
|
145
141
|
|
@@ -239,9 +235,9 @@ Available options:
|
|
239
235
|
* #{locs.join("\n* ")}
|
240
236
|
|
241
237
|
END_I18N
|
242
|
-
print "Choose one (#{
|
238
|
+
print "Choose one (#{Opt.locale}): "
|
243
239
|
@config[:i18n] = gets.to_s.strip.downcase
|
244
|
-
@config[:i18n] =
|
240
|
+
@config[:i18n] = Opt.locale if @config[:i18n] == ""
|
245
241
|
end
|
246
242
|
|
247
243
|
#
|
@@ -279,11 +275,9 @@ END_ERROR
|
|
279
275
|
|
280
276
|
def write_down
|
281
277
|
outfile = "jah.yaml"
|
282
|
-
template = File.read(File.join(File.dirname(__FILE__), '..', 'jah.yaml.template'))
|
283
278
|
@outfile = File.writable?("/etc/") ? "/etc/" + outfile : HOME + outfile
|
284
279
|
puts "Writing config to #{@outfile}.."
|
285
|
-
@
|
286
|
-
File.open(@outfile, "w") { |f| f.write template }
|
280
|
+
File.open(@outfile, "w") { |f| f.write @config.to_yaml }
|
287
281
|
end
|
288
282
|
|
289
283
|
def initialize
|
@@ -291,14 +285,14 @@ END_ERROR
|
|
291
285
|
puts "No config file found.. running install.."
|
292
286
|
|
293
287
|
@config = {}
|
294
|
-
@config[:host] =
|
288
|
+
@config[:host] = Opt.hostname
|
295
289
|
get_mode
|
296
|
-
if @config[:mode] ==
|
290
|
+
if @config[:mode] == 'xmpp'
|
297
291
|
@config[:host] = ''
|
298
292
|
get_jid
|
299
293
|
get_pass
|
300
294
|
end
|
301
|
-
if @config[:mode] ==
|
295
|
+
if @config[:mode] == 'post'
|
302
296
|
@config[:jid] = ''
|
303
297
|
get_key
|
304
298
|
end
|
data/lib/jah/opt.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Jah
|
4
|
+
|
5
|
+
HOME = ENV['HOME'] + "/.jah/"
|
6
|
+
unless File.exists? HOME
|
7
|
+
FileUtils.mkdir_p HOME
|
8
|
+
end
|
9
|
+
|
10
|
+
I18n.default_locale = "en_us"
|
11
|
+
|
12
|
+
Log = Logger.new(HOME + "jah.log")
|
13
|
+
def Log.write(d); self.warn(d); end
|
14
|
+
# $stderr = Log
|
15
|
+
|
16
|
+
# Opt = {}
|
17
|
+
OptBackup = {}
|
18
|
+
|
19
|
+
class Opt
|
20
|
+
@hash = {}
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def hash
|
24
|
+
@hash
|
25
|
+
end
|
26
|
+
|
27
|
+
def defaults
|
28
|
+
{ :mode => "xmpp", :daemon => false, :port => 5222 }
|
29
|
+
end
|
30
|
+
|
31
|
+
def hostname
|
32
|
+
@hostame ||= `hostname`.chomp.gsub(/\W/, "") rescue "jah#{rand(42000)}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def locale
|
36
|
+
@locale ||= `locale | grep LANG`.scan(/LANG=(.*)\./)[0][0].downcase rescue "en_us"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Load config [., ~/.jah, /etc]
|
40
|
+
def autoload_config(options)
|
41
|
+
conf = "jah.yaml"
|
42
|
+
unless file = options[:config]
|
43
|
+
if file = [nil, HOME, "/etc/"].select { |c| File.exists? "#{c}#{conf}" }[0]
|
44
|
+
file << conf
|
45
|
+
options[:config] = file
|
46
|
+
end
|
47
|
+
end
|
48
|
+
options = YAML.load(File.read(file)).merge!(options) if file rescue nil
|
49
|
+
|
50
|
+
I18n.locale = options[:i18n] if options[:i18n]
|
51
|
+
options[:groups] ||= []
|
52
|
+
|
53
|
+
@hash.merge!(defaults )
|
54
|
+
@hash.merge!(options)
|
55
|
+
OptBackup.merge!(@hash)
|
56
|
+
end
|
57
|
+
|
58
|
+
def closing_time!
|
59
|
+
if @hash != OptBackup
|
60
|
+
puts "Writing config..."
|
61
|
+
File.open(@hash[:config], "w+") do |f|
|
62
|
+
f.write "# Auto generated on #{Time.now}"
|
63
|
+
f.write @hash.to_yaml
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def [](val); @hash[val]; end
|
69
|
+
def []=(key, val); @hash[key] = val; end
|
70
|
+
def merge!(val); @hash.merge!(val); end
|
71
|
+
|
72
|
+
def method_missing(*meth)
|
73
|
+
key = meth[0].to_s.gsub(/\?|=/, "").to_sym
|
74
|
+
if val = meth[1]
|
75
|
+
@hash[key] = val
|
76
|
+
elsif !(val = @hash[key]).nil?
|
77
|
+
val
|
78
|
+
else
|
79
|
+
raise "No method #{ val} #{key}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/lib/jah/prayer.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
module Jah
|
2
|
+
|
3
|
+
class Prayer
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
|
+
setup
|
8
|
+
ping
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.watch(options = {})
|
12
|
+
|
13
|
+
God.watch do |w|
|
14
|
+
w.name = "jah"
|
15
|
+
w.interval = 1.minute
|
16
|
+
w.start = "jah #{options[:config]}"
|
17
|
+
w.start_grace = 10.seconds
|
18
|
+
w.restart_grace = 10.seconds
|
19
|
+
|
20
|
+
w.start_if do |start|
|
21
|
+
start.condition(:process_running) do |c|
|
22
|
+
c.running = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
w.restart_if do |restart|
|
27
|
+
restart.condition(:memory_usage) do |c|
|
28
|
+
c.above = 30.megabytes
|
29
|
+
c.times = [3, 5]
|
30
|
+
end
|
31
|
+
|
32
|
+
restart.condition(:cpu_usage) do |c|
|
33
|
+
c.above = 25.percent
|
34
|
+
c.times = 5
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
w.lifecycle do |on|
|
39
|
+
on.condition(:flapping) do |c|
|
40
|
+
c.to_state = [:start, :restart]
|
41
|
+
c.times = 5
|
42
|
+
c.within = 5.minute
|
43
|
+
c.transition = :unmonitored
|
44
|
+
c.retry_in = 10.minutes
|
45
|
+
c.retry_times = 5
|
46
|
+
c.retry_within = 2.hours
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def setup
|
53
|
+
DRb.start_service
|
54
|
+
@server = DRbObject.new(nil, God::Socket.socket(@config['god_port'])) || nil
|
55
|
+
rescue => e
|
56
|
+
@config[:god] = false
|
57
|
+
end
|
58
|
+
|
59
|
+
# ping server to ensure that it is responsive
|
60
|
+
def ping
|
61
|
+
if god?
|
62
|
+
tries = 3
|
63
|
+
begin
|
64
|
+
@server.ping
|
65
|
+
rescue Exception => e
|
66
|
+
retry if (tries -= 1) > 1
|
67
|
+
raise e, "The server is not available (or you do not have permissions to access it)"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
data/lib/jah.rb
CHANGED
@@ -1,26 +1,34 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'optparse'
|
3
|
-
|
3
|
+
begin
|
4
|
+
require 'i18n'
|
5
|
+
rescue LoadError
|
6
|
+
puts "Gem i18n not found. Try `gem install i18n`"
|
7
|
+
end
|
4
8
|
#autoload :Drb, 'drb'
|
5
|
-
|
9
|
+
require 'jah/opt'
|
6
10
|
require 'jah/cli'
|
7
11
|
require 'jah/install'
|
8
12
|
require 'jah/agent'
|
9
|
-
require 'jah/
|
10
|
-
|
11
|
-
|
12
|
-
require "jah/collectors/net"
|
13
|
-
require "jah/collectors/disk"
|
14
|
-
require "jah/collectors/prok"
|
15
|
-
require "jah/collectors/net"
|
16
|
-
require "jah/collectors/who"
|
13
|
+
require 'jah/history'
|
14
|
+
autoload :God, 'god'
|
15
|
+
autoload :Prayer, "jah/prayer"
|
17
16
|
require 'jah/command'
|
17
|
+
require "jah/commands/mem"
|
18
|
+
require "jah/commands/cpu"
|
19
|
+
require "jah/commands/who"
|
20
|
+
require "jah/commands/disk"
|
21
|
+
require "jah/commands/prok"
|
22
|
+
require "jah/commands/netstat"
|
18
23
|
require "jah/commands/admin"
|
19
24
|
require "jah/commands/status"
|
20
25
|
require "jah/commands/extra"
|
21
|
-
require "jah/commands/
|
26
|
+
require "jah/commands/packages"
|
27
|
+
require "jah/act_pkg"
|
28
|
+
require "jah/act_pkg/base"
|
29
|
+
require "jah/act_pkg/pkg"
|
22
30
|
|
23
31
|
module Jah
|
24
|
-
VERSION =
|
25
|
-
|
32
|
+
VERSION = File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
|
33
|
+
I18n.load_path += Dir[File.join(File.dirname(__FILE__), 'locales', "*.{rb,yml}")]
|
26
34
|
end
|
data/lib/locales/en_us.yml
CHANGED
data/lib/locales/pt_br.yml
CHANGED
@@ -1,2 +1,10 @@
|
|
1
1
|
pt_br:
|
2
|
-
fail: Falhou..
|
2
|
+
fail: Falhou..
|
3
|
+
exit_code: Comando não fechou bem...
|
4
|
+
access_fail: Você não tem permissão!
|
5
|
+
ok: Ok!
|
6
|
+
no_sudo: sudo desabilitado!
|
7
|
+
states:
|
8
|
+
green: Tudo nos padrões...
|
9
|
+
yellow: Começo a me preocupar...
|
10
|
+
red: Sistema bem carregado!
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require "jah/act_pkg/apt"
|
3
|
+
|
4
|
+
describe Apt do
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
AP = <<APT
|
17
|
+
Desired=Unknown/Install/Remove/Purge/Hold
|
18
|
+
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|
19
|
+
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
|
20
|
+
||/ Name Version Description
|
21
|
+
+++-=============================================================-=========================================-=======================================================
|
22
|
+
ii ack-grep 1.80-1 A grep-like program specifically for large source trees
|
23
|
+
ii acl 2.2.47-2 Access control list utilities
|
24
|
+
ii acpi-support 0.121 scripts for handling many ACPI events
|
25
|
+
ii acpid 1.0.6-9ubuntu4.9.04.3 Utilities for using ACPI power management
|
26
|
+
ii adduser 3.110ubuntu5 add and remove users and groups
|
27
|
+
ii adobe-certs 1.5.8870 Certificates distributed by Adobe Systems.
|
28
|
+
ii adobe-flashplugin 10.0.32.18-1jaunty1 Adobe Flash Player plugin version 10
|
29
|
+
ii adobeair1.0 1.5.2.8870 Adobe AIR
|
30
|
+
ii alacarte 0.11.10-0ubuntu1 easy GNOME menu editing tool
|
31
|
+
ii alien 8.73 convert and install rpm and other packages
|
32
|
+
ii alsa-base 1.0.18.dfsg-1ubuntu8 ALSA driver configuration files
|
33
|
+
ii alsa-utils 1.0.18-1ubuntu11 ALSA utilities
|
34
|
+
ii amarok 2:2.0.2mysql5.1.30-0ubuntu3 easy to use media player based on the KDE 4 technology
|
35
|
+
ii amarok-common 2:2.0.2mysql5.1.30-0ubuntu3
|
36
|
+
ii bind9-host 1:9.5.1.dfsg.P2-1ubuntu0.1
|
37
|
+
APT
|
38
|
+
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require "jah/act_pkg/pacman"
|
3
|
+
|
4
|
+
describe Pacman do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@pac ||= Pacman.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "Searching" do
|
11
|
+
before do
|
12
|
+
@pac.should_receive(:"`").with("pacman -Ss ruby").and_return(SS)
|
13
|
+
@pac.should_receive(:"`").with("pacman -Q").and_return(QL)
|
14
|
+
@pkgs = @pac.search("ruby")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find pkgs" do
|
18
|
+
first = @pkgs[0]
|
19
|
+
first.name.should eql("ruby")
|
20
|
+
first.desc.should eql("An object-oriented language for quick and easy programming")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should work nicely" do
|
24
|
+
@pkgs[1].name.should eql("ruby-docs")
|
25
|
+
@pkgs[1].desc.should eql("Documentation files for ruby")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should have ruby" do
|
29
|
+
@pkgs[0].should be_installed
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not be installed" do
|
33
|
+
@pkgs[1].should_not be_installed
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should install if I want" do
|
37
|
+
Pacman.should_receive(:new).and_return(@pac)
|
38
|
+
@pac.should_receive(:"`").with("pacman -Sy --noconfirm ruby")
|
39
|
+
@pkgs[0].install
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should install stuff" do
|
45
|
+
@pac.should_receive(:"`").with("pacman -Sy --noconfirm foo")
|
46
|
+
@pac.install mock(Pkg, :name => "foo")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should list pkgs" do
|
50
|
+
@pac.should_receive(:"`").with("pacman -Q").and_return(QL)
|
51
|
+
@pac.all.first.should be_instance_of(Pkg)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
describe "List" do
|
56
|
+
|
57
|
+
before do
|
58
|
+
@pac.stub!(:"`").and_return(QL)
|
59
|
+
@pkgs = @pac.all
|
60
|
+
@ruby = @pkgs[11]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should have name" do
|
64
|
+
@pkgs[0].name.should eql("a2ps")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should have version" do
|
68
|
+
@pkgs[0].version.should eql("4.14-1")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should fetch info about a pkg" do
|
72
|
+
@ruby.info.should be_instance_of Hash #("http://www.ruby-lang.org/en/")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should fetch url" do
|
76
|
+
@ruby.url.should eql("http://www.ruby-lang.org/en/")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should fetch arch" do
|
80
|
+
@ruby.arch.should eql("i686")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should fetch desc" do
|
84
|
+
@ruby.desc.should eql("An object-oriented language for quick and easy programming")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should fetch license" do
|
88
|
+
@ruby.license.should eql("custom")
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
SS = <<SS
|
94
|
+
extra/ruby 1.8.7_p174-1 [4.67 MB]
|
95
|
+
An object-oriented language for quick and easy programming
|
96
|
+
extra/ruby-docs 1.8.7_p174-1 [0.87 MB]
|
97
|
+
Documentation files for ruby
|
98
|
+
SS
|
99
|
+
|
100
|
+
QL = <<QL
|
101
|
+
a2ps 4.14-1
|
102
|
+
a52dec 0.7.4-4
|
103
|
+
acl 2.2.47-2
|
104
|
+
alsa-lib 1.0.21.a-1
|
105
|
+
ca-certificates 20090709-1
|
106
|
+
couchdb-svn 784601-1
|
107
|
+
emacs-cvs 20090730-1
|
108
|
+
emacs-magit-git 20090811-1
|
109
|
+
flashplugin 10.0.32.18-1.1
|
110
|
+
hal-info 0.20090716-2
|
111
|
+
libmad 0.15.1b-4
|
112
|
+
ruby 1.8.7_p174-1
|
113
|
+
xz-utils 4.999.9beta-1
|
114
|
+
QL
|
115
|
+
|
116
|
+
QI = <<QI
|
117
|
+
Name : ruby
|
118
|
+
Version : 1.8.7_p174-1
|
119
|
+
URL : http://www.ruby-lang.org/en/
|
120
|
+
Licenses : custom
|
121
|
+
Groups : None
|
122
|
+
Provides : None
|
123
|
+
Depends On : gdbm>=1.8.3 db>=4.7.25 openssl>=0.9.8k zlib>=1.2.3.3 readline>=6
|
124
|
+
Optional Deps : None
|
125
|
+
Required By : rubygems shoes
|
126
|
+
Conflicts With : None
|
127
|
+
Replaces : None
|
128
|
+
Installed Size : 11308.00 K
|
129
|
+
Packager : Allan McRae <allan@archlinux.org>
|
130
|
+
Architecture : i686
|
131
|
+
Build Date : Mon 20 Jul 2009 12:29:57 AM BRT
|
132
|
+
Install Date : Thu 23 Jul 2009 10:47:30 PM BRT
|
133
|
+
Install Reason : Explicitly installed
|
134
|
+
Install Script : No
|
135
|
+
Description : An object-oriented language for quick and easy programming
|
136
|
+
|
137
|
+
|
138
|
+
QI
|
139
|
+
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Pkg do
|
4
|
+
|
5
|
+
it "should instantiate" do
|
6
|
+
Pkg.new(:installed, "ruby", "1.9.1").should be_valid
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "One pkg" do
|
10
|
+
before do
|
11
|
+
@pkg = Pkg.new(:installed, "jah", "1.0.0", "Talk to your machines.")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have a name" do
|
15
|
+
@pkg.name.should eql("jah")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a version" do
|
19
|
+
@pkg.version.should eql("1.0.0")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have a description" do
|
23
|
+
@pkg.desc.should eql("Talk to your machines.")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should have a installed meth" do
|
27
|
+
@pkg.should be_installed
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should check equality with others" do
|
31
|
+
pkg2 = Pkg.new(:installed, "foo", "2.5b")
|
32
|
+
@pkg.should_not == pkg2
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should check equality with others 2" do
|
36
|
+
pkg2 = Pkg.new(:installed, "jah", "1.0.0")
|
37
|
+
@pkg.should == pkg2
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should compare version" do
|
41
|
+
pkg2 = Pkg.new(:installed, "jah", "1.0.1")
|
42
|
+
@pkg.should be < pkg2
|
43
|
+
pkg2.should be > @pkg
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should not compare diff pkgs" do
|
47
|
+
pkg2 = Pkg.new(:installed, "foo", "1.0.1")
|
48
|
+
lambda { pkg2 > @pkg }.should raise_error
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|