gaddygaddy 0.1.78
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/bin/gaddygaddy-client +10 -0
- data/bin/interval +8 -0
- data/conf/development.yml +0 -0
- data/conf/gaddy.yml +2 -0
- data/conf/log4r.yml +47 -0
- data/conf/test.yml +1 -0
- data/lib/device_info/device_info.rb +60 -0
- data/lib/gaddygaddy-client/chef_files.rb +98 -0
- data/lib/gaddygaddy-client/device_config.rb +0 -0
- data/lib/gaddygaddy-client/espeak.rb +26 -0
- data/lib/gaddygaddy-client/log_data.rb +42 -0
- data/lib/gaddygaddy-client/notification/espeak.rb +32 -0
- data/lib/gaddygaddy-client/notification/file_notification.rb +43 -0
- data/lib/gaddygaddy-client/notification/file_notification.rb~ +36 -0
- data/lib/gaddygaddy-client/notification/sensu.rb +40 -0
- data/lib/gaddygaddy-client/notification/wall.rb +25 -0
- data/lib/gaddygaddy-client/notification.rb +73 -0
- data/lib/gaddygaddy-client/svn-commit.tmp~ +4 -0
- data/lib/gaddygaddy-client.rb +396 -0
- data/lib/gaddygaddy-client.rb~ +425 -0
- data/lib/gg_config/gg_config.rb +162 -0
- data/lib/interval.rb +280 -0
- data/lib/logging/logging.rb +62 -0
- data/lib/utils/hash_monkeypatch.rb +34 -0
- data/lib/utils/request.rb +52 -0
- data/lib/utils/retriable.rb +63 -0
- data/lib/utils/run.rb +20 -0
- data/locales/en.yml +24 -0
- data/locales/sv.yml +11 -0
- metadata +160 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6179815ad86f1edb1a7571347aecf67360b39176
|
4
|
+
data.tar.gz: a9fbac4944dcd4a58676f6cf866c1f687b1fa935
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4cb37474da862c7cfe4900f4148469f3368d72e64d6eea01201e4200025bf9c688c04d6744a9efc6320ea617f467e8968fa5b87d8bf549e7e2681ad156879327
|
7
|
+
data.tar.gz: b5b47bc9e70fe9608ec09fb0aa5a0857cb3d0741ecdf019eb14fe8e375f5b59b0baacdb4f105a9d713b56cd065ad5c558a047633bc3a6208b9768c8658040fbc
|
data/bin/interval
ADDED
File without changes
|
data/conf/gaddy.yml
ADDED
data/conf/log4r.yml
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
log4r_config:
|
2
|
+
# define all loggers ...
|
3
|
+
loggers:
|
4
|
+
- name : gaddygaddy-client
|
5
|
+
level : DEBUG
|
6
|
+
trace : 'false'
|
7
|
+
outputters:
|
8
|
+
- stderr
|
9
|
+
- stdout
|
10
|
+
- name : default
|
11
|
+
level : DEBUG
|
12
|
+
trace : 'false'
|
13
|
+
outputters:
|
14
|
+
- stderr
|
15
|
+
- stdout
|
16
|
+
- name : interval
|
17
|
+
level : DEBUG
|
18
|
+
trace : 'false'
|
19
|
+
outputters:
|
20
|
+
- stderr
|
21
|
+
- stdout
|
22
|
+
outputters:
|
23
|
+
- type : StderrOutputter
|
24
|
+
name : stderr
|
25
|
+
level : WARN
|
26
|
+
formatter:
|
27
|
+
date_pattern: '%y%m%d %H:%M:%S'
|
28
|
+
pattern : "[%5l] %d :: %m"
|
29
|
+
type : PatternFormatter
|
30
|
+
|
31
|
+
- type : StdoutOutputter
|
32
|
+
name : stdout
|
33
|
+
level : DEBUG
|
34
|
+
formatter:
|
35
|
+
date_pattern: '%y%m%d %H:%M:%S'
|
36
|
+
pattern : "[%5l] %d :: %m"
|
37
|
+
type : PatternFormatter
|
38
|
+
|
39
|
+
- type : StderrOutputter
|
40
|
+
name : stderr_test
|
41
|
+
level : ERROR
|
42
|
+
formatter:
|
43
|
+
date_pattern: '%y%m%d %H:%M:%S'
|
44
|
+
# Added 'M' and 't' here - they are slow, but we're not calling unless we need to
|
45
|
+
pattern : "[%5l] %d :: %M :: %t"
|
46
|
+
type : PatternFormatter
|
47
|
+
|
data/conf/test.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
file_dir: ../../tmp/
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# device_data.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
# Will handle data about the client like node info from Ohai that will tell everything like ip-address, macaddress,
|
10
|
+
# hw config etc. The data will be sent to the GaddyGaddy service
|
11
|
+
#
|
12
|
+
# Copyright (c) 2013 GaddyGaddy
|
13
|
+
#
|
14
|
+
# All rights reserved.
|
15
|
+
#
|
16
|
+
|
17
|
+
require_relative '../logging/logging'
|
18
|
+
require 'ohai'
|
19
|
+
|
20
|
+
class DeviceInfo
|
21
|
+
include Logging
|
22
|
+
extend Logging
|
23
|
+
|
24
|
+
def initialize(host, gg_config)
|
25
|
+
@host = host
|
26
|
+
@gg_config = gg_config
|
27
|
+
end
|
28
|
+
|
29
|
+
# Give the host name set previous
|
30
|
+
def host
|
31
|
+
@host
|
32
|
+
end
|
33
|
+
|
34
|
+
def gg_config
|
35
|
+
@gg_config
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get data about the client by using the Ohai component developed by Opscode
|
39
|
+
def get_ohai_data
|
40
|
+
Ohai::Config[:plugin_path] << '/etc/chef/ohai_plugins'
|
41
|
+
ohai_system = Ohai::System.new
|
42
|
+
ohai_system.all_plugins
|
43
|
+
ohai_system.data
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get the device data, if the data does not exist get it from Ohai
|
47
|
+
def data
|
48
|
+
@data||=get_ohai_data
|
49
|
+
end
|
50
|
+
|
51
|
+
# Will post the device data to the client service
|
52
|
+
def post
|
53
|
+
url = Request.get_base_url(host) + "/device/set_device_data/1/#{gg_config.config[:user_id_salt]}/#{gg_config.config[:device_id]}/#{gg_config.config[:token]}"
|
54
|
+
logger.debug "Will post this ohai data:\n #{data}"
|
55
|
+
response = Request.client_service_post url, :ohai_data => data
|
56
|
+
logger.debug "The response for the request is #{response} #{response.class}"
|
57
|
+
raise JCouldNotPostClientDataException.new({:message=> "Could not post data to the gaddygaddy service, error code is #{response.body}"}) unless response[:status].to_i == 0
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# chef_files.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
|
12
|
+
|
13
|
+
DEFAULT_FILE_HOST_PORT = 80
|
14
|
+
|
15
|
+
require_relative '../utils/run'
|
16
|
+
|
17
|
+
class ChefFiles
|
18
|
+
|
19
|
+
include Logging
|
20
|
+
|
21
|
+
def initialize(config, ap_host, chef_dir)
|
22
|
+
@config = config
|
23
|
+
@ap_host = ap_host
|
24
|
+
@chef_dir = chef_dir
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the version of cookbook installed at the system
|
28
|
+
|
29
|
+
def installed_cookbook_version
|
30
|
+
installed_versions = Dir.glob(File.join(@chef_dir, 'cookbooks_version_[0-9]*'))
|
31
|
+
installed_versions.size > 0 ? installed_versions.map{|file| File.basename(file.split('_')[2])}.max : 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_version_file(version)
|
35
|
+
File.open(File.join(@chef_dir,'cookbooks_version_' + version.to_s), "w") do |f|
|
36
|
+
f.puts "Version: #{version}"
|
37
|
+
f.puts "Created at #{Time.now}"
|
38
|
+
f.close
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_cookbook_version
|
43
|
+
response = Request.client_service_get @ap_host, "/chef/cookbooks_version/1/#{@config.user_id_salt}/#{@config.device_id}/#{@config.token}"
|
44
|
+
raise "Could not get cookbook version" unless response['cookbooks_version']
|
45
|
+
logger.debug "Got cookbook version: #{response}"
|
46
|
+
response['cookbooks_version']
|
47
|
+
end
|
48
|
+
|
49
|
+
# Will return cookbook_uri depending on cookbook version
|
50
|
+
# -1 is not supported in production
|
51
|
+
def cookbook_path(prod_version, version)
|
52
|
+
if prod_version
|
53
|
+
'/' + URI.encode("pkg/gg_chef_#{version}.tar.gz")
|
54
|
+
else
|
55
|
+
'/chef/latest_cookbook'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Will check version of installed cookbooks and update if it's old
|
61
|
+
#
|
62
|
+
def get_cookbooks(file_host, cookbooks_version)
|
63
|
+
version = cookbooks_version ? cookbooks_version : get_cookbook_version.to_s
|
64
|
+
installed_version = installed_cookbook_version.to_s
|
65
|
+
prod_version = version.split('_')[0].to_s != '0'
|
66
|
+
return if installed_version.size > 0 && (installed_version.to_s == version.to_s) && prod_version
|
67
|
+
tmp_file = "/tmp/cookbooks-#{version}.tar.gz"
|
68
|
+
port = DEFAULT_FILE_HOST_PORT
|
69
|
+
file_host = prod_version ? file_host : @ap_host
|
70
|
+
# The file host should be without http or port
|
71
|
+
file_host = file_host.split("://")[1] if file_host.index("://")
|
72
|
+
file_host,port = file_host.split(":") if file_host.index(":")
|
73
|
+
Net::HTTP.start(file_host, port) do |http|
|
74
|
+
begin
|
75
|
+
http.read_timeout = 500
|
76
|
+
file = open(tmp_file, 'wb')
|
77
|
+
logger.debug "Will request the cookbooks files from http://#{file_host}:#{port}#{cookbook_path(prod_version, version)}"
|
78
|
+
result = http.request_get(cookbook_path(prod_version, version)) do |response|
|
79
|
+
response.read_body do |segment|
|
80
|
+
file.write(segment)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
logger.debug "The tar cookbook request response was #{result.inspect}"
|
84
|
+
ensure
|
85
|
+
file.close
|
86
|
+
end
|
87
|
+
end
|
88
|
+
logger.debug "Will untar the file to #{@chef_dir} and then remove file #{tmp_file}"
|
89
|
+
FileUtils.mkdir_p @chef_dir
|
90
|
+
# Check that the tar file is valid first
|
91
|
+
cmd = "tar --test-label -zvf #{tmp_file} && rm -rf #{@chef_dir}/* && tar -C #{@chef_dir} -zxvf #{tmp_file}"
|
92
|
+
run_cmd cmd
|
93
|
+
create_version_file version
|
94
|
+
cmd_remove = "rm #{tmp_file}"
|
95
|
+
run_cmd cmd_remove
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# espeak.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
# Will manage espeak
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
require 'stringex'
|
17
|
+
|
18
|
+
class ESpeak
|
19
|
+
|
20
|
+
def self.speak to_speak
|
21
|
+
file_name = to_speak.to_ascii.replace_whitespace('-').gsub('/','-')
|
22
|
+
wav_file = "/tmp/#{file_name}.wav"
|
23
|
+
`/usr/bin/espeak -w #{wav_file} "#{to_speak}"` unless File.exist?(wav_file)
|
24
|
+
`/usr/bin/aplay #{wav_file}`
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# log_data.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
# Will get log_data from a log file
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
class LogData
|
17
|
+
|
18
|
+
#
|
19
|
+
# Get a specific number of lines from a log file
|
20
|
+
#
|
21
|
+
def self.get_log_data(log_file_name, lines)
|
22
|
+
unless log_file_name.index('/')
|
23
|
+
log_file_name = log_file_name + '.log' unless log_file_name[-4..-1] == '.log'
|
24
|
+
log_file_name = "/opt/log/#{log_file_name[0..-5]}/#{log_file_name}"
|
25
|
+
end
|
26
|
+
raise "File #{log_file_name} does not exist" unless File.exist?(log_file_name)
|
27
|
+
cmd = "tail -n #{lines} #{log_file_name}"
|
28
|
+
exit_code, stdout = systemu cmd
|
29
|
+
if exit_code.success?
|
30
|
+
stdout
|
31
|
+
else
|
32
|
+
'Could not read log_data from ' + log_file_name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Get the time when the log file was last modified
|
38
|
+
#
|
39
|
+
def self.get_log_file_time(log_file_name)
|
40
|
+
File.mtime(log_file_name).to_s
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# espeak.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
# Will notify via the speakers
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
require_relative '../espeak'
|
17
|
+
|
18
|
+
module Notification
|
19
|
+
class ESpeakNotification
|
20
|
+
|
21
|
+
def self.espeak?
|
22
|
+
`whereis espeak`.index('bin')
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.notify(event, message_text)
|
26
|
+
if espeak?
|
27
|
+
ESpeak.speak message_text
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# file.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
# Will write the notification to a file
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
module Notification
|
17
|
+
|
18
|
+
class FileNotification
|
19
|
+
|
20
|
+
def self.file_dir= file_dir
|
21
|
+
@file_dir = file_dir
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.file_dir
|
25
|
+
@file_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.notify(event, message_text)
|
29
|
+
f=File.open(File.join(file_dir,'gaddy_notification.log'), 'a')
|
30
|
+
f.write "#{event['event_time'].strftime('%Y-%m-%d %H:%M')} #{event['type']} #{message_text}\n"
|
31
|
+
f.fsync
|
32
|
+
f.close
|
33
|
+
end
|
34
|
+
|
35
|
+
# This will check if the text is already in the log file
|
36
|
+
def self.text_in_log_file message
|
37
|
+
log_file=File.join(file_dir,'gaddy_notification.log')
|
38
|
+
`/bin/grep '#{message}' #{log_file} `.strip.length > 0
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# file.rb
|
4
|
+
#
|
5
|
+
# Created by: mansson
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
# Will write the notification to a file
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
module Notification
|
17
|
+
|
18
|
+
class FileNotification
|
19
|
+
|
20
|
+
def self.file_dir= file_dir
|
21
|
+
@file_dir = file_dir
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.file_dir
|
25
|
+
@file_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.notify(event, message_text)
|
29
|
+
f=File.open(File.join(file_dir,'gaddy_notification.log'), 'w')
|
30
|
+
f.write "#{event['event_time'].strftime('%Y-%m-%d %H:%M')} #{event['type']} #{message_text}\n"
|
31
|
+
f.close
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# sensu.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
module Notification
|
17
|
+
|
18
|
+
SENSU_HOST = 'localhost'
|
19
|
+
SENSU_PORT = 3030
|
20
|
+
|
21
|
+
class Sensu
|
22
|
+
# To change this template use File | Settings | File Templates.
|
23
|
+
def self.notify(event, message_text)
|
24
|
+
report = {
|
25
|
+
:name => "gaddy_notification",
|
26
|
+
:output => event.to_json,
|
27
|
+
:status => 2,
|
28
|
+
:handler => 'send_event'
|
29
|
+
}
|
30
|
+
|
31
|
+
begin
|
32
|
+
s = TCPSocket.open(SENSU_HOST, SENSU_PORT)
|
33
|
+
s.print JSON.generate(report)
|
34
|
+
s.close
|
35
|
+
rescue Exception => e
|
36
|
+
puts e.message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# wall.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
#
|
10
|
+
|
11
|
+
module Notification
|
12
|
+
class Wall
|
13
|
+
|
14
|
+
def self.wall?
|
15
|
+
`whereis wall`.index('bin')
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.notify(event, message_text)
|
19
|
+
if wall?
|
20
|
+
systemu("echo 'Gaddy says: #{message_text}'|wall")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# Name:
|
3
|
+
# notification.rb
|
4
|
+
#
|
5
|
+
# Created by: GaddyGaddy
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# Copyright (c) 2013 GaddyGaddy
|
12
|
+
#
|
13
|
+
# All rights reserved.
|
14
|
+
#
|
15
|
+
|
16
|
+
require_relative '../logging/logging'
|
17
|
+
require_relative 'notification/file_notification'
|
18
|
+
require_relative 'notification/espeak'
|
19
|
+
require_relative 'notification/sensu'
|
20
|
+
require_relative 'notification/wall'
|
21
|
+
require 'i18n'
|
22
|
+
|
23
|
+
module Notification
|
24
|
+
class Send
|
25
|
+
include Logging
|
26
|
+
|
27
|
+
def initialize(options = {})
|
28
|
+
I18n.load_path += Dir[File.join(File.dirname(__FILE__), '..','..','locales', '*.yml').to_s]
|
29
|
+
@speech_enabled = options[:speech_enabled]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Language is english for now, we need to add a language parameter to the user info or config for gaddygaddy
|
33
|
+
def language
|
34
|
+
'en'
|
35
|
+
end
|
36
|
+
|
37
|
+
def event= event
|
38
|
+
@event = JSON.parse(event)
|
39
|
+
end
|
40
|
+
|
41
|
+
def event
|
42
|
+
@event
|
43
|
+
end
|
44
|
+
|
45
|
+
def message_as_text
|
46
|
+
logger.debug "Will create message from event #{event['message_key']}"
|
47
|
+
translated_text = I18n.t event['message_key'], {locale: language}
|
48
|
+
count_values = translated_text.split("%").count - 1
|
49
|
+
if event['message_values']||count_values > 0
|
50
|
+
if count_values == event['message_values'].length
|
51
|
+
translated_text % event['message_values']
|
52
|
+
else
|
53
|
+
raise "Mismatch between the text for #{event['message_key']} - #{translated_text} have #{count_values} %s and the size of event values array is #{event['message_values'].length}"
|
54
|
+
end
|
55
|
+
else
|
56
|
+
translated_text
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Will do notifications to different sources like log file, web site and even speak
|
61
|
+
|
62
|
+
def notify(device_id)
|
63
|
+
event['event_time'] = Time.now unless event['event_time']
|
64
|
+
event['device_id'] = device_id
|
65
|
+
# Need to test before we put stuff in log file
|
66
|
+
should_speak = ! Notification::FileNotification.text_in_log_file(message_as_text)
|
67
|
+
Notification::Wall.notify(event, message_as_text)
|
68
|
+
Notification::FileNotification.notify(event, message_as_text)
|
69
|
+
Notification::Sensu.notify(event, message_as_text)
|
70
|
+
Notification::ESpeakNotification.notify(event, message_as_text) if should_speak && @speech_enabled
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|