systemd-journal 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb7ad77b556c438d61a805803ce3ea525aae200f
4
- data.tar.gz: 135d9669a414f246f1b75e060ba8b6d719bdea2f
3
+ metadata.gz: 6f9a1f4583f555e4c8832ce277fc87d02eeabb2f
4
+ data.tar.gz: a4bc24e388cf2211574a5f138df8d05dc7f97505
5
5
  SHA512:
6
- metadata.gz: 063fc619fbc6436e72381812dcb0c3905a3b17d260e8d0223df0dec95b51a8219cbf6ee1c02a3eff3f0f548e474ca8df77ed2f6a97adfe12de90c87018b0a5dd
7
- data.tar.gz: 1175078fb9650d9bf12c5bbbd612b87ddb5b5bf5c44974d49fdc4a9344ee1e1f4934a92f35b1f9c8c5a4fbfe5b2d4408b9a1f17a58bff2ebf0ce0bff30c051d4
6
+ metadata.gz: 25274b48c5eba590dd4904f10142932fc4c6458170a49f93453c4d7e0cbb9822c6d045e2d9536f0d79244528081d2725fe99ab1aafacb3ebb4ae891a2076e05c
7
+ data.tar.gz: 2f863c1a90d35b999115eedd3b160b5d36db4cc273f80fdad5a91fca74dcc9f8c1189b9e1cd9c47dbc6e69df3b180d02ab15be8718ec46383539ebc1e22c14ce
data/.rubocop.yml ADDED
@@ -0,0 +1,8 @@
1
+ SignalException:
2
+ Enabled: false
3
+
4
+ RaiseArgs:
5
+ Enabled: false
6
+
7
+ SpaceAroundBlockBraces:
8
+ EnforcedStyle: space_inside_braces
data/Gemfile CHANGED
@@ -6,3 +6,4 @@ gemspec
6
6
  gem 'pry'
7
7
  gem 'rake'
8
8
  gem 'yard'
9
+ gem 'rubocop'
data/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  Ruby bindings for reading from the systemd journal.
4
4
 
5
- * [documentation](http://rubydoc.info/gems/systemd-journal)
5
+ * [gem documentation](http://rubydoc.info/gems/systemd-journal)
6
+ * [libsystemd-journal documentation](http://www.freedesktop.org/software/systemd/man/sd-journal.html)
6
7
 
7
8
  ## Installation
8
9
 
@@ -14,6 +15,11 @@ And then execute:
14
15
 
15
16
  bundle install
16
17
 
18
+ Obviously you will need to have [systemd](http://www.freedesktop.org/wiki/Software/systemd/)
19
+ installed on your system in order to use the gem. The two native library
20
+ dependencies are `libsystemd-journal` and `libsystemd-id128`.
21
+
22
+
17
23
  ## Usage
18
24
 
19
25
  require 'systemd/journal'
@@ -30,17 +36,17 @@ Print all messages as they occur:
30
36
  Filter events and iterate:
31
37
 
32
38
  j = Systemd::Journal.new
33
-
39
+
34
40
  # only display entries from SSHD with priority 6.
35
41
  j.filter(priority: 6, _exe: '/usr/bin/sshd')
36
42
  j.each do |entry|
37
43
  puts entry.message
38
44
  end
39
-
45
+
40
46
  Moving around the journal:
41
47
 
42
48
  j = Systemd::Journal.new
43
-
49
+
44
50
  j.seek(:head) # move to the start of journal
45
51
  j.move(10) # move forward by 10 entries
46
52
  c = j.cursor # get a reference to this entry
@@ -50,15 +56,20 @@ Moving around the journal:
50
56
  j.seek(:tail) # move to end of the journal
51
57
  j.move_previous # move back
52
58
  j.move_next # move forward
53
-
59
+
54
60
  j.current_entry # get the entry we're currently positioned at
55
-
61
+
56
62
  # seek the entry that occured closest to this time
57
63
  j.seek(Time.parse("2013-10-31T12:00:00+04:00:00"))
58
64
 
59
-
65
+
60
66
  See the documentation for more examples.
61
67
 
68
+ ## Issues?
69
+
70
+ If you run into problems or have questions, please open an
71
+ [Issue](https://github.com/ledbettj/systemd-journal/issues).
72
+
62
73
  ## Contributing
63
74
 
64
75
  1. Fork it
data/Rakefile CHANGED
@@ -1,12 +1,18 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "yard"
3
3
  require "rspec/core/rake_task"
4
+ require "rubocop/rake_task"
4
5
 
5
6
  desc "open a console with systemd/journal required"
6
7
  task :console do
7
8
  exec 'pry -I./lib -r systemd/journal'
8
9
  end
9
10
 
11
+ Rubocop::RakeTask.new(:rubocop) do |task|
12
+ task.patterns = ['lib/**/*.rb']
13
+ task.fail_on_error = false
14
+ end
15
+
10
16
  YARD::Rake::YardocTask.new do |t|
11
17
  t.files = ['lib/**/*.rb']
12
18
  t.options = ['--no-private', '--markup=markdown']
@@ -8,10 +8,8 @@ class SSHWatcher
8
8
  end
9
9
 
10
10
  def run
11
- @journal.add_match(:_exe, '/usr/bin/sshd')
12
- # skip all existing entries -- sd_journal_seek_tail() is currently broken.
13
- while @journal.move_next ; end
14
-
11
+ @journal.filter(_exe: '/usr/bin/sshd')
12
+ @journal.seek(:tail)
15
13
  @journal.watch{ |entry| process_event(entry) }
16
14
  end
17
15
 
@@ -2,18 +2,14 @@ require 'ffi'
2
2
 
3
3
  # @private
4
4
  class FFI::MemoryPointer
5
+ # monkey patch a read_size_t and write_size_t method onto FFI::MemoryPointer
6
+ p = FFI::MemoryPointer.new(:size_t, 1)
7
+ w = case p.size
8
+ when 4 then :uint32
9
+ when 8 then :uint64
10
+ else raise RuntimeError.new("unsupported size_t width: #{p.size}")
11
+ end
5
12
 
6
- # monkey patch a read_size_t and write_size_t method onto
7
- # FFI::MemoryPointer if necessary.
8
- case (p = FFI::MemoryPointer.new(:size_t, 1)).size
9
- when 4
10
- alias_method(:read_size_t, :read_uint32) unless p.respond_to?(:read_size_t)
11
- alias_method(:write_size_t, :write_uint32) unless p.respond_to?(:write_size_t)
12
- when 8
13
- alias_method(:read_size_t, :read_uint64) unless p.respond_to?(:read_size_t)
14
- alias_method(:write_size_t, :write_uint64) unless p.respond_to?(:write_size_t)
15
- else
16
- raise RuntimeError.new("unsupported size_t width: #{p.size}")
17
- end
18
-
13
+ alias_method :read_size_t, :"read_#{w}" unless p.respond_to?(:read_size_t)
14
+ alias_method :write_size_t, :"write_#{w}" unless p.respond_to?(:write_size_t)
19
15
  end
data/lib/systemd/id128.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'ffi'
2
2
 
3
3
  module Systemd
4
+ # Provides access to the 128-bit IDs for various items in the systemd
5
+ # ecosystem, such as the machine id and boot id.
4
6
  module Id128
5
-
6
7
  # Get the 128-bit hex string identifying the current machine.
7
8
  # Can be used to filter a journal to show only messages originating
8
9
  # from this machine.
@@ -11,12 +12,7 @@ module Systemd
11
12
  # j.add_match('_MACHINE_ID', Systemd::Id128.machine_id)
12
13
  # @return [String] 128-bit hex string representing the current machine.
13
14
  def self.machine_id
14
- @machine_id ||= begin
15
- ptr = FFI::MemoryPointer.new(Native::Id128, 1)
16
- rc = Native.sd_id128_get_machine(ptr)
17
- raise JournalError.new(rc) if rc < 0
18
- Native::Id128.new(ptr).to_s
19
- end
15
+ @machine_id ||= read_id128(:sd_id128_get_machine)
20
16
  end
21
17
 
22
18
  # Get the 128-bit hex string identifying the current system's current boot.
@@ -27,19 +23,20 @@ module Systemd
27
23
  # j.add_match('_BOOT_ID', Systemd::Id128.boot_id)
28
24
  # @return [String] 128-bit hex string representing the current boot.
29
25
  def self.boot_id
30
- @boot_id ||= begin
31
- ptr = FFI::MemoryPointer.new(Native::Id128, 1)
32
- rc = Native.sd_id128_get_boot(ptr)
33
- raise JournalError.new(rc) if rc < 0
34
- Native::Id128.new(ptr).to_s
35
- end
26
+ @boot_id ||= read_id128(:sd_id128_get_boot)
36
27
  end
37
28
 
38
29
  # Get a random 128-bit hex string.
39
30
  # @return [String] 128-bit random hex string.
40
31
  def self.random
32
+ read_id128(:sd_id128_randomize)
33
+ end
34
+
35
+ private
36
+
37
+ def self.read_id128(func)
41
38
  ptr = FFI::MemoryPointer.new(Native::Id128, 1)
42
- rc = Native.sd_id128_randomize(ptr)
39
+ rc = Native.send(func, ptr)
43
40
  raise JournalError.new(rc) if rc < 0
44
41
  Native::Id128.new(ptr).to_s
45
42
  end
@@ -56,13 +53,14 @@ module Systemd
56
53
  attach_function :sd_id128_randomize, [:pointer], :int
57
54
  end
58
55
 
56
+ # @private
59
57
  class Id128 < FFI::Union
60
58
  layout :bytes, [:uint8, 16],
61
59
  :dwords, [:uint32, 4],
62
60
  :qwords, [:uint64, 2]
63
61
 
64
62
  def to_s
65
- ("%02x" * 16) % self[:bytes].to_a
63
+ ('%02x' * 16) % self[:bytes].to_a
66
64
  end
67
65
  end
68
66
  end
@@ -38,9 +38,9 @@ module Systemd
38
38
  ptr = FFI::MemoryPointer.new(:pointer, 1)
39
39
 
40
40
  rc = if path
41
- Native::sd_journal_open_directory(ptr, path, 0)
41
+ Native.sd_journal_open_directory(ptr, path, 0)
42
42
  else
43
- Native::sd_journal_open(ptr, flags)
43
+ Native.sd_journal_open(ptr, flags)
44
44
  end
45
45
 
46
46
  raise JournalError.new(rc) if rc < 0
@@ -101,9 +101,8 @@ module Systemd
101
101
  # @return [Boolean] False if unable to move to the next entry, indicating
102
102
  # that the pointer has reached the end of the journal.
103
103
  def move_next
104
- if (rc = Native::sd_journal_next(@ptr)) < 0
105
- raise JournalError.new(rc) if rc < 0
106
- end
104
+ rc = Native.sd_journal_next(@ptr)
105
+ raise JournalError.new(rc) if rc < 0
107
106
  rc > 0
108
107
  end
109
108
 
@@ -112,7 +111,7 @@ module Systemd
112
111
  # moved. If this number is less than the requested amount, the read
113
112
  # pointer has reached the end of the journal.
114
113
  def move_next_skip(amount)
115
- rc = Native::sd_journal_next_skip(@ptr, amount)
114
+ rc = Native.sd_journal_next_skip(@ptr, amount)
116
115
  raise JournalError.new(rc) if rc < 0
117
116
  rc
118
117
  end
@@ -122,9 +121,8 @@ module Systemd
122
121
  # @return [Boolean] False if unable to move to the previous entry,
123
122
  # indicating that the pointer has reached the beginning of the journal.
124
123
  def move_previous
125
- if (rc = Native::sd_journal_previous(@ptr)) < 0
126
- raise JournalError.new(rc) if rc < 0
127
- end
124
+ rc = Native.sd_journal_previous(@ptr)
125
+ raise JournalError.new(rc) if rc < 0
128
126
  rc > 0
129
127
  end
130
128
 
@@ -133,7 +131,7 @@ module Systemd
133
131
  # was moved. If this number is less than the requested amount, the read
134
132
  # pointer has reached the beginning of the journal.
135
133
  def move_previous_skip(amount)
136
- rc = Native::sd_journal_previous_skip(@ptr, amount)
134
+ rc = Native.sd_journal_previous_skip(@ptr, amount)
137
135
  raise JournalError.new(rc) if rc < 0
138
136
  rc
139
137
  end
@@ -152,15 +150,15 @@ module Systemd
152
150
  def seek(whence)
153
151
  rc = case whence
154
152
  when :head, :start
155
- Native::sd_journal_seek_head(@ptr)
153
+ Native.sd_journal_seek_head(@ptr)
156
154
  when :tail, :end
157
- Native::sd_journal_seek_tail(@ptr)
155
+ Native.sd_journal_seek_tail(@ptr)
158
156
  else
159
157
  if whence.is_a?(Time)
160
158
  # TODO: is this right? who knows.
161
- Native::sd_journal_seek_realtime_usec(@ptr, whence.to_i * 1_000_000)
159
+ Native.sd_journal_seek_realtime_usec(@ptr, whence.to_i * 1_000_000)
162
160
  elsif whence.is_a?(String)
163
- Native::sd_journal_seek_cursor(@ptr, whence)
161
+ Native.sd_journal_seek_cursor(@ptr, whence)
164
162
  else
165
163
  raise ArgumentError.new("Unknown seek type: #{whence.class}")
166
164
  end
@@ -183,13 +181,13 @@ module Systemd
183
181
  def read_field(field)
184
182
  len_ptr = FFI::MemoryPointer.new(:size_t, 1)
185
183
  out_ptr = FFI::MemoryPointer.new(:pointer, 1)
186
-
187
- rc = Native::sd_journal_get_data(@ptr, field.to_s.upcase, out_ptr, len_ptr)
184
+ field = field.to_s.upcase
185
+ rc = Native.sd_journal_get_data(@ptr, field, out_ptr, len_ptr)
188
186
 
189
187
  raise JournalError.new(rc) if rc < 0
190
188
 
191
189
  len = len_ptr.read_size_t
192
- out_ptr.read_pointer.read_string_length(len).split('=', 2).last
190
+ string_from_out_ptr(out_ptr, len).split('=', 2).last
193
191
  end
194
192
 
195
193
  # Read the contents of all fields from the current journal entry.
@@ -205,22 +203,15 @@ module Systemd
205
203
  # j.move_next
206
204
  # j.current_entry{ |field, value| puts "#{field}: #{value}" }
207
205
  def current_entry
208
- Native::sd_journal_restart_data(@ptr)
209
-
210
- len_ptr = FFI::MemoryPointer.new(:size_t, 1)
211
- out_ptr = FFI::MemoryPointer.new(:pointer, 1)
206
+ Native.sd_journal_restart_data(@ptr)
212
207
  results = {}
213
208
 
214
- while (rc = Native::sd_journal_enumerate_data(@ptr, out_ptr, len_ptr)) > 0
215
- len = len_ptr.read_size_t
216
- key, value = out_ptr.read_pointer.read_string_length(len).split('=', 2)
209
+ while (kvpair = enumerate_helper(:sd_journal_enumerate_data))
210
+ key, value = kvpair
217
211
  results[key] = value
218
-
219
212
  yield(key, value) if block_given?
220
213
  end
221
214
 
222
- raise JournalError.new(rc) if rc < 0
223
-
224
215
  JournalEntry.new(results)
225
216
  end
226
217
 
@@ -237,24 +228,16 @@ module Systemd
237
228
  # end
238
229
  def query_unique(field)
239
230
  results = []
240
- out_ptr = FFI::MemoryPointer.new(:pointer, 1)
241
- len_ptr = FFI::MemoryPointer.new(:size_t, 1)
242
231
 
243
- Native::sd_journal_restart_unique(@ptr)
244
-
245
- if (rc = Native::sd_journal_query_unique(@ptr, field.to_s.upcase)) < 0
246
- raise JournalError.new(rc)
247
- end
232
+ Native.sd_journal_restart_unique(@ptr)
248
233
 
249
- while (rc = Native::sd_journal_enumerate_unique(@ptr, out_ptr, len_ptr)) > 0
250
- len = len_ptr.read_size_t
251
- results << out_ptr.read_pointer.read_string_length(len).split('=', 2).last
234
+ rc = Native.sd_journal_query_unique(@ptr, field.to_s.upcase)
235
+ raise JournalError.new(rc) if rc < 0
252
236
 
253
- yield results.last if block_given?
237
+ while (kvpair = enumerate_helper(:sd_journal_enumerate_unique))
238
+ results << kvpair.last
254
239
  end
255
240
 
256
- raise JournalError.new(rc) if rc < 0
257
-
258
241
  results
259
242
  end
260
243
 
@@ -271,7 +254,7 @@ module Systemd
271
254
  # @return [Symbol] :append if new entries were appened to the journal.
272
255
  # @return [Symbol] :invalidate if journal files were added/removed/rotated.
273
256
  def wait(timeout_usec = -1)
274
- rc = Native::sd_journal_wait(@ptr, timeout_usec)
257
+ rc = Native.sd_journal_wait(@ptr, timeout_usec)
275
258
  raise JournalError.new(rc) if rc.is_a?(Fixnum) && rc < 0
276
259
  rc == :nop ? nil : rc
277
260
  end
@@ -287,7 +270,7 @@ module Systemd
287
270
  # puts event.message
288
271
  # end
289
272
  def watch
290
- while true
273
+ loop do
291
274
  if wait
292
275
  yield current_entry while move_next
293
276
  end
@@ -303,7 +286,7 @@ module Systemd
303
286
  # @return [nil]
304
287
  def add_filter(field, value)
305
288
  match = "#{field.to_s.upcase}=#{value}"
306
- rc = Native::sd_journal_add_match(@ptr, match, match.length)
289
+ rc = Native.sd_journal_add_match(@ptr, match, match.length)
307
290
  raise JournalError.new(rc) if rc < 0
308
291
  end
309
292
 
@@ -336,7 +319,7 @@ module Systemd
336
319
  # # has priority 5
337
320
  # end
338
321
  def add_disjunction
339
- rc = Native::sd_journal_add_disjunction(@ptr)
322
+ rc = Native.sd_journal_add_disjunction(@ptr)
340
323
  raise JournalError.new(rc) if rc < 0
341
324
  end
342
325
 
@@ -354,14 +337,14 @@ module Systemd
354
337
  # # current_entry is an sshd event with priority 5
355
338
  # end
356
339
  def add_conjunction
357
- rc = Native::sd_journal_add_conjunction(@ptr)
340
+ rc = Native.sd_journal_add_conjunction(@ptr)
358
341
  raise JournalError.new(rc) if rc < 0
359
342
  end
360
343
 
361
344
  # Remove all filters and conjunctions/disjunctions.
362
345
  # @return [nil]
363
346
  def clear_filters
364
- Native::sd_journal_flush_matches(@ptr)
347
+ Native.sd_journal_flush_matches(@ptr)
365
348
  end
366
349
 
367
350
  # Get the number of bytes the Journal is currently using on disk.
@@ -371,7 +354,7 @@ module Systemd
371
354
  # @return [Integer] size in bytes
372
355
  def disk_usage
373
356
  size_ptr = FFI::MemoryPointer.new(:uint64)
374
- rc = Native::sd_journal_get_usage(@ptr, size_ptr)
357
+ rc = Native.sd_journal_get_usage(@ptr, size_ptr)
375
358
 
376
359
  raise JournalError.new(rc) if rc < 0
377
360
  size_ptr.read_uint64
@@ -382,7 +365,7 @@ module Systemd
382
365
  # @return [Integer] size in bytes.
383
366
  def data_threshold
384
367
  size_ptr = FFI::MemoryPointer.new(:size_t, 1)
385
- if (rc = Native::sd_journal_get_data_threshold(@ptr, size_ptr)) < 0
368
+ if (rc = Native.sd_journal_get_data_threshold(@ptr, size_ptr)) < 0
386
369
  raise JournalError.new(rc)
387
370
  end
388
371
 
@@ -392,7 +375,7 @@ module Systemd
392
375
  # Set the maximum length of a data field that will be returned.
393
376
  # Fields longer than this will be truncated.
394
377
  def data_threshold=(threshold)
395
- if (rc = Native::sd_journal_set_data_threshold(@ptr, threshold)) < 0
378
+ if (rc = Native.sd_journal_set_data_threshold(@ptr, threshold)) < 0
396
379
  raise JournalError.new(rc)
397
380
  end
398
381
  end
@@ -425,17 +408,32 @@ module Systemd
425
408
  private
426
409
 
427
410
  def self.finalize(ptr)
428
- proc{ Native::sd_journal_close(ptr) unless ptr.nil? }
411
+ proc{ Native.sd_journal_close(ptr) unless ptr.nil? }
412
+ end
413
+
414
+ def enumerate_helper(enum_function)
415
+ len_ptr = FFI::MemoryPointer.new(:size_t, 1)
416
+ out_ptr = FFI::MemoryPointer.new(:pointer, 1)
417
+
418
+ rc = Native.send(enum_function, @ptr, out_ptr, len_ptr)
419
+ raise JournalError.new(rc) if rc < 0
420
+ return nil if rc == 0
421
+
422
+ len = len_ptr.read_size_t
423
+ string_from_out_ptr(out_ptr, len).split('=', 2)
424
+ end
425
+
426
+ def string_from_out_ptr(p, len)
427
+ p.read_pointer.read_string_length(len)
429
428
  end
430
429
 
431
430
  # some sd_journal_* functions return strings that we're expected to free
432
- # ourselves. This function copies the string from a char* to a ruby string,
431
+ # ourselves. This function copies the string from a char* to a ruby string,
433
432
  # frees the char*, and returns the ruby string.
434
433
  def read_and_free_outstr(ptr)
435
434
  str = ptr.read_string
436
435
  LibC.free(ptr)
437
436
  str
438
437
  end
439
-
440
438
  end
441
439
  end
@@ -6,7 +6,6 @@ module Systemd
6
6
  # This module provides compatibility with the systemd-journal.gem
7
7
  # by Daniel Mack (https://github.com/zonque/systemd-journal.gem)
8
8
  module Compat
9
-
10
9
  # system is unusable
11
10
  LOG_EMERG = 0
12
11
  # action must be taken immediately
@@ -32,12 +31,11 @@ module Systemd
32
31
  # methods in this module will be available as class methods on
33
32
  # {Systemd::Journal}
34
33
  module ClassMethods
35
-
36
34
  # write the value of the c errno constant to the systemd journal in the
37
35
  # style of the perror() function.
38
36
  # @param [String] message the text to prefix the error message with.
39
37
  def perror(message)
40
- rc = Native::sd_journal_perror(message)
38
+ rc = Native.sd_journal_perror(message)
41
39
  raise JournalError.new(rc) if rc < 0
42
40
  end
43
41
 
@@ -46,23 +44,22 @@ module Systemd
46
44
  # severity of the event.
47
45
  # @param [String] message the content of the message to write.
48
46
  def print(level, message)
49
- rc = Native::sd_journal_print(level, message)
47
+ rc = Native.sd_journal_print(level, message)
50
48
  raise JournalError.new(rc) if rc < 0
51
49
  end
52
50
 
53
51
  # write an event to the systemd journal.
54
52
  # @param [Hash] contents the set of key-value pairs defining the event.
55
53
  def message(contents)
56
- items = contents.flat_map do |k,v|
54
+ items = contents.flat_map do |k, v|
57
55
  [:string, "#{k.to_s.upcase}=#{v}"]
58
56
  end
59
57
  # add a null pointer to terminate the varargs
60
58
  items += [:string, nil]
61
- rc = Native::sd_journal_send(*items)
59
+ rc = Native.sd_journal_send(*items)
62
60
  raise JournalError.new(rc) if rc < 0
63
61
  end
64
62
  end
65
-
66
63
  end
67
64
  end
68
65
  end
@@ -12,7 +12,7 @@ module Systemd
12
12
  _MACHINE_ID _HOSTNAME _TRANSPORT }
13
13
 
14
14
  # Fields used in messages originating from the kernel.
15
- KERNEL_FIELDS = %w{ _KERNEL_DEVICE _KERNEL_SUBSYSTEM _UDEV_SYSNAME _UDEV_DEVNODE _UDEV_DEVLINK }
16
-
15
+ KERNEL_FIELDS = %w{ _KERNEL_DEVICE _KERNEL_SUBSYSTEM _UDEV_SYSNAME
16
+ _UDEV_DEVNODE _UDEV_DEVLINK }
17
17
  end
18
18
  end
@@ -1,8 +1,9 @@
1
1
  module Systemd
2
2
  class Journal
3
3
  # Provides the FFI bindings to the native `libsystemd-journal` shared
4
- # library.
4
+ # library.
5
5
  module Native
6
+ # rubocop:disable LineLength
6
7
  require 'ffi'
7
8
  extend FFI::Library
8
9
  ffi_lib %w[libsystemd-journal.so libsystemd-journal.so.0]
@@ -60,9 +61,9 @@ module Systemd
60
61
  # misc
61
62
  attach_function :sd_journal_get_usage, [:pointer, :pointer], :int
62
63
  end
63
-
64
64
  end unless $NO_FFI_SPEC
65
65
 
66
+ # @private
66
67
  module LibC
67
68
  require 'ffi'
68
69
  extend FFI::Library
@@ -70,5 +71,4 @@ module Systemd
70
71
 
71
72
  attach_function :free, [:pointer], :void
72
73
  end
73
-
74
74
  end
@@ -1,6 +1,6 @@
1
1
  module Systemd
2
2
  class Journal
3
3
  # The version of the systemd-journal gem.
4
- VERSION = '1.0.1'
4
+ VERSION = '1.0.2'
5
5
  end
6
6
  end
@@ -1,9 +1,15 @@
1
1
  module Systemd
2
+ # Represents a single entry in the Journal.
2
3
  class JournalEntry
3
4
  include Enumerable
4
5
 
5
6
  attr_reader :fields
6
7
 
8
+ # Create a new JournalEntry from the given entry hash. You probably don't
9
+ # need to construct this yourself; instead instances are returned from
10
+ # {Systemd::Journal} methods such as {Systemd::Journal#current_entry}.
11
+ # @param [Hash] entry a hash containing all the key-value pairs associated
12
+ # with a given journal entry.
7
13
  def initialize(entry)
8
14
  @entry = entry
9
15
  @fields = entry.map do |key, value|
@@ -14,15 +20,14 @@ module Systemd
14
20
 
15
21
  end
16
22
 
23
+ # Get the value of a given field in the entry, or nil if it doesn't exist
17
24
  def [](key)
18
25
  @entry[key] || @entry[key.to_s.upcase]
19
26
  end
20
27
 
21
28
  def each
22
29
  return to_enum(:each) unless block_given?
23
-
24
30
  @entry.each{ |key, value| yield [key, value] }
25
31
  end
26
-
27
32
  end
28
33
  end
@@ -3,8 +3,7 @@ require 'ffi'
3
3
  module Systemd
4
4
  # This execption is raised whenever a sd_journal_* call returns an error.
5
5
  class JournalError < StandardError
6
-
7
- # Returns the (negated) error number.
6
+ # Returns the (positive) error number.
8
7
  attr_reader :code
9
8
 
10
9
  # Instantiate a new JournalError based on the specified return code.
@@ -12,7 +11,7 @@ module Systemd
12
11
  # return code.
13
12
  def initialize(code)
14
13
  @code = -code
15
- super(LIBC::strerror(@code))
14
+ super(LIBC.strerror(@code))
16
15
  end
17
16
 
18
17
  private
@@ -25,6 +24,5 @@ module Systemd
25
24
 
26
25
  attach_function :strerror, [:int], :string
27
26
  end
28
-
29
27
  end
30
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: systemd-journal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Ledbetter
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-15 00:00:00.000000000 Z
12
+ date: 2013-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -62,6 +62,7 @@ extensions: []
62
62
  extra_rdoc_files: []
63
63
  files:
64
64
  - .gitignore
65
+ - .rubocop.yml
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md