cognizant 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![Cognizant](http://f.cl.ly/items/442w3l1n0i3V41220g0z/cognizant.png)
|
2
|
+
|
3
|
+
Simple and reliable process monitoring framework written in Ruby
|
4
|
+
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/cognizant.png)](http://badge.fury.io/rb/cognizant) [![Dependency Status](https://gemnasium.com/Gurpartap/cognizant.png)](https://gemnasium.com/Gurpartap/cognizant) [![Code Climate](https://codeclimate.com/github/Gurpartap/cognizant.png)](https://codeclimate.com/github/Gurpartap/cognizant) [![Build Status](https://travis-ci.org/Gurpartap/cognizant.png?branch=master)](https://travis-ci.org/Gurpartap/cognizant) [![Coverage Status](https://coveralls.io/repos/Gurpartap/cognizant/badge.png?branch=master)](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
|