cognizant 0.0.2 → 0.0.3
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 +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +17 -0
- data/Gemfile +4 -1
- data/{LICENSE → License.md} +4 -2
- data/Rakefile +5 -0
- data/Readme.md +95 -0
- data/bin/cognizant +76 -122
- data/bin/cognizantd +28 -61
- data/cognizant.gemspec +8 -4
- data/examples/apps/redis-server.cz +42 -0
- data/examples/apps/redis-server.yml +29 -0
- data/examples/apps/redis-server_dsl.cz +54 -0
- data/examples/apps/resque.cz +17 -0
- data/examples/apps/thin.cz +32 -0
- data/examples/apps/thin.yml +48 -0
- data/examples/cognizantd.yml +18 -47
- data/features/child_process.feature +62 -0
- data/features/commands.feature +65 -0
- data/features/cpu_usage.feature +45 -0
- data/features/daemon.feature +12 -0
- data/features/flapping.feature +39 -0
- data/features/memory_usage.feature +45 -0
- data/features/shell.feature +30 -0
- data/features/step_definitions/common_steps.rb +14 -0
- data/features/step_definitions/daemon_steps.rb +25 -0
- data/features/step_definitions/shell_steps.rb +96 -0
- data/features/support/env.rb +54 -0
- data/lib/cognizant.rb +1 -5
- data/lib/cognizant/application.rb +122 -0
- data/lib/cognizant/application/dsl_proxy.rb +23 -0
- data/lib/cognizant/client.rb +61 -0
- data/lib/cognizant/commands.rb +164 -0
- data/lib/cognizant/commands/actions.rb +30 -0
- data/lib/cognizant/commands/help.rb +10 -0
- data/lib/cognizant/commands/load.rb +10 -0
- data/lib/cognizant/commands/shutdown.rb +7 -0
- data/lib/cognizant/commands/status.rb +11 -0
- data/lib/cognizant/commands/use.rb +15 -0
- data/lib/cognizant/controller.rb +17 -0
- data/lib/cognizant/daemon.rb +279 -0
- data/lib/cognizant/interface.rb +17 -0
- data/lib/cognizant/log.rb +25 -0
- data/lib/cognizant/process.rb +138 -94
- data/lib/cognizant/process/actions.rb +30 -41
- data/lib/cognizant/process/actions/restart.rb +73 -17
- data/lib/cognizant/process/actions/start.rb +35 -12
- data/lib/cognizant/process/actions/stop.rb +38 -17
- data/lib/cognizant/process/attributes.rb +41 -10
- data/lib/cognizant/process/children.rb +36 -0
- data/lib/cognizant/process/{condition_check.rb → condition_delegate.rb} +11 -13
- data/lib/cognizant/process/conditions.rb +7 -4
- data/lib/cognizant/process/conditions/cpu_usage.rb +5 -6
- data/lib/cognizant/process/conditions/memory_usage.rb +2 -6
- data/lib/cognizant/process/dsl_proxy.rb +23 -0
- data/lib/cognizant/process/execution.rb +16 -9
- data/lib/cognizant/process/pid.rb +16 -6
- data/lib/cognizant/process/status.rb +14 -2
- data/lib/cognizant/process/trigger_delegate.rb +57 -0
- data/lib/cognizant/process/triggers.rb +19 -0
- data/lib/cognizant/process/triggers/flapping.rb +68 -0
- data/lib/cognizant/process/triggers/transition.rb +22 -0
- data/lib/cognizant/process/triggers/trigger.rb +15 -0
- data/lib/cognizant/shell.rb +142 -0
- data/lib/cognizant/system.rb +16 -0
- data/lib/cognizant/system/ps.rb +1 -1
- data/lib/cognizant/system/signal.rb +2 -2
- data/lib/cognizant/util/dsl_proxy_methods_handler.rb +25 -0
- data/lib/cognizant/util/fixnum_percent.rb +5 -0
- data/lib/cognizant/util/transform_hash_keys.rb +33 -0
- data/lib/cognizant/validations.rb +142 -142
- data/lib/cognizant/version.rb +1 -1
- metadata +131 -71
- data/README.md +0 -221
- data/examples/redis-server.rb +0 -28
- data/examples/resque.rb +0 -10
- data/images/logo-small.png +0 -0
- data/images/logo.png +0 -0
- data/images/logo.pxm +0 -0
- data/lib/cognizant/logging.rb +0 -33
- data/lib/cognizant/process/conditions/flapping.rb +0 -57
- data/lib/cognizant/process/conditions/trigger_condition.rb +0 -52
- data/lib/cognizant/server.rb +0 -14
- data/lib/cognizant/server/commands.rb +0 -80
- data/lib/cognizant/server/daemon.rb +0 -277
- data/lib/cognizant/server/interface.rb +0 -86
- data/lib/cognizant/util/symbolize_hash_keys.rb +0 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a93e2f1d168e2683901d0a11ec11f306e76e0a74
|
4
|
+
data.tar.gz: 969dfb60b5efe2138fc44c7a37a687aaf75e5b46
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4d7dc8a641709996e05be712f59db9fb9b3c1c56176ae5314f21a8c2adc6b9e1b1b5163ec438db285268cbea12d0c55162ef209afb037e5750a2ae32befb2382
|
7
|
+
data.tar.gz: a34bb4420411f4a61722ae1887dad40cf04520df5e1684b4804981d40ffeb8f84278ae358497acc78043d433a0242ec4fdfc65ac6166488c23dc20270e7858ef
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/{LICENSE → License.md}
RENAMED
@@ -1,6 +1,8 @@
|
|
1
|
-
Copyright (c) 2012 Gurpartap Singh
|
1
|
+
**Copyright (c) 2012 Gurpartap Singh**
|
2
2
|
|
3
|
-
|
3
|
+
**All rights reserved**
|
4
|
+
|
5
|
+
**MIT License**
|
4
6
|
|
5
7
|
Permission is hereby granted, free of charge, to any person obtaining
|
6
8
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
data/Readme.md
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+

|
2
|
+
|
3
|
+
Simple and reliable process monitoring framework written in Ruby
|
4
|
+
|
5
|
+
[](http://badge.fury.io/rb/cognizant) [](https://gemnasium.com/Gurpartap/cognizant) [](https://codeclimate.com/github/Gurpartap/cognizant) [](https://travis-ci.org/Gurpartap/cognizant) [](https://coveralls.io/r/Gurpartap/cognizant)
|
6
|
+
|
7
|
+
|
8
|
+
## Quick start
|
9
|
+
|
10
|
+
###### Install Cognizant
|
11
|
+
```bash
|
12
|
+
$ gem install cognizant
|
13
|
+
```
|
14
|
+
|
15
|
+
###### Example thin server cluster configuration
|
16
|
+
```bash
|
17
|
+
$ vim thin_cluster.cz
|
18
|
+
```
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
app_root = "/apps/acmecorp.com"
|
22
|
+
servers = 5
|
23
|
+
port = 4000
|
24
|
+
|
25
|
+
Cognizant.application "acmecorp.com" do |app|
|
26
|
+
servers.times do |n|
|
27
|
+
app.monitor "thin-#{n}" do
|
28
|
+
autostart!
|
29
|
+
group "thin"
|
30
|
+
uid "www-data"
|
31
|
+
gid "www-data"
|
32
|
+
|
33
|
+
env RACK_ENV: "production"
|
34
|
+
chdir "#{app_root}/current"
|
35
|
+
|
36
|
+
daemonize false
|
37
|
+
pidfile "#{app_root}/shared/tmp/pids/thin.400#{n}.pid"
|
38
|
+
|
39
|
+
start_command "bundle exec thin start --only #{n} --servers #{servers} --port #{port}"
|
40
|
+
stop_command "bundle exec thin stop --only #{n} --servers #{servers} --port #{port}"
|
41
|
+
restart_command "bundle exec thin restart --only #{n} --servers #{servers} --port #{port}"
|
42
|
+
|
43
|
+
check :flapping, times: 3, within: 1.minute, retry_after: 15.seconds, retries: 10
|
44
|
+
check :transition, from: :running, to: :stopped do |process|
|
45
|
+
`say a thin server has stopped` # send an email, etc.
|
46
|
+
end
|
47
|
+
|
48
|
+
check :cpu_usage, above: 50.percent, every: 5.seconds, times: 5, do: :restart
|
49
|
+
check :memory_usage, above: 300.megabytes, every: 5.seconds, times: [3, 5], do: :restart
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
**YAML** version of this example is [available in the wiki](https://github.com/Gurpartap/cognizant/wiki/Thin-Server-Cluster).
|
56
|
+
|
57
|
+
###### Start the daemon and load the configuration
|
58
|
+
```bash
|
59
|
+
$ cognizantd
|
60
|
+
$ cognizant load thin_cluster.cz
|
61
|
+
```
|
62
|
+
|
63
|
+
###### Enter the Cognizant shell and view the status of managed processes
|
64
|
+
```bash
|
65
|
+
$ cognizant
|
66
|
+
```
|
67
|
+
```
|
68
|
+
Welcome Gurpartap! You are speaking to the Cognizant Monitoring Daemon.
|
69
|
+
Enter 'help' if you're not sure what to do.
|
70
|
+
|
71
|
+
Type 'quit' or 'exit' to quit at any time.
|
72
|
+
> use acmecorp.com
|
73
|
+
OK
|
74
|
+
```
|
75
|
+
|
76
|
+
```
|
77
|
+
(acmecorp.com)> status
|
78
|
+
+---------+-------+------------------------+-------+-------+--------+
|
79
|
+
| Process | Group | State | PID | % CPU | Memory |
|
80
|
+
+---------+-------+------------------------+-------+-------+--------+
|
81
|
+
| thin-0 | thin | running since 1 minute | 59825 | 0.0 | 47 MiB |
|
82
|
+
+---------+-------+------------------------+-------+-------+--------+
|
83
|
+
| thin-1 | thin | running since 1 minute | 59828 | 0.0 | 47 MiB |
|
84
|
+
+---------+-------+------------------------+-------+-------+--------+
|
85
|
+
| thin-2 | thin | running since 1 minute | 59829 | 0.0 | 47 MiB |
|
86
|
+
+---------+-------+------------------------+-------+-------+--------+
|
87
|
+
2013-03-18 10:00:29 +0530
|
88
|
+
```
|
89
|
+
|
90
|
+
## Further information
|
91
|
+
Cognizant has an [**extensively documented wiki**](https://github.com/Gurpartap/cognizant/wiki) for that.
|
92
|
+
|
93
|
+
## About
|
94
|
+
|
95
|
+
Cognizant is a project of [Gurpartap Singh](http://gurpartap.com/). Feel free to get in touch.
|
data/bin/cognizant
CHANGED
@@ -1,149 +1,105 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require "cognizant/version"
|
4
|
-
require "gli"
|
5
|
-
require "formatador"
|
6
|
-
require "socket"
|
7
|
-
require "json"
|
8
|
-
|
9
|
-
include GLI::App
|
10
|
-
|
11
3
|
# Set the process name.
|
12
4
|
$0 = File.basename(__FILE__)
|
13
5
|
|
14
|
-
#
|
6
|
+
# Flush standard output/error immediately.
|
15
7
|
$stdout.sync = true
|
16
8
|
$stderr.sync = true
|
17
9
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
arg_name "FILE"
|
25
|
-
flag :socket, :type => String, :default_value => "/var/run/cognizant/cognizantd.sock"
|
26
|
-
|
27
|
-
desc "The server address of the daemon server"
|
28
|
-
arg_name "ADDRESS"
|
29
|
-
flag "bind-address", :type => String
|
30
|
-
|
31
|
-
desc "The server port of the daemon server"
|
32
|
-
arg_name "PORT"
|
33
|
-
flag :port, :type => Integer
|
34
|
-
|
35
|
-
desc "Username to use for authentication with server"
|
36
|
-
arg_name "USERNAME"
|
37
|
-
flag :username, :type => String
|
38
|
-
|
39
|
-
desc "Password to use for authentication with server"
|
40
|
-
arg_name "PASSWORD"
|
41
|
-
flag :password, :type => String
|
42
|
-
|
43
|
-
desc "Print the version number and exit"
|
44
|
-
switch :version, :negatable => false
|
45
|
-
|
46
|
-
desc "Turn on tracing, enabling full backtrace"
|
47
|
-
switch :trace, :negatable => false
|
48
|
-
|
49
|
-
desc "Display status of managed process(es) or group(s)"
|
50
|
-
arg_name "process_name", :optional
|
51
|
-
command :status do |c|
|
52
|
-
c.action do |global_options, options, args|
|
53
|
-
connect_and_perform(global_options, :status, args) do |output|
|
54
|
-
begin
|
55
|
-
JSON.parse(output)
|
56
|
-
|
57
|
-
status_data = JSON.parse(output)
|
58
|
-
status_data.each_with_index do |process, index|
|
59
|
-
status_data[index]["State"] = "[green]#{process["State"]}[/] since #{distance_of_time_in_words(Time.now.to_i - process["Since"])}"
|
60
|
-
status_data[index]["Memory"] = number_to_human_size(process["Memory"] * 1024) # Convert kilobytes to bytes.
|
61
|
-
end
|
10
|
+
require "cognizant/version"
|
11
|
+
require "cognizant/shell"
|
12
|
+
require "commander/import"
|
13
|
+
require "formatador"
|
14
|
+
require "shellwords"
|
15
|
+
require "socket"
|
62
16
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
17
|
+
program :version, Cognizant::VERSION
|
18
|
+
program :description, "administration utility for cognizantd"
|
19
|
+
|
20
|
+
global_option("-a", "--app NAME", String, "The name of the application container (required)")
|
21
|
+
global_option("-s", "--sockfile FILE", String, "The socket lock file of the application server (required)")
|
22
|
+
|
23
|
+
default_command :shell
|
24
|
+
|
25
|
+
command :shell do |c|
|
26
|
+
c.syntax = "cognizant shell"
|
27
|
+
c.description = "Enter the Cognizant shell for easy control"
|
28
|
+
c.action do |args, options|
|
29
|
+
Cognizant::Shell.new(app: options.app, socket: options.sockfile, shell: true).run do |output, cmd|
|
30
|
+
if cmd == "shutdown"
|
31
|
+
# TODO: Use Shell#emit instead of puts.
|
32
|
+
puts "The daemon has been shutdown successfuly."
|
33
|
+
exit(0)
|
34
|
+
else
|
35
|
+
format_status_table(output)
|
70
36
|
end
|
71
37
|
end
|
72
38
|
end
|
73
39
|
end
|
74
40
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
c.action do |
|
79
|
-
connect_and_perform(
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
desc "Monitor the specified process or group"
|
84
|
-
arg_name "process_name"
|
85
|
-
command :monitor do |c|
|
86
|
-
c.action do |global_options, options, args|
|
87
|
-
connect_and_perform(global_options, :monitor, args)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
desc "Unmonitor the specified process or group"
|
92
|
-
arg_name "process_name"
|
93
|
-
command :unmonitor do |c|
|
94
|
-
c.action do |global_options, options, args|
|
95
|
-
connect_and_perform(global_options, :unmonitor, args)
|
41
|
+
command :status do |c|
|
42
|
+
c.syntax = "cognizant status [process or group name]"
|
43
|
+
c.description = "Display status of managed process(es) or group(s)"
|
44
|
+
c.action do |args, options|
|
45
|
+
connect_and_perform(:status, options, args) do |output|
|
46
|
+
format_status_table(output)
|
47
|
+
end
|
96
48
|
end
|
97
49
|
end
|
98
50
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
51
|
+
[
|
52
|
+
[:load, "FILE", "Loads the process information from specified Ruby file"],
|
53
|
+
[:monitor, "[PROCESS OR GROUP NAME]", "Monitor the specified process or group"],
|
54
|
+
[:unmonitor, "[PROCESS OR GROUP NAME]", "Unmonitor the specified process or group"],
|
55
|
+
[:start, "[PROCESS OR GROUP NAME]", "Start the specified process or group"],
|
56
|
+
[:stop, "[PROCESS OR GROUP NAME]", "Stop the specified process or group"],
|
57
|
+
[:restart, "[PROCESS OR GROUP NAME]", "Restart the specified process or group"]
|
58
|
+
].each do |command, arg_name, description|
|
59
|
+
eval <<-heredoc
|
60
|
+
command "#{command}" do |c|
|
61
|
+
c.syntax = "cognizant #{command} #{arg_name}"
|
62
|
+
c.description = "#{description}"
|
63
|
+
c.action do |args, options|
|
64
|
+
connect_and_perform(:#{command}, options, args) do |output|
|
65
|
+
format_status_table(output)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
heredoc
|
105
70
|
end
|
106
71
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
c.action do |
|
111
|
-
connect_and_perform(
|
72
|
+
command "shutdown" do |c|
|
73
|
+
c.syntax = "cognizant shutdown"
|
74
|
+
c.description = "Stop the monitoring daemon without affecting managed processes"
|
75
|
+
c.action do |args, options|
|
76
|
+
connect_and_perform(:shutdown, options, args) do |output|
|
77
|
+
#
|
78
|
+
end
|
112
79
|
end
|
113
80
|
end
|
114
81
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
82
|
+
def format_status_table(status_data)
|
83
|
+
if status_data.is_a?(Array)
|
84
|
+
status_data.each_with_index do |process, index|
|
85
|
+
status_data[index]["State"] = "[green]#{process["State"]}[/] since #{distance_of_time_in_words(Time.now.to_i - process["Since"])}"
|
86
|
+
status_data[index]["Memory"] = number_to_human_size(process["Memory"] * 1024) # Convert kilobytes to bytes.
|
87
|
+
end
|
122
88
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
89
|
+
formatador = Formatador.new
|
90
|
+
formatador.display_line
|
91
|
+
formatador.display_table(status_data, ["Process", "Group", "State", "PID", "% CPU", "Memory"])
|
92
|
+
formatador.display_line(Time.now)
|
93
|
+
formatador.display_line
|
94
|
+
elsif status_data.is_a?(Hash)
|
95
|
+
puts status_data['message']
|
127
96
|
end
|
97
|
+
rescue => e
|
98
|
+
Formatador.display_line("[red]#{status_data}[/]")
|
128
99
|
end
|
129
100
|
|
130
|
-
def connect_and_perform(
|
131
|
-
|
132
|
-
socket.write("#{task.to_s} #{args.join(' ')}")
|
133
|
-
socket.flush
|
134
|
-
output = socket.gets
|
135
|
-
if block
|
136
|
-
block.call(output)
|
137
|
-
else
|
138
|
-
Formatador.display_line(output)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
if global_options[:socket]
|
143
|
-
output_handler.call(UNIXSocket.new(global_options[:socket]))
|
144
|
-
else
|
145
|
-
output_handler.call(TCPSocket.new(global_options["bind-address"], global_options["port"]))
|
146
|
-
end
|
101
|
+
def connect_and_perform(task, options, args, &block)
|
102
|
+
Cognizant::Shell.new(app: options.app, socket: options.sockfile, shell: false).run_command(task, args, &block)
|
147
103
|
end
|
148
104
|
|
149
105
|
def distance_of_time_in_words(seconds)
|
@@ -174,5 +130,3 @@ end
|
|
174
130
|
def pluralize(count, singular, plural)
|
175
131
|
"#{count || 0} " + ((count == 1 || count =~ /^1(\.0+)?$/) ? singular : plural)
|
176
132
|
end
|
177
|
-
|
178
|
-
exit run(ARGV)
|
data/bin/cognizantd
CHANGED
@@ -10,6 +10,8 @@ $stderr.sync = true
|
|
10
10
|
begin
|
11
11
|
require "optparse"
|
12
12
|
require "cognizant/version"
|
13
|
+
require "cognizant/controller"
|
14
|
+
require "cognizant/util/transform_hash_keys"
|
13
15
|
|
14
16
|
options = {}
|
15
17
|
|
@@ -31,64 +33,24 @@ GLOBAL OPTIONS:
|
|
31
33
|
options[:daemonize] = value
|
32
34
|
end
|
33
35
|
|
34
|
-
opts.on("--
|
36
|
+
opts.on("--sockfile FILE", String, "The socket lock file of the command server.") do |value|
|
35
37
|
options[:pidfile] = value
|
36
38
|
end
|
37
39
|
|
38
|
-
opts.on("--
|
39
|
-
options[:
|
40
|
-
end
|
41
|
-
|
42
|
-
opts.on("--loglevel LEVEL", String, "The level of information to log.") do |value|
|
43
|
-
options[:loglevel] = value
|
44
|
-
end
|
45
|
-
|
46
|
-
opts.on("--env ENV", String, "Environment variables for managed processes to inherit.") do |value|
|
47
|
-
options[:env] = value
|
48
|
-
end
|
49
|
-
|
50
|
-
opts.on("--chdir DIRECTORY", String, "The current working directory for the managed processes to start with.") do |value|
|
51
|
-
options[:chdir] = value
|
52
|
-
end
|
53
|
-
|
54
|
-
opts.on("--umask UMASK", String, "Permission mode limitations for file and directory creation.") do |value|
|
55
|
-
options[:umask] = value
|
56
|
-
end
|
57
|
-
|
58
|
-
opts.on("--user USER", String, "Run the daemon and managed processes as the given user.") do |value|
|
59
|
-
options[:user] = value
|
60
|
-
end
|
61
|
-
|
62
|
-
opts.on("--group GROUP", String, "Run the daemon and managed processes as the given user group.") do |value|
|
63
|
-
options[:group] = value
|
64
|
-
end
|
65
|
-
|
66
|
-
opts.on("--pids-dir DIRECTORY", String, "Directory to store the pid files of managed processes, when required.") do |value|
|
67
|
-
options[:pids_dir] = value
|
68
|
-
end
|
69
|
-
|
70
|
-
opts.on("--logs-dir DIRECTORY", String, "Directory to store the log files of managed processes, when required.") do |value|
|
71
|
-
options[:logs_dir] = value
|
72
|
-
end
|
73
|
-
|
74
|
-
opts.on("-s FILE", "--socket FILE", String, "The socket lock file for the server") do |value|
|
75
|
-
options[:socket] = value
|
76
|
-
end
|
77
|
-
|
78
|
-
opts.on("-b ADDRESS", "--bind-address ADDRESS", String, "The interface to bind the TCP server to.") do |value|
|
79
|
-
options[:bind_address] = value
|
40
|
+
opts.on("--pidfile FILE", String, "The pid (process identifier) lock file for the daemon.") do |value|
|
41
|
+
options[:pidfile] = value
|
80
42
|
end
|
81
43
|
|
82
|
-
opts.on("
|
83
|
-
options[:
|
44
|
+
opts.on("--syslog", String, "Log the daemon's operational information into syslog.") do |_|
|
45
|
+
options[:syslog] = true
|
84
46
|
end
|
85
47
|
|
86
|
-
opts.on("--
|
87
|
-
options[:
|
48
|
+
opts.on("--logfile FILE", String, "Log the daemon's operational information into a file.") do |value|
|
49
|
+
options[:logfile] = value
|
88
50
|
end
|
89
51
|
|
90
|
-
opts.on("--
|
91
|
-
options[:
|
52
|
+
opts.on("--loglevel LEVEL", String, "The level of information to log.") do |value|
|
53
|
+
options[:loglevel] = value
|
92
54
|
end
|
93
55
|
|
94
56
|
opts.on("-t", "--trace", "Turn on tracing, enable full backtrace.") do
|
@@ -102,28 +64,33 @@ GLOBAL OPTIONS:
|
|
102
64
|
end
|
103
65
|
end.parse!
|
104
66
|
|
105
|
-
|
106
|
-
|
67
|
+
config = {}
|
68
|
+
config_file = ARGV.shift
|
107
69
|
|
108
|
-
|
109
|
-
|
110
|
-
|
70
|
+
if config_file == "-"
|
71
|
+
config = YAML.load(ARGF.read)
|
72
|
+
|
73
|
+
elsif config_file.to_s.size > 0
|
74
|
+
if File.exists?(config_file)
|
111
75
|
config = YAML.load_file(config_file)
|
76
|
+
elsif File.exists?(default_config_file = "/etc/cognizant/cognizantd.yml")
|
77
|
+
config = YAML.load_file(default_config_file)
|
112
78
|
end
|
113
|
-
config = config.inject({}) { |c,(k,v)| c[k.gsub("-", "_").to_sym] = v; c }
|
114
|
-
config.deep_symbolize_keys!
|
115
|
-
options = config.merge(options)
|
116
79
|
end
|
117
80
|
|
118
|
-
|
119
|
-
|
81
|
+
config.deep_symbolize_keys!
|
82
|
+
config = config.merge(options)
|
83
|
+
trace = config[:trace]
|
84
|
+
|
85
|
+
Cognizant::Controller.start_daemon(config)
|
120
86
|
rescue => exception
|
121
87
|
if exception.instance_of?(SystemExit)
|
122
88
|
raise
|
123
89
|
else
|
124
|
-
$stderr.puts "ERROR
|
90
|
+
$stderr.puts "ERROR While executing #{$0} ... (#{exception.class})"
|
125
91
|
$stderr.puts " #{exception.message}\n\n"
|
126
|
-
|
92
|
+
|
93
|
+
if trace
|
127
94
|
$stderr.puts exception.backtrace.join("\n")
|
128
95
|
$stderr.puts "\n(See usage by running #{$0} with --help)"
|
129
96
|
else
|