forked from graylog-labs/graylog2-web-interface
-
Notifications
You must be signed in to change notification settings - Fork 0
/
message.rb
133 lines (103 loc) · 3.21 KB
/
message.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
class Message
LIMIT = 100
ADDITIONAL_FIELD_SEPARATOR = '_'
RESERVED_ADDITIONAL_FIELDS = %w(_type _index _version)
@fields = [ :id, :message, :full_message, :created_at, :facility, :level, :host, :file, :line, :deleted, :streams ]
@fields.each { |f| attr_accessor(f) }
attr_accessor :plain, :total_result_count
def self.parse_from_elastic(x)
m = self.new
m.plain = x
m.total_result_count = x.total
@fields.each do |f|
m.__send__(:"#{f}=", x.__send__(f))
# XXX ELASTIC: zomg workaround
# - __send__ creates a Rake::FileTask instead of a string. not sure why yet
m.file = x[:file] if f == :file
end
return m
end
# you best lazy evaluate that
def additional_fields
return @additionals unless @additionals.blank?
@additionals = Hash.new
plain.to_hash.keys.each do |key|
value = plain[key]
if key[0,1] == ADDITIONAL_FIELD_SEPARATOR and !RESERVED_ADDITIONAL_FIELDS.include?(key.to_s)
@additionals[key[1, key.length]] = value
end
end
return @additionals
# XXX ELASTIC: sort alphabetically
end
# Overwriting the message getter. This always applies the filtering of filtered terms.
def message
FilteredTerm.apply(@message)
end
# Returns +created_at+ as +Time+ in request's timezone
def created_at_time
Time.zone.at(self.created_at)
end
def file_and_line
self.file + (":#{@line}" unless @line.blank?).to_s unless self.file.blank?
end
def additional_fields?
self.additional_fields.count > 0
end
# XXX ELASTIC
# This is controlled by general.yml. Disabling it gives great performance improve.
#if Configuration.allow_deleting
# scope :not_deleted, where({ :deleted => false })
#else
# scope :not_deleted, Hash.new
#end
def self.get_conditions_from_date(timeframe)
conditions = {}
re = /^(from (.+)){0,1}?(to (.+))$/
re2 = /^(from (.+))$/
if (matches = (re.match(timeframe) or re2.match(timeframe)))
from = matches[2]
to = matches[4]
conditions.merge!('$gt' => Chronic::parse(from).to_i) unless from.blank?
conditions.merge!('$lt' => Chronic::parse(to).to_i) unless to.blank?
end
return conditions
end
# XXX ELASTIC - wat
def self.recalculate_host_counts
Host.all.each do |host|
host.message_count = Message.where(:host => host.host, :deleted => false).count
host.save
end
end
# Workaround for migration problems. #WEBINTERFACE-24
def referenced_streams
ret_streams = Array.new
streams.each do |stream_id|
begin
stream = Stream.find_by_id(stream_id.to_s)
ret_streams << stream unless stream.blank?
rescue
next
end
end
return ret_streams
end
# XXX ELASTIC: test with reader user
def accessable_for_user?(current_user)
return true if current_user.role == "admin"
# Check if any of the streams this message is filed in is accessible by the user
streams.each do |stream_id|
stream = Stream.find(stream_id)
return true if stream.accessable_for_user?(current_user)
end
return false
end
def uniform_date_string
d = Time.at(self.created_at)
"#{d.year}-#{d.month}-#{d.day}"
end
def to_param
self.id.to_s
end
end