internet_box_logger 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +46 -0
- data/.rspec +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +72 -0
- data/LICENSE.txt +22 -0
- data/README.md +230 -0
- data/Rakefile +4 -0
- data/bin/internet_box_logger +102 -0
- data/config/internet_box_logger.conf +13 -0
- data/config/kibana_reports/FreeboxV5_report.json +860 -0
- data/config/schedule.rb +36 -0
- data/internet_box_logger.gemspec +31 -0
- data/lib/internet_box_logger/elastic_search.rb +61 -0
- data/lib/internet_box_logger/generic_box.rb +21 -0
- data/lib/internet_box_logger/parsers/freebox_v5_parser.rb +127 -0
- data/lib/internet_box_logger/parsers/utils.rb +116 -0
- data/lib/internet_box_logger/parsers.rb +12 -0
- data/lib/internet_box_logger/version.rb +3 -0
- data/lib/internet_box_logger.rb +17 -0
- data/lib/tasks/cron.rb +28 -0
- data/lib/tasks/elastic_search.rb +67 -0
- data/lib/tasks/file.rb +26 -0
- data/lib/tasks/internet_box_logger_tasks.rake +84 -0
- data/lib/tasks/internet_box_logger_tasks.rb +17 -0
- data/lib/tasks/kibana.rb +59 -0
- data/spec/elastic_search_spec.rb +6 -0
- data/spec/internet_box_logger_spec.rb +28 -0
- data/spec/parsers_spec.rb +64 -0
- data/spec/spec_helper.rb +94 -0
- data/test/freebox_page_example.txt +103 -0
- metadata +194 -0
data/config/schedule.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Use this file to easily define all of your cron jobs.
|
2
|
+
#
|
3
|
+
# It's helpful, but not entirely necessary to understand cron before proceeding.
|
4
|
+
# http://en.wikipedia.org/wiki/Cron
|
5
|
+
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# set :output, "/path/to/my/cron_log.log"
|
9
|
+
#
|
10
|
+
# every 2.hours do
|
11
|
+
# command "/usr/bin/some_great_command"
|
12
|
+
# runner "MyModel.some_method"
|
13
|
+
# rake "some:great:rake:task"
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# every 4.days do
|
17
|
+
# runner "AnotherModel.prune_old_records"
|
18
|
+
# end
|
19
|
+
|
20
|
+
# Learn more: http://github.com/javan/whenever
|
21
|
+
|
22
|
+
# Default interval
|
23
|
+
# To actually set the default interval, use cron_interval in your application config
|
24
|
+
require 'active_support/all'
|
25
|
+
|
26
|
+
@interval ||= 1
|
27
|
+
|
28
|
+
this_gem_path = File.expand_path('../..', __FILE__)
|
29
|
+
set :path, this_gem_path
|
30
|
+
set :output, "#{this_gem_path}/log/cron.log"
|
31
|
+
|
32
|
+
job_type :ruby_script, 'cd :path && bundle exec ruby bin/:task :output'
|
33
|
+
|
34
|
+
every @interval.to_i.minute do
|
35
|
+
ruby_script 'internet_box_logger'
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'internet_box_logger/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'internet_box_logger'
|
8
|
+
spec.version = InternetBoxLogger::VERSION
|
9
|
+
spec.authors = ['Laurent B']
|
10
|
+
spec.email = ['lbnetid+gh@gmail.com']
|
11
|
+
spec.summary = %q{Monitor your internet box.}
|
12
|
+
spec.description = %q{Logs information gathered from your internet box and stores into ElasticSearch for display into Kibana.}
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'pry'
|
25
|
+
|
26
|
+
spec.add_dependency 'activesupport'
|
27
|
+
spec.add_dependency 'whenever'
|
28
|
+
spec.add_dependency 'easy_app_helper'
|
29
|
+
spec.add_dependency 'elasticsearch'
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module InternetBoxLogger
|
2
|
+
module ElasticSearch
|
3
|
+
|
4
|
+
module Server
|
5
|
+
|
6
|
+
def self.[]
|
7
|
+
EasyAppHelper.config[:elastic_servers] || EasyAppHelper.config[:default_elastic_search]['elastic_servers']
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.local_path
|
11
|
+
EasyAppHelper.config[:elastic_binary] || EasyAppHelper.config[:default_elastic_search]['elastic_binary']
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.local?
|
15
|
+
!remote?
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.manageable?
|
19
|
+
!(remote? || local_path.nil? )
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.remote?
|
23
|
+
# res = true
|
24
|
+
# return nil if Server[].nil? || Server.empty?
|
25
|
+
# Server[].each do |addr|
|
26
|
+
# if
|
27
|
+
#
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
local_path.nil?
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
def elasticsearch_client
|
39
|
+
@elasticsearch_client ||= Elasticsearch::Client.new hosts: Server[], log: EasyAppHelper.config[:debug], reload_connections: true
|
40
|
+
end
|
41
|
+
|
42
|
+
def save
|
43
|
+
internal_representation = []
|
44
|
+
EasyAppHelper.logger.debug 'Saving measurements to ElasticSearch'
|
45
|
+
self.as_es_documents.each do |document|
|
46
|
+
begin
|
47
|
+
EasyAppHelper.logger.debug " - #{document[:body][:name]}"
|
48
|
+
internal_representation << elasticsearch_client.index(**document)
|
49
|
+
rescue => e
|
50
|
+
EasyAppHelper.logger.error e.message
|
51
|
+
end
|
52
|
+
end
|
53
|
+
@internal_es_representation = internal_representation
|
54
|
+
EasyAppHelper.puts_and_logs 'Your box metrics have been indexed into Elastic Search'
|
55
|
+
self
|
56
|
+
rescue
|
57
|
+
EasyAppHelper.logger.error 'Unable to save to ElasticSearch !!'
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
module InternetBoxLogger
|
3
|
+
class GenericBox
|
4
|
+
|
5
|
+
include InternetBoxLogger::ElasticSearch
|
6
|
+
|
7
|
+
def initialize(box_type)
|
8
|
+
box_type = box_type.to_s if box_type.is_a? Symbol
|
9
|
+
box_type = self.class.const_get box_type if box_type.is_a? String
|
10
|
+
box_parser_module = box_type if InternetBoxLogger::Parsers[].include? box_type
|
11
|
+
self.extend box_parser_module
|
12
|
+
end
|
13
|
+
|
14
|
+
def log_box_info
|
15
|
+
save if get_box_data
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module InternetBoxLogger
|
4
|
+
module Parsers
|
5
|
+
module FreeboxV5Parser
|
6
|
+
|
7
|
+
include InternetBoxLogger::Parsers::Utils
|
8
|
+
|
9
|
+
DEFAULT_STATUS_URL = 'http://mafreebox.free.fr/pub/fbx_info.txt'
|
10
|
+
|
11
|
+
EXPECTED_LINES = [
|
12
|
+
/version du firmware\s+(?<firmware_version>[\d\.]+)\s*$/i ,
|
13
|
+
/mode de connection\s+(?<connection_mode>[[:alpha:]]+)\s*$/i ,
|
14
|
+
/temps depuis la mise en route\s+(?<up_time>.*)$/i ,
|
15
|
+
/etat\s+(?<phone_status>[[:alpha:]]+)\s*$/i ,
|
16
|
+
/etat du combiné\s+(?<phone_hanged_up>[[:alpha:]]+)\s*$/i ,
|
17
|
+
/sonnerie\s+(?<phone_ringing>[[:alpha:]]+)\s*$/i ,
|
18
|
+
/etat\s+(?<adsl_status>[[:alpha:]]+)\s*$/i ,
|
19
|
+
/protocole\s+(?<adsl_protocol>[^\s]+)\s*$/i ,
|
20
|
+
/mode\s+(?<adsl_mode>[[:alpha:]]+)\s*$/i ,
|
21
|
+
/débit atm\s+(?<adsl_atm_bandwidth_down>[\d\.]+\s+[^\s]+)\s+(?<adsl_atm_bandwidth_up>[\d\.]+\s+[^\s]+)\s*$/i ,
|
22
|
+
/marge de bruit\s+(?<adsl_noise_margin_down>[\d\.]+\s+[^\s]+)\s+(?<adsl_noise_margin_up>[\d\.]+\s+[^\s]+)\s*$/i ,
|
23
|
+
/atténuation\s+(?<adsl_attenuation_down>[\d\.]+\s+[^\s]+)\s+(?<adsl_attenuation_up>[\d\.]+\s+[^\s]+)\s*$/i ,
|
24
|
+
/fec\s+(?<adsl_fec_down>\d+)\s+(?<adsl_fec_up>\d+)\s*$/i ,
|
25
|
+
/crc\s+(?<adsl_crc_down>\d+)\s+(?<adsl_crc_up>\d+)\s*$/i ,
|
26
|
+
/hec\s+(?<adsl_hec_down>\d+)\s+(?<adsl_hec_up>\d+)\s*$/i ,
|
27
|
+
/etat\s+wifi\s+(?<wifi_state>[[:alpha:]]+)\s*$/i ,
|
28
|
+
/canal\s+(?<wifi_chanel>[\d]+)\s*$/i ,
|
29
|
+
/tat du r[eé]seau\s+(?<wifi_network_state>[[:alpha:]]+)\s*$/i ,
|
30
|
+
/freewifi\s+(?<wifi_freewifi_state>[[:alpha:]]+)\s*$/i ,
|
31
|
+
/freewifi secure\s+(?<wifi_freewifi_secure_state>[[:alpha:]]+)\s*$/i ,
|
32
|
+
/adresse mac freebox\s+(?<network_mac>[\dabcdefABCDEF:]+)\s*$/i ,
|
33
|
+
/\s+(?<network_public_ipv4>[\d\.]+)\s*$/i ,
|
34
|
+
/mode routeur\s+(?<network_router>[[:alpha:]]+)\s*$/i ,
|
35
|
+
/adresse ip privée\s+(?<network_private_ipv4>[\d\.]+)\s*$/i ,
|
36
|
+
/adresse ip dmz\s+(?<network_dmz_ipv4>[\d\.]+)\s*$/i ,
|
37
|
+
/adresse ip freeplayer\s+(?<network_freeplayer_ipv4>[\d\.]+)\s*$/i ,
|
38
|
+
/réponse au ping\s+(?<network_answer_to_ping>[[:alpha:]]+)\s*$/i ,
|
39
|
+
/proxy wake on lan\s+(?<network_wake_on_lan>[[:alpha:]]+)\s*$/i ,
|
40
|
+
/serveur dhcp\s+(?<network_dhcp>[[:alpha:]]+)\s*$/i ,
|
41
|
+
/plage d'adresses dynamiques?\s+(?<network_dhcp_range>[\d\.\s-]+[^\s])\s*$/i ,
|
42
|
+
]
|
43
|
+
|
44
|
+
FIELD_POST_PROCESSING = {
|
45
|
+
up_time: :to_duration,
|
46
|
+
phone_status: :to_bool,
|
47
|
+
phone_hanged_up: :to_bool,
|
48
|
+
phone_ringing: :to_bool,
|
49
|
+
wifi_chanel: :to_int,
|
50
|
+
wifi_state: :to_bool,
|
51
|
+
wifi_network_state: :to_bool,
|
52
|
+
wifi_freewifi_state: :to_bool,
|
53
|
+
wifi_freewifi_secure_state: :to_bool,
|
54
|
+
network_answer_to_ping: :to_bool,
|
55
|
+
network_wake_on_lan: :to_bool,
|
56
|
+
network_dhcp: :to_bool,
|
57
|
+
network_router: :to_bool,
|
58
|
+
adsl_atm_bandwidth_up: :to_bandwidth,
|
59
|
+
adsl_atm_bandwidth_down: :to_bandwidth,
|
60
|
+
adsl_noise_margin_up: :to_db,
|
61
|
+
adsl_noise_margin_down: :to_db,
|
62
|
+
adsl_attenuation_up: :to_db,
|
63
|
+
adsl_attenuation_down: :to_db,
|
64
|
+
adsl_crc_up: :to_num,
|
65
|
+
adsl_crc_down: :to_num,
|
66
|
+
adsl_fec_up: :to_num,
|
67
|
+
adsl_fec_down: :to_num,
|
68
|
+
adsl_hec_up: :to_num,
|
69
|
+
adsl_hec_down: :to_num,
|
70
|
+
}
|
71
|
+
|
72
|
+
UP_DOWN_REPORTS = {
|
73
|
+
adsl_noise_margin: 'Noise Margin',
|
74
|
+
adsl_atm_bandwidth: 'ATM Bandwidth',
|
75
|
+
adsl_attenuation: 'Attenuation',
|
76
|
+
adsl_crc: 'CRC',
|
77
|
+
adsl_fec: 'FEC',
|
78
|
+
adsl_hec: 'HEC'
|
79
|
+
}
|
80
|
+
|
81
|
+
attr_accessor :raw_data, :attributes
|
82
|
+
|
83
|
+
def get_status_url
|
84
|
+
EasyAppHelper.config[:freebox_alternate_url] ? EasyAppHelper.config[:freebox_alternate_url] : DEFAULT_STATUS_URL
|
85
|
+
end
|
86
|
+
|
87
|
+
def up_down_reports
|
88
|
+
UP_DOWN_REPORTS
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_box_data
|
92
|
+
regexp_list = EXPECTED_LINES.dup
|
93
|
+
current_regexp = nil
|
94
|
+
@raw_data, @attributes = [], {}
|
95
|
+
skip_parsing = false
|
96
|
+
open(get_status_url).readlines.each do |line|
|
97
|
+
@raw_data << line
|
98
|
+
next if skip_parsing
|
99
|
+
begin
|
100
|
+
current_regexp = regexp_list.shift if current_regexp.nil?
|
101
|
+
rescue
|
102
|
+
EasyAppHelper.logger.info 'Got all data. Do not parse the rest of the data.'
|
103
|
+
skip_parsing = true
|
104
|
+
end
|
105
|
+
break if current_regexp.nil?
|
106
|
+
line.encode('utf-8').match current_regexp do |md|
|
107
|
+
md.names.each do |field|
|
108
|
+
EasyAppHelper.logger.info "#{field} => #{md[field]}"
|
109
|
+
@attributes[field.to_sym] = normalize_value(field.to_sym, md)
|
110
|
+
current_regexp = nil
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
# Check if the parsing has been complete
|
115
|
+
regexp_list.empty? ? self : nil
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
def normalize_value(field_name, match_data)
|
120
|
+
return match_data[field_name] unless FIELD_POST_PROCESSING[field_name]
|
121
|
+
self.send FIELD_POST_PROCESSING[field_name], field_name, match_data[field_name]
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module InternetBoxLogger
|
2
|
+
module Parsers
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
CONSIDERED_TRUE = %w(actif active activée activé ok true connectée connecté on décroché 1)
|
6
|
+
CONSIDERED_FALSE = %w(inactif inactive desactivé desactivée deconnecté deconnectée désactivé désactivée déconnecté déconnectée ko false off raccroché 0)
|
7
|
+
|
8
|
+
def to_bandwidth(field_name, value_to_convert)
|
9
|
+
value_to_convert.match /^\s*(?<val>[\d\.]+)\s+(?<unit>[kKMmGg])b\/s/ do |md|
|
10
|
+
mult = case md[:unit]
|
11
|
+
when 'k', 'K' then
|
12
|
+
1024
|
13
|
+
when 'm', 'M' then
|
14
|
+
1024 * 1024
|
15
|
+
when 'g', 'G' then
|
16
|
+
1024 * 1024
|
17
|
+
end
|
18
|
+
return md[:val].to_f * mult
|
19
|
+
end
|
20
|
+
|
21
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to time duration (integer) for field #{field_name} !"
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_duration(field_name, value_to_convert)
|
26
|
+
# 9 jours, 22 heures, 42 minutes
|
27
|
+
value_to_convert.match /(?<days>\d+)\s*jours?,\s*(?<hours>\d+)\s*heures?,\s*(?<minutes>\d+)\s*minutes?/i do |md|
|
28
|
+
d = md[:days].nil? ? 0 : md[:days].to_i
|
29
|
+
h = md[:hours].nil? ? 0 : md[:hours].to_i
|
30
|
+
m = md[:minutes].nil? ? 0 : md[:minutes].to_i
|
31
|
+
return d * 86400 + h * 3600 + m * 60
|
32
|
+
end
|
33
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to time duration (integer) for field #{field_name} !"
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_bool(field_name, value_to_convert)
|
38
|
+
CONSIDERED_TRUE.each do |val|
|
39
|
+
return true if value_to_convert.match /^#{val}$/i
|
40
|
+
end
|
41
|
+
CONSIDERED_FALSE.each do |val|
|
42
|
+
return false if value_to_convert.match /^#{val}$/i
|
43
|
+
end
|
44
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to boolean for field #{field_name} !"
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_db(field_name, value_to_convert)
|
49
|
+
value_to_convert.match /^(?<num_value>.+) db$/i do |md|
|
50
|
+
return to_num(field_name, md[:num_value])
|
51
|
+
end
|
52
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to db for field #{field_name} !"
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_num(field_name, value_to_convert)
|
57
|
+
value_to_convert.match /^(?<num_value>[[:digit:]\.\s,]+)$/i do |md|
|
58
|
+
return md[:num_value].to_f
|
59
|
+
end
|
60
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to num for field #{field_name} !"
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_int(field_name, value_to_convert)
|
65
|
+
value_to_convert.match /^(?<num_value>[[:digit:]]+)$/i do |md|
|
66
|
+
return md[:num_value].to_i
|
67
|
+
end
|
68
|
+
EasyAppHelper.logger.warn "Cannot convert #{value_to_convert.inspect} to integer for field #{field_name} !"
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def as_es_documents(created_at=Time.now)
|
73
|
+
res = []
|
74
|
+
self.up_down_reports.each_pair do |measurement, name|
|
75
|
+
%w(up down).each do |measurement_type|
|
76
|
+
data_name = "#{measurement}_#{measurement_type}"
|
77
|
+
es_object = {
|
78
|
+
index: "#{self.class.name.underscore.tr('/', '_')}_#{measurement}",
|
79
|
+
type: measurement_type
|
80
|
+
}
|
81
|
+
data = {
|
82
|
+
created_at: created_at,
|
83
|
+
name: data_name,
|
84
|
+
description: name,
|
85
|
+
value: attributes[data_name.to_sym]
|
86
|
+
}
|
87
|
+
es_object[:body] = data
|
88
|
+
res << es_object
|
89
|
+
end
|
90
|
+
end
|
91
|
+
generic_info = {}
|
92
|
+
|
93
|
+
attributes.each do |attr_name, content|
|
94
|
+
# Tries to remove data that are up/down measurements already covered by previous collection
|
95
|
+
data_key = attr_name.to_s.gsub(/_(up|down)$/, '').to_sym
|
96
|
+
next if attr_name.length > 3 && self.up_down_reports.keys.include?(data_key)
|
97
|
+
# Else adds info to generic info
|
98
|
+
generic_info[attr_name] = content
|
99
|
+
end
|
100
|
+
generic_info[:name] = 'generic'
|
101
|
+
generic_info[:created_at] = created_at
|
102
|
+
|
103
|
+
res << {
|
104
|
+
index: "#{self.class.name.underscore.tr('/', '_')}_generic",
|
105
|
+
type: :info.to_s,
|
106
|
+
body: generic_info
|
107
|
+
}
|
108
|
+
|
109
|
+
res
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'internet_box_logger/parsers/utils'
|
2
|
+
require 'internet_box_logger/parsers/freebox_v5_parser'
|
3
|
+
|
4
|
+
module InternetBoxLogger
|
5
|
+
module Parsers
|
6
|
+
|
7
|
+
def self.[]
|
8
|
+
constants.dup.keep_if {|c| const_get(c.to_s).is_a? Module and c.to_s =~ /\wParser$/ } .map {|m| const_get m}
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'elasticsearch'
|
3
|
+
require 'easy_app_helper'
|
4
|
+
|
5
|
+
require 'internet_box_logger/version'
|
6
|
+
require 'internet_box_logger/elastic_search'
|
7
|
+
require 'internet_box_logger/parsers'
|
8
|
+
require 'internet_box_logger/generic_box'
|
9
|
+
|
10
|
+
|
11
|
+
module InternetBoxLogger
|
12
|
+
|
13
|
+
def self.get_box(box_type=EasyAppHelper.config[:box_type])
|
14
|
+
InternetBoxLogger::GenericBox.new box_type
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/tasks/cron.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module InternetBoxLogger
|
2
|
+
module Tasks
|
3
|
+
module Cron
|
4
|
+
|
5
|
+
def whenever_conf_file
|
6
|
+
"#{ibl_gem_path}/config/schedule.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
def cron_setup
|
10
|
+
EasyAppHelper.puts_and_logs "Using Whenever config file: '#{whenever_conf_file}' with interval #{EasyAppHelper.config[:cron_interval]}"
|
11
|
+
system "whenever -f '#{whenever_conf_file}' -i '#{whenever_conf_file}' -s interval='#{EasyAppHelper.config[:cron_interval]}'"
|
12
|
+
EasyAppHelper.puts_and_logs 'Crontab updated'
|
13
|
+
end
|
14
|
+
|
15
|
+
def cron_remove
|
16
|
+
EasyAppHelper.puts_and_logs "Using Whenever config file: '#{whenever_conf_file}'"
|
17
|
+
system "whenever -c '#{whenever_conf_file}'"
|
18
|
+
EasyAppHelper.puts_and_logs 'Crontab updated'
|
19
|
+
end
|
20
|
+
|
21
|
+
def cron_info
|
22
|
+
EasyAppHelper.puts_and_logs "Whenever config file used = #{whenever_conf_file}'"
|
23
|
+
EasyAppHelper.puts_and_logs "config.cron_interval = #{EasyAppHelper.config[:cron_interval]}"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module InternetBoxLogger
|
2
|
+
module Tasks
|
3
|
+
module ElasticSearch
|
4
|
+
|
5
|
+
ES_PID_FILE = '/tmp/es.pid'
|
6
|
+
|
7
|
+
def es_binary
|
8
|
+
es_bin_from_config = InternetBoxLogger::ElasticSearch::Server.local_path
|
9
|
+
es_bin = File.is_executable? es_bin_from_config
|
10
|
+
raise "Cannot find executable for ElasticSearch with name '#{es_bin_from_config}'. Try setting-up elastic_binary in application config." if es_bin.nil?
|
11
|
+
raise "You have not enough rights to run '#{es_bin_from_config}'." unless es_bin
|
12
|
+
es_bin
|
13
|
+
end
|
14
|
+
|
15
|
+
def already_running?
|
16
|
+
!es_pid.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def es_pid
|
20
|
+
pid = `ps aux | grep 'elasticsearc[h]' | awk '{ print $2 }'`
|
21
|
+
return nil if pid.nil? || pid.empty?
|
22
|
+
pid.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def create_pid_file(pid=nil)
|
27
|
+
if block_given?
|
28
|
+
File.open(ES_PID_FILE, 'w+') do |f|
|
29
|
+
yield f
|
30
|
+
end
|
31
|
+
pid = es_pid
|
32
|
+
raise "Invalid operation on pid file" if pid.nil? || pid < 1
|
33
|
+
else
|
34
|
+
raise "Specify a pid or a block !" if pid.nil?
|
35
|
+
raise "Invalid pid!" unless pid.is_a? Fixnum
|
36
|
+
File.open(ES_PID_FILE, 'w+') do |f|
|
37
|
+
f.puts pid
|
38
|
+
end
|
39
|
+
end
|
40
|
+
pid
|
41
|
+
end
|
42
|
+
|
43
|
+
def start_es_server
|
44
|
+
if already_running?
|
45
|
+
EasyAppHelper.puts_and_logs 'ElasticSearch already running... Aborting'
|
46
|
+
return nil
|
47
|
+
end
|
48
|
+
spawn("#{es_binary} -d")
|
49
|
+
EasyAppHelper.puts_and_logs 'ElasticSearch server started'
|
50
|
+
true
|
51
|
+
end
|
52
|
+
|
53
|
+
def stop_es_server
|
54
|
+
unless already_running?
|
55
|
+
EasyAppHelper.puts_and_logs 'ElasticSearch is not running... Nothing to stop'
|
56
|
+
return nil
|
57
|
+
end
|
58
|
+
pid = es_pid
|
59
|
+
raise 'Invalid operation on pid file' if pid.nil? || pid < 1
|
60
|
+
Process.kill('SIGTERM', pid)
|
61
|
+
EasyAppHelper.puts_and_logs 'ElasticSearch stopped'
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/tasks/file.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
class File
|
2
|
+
|
3
|
+
def self.is_executable?(filename)
|
4
|
+
real_name = nil
|
5
|
+
if exists?(filename)
|
6
|
+
real_name = filename
|
7
|
+
else
|
8
|
+
ENV['PATH'].split(':').each do |d|
|
9
|
+
f = join(d, filename)
|
10
|
+
if exists? f
|
11
|
+
real_name = f
|
12
|
+
break
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
return nil if real_name.nil? || real_name.empty?
|
17
|
+
executable_real?(real_name) ? real_name : false
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.exists_in_path?(filename)
|
21
|
+
ENV['PATH'].split(':').collect do |d|
|
22
|
+
Dir.entries d if Dir.exists? d
|
23
|
+
end.flatten.include?(filename) ? filename : false
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require File.expand_path '../internet_box_logger_tasks.rb', __FILE__
|
5
|
+
|
6
|
+
|
7
|
+
namespace :internet_box_logger do
|
8
|
+
|
9
|
+
include InternetBoxLogger::Tasks
|
10
|
+
|
11
|
+
task :booted_environment do
|
12
|
+
require 'internet_box_logger'
|
13
|
+
EasyAppHelper.config.script_filename = "#{ibl_gem_path}/config/internet_box_logger.conf"
|
14
|
+
EasyAppHelper.config[:verbose] = true
|
15
|
+
end
|
16
|
+
|
17
|
+
# ElasticSearch tasks
|
18
|
+
namespace :es do
|
19
|
+
|
20
|
+
include InternetBoxLogger::Tasks::ElasticSearch
|
21
|
+
|
22
|
+
desc 'Starts your local ElasticSearch server'
|
23
|
+
task :start => :booted_environment do
|
24
|
+
next unless start_es_server
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Stops your local ElasticSearch server'
|
28
|
+
task :stop => :booted_environment do
|
29
|
+
next unless stop_es_server
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Show your local ElasticSearch config'
|
33
|
+
task :info => :booted_environment do
|
34
|
+
EasyAppHelper.puts_and_logs "config.elastic_servers = #{InternetBoxLogger::ElasticSearch::Server[]}"
|
35
|
+
EasyAppHelper.puts_and_logs "config.elastic_binary = #{es_binary}"
|
36
|
+
EasyAppHelper.puts_and_logs "ElasticSearch server is currently #{%w{stopped running}[es_pid.nil? ? 0 : 1 ]}."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Kibana tasks
|
42
|
+
namespace :kibana do
|
43
|
+
|
44
|
+
include InternetBoxLogger::Tasks::Kibana
|
45
|
+
|
46
|
+
desc 'Displays Kibana information'
|
47
|
+
task :info => :booted_environment do
|
48
|
+
kibana_info
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'Deploys box specific reports into Kibana dashboards directory'
|
52
|
+
task :deploy => :info do
|
53
|
+
deploy_reports
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'Launch a simple server to serve Kibana UI. You can specify the port as parameter'
|
57
|
+
task :serve, [:port] => :info do |tsk, args|
|
58
|
+
serve_ui args[:port]
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# Cron tasks
|
64
|
+
namespace :cron do
|
65
|
+
|
66
|
+
include InternetBoxLogger::Tasks::Cron
|
67
|
+
|
68
|
+
desc 'Setup cron to gather information every x minutes (configurable)'
|
69
|
+
task :setup => :booted_environment do
|
70
|
+
cron_setup
|
71
|
+
end
|
72
|
+
|
73
|
+
desc 'Removes cron task'
|
74
|
+
task :remove do
|
75
|
+
cron_remove
|
76
|
+
end
|
77
|
+
|
78
|
+
desc 'Show your Cron config'
|
79
|
+
task :info => :booted_environment do
|
80
|
+
cron_info
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require File.expand_path '../file.rb', __FILE__
|
3
|
+
require File.expand_path '../elastic_search.rb', __FILE__
|
4
|
+
require File.expand_path '../cron.rb', __FILE__
|
5
|
+
require File.expand_path '../kibana.rb', __FILE__
|
6
|
+
|
7
|
+
|
8
|
+
module InternetBoxLogger
|
9
|
+
module Tasks
|
10
|
+
|
11
|
+
def ibl_gem_path
|
12
|
+
spec = Gem::Specification.find_by_name('internet_box_logger')
|
13
|
+
File.expand_path "../#{spec.name}", spec.spec_dir
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|