systemd-journal 1.2.2 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/.rubocop.yml +1 -1
- data/.travis.yml +3 -2
- data/Gemfile +3 -0
- data/LICENSE.txt +1 -1
- data/README.md +107 -46
- data/certs/john@throttle.io.pem +21 -0
- data/lib/systemd/ffi_size_t.rb +1 -1
- data/lib/systemd/id128.rb +1 -1
- data/lib/systemd/journal.rb +38 -31
- data/lib/systemd/journal/filterable.rb +3 -3
- data/lib/systemd/journal/native.rb +3 -3
- data/lib/systemd/journal/navigable.rb +10 -10
- data/lib/systemd/journal/version.rb +1 -1
- data/lib/systemd/journal/waitable.rb +3 -3
- data/lib/systemd/journal/writable.rb +4 -4
- data/spec/spec_helper.rb +0 -1
- data/spec/systemd/id128_spec.rb +1 -1
- data/spec/systemd/journal_spec.rb +11 -10
- data/spec/systemd_spec.rb +0 -1
- data/systemd-journal.gemspec +13 -6
- metadata +33 -10
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0438540edec22fbae63e8415a028a3811efe665d
|
4
|
+
data.tar.gz: 33fd5a5c73b159830d8e545be1ea9b5fde0b0250
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a236ee7822df8302c33e32b2a2d14ee0a359bf0ea0bccfc9e46645583cad6e8f0889c3761b63351ff770bf461d4e6308cc9ca945765e2eea4a1acc72e372dfaa
|
7
|
+
data.tar.gz: f347074030ae403b3093dd73c4931a41aefee52c4d18b38576c5105fa4bbf5fd606f2579f273cfed68b2c712186149dd4eb20049c9957c6ebfc68ec322ed7860
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -9,14 +9,29 @@ Ruby bindings for reading from the systemd journal.
|
|
9
9
|
|
10
10
|
Add this line to your application's Gemfile:
|
11
11
|
|
12
|
-
|
12
|
+
```ruby
|
13
|
+
gem 'systemd-journal', '~> 1.2.0'
|
14
|
+
```
|
13
15
|
|
14
16
|
And then execute:
|
15
17
|
|
16
|
-
|
18
|
+
```sh
|
19
|
+
bundle install
|
20
|
+
```
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
If you have trust issues, fear not:
|
23
|
+
|
24
|
+
```sh
|
25
|
+
wget https://raw.githubusercontent.com/ledbettj/systemd-journal/master/certs/john@throttle.io.pem
|
26
|
+
gem cert --add john@throttle.io.pem
|
27
|
+
```
|
28
|
+
|
29
|
+
You can then verify the signature at install time with either `gem` or `bundler`:
|
30
|
+
|
31
|
+
```sh
|
32
|
+
gem install systemd-journal -P HighSecurity
|
33
|
+
bundle install --trust-policy HighSecurity
|
34
|
+
```
|
20
35
|
|
21
36
|
## Dependencies
|
22
37
|
|
@@ -27,73 +42,119 @@ use the gem. Currently we support systemd 208 or higher.
|
|
27
42
|
|
28
43
|
## Usage
|
29
44
|
|
30
|
-
|
45
|
+
```ruby
|
46
|
+
require 'systemd/journal'
|
47
|
+
```
|
31
48
|
|
32
49
|
Print all messages as they occur:
|
33
50
|
|
34
|
-
|
35
|
-
|
51
|
+
```ruby
|
52
|
+
j = Systemd::Journal.new
|
53
|
+
j.seek(:tail)
|
36
54
|
|
37
|
-
|
38
|
-
|
39
|
-
|
55
|
+
# watch() does not return
|
56
|
+
j.watch do |entry|
|
57
|
+
puts entry.message
|
58
|
+
end
|
59
|
+
```
|
40
60
|
|
41
61
|
Filter events and iterate:
|
42
62
|
|
43
|
-
|
63
|
+
```ruby
|
64
|
+
j = Systemd::Journal.new
|
44
65
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
66
|
+
# only display entries from SSHD with priority 6.
|
67
|
+
j.filter(priority: 6, _exe: '/usr/bin/sshd')
|
68
|
+
j.each do |entry|
|
69
|
+
puts entry.message
|
70
|
+
end
|
71
|
+
```
|
50
72
|
|
51
73
|
Moving around the journal:
|
52
74
|
|
53
|
-
|
75
|
+
```ruby
|
76
|
+
j = Systemd::Journal.new
|
54
77
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
78
|
+
j.seek(:head) # move to the start of journal
|
79
|
+
j.move(10) # move forward by 10 entries
|
80
|
+
c = j.cursor # get a reference to this entry
|
81
|
+
j.move(-5) # move back 5 entries
|
82
|
+
j.seek(c) # move to the saved cursor
|
83
|
+
j.cursor?(c) # verify that we're at the correct entry
|
84
|
+
j.seek(:tail) # move to end of the journal
|
85
|
+
j.move_previous # move back
|
86
|
+
j.move_next # move forward
|
64
87
|
|
65
|
-
|
88
|
+
j.current_entry # get the entry we're currently positioned at
|
66
89
|
|
67
|
-
|
68
|
-
|
90
|
+
# seek the entry that occured closest to this time
|
91
|
+
j.seek(Time.parse('2013-10-31T12:00:00+04:00:00'))
|
92
|
+
```
|
69
93
|
|
70
94
|
Waiting for things to happen:
|
71
95
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
96
|
+
```ruby
|
97
|
+
j = Systemd::Journal.new
|
98
|
+
j.seek(:tail)
|
99
|
+
# wait up to one second for something to happen
|
100
|
+
if j.wait(1_000_000)
|
101
|
+
puts 'something changed!'
|
102
|
+
# same as above, but can be interrupted with Control+C.
|
103
|
+
if j.wait(1_000_000, select: true)
|
104
|
+
puts 'something changed!'
|
105
|
+
```
|
80
106
|
|
81
107
|
Accessing the catalog:
|
82
108
|
|
83
|
-
|
84
|
-
|
85
|
-
|
109
|
+
```ruby
|
110
|
+
j = Systemd::Journal.new
|
111
|
+
j.move_next
|
112
|
+
j.move_next until j.current_entry.catalog?
|
113
|
+
|
114
|
+
puts j.current_entry.catalog
|
115
|
+
# or if you have a message id:
|
116
|
+
puts Systemd::Journal.catalog_for(j.current_entry.message_id)
|
117
|
+
```
|
118
|
+
|
119
|
+
Writing to the journal:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
# write a simple message
|
123
|
+
Systemd::Journal.print(Systemd::Journal::LOG_INFO, 'Something happened')
|
86
124
|
|
87
|
-
|
88
|
-
|
89
|
-
|
125
|
+
# write custom fields
|
126
|
+
Systemd::Journal.message(
|
127
|
+
message: 'Something bad happened',
|
128
|
+
priority: Systemd::Journal::LOG_ERR,
|
129
|
+
my_custom_field: 'foo was nil!'
|
130
|
+
)
|
131
|
+
```
|
90
132
|
|
91
133
|
See the documentation for more examples.
|
92
134
|
|
135
|
+
## Troubleshooting
|
136
|
+
|
137
|
+
### I get 'Cannot assign requested address' when trying to read an entry!
|
138
|
+
|
139
|
+
After calling one of the below, the Journal read pointer might not point at
|
140
|
+
a valid entry:
|
141
|
+
|
142
|
+
Journal#filter
|
143
|
+
Journal#clear_filters
|
144
|
+
Journal#seek(:head)
|
145
|
+
Journal#seek(:tail)
|
146
|
+
|
147
|
+
The solution is to always call one of `move`, `move_next`, `move_previous` and
|
148
|
+
friends before reading after issuing one of the above calls.
|
149
|
+
|
93
150
|
## Issues?
|
94
151
|
|
95
|
-
This gem has been tested primarily on Arch Linux running systemd
|
96
|
-
let me know if you have issues
|
152
|
+
This gem has been tested primarily on MRI and Arch Linux running systemd version
|
153
|
+
208 and up. Please let me know if you have issues with other versions or
|
154
|
+
distributions.
|
155
|
+
|
156
|
+
The gem will run under JRuby, although some features which rely on native file
|
157
|
+
descriptor support will not work.
|
97
158
|
|
98
159
|
If you run into problems or have questions, please open an
|
99
160
|
[Issue](https://github.com/ledbettj/systemd-journal/issues) or Pull Request.
|
@@ -104,5 +165,5 @@ If you run into problems or have questions, please open an
|
|
104
165
|
2. Create your feature branch
|
105
166
|
3. Commit your changes
|
106
167
|
4. Push to the branch
|
107
|
-
5. Create new Pull Request, targeting the
|
168
|
+
5. Create new Pull Request, targeting the __master__ branch.
|
108
169
|
6. Wipe hands on pants, you're done!
|
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ0wCwYDVQQDDARqb2hu
|
3
|
+
MRgwFgYKCZImiZPyLGQBGRYIdGhyb3R0bGUxEjAQBgoJkiaJk/IsZAEZFgJpbzAe
|
4
|
+
Fw0xNjAxMTcxNjEyNDlaFw0xNzAxMTYxNjEyNDlaMD0xDTALBgNVBAMMBGpvaG4x
|
5
|
+
GDAWBgoJkiaJk/IsZAEZFgh0aHJvdHRsZTESMBAGCgmSJomT8ixkARkWAmlvMIIB
|
6
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsKoOAl3GjhyD0ijDTrgKRdN2
|
7
|
+
LgFc59HUFYKLfPnCxH3LLxyFEQWMyxmqwetUAQ2SALKNM2U+rr4Dvv39sqEjvYHn
|
8
|
+
prWK8+XuvvBYHeH2E5K0uQjwZ5yIo8wsqc0ae46cBZoRjvlWFo3ha6vo5KU1i80K
|
9
|
+
wY1bk5NykKBUIgblDCIjsh6h6lflje1MNpBW0IaHinIBeU2ZLDVi46kssptHos2q
|
10
|
+
HQLHR+wqTtaSy22jzLHf5yYDagPHyjCC6CGoApY2qE+DRiCHBE0mTB8sRrlu5aln
|
11
|
+
3aoLT+z5iCfNrS20ycEKCg73WDdVs2gYK+yHh6GBWL0n1UhfPrOj6XIAtZTKtQID
|
12
|
+
AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU5yrYSRUD
|
13
|
+
85vV8/Gecelpz5p3qt4wGwYDVR0RBBQwEoEQam9obkB0aHJvdHRsZS5pbzAbBgNV
|
14
|
+
HRIEFDASgRBqb2huQHRocm90dGxlLmlvMA0GCSqGSIb3DQEBBQUAA4IBAQAwUOPx
|
15
|
+
qQlrazrqAIGKMSBs7sTnyxAiirElMQLsaJbqsNmup7fDnAPaQBViL8uv2n08F7ZV
|
16
|
+
wAeItgtQxTVUkaQLh/x0OqjEc7z1P0XMXReL1Et6ep8vBOhLRHIXAdZ8Q2ESTtBM
|
17
|
+
JnHwNiSbojxBFwn7OkUuisaXr9cu6CDH/VpiGT/GxJ7cRT1WgH/ZAPt+oCY6jcs9
|
18
|
+
3jCu+Q6KtUcFxFdXr7L2+p9Z1HkKECa1CuBsLQa8ENcqblazSJ3k7jh1nRC+PjNU
|
19
|
+
GqIHnd4cKMcoFxN3l2KjrTS2rabk/yf6nWrkVGPkN41hSRf9reteYiI08RAi3peY
|
20
|
+
7eGf9eghUTYEt1pJ
|
21
|
+
-----END CERTIFICATE-----
|
data/lib/systemd/ffi_size_t.rb
CHANGED
@@ -12,7 +12,7 @@ class FFI::MemoryPointer
|
|
12
12
|
method_defined?("read_#{name}") if t == type
|
13
13
|
end
|
14
14
|
|
15
|
-
raise
|
15
|
+
raise "Unable to patch in reader/writer for #{which}" if type.nil?
|
16
16
|
|
17
17
|
alias_method "read_#{which}", "read_#{type}"
|
18
18
|
alias_method "write_#{which}", "write_#{type}"
|
data/lib/systemd/id128.rb
CHANGED
data/lib/systemd/journal.rb
CHANGED
@@ -45,14 +45,11 @@ module Systemd
|
|
45
45
|
# path: '/var/log/journal/5f5777e46c5f4131bd9b71cbed6b9abf'
|
46
46
|
# )
|
47
47
|
def initialize(opts = {})
|
48
|
-
validate_options!(opts)
|
48
|
+
open_type, flags = validate_options!(opts)
|
49
|
+
ptr = FFI::MemoryPointer.new(:pointer, 1)
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
opts[:files] = opts[:file] if opts[:file]
|
53
|
-
|
54
|
-
rc = open_journal(ptr, opts, flags)
|
55
|
-
raise JournalError.new(rc) if rc < 0
|
51
|
+
rc = open_journal(open_type, ptr, opts, flags)
|
52
|
+
raise JournalError, rc if rc < 0
|
56
53
|
|
57
54
|
@ptr = ptr.read_pointer
|
58
55
|
ObjectSpace.define_finalizer(self, self.class.finalize(@ptr))
|
@@ -84,7 +81,7 @@ module Systemd
|
|
84
81
|
field = field.to_s.upcase
|
85
82
|
rc = Native.sd_journal_get_data(@ptr, field, out_ptr, len_ptr)
|
86
83
|
|
87
|
-
raise JournalError
|
84
|
+
raise JournalError, rc if rc < 0
|
88
85
|
|
89
86
|
len = len_ptr.read_size_t
|
90
87
|
string_from_out_ptr(out_ptr, len).split('=', 2).last
|
@@ -123,7 +120,7 @@ module Systemd
|
|
123
120
|
out_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
124
121
|
|
125
122
|
rc = Native.sd_journal_get_catalog(@ptr, out_ptr)
|
126
|
-
raise JournalError
|
123
|
+
raise JournalError, rc if rc < 0
|
127
124
|
|
128
125
|
Journal.read_and_free_outstr(out_ptr.read_pointer)
|
129
126
|
end
|
@@ -135,7 +132,7 @@ module Systemd
|
|
135
132
|
Systemd::Id128::Native::Id128.from_s(message_id),
|
136
133
|
out_ptr
|
137
134
|
)
|
138
|
-
raise JournalError
|
135
|
+
raise JournalError, rc if rc < 0
|
139
136
|
|
140
137
|
read_and_free_outstr(out_ptr.read_pointer)
|
141
138
|
end
|
@@ -152,7 +149,7 @@ module Systemd
|
|
152
149
|
Native.sd_journal_restart_unique(@ptr)
|
153
150
|
|
154
151
|
rc = Native.sd_journal_query_unique(@ptr, field.to_s.upcase)
|
155
|
-
raise JournalError
|
152
|
+
raise JournalError, rc if rc < 0
|
156
153
|
|
157
154
|
while (kvpair = enumerate_helper(:sd_journal_enumerate_unique))
|
158
155
|
results << kvpair.last
|
@@ -170,7 +167,7 @@ module Systemd
|
|
170
167
|
size_ptr = FFI::MemoryPointer.new(:uint64)
|
171
168
|
rc = Native.sd_journal_get_usage(@ptr, size_ptr)
|
172
169
|
|
173
|
-
raise JournalError
|
170
|
+
raise JournalError, rc if rc < 0
|
174
171
|
size_ptr.read_uint64
|
175
172
|
end
|
176
173
|
|
@@ -180,7 +177,7 @@ module Systemd
|
|
180
177
|
def data_threshold
|
181
178
|
size_ptr = FFI::MemoryPointer.new(:size_t, 1)
|
182
179
|
if (rc = Native.sd_journal_get_data_threshold(@ptr, size_ptr)) < 0
|
183
|
-
raise JournalError
|
180
|
+
raise JournalError, rc
|
184
181
|
end
|
185
182
|
|
186
183
|
size_ptr.read_size_t
|
@@ -190,7 +187,7 @@ module Systemd
|
|
190
187
|
# Fields longer than this will be truncated.
|
191
188
|
def data_threshold=(threshold)
|
192
189
|
if (rc = Native.sd_journal_set_data_threshold(@ptr, threshold)) < 0
|
193
|
-
raise JournalError
|
190
|
+
raise JournalError, rc
|
194
191
|
end
|
195
192
|
end
|
196
193
|
|
@@ -207,33 +204,32 @@ module Systemd
|
|
207
204
|
|
208
205
|
private
|
209
206
|
|
210
|
-
def open_journal(ptr, opts, flags)
|
211
|
-
@open_flags =
|
207
|
+
def open_journal(type, ptr, opts, flags)
|
208
|
+
@open_flags = flags
|
212
209
|
|
213
|
-
case
|
214
|
-
when
|
210
|
+
case type
|
211
|
+
when :path
|
215
212
|
@open_target = "path:#{opts[:path]}"
|
216
213
|
Native.sd_journal_open_directory(ptr, opts[:path], 0)
|
217
|
-
when
|
218
|
-
files = Array(opts[
|
214
|
+
when :files, :file
|
215
|
+
files = Array(opts[type])
|
219
216
|
@open_target = "file#{files.one? ? '' : 's'}:#{files.join(',')}"
|
220
217
|
Native.sd_journal_open_files(ptr, array_to_ptrs(files), 0)
|
221
|
-
when
|
222
|
-
raise ArgumentError.new('This libsystemd-journal version does not support sd_journal_open_container') unless Native.open_container?
|
223
|
-
@open_flags = flags
|
218
|
+
when :container
|
224
219
|
@open_target = "container:#{opts[:container]}"
|
225
220
|
Native.sd_journal_open_container(ptr, opts[:container], flags)
|
226
|
-
|
227
|
-
@open_flags = flags
|
221
|
+
when :local
|
228
222
|
@open_target = 'journal:local'
|
229
223
|
Native.sd_journal_open(ptr, flags)
|
224
|
+
else
|
225
|
+
raise ArgumentError, "Unknown open type: #{type}"
|
230
226
|
end
|
231
227
|
end
|
232
228
|
|
233
229
|
def read_realtime
|
234
230
|
out = FFI::MemoryPointer.new(:uint64, 1)
|
235
231
|
rc = Native.sd_journal_get_realtime_usec(@ptr, out)
|
236
|
-
raise JournalError
|
232
|
+
raise JournalError, rc if rc < 0
|
237
233
|
|
238
234
|
out.read_uint64
|
239
235
|
end
|
@@ -243,7 +239,7 @@ module Systemd
|
|
243
239
|
boot = FFI::MemoryPointer.new(Systemd::Id128::Native::Id128, 1)
|
244
240
|
|
245
241
|
rc = Native.sd_journal_get_monotonic_usec(@ptr, out, boot)
|
246
|
-
raise JournalError
|
242
|
+
raise JournalError, rc if rc < 0
|
247
243
|
|
248
244
|
[out.read_uint64, Systemd::Id128::Native::Id128.new(boot).to_s]
|
249
245
|
end
|
@@ -259,10 +255,21 @@ module Systemd
|
|
259
255
|
|
260
256
|
def validate_options!(opts)
|
261
257
|
exclusive = [:path, :files, :container, :file]
|
262
|
-
|
263
|
-
|
264
|
-
|
258
|
+
given = (opts.keys & exclusive)
|
259
|
+
|
260
|
+
raise ArgumentError, "conflicting options: #{given}" if given.length > 1
|
261
|
+
|
262
|
+
type = given.first || :local
|
263
|
+
|
264
|
+
if type == :container && !Native.open_container?
|
265
|
+
raise ArgumentError,
|
266
|
+
'This native library version does not support opening containers'
|
265
267
|
end
|
268
|
+
|
269
|
+
flags = opts[:flags] if [:local, :container].include?(type)
|
270
|
+
flags ||= 0
|
271
|
+
|
272
|
+
[type, flags]
|
266
273
|
end
|
267
274
|
|
268
275
|
def self.finalize(ptr)
|
@@ -274,7 +281,7 @@ module Systemd
|
|
274
281
|
out_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
275
282
|
|
276
283
|
rc = Native.send(enum_function, @ptr, out_ptr, len_ptr)
|
277
|
-
raise JournalError
|
284
|
+
raise JournalError, rc if rc < 0
|
278
285
|
return nil if rc == 0
|
279
286
|
|
280
287
|
len = len_ptr.read_size_t
|
@@ -38,7 +38,7 @@ module Systemd
|
|
38
38
|
def add_filter(field, value)
|
39
39
|
match = "#{field.to_s.upcase}=#{value}"
|
40
40
|
rc = Native.sd_journal_add_match(@ptr, match, match.length)
|
41
|
-
raise JournalError
|
41
|
+
raise JournalError, rc if rc < 0
|
42
42
|
end
|
43
43
|
|
44
44
|
# Add a set of filters to the journal, such that only entries where the
|
@@ -71,7 +71,7 @@ module Systemd
|
|
71
71
|
# end
|
72
72
|
def add_disjunction
|
73
73
|
rc = Native.sd_journal_add_disjunction(@ptr)
|
74
|
-
raise JournalError
|
74
|
+
raise JournalError, rc if rc < 0
|
75
75
|
end
|
76
76
|
|
77
77
|
# Add an AND condition to the filter. All previously added terms will be
|
@@ -89,7 +89,7 @@ module Systemd
|
|
89
89
|
# end
|
90
90
|
def add_conjunction
|
91
91
|
rc = Native.sd_journal_add_conjunction(@ptr)
|
92
|
-
raise JournalError
|
92
|
+
raise JournalError, rc if rc < 0
|
93
93
|
end
|
94
94
|
|
95
95
|
# Remove all filters and conjunctions/disjunctions.
|
@@ -11,10 +11,10 @@ module Systemd
|
|
11
11
|
ffi_lib %w( libsystemd.so.0 libsystemd.so
|
12
12
|
libsystemd-journal.so.0 libsystemd-journal.so)
|
13
13
|
|
14
|
-
|
14
|
+
@has_open_container = true
|
15
15
|
|
16
16
|
def self.open_container?
|
17
|
-
|
17
|
+
@has_open_container
|
18
18
|
end
|
19
19
|
|
20
20
|
# setup/teardown
|
@@ -28,7 +28,7 @@ module Systemd
|
|
28
28
|
begin
|
29
29
|
attach_function :sd_journal_open_container, [:pointer, :string, :int], :int
|
30
30
|
rescue FFI::NotFoundError
|
31
|
-
|
31
|
+
@has_open_container = false
|
32
32
|
end
|
33
33
|
|
34
34
|
# navigation
|
@@ -7,7 +7,7 @@ module Systemd
|
|
7
7
|
def cursor
|
8
8
|
out_ptr = FFI::MemoryPointer.new(:pointer, 1)
|
9
9
|
if (rc = Native.sd_journal_get_cursor(@ptr, out_ptr)) < 0
|
10
|
-
raise JournalError
|
10
|
+
raise JournalError, rc
|
11
11
|
end
|
12
12
|
|
13
13
|
Journal.read_and_free_outstr(out_ptr.read_pointer)
|
@@ -20,7 +20,7 @@ module Systemd
|
|
20
20
|
# provided cursor, False otherwise.
|
21
21
|
def cursor?(c)
|
22
22
|
if (rc = Native.sd_journal_test_cursor(@ptr, c)) < 0
|
23
|
-
raise JournalError
|
23
|
+
raise JournalError, rc
|
24
24
|
end
|
25
25
|
|
26
26
|
rc > 0
|
@@ -41,7 +41,7 @@ module Systemd
|
|
41
41
|
# that the pointer has reached the end of the journal.
|
42
42
|
def move_next
|
43
43
|
rc = Native.sd_journal_next(@ptr)
|
44
|
-
raise JournalError
|
44
|
+
raise JournalError, rc if rc < 0
|
45
45
|
rc > 0
|
46
46
|
end
|
47
47
|
|
@@ -51,7 +51,7 @@ module Systemd
|
|
51
51
|
# pointer has reached the end of the journal.
|
52
52
|
def move_next_skip(amount)
|
53
53
|
rc = Native.sd_journal_next_skip(@ptr, amount)
|
54
|
-
raise JournalError
|
54
|
+
raise JournalError, rc if rc < 0
|
55
55
|
rc
|
56
56
|
end
|
57
57
|
|
@@ -61,7 +61,7 @@ module Systemd
|
|
61
61
|
# indicating that the pointer has reached the beginning of the journal.
|
62
62
|
def move_previous
|
63
63
|
rc = Native.sd_journal_previous(@ptr)
|
64
|
-
raise JournalError
|
64
|
+
raise JournalError, rc if rc < 0
|
65
65
|
rc > 0
|
66
66
|
end
|
67
67
|
|
@@ -71,7 +71,7 @@ module Systemd
|
|
71
71
|
# read pointer has reached the beginning of the journal.
|
72
72
|
def move_previous_skip(amount)
|
73
73
|
rc = Native.sd_journal_previous_skip(@ptr, amount)
|
74
|
-
raise JournalError
|
74
|
+
raise JournalError, rc if rc < 0
|
75
75
|
rc
|
76
76
|
end
|
77
77
|
|
@@ -94,16 +94,16 @@ module Systemd
|
|
94
94
|
Native.sd_journal_seek_tail(@ptr)
|
95
95
|
when where.is_a?(Time)
|
96
96
|
Native.sd_journal_seek_realtime_usec(
|
97
|
-
|
98
|
-
|
97
|
+
@ptr,
|
98
|
+
where.to_i * 1_000_000
|
99
99
|
)
|
100
100
|
when where.is_a?(String)
|
101
101
|
Native.sd_journal_seek_cursor(@ptr, where)
|
102
102
|
else
|
103
|
-
raise ArgumentError
|
103
|
+
raise ArgumentError, "Unknown seek type: #{where.class}"
|
104
104
|
end
|
105
105
|
|
106
|
-
raise JournalError
|
106
|
+
raise JournalError, rc if rc < 0
|
107
107
|
|
108
108
|
true
|
109
109
|
end
|
@@ -20,7 +20,7 @@ module Systemd
|
|
20
20
|
wait_select(timeout_usec)
|
21
21
|
else
|
22
22
|
rc = Native.sd_journal_wait(@ptr, timeout_usec)
|
23
|
-
raise JournalError
|
23
|
+
raise JournalError, rc if rc.is_a?(Fixnum) && rc < 0
|
24
24
|
rc == :nop ? nil : rc
|
25
25
|
end
|
26
26
|
end
|
@@ -61,13 +61,13 @@ module Systemd
|
|
61
61
|
|
62
62
|
def file_descriptor
|
63
63
|
fd = Native.sd_journal_get_fd(@ptr)
|
64
|
-
raise JournalError
|
64
|
+
raise JournalError, rc if fd < 0
|
65
65
|
fd
|
66
66
|
end
|
67
67
|
|
68
68
|
def reason_for_wakeup
|
69
69
|
rc = Native.sd_journal_process(@ptr)
|
70
|
-
raise JournalError
|
70
|
+
raise JournalError, rc if rc.is_a?(Fixnum) && rc < 0
|
71
71
|
rc == :nop ? nil : rc
|
72
72
|
end
|
73
73
|
end
|
@@ -48,7 +48,7 @@ module Systemd
|
|
48
48
|
priority,
|
49
49
|
!opts[:prefix].nil?
|
50
50
|
)
|
51
|
-
raise JournalError
|
51
|
+
raise JournalError, fd if fd < 0
|
52
52
|
|
53
53
|
IO.new(fd, File::WRONLY, encoding: Encoding::UTF_8)
|
54
54
|
end
|
@@ -58,7 +58,7 @@ module Systemd
|
|
58
58
|
# @param [String] message the text to prefix the error message with.
|
59
59
|
def perror(message)
|
60
60
|
rc = Native.sd_journal_perror(message)
|
61
|
-
raise JournalError
|
61
|
+
raise JournalError, rc if rc < 0
|
62
62
|
end
|
63
63
|
|
64
64
|
# write a simple message to the systemd journal.
|
@@ -67,7 +67,7 @@ module Systemd
|
|
67
67
|
# @param [String] message the content of the message to write.
|
68
68
|
def print(level, message)
|
69
69
|
rc = Native.sd_journal_print(level, message)
|
70
|
-
raise JournalError
|
70
|
+
raise JournalError, rc if rc < 0
|
71
71
|
end
|
72
72
|
|
73
73
|
# write an event to the systemd journal.
|
@@ -79,7 +79,7 @@ module Systemd
|
|
79
79
|
# add a null pointer to terminate the varargs
|
80
80
|
items += [:string, nil]
|
81
81
|
rc = Native.sd_journal_send(*items)
|
82
|
-
raise JournalError
|
82
|
+
raise JournalError, rc if rc < 0
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/systemd/id128_spec.rb
CHANGED
@@ -2,9 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Systemd::Journal do
|
4
4
|
subject(:j) do
|
5
|
-
Systemd::Journal.new(file: journal_file).tap do |
|
6
|
-
|
7
|
-
|
5
|
+
Systemd::Journal.new(file: journal_file).tap do |journal|
|
6
|
+
journal.seek(:head)
|
7
|
+
journal.move_next
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -17,8 +17,10 @@ RSpec.describe Systemd::Journal do
|
|
17
17
|
expect { j.new(container: '', path: '/') }.to raise_error(ArgumentError)
|
18
18
|
end
|
19
19
|
|
20
|
-
it '
|
21
|
-
allow(Systemd::Journal::Native).to receive(:open_container?)
|
20
|
+
it 'raises ArgumentError on attempt to open a container without support' do
|
21
|
+
allow(Systemd::Journal::Native).to receive(:open_container?)
|
22
|
+
.and_return(false)
|
23
|
+
|
22
24
|
expect { j.new(container: 'test') }.to raise_error(ArgumentError)
|
23
25
|
end
|
24
26
|
end
|
@@ -145,7 +147,7 @@ RSpec.describe Systemd::Journal do
|
|
145
147
|
|
146
148
|
it 'returns the correct catalog entry' do
|
147
149
|
cat = Systemd::Journal.catalog_for(msg_id)
|
148
|
-
expect(cat).to start_with(msg_text)
|
150
|
+
expect(cat.downcase).to start_with(msg_text.downcase)
|
149
151
|
end
|
150
152
|
end
|
151
153
|
|
@@ -162,7 +164,7 @@ RSpec.describe Systemd::Journal do
|
|
162
164
|
# find first entry with a catalog
|
163
165
|
j.move_next until j.current_entry.catalog?
|
164
166
|
|
165
|
-
expect(j.current_catalog).to start_with(msg_text)
|
167
|
+
expect(j.current_catalog.downcase).to start_with(msg_text.downcase)
|
166
168
|
end
|
167
169
|
end
|
168
170
|
end
|
@@ -359,13 +361,13 @@ RSpec.describe Systemd::Journal do
|
|
359
361
|
end
|
360
362
|
|
361
363
|
it 'can use select' do
|
362
|
-
pending
|
364
|
+
pending 'not available on JRUBY' if Systemd::Journal::IS_JRUBY
|
363
365
|
expect(Systemd::Journal::Native).to_not receive(:sd_journal_wait)
|
364
366
|
j.wait(1, select: true)
|
365
367
|
end
|
366
368
|
|
367
369
|
it 'ignores request to use select on JRuby' do
|
368
|
-
pending
|
370
|
+
pending 'not necessary on MRI' unless Systemd::Journal::IS_JRUBY
|
369
371
|
expect(Systemd::Journal::Native).to receive(:sd_journal_wait)
|
370
372
|
j.wait(1, select: true)
|
371
373
|
end
|
@@ -380,5 +382,4 @@ RSpec.describe Systemd::Journal do
|
|
380
382
|
expect([true, false]).to include(j.wait_select_reliable?)
|
381
383
|
end
|
382
384
|
end
|
383
|
-
|
384
385
|
end
|
data/spec/systemd_spec.rb
CHANGED
data/systemd-journal.gemspec
CHANGED
@@ -9,23 +9,30 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.license = 'MIT'
|
10
10
|
gem.authors = ['John Ledbetter', 'Daniel Mack']
|
11
11
|
gem.email = ['john@throttle.io']
|
12
|
-
gem.description =
|
13
|
-
gem.summary =
|
12
|
+
gem.description = 'Provides the ability to navigate and read entries from the systemd journal in ruby, as well as write events to the journal.'
|
13
|
+
gem.summary = 'Ruby bindings to libsystemd-journal'
|
14
14
|
gem.homepage = 'https://github.com/ledbettj/systemd-journal'
|
15
15
|
|
16
|
+
gem.cert_chain = Dir['certs/*']
|
17
|
+
|
18
|
+
if $PROGRAM_NAME.end_with?('gem')
|
19
|
+
gem.signing_key = ENV['GEM_SIGNING_KEY']
|
20
|
+
raise ArgumentError, 'Please set GEM_SIGNING_KEY' if gem.signing_key.nil?
|
21
|
+
end
|
22
|
+
|
16
23
|
gem.files = `git ls-files`.split($/)
|
17
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
24
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
18
25
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
26
|
gem.require_paths = ['lib']
|
20
27
|
|
21
28
|
gem.required_ruby_version = '>= 1.9.3'
|
22
29
|
|
23
|
-
gem.add_runtime_dependency 'ffi', '~> 1.9
|
30
|
+
gem.add_runtime_dependency 'ffi', '~> 1.9'
|
24
31
|
|
25
|
-
gem.add_development_dependency 'rspec', '~> 3.
|
32
|
+
gem.add_development_dependency 'rspec', '~> 3.4'
|
26
33
|
gem.add_development_dependency 'simplecov', '~> 0.9'
|
27
34
|
gem.add_development_dependency 'rubocop', '~> 0.26'
|
28
35
|
gem.add_development_dependency 'rake', '~> 10.3'
|
29
|
-
gem.add_development_dependency 'yard', '~> 0.8
|
36
|
+
gem.add_development_dependency 'yard', '~> 0.8'
|
30
37
|
gem.add_development_dependency 'pry', '~> 0.10'
|
31
38
|
end
|
metadata
CHANGED
@@ -1,15 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: systemd-journal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Ledbetter
|
8
8
|
- Daniel Mack
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
|
-
cert_chain:
|
12
|
-
|
11
|
+
cert_chain:
|
12
|
+
- |
|
13
|
+
-----BEGIN CERTIFICATE-----
|
14
|
+
MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ0wCwYDVQQDDARqb2hu
|
15
|
+
MRgwFgYKCZImiZPyLGQBGRYIdGhyb3R0bGUxEjAQBgoJkiaJk/IsZAEZFgJpbzAe
|
16
|
+
Fw0xNjAxMTcxNjEyNDlaFw0xNzAxMTYxNjEyNDlaMD0xDTALBgNVBAMMBGpvaG4x
|
17
|
+
GDAWBgoJkiaJk/IsZAEZFgh0aHJvdHRsZTESMBAGCgmSJomT8ixkARkWAmlvMIIB
|
18
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsKoOAl3GjhyD0ijDTrgKRdN2
|
19
|
+
LgFc59HUFYKLfPnCxH3LLxyFEQWMyxmqwetUAQ2SALKNM2U+rr4Dvv39sqEjvYHn
|
20
|
+
prWK8+XuvvBYHeH2E5K0uQjwZ5yIo8wsqc0ae46cBZoRjvlWFo3ha6vo5KU1i80K
|
21
|
+
wY1bk5NykKBUIgblDCIjsh6h6lflje1MNpBW0IaHinIBeU2ZLDVi46kssptHos2q
|
22
|
+
HQLHR+wqTtaSy22jzLHf5yYDagPHyjCC6CGoApY2qE+DRiCHBE0mTB8sRrlu5aln
|
23
|
+
3aoLT+z5iCfNrS20ycEKCg73WDdVs2gYK+yHh6GBWL0n1UhfPrOj6XIAtZTKtQID
|
24
|
+
AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU5yrYSRUD
|
25
|
+
85vV8/Gecelpz5p3qt4wGwYDVR0RBBQwEoEQam9obkB0aHJvdHRsZS5pbzAbBgNV
|
26
|
+
HRIEFDASgRBqb2huQHRocm90dGxlLmlvMA0GCSqGSIb3DQEBBQUAA4IBAQAwUOPx
|
27
|
+
qQlrazrqAIGKMSBs7sTnyxAiirElMQLsaJbqsNmup7fDnAPaQBViL8uv2n08F7ZV
|
28
|
+
wAeItgtQxTVUkaQLh/x0OqjEc7z1P0XMXReL1Et6ep8vBOhLRHIXAdZ8Q2ESTtBM
|
29
|
+
JnHwNiSbojxBFwn7OkUuisaXr9cu6CDH/VpiGT/GxJ7cRT1WgH/ZAPt+oCY6jcs9
|
30
|
+
3jCu+Q6KtUcFxFdXr7L2+p9Z1HkKECa1CuBsLQa8ENcqblazSJ3k7jh1nRC+PjNU
|
31
|
+
GqIHnd4cKMcoFxN3l2KjrTS2rabk/yf6nWrkVGPkN41hSRf9reteYiI08RAi3peY
|
32
|
+
7eGf9eghUTYEt1pJ
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2016-09-17 00:00:00.000000000 Z
|
13
35
|
dependencies:
|
14
36
|
- !ruby/object:Gem::Dependency
|
15
37
|
name: ffi
|
@@ -17,28 +39,28 @@ dependencies:
|
|
17
39
|
requirements:
|
18
40
|
- - "~>"
|
19
41
|
- !ruby/object:Gem::Version
|
20
|
-
version: 1.9
|
42
|
+
version: '1.9'
|
21
43
|
type: :runtime
|
22
44
|
prerelease: false
|
23
45
|
version_requirements: !ruby/object:Gem::Requirement
|
24
46
|
requirements:
|
25
47
|
- - "~>"
|
26
48
|
- !ruby/object:Gem::Version
|
27
|
-
version: 1.9
|
49
|
+
version: '1.9'
|
28
50
|
- !ruby/object:Gem::Dependency
|
29
51
|
name: rspec
|
30
52
|
requirement: !ruby/object:Gem::Requirement
|
31
53
|
requirements:
|
32
54
|
- - "~>"
|
33
55
|
- !ruby/object:Gem::Version
|
34
|
-
version: '3.
|
56
|
+
version: '3.4'
|
35
57
|
type: :development
|
36
58
|
prerelease: false
|
37
59
|
version_requirements: !ruby/object:Gem::Requirement
|
38
60
|
requirements:
|
39
61
|
- - "~>"
|
40
62
|
- !ruby/object:Gem::Version
|
41
|
-
version: '3.
|
63
|
+
version: '3.4'
|
42
64
|
- !ruby/object:Gem::Dependency
|
43
65
|
name: simplecov
|
44
66
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,14 +109,14 @@ dependencies:
|
|
87
109
|
requirements:
|
88
110
|
- - "~>"
|
89
111
|
- !ruby/object:Gem::Version
|
90
|
-
version: 0.8
|
112
|
+
version: '0.8'
|
91
113
|
type: :development
|
92
114
|
prerelease: false
|
93
115
|
version_requirements: !ruby/object:Gem::Requirement
|
94
116
|
requirements:
|
95
117
|
- - "~>"
|
96
118
|
- !ruby/object:Gem::Version
|
97
|
-
version: 0.8
|
119
|
+
version: '0.8'
|
98
120
|
- !ruby/object:Gem::Dependency
|
99
121
|
name: pry
|
100
122
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +146,7 @@ files:
|
|
124
146
|
- LICENSE.txt
|
125
147
|
- README.md
|
126
148
|
- Rakefile
|
149
|
+
- certs/john@throttle.io.pem
|
127
150
|
- examples/journal_directory.rb
|
128
151
|
- examples/ssh_watcher.rb
|
129
152
|
- lib/systemd-journal.rb
|
@@ -169,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
192
|
version: '0'
|
170
193
|
requirements: []
|
171
194
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.
|
195
|
+
rubygems_version: 2.5.1
|
173
196
|
signing_key:
|
174
197
|
specification_version: 4
|
175
198
|
summary: Ruby bindings to libsystemd-journal
|
metadata.gz.sig
ADDED
Binary file
|