rubicante 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ === 0.0.4 / 200-04-10
2
+
3
+ * More gem manifest fixes
4
+
1
5
  === 0.0.3 / 2009-04-10
2
6
 
3
7
  * Fix broken gem
@@ -8,3 +8,20 @@ lib/os_functions.rb
8
8
  lib/rubicante.rb
9
9
  lib/rubicante/cli.rb
10
10
  lib/rubicante/environment.rb
11
+ lib/rubicante/host.rb
12
+ lib/rubicante/host_error.rb
13
+ lib/rubicante/host_group.rb
14
+ lib/rubicante/type.rb
15
+ lib/rubicante/type_group.rb
16
+ lib/rubicante/website.rb
17
+ lib/rubicante/website_error.rb
18
+ spec/environment_spec.rb
19
+ spec/helper.rb
20
+ spec/host_error_spec.rb
21
+ spec/host_group_spec.rb
22
+ spec/host_spec.rb
23
+ spec/type_group_spec.rb
24
+ spec/type_spec.rb
25
+ spec/website_error_spec.rb
26
+ spec/website_spec.rb
27
+ test/test_rubicante.rb
@@ -2,5 +2,5 @@
2
2
  #require 'rubicante/type_group'
3
3
 
4
4
  class Rubicante
5
- VERSION = '0.0.3'
5
+ VERSION = '0.0.4'
6
6
  end
@@ -0,0 +1,183 @@
1
+ require 'rubicante/website'
2
+ require 'rubicante/host_error'
3
+
4
+ require 'logging'
5
+ require 'ping'
6
+ require 'socket'
7
+
8
+ require 'os_functions'
9
+ include OsFunctions
10
+ require 'win32ole' if is_windows?
11
+
12
+ module Rubicante
13
+ class Host
14
+ include OsFunctions
15
+
16
+ attr_reader :name
17
+ attr_accessor :ports, :services, :types, :websites
18
+
19
+ def initialize(name)
20
+ @name = name
21
+ @ports = []
22
+ @services = []
23
+ @types = []
24
+ @websites = []
25
+
26
+ @log = Logging::Logger[self]
27
+
28
+ # Prepare Website logger
29
+ @appender = Logging::Appender['rubicante']
30
+ Logging::Logger['Rubicante::Website'].add_appenders(Logging::Appender['rubicante']) if not @appender.nil?
31
+ Logging::Logger['Rubicante::Website'].level = @log.level
32
+ end
33
+
34
+ def ping
35
+ @log.debug "Performing TCP echo ping on host '#{@name}'"
36
+ Ping.pingecho @name
37
+ end
38
+
39
+ def port(port_number)
40
+ @ports << port_number
41
+ self
42
+ end
43
+
44
+ def service(service_name)
45
+ @services << service_name
46
+ self
47
+ end
48
+
49
+ def type(type_name)
50
+ @types << type_name
51
+ self
52
+ end
53
+
54
+ def website(website_url)
55
+ @websites << Website.new(website_url)
56
+ self
57
+ end
58
+
59
+ # Check if the specified port is active by connecting to it
60
+ def check_port(port)
61
+ port_output = "#{@name}:#{port}"
62
+
63
+ @log.debug "Checking port #{port_output}..."
64
+
65
+ begin
66
+ test = TCPSocket.open(@name, port)
67
+ @log.debug "Port #{port_output} looks good"
68
+ return true # if we get here, the socket opened
69
+ rescue
70
+ @log.debug "Port #{port_output} raised an exception when opening"
71
+ return false # if we get here, there are problems with the port
72
+ end
73
+ end
74
+
75
+ # Iterates through all the ports in the Host and runs check_port(port)
76
+ # against them.
77
+ #
78
+ # == Yields: port, is_alive
79
+ #
80
+ # Each registered port is yielded along with the boolean result from
81
+ # check_port(port).
82
+ #
83
+ # == Example:
84
+ #
85
+ # host = Rubicante::Host.new("test-host")
86
+ # host.port(80)
87
+ # host.port(443)
88
+ #
89
+ # host.check_ports do |port, response|
90
+ # puts "Port #{port} is UP" if response
91
+ # puts "Port #{port} is DOWN" if not response
92
+ # end
93
+ def check_ports
94
+ @ports.each do |port|
95
+ yield port, check_port(port)
96
+ end
97
+ end
98
+
99
+ # Iterates through all the websites in the Host and runs
100
+ # wrong? against them looking for problems. If a problem is
101
+ # found, a Hash of the URL and the HTTP Status code is yielded.
102
+ #
103
+ # == Yields: a Hash
104
+ #
105
+ # {
106
+ # :url => String, # the URL of the current website in the block
107
+ # :code => String # the HTTP Status code of the check (i.e., 404, 500, etc.)
108
+ # }
109
+ #
110
+ # == Example
111
+ #
112
+ # host = Rubicante::Host.new("test-host")
113
+ # host.website('www.exmaple.com')
114
+ # host.website('www.rubicante.com')
115
+ # host.website('www.openbsd.org')
116
+ #
117
+ # host.check_websites do |result|
118
+ # puts "Website #{result[:url]} failed with code #{result[:code]}!"
119
+ # end
120
+ def check_websites
121
+ @log.debug "Checking websites registered to host '#{@name}'"
122
+ @websites.each do |website|
123
+ yield website.wrong?
124
+ end
125
+ end
126
+
127
+ def wrong?
128
+ @log.debug "Determing what is wrong with host '#{@name}'"
129
+ result = HostError.new(@name)
130
+ result.ping = self.ping
131
+
132
+ # If the host is alive, continue testing
133
+ if result.ping
134
+ check_ports do |port, response|
135
+ result.bad_ports << port if not response
136
+ end
137
+
138
+ check_websites do |website_error|
139
+ result.add(website_error)
140
+ end
141
+
142
+ if is_windows?
143
+ check_services do |service, response|
144
+ result.bad_services << service if not response
145
+ end
146
+ end
147
+ end
148
+
149
+ return result
150
+ end
151
+
152
+ ###
153
+ # Windows-specific functions
154
+ ###
155
+ if is_windows?
156
+ def get_wmi
157
+ WIN32OLE.connect("winmgmts://#{@name}")
158
+ end
159
+
160
+ # Checks the host to see if the specified service is running
161
+ def is_running?(service)
162
+ query = "SELECT Name, State FROM Win32_Service WHERE Name='#{service}'"
163
+
164
+ result = false
165
+ service_label = "#{@name}->#{service}"
166
+
167
+ @log.debug "Checking services #{service_label}..."
168
+ get_wmi.ExecQuery(query).each do |result|
169
+ @log.debug "#{service_label}.State == #{result.State}"
170
+ result = true if result.State = 'Running'
171
+ end
172
+
173
+ return result
174
+ end
175
+
176
+ def check_services
177
+ @services.each do |service|
178
+ yield service, is_running?(service)
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,22 @@
1
+ require 'rubicante/website_error'
2
+
3
+ module Rubicante
4
+ class HostError
5
+ attr_reader :hostname, :website_errors
6
+ attr_accessor :bad_ports, :bad_services, :ping
7
+
8
+ def initialize(hostname)
9
+ @hostname = hostname
10
+ @ping = false
11
+ @bad_ports = []
12
+ @bad_services = []
13
+ @website_errors = []
14
+ end
15
+
16
+ def add(error)
17
+ if error.kind_of? WebsiteError
18
+ @website_errors << error
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'singleton'
2
+ require 'rubicante/host'
3
+
4
+ module Rubicante
5
+ class HostGroup
6
+ include Singleton
7
+
8
+ attr_reader :hosts
9
+
10
+ def initialize
11
+ @hosts = {}
12
+ end
13
+
14
+ def [](hostname)
15
+ @hosts[hostname] ||= Host.new(hostname)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module Rubicante
2
+ class Type
3
+ attr_reader :name
4
+ attr_accessor :ports, :services
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ @ports = []
9
+ @services = []
10
+ end
11
+
12
+ def port(new_port)
13
+ @ports << new_port
14
+ end
15
+
16
+ def service(new_service)
17
+ @services << new_service
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ require 'singleton'
2
+ require 'rubicante/type'
3
+
4
+ module Rubicante
5
+ class TypeGroup
6
+ include Singleton
7
+
8
+ attr_accessor :types
9
+
10
+ def initialize
11
+ @types = {}
12
+ end
13
+
14
+ def [](type_name)
15
+ @types[type_name] ||= Type.new(type_name)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,54 @@
1
+ require 'rubicante/website_error'
2
+
3
+ require 'logging'
4
+ require 'net/http'
5
+
6
+ module Rubicante
7
+ class Website
8
+ attr_reader :url
9
+
10
+ def initialize(url)
11
+ @url = url
12
+
13
+ @log = Logging::Logger[self]
14
+ end
15
+
16
+ # Determines whether or not the site OK based on the HTTP Status code
17
+ #
18
+ # == DETERMINING IF A SITE IS OK
19
+ #
20
+ # When performing an HTTP GET on the root, if a 2xx (HTTP OK) or
21
+ # 3xx (HTTP Redirect) response is received, the method considers the
22
+ # site to be workinging nominally and returns *true*
23
+ #
24
+ # However, if a 4xx (HTTP Client Error) or 5xx (HTTP Server Error)
25
+ # response is received, the method considers the site to be working
26
+ # abnormally and returns *false*
27
+ def is_ok?
28
+ result = false
29
+
30
+ result = true if response_code.match(/^(2|3)/)
31
+
32
+ return result
33
+ end
34
+
35
+ # Performs and HTTP GET on the URL's root ('/') and returns the
36
+ # HTTP Status code
37
+ def response_code
38
+ @log.debug "Retreiving HTTP Code for website '#{@url}'"
39
+ result = Net::HTTP.get_response(@url, '/').code
40
+ @log.debug "Received HTTP Code #{result} for website '#{@url}'"
41
+
42
+ return result
43
+ end
44
+
45
+ # Checks to see if the site is OK. If it is not, it returns
46
+ # a Rubicante::WebsiteError
47
+ def wrong?
48
+ @log.debug "Checking website '#{@url}' for problems"
49
+ if not self.is_ok?
50
+ WebsiteError.new(@url, self.response_code)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,10 @@
1
+ module Rubicante
2
+ class WebsiteError
3
+ attr_reader :code, :url
4
+
5
+ def initialize(url, code)
6
+ @url = url
7
+ @code = code
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,84 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/environment"
3
+
4
+ describe "A Rubicante environment" do
5
+ before :all do
6
+ Net::HTTP.stub!(:get_response).and_return(Net::HTTPServerError.new('1', '500', 'Internal Server Error'))
7
+ end
8
+
9
+ before :each do
10
+ @env = Rubicante::Environment.new
11
+ end
12
+
13
+ it "should exist" do
14
+ @env.should_not be_nil
15
+ @env.should be_an_instance_of(Rubicante::Environment)
16
+ end
17
+
18
+ it "should have a HostGroup" do
19
+ @env.host.should be_an_instance_of(Rubicante::HostGroup)
20
+ end
21
+
22
+ it "should have an empty HostGroup by default" do
23
+ @env.host.hosts.should == {}
24
+ end
25
+
26
+ it "should have a wrong? method" do
27
+ @env.respond_to?('wrong?').should == true
28
+ end
29
+
30
+ it "should return an array of HostErrors" do
31
+ @env.wrong? do |result|
32
+ result.should be_an_instance_of(Array)
33
+ result[0].should be_an_instance_of(Rubicante::HostError)
34
+ end
35
+ end
36
+
37
+ it "should have an eval_host method" do
38
+ @env.respond_to?('eval_host').should == true
39
+ end
40
+
41
+ it "should handle 'Host webservice provides website ...'" do
42
+ hostname = 'webservice'
43
+ url = 'www.rubicante-example.com'
44
+ cmd = "Host #{hostname} provides website #{url}"
45
+ @env.eval_host(cmd)
46
+ @env.host[hostname].websites[0].url.should == url
47
+ end
48
+
49
+ it "should handle specifying multiple websites" do
50
+ hostname = 'www2'
51
+ url0 = 'test1'
52
+ url1 = 'test2'
53
+ cmd = "Host #{hostname} provides website #{url0}, provides website #{url1}"
54
+ @env.eval_host(cmd)
55
+ @env.host[hostname].websites[0].url.should == url0
56
+ @env.host[hostname].websites[1].url.should == url1
57
+ end
58
+
59
+ it "should have an eval_command method" do
60
+ @env.respond_to?('eval_command').should == true
61
+ end
62
+
63
+ it "should raise a NotImplementedError for unknown commands" do
64
+ lambda { @env.eval_command('whumpus frumpus') }.should raise_error(NotImplementedError)
65
+ end
66
+
67
+ it "should handle 'host' commands" do
68
+ lambda { @env.eval_command('host frank') }.should_not raise_error(NotImplementedError)
69
+ end
70
+
71
+ it "should have an eval_what method" do
72
+ @env.respond_to?('eval_what').should == true
73
+ end
74
+
75
+ it "should handle 'what' commands" do
76
+ lambda { @env.eval_command('What is wrong') }.should_not raise_error(NotImplementedError)
77
+ end
78
+
79
+ after :each do
80
+ # Clean up the HostGroup instance's hash so that other specs will
81
+ # run properly
82
+ @env.host.hosts.clear
83
+ end
84
+ end
@@ -0,0 +1,3 @@
1
+ require "spec"
2
+
3
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)), *%w[.. lib rubicante])
@@ -0,0 +1,71 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/host_error"
3
+
4
+ describe "An error with a host" do
5
+ before :all do
6
+ @url = "http://www.rubicante-example.com/"
7
+ @code = "500"
8
+ @website_error = Rubicante::WebsiteError.new(@url, @code)
9
+ end
10
+
11
+ before :each do
12
+ @host_error = Rubicante::HostError.new("test-host")
13
+ end
14
+
15
+ it "should exist" do
16
+ @host_error.should_not be_nil
17
+ @host_error.should be_an_instance_of(Rubicante::HostError)
18
+ end
19
+
20
+ it "should require an argument at initialization" do
21
+ lambda { Rubicante::HostError.new }.should raise_error(ArgumentError)
22
+ end
23
+
24
+ it "should now allow changing of hostname after initialization" do
25
+ lambda { @host_error.hostname = "new-host-name" }.should raise_error(NoMethodError)
26
+ end
27
+
28
+ it "should have an empty array of website errors" do
29
+ @host_error.website_errors.should == []
30
+ end
31
+
32
+ it "should allow adding of new website errors with add" do
33
+ @host_error.add(@website_error)
34
+ @host_error.website_errors.include?(@website_error).should == true
35
+ end
36
+
37
+ it "should have an ping value" do
38
+ @host_error.respond_to?('ping').should == true
39
+ end
40
+
41
+ it "ping should be false by default" do
42
+ @host_error.ping.should == false
43
+ end
44
+
45
+ it "should allow changin the ping value" do
46
+ @new_ping = true
47
+ @host_error.ping.should_not == @new_ping
48
+ @host_error.ping = @new_ping
49
+ @host_error.ping.should == @new_ping
50
+ end
51
+
52
+ it "should have an empty array of bad_ports by default" do
53
+ @host_error.bad_ports.should == []
54
+ end
55
+
56
+ it "should allow appending to bad_ports" do
57
+ new_bad_port = 80
58
+ @host_error.bad_ports << new_bad_port
59
+ @host_error.bad_ports.include?(new_bad_port).should == true
60
+ end
61
+
62
+ it "should have an empty array of bad_services by default" do
63
+ @host_error.bad_services.should == []
64
+ end
65
+
66
+ it "should allow appending to bad_services" do
67
+ new_bad_service = 'W32Time'
68
+ @host_error.bad_services << new_bad_service
69
+ @host_error.bad_services.include?(new_bad_service).should == true
70
+ end
71
+ end
@@ -0,0 +1,33 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/host_group"
3
+
4
+ describe "A group of hosts" do
5
+ before :each do
6
+ @host_group = Rubicante::HostGroup.instance
7
+ end
8
+
9
+ it "should exist" do
10
+ @host_group.should_not be_nil
11
+ @host_group.should be_an_instance_of(Rubicante::HostGroup)
12
+ end
13
+
14
+ it "should have an empty hash of hosts by default" do
15
+ @host_group.hosts.should == {}
16
+ end
17
+
18
+ it "should create a new host in hosts if it doesn't exist" do
19
+ hostname = "new-host"
20
+ @host_group[hostname].name.should == hostname
21
+ end
22
+
23
+ it "should allow for modifying previously defined hosts" do
24
+ hostname = "new-host"
25
+ new_port = 80
26
+ new_service = "new-service"
27
+
28
+ @host_group[hostname].port(new_port).service(new_service)
29
+
30
+ @host_group[hostname].ports.include?(new_port).should == true
31
+ @host_group[hostname].services.include?(new_service).should == true
32
+ end
33
+ end
@@ -0,0 +1,159 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/host"
3
+
4
+ describe "A newtork host" do
5
+ before :each do
6
+ @host_name = "spec-host"
7
+ @host = Rubicante::Host.new(@host_name)
8
+
9
+ @host_with_sites = Rubicante::Host.new(@host_name)
10
+ @sites = [
11
+ 'www.rubicante-good-site.com',
12
+ 'www.rubicante-bad-site.com',
13
+ 'www.rubicante-worse-site.com',
14
+ 'www.rubicante-redirect.com'
15
+ ]
16
+ @sites.each do |site|
17
+ @host_with_sites.website(site)
18
+ end
19
+
20
+ @host_with_ports = Rubicante::Host.new(@host_name)
21
+ @ports = [80, 22, 443]
22
+ @ports.each do |port|
23
+ @host_with_ports.port(port)
24
+ end
25
+
26
+ Net::HTTP.stub!(:get_response).and_return(Net::HTTPServerError.new('1', '500', 'Internal Server Error'))
27
+ Ping.stub!(:pingecho).and_return(true)
28
+ end
29
+
30
+ it "should exist" do
31
+ @host.should_not be_nil
32
+ @host.should be_an_instance_of(Rubicante::Host)
33
+ end
34
+
35
+ it "should require a name parameter for initialization" do
36
+ lambda { Host.new.should raise_error(ArgumentError) }
37
+ end
38
+
39
+ it "should have an empty array of ports by default" do
40
+ @host.ports.should == []
41
+ end
42
+
43
+ it "should allow adding more ports with port()" do
44
+ port = 12345
45
+ @host.port(port)
46
+ @host.ports.include?(port).should == true
47
+ end
48
+
49
+ it "should return self for port()" do
50
+ @host.port(12345).should be_an_instance_of(Rubicante::Host)
51
+ end
52
+
53
+ it "should have an empty array of services by default" do
54
+ @host.services.should == []
55
+ end
56
+
57
+ it "should allow adding more services with service()" do
58
+ service = "W32Time"
59
+ @host.service(service)
60
+ @host.services.include?(service).should == true
61
+ end
62
+
63
+ it "should return self for service()" do
64
+ @host.service("test").should be_an_instance_of(Rubicante::Host)
65
+ end
66
+
67
+ it "should have an empty array of types" do
68
+ @host.types.should == []
69
+ end
70
+
71
+ it "should allow adding more types with type()" do
72
+ type = "SQL Server"
73
+ @host.type(type)
74
+ @host.types.include?(type).should == true
75
+ end
76
+
77
+ it "should return self for type()" do
78
+ @host.type("testing").should be_an_instance_of(Rubicante::Host)
79
+ end
80
+
81
+ it "should have an empty array of websites by default" do
82
+ @host.websites.should == []
83
+ end
84
+
85
+ it "should allow adding more webistes with site()" do
86
+ url = "http://www.example.com/"
87
+ @host.website(url)
88
+ @host.websites.size.should == 1
89
+ end
90
+
91
+ it "should return self for site()" do
92
+ @host.website("http://www.example.com/").should be_an_instance_of(Rubicante::Host)
93
+ end
94
+
95
+ it "should check all websites" do
96
+ @host_with_sites.check_websites do |result|
97
+ @sites.include?(result.url).should == true
98
+ end
99
+ end
100
+
101
+ it "should return a HostError for wrong?" do
102
+ @host.wrong?.should be_an_instance_of(Rubicante::HostError)
103
+ end
104
+
105
+ it "should return website errors with the HostError" do
106
+ host_error = @host.wrong?
107
+
108
+ host_error.website_errors.should_not be_nil
109
+ host_error.website_errors.each do |website_error|
110
+ website_error.should be_an_instance_of(Rubicante::WebsiteError)
111
+ @sites.include?(website_error.url).should == true
112
+ end
113
+ end
114
+
115
+ it "should support pinging" do
116
+ @host.respond_to?('ping').should == true
117
+ end
118
+
119
+ it "should update HostError.ping to true for alive hosts" do
120
+ host_error = @host.wrong?
121
+ host_error.ping.should == true
122
+ end
123
+
124
+ it "should update HostError.ping to false for down hosts" do
125
+ Ping.stub!(:pingecho).and_return(false)
126
+ host_error = @host.wrong?
127
+ host_error.ping.should == false
128
+ end
129
+
130
+ it "should skip website processing for downed hosts" do
131
+ Ping.stub!(:pingecho).and_return(false)
132
+ host_error = @host_with_sites.wrong?
133
+ host_error.ping.should == false
134
+ host_error.website_errors.should == []
135
+ end
136
+
137
+ it "should check a specified port" do
138
+ @host.respond_to?('check_port').should == true
139
+ TCPSocket.stub!(:open).and_return(true)
140
+ @host.check_port(80).should == true
141
+ TCPSocket.stub!(:open).and_raise(ArgumentError)
142
+ @host.check_port(443).should == false
143
+ end
144
+
145
+ it "should check all registered ports" do
146
+ TCPSocket.stub!(:open).and_raise(ArgumentError)
147
+ @host_with_ports.check_ports do |port, is_alive|
148
+ @ports.include?(port).should == true
149
+ end
150
+ end
151
+
152
+ it "should update HostError.bad_ports for all down ports" do
153
+ TCPSocket.stub!(:open).and_raise(ArgumentError)
154
+ host_error = @host_with_ports.wrong?
155
+ host_error.bad_ports.each do |bad_port|
156
+ @ports.include?(bad_port).should == true
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,35 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/type_group"
3
+
4
+ describe "A group of server types" do
5
+ before :each do
6
+ @type_group = Rubicante::TypeGroup.instance
7
+ end
8
+
9
+ it "should exist" do
10
+ @type_group.should_not be_nil
11
+ @type_group.should be_an_instance_of(Rubicante::TypeGroup)
12
+ end
13
+
14
+ it "should have an empty hash of types by default" do
15
+ @type_group.types.should == {}
16
+ end
17
+
18
+ it "should create a new type in types if it doesn't exist" do
19
+ type_name = "new-type"
20
+ @type_group[type_name].name.should == type_name
21
+ end
22
+
23
+ it "should allow for modifying previously defined types" do
24
+ type_name = "new-type"
25
+ new_port = 80
26
+ new_service = "new-service"
27
+ @type_group[type_name]
28
+
29
+ @type_group[type_name].port(new_port)
30
+ @type_group[type_name].ports.include?(new_port).should == true
31
+
32
+ @type_group[type_name].service(new_service)
33
+ @type_group[type_name].services.include?(new_service).should == true
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/type"
3
+
4
+ describe "A server type" do
5
+ before :each do
6
+ @type_name = "spec-type"
7
+ @type = Rubicante::Type.new(@type_name)
8
+ end
9
+
10
+ it "should exist" do
11
+ @type.should_not be_nil
12
+ @type.should be_an_instance_of(Rubicante::Type)
13
+ end
14
+
15
+ it "should require a name when initializing" do
16
+ lambda { @new_type = Rubicante::Type.new }.should raise_error(ArgumentError)
17
+ end
18
+
19
+ it "should have a name" do
20
+ @type.name.should == @type_name
21
+ end
22
+
23
+ it "should have an empty array of ports by default" do
24
+ @type.ports.should == []
25
+ end
26
+
27
+ it "should have an empty array of services by default" do
28
+ @type.services.should == []
29
+ end
30
+
31
+ it "should allow appending of ports" do
32
+ new_port = 80
33
+ @type.port(new_port)
34
+ @type.ports.include?(new_port).should == true
35
+ end
36
+
37
+ it "should allow appending of services" do
38
+ new_service = "W32Time"
39
+ @type.service(new_service)
40
+ @type.services.include?(new_service).should == true
41
+ end
42
+ end
@@ -0,0 +1,35 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/website_error"
3
+
4
+ describe "An error with a website" do
5
+ before :each do
6
+ @url = "http://www.rubicante-example.com/"
7
+ @code = "500"
8
+ @website_error = Rubicante::WebsiteError.new(@url, @code)
9
+ end
10
+
11
+ it "should exist" do
12
+ @website_error.should_not be_nil
13
+ @website_error.should be_an_instance_of(Rubicante::WebsiteError)
14
+ end
15
+
16
+ it "should require parameters to be created" do
17
+ lambda { Rubicante::WebsiteError.new }.should raise_error(ArgumentError)
18
+ end
19
+
20
+ it "should have a URL" do
21
+ @website_error.url.should == @url
22
+ end
23
+
24
+ it "should have an HTTP code" do
25
+ @website_error.code.should == @code
26
+ end
27
+
28
+ it "should not allow modification to the URL" do
29
+ lambda { @website_error.url = "http://www.rubyforge-example.org/" }.should raise_error(NoMethodError)
30
+ end
31
+
32
+ it "should not allow modification to the HTTP code" do
33
+ lambda { @website_error.code = "301" }.should raise_error(NoMethodError)
34
+ end
35
+ end
@@ -0,0 +1,53 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),"helper")
2
+ require "#{LIB_DIR}/website"
3
+
4
+ describe "A website" do
5
+ before :each do
6
+ @url = 'http://www.rubicante-test.com/'
7
+ @website = Rubicante::Website.new(@url)
8
+
9
+ @http_ok = Net::HTTPOK.new('1', '200', 'OK')
10
+ @http_redirect = Net::HTTPMovedPermanently.new('1', '301', 'Moved Permanently')
11
+ @http_client_error = Net::HTTPNotFound.new('1', '404', 'File Not Found')
12
+ @http_server_error = Net::HTTPInternalServerError.new('1', '500', 'Internal Server Error')
13
+ end
14
+
15
+ it "should exist" do
16
+ @website.should_not be_nil
17
+ @website.should be_an_instance_of(Rubicante::Website)
18
+ end
19
+
20
+ it "should require a name parameter for initialization" do
21
+ lambda { Website.new.should raise_error(ArgumentError) }
22
+ end
23
+
24
+ it "should return the HTTP code number for a site" do
25
+ Net::HTTP.stub!(:get_response).and_return(@http_redirect)
26
+ @website.response_code.should == "301"
27
+ end
28
+
29
+ it "should return true for good websites" do
30
+ Net::HTTP.stub!(:get_response).and_return(@http_ok)
31
+ @website.is_ok?.should == true
32
+ end
33
+
34
+ it "should return true for redirected websites" do
35
+ Net::HTTP.stub!(:get_response).and_return(@http_redirect)
36
+ @website.is_ok?.should == true
37
+ end
38
+
39
+ it "should return false for websites having problems" do
40
+ Net::HTTP.stub!(:get_response).and_return(@http_server_error)
41
+ @website.is_ok?.should == false
42
+ end
43
+
44
+ it "should return false for missing files" do
45
+ Net::HTTP.stub!(:get_response).and_return(@http_client_error)
46
+ @website.is_ok?.should == false
47
+ end
48
+
49
+ it "should return a WebsiteError for bad sites" do
50
+ Net::HTTP.stub!(:get_response).and_return(@http_server_error)
51
+ @website.wrong?.should be_an_instance_of(Rubicante::WebsiteError)
52
+ end
53
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubicante
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam VanderHook
@@ -64,6 +64,23 @@ files:
64
64
  - lib/rubicante.rb
65
65
  - lib/rubicante/cli.rb
66
66
  - lib/rubicante/environment.rb
67
+ - lib/rubicante/host.rb
68
+ - lib/rubicante/host_error.rb
69
+ - lib/rubicante/host_group.rb
70
+ - lib/rubicante/type.rb
71
+ - lib/rubicante/type_group.rb
72
+ - lib/rubicante/website.rb
73
+ - lib/rubicante/website_error.rb
74
+ - spec/environment_spec.rb
75
+ - spec/helper.rb
76
+ - spec/host_error_spec.rb
77
+ - spec/host_group_spec.rb
78
+ - spec/host_spec.rb
79
+ - spec/type_group_spec.rb
80
+ - spec/type_spec.rb
81
+ - spec/website_error_spec.rb
82
+ - spec/website_spec.rb
83
+ - test/test_rubicante.rb
67
84
  has_rdoc: true
68
85
  homepage: RubyForge http://rubicante.rubyforge.org
69
86
  post_install_message: