zabbix-ruby-client 0.0.17 → 0.0.18

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.
Files changed (42) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +6 -9
  4. data/lib/zabbix-ruby-client/data.rb +6 -4
  5. data/lib/zabbix-ruby-client/plugin_base.rb +41 -0
  6. data/lib/zabbix-ruby-client/plugins/apache.rb +1 -1
  7. data/lib/zabbix-ruby-client/plugins/apt.rb +32 -10
  8. data/lib/zabbix-ruby-client/plugins/cpu.rb +32 -23
  9. data/lib/zabbix-ruby-client/plugins/disk.rb +52 -33
  10. data/lib/zabbix-ruby-client/plugins/load.rb +22 -15
  11. data/lib/zabbix-ruby-client/plugins/memory.rb +48 -26
  12. data/lib/zabbix-ruby-client/plugins/network.rb +26 -17
  13. data/lib/zabbix-ruby-client/plugins/nginx.rb +1 -0
  14. data/lib/zabbix-ruby-client/plugins/postgres.rb +64 -0
  15. data/lib/zabbix-ruby-client/version.rb +1 -1
  16. data/spec/files/plugins/sample_buggy.rb +11 -0
  17. data/spec/files/plugins/sample_discover.rb +12 -0
  18. data/spec/files/system/apache_status +7 -6
  19. data/spec/files/system/apt-check +1 -0
  20. data/spec/files/system/df +1 -0
  21. data/spec/files/system/diskstats +1 -0
  22. data/spec/files/system/loadavg +1 -0
  23. data/spec/files/system/meminfo +46 -0
  24. data/spec/files/system/net_dev +1 -0
  25. data/spec/files/system/proc_cpu +1 -0
  26. data/spec/files/task_discovery.yml +3 -0
  27. data/spec/lib/cli_spec.rb +44 -6
  28. data/spec/lib/data_spec.rb +58 -1
  29. data/spec/lib/plugin_base_spec.rb +54 -0
  30. data/spec/lib/plugins/apache_spec.rb +78 -5
  31. data/spec/lib/plugins/apt_spec.rb +45 -0
  32. data/spec/lib/plugins/cpu_spec.rb +51 -1
  33. data/spec/lib/plugins/disk_spec.rb +77 -1
  34. data/spec/lib/plugins/load_spec.rb +41 -0
  35. data/spec/lib/plugins/memory_spec.rb +83 -2
  36. data/spec/lib/plugins/network_spec.rb +60 -1
  37. data/spec/lib/plugins_spec.rb +3 -1
  38. data/templates/client/postgres.yml +3 -0
  39. data/zabbix-ruby-client.gemspec +1 -0
  40. data/zabbix-templates/postgres_tpl.xml +833 -0
  41. metadata +79 -15
  42. checksums.yaml +0 -7
data/.gitignore CHANGED
@@ -12,3 +12,4 @@ spec/reports
12
12
  test/tmp
13
13
  test/version_tmp
14
14
  tmp
15
+ .settings
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  Zabbbix Ruby Client Changelog
2
2
  -----------------------------
3
3
 
4
+ ### v0.0.18 - 2013-12-13
5
+
6
+ * total fix on CPU usage plugin
7
+ * added a postgres plugin (per database)
8
+ * refactoring of plugins
9
+ * fixed typo on count of start processes in apache plugin
10
+ * made plugin collection optional, so you can have a plugin for only discovery
11
+ * more tests and coverage
12
+
4
13
  ### v0.0.17 - 2013-10-31
5
14
 
6
15
  * bugfix on requires
data/README.md CHANGED
@@ -91,10 +91,13 @@ There are a set of standart plugins included in the package, aimed at linux syst
91
91
  * sysinfo (uses uname -a) is populating the host info in the inventory, and should be ran at setup and/or monthly [sysinfo_tpl](master/zabbix-templates/sysinfo_tpl.xml)
92
92
  * apache (depends on mod_status with status_extended on) [apache_tpl](master/zabbix-templates/apache_tpl.xml)
93
93
  * mysql (uses mysqladmin extended-status) [mysql_tpl](master/zabbix-templates/mysql_tpl.xml)
94
+ * postgres (uses psql and pg_stat_database) [postgres_tpl](master/zabbix-templates/postgres_tpl.xml)
95
+ * best is to use a .pgpass file see http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html
94
96
  * nginx (requires httpStubStatus nginx module) [nginx_tpl](master/zabbix-templates/nginx_tpl.xml)
95
97
  * redis (uses redis-cli info) [redis_tpl](master/zabbix-templates/redis_tpl.xml)
96
98
  * args [ "/path/to/redis-cli", "options to connect" ]
97
99
 
100
+
98
101
  You can add extra plugins in a plugins/ dir in the working dir, just by copying one of the existing plugins in the repo and change to your need. All plugins present in plugins/ will be loaded if present in the config file you use. That can be convenient to test by using the -t flag, for example `bundle exec zrc -t testplugin.yml` where testplugin.yml only contains the name and args for yoiur plugin.
99
102
 
100
103
  ## Custom plugins how-to
@@ -159,7 +162,7 @@ I first created on both sides an autossh user with no console and no password:
159
162
  sudo useradd -m -r -s /bin/false -d /usr/local/zabtunnel zabtunnel
160
163
  ```
161
164
 
162
- On the zabbix server I created a key that I transfered to the clients in `/usr/local/zabtunnel/,ssh/authorized_keys`
165
+ On the zabbix server I created a key that I transfered to the clients in `/usr/local/zabtunnel/.ssh/authorized_keys`
163
166
 
164
167
  ```
165
168
  sudo su -s /bin/bash - zabtunnel
@@ -197,25 +200,19 @@ ListenIP 127.0.0.1
197
200
 
198
201
  ## Todo
199
202
 
200
- * read /proc rather than rely on installed tools (done)
201
- * write tests
203
+ * improve templates for graphs
202
204
  * add more plugins
203
205
  * memcache
204
- * redis
205
206
  * mysql master/slave
207
+ * postgres replication
206
208
  * monit
207
209
  * passenger
208
- * nginx (done)
209
210
  * logged users
210
211
  * denyhosts
211
212
  * postfix
212
213
  * sendgrid
213
214
  * airbrake
214
- * disk occupation (done)
215
215
  * try to work out a way to create host/graphs/alerts from the client using Zabbix API
216
- * verify compatibility with ruby 1.9 (done)
217
- * create a resend system that will store timed data on client if connection to server fails, and will send pending (missed) data on next batch.
218
-
219
216
 
220
217
  ## Contributing
221
218
 
@@ -11,18 +11,20 @@ module ZabbixRubyClient
11
11
  end
12
12
 
13
13
  def run_plugin(plugin, args = nil)
14
- Plugins.load(plugin) || logger.error( "Plugin #{plugin} not found.")
14
+ Plugins.load(plugin) || ZabbixRubyClient::Log.error( "Plugin #{plugin} not found.")
15
15
  if Plugins.loaded[plugin]
16
16
  begin
17
- @items += Plugins.loaded[plugin].send(:collect, @host, *args)
17
+ if Plugins.loaded[plugin].respond_to?(:collect)
18
+ @items += Plugins.loaded[plugin].send(:collect, @host, *args)
19
+ end
18
20
  if Plugins.loaded[plugin].respond_to?(:discover)
19
21
  key, value = Plugins.loaded[plugin].send(:discover, *args)
20
22
  @discover[key] ||= []
21
23
  @discover[key] << [ value ]
22
24
  end
23
25
  rescue Exception => e
24
- Log.fatal "Oops"
25
- Log.fatal e.message
26
+ ZabbixRubyClient::Log.fatal "Oops"
27
+ ZabbixRubyClient::Log.fatal e.message
26
28
  end
27
29
  end
28
30
  end
@@ -0,0 +1,41 @@
1
+ require "zabbix-ruby-client/logger"
2
+
3
+ module ZabbixRubyClient
4
+ module PluginBase
5
+ extend self
6
+
7
+ def httprequest(url)
8
+ end
9
+
10
+ def perform(command)
11
+ end
12
+
13
+ def getline(file, pattern=false)
14
+ if File.readable? file
15
+ File.open(file,'r') do |f|
16
+ f.each do |l|
17
+ line = l.strip
18
+ if pattern
19
+ if Regexp.new(pattern).match line
20
+ Log.debug "File #{file}: #{line}"
21
+ return line
22
+ end
23
+ else
24
+ return line
25
+ end
26
+ end
27
+ end
28
+ Log.warn "File #{file}: pattern \"#{pattern}\" not found."
29
+ false
30
+ else
31
+ if File.file? file
32
+ Log.error "File not readable: #{file}"
33
+ else
34
+ Log.error "File not found: #{file}"
35
+ end
36
+ false
37
+ end
38
+ end
39
+
40
+ end
41
+ end
@@ -32,7 +32,7 @@ module ZabbixRubyClient
32
32
  back << "#{host} apache[c_log] #{time} #{ret["Score"]["L"]}"
33
33
  back << "#{host} apache[c_read] #{time} #{ret["Score"]["R"]}"
34
34
  back << "#{host} apache[c_send] #{time} #{ret["Score"]["W"]}"
35
- back << "#{host} apache[c_start] #{time}#{ret["Score"]["S"]}"
35
+ back << "#{host} apache[c_start] #{time} #{ret["Score"]["S"]}"
36
36
  return back
37
37
  end
38
38
 
@@ -7,19 +7,41 @@ module ZabbixRubyClient
7
7
 
8
8
  def collect(*args)
9
9
  host = args[0]
10
- aptcheck = `/usr/lib/update-notifier/apt-check 2>&1`
11
- if $?.to_i == 0
12
- security, pending = aptcheck.split(/;/).map(&:to_i)
10
+ info = get_info
11
+ if info
12
+ time = Time.now.to_i
13
+ back = []
14
+ back << "#{host} apt[security] #{time} #{info[0]}"
15
+ back << "#{host} apt[pending] #{time} #{info[1]}"
16
+ back << "#{host} apt[status] #{time} TODO apt #{info[0]}/#{info[1]}"
17
+ return back
13
18
  else
14
- Log.warn "Are you running on ubuntu ?"
15
19
  return []
16
20
  end
17
- time = Time.now.to_i
18
- back = []
19
- back << "#{host} apt[security] #{time} #{security}"
20
- back << "#{host} apt[pending] #{time} #{pending}"
21
- back << "#{host} apt[status] #{time} TODO apt #{security}/#{pending}"
22
- return back
21
+ end
22
+
23
+ private
24
+
25
+ def get_info
26
+ info = aptinfo
27
+ if info
28
+ back = info.split(/;/).map(&:to_i)
29
+ back
30
+ else
31
+ false
32
+ end
33
+ end
34
+
35
+ def aptinfo
36
+ output = `/usr/lib/update-notifier/apt-check 2>&1`
37
+ if $?.to_i == 0
38
+ Log.debug self
39
+ Log.debug output
40
+ output
41
+ else
42
+ Log.warn "Oh you don't have apt ?"
43
+ false
44
+ end
23
45
  end
24
46
 
25
47
  end
@@ -1,4 +1,4 @@
1
- # for more info check
1
+ # for more info check
2
2
  # http://www.linuxhowtos.org/System/procstat.htm
3
3
  # http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average
4
4
  require "zabbix-ruby-client/logger"
@@ -7,34 +7,43 @@ module ZabbixRubyClient
7
7
  module Plugins
8
8
  module Cpu
9
9
  extend self
10
+ extend ZabbixRubyClient::PluginBase
10
11
 
11
12
  def collect(*args)
12
13
  host = args[0]
13
- cpuinfo = `cat /proc/stat | grep "^cpu"`
14
- if $?.to_i == 0
15
- _, user, nice, sys, idle, wait, irq, soft, guest, steal = cpuinfo.split(/\s+/).map(&:to_i)
16
- else
17
- Log.warn "Oh you don't have a /proc ?"
18
- return []
14
+ info = get_info
15
+ back = []
16
+ if info
17
+ time = Time.now.to_i
18
+ info.each do |k,v|
19
+ back << "#{host} cpu[#{k}] #{time} #{v}"
20
+ end
19
21
  end
20
- used = user + nice + sys
21
- total = used + idle
22
+ back
23
+ end
22
24
 
23
- time = Time.now.to_i
24
- back = []
25
- back << "#{host} cpu[user] #{time} #{user}"
26
- back << "#{host} cpu[nice] #{time} #{nice}"
27
- back << "#{host} cpu[system] #{time} #{sys}"
28
- back << "#{host} cpu[iowait] #{time} #{wait}"
29
- back << "#{host} cpu[irq] #{time} #{irq}"
30
- back << "#{host} cpu[soft] #{time} #{soft}"
31
- back << "#{host} cpu[steal] #{time} #{steal}"
32
- back << "#{host} cpu[guest] #{time} #{guest}"
33
- back << "#{host} cpu[idle] #{time} #{idle}"
34
- back << "#{host} cpu[used] #{time} #{used}"
35
- back << "#{host} cpu[total] #{time} #{total}"
36
- return back
25
+ private
37
26
 
27
+ def get_info
28
+ ret = {}
29
+ info = getline("/proc/stat", "^cpu ")
30
+ if info
31
+ back = info.split(/\s+/).map(&:to_i)
32
+ ret["user"] = back[1]
33
+ ret["nice"] = back[2]
34
+ ret["system"] = back[3]
35
+ ret["idle"] = back[4]
36
+ ret["iowait"] = back[5]
37
+ ret["irq"] = back[6]
38
+ ret["soft"] = back[7]
39
+ ret["steal"] = back[8] || 0
40
+ ret["guest"] = back[9] || 0
41
+ ret["used"] = back[1...4].reduce(&:+)
42
+ ret["total"] = back[1...9].reduce(&:+)
43
+ ret
44
+ else
45
+ false
46
+ end
38
47
  end
39
48
 
40
49
  end
@@ -2,48 +2,37 @@
2
2
  # http://www.xaprb.com/blog/2010/01/09/how-linux-iostat-computes-its-results/
3
3
  # http://www.mjmwired.net/kernel/Documentation/iostats.txt
4
4
  require "zabbix-ruby-client/logger"
5
+ require "zabbix-ruby-client/plugin_base"
5
6
 
6
7
  module ZabbixRubyClient
7
8
  module Plugins
8
9
  module Disk
9
10
  extend self
11
+ extend ZabbixRubyClient::PluginBase
10
12
 
11
13
  def collect(*args)
12
14
  host = args[0]
13
15
  dev = args[1]
14
16
  mapped = args[3] || dev
15
- diskspace = `df | grep "#{mapped}"`
16
- if $?.to_i == 0
17
- _, size, used, available, percent_used, mount = diskspace.split(/\s+/)
18
- else
19
- Log.error "df is not working... ouchie."
20
- return []
21
- end
22
- time = Time.now.to_i
23
- back = []
24
- back << "#{host} disk.space[#{mapped},size] #{time} #{size.to_i * 1000}"
25
- back << "#{host} disk.space[#{mapped},used] #{time} #{used.to_i * 1000}"
26
- back << "#{host} disk.space[#{mapped},available] #{time} #{available.to_i * 1000}"
27
- back << "#{host} disk.space[#{mapped},percent_used] #{time} #{percent_used.gsub(/%/,'')}"
28
-
29
- if dev != ""
30
- diskinfo = `cat /proc/diskstats | grep " #{dev} "`
31
- if $?.to_i == 0
32
- _, _, _, _, read_ok, read_merged, read_sector, read_time, write_ok, write_merged, write_sector, write_time, io_current, io_time, io_weighted = diskinfo.split(/\s+/)
33
- else
34
- logger.warn "Oh there is no such device."
35
- return []
36
- end
37
- back << "#{host} disk.io[#{mapped},read_ok] #{time} #{read_ok}"
38
- back << "#{host} disk.io[#{mapped},read_merged] #{time} #{read_merged}"
39
- back << "#{host} disk.io[#{mapped},read_sector] #{time} #{read_sector}"
40
- back << "#{host} disk.io[#{mapped},read_time] #{time} #{read_time}"
41
- back << "#{host} disk.io[#{mapped},write_ok] #{time} #{write_ok}"
42
- back << "#{host} disk.io[#{mapped},write_merged] #{time} #{write_merged}"
43
- back << "#{host} disk.io[#{mapped},write_sector] #{time} #{write_sector}"
44
- back << "#{host} disk.io[#{mapped},write_time] #{time} #{write_time}"
45
- back << "#{host} disk.io[#{mapped},io_time] #{time} #{io_time}"
46
- back << "#{host} disk.io[#{mapped},io_weighted] #{time} #{io_weighted}"
17
+
18
+ info = get_info(dev, mapped)
19
+ if info
20
+ time = Time.now.to_i
21
+ back = []
22
+ back << "#{host} disk.space[#{mapped},size] #{time} #{info[1].to_i * 1000}"
23
+ back << "#{host} disk.space[#{mapped},used] #{time} #{info[2].to_i * 1000}"
24
+ back << "#{host} disk.space[#{mapped},available] #{time} #{info[3].to_i * 1000}"
25
+ back << "#{host} disk.space[#{mapped},percent_used] #{time} #{info[4].gsub(/%/,'')}"
26
+ back << "#{host} disk.io[#{mapped},read_ok] #{time} #{info[9]}"
27
+ back << "#{host} disk.io[#{mapped},read_merged] #{time} #{info[10]}"
28
+ back << "#{host} disk.io[#{mapped},read_sector] #{time} #{info[11]}"
29
+ back << "#{host} disk.io[#{mapped},read_time] #{time} #{info[12]}"
30
+ back << "#{host} disk.io[#{mapped},write_ok] #{time} #{info[13]}"
31
+ back << "#{host} disk.io[#{mapped},write_merged] #{time} #{info[14]}"
32
+ back << "#{host} disk.io[#{mapped},write_sector] #{time} #{info[15]}"
33
+ back << "#{host} disk.io[#{mapped},write_time] #{time} #{info[16]}"
34
+ back << "#{host} disk.io[#{mapped},io_time] #{time} #{info[17]}"
35
+ back << "#{host} disk.io[#{mapped},io_weighted] #{time} #{info[18]}"
47
36
  end
48
37
  return back
49
38
  end
@@ -52,7 +41,37 @@ module ZabbixRubyClient
52
41
  device = args[0]
53
42
  mount = args[1]
54
43
  mapped = args[2] || device
55
- [ "disk.dev.discovery", "{\"{#DISK_DEVICE}\": \"#{mapped}\", \"{#DISK_MOUNT}\": \"#{mount}\"}" ]
44
+ [ "disk.dev.discovery",
45
+ "{\"{#DISK_DEVICE}\": \"#{mapped}\", \"{#DISK_MOUNT}\": \"#{mount}\"}"
46
+ ]
47
+ end
48
+
49
+ private
50
+
51
+ def get_info(disk, device)
52
+ info = diskinfo(disk)
53
+ if info
54
+ back = info.split(/\s+/)
55
+ io = getline("/proc/diskstats", " #{device} ")
56
+ if io
57
+ back += io.split(/\s+/)
58
+ end
59
+ back
60
+ else
61
+ false
62
+ end
63
+ end
64
+
65
+ def diskinfo(disk)
66
+ output = `df | grep "#{disk}"`
67
+ if $?.to_i == 0
68
+ Log.debug self
69
+ Log.debug output
70
+ output
71
+ else
72
+ Log.warn "Oh there is no such device."
73
+ false
74
+ end
56
75
  end
57
76
 
58
77
  end
@@ -1,33 +1,40 @@
1
1
  # for more info check
2
2
  # http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average
3
- require "zabbix-ruby-client/logger"
3
+ require "zabbix-ruby-client/plugin_base"
4
4
 
5
5
  module ZabbixRubyClient
6
6
  module Plugins
7
7
  module Load
8
8
  extend self
9
+ extend ZabbixRubyClient::PluginBase
9
10
 
10
11
  def collect(*args)
11
12
  host = args[0]
12
- #cpuinfo = `mpstat | grep " all "`
13
- cpuinfo = `cat /proc/loadavg`
14
- if $?.to_i == 0
15
- one, five, fifteen, procs_t = cpuinfo.split(/\s+/)
13
+ info = get_info
14
+ if info
15
+ time = Time.now.to_i
16
+ back = []
17
+ back << "#{host} load[one] #{time} #{info[0]}"
18
+ back << "#{host} load[five] #{time} #{info[1]}"
19
+ back << "#{host} load[fifteen] #{time} #{info[2]}"
20
+ back << "#{host} load[procs] #{time} #{info[3]}"
21
+ return back
16
22
  else
17
- Log.warn "Oh you don't have a /proc ?"
18
23
  return []
19
24
  end
25
+ end
20
26
 
21
- procs, _ = procs_t.split(/\//)
22
-
23
- time = Time.now.to_i
24
- back = []
25
- back << "#{host} load[one] #{time} #{one}"
26
- back << "#{host} load[five] #{time} #{five}"
27
- back << "#{host} load[fifteen] #{time} #{fifteen}"
28
- back << "#{host} load[procs] #{time} #{procs}"
29
- return back
27
+ private
30
28
 
29
+ def get_info
30
+ info = getline("/proc/loadavg")
31
+ if info
32
+ back = info.split(/\s+/)
33
+ back[3] = back[3].split(/\//)[0]
34
+ back
35
+ else
36
+ false
37
+ end
31
38
  end
32
39
 
33
40
  end
@@ -1,49 +1,71 @@
1
1
  require "zabbix-ruby-client/logger"
2
+ require "zabbix-ruby-client/plugin_base"
2
3
 
3
4
  module ZabbixRubyClient
4
5
  module Plugins
5
6
  module Memory
6
7
  extend self
8
+ extend ZabbixRubyClient::PluginBase
7
9
 
8
10
  def collect(*args)
9
11
  host = args[0]
10
- meminfo = `cat /proc/meminfo`
11
- if $?.to_i == 0
12
- info = splitinfo(meminfo)
12
+ info = get_info
13
+ if info
14
+ time = Time.now.to_i
15
+ back = []
16
+ back << "#{host} memory[total] #{time} #{info['MemTotal']}"
17
+ back << "#{host} memory[free] #{time} #{info['MemFree']}"
18
+ back << "#{host} memory[used] #{time} #{info['MemUsed']}"
19
+ back << "#{host} memory[percent_used] #{time} #{info['MemPercent']}"
20
+ back << "#{host} memory[swap_total] #{time} #{info['SwapTotal']}"
21
+ back << "#{host} memory[swap_free] #{time} #{info['SwapFree']}"
22
+ back << "#{host} memory[swap_used] #{time} #{info['SwapUsed']}"
23
+ back << "#{host} memory[swap_percent_used] #{time} #{info['SwapPercent']}"
24
+ return back
13
25
  else
14
- Log.warn "Please install sysstat."
15
26
  return []
16
27
  end
28
+ end
17
29
 
18
- mem_total = info["MemTotal"] * 1024
19
- mem_free = (info['MemFree'] + info['Buffers'] + info['Cached']) * 1024
20
- mem_used = mem_total - mem_free
21
- mem_percent = (mem_used / mem_total.to_f * 100).to_i
22
- swap_total = info['SwapTotal'] * 1024
23
- swap_free = info['SwapFree'] * 1024
24
- swap_used = swap_total - swap_free
25
- swap_percent = 0
26
- unless swap_total == 0
27
- swap_percent = (swap_used / swap_total.to_f * 100).to_i
30
+ private
31
+
32
+ def get_info
33
+ info = meminfo
34
+ if info
35
+ back = splitinfo(info)
36
+ back["MemTotal"] = back["MemTotal"] * 1024
37
+ back["MemFree"] = (back['MemFree'] + back['Buffers'] + back['Cached']) * 1024
38
+ back["MemUsed"] = back["MemTotal"] - back["MemFree"]
39
+ back["MemPercent"] = (back["MemUsed"] / back["MemTotal"].to_f * 100).to_i
40
+ back['SwapTotal'] = back['SwapTotal'] * 1024
41
+ back['SwapFree'] = back['SwapFree'] * 1024
42
+ back['SwapUsed'] = back['SwapTotal'] - back['SwapFree']
43
+ back['SwapPercent'] = 0
44
+ unless back['SwapTotal'] == 0
45
+ back['SwapPercent'] = (back['SwapUsed'] / back['SwapTotal'].to_f * 100).to_i
46
+ end
47
+ back
48
+ else
49
+ false
28
50
  end
51
+ end
29
52
 
30
- time = Time.now.to_i
31
- back = []
32
- back << "#{host} memory[total] #{time} #{mem_total}"
33
- back << "#{host} memory[used] #{time} #{mem_used}"
34
- back << "#{host} memory[free] #{time} #{mem_free}"
35
- back << "#{host} memory[percent_used] #{time} #{mem_percent}"
36
- back << "#{host} memory[swap_total] #{time} #{swap_total}"
37
- back << "#{host} memory[swap_used] #{time} #{swap_used}"
38
- back << "#{host} memory[swap_free] #{time} #{swap_free}"
39
- back << "#{host} memory[swap_percent_used] #{time} #{swap_percent}"
40
- return back
53
+ def meminfo
54
+ output = `cat /proc/meminfo`
55
+ if $?.to_i == 0
56
+ Log.debug self
57
+ Log.debug output
58
+ output
59
+ else
60
+ Log.warn "Oh there is no such device."
61
+ false
62
+ end
41
63
  end
42
64
 
43
65
  def splitinfo(info)
44
66
  info.split(/\n/).map(&:strip).reduce({}) do |a,line|
45
67
  _, key, value = *line.match(/^(\w+):\s+(\d+)\s/)
46
- a[key] = value.to_i
68
+ a[key] = value.to_i if key
47
69
  a
48
70
  end
49
71
  end