qnotifier 0.7.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -2,14 +2,14 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('qnotifier', '0.6.0') do |p|
5
+ Echoe.new('qnotifier', '1.0.0') do |p|
6
6
  p.description = "The server side agent for the QNotifier monitoring system"
7
7
  p.url = "http://qnotifier.com/qnotifier_gem"
8
8
  p.author = "Gersham Meharg"
9
9
  p.email = "gersham@qnotifier.com"
10
10
  p.ignore_pattern = ["var/*", "tmp/*"]
11
- p.runtime_dependencies = ["rest-client >=1.4.2", "json >=1.2.3", "elif >=0.1.0"]
12
- p.development_dependencies = ["rest-client >=1.4.2", "json >=1.2.3", "elif >=0.1.0"]
11
+ p.runtime_dependencies = ["json_pure >=1.2.3"]
12
+ p.development_dependencies = ["json_pure >=1.2.3"]
13
13
  p.executable_pattern = ["bin/*"]
14
14
  p.install_message = "Qnotifier installed, please register by running 'qnotifier -r CODE' in order to register this server."
15
15
  end
data/bin/qnotifier CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH.unshift( File.join( File.dirname(__FILE__), '../lib' ) )
3
3
  require 'fileutils'
4
+ require "qnotifier"
4
5
 
5
6
  module Qnotifier
6
7
  class Command
@@ -8,8 +9,7 @@ module Qnotifier
8
9
  def self.run(argv)
9
10
 
10
11
  unless Process.euid == 0
11
- puts "QNotifier should be only started by root (the daemon will drop privs)"
12
- exit
12
+ puts "WARNING: QNotifier should be only run by root"
13
13
  end
14
14
 
15
15
  if has_api_key?
@@ -37,7 +37,12 @@ module Qnotifier
37
37
  require "qnotifier"
38
38
  qnotifier = Qnotifier::MainProcess.new
39
39
  qnotifier.alert(argv[1], argv[2], 3)
40
-
40
+
41
+ elsif argv.first == 'reset_alert'
42
+ require "qnotifier"
43
+ qnotifier = Qnotifier::MainProcess.new
44
+ qnotifier.alert(argv[1], argv[2], 6)
45
+
41
46
  elsif argv.first == 'register'
42
47
  require "qnotifier"
43
48
  qnotifier = Qnotifier::MainProcess.new
@@ -60,7 +65,7 @@ module Qnotifier
60
65
  setup_directories
61
66
 
62
67
  else
63
- puts "usage: qnotifier start | stop | restart | zap | reset | register | debug"
68
+ puts "usage: qnotifier start | stop | restart | zap | reset | register | debug | alert | reset_alert"
64
69
  puts "see http://qnotifier.com for more details"
65
70
  end
66
71
 
@@ -100,8 +105,6 @@ module Qnotifier
100
105
  puts "Creating #{var_dir}"
101
106
  FileUtils.mkdir_p var_dir
102
107
  FileUtils.mkdir_p "#{var_dir}/plugins"
103
- default_config_file = File.dirname(__FILE__) + "/../config/qnotifier_config.yml"
104
- `cp #{default_config_file} #{var_dir}/qnotifier_config.yml`
105
108
  readme_file = File.dirname(__FILE__) + "/../config/README"
106
109
  `cp #{readme_file} #{var_dir}/plugins/README`
107
110
  rescue Exception => e
@@ -110,6 +113,18 @@ module Qnotifier
110
113
  exit
111
114
  end
112
115
  end
116
+ config_file = "/var/lib/qnotifier/qnotifier_config.yml"
117
+ unless File.exists?(config_file)
118
+ begin
119
+ puts "Setting default config file to #{config_file} (make your edits here)"
120
+ default_config_file = File.dirname(__FILE__) + "/../config/qnotifier_config.yml"
121
+ `cp #{default_config_file} #{var_dir}/qnotifier_config.yml`
122
+ rescue Exception => e
123
+ puts "Can't copy default config over: #{e}"
124
+ puts "Exiting"
125
+ exit
126
+ end
127
+ end
113
128
  end
114
129
 
115
130
  def self.setup_registration
@@ -124,9 +139,6 @@ module Qnotifier
124
139
  if qnotifier.register(register_code)
125
140
  puts "\nOK, the server has been successfully registered."
126
141
  puts "You now can control the agent as a daemon using 'qnotifier start|stop|restart'"
127
- copy_init
128
- puts "Doing initial update..."
129
- qnotifier.run
130
142
  puts "\nStarting Qnotifier daemon (qnotifier start)"
131
143
  `qnotifier start`
132
144
  else
@@ -138,21 +150,8 @@ module Qnotifier
138
150
  end
139
151
  end
140
152
 
141
- def self.copy_init
142
- print "\nWould you like to install a qnotifier init script in /etc/init.d? (y/n):"
143
- response = STDIN.gets.chomp.downcase!
144
- if response == "y" || response == "yes"
145
- init_file = File.dirname(__FILE__) + "/../init/qnotifier"
146
- qnotifier_location = `which qnotifier`
147
- if qnotifier_location
148
- `cat #{init_file} | sed 's/QNOTIFIER_DAEMON_LOCATION/#{qnotifier_location}/' > /etc/init.d/qnotifier;chmod a+x /etc/init.d/qnotifier`
149
- puts "Qnotifier init.d installed at /etc/init.d/qnotifier - you'll need to set it to start at various run levels"
150
- end
151
- end
152
- end
153
-
154
153
  def self.running
155
- pid_file = "/var/lib/qnotifier/qnotifer.pid"
154
+ pid_file = "/var/lib/qnotifier/qnotifier.pid"
156
155
  if File.exists?(pid_file)
157
156
  begin
158
157
  pid = `cat #{pid_file}`.to_i
@@ -168,7 +167,7 @@ module Qnotifier
168
167
  end
169
168
 
170
169
  def self.zap
171
- pid_file = "/var/lib/qnotifier/qnotifer.pid"
170
+ pid_file = "/var/lib/qnotifier/qnotifier.pid"
172
171
  if File.exists?(pid_file)
173
172
  `rm #{pid_file}`
174
173
  end
@@ -186,7 +185,7 @@ module Qnotifier
186
185
  `rm #{runlock_file}`
187
186
  end
188
187
 
189
- pid_file = "/var/lib/qnotifier/qnotifer.pid"
188
+ pid_file = "/var/lib/qnotifier/qnotifier.pid"
190
189
  if running
191
190
  puts "Daemon is already running, check pid #{pid_file}"
192
191
  exit
@@ -201,29 +200,20 @@ module Qnotifier
201
200
  STDOUT.reopen "/dev/null", "a"
202
201
  STDERR.reopen STDOUT
203
202
  trap("TERM") {daemon.stop; exit}
204
- `echo #{Process.pid} > /var/lib/qnotifier/qnotifer.pid`
205
- #Process.euid = 65534
206
- loop do
207
- cpid = fork do
208
- require "qnotifier"
209
- $0 = 'qnotifier-runner'
210
- qnotifier = Qnotifier::MainProcess.new
211
- qnotifier.run
212
- end
213
- Process.detach cpid
214
- sleep 30
215
- end
203
+ `echo #{Process.pid} > /var/lib/qnotifier/qnotifier.pid`
204
+ qnotifier = Qnotifier::MainProcess.new
205
+ qnotifier.run
216
206
  end
217
207
  Process.detach pid
218
208
  end
219
209
 
220
210
  def self.stop
221
211
  puts "Stopping QNotifier..."
222
- pid_file = "/var/lib/qnotifier/qnotifer.pid"
212
+ pid_file = "/var/lib/qnotifier/qnotifier.pid"
223
213
  if running
224
214
  pid = `cat #{pid_file}`.to_i
225
215
  Process.kill "TERM", pid
226
- `rm /var/lib/qnotifier/qnotifer.pid`
216
+ `rm /var/lib/qnotifier/qnotifier.pid`
227
217
  end
228
218
  end
229
219
  end
@@ -33,7 +33,7 @@ System:
33
33
  # Alert if the memory is above this percent usage, 0 disables
34
34
  alert_memory_threshold: 90
35
35
  # Alert if the load is above this percent usage, 0 disables
36
- alert_load_threshold: 1.5
36
+ alert_load_threshold: 2.0
37
37
  # Alert if the disk is above this percent usage, 0 disables
38
38
  alert_disk_threshold: 90
39
39
  # Partitions which to monitor for free disk space
@@ -66,14 +66,6 @@ Urls:
66
66
  enabled: false
67
67
  url: "http://localhost"
68
68
 
69
- # The Network Interface built-in plugin
70
- # Not currently supported
71
- Network:
72
- # Enabled, set to either true or false
73
- enabled: false
74
- interfaces:
75
- - eth0
76
-
77
69
  # The Nginx built-in plugin
78
70
  # You must compile nginx with --with-http_stub_status_module and point this url to the stub_status location
79
71
  Nginx:
@@ -86,13 +78,6 @@ Passenger:
86
78
  # Enabled, set to either true or false
87
79
  enabled: false
88
80
 
89
- # The Rails built-in plugin
90
- # Not currently supported
91
- Rails:
92
- # Enabled, set to either true or false
93
- enabled: false
94
- log_file: "/var/www/rails/log/production.log"
95
-
96
81
  # The Ruby built-in plugin
97
82
  Ruby:
98
83
  enabled: true
data/lib/plugin.rb CHANGED
@@ -12,15 +12,15 @@ module Qnotifier
12
12
  attr_accessor :stats
13
13
  attr_accessor :config
14
14
  attr_accessor :alert_count
15
-
15
+
16
16
  # The run method, do not override
17
- def run
17
+ def run
18
18
  @class_name = self.class.to_s.split("::").last
19
19
  @alert_count = 0
20
20
  @alerts = nil
21
21
  @reports = nil
22
22
  @stats = nil
23
-
23
+
24
24
  # Read the options from the global config and mix them in to the defaults for this plugin
25
25
  if @config[@class_name]
26
26
  @options = @defaults.update(@config[@class_name])
@@ -31,7 +31,8 @@ module Qnotifier
31
31
  # Only run this plugin if it's enabled
32
32
  return unless @options["enabled"]
33
33
 
34
- #Qnotifier.log.info("Plugin #{@class_name} running")
34
+ puts "Plugin #{@class_name} running" if $qnotifier_debug
35
+
35
36
  main
36
37
  end
37
38
 
data/lib/qnotifier.rb CHANGED
@@ -9,7 +9,7 @@ require "web_service"
9
9
  require "storage"
10
10
 
11
11
  module Qnotifier
12
- VERSION = "0.7.0".freeze
12
+ VERSION = "1.0.0".freeze
13
13
 
14
14
  def self.log
15
15
  unless @logger
@@ -44,62 +44,63 @@ module Qnotifier
44
44
  end
45
45
  end
46
46
 
47
- def run
48
- Qnotifier.log.debug "QNotifier Running"
49
-
50
- runlock_file = "/var/lib/qnotifier/.runlock"
51
- if File.exists?(runlock_file)
52
- puts "Runlock exists at #{runlock_file} - process already running? Exiting."
53
- exit
54
- else
55
- `echo #{Process.pid} > #{runlock_file}`
56
- end
57
-
47
+ def run
58
48
  start_logging
59
49
  load_config
60
50
 
61
- @alerts = {}
62
- @reports = {}
63
- @stats = {}
64
- @report_count = 0
65
-
51
+ Qnotifier.log.info "QNotifier Starting"
52
+
66
53
  if Qnotifier::Storage.get("server_disabled_pings")
67
54
  Qnotifier.log.fatal "Disabled by the Qnotifer API, please re-register (qnotifier --register key) this agent to enable. Exiting."
68
55
  exit
69
56
  end
70
-
57
+
71
58
  unless @config["api_key"]
72
59
  error_message = "Missing API Key, please register this agent first."
73
60
  puts error_message
74
61
  Qnotifier.log.fatal error_message
75
62
  exit
76
63
  end
77
-
64
+
65
+ # Our Plugins
66
+ @plugins = []
67
+
78
68
  # Load the built in plugins
79
69
  Dir[File.dirname(__FILE__) + '/../plugins/*.rb'].each do |file|
80
- process_plugin_file(file)
70
+ load_plugin_file(file)
81
71
  end
82
-
72
+
83
73
  # Load the user plugins
84
74
  Dir['/var/lib/qnotifier/plugins/*.rb'].each do |file|
85
- process_plugin_file(file)
75
+ load_plugin_file(file)
86
76
  end
87
-
88
- # Send the alerts, reports and stats to the API
77
+
78
+ # Load the web service
89
79
  webservice = Qnotifier::WebService.new
90
80
  webservice.config = @config
91
- webservice.send_alerts(@alerts)
92
- webservice.send_reports_stats(@reports, @stats, @alert_count)
93
-
94
- Qnotifier::Storage.save
95
-
96
- # Done, clean up and save
97
- Qnotifier::Storage.save
98
-
99
- `rm #{runlock_file}`
81
+
82
+ loop do
83
+ @alerts = {}
84
+ @reports = {}
85
+ @stats = {}
86
+ @report_count = 0
87
+
88
+ for plugin in @plugins
89
+ run_plugin(plugin)
90
+ end
91
+
92
+ # Send the alerts, reports and stats to the API
93
+ webservice.send_alerts(@alerts)
94
+ webservice.send_reports_stats(@reports, @stats, @alert_count)
95
+
96
+ Qnotifier::Storage.save
97
+
98
+ Qnotifier.log.debug "QNotifier Check Complete"
99
+ sleep 30
100
+ end
100
101
  end
101
-
102
- def process_plugin_file(file)
102
+
103
+ def load_plugin_file(file)
103
104
  return unless file =~ /\.rb/
104
105
  require file
105
106
  class_name = "Qnotifier::#{File.basename(file, ".rb").split(/[^a-z0-9]/i).map{|w| w.capitalize}.join}"
@@ -114,6 +115,10 @@ module Qnotifier
114
115
  Qnotifier.log.fatal "Attempted to load a non Qnotifier::Plugin plugin subclass at #{file} - make sure this directory only includes Qnotifier::Plugin subclasses"
115
116
  return
116
117
  end
118
+ @plugins << plugin
119
+ end
120
+
121
+ def run_plugin(plugin)
117
122
  begin
118
123
  Timeout.timeout 30 do
119
124
  plugin.run
@@ -123,7 +128,6 @@ module Qnotifier
123
128
  rescue Errno::ENOENT => e
124
129
  Qnotifier.log.error "#{class_name} Plugin Error: #{e.message}"
125
130
  end
126
-
127
131
  @alerts.merge!(plugin.alerts) if plugin.alerts
128
132
  @reports.merge!(plugin.reports) if plugin.reports
129
133
  @stats.merge!(plugin.stats) if plugin.stats
@@ -140,11 +144,11 @@ module Qnotifier
140
144
  end
141
145
 
142
146
  Qnotifier::Storage.wipe
143
-
147
+
144
148
  webservice = Qnotifier::WebService.new
145
149
  webservice.config = @config
146
150
  api_key = webservice.register_server(code)
147
-
151
+
148
152
  if api_key
149
153
  save_api_key(api_key)
150
154
  return api_key
@@ -186,6 +190,7 @@ module Qnotifier
186
190
  begin
187
191
  @config = YAML::load(File.open('/var/lib/qnotifier/qnotifier_config.yml'))
188
192
  rescue Exception => e
193
+ puts "Can't open /var/lib/qnotifier/qnotifier_config.yml"
189
194
  Qnotifier.log.error "Can't open /var/lib/qnotifier/qnotifier_config.yml"
190
195
  exit
191
196
  end
data/lib/web_service.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- require 'rest_client'
3
- require 'json'
2
+ require 'json/pure'
4
3
  require 'storage'
5
- require 'pp'
4
+ require 'net/http'
6
5
 
7
6
  module Qnotifier
8
7
  class WebService
@@ -11,28 +10,28 @@ module Qnotifier
11
10
 
12
11
  def initialize
13
12
  @@poll_interval = 300
14
- RestClient.proxy = ENV['http_proxy']
15
13
  end
16
14
 
17
15
  def send_alerts(alerts)
18
16
 
19
17
  return if alerts.empty?
20
18
 
19
+ unless @hostname
20
+ unless @config["hostname"]
21
+ @hostname = `hostname`.strip
22
+ else
23
+ @hostname = @config["hostname"]
24
+ end
25
+ end
26
+
21
27
  if $qnotifier_debug
22
28
  puts "\nAlerts:"
23
- pp alerts
29
+ puts alerts
24
30
  puts "\nNot sending alerts to server due to debug mode."
25
31
  return
26
32
  end
27
33
 
28
34
  Qnotifier.log.info "Sending alerts #{alerts}"
29
-
30
- # Hostname
31
- unless @config["hostname"]
32
- @hostname = `hostname`.strip
33
- else
34
- @hostname = @config["hostname"]
35
- end
36
35
 
37
36
  message = {"api_key" => @config["api_key"],
38
37
  "api_version" => "1.0",
@@ -41,28 +40,27 @@ module Qnotifier
41
40
  "alerts" => alerts}.to_json
42
41
 
43
42
  begin
44
- resource = RestClient::Resource.new(@config["api_endpoint"],
45
- :timeout => 30,
46
- :headers => { :user_agent => "Qnotifier-#{Qnotifier::VERSION}" })
47
- response = resource["/send_alert"].post(message, :content_type => 'application/json')
48
-
49
- if response.code == 200
50
- body = JSON.parse(response.body)
51
- if body[:poll_interval]
52
- @@poll_interval = body[:poll_interval].to_i
43
+ url = URI.parse("#{@config["api_endpoint"]}/send_alert")
44
+ req = Net::HTTP::Post.new(url.path)
45
+ req.body = message
46
+ req["Content-Type"] = "Qnotifier-#{Qnotifier::VERSION}"
47
+ req["User-Agent"] = "application/json"
48
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
49
+ case res
50
+ when Net::HTTPSuccess
51
+ body = JSON.parse(res.body)
52
+ if body["poll_interval"]
53
+ @@poll_interval = body["poll_interval"].to_i
53
54
  end
54
- Qnotifier.log.debug "Server Response: HTTP #{response.code} #{body[:message]}"
55
55
  else
56
- Qnotifier.log.warn "Server Response: HTTP #{response.code} #{response.body}"
56
+ Qnotifier.log.warn "Server Response: HTTP #{res.code} #{res.body}"
57
+ if res.code.to_i == 402
58
+ Qnotifier::Storage.put("server_disabled_pings", Time.now)
59
+ Qnotifier.log.error "Server has asked us to disable pings"
60
+ end
57
61
  end
58
-
59
62
  rescue Exception => e
60
- Qnotifier.log.error "Sending Alerts: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
61
- if e.message == "HTTP status code 402"
62
- # The server doesn't want to hear from us any more, disable pinging
63
- Qnotifier::Storage.put("server_disabled_pings", Time.now)
64
- Qnotifier.log.error "Server has asked us to disable pings"
65
- end
63
+ Qnotifier.log.error "Sending Alert: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
66
64
  end
67
65
  end
68
66
 
@@ -72,11 +70,11 @@ module Qnotifier
72
70
  last_run = Qnotifier::Storage.get("last_run")
73
71
  if $qnotifier_debug
74
72
  puts "\nStats:"
75
- pp stats
73
+ puts stats
76
74
  puts "\nReports:"
77
- pp reports
75
+ puts reports
78
76
  puts "\nNot sending data to server due to debug mode."
79
- return
77
+ exit
80
78
  end
81
79
  if last_run and (Time.now - last_run) <= @@poll_interval
82
80
  return
@@ -84,15 +82,16 @@ module Qnotifier
84
82
  Qnotifier::Storage.put("last_run", Time.now)
85
83
 
86
84
  return if reports.empty? and stats.empty?
87
- Qnotifier.log.info "Sending Reports and Stats"
88
-
89
- # Hostname
90
- unless @config["hostname"]
91
- @hostname = `hostname`.strip
92
- else
93
- @hostname = @config["hostname"]
85
+ Qnotifier.log.debug "Sending Reports and Stats"
86
+
87
+ unless @hostname
88
+ unless @config["hostname"]
89
+ @hostname = `hostname`.strip
90
+ else
91
+ @hostname = @config["hostname"]
92
+ end
94
93
  end
95
-
94
+
96
95
  message = {"api_key" => @config["api_key"],
97
96
  "api_version" => "1.0",
98
97
  "agent_version" => Qnotifier::VERSION,
@@ -102,62 +101,55 @@ module Qnotifier
102
101
  "reports" => reports}.to_json
103
102
 
104
103
  begin
105
- resource = RestClient::Resource.new(@config["api_endpoint"],
106
- :timeout => 30,
107
- :headers => { :user_agent => "Qnotifier-#{Qnotifier::VERSION}" })
108
- response = resource["/update_server"].post(message, :content_type => 'application/json')
109
-
110
- if response.code == 200
111
- body = JSON.parse(response.body)
112
- #Qnotifier.log.info "Response #{body.inspect}"
104
+ url = URI.parse("#{@config["api_endpoint"]}/update_server")
105
+ req = Net::HTTP::Post.new(url.path)
106
+ req.body = message
107
+ req["Content-Type"] = "Qnotifier-#{Qnotifier::VERSION}"
108
+ req["User-Agent"] = "application/json"
109
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
110
+ puts res.body
111
+ case res
112
+ when Net::HTTPSuccess
113
+ body = JSON.parse(res.body)
113
114
  if body["poll_interval"]
114
- @@poll_interval = body["poll_interval"].to_i
115
- #Qnotifier.log.info "Report polling interval is #{@@poll_interval}"
115
+ @@poll_interval = body["poll_interval"].to_i
116
116
  end
117
- Qnotifier.log.debug "Server Response: HTTP #{response.code} #{body[:message]}"
117
+ Qnotifier.log.debug "Server Response: HTTP #{res.code} #{body[:message]}"
118
118
  else
119
- Qnotifier.log.warn "Server Response: HTTP #{response.code} #{response.body}"
119
+ Qnotifier.log.warn "Server Response: HTTP #{res.code} #{res.body}"
120
+ if res.code.to_i == 402
121
+ puts "disabling pings"
122
+ Qnotifier::Storage.put("server_disabled_pings", Time.now)
123
+ Qnotifier.log.error "Server has asked us to disable pings"
124
+ end
120
125
  end
121
-
122
126
  rescue Exception => e
123
- Qnotifier.log.error "Sending Reports/Stats: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
124
- if e.message == "HTTP status code 402"
125
- # The server doesn't want to hear from us any more, disable pinging
126
- Qnotifier::Storage.put("server_disabled_pings", Time.now)
127
- Qnotifier.log.error "Server has asked us to disable pings"
128
- end
127
+ Qnotifier.log.error "Sending Reports/Stats: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
129
128
  end
130
129
  end
131
130
 
132
131
  def register_server(temp_key)
133
132
  return if temp_key.empty?
134
- Qnotifier.log.info "Registering Server"
135
-
136
- message = {"temp_key" => temp_key, "hostname" => `hostname`.strip}.to_json
137
-
133
+ Qnotifier.log.info "Registering Server"
138
134
  begin
139
- puts "Connecting to the QNotifier web service..."
140
- resource = RestClient::Resource.new(@config["api_endpoint"],
141
- :timeout => 30,
142
- :headers => { :user_agent => "Qnotifier-#{Qnotifier::VERSION}" })
143
- response = resource["/register_server"].post(message, :content_type => 'application/json')
144
-
145
- if response.code == 200 and response.body
146
- Qnotifier.log.debug "Registration Request Response: HTTP #{response.code} #{response.body}"
147
- return response.body
135
+ puts "Connecting to the QNotifier web service..."
136
+ url = URI.parse("#{@config["api_endpoint"]}/register_server")
137
+ req = Net::HTTP::Post.new(url.path)
138
+ req.body = {"temp_key" => temp_key, "hostname" => @hostname}.to_json
139
+ req["Content-Type"] = "Qnotifier-#{Qnotifier::VERSION}"
140
+ req["User-Agent"] = "application/json"
141
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
142
+ puts res.body
143
+ case res
144
+ when Net::HTTPSuccess
145
+ Qnotifier.log.debug "Registration Request Response: HTTP #{res.code} #{res.body}"
146
+ return res.body
148
147
  else
149
- Qnotifier.log.warn "Registration Request Response: HTTP #{response.code} #{response.body}"
148
+ Qnotifier.log.warn "Registration Request Response: HTTP #{res.code} #{res.body}"
150
149
  end
151
-
152
150
  rescue Exception => e
153
- if e.message == "Bad Request"
154
- puts "QNotifer web service: Can\'t find that code, please check it and try again.\n"
155
- Qnotifier.log.error "QNotifer web service: Can\'t find that code, please check it and try again."
156
- else
157
- Qnotifier.log.error "Registering Server: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
158
- end
151
+ Qnotifier.log.error "Registering Server: Can't connect to #{@config["api_endpoint"]} - #{e.message}"
159
152
  end
160
-
161
153
  return nil
162
154
  end
163
155
  end
data/plugins/system.rb CHANGED
@@ -36,9 +36,9 @@ module Qnotifier
36
36
  when "one_minute"
37
37
  load_average = load_one_minute
38
38
  when "five_minute"
39
- load_average = load_one_minute
39
+ load_average = load_five_minute
40
40
  else
41
- load_average = load_one_minute
41
+ load_average = load_fifteen_minute
42
42
  end
43
43
 
44
44
  report("Load", load_average)
@@ -130,7 +130,7 @@ module Qnotifier
130
130
  Qnotifier.log.error "Can't parse /proc/stat"
131
131
  end
132
132
  else
133
- Qnotifier.log.error "Can't parse CPU for this platform - #{RUBY_PLATFORM}"
133
+ Qnotifier.log.debug "Can't parse CPU for this platform - #{RUBY_PLATFORM}"
134
134
  end
135
135
 
136
136
  # Uname
@@ -166,7 +166,7 @@ module Qnotifier
166
166
  end
167
167
 
168
168
  else
169
- Qnotifier.log.error "Can't parse Memory for this platform - #{RUBY_PLATFORM}"
169
+ Qnotifier.log.debug "Can't parse Memory for this platform - #{RUBY_PLATFORM}"
170
170
  end
171
171
 
172
172
  end
data/qnotifier.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{qnotifier}
5
- s.version = "0.7.6"
5
+ s.version = "1.0.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Gersham Meharg"]
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.email = %q{gersham@qnotifier.com}
13
13
  s.executables = ["qnotifier"]
14
14
  s.extra_rdoc_files = ["bin/qnotifier", "lib/plugin.rb", "lib/qnotifier.rb", "lib/storage.rb", "lib/web_service.rb"]
15
- s.files = ["Manifest", "Rakefile", "bin/qnotifier", "config/README", "config/qnotifier_config.yml", "gem-public_cert.pem", "lib/plugin.rb", "lib/qnotifier.rb", "lib/storage.rb", "lib/web_service.rb", "plugins/apache.rb", "plugins/mysql.rb", "plugins/network.rb", "plugins/nginx.rb", "plugins/passenger.rb", "plugins/rails.rb", "plugins/ruby.rb", "plugins/system.rb", "plugins/urls.rb", "init.d/qnotifier", "qnotifier.gemspec"]
15
+ s.files = ["Manifest", "Rakefile", "bin/qnotifier", "config/README", "config/qnotifier_config.yml", "gem-public_cert.pem", "lib/plugin.rb", "lib/qnotifier.rb", "lib/storage.rb", "lib/web_service.rb", "plugins/apache.rb", "plugins/mysql.rb", "plugins/nginx.rb", "plugins/passenger.rb", "plugins/ruby.rb", "plugins/system.rb", "plugins/urls.rb", "init.d/qnotifier", "qnotifier.gemspec"]
16
16
  s.homepage = %q{http://qnotifier.com/qnotifier_gem}
17
17
  s.post_install_message = %q{Qnotifier installed, please register by running 'qnotifier' in order to register this server.}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Qnotifier"]
@@ -28,24 +28,12 @@ Gem::Specification.new do |s|
28
28
  s.specification_version = 3
29
29
 
30
30
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
31
- s.add_runtime_dependency(%q<rest-client>, [">= 1.4.2"])
32
- s.add_runtime_dependency(%q<json>, [">= 1.2.3"])
33
- s.add_runtime_dependency(%q<elif>, [">= 0.1.0"])
34
- s.add_runtime_dependency(%q<robustthread>, [">= 0.5.2"])
35
- s.add_development_dependency(%q<rest-client>, [">= 1.4.2"])
36
- s.add_development_dependency(%q<json>, [">= 1.2.3"])
37
- s.add_development_dependency(%q<elif>, [">= 0.1.0"])
38
- s.add_development_dependency(%q<robustthread>, [">= 0.5.2"])
31
+ s.add_runtime_dependency(%q<json_pure>, [">= 1.2.3"])
32
+ s.add_development_dependency(%q<json_pure>, [">= 1.2.3"])
39
33
  else
40
- s.add_dependency(%q<rest-client>, [">= 1.4.2"])
41
- s.add_dependency(%q<json>, [">= 1.2.3"])
42
- s.add_dependency(%q<elif>, [">= 0.1.0"])
43
- s.add_dependency(%q<robustthread>, [">= 0.5.2"])
34
+ s.add_dependency(%q<json_pure>, [">= 1.2.3"])
44
35
  end
45
36
  else
46
- s.add_dependency(%q<rest-client>, [">= 1.4.2"])
47
- s.add_dependency(%q<json>, [">= 1.2.3"])
48
- s.add_dependency(%q<elif>, [">= 0.1.0"])
49
- s.add_dependency(%q<robustthread>, [">= 0.5.2"])
37
+ s.add_dependency(%q<json_pure>, [">= 1.2.3"])
50
38
  end
51
39
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -3,10 +3,10 @@ name: qnotifier
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
- - 7
8
- - 6
9
- version: 0.7.6
8
+ - 0
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gersham Meharg
@@ -39,24 +39,9 @@ date: 2010-07-06 00:00:00 -07:00
39
39
  default_executable: qnotifier
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
- name: rest-client
42
+ name: json_pure
43
43
  prerelease: false
44
44
  requirement: &id001 !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- segments:
50
- - 1
51
- - 4
52
- - 2
53
- version: 1.4.2
54
- type: :runtime
55
- version_requirements: *id001
56
- - !ruby/object:Gem::Dependency
57
- name: json
58
- prerelease: false
59
- requirement: &id002 !ruby/object:Gem::Requirement
60
45
  none: false
61
46
  requirements:
62
47
  - - ">="
@@ -67,56 +52,11 @@ dependencies:
67
52
  - 3
68
53
  version: 1.2.3
69
54
  type: :runtime
70
- version_requirements: *id002
71
- - !ruby/object:Gem::Dependency
72
- name: elif
73
- prerelease: false
74
- requirement: &id003 !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- segments:
80
- - 0
81
- - 1
82
- - 0
83
- version: 0.1.0
84
- type: :runtime
85
- version_requirements: *id003
86
- - !ruby/object:Gem::Dependency
87
- name: robustthread
88
- prerelease: false
89
- requirement: &id004 !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
- - 5
97
- - 2
98
- version: 0.5.2
99
- type: :runtime
100
- version_requirements: *id004
101
- - !ruby/object:Gem::Dependency
102
- name: rest-client
103
- prerelease: false
104
- requirement: &id005 !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- segments:
110
- - 1
111
- - 4
112
- - 2
113
- version: 1.4.2
114
- type: :development
115
- version_requirements: *id005
55
+ version_requirements: *id001
116
56
  - !ruby/object:Gem::Dependency
117
- name: json
57
+ name: json_pure
118
58
  prerelease: false
119
- requirement: &id006 !ruby/object:Gem::Requirement
59
+ requirement: &id002 !ruby/object:Gem::Requirement
120
60
  none: false
121
61
  requirements:
122
62
  - - ">="
@@ -127,37 +67,7 @@ dependencies:
127
67
  - 3
128
68
  version: 1.2.3
129
69
  type: :development
130
- version_requirements: *id006
131
- - !ruby/object:Gem::Dependency
132
- name: elif
133
- prerelease: false
134
- requirement: &id007 !ruby/object:Gem::Requirement
135
- none: false
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- segments:
140
- - 0
141
- - 1
142
- - 0
143
- version: 0.1.0
144
- type: :development
145
- version_requirements: *id007
146
- - !ruby/object:Gem::Dependency
147
- name: robustthread
148
- prerelease: false
149
- requirement: &id008 !ruby/object:Gem::Requirement
150
- none: false
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- segments:
155
- - 0
156
- - 5
157
- - 2
158
- version: 0.5.2
159
- type: :development
160
- version_requirements: *id008
70
+ version_requirements: *id002
161
71
  description: The server side agent for the QNotifier monitoring system. This software will monitor local Linux system parameters and upload them to the QNotifier servers where users can use iPhone/iPad applications to view those stats and recieve alerts.
162
72
  email: gersham@qnotifier.com
163
73
  executables:
@@ -183,10 +93,8 @@ files:
183
93
  - lib/web_service.rb
184
94
  - plugins/apache.rb
185
95
  - plugins/mysql.rb
186
- - plugins/network.rb
187
96
  - plugins/nginx.rb
188
97
  - plugins/passenger.rb
189
- - plugins/rails.rb
190
98
  - plugins/ruby.rb
191
99
  - plugins/system.rb
192
100
  - plugins/urls.rb
metadata.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- �\�_�UE��G��-8B�������7�|���B��~��`�~� 0T
2
- �ۏݫamY��M�jS�w�L��_�U�sc”��N��kl&E�X�XP� ) �+q��i�eߥ�`�P��,n��`�� W�Q�v���'�G6���CS��B��G]2Cx�X3�"P
1
+ ���r���> ��Kk���S@��h�
2
+ o굃��B�=�u�1�Æ�o��hi[Ny��Q5[
data/plugins/network.rb DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- module Qnotifier
3
- class Network < Qnotifier::Plugin
4
-
5
- def initialize
6
- @defaults = {
7
- }
8
- end
9
-
10
- def main
11
- Qnotifier.log.error "Network plugin not yet supported in this beta version"
12
- end
13
- end
14
- end
data/plugins/rails.rb DELETED
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require "elif"
3
-
4
- module Qnotifier
5
- class Rails < Qnotifier::Plugin
6
-
7
- def initialize
8
- @defaults = {
9
- :rails_log_file => "/var/www/rails/log/production.log"
10
- }
11
- patch_elif
12
- end
13
-
14
- def main
15
- Qnotifier.log.error "Rails plugin not yet supported in this beta version"
16
- end
17
-
18
- def patch_elif
19
- if Elif::VERSION < "0.2.0"
20
- Elif.send(:define_method, :pos) do
21
- @current_pos +
22
- @line_buffer.inject(0) { |bytes, line| bytes + line.size }
23
- end
24
- end
25
- end
26
-
27
- def read_backwards_to_timestamp(path, timestamp)
28
- start = nil
29
- Elif.open(path) do |elif|
30
- elif.each do |line|
31
- if line =~ /\AProcessing .+ at (\d+-\d+-\d+ \d+:\d+:\d+)\)/
32
- time_of_request = Time.parse($1)
33
- if time_of_request < timestamp
34
- break
35
- else
36
- start = elif.pos
37
- end
38
- end
39
- end
40
- end
41
-
42
- file = open(path)
43
- file.seek(start) if start
44
- file
45
- end
46
- end
47
- end