rubicante 0.0.1 → 0.0.2

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/README.rdoc CHANGED
@@ -16,6 +16,7 @@ and receive answers.
16
16
  * Describe a network of computer systems
17
17
  * Hosts
18
18
  * Ports it should be listening on
19
+ * Win32 services provided
19
20
  * Critical web sites hosted
20
21
  * Query the network
21
22
  * What is wrong: returns items (hosts, websites) that are not functioning
@@ -81,6 +82,10 @@ Use the '-d' flag when executing Rubicante to obtain debug output.
81
82
  * Defines host <hostname> (if not previously defined) and registers the website a <fqdn> with it
82
83
  * Example:
83
84
  host www provides website www.example.com
85
+ * Host <hostname> [provides] service <win32 service name>
86
+ * Defined host <hostname> (if not previously defined) and registers the Win32 service name with it
87
+ * Example:
88
+ host sql provides service MSSQLSERVER
84
89
  * Host <hostname> [listens] [on] port <port #>
85
90
  * Defined host <hostname> (if not previously defined) and registers the port <port #> to it
86
91
  * Example:
data/README.txt CHANGED
@@ -16,6 +16,7 @@ and receive answers.
16
16
  * Describe a network of computer systems
17
17
  * Hosts
18
18
  * Ports it should be listening on
19
+ * Win32 services provided
19
20
  * Critical web sites hosted
20
21
  * Query the network
21
22
  * What is wrong: returns items (hosts, websites) that are not functioning
@@ -81,6 +82,10 @@ Use the '-d' flag when executing Rubicante to obtain debug output.
81
82
  * Defines host <hostname> (if not previously defined) and registers the website a <fqdn> with it
82
83
  * Example:
83
84
  host www provides website www.example.com
85
+ * Host <hostname> [provides] service <win32 service name>
86
+ * Defined host <hostname> (if not previously defined) and registers the Win32 service name with it
87
+ * Example:
88
+ host sql provides service MSSQLSERVER
84
89
  * Host <hostname> [listens] [on] port <port #>
85
90
  * Defined host <hostname> (if not previously defined) and registers the port <port #> to it
86
91
  * Example:
data/lib/rubicante.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  #require 'rubicante/type_group'
3
3
 
4
4
  class Rubicante
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
6
6
  end
data/lib/rubicante/cli.rb CHANGED
@@ -31,6 +31,7 @@ module Rubicante
31
31
  puts_error(resp.hostname, "is unreachable.")
32
32
  else
33
33
  process_port_errors(resp)
34
+ process_service_errors(resp)
34
35
  process_website_errors(resp)
35
36
  end
36
37
  end
@@ -41,6 +42,12 @@ module Rubicante
41
42
  end
42
43
  end
43
44
 
45
+ def process_service_errors(resp)
46
+ resp.bad_services.each do |bad_service|
47
+ puts_error(resp.hostname, "service #{bad_service} is stopped.")
48
+ end
49
+ end
50
+
44
51
  def process_website_errors(resp)
45
52
  resp.website_errors.each do |website_error|
46
53
  puts_error(resp.hostname, "is returning code #{website_error.code} for website #{website_error.url}.")
@@ -1,9 +1,12 @@
1
1
  require 'rubicante/host_group'
2
+ require 'os_functions'
2
3
 
3
4
  require 'logging'
4
5
 
5
6
  module Rubicante
6
7
  class Environment
8
+ include OsFunctions
9
+
7
10
  attr_accessor :host
8
11
 
9
12
  def initialize
@@ -11,6 +14,12 @@ module Rubicante
11
14
 
12
15
  @log = Logging::Logger[self]
13
16
 
17
+ if is_windows?
18
+ @log.debug "Detected base operating platform is Windows-based"
19
+ else
20
+ @log.debug "Detected base operating platform is NON Windows-based"
21
+ end
22
+
14
23
  # Prepare Host logger
15
24
  @appender = Logging::Appender['rubicante']
16
25
  Logging::Logger['Rubicante::Host'].add_appenders(Logging::Appender['rubicante']) if not @appender.nil?
@@ -39,6 +48,7 @@ module Rubicante
39
48
  cmd.gsub!(/^[Hh]ost\s([\S]+)\s/, 'host["\1"]')
40
49
  cmd.gsub!(/website\s([^,]+)/, '.website("\1")')
41
50
  cmd.gsub!(/port\s([^,]+)/, '.port(\1)')
51
+ cmd.gsub!(/service\s([^,]+)/, '.service("\1")')
42
52
 
43
53
  # Clean up some bubble words
44
54
  cmd.gsub!(/listens\son\s/, '')
@@ -5,8 +5,14 @@ require 'logging'
5
5
  require 'ping'
6
6
  require 'socket'
7
7
 
8
+ require 'os_functions'
9
+ include OsFunctions
10
+ require 'win32ole' if is_windows?
11
+
8
12
  module Rubicante
9
13
  class Host
14
+ include OsFunctions
15
+
10
16
  attr_reader :name
11
17
  attr_accessor :ports, :services, :types, :websites
12
18
 
@@ -132,9 +138,46 @@ module Rubicante
132
138
  check_websites do |website_error|
133
139
  result.add(website_error)
134
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
135
147
  end
136
148
 
137
149
  return result
138
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
139
182
  end
140
183
  end
@@ -3,12 +3,13 @@ require 'rubicante/website_error'
3
3
  module Rubicante
4
4
  class HostError
5
5
  attr_reader :hostname, :website_errors
6
- attr_accessor :bad_ports, :ping
6
+ attr_accessor :bad_ports, :bad_services, :ping
7
7
 
8
8
  def initialize(hostname)
9
9
  @hostname = hostname
10
10
  @ping = false
11
11
  @bad_ports = []
12
+ @bad_services = []
12
13
  @website_errors = []
13
14
  end
14
15
 
@@ -54,8 +54,18 @@ describe "An error with a host" do
54
54
  end
55
55
 
56
56
  it "should allow appending to bad_ports" do
57
- @new_bad_port = 80
58
- @host_error.bad_ports << 80
59
- @host_error.bad_ports.include?(@new_bad_port).should == true
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
60
70
  end
61
71
  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.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam VanderHook
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-08 00:00:00 -04:00
12
+ date: 2009-04-10 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency