summaryrefslogtreecommitdiff
path: root/lognotify.rb
blob: b5d1977c0584055c05d21ed51fd34b45b1b4f9de (plain) (blame)
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
#!/usr/bin/env ruby
#
# lognotify.rb
# http://github.com/omp/lognotify
#
# Copyright 2010 David Vazgenovich Shakaryan <dvshakaryan@gmail.com>
# Distributed under the terms of the GNU General Public License v3.
# See http://www.gnu.org/licenses/gpl.txt for the full license text.

CACHE_DIR="~/.cache/lognotify"
CONFIG_DIR="~/.config/lognotify"

# Configuration file parser.
def parse identifier
  conf = Hash.new
  file = File.expand_path(CONFIG_DIR + '/' + identifier + '.conf')

  File.open(file) do |contents|
    contents.each_line do |line|
      # Remove whitespace from beginning of line, allowing for indentation.
      line.lstrip!

      # Ignore empty lines and comments.
      unless line.empty? or line[0,1] == '#'
        key, value = line.split('=', 2)

        # Raise an error if line does not contain a key/value pair.
        raise 'Error reading line ' + contents.lineno.to_s + '.' if value.nil?

        conf[key.strip.to_sym] = value.strip
      end
    end
  end

  return conf
end

def determine_size identifier
  file = File.expand_path(CACHE_DIR + '/' + identifier + '.log')
  return File.open(file).readlines.length
end

def acquire_new_lines conf, lines
  command = 'cat ' + conf[:log_path]
  command << " | sed '1," + lines.to_s + "d'" if lines > 0
  return %x[ssh #{conf[:ssh_hostname]} "#{command}"]
end

# Output all messages immediately, as opposed to buffering.
STDOUT.sync = true

# Test code...
ARGV.each do |identifier|
  conf = parse(identifier)

  print '* Determining number of lines in cached log... '
  lines = determine_size(identifier)
  puts lines

  print '* Acquiring new lines via SSH... '
  logappend = acquire_new_lines(conf, lines)
  puts 'Done'
  puts
  puts logappend
end