arborist 0.0.1.pre20160128152542 → 0.0.1.pre20160606141735
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/ChangeLog +426 -1
- data/Manifest.txt +17 -2
- data/Nodes.md +70 -0
- data/Protocol.md +68 -9
- data/README.md +3 -5
- data/Rakefile +4 -1
- data/TODO.md +52 -20
- data/lib/arborist.rb +19 -6
- data/lib/arborist/cli.rb +39 -25
- data/lib/arborist/client.rb +97 -4
- data/lib/arborist/command/client.rb +2 -1
- data/lib/arborist/command/start.rb +51 -5
- data/lib/arborist/dependency.rb +286 -0
- data/lib/arborist/event.rb +7 -2
- data/lib/arborist/event/{node_matching.rb → node.rb} +11 -5
- data/lib/arborist/event/node_acked.rb +5 -7
- data/lib/arborist/event/node_delta.rb +30 -3
- data/lib/arborist/event/node_disabled.rb +16 -0
- data/lib/arborist/event/node_down.rb +10 -0
- data/lib/arborist/event/node_quieted.rb +11 -0
- data/lib/arborist/event/node_unknown.rb +10 -0
- data/lib/arborist/event/node_up.rb +10 -0
- data/lib/arborist/event/node_update.rb +2 -11
- data/lib/arborist/event/sys_node_added.rb +10 -0
- data/lib/arborist/event/sys_node_removed.rb +10 -0
- data/lib/arborist/exceptions.rb +4 -0
- data/lib/arborist/manager.rb +188 -18
- data/lib/arborist/manager/event_publisher.rb +1 -1
- data/lib/arborist/manager/tree_api.rb +92 -13
- data/lib/arborist/mixins.rb +17 -0
- data/lib/arborist/monitor.rb +10 -1
- data/lib/arborist/monitor/socket.rb +123 -2
- data/lib/arborist/monitor_runner.rb +6 -5
- data/lib/arborist/node.rb +420 -94
- data/lib/arborist/node/ack.rb +72 -0
- data/lib/arborist/node/host.rb +43 -8
- data/lib/arborist/node/resource.rb +73 -0
- data/lib/arborist/node/root.rb +6 -0
- data/lib/arborist/node/service.rb +89 -22
- data/lib/arborist/observer.rb +1 -1
- data/lib/arborist/subscription.rb +11 -6
- data/spec/arborist/client_spec.rb +93 -5
- data/spec/arborist/dependency_spec.rb +375 -0
- data/spec/arborist/event/node_delta_spec.rb +66 -0
- data/spec/arborist/event/node_down_spec.rb +84 -0
- data/spec/arborist/event/node_spec.rb +59 -0
- data/spec/arborist/event/node_update_spec.rb +14 -3
- data/spec/arborist/event_spec.rb +3 -3
- data/spec/arborist/manager/tree_api_spec.rb +295 -3
- data/spec/arborist/manager_spec.rb +240 -57
- data/spec/arborist/monitor_spec.rb +26 -3
- data/spec/arborist/node/ack_spec.rb +74 -0
- data/spec/arborist/node/host_spec.rb +79 -0
- data/spec/arborist/node/resource_spec.rb +56 -0
- data/spec/arborist/node/service_spec.rb +68 -2
- data/spec/arborist/node_spec.rb +288 -11
- data/spec/arborist/subscription_spec.rb +23 -14
- data/spec/arborist_spec.rb +0 -4
- data/spec/data/observers/webservices.rb +10 -2
- data/spec/spec_helper.rb +8 -0
- metadata +58 -15
- metadata.gz.sig +0 -0
- data/LICENSE +0 -29
data/Manifest.txt
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
ChangeLog
|
4
4
|
Events.md
|
5
5
|
History.md
|
6
|
-
LICENSE
|
7
6
|
Manifest.txt
|
8
7
|
Monitors.md
|
9
8
|
Nodes.md
|
@@ -21,11 +20,19 @@ lib/arborist/command/client.rb
|
|
21
20
|
lib/arborist/command/config.rb
|
22
21
|
lib/arborist/command/start.rb
|
23
22
|
lib/arborist/command/watch.rb
|
23
|
+
lib/arborist/dependency.rb
|
24
24
|
lib/arborist/event.rb
|
25
|
+
lib/arborist/event/node.rb
|
25
26
|
lib/arborist/event/node_acked.rb
|
26
27
|
lib/arborist/event/node_delta.rb
|
27
|
-
lib/arborist/event/
|
28
|
+
lib/arborist/event/node_disabled.rb
|
29
|
+
lib/arborist/event/node_down.rb
|
30
|
+
lib/arborist/event/node_quieted.rb
|
31
|
+
lib/arborist/event/node_unknown.rb
|
32
|
+
lib/arborist/event/node_up.rb
|
28
33
|
lib/arborist/event/node_update.rb
|
34
|
+
lib/arborist/event/sys_node_added.rb
|
35
|
+
lib/arborist/event/sys_node_removed.rb
|
29
36
|
lib/arborist/event/sys_reloaded.rb
|
30
37
|
lib/arborist/exceptions.rb
|
31
38
|
lib/arborist/loader.rb
|
@@ -38,7 +45,9 @@ lib/arborist/monitor.rb
|
|
38
45
|
lib/arborist/monitor/socket.rb
|
39
46
|
lib/arborist/monitor_runner.rb
|
40
47
|
lib/arborist/node.rb
|
48
|
+
lib/arborist/node/ack.rb
|
41
49
|
lib/arborist/node/host.rb
|
50
|
+
lib/arborist/node/resource.rb
|
42
51
|
lib/arborist/node/root.rb
|
43
52
|
lib/arborist/node/service.rb
|
44
53
|
lib/arborist/observer.rb
|
@@ -47,6 +56,10 @@ lib/arborist/observer/summarize.rb
|
|
47
56
|
lib/arborist/observer_runner.rb
|
48
57
|
lib/arborist/subscription.rb
|
49
58
|
spec/arborist/client_spec.rb
|
59
|
+
spec/arborist/dependency_spec.rb
|
60
|
+
spec/arborist/event/node_delta_spec.rb
|
61
|
+
spec/arborist/event/node_down_spec.rb
|
62
|
+
spec/arborist/event/node_spec.rb
|
50
63
|
spec/arborist/event/node_update_spec.rb
|
51
64
|
spec/arborist/event_spec.rb
|
52
65
|
spec/arborist/manager/event_publisher_spec.rb
|
@@ -56,7 +69,9 @@ spec/arborist/mixins_spec.rb
|
|
56
69
|
spec/arborist/monitor/socket_spec.rb
|
57
70
|
spec/arborist/monitor_runner_spec.rb
|
58
71
|
spec/arborist/monitor_spec.rb
|
72
|
+
spec/arborist/node/ack_spec.rb
|
59
73
|
spec/arborist/node/host_spec.rb
|
74
|
+
spec/arborist/node/resource_spec.rb
|
60
75
|
spec/arborist/node/root_spec.rb
|
61
76
|
spec/arborist/node/service_spec.rb
|
62
77
|
spec/arborist/node_spec.rb
|
data/Nodes.md
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Nodes
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
Arborist::Host 'sidonie' do
|
6
|
+
parent 'duir'
|
7
|
+
description "NAS and media server"
|
8
|
+
address '192.168.16.3'
|
9
|
+
|
10
|
+
tags :infrastructure,
|
11
|
+
:storage,
|
12
|
+
:media,
|
13
|
+
:rip_status_check
|
14
|
+
|
15
|
+
service 'ssh'
|
16
|
+
service 'demon-http', port: 6666, protocol: 'http'
|
17
|
+
service 'postgresql'
|
18
|
+
|
19
|
+
service 'smtp'
|
20
|
+
|
21
|
+
service 'http',
|
22
|
+
depends_on: 'postgresql'
|
23
|
+
service 'sabnzbd', port: 8080, protocol: 'http'
|
24
|
+
service 'sickbeard', port: 8081, protocol: 'http'
|
25
|
+
service 'pms', port: 32400, protocol: 'http'
|
26
|
+
service 'couchpotato', port: 5050, protocol: 'http'
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
Arborist::Host 'jhereg' do
|
31
|
+
parent 'duir'
|
32
|
+
description "Directory server"
|
33
|
+
address '192.168.16.7'
|
34
|
+
|
35
|
+
service 'ldaps'
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
Arborist::Host 'webserver' do
|
40
|
+
description "Public webserver"
|
41
|
+
address '54.16.62.181'
|
42
|
+
|
43
|
+
service 'http',
|
44
|
+
depends_on: 'foo'
|
45
|
+
depends_on: all_of( 'postgresql', 'daemon-http', on: 'sidonie' ),
|
46
|
+
all_of( 'ldaps', on: 'jhereg' )
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
An application server depends on one each of the 'http' services and 'ldaps' services
|
51
|
+
to be up.
|
52
|
+
|
53
|
+
Arborist::Host 'appserver1' do
|
54
|
+
description "Public application webserver"
|
55
|
+
address '54.16.62.185'
|
56
|
+
service 'http',
|
57
|
+
depends_on: all_of(
|
58
|
+
any_of( 'http', on: %w[service1 service2 service3] ),
|
59
|
+
any_of( 'ldaps', on: %w[directory1 directory2] ),
|
60
|
+
all_of( 'else', on: 'something' )
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
[ :all_of,
|
66
|
+
[ :any_of, 'service1-http', 'service2-http', 'service3-http' ],
|
67
|
+
[ :any_of, 'directory1-ldaps', 'directory2-ldaps' ],
|
68
|
+
'something-else'
|
69
|
+
]
|
70
|
+
|
data/Protocol.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Monitors
|
2
2
|
|
3
|
-
## Protocol
|
3
|
+
## Basic Protocol
|
4
4
|
|
5
5
|
ZMQ REQ socket, msgpack message consisting of an Array of two elements:
|
6
6
|
|
@@ -20,7 +20,25 @@ Header is a Map of the form:
|
|
20
20
|
Body is either Nil, a Map of key-value pairs, or an Array of Maps appropriate to the `action`.
|
21
21
|
|
22
22
|
|
23
|
-
##
|
23
|
+
## Commands
|
24
|
+
|
25
|
+
|
26
|
+
### «commandname»
|
27
|
+
|
28
|
+
«description»
|
29
|
+
|
30
|
+
#### Header
|
31
|
+
|
32
|
+
#### Body
|
33
|
+
|
34
|
+
#### Return
|
35
|
+
|
36
|
+
#### Examples
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
### status
|
24
42
|
|
25
43
|
Fetch the status of the Manager.
|
26
44
|
|
@@ -43,7 +61,13 @@ Response:
|
|
43
61
|
}
|
44
62
|
|
45
63
|
|
46
|
-
|
64
|
+
### list
|
65
|
+
|
66
|
+
Retrieve an Array of Maps that describes all or part of the node tree.
|
67
|
+
|
68
|
+
#### Required
|
69
|
+
from the node with the specified `identifier`, or the root node if no `identifier` is specified.
|
70
|
+
|
47
71
|
|
48
72
|
Request:
|
49
73
|
|
@@ -52,6 +76,7 @@ Request:
|
|
52
76
|
action: list,
|
53
77
|
version: 1
|
54
78
|
[from: «identifier»]
|
79
|
+
[depth: «arg»]
|
55
80
|
}
|
56
81
|
]
|
57
82
|
|
@@ -89,11 +114,9 @@ failure example:
|
|
89
114
|
}
|
90
115
|
]
|
91
116
|
|
92
|
-
Fetch a data structure describing the node tree from the node with the specified
|
93
|
-
`identifier`, or the root node if no `identifier` is specified.
|
94
117
|
|
95
118
|
|
96
|
-
|
119
|
+
### fetch
|
97
120
|
|
98
121
|
Fetch the `address`, `description`, and `status` of all nodes.
|
99
122
|
|
@@ -119,7 +142,7 @@ Fetch the `address`, `description`, and `status` of all nodes.
|
|
119
142
|
]
|
120
143
|
|
121
144
|
|
122
|
-
|
145
|
+
#### return
|
123
146
|
|
124
147
|
- not specified : returns everything.
|
125
148
|
- `Nil` : returns just identifiers
|
@@ -128,7 +151,7 @@ Fetch the `address`, `description`, and `status` of all nodes.
|
|
128
151
|
Search for nodes that match the filter given in the request body, returning a serialized map of node identifiers to requested state.
|
129
152
|
|
130
153
|
|
131
|
-
|
154
|
+
### update
|
132
155
|
|
133
156
|
[
|
134
157
|
{
|
@@ -164,7 +187,7 @@ With a failure:
|
|
164
187
|
]
|
165
188
|
|
166
189
|
|
167
|
-
|
190
|
+
### subscribe
|
168
191
|
|
169
192
|
Get node change delta events for every 'host' type node.
|
170
193
|
|
@@ -212,3 +235,39 @@ Get notified of every system event (startup, shutdown, reload, etc.)
|
|
212
235
|
Nil
|
213
236
|
|
214
237
|
|
238
|
+
### graft
|
239
|
+
|
240
|
+
{
|
241
|
+
action: graft,
|
242
|
+
version: 1,
|
243
|
+
type: 'host',
|
244
|
+
identifier: 'joliet',
|
245
|
+
parent: 'bennett' # defaults to root
|
246
|
+
},
|
247
|
+
{
|
248
|
+
addresses: [],
|
249
|
+
tags: []
|
250
|
+
}
|
251
|
+
|
252
|
+
|
253
|
+
### prune
|
254
|
+
|
255
|
+
{
|
256
|
+
action: prune,
|
257
|
+
version: 1,
|
258
|
+
identifier: 'bennett'
|
259
|
+
},
|
260
|
+
Nil
|
261
|
+
|
262
|
+
|
263
|
+
### modify
|
264
|
+
|
265
|
+
{
|
266
|
+
action: modify,
|
267
|
+
version: 1,
|
268
|
+
identifier: 'bennett'
|
269
|
+
},
|
270
|
+
{
|
271
|
+
addresses: ['10.13.0.22', '10.1.0.23']
|
272
|
+
}
|
273
|
+
|
data/README.md
CHANGED
@@ -29,12 +29,10 @@ customizability.
|
|
29
29
|
|
30
30
|
## Installation
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
This isn't really ready for serious usage yet, but when it is you can install
|
33
|
+
it like so:
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
You'll likely want to start with [the Tutorial](Tutorial.html).
|
35
|
+
$ gem install arborist
|
38
36
|
|
39
37
|
|
40
38
|
## Contributing
|
data/Rakefile
CHANGED
@@ -38,6 +38,8 @@ hoespec = Hoe.spec 'arborist' do |spec|
|
|
38
38
|
spec.dependency 'state_machines', '~> 0.2'
|
39
39
|
spec.dependency 'msgpack', '~> 0.6'
|
40
40
|
spec.dependency 'rbczmq', '~> 1.7'
|
41
|
+
spec.dependency 'gli', '~> 2.3'
|
42
|
+
spec.dependency 'highline', '~> 1.7'
|
41
43
|
|
42
44
|
spec.dependency 'rspec', '~> 3.2', :developer
|
43
45
|
spec.dependency 'simplecov', '~> 0.9', :developer
|
@@ -80,10 +82,11 @@ if File.directory?( '.hg' )
|
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
83
|
-
task :gemspec => GEMSPEC
|
85
|
+
task :gemspec => [ 'ChangeLog', GEMSPEC ]
|
84
86
|
file GEMSPEC => __FILE__ do |task|
|
85
87
|
spec = $hoespec.spec
|
86
88
|
spec.files.delete( '.gemtest' )
|
89
|
+
spec.files.delete( 'LICENSE' )
|
87
90
|
spec.signing_key = nil
|
88
91
|
spec.version = "#{spec.version}.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
89
92
|
File.open( task.name, 'w' ) do |fh|
|
data/TODO.md
CHANGED
@@ -1,33 +1,65 @@
|
|
1
1
|
# To-Do
|
2
2
|
|
3
|
-
##
|
3
|
+
## First Release (0.1)
|
4
4
|
|
5
|
-
*
|
6
|
-
* Include a node's subscriptions in its serialized data
|
7
|
-
* Implement loading/reloading nodes.
|
8
|
-
* Implement the system events (sys.acked, sys.reloaded, etc.)
|
5
|
+
* README, Tutorial, Setup docs
|
9
6
|
|
10
|
-
|
7
|
+
* Performance/profiling examination
|
11
8
|
|
12
|
-
* Add "grafting": node add/removal
|
13
9
|
|
14
|
-
|
10
|
+
### Manager
|
15
11
|
|
16
|
-
*
|
17
|
-
* Summarizing and Actions should be 1st order objects
|
18
|
-
* Unsubscribe from Arborist and ZMQ subscriptions on shutdown
|
19
|
-
* Figure out how to match on delta events: the criteria
|
20
|
-
for matching nodes has to be separated from that which matches
|
21
|
-
the delta pairs.
|
12
|
+
* Only restore timestamps from serialized node dependencies, not the deps themselves.
|
22
13
|
|
23
|
-
|
14
|
+
* Broadcast system events:
|
15
|
+
- `sys.node.added`
|
16
|
+
- `sys.node.removed`
|
17
|
+
- `sys.startup`
|
18
|
+
- `sys.shutdown`
|
24
19
|
|
25
|
-
* Allow (require?) node types to specify what kinds of nodes can be
|
26
|
-
their parent, and also adds the constructor DSL method to it
|
27
20
|
|
21
|
+
### Observers
|
28
22
|
|
29
|
-
|
23
|
+
* Re-subscribe on `sys.startup`, `sys.reloaded`, `sys.node.added`
|
24
|
+
* Add `except` to observers DSL
|
30
25
|
|
31
|
-
* Add a CLI for generating a basic setup and then adding
|
32
|
-
nodes/monitors/observers to it.
|
33
26
|
|
27
|
+
### Nodes
|
28
|
+
|
29
|
+
* Allow a service node to not inherit all of its host's addresses (i.e., be bound to one address only or whatever)
|
30
|
+
* Resource nodes: disk, load, process checks, etc. Anything that might
|
31
|
+
be considered a problem, that you'd want to ack independantly of the
|
32
|
+
Host node they are attached to.
|
33
|
+
|
34
|
+
### Monitor
|
35
|
+
|
36
|
+
* Add some default monitor types and utilities
|
37
|
+
- UDP socket check
|
38
|
+
- Basic monitors for stdlib Net::* protocols/services
|
39
|
+
-
|
40
|
+
|
41
|
+
* Gems for monitor types that have external dependency
|
42
|
+
- SNMP
|
43
|
+
|
44
|
+
### Watch Command
|
45
|
+
|
46
|
+
* Re-subscribe on `sys.startup`, `sys.reloaded`, `sys.node.added`
|
47
|
+
|
48
|
+
|
49
|
+
## Second Release (0.2)
|
50
|
+
|
51
|
+
### Setup/Installation
|
52
|
+
|
53
|
+
* Add a CLI for generating a basic setup and then adding nodes/monitors/observers to it.
|
54
|
+
* Potential federation / referral for sibling managers
|
55
|
+
|
56
|
+
### Nodes
|
57
|
+
|
58
|
+
* Ask a node (via tree-api or otherwise) what nodes it affects (immediate children, secondary dependents)
|
59
|
+
|
60
|
+
### Observers
|
61
|
+
|
62
|
+
* Action dependencies -- as an example, if an action sends an email,
|
63
|
+
don't trigger if the email service is offline. Potential action
|
64
|
+
"chains", ie: If the email service is down, use a separate
|
65
|
+
out-of-band action that sends SMS.
|
data/lib/arborist.rb
CHANGED
@@ -17,7 +17,7 @@ module Arborist
|
|
17
17
|
VERSION = '0.0.1'
|
18
18
|
|
19
19
|
# Version control revision
|
20
|
-
REVISION = %q$Revision:
|
20
|
+
REVISION = %q$Revision: ed4f0655b4b6 $
|
21
21
|
|
22
22
|
|
23
23
|
# The name of the environment variable which can be used to set the config path
|
@@ -32,7 +32,7 @@ module Arborist
|
|
32
32
|
# Configurability API -- default configuration values
|
33
33
|
CONFIG_DEFAULTS = {
|
34
34
|
tree_api_url: 'ipc:///tmp/arborist_tree.sock',
|
35
|
-
event_api_url: 'ipc:///tmp/arborist_events.sock'
|
35
|
+
event_api_url: 'ipc:///tmp/arborist_events.sock',
|
36
36
|
}
|
37
37
|
|
38
38
|
|
@@ -103,10 +103,17 @@ module Arborist
|
|
103
103
|
|
104
104
|
### Add a constructor function to the Arborist namespace called +name+
|
105
105
|
### with the specified +method_body+.
|
106
|
-
def self::add_dsl_constructor(
|
107
|
-
|
108
|
-
|
109
|
-
|
106
|
+
def self::add_dsl_constructor( subclass, &method_body )
|
107
|
+
name = subclass.name
|
108
|
+
|
109
|
+
if name
|
110
|
+
name.sub!( /.*::/, '' )
|
111
|
+
self.log.debug "Adding factory method for %p: %p" % [ name, method_body ]
|
112
|
+
singleton_class.instance_exec( name, method_body ) do |name, body|
|
113
|
+
define_method( name, &body )
|
114
|
+
end
|
115
|
+
else
|
116
|
+
self.log.info "Skipping DSL constructor for anonymous class."
|
110
117
|
end
|
111
118
|
end
|
112
119
|
|
@@ -165,6 +172,12 @@ module Arborist
|
|
165
172
|
end
|
166
173
|
|
167
174
|
|
175
|
+
### Set the ZMQ context if it's already been created by something else.
|
176
|
+
def self::zmq_context=( existing_context )
|
177
|
+
@zmq_context = existing_context
|
178
|
+
end
|
179
|
+
|
180
|
+
|
168
181
|
require 'arborist/exceptions'
|
169
182
|
require 'arborist/mixins'
|
170
183
|
|
data/lib/arborist/cli.rb
CHANGED
@@ -43,7 +43,7 @@ module Arborist::CLI
|
|
43
43
|
version Arborist::VERSION
|
44
44
|
|
45
45
|
# Use an OpenStruct for options instead of a Hash
|
46
|
-
use_openstruct( true )
|
46
|
+
# use_openstruct( true )
|
47
47
|
|
48
48
|
# Subcommand options are independent of global[:ones]
|
49
49
|
subcommand_option_handling :normal
|
@@ -62,7 +62,8 @@ module Arborist::CLI
|
|
62
62
|
|
63
63
|
|
64
64
|
# Global options
|
65
|
-
desc "
|
65
|
+
desc "Load the specified CONFIGFILE."
|
66
|
+
arg_name :CONFIGFILE
|
66
67
|
flag [:c, :config], type: Pathname
|
67
68
|
|
68
69
|
desc 'Enable debugging output'
|
@@ -72,7 +73,7 @@ module Arborist::CLI
|
|
72
73
|
switch [:v, :verbose]
|
73
74
|
|
74
75
|
desc 'Set log level to LEVEL (one of %s)' % [Loggability::LOG_LEVELS.keys.join(', ')]
|
75
|
-
|
76
|
+
arg_name :LEVEL
|
76
77
|
flag [:l, :loglevel], must_match: Loggability::LOG_LEVELS.keys
|
77
78
|
|
78
79
|
desc "Don't actually do anything, just show what would happen."
|
@@ -86,24 +87,41 @@ module Arborist::CLI
|
|
86
87
|
# GLI Event callbacks
|
87
88
|
#
|
88
89
|
|
90
|
+
# Set up global options
|
89
91
|
pre do |global, command, options, args|
|
90
|
-
|
91
|
-
Loggability.level = loglevel.to_sym
|
92
|
-
else
|
93
|
-
Loggability.level = :fatal
|
94
|
-
end
|
92
|
+
self.set_logging_level( global[:l] )
|
95
93
|
|
96
94
|
# Include a 'lib' directory if there is one
|
97
95
|
$LOAD_PATH.unshift( 'lib' ) if File.directory?( 'lib' )
|
98
96
|
|
99
|
-
self.require_additional_libs( global
|
97
|
+
self.require_additional_libs( global[:r] ) if global[:r]
|
100
98
|
self.load_config( global )
|
99
|
+
self.set_logging_level( global[:l] ) if global[:l] # again; override config file
|
101
100
|
self.install_highline_colorscheme
|
102
101
|
|
102
|
+
self.setup_output( global )
|
103
|
+
|
103
104
|
true
|
104
105
|
end
|
105
106
|
|
106
107
|
|
108
|
+
# Write the error to the log on exceptions.
|
109
|
+
on_error do |exception|
|
110
|
+
case exception
|
111
|
+
when OptionParser::ParseError, GLI::CustomExit
|
112
|
+
self.log.debug( exception )
|
113
|
+
else
|
114
|
+
self.log.error( exception )
|
115
|
+
end
|
116
|
+
|
117
|
+
exception.backtrace.each {|frame| self.log.debug(frame) }
|
118
|
+
|
119
|
+
true
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
107
125
|
##
|
108
126
|
# Registered subcommand modules
|
109
127
|
singleton_attr_accessor :subcommand_modules
|
@@ -162,6 +180,16 @@ module Arborist::CLI
|
|
162
180
|
end
|
163
181
|
|
164
182
|
|
183
|
+
### Set the global logging +level+ if it's defined.
|
184
|
+
def self::set_logging_level( level=nil )
|
185
|
+
if level
|
186
|
+
Loggability.level = level.to_sym
|
187
|
+
else
|
188
|
+
Loggability.level = :fatal
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
|
165
193
|
### Load any additional Ruby libraries given with the -r global option.
|
166
194
|
def self::require_additional_libs( requires)
|
167
195
|
requires.each do |path|
|
@@ -181,6 +209,7 @@ module Arborist::CLI
|
|
181
209
|
cs[:down] = [ :red ]
|
182
210
|
cs[:unknown] = [ :dark, :yellow ]
|
183
211
|
cs[:disabled] = [ :dark, :white ]
|
212
|
+
cs[:quieted] = [ :dark, :green ]
|
184
213
|
cs[:acked] = [ :yellow ]
|
185
214
|
cs[:highlight] = [ :bold, :yellow ]
|
186
215
|
cs[:search_hit] = [ :black, :on_white ]
|
@@ -194,7 +223,7 @@ module Arborist::CLI
|
|
194
223
|
### Load the config file using either arborist-base's config-loader if available, or
|
195
224
|
### fall back to DEFAULT_CONFIG_FILE
|
196
225
|
def self::load_config( global={} )
|
197
|
-
Arborist.load_config( global
|
226
|
+
Arborist.load_config( global[:c] ) if global[:c]
|
198
227
|
|
199
228
|
# Set up the logging formatter
|
200
229
|
Loggability.format_with( :color ) if $stdout.tty?
|
@@ -224,21 +253,6 @@ module Arborist::CLI
|
|
224
253
|
end
|
225
254
|
|
226
255
|
|
227
|
-
# Write the error to the log on exceptions.
|
228
|
-
on_error do |exception|
|
229
|
-
case exception
|
230
|
-
when OptionParser::ParseError, GLI::CustomExit
|
231
|
-
self.log.debug( exception )
|
232
|
-
else
|
233
|
-
self.log.error( exception )
|
234
|
-
end
|
235
|
-
|
236
|
-
exception.backtrace.each {|frame| self.log.debug(frame) }
|
237
|
-
|
238
|
-
true
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
256
|
#
|
243
257
|
# GLI subcommands
|
244
258
|
#
|