jerbil 1.3.3 → 1.4.5
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.
- checksums.yaml +9 -9
- data/Bugs.rdoc +7 -0
- data/Gemfile +7 -8
- data/History.txt +28 -0
- data/Intro.txt +8 -4
- data/README.md +65 -33
- data/README_TESTING.md +2 -1
- data/bin/jerbil +108 -49
- data/bin/jerbil-install +1 -1
- data/etc/jerbil/jerbil-old.rb +83 -0
- data/etc/jerbil/jerbil-test.rb +105 -0
- data/etc/jerbil/jerbil.rb +61 -39
- data/lib/jerbil.rb +41 -9
- data/lib/jerbil/config.rb +18 -1
- data/lib/jerbil/monitor.rb +134 -0
- data/lib/jerbil/service.rb +10 -0
- data/lib/jerbil/support.rb +4 -4
- data/lib/jerbil/version.rb +9 -8
- data/sbin/jerbil-stop +11 -0
- data/sbin/jerbild +25 -4
- data/spec/jerbil_client_spec.rb +16 -16
- data/spec/jerbil_daemonised/jerbil_local_spec.rb +11 -12
- data/spec/jerbil_local_spec.rb +19 -19
- data/spec/jerbil_missing_spec.rb +3 -6
- data/spec/jerbil_remote_spec.rb +19 -18
- data/spec/spec_helper.rb +1 -2
- data/test/conf.d/jerbil_local.rb +2 -0
- data/test/conf.d/jerbil_test.rb +92 -20
- data/test/conf.d/jerbil_test_old.rb +35 -0
- data/test/pids/rubytest-dev.asc +1 -0
- data/test/pids/rubytest-dev.pid +1 -0
- metadata +116 -98
- data/etc/jerbil/jerbil-client.rb +0 -2
- data/lib/jerbil/thor/server.rb +0 -76
- data/lib/jerbil/thor/service.rb +0 -74
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OThlODQwNmFhOWZlOWUwMjYxYWU0MjY5ZGRhYTBjNGI1YzBiYjU2NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
7
|
-
|
6
|
+
ZGU5MTgzZTgzYzNlY2Y4NjQ1OTcwMjJmZTY1MzllOTVhYzAyYjc0MA==
|
7
|
+
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
M2QxMWI2ZjUyMzk4ZDZiMTNkMTk5N2Y4Mzk3YjhhNGY2YjQ1NWY2MWQ0NGMw
|
10
|
+
YWM0NzgxZDg4NjVjYmE1ZjMzNzFlMzQ3ZjIyODdiYjhmNWJiMTU4Y2U3YzRi
|
11
|
+
ZWYyOTlhODMxNTJjOGQ1MGExYTUxN2RmOTczNGZhMTgyY2NiMTU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NTJjNzU5ZmYzMzA5ZGNlNzI3ZGViYTQxMjUyYmI0MGE0OTcyYTFhNjU4YjYw
|
14
|
+
ZDE2NmFlNjNiZDg5MmZlNTdhNWJjMzU1MmM1N2Q5NmY1MGU0ZDBlYzFkZjA2
|
15
|
+
ZDJmMTNjZmFkYjg1MjE5NDQwYjMwNzlkYjE4ZjQ0YTYxOTM0YWM=
|
data/Bugs.rdoc
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
== Bugs
|
2
2
|
|
3
|
+
[jerbil-1.4.4 16-Oct-2014]
|
4
|
+
|
5
|
+
Started up a service with a previous version still running and it did not detect or
|
6
|
+
notify the problem!
|
7
|
+
|
3
8
|
[jerbil-1.3.1 29-Aug-2013]
|
4
9
|
|
5
10
|
Need to update jerbil command to get rid of thor and improve what it does.
|
6
11
|
Consider Network Dependencies - where a service on one machine does not start
|
7
12
|
without a service on another or when a service is taken down on which others depend
|
8
13
|
then they are notified first, through Jerbil?
|
14
|
+
|
15
|
+
[Thor removed in 2014]
|
9
16
|
|
10
17
|
[jerbil-1.2.3 06-June-2013]
|
11
18
|
|
data/Gemfile
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# @markup ruby
|
2
2
|
#
|
3
3
|
# general utilities
|
4
|
-
gem 'netaddr'
|
5
|
-
gem 'term-ansicolor'
|
6
|
-
gem '
|
7
|
-
gem 'daemons'
|
4
|
+
gem 'netaddr', '~> 1.0'
|
5
|
+
gem 'term-ansicolor', '~> 1.0'
|
6
|
+
gem 'daemons', '~> 1.0'
|
8
7
|
|
9
8
|
# jerbil-related utilities
|
10
|
-
gem 'jellog', '>=1.0.14' # for logging
|
11
|
-
gem 'jeckyl', '>=0.2.7' # for config files
|
12
|
-
gem 'jeni', '>=0.2.5' # for installation
|
9
|
+
gem 'jellog', '~> 1.0', '>=1.0.14' # for logging
|
10
|
+
gem 'jeckyl', '~> 0.2', '>=0.2.7' # for config files
|
11
|
+
gem 'jeni', '~> 0.2', '>=0.2.5' # for installation
|
13
12
|
|
14
|
-
gem 'optplus', '>=0.0.2'
|
13
|
+
gem 'optplus', '~> 0.0', '>=0.0.2'
|
data/History.txt
CHANGED
@@ -4,6 +4,34 @@
|
|
4
4
|
|
5
5
|
==History
|
6
6
|
|
7
|
+
[jerbil-1.4.5 17-Oct-2014]
|
8
|
+
|
9
|
+
Add server version to 'jerbil remotes -V' and add system logging for start and
|
10
|
+
end of monitor process.
|
11
|
+
|
12
|
+
[jerbil-1.4.4 13-Oct-2014]
|
13
|
+
|
14
|
+
Fix Gemfile dependencies to please rubygems and remove thor as a dependency.
|
15
|
+
|
16
|
+
[jerbil-1.4.3 13-Oct-2014]
|
17
|
+
|
18
|
+
Ensure monitor raises the alarm if the secret key is rejected by another server.
|
19
|
+
|
20
|
+
[jerbil-1.4.2 09-Oct-2014]
|
21
|
+
|
22
|
+
Fix jeni installer error.
|
23
|
+
|
24
|
+
[jerbil-1.4.1 03-Aug-2014]
|
25
|
+
|
26
|
+
Relocate server discovery to Jerbil::Monitor. Tidy up tests and readmes. Allow for
|
27
|
+
gethostname not to return fqdn and use gethostbyname if this happens.
|
28
|
+
|
29
|
+
[jerbil-1.4.0 19-Apr-2014]
|
30
|
+
|
31
|
+
Ensure that jerbild init does not complete until the server has completed
|
32
|
+
discovery. This prevents services from starting when there is apparently
|
33
|
+
a server but it is not yet ready for them.
|
34
|
+
|
7
35
|
[jerbil-1.3.3 03-Sep-2013]
|
8
36
|
|
9
37
|
Ensure jerbil methods are called on the server and not the server record.
|
data/Intro.txt
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
Provides
|
1
|
+
Provides a reliable Object Request Broker and a simple framework for ruby-based services.
|
2
2
|
Jerbil servers run on each machine in the system and share information on registering
|
3
|
-
services.
|
4
|
-
and
|
5
|
-
|
3
|
+
services. This ensures no single point of failure - machines can come and go (orderly or disorderly)
|
4
|
+
and the network extends or heals as they do. For services there is a parent class that hides
|
5
|
+
all of the jerbil server interactions so that new services can be written without having
|
6
|
+
to write any distributing code. Clients can also be written using an interface that
|
7
|
+
can find one or more services on the network and connect to each or the first. Finally, there
|
8
|
+
are scripts to start and stop the Jerbil server and any Services so that the whole thing
|
9
|
+
can be quickly installed and integrated with your system.
|
data/README.md
CHANGED
@@ -1,10 +1,18 @@
|
|
1
1
|
# Jerbil
|
2
2
|
|
3
|
-
|
3
|
+
A "Framework" for writing services in Ruby that provides a reliable way to deploy
|
4
|
+
services across a network. Reliability is a key objective and with a server
|
5
|
+
on each machine you can rely on Jerbil to connect you effortlessly to your services
|
6
|
+
wherever they are running.
|
4
7
|
|
5
|
-
|
6
|
-
and
|
7
|
-
|
8
|
+
Jerbil comes complete with a basic service class to make writing a new service very
|
9
|
+
quick and easy. It also has helpers to connect clients to services through Jerbil
|
10
|
+
without having to worry about where the service is running. You can find single or
|
11
|
+
multiple services and you can run services at development, test or production status
|
12
|
+
all on the same LAN or same machine.
|
13
|
+
|
14
|
+
Overall, Jerbil should save anyone looking to develop a service in Ruby from a lot of
|
15
|
+
tedious work and should avoid a lot of the headaches of alternatives such as Rinda.
|
8
16
|
|
9
17
|
**GitHub:** [https://github.com/osburn-sharp/jerbil](https://github.com/osburn-sharp/jerbil)
|
10
18
|
|
@@ -22,7 +30,8 @@ uses the Jerbil Server
|
|
22
30
|
|
23
31
|
### Note
|
24
32
|
|
25
|
-
Jerbil
|
33
|
+
Jerbil **(a.k.a Jumpin Ermin's Reliable Broker for Integrated Linux services)** will
|
34
|
+
work on any Linux distro (and possibly other systems too) but it comes with
|
26
35
|
all the gear necessary to work on Gentoo out of the box - e.g. runscripts, /etc/conf.d files
|
27
36
|
and the like.
|
28
37
|
|
@@ -71,13 +80,19 @@ the defaults, you need to generate a secret. A random secret can be generated us
|
|
71
80
|
|
72
81
|
# jerbil server secret
|
73
82
|
|
74
|
-
although any long string will do.
|
83
|
+
although any long string will do.
|
84
|
+
|
85
|
+
You also need to set some parameters for your network. This is to help the server
|
86
|
+
discover any other Jerbil servers on the network without having to hard-code
|
87
|
+
this information on all computers. Further details on Server Discovery are provided below.
|
88
|
+
Full details of the configuration parameters for Jerbil are in {Jerbil::Config}.
|
75
89
|
|
76
90
|
### Editting /etc/services
|
77
91
|
|
78
|
-
Jerbil uses /etc/services to find its services (unsurprisingly) so this
|
79
|
-
be an entry for the server itself, as well as the
|
80
|
-
operating environments (dev, test and prod),
|
92
|
+
Jerbil uses /etc/services (Socket.getservbyname) to find the ports for its services (unsurprisingly) so this
|
93
|
+
file needs to be updated. There must be an entry for the Jerbil server itself, as well as the
|
94
|
+
services that use Jerbil. Because Jerbil supports three operating environments (dev, test and prod),
|
95
|
+
these services must be assigned in triplets. The following is an example
|
81
96
|
|
82
97
|
# starts from 49195
|
83
98
|
#
|
@@ -109,31 +124,33 @@ and offsets it if either test or dev is selected. They are included here as a re
|
|
109
124
|
Once you have generated a secret and set up some services in /etc/services, it is now possible to
|
110
125
|
start the Jerbil Server. This can be done using the jerbild script:
|
111
126
|
|
112
|
-
# /usr/sbin/jerbild
|
127
|
+
# /usr/local/sbin/jerbild
|
113
128
|
|
114
|
-
which will start the server, get the default config file (/etc/
|
129
|
+
which will start the server, get the default config file (/etc/jerbil/jerbil.rb), daemonise, and say very little.
|
115
130
|
If you add the -h or --help switch you can see how to overide this default behaviour.
|
116
131
|
You can then test that the server is running with:
|
117
132
|
|
118
|
-
# jerbil
|
133
|
+
# jerbil status
|
119
134
|
|
120
135
|
If this does not report the server as up, go to the troubleshooting section.
|
121
136
|
|
122
|
-
If you can support init scripts, then jerbil is ready to go. Edit /etc/conf.d/jerbild if
|
123
|
-
where the config file is and then run:
|
137
|
+
If you can support init scripts, then jerbil is ready to go. Edit /etc/conf.d/jerbild if
|
138
|
+
you need to change settings such as where the config file is and then run:
|
124
139
|
|
125
140
|
# /etc/init.d/jerbild start
|
141
|
+
or alternatively
|
142
|
+
# rc-service jerbild start
|
143
|
+
and to set the service to run at startup:
|
126
144
|
# rc-update add jerbild default
|
127
145
|
|
128
|
-
the latter command works on Gentoo at least.
|
129
146
|
|
130
147
|
You can also check if the server is working using:
|
131
148
|
|
132
|
-
#
|
149
|
+
# rc-service jerbild status
|
133
150
|
|
134
151
|
To stop the server:
|
135
152
|
|
136
|
-
#
|
153
|
+
# rc-service jerbild stop
|
137
154
|
|
138
155
|
If your distro does not support runscripts like this, then you can start, stop and test status
|
139
156
|
manually using:
|
@@ -147,7 +164,7 @@ Further details of all these commands can be obtained with the -h or --help opti
|
|
147
164
|
|
148
165
|
## General Description
|
149
166
|
|
150
|
-
The
|
167
|
+
The aim of Jerbil is to make it easier to write Linux services in Ruby that can be deployed anywhere on
|
151
168
|
a network, once or multiple times, and enabling clients to access these services regardless of where they are. Its
|
152
169
|
a wrapper around DRb and a replacement for Rinda.
|
153
170
|
|
@@ -160,7 +177,7 @@ single point of failure. If it goes down nobody can find anything and all servic
|
|
160
177
|
server is restored.
|
161
178
|
|
162
179
|
Part of the self-healing in Jerbil is dealing with services that become unavailable. When this happens, the server
|
163
|
-
checks if the
|
180
|
+
checks if the service's local server is running. If it is, this local server is asked to deal with the missing service
|
164
181
|
and update the database accordingly. If it is not, then the original server takes responsibility for the missing
|
165
182
|
service and purges it from all the other servers.
|
166
183
|
|
@@ -175,8 +192,8 @@ Jerbil with only a couple of lines of code.
|
|
175
192
|
|
176
193
|
Controlling a service is also made easy by the {JerbilService::Supervisor} class. This hides all of the actions needed
|
177
194
|
to start a service. However, service control is made even easier by /usr/bin/jserviced, which starts any service
|
178
|
-
given that services name, provided the files conform to certain protocols. The /usr/sbin/jservice-status and
|
179
|
-
/usr/sbin/jservice-stop commands work in a similar manner.
|
195
|
+
given that services name, provided the files conform to certain protocols. The /usr/local/sbin/jservice-status and
|
196
|
+
/usr/local/sbin/jservice-stop commands work in a similar manner.
|
180
197
|
|
181
198
|
Writing a client is similarly made easy by the {JerbilService::Client} class, which finds one or more services ready
|
182
199
|
to be connected to and acted upon.
|
@@ -194,7 +211,7 @@ Jerbil is divided into two groups: the server and the services that use the serv
|
|
194
211
|
|
195
212
|
The server consists of one main class: {Jerbil::Broker} and two data-type classes:
|
196
213
|
{Jerbil::Servers} and {Jerbil::ServiceRecord}. The Broker contains the main server code,
|
197
|
-
|
214
|
+
accepting and recording services and
|
198
215
|
responding to queries about registered services. When a service registers with
|
199
216
|
the broker, the broker will also inform all of the other servers of that service.
|
200
217
|
The {Jerbil::Servers} class is used by the broker to record information
|
@@ -202,15 +219,6 @@ about a server and it provides convenience methods to connect to a server and a
|
|
202
219
|
method to find the local server. The {Jerbil::ServiceRecord} class fulfils a similar
|
203
220
|
role for services.
|
204
221
|
|
205
|
-
When a server starts up it uses the {Jerbil::Servers.find_servers} class method to
|
206
|
-
search the network for any other servers. This method uses the NetAddr gem to create a
|
207
|
-
list of network addresses from the parameters defined by {Jerbil::Config}, allowing
|
208
|
-
users to limit jerbil addresses, both to control which machines get polled and to speed
|
209
|
-
up the search. The jerbil port is polled using the standard library TCPSocket interface
|
210
|
-
with a timeout (standard library again). When the server finds another server it first
|
211
|
-
does a minor security check (see below) and then obtains all of the services registered with
|
212
|
-
that server and adds it to its service database.
|
213
|
-
|
214
222
|
Jerbil is intended to be as reliable as possible - to survive any of the servers and
|
215
223
|
their services leaving the network unexpectedly. If a local client attempts to connect
|
216
224
|
to a remote service and fails, then the server will be asked to check with {Jerbil::Broker#service_missing?}.
|
@@ -228,6 +236,30 @@ but they keep track of their own pids instead of relying on daemon. To stop the
|
|
228
236
|
an attempt is made to call the stop method, which cleans up with all the other servers,
|
229
237
|
but failing that the pid is used to kill the server.
|
230
238
|
|
239
|
+
### Server Discovery
|
240
|
+
|
241
|
+
Jerbil servers automatically connect to each other on a LAN to make their management
|
242
|
+
as easy as possible. They do this using brute force - polling each address on the network
|
243
|
+
until they find a server and then registering with it. This all takes time and to avoid
|
244
|
+
delaying the server itself, the discovery task is delegated to {Jerbil::Monitor}, which
|
245
|
+
is run in a sub-process by the sbin/jerbild script.
|
246
|
+
|
247
|
+
The {Jerbil::Monitor} class uses the {Jerbil::Servers.find_servers} class method to
|
248
|
+
search the network for any other servers. This method uses the NetAddr gem to create a
|
249
|
+
list of network addresses from the parameters defined by {Jerbil::Config}, allowing
|
250
|
+
users to limit jerbil addresses, both to control which machines get polled and to speed
|
251
|
+
up the search. The Jerbil port is polled using the standard library TCPSocket interface
|
252
|
+
with a timeout (standard library again). When the server finds another server it first
|
253
|
+
does a minor security check (see below) and then obtains all of the services registered with
|
254
|
+
that server and adds it to its service database.
|
255
|
+
|
256
|
+
To avoid missing any servers that may have been busy during the short period waited on
|
257
|
+
each port, the monitor process can loop round the discovery task multiple times (see
|
258
|
+
defaults in {Jerbil::Config}. There is also a delay between each cycle that can be
|
259
|
+
set in {Jeckyl::Config}. Overall, the parameters for the monitor task can be tuned
|
260
|
+
to ensure success on anything from a small subnet to a large network. The only thing
|
261
|
+
it cannot do is monitor more than one network.
|
262
|
+
|
231
263
|
### Services
|
232
264
|
|
233
265
|
Services are created by inheriting the {JerbilService::Base} class:
|
@@ -303,7 +335,7 @@ event that an exception is raised during the daemonization process.
|
|
303
335
|
|
304
336
|
## Dependencies
|
305
337
|
|
306
|
-
|
338
|
+
Tested on Ruby 1.9.3 and 2.0.0.
|
307
339
|
|
308
340
|
Check the {file:Gemfile} for other dependencies.
|
309
341
|
|
@@ -326,7 +358,7 @@ See {file:History.txt} for a summary change history
|
|
326
358
|
|
327
359
|
## Copyright and Licence
|
328
360
|
|
329
|
-
Copyright (c)
|
361
|
+
Copyright (c) 2014 Robert Sharp
|
330
362
|
|
331
363
|
This software is licensed under the terms defined in {file:LICENCE.rdoc}
|
332
364
|
|
data/README_TESTING.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Jerbil Testing
|
2
2
|
|
3
|
-
Testing is generally through rspec, development/test versions of the Jerbil server, and service mocks.
|
3
|
+
Testing is generally through rspec, development/test versions of the Jerbil server, and service mocks.
|
4
|
+
Rspec 3.1.0 has been used for all tests
|
4
5
|
|
5
6
|
## Basic tests
|
6
7
|
|
data/bin/jerbil
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
#
|
20
20
|
|
21
21
|
require 'optplus'
|
22
|
+
require 'optplus/IO'
|
22
23
|
require 'jerbil'
|
23
24
|
require 'jellog/proxy'
|
24
25
|
require 'colored'
|
@@ -26,6 +27,8 @@ require 'socket'
|
|
26
27
|
|
27
28
|
class Jerbs < Optplus::Parser
|
28
29
|
|
30
|
+
include Optplus::IO
|
31
|
+
|
29
32
|
usage "[options] actions"
|
30
33
|
|
31
34
|
description "Provide information on Jerbil servers and services"
|
@@ -45,7 +48,7 @@ class Jerbs < Optplus::Parser
|
|
45
48
|
if FileTest.exists?(c) then
|
46
49
|
set_option :config, c
|
47
50
|
else
|
48
|
-
|
51
|
+
alert "the config file given does not exist"
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
@@ -67,79 +70,104 @@ class Jerbs < Optplus::Parser
|
|
67
70
|
puts "Error: No config file #{config_file ? config_file : '/etc/jerbil/jerbil.rb'}".red.bold
|
68
71
|
end
|
69
72
|
|
73
|
+
|
70
74
|
describe :status, "show the status of the local server"
|
75
|
+
help :status, " jerbil status",
|
76
|
+
"",
|
77
|
+
"Display status information about the local Jerbil server, such as its version",
|
78
|
+
"and the time it was started"
|
79
|
+
|
71
80
|
def status
|
72
|
-
|
81
|
+
say "Checking for local Jerbil server running in env: #{@config[:environment]}"
|
73
82
|
jerbs = @server.connect
|
74
83
|
started = jerbs.started
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
rescue
|
79
|
-
|
84
|
+
say_ok "Jerbil server found, version: #{jerbs.version}".green
|
85
|
+
say " Server has been up since #{started.strftime('%d %b %Y at %H:%M')}"
|
86
|
+
say " and has had #{jerbs.registrations.to_s} registrations."
|
87
|
+
rescue Jerbil::JerbilError
|
88
|
+
show_err "Jerbil Server Error"
|
89
|
+
rescue DRb::DRbError
|
90
|
+
show_err "Server did not respond"
|
80
91
|
end
|
81
92
|
|
93
|
+
|
82
94
|
describe :remotes, "list the remote servers on the network"
|
95
|
+
help :remotes, " jerbil remotes [-vV]",
|
96
|
+
"List remote servers and optionally verify the server is running.",
|
97
|
+
"Verbose listing does little atm but display the Ruby version."
|
98
|
+
|
83
99
|
def remotes
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
100
|
+
say "Checking for remote Jerbil servers running in env: #{@config[:environment]}"
|
101
|
+
jerbs = @server.connect
|
102
|
+
remotes = jerbs.remote_servers
|
103
|
+
remotes.each do |remote|
|
104
|
+
if option?(:verify) then
|
105
|
+
begin
|
106
|
+
remote.connect.verify
|
107
|
+
say_ok " #{remote.ident}"
|
108
|
+
rescue
|
109
|
+
say " #{remote.ident}".red
|
110
|
+
end
|
111
|
+
else
|
112
|
+
say " #{remote.ident}".cyan
|
113
|
+
end #
|
114
|
+
if option? :verbose then
|
115
|
+
begin
|
116
|
+
say " Jerbil server version: #{remote.version}"
|
117
|
+
say " Running under Ruby version: #{remote.connect.ruby_version}"
|
118
|
+
say " Remote server has been up since #{remote.started.strftime('%d %b %Y at %H:%M')}"
|
119
|
+
rescue
|
120
|
+
say " No info on ruby version from this server"
|
105
121
|
end
|
106
122
|
end
|
107
|
-
rescue Exception => err
|
108
|
-
puts " Server did not respond: #{err.message}".red.bold
|
109
123
|
end
|
124
|
+
unless remotes && remotes.length > 0
|
125
|
+
# no remotes
|
126
|
+
warn "There are no remote servers registered at this time"
|
127
|
+
end
|
128
|
+
|
129
|
+
rescue Jerbil::JerbilError
|
130
|
+
show_err "Jerbil Server Error"
|
131
|
+
rescue DRb::DRbError
|
132
|
+
show_err "Jerbil Server did not respond"
|
133
|
+
|
110
134
|
end
|
111
135
|
|
112
136
|
describe :services, "list the services registered with Jerbil"
|
137
|
+
help :services, " jerbil services [-avV -h <hostname>]",
|
138
|
+
"Display the services registered with the local Jerbil Server.",
|
139
|
+
"By default, these are just the local services. To see services",
|
140
|
+
"on remote servers use the -a switch. You can also see just those",
|
141
|
+
"services on a given host with the -h switch. To verify that the services",
|
142
|
+
"are operating, use the -v switch."
|
143
|
+
|
113
144
|
def services
|
114
145
|
jerbs = @server.connect
|
115
146
|
local_host = Socket.gethostname
|
116
147
|
if option?(:all) then
|
117
|
-
|
148
|
+
servers = jerbs.get_all_by_server
|
149
|
+
servers.each_pair do |name, services|
|
150
|
+
puts "Services for #{name}:"
|
151
|
+
display_services(services, jerbs)
|
152
|
+
end
|
153
|
+
unless servers && servers.length > 0
|
154
|
+
warn "There are no servers and therefore services registered with Jerbil"
|
155
|
+
end
|
156
|
+
return
|
118
157
|
elsif option?(:host) then
|
119
158
|
services = jerbs.find(host: get_option(:host), ignore_access: true)
|
120
159
|
else
|
121
160
|
services = jerbs.find(host: local_host, ignore_access: true)
|
122
161
|
end
|
123
|
-
services
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
if option? :verify then
|
130
|
-
if jerbs.service_missing?(s) then
|
131
|
-
puts " #{s.ident} has failed and should be removed".red
|
132
|
-
else
|
133
|
-
puts " #{s.ident} responded".green
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
rescue Jerbil::JerbilServerError => err
|
139
|
-
puts "Jerbil Server did not respond: #{err.message}".red.bold
|
162
|
+
display_services(services, jerbs)
|
163
|
+
|
164
|
+
rescue Jerbil::JerbilError
|
165
|
+
show_err "Jerbil Server Error"
|
166
|
+
rescue DRb::DRbError
|
167
|
+
show_err "Jerbil Server did not respond"
|
140
168
|
end
|
141
169
|
|
142
|
-
describe :secret, "generate a secret key for the Jerbil Servers"
|
170
|
+
describe :secret, "generate a random secret key for the Jerbil Servers"
|
143
171
|
def secret
|
144
172
|
puts "Paste the following into the config files for each server"
|
145
173
|
key = Digest::SHA1.hexdigest(Time.now.to_s + rand(12341234).to_s)
|
@@ -157,6 +185,7 @@ class Jerbs < Optplus::Parser
|
|
157
185
|
end
|
158
186
|
end
|
159
187
|
|
188
|
+
# if hostname is not FQDN then get the FQDN
|
160
189
|
def resolve_hostname(host)
|
161
190
|
if host.split('.').length > 1 then
|
162
191
|
return host
|
@@ -167,6 +196,36 @@ class Jerbs < Optplus::Parser
|
|
167
196
|
end
|
168
197
|
end
|
169
198
|
|
199
|
+
# helper method to display service information
|
200
|
+
def display_services(services, jerbs)
|
201
|
+
unless services && services.length > 0
|
202
|
+
warn "There are no services registered with Jerbil"
|
203
|
+
return false
|
204
|
+
end
|
205
|
+
|
206
|
+
services.each do |s|
|
207
|
+
puts " #{s.name}[:#{s.env}]@#{s.host}:#{s.port}".cyan
|
208
|
+
if option? :verbose then
|
209
|
+
puts " started at: #{s.registered_at.strftime('%d/%m/%y %H:%M')}"
|
210
|
+
puts " accessed #{s.access_count.to_s} times, last time at: #{s.accessed_at.strftime('%d/%m/%y %H:%M')}"
|
211
|
+
end
|
212
|
+
if option? :verify then
|
213
|
+
if jerbs.service_missing?(s) then
|
214
|
+
puts " #{s.ident} has failed and should be removed".red
|
215
|
+
else
|
216
|
+
puts " #{s.ident} responded".green
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
end # display_services
|
222
|
+
|
223
|
+
# helper method to show errors
|
224
|
+
def show_err(msg)
|
225
|
+
alert msg + ':'
|
226
|
+
puts " #{$!.message}"
|
227
|
+
end
|
228
|
+
|
170
229
|
end
|
171
230
|
|
172
231
|
Jerbs.run!
|