class Usage

Public Class Methods

filter_field(line, field, regex, arg = nil) click to toggle source
# File Entities/Usage.rb, line 123
def self.filter_field(line, field, regex, arg = nil)
  (match = line.match(/#{regex}/) and match.size > 1) or return {}
  dputs(3) { "Found a match: #{match.size} - #{match.inspect}" }
  match = match[1..-1]
  field.split(',').map { |f|
    value = match.shift
    case f
      when /date/
        begin
          {date: Time.strptime(value, arg)}
        rescue ArgumentError => e
          {date: Time.now}
        end
      when /name/
        {name: value}
      when /element/
        {element: value}
    end
  }.inject(:update)
end
filter_line(line, filter) click to toggle source
# File Entities/Usage.rb, line 101
def self.filter_line(line, filter)
  case filter
    when /^s/
      reg, rep = filter.split('/')[1, 2]
      dputs(4) { "Replacing #{reg.inspect} with #{rep.inspect}" }
      return line.sub(/#{reg}/, rep.to_s)
    when /^g/
      dputs(4) { "grepping #{filter} on #{line}" }
      if !(line =~ /#{filter[1..-1]}/)
        dputs(4) { "Didn't find - bail out" }
        return nil
      end
    when /^v/
      dputs(4) { "grepping -v #{filter}" }
      if line =~ /#{filter[1..-1]}/
        dputs(4) { 'Found it - bail out' }
        return nil
      end
  end
  line
end

Public Instance Methods

collect_data(from = Date.today - 7, to = Date.today) click to toggle source
# File Entities/Usage.rb, line 91
def collect_data(from = Date.today - 7, to = Date.today)
  count = Hash.new(0)
  filter_files_cache.select { |f|
    f._date and f._date >= from and f._date <= to
  }.each { |f|
    count[f._element] += 1
  }
  count.to_a.sort { |a, b| b[1] <=> a[1] }
end
fetch_files() click to toggle source
# File Entities/Usage.rb, line 26
def fetch_files
  return [] unless File.exists? file_dir.to_s
  Dir.glob("#{file_dir}/#{file_glob}")
end
filter_file(logfile) click to toggle source
# File Entities/Usage.rb, line 51
def filter_file(logfile)
  dputs(3) { "Filtering file #{logfile}" }
  filters = file_filter.to_s.split(/\n/)
  case filters.first
    when /^g/
      reg = /#{filters.shift[1..-1]}/
      readlines(logfile).select { |l|
        l =~ reg
      }
    when /^v/
      reg = /#{filters.shift[1..-1]}/
      f.readlines(logfile).select { |l|
        !l =~ reg
      }
    else
      log_msg :Usage, "Attention: #{filters.join(':')} doesn't start with grep!"
      readlines(logfile)
  end.map { |l|
    l.chomp!
    fields = {}
    dputs(4) { "Filtering line #{l}" }
    file_filter.to_s.split(/\n/).each { |filter|
      dputs(4) { "Applying filter #{filter.inspect} to #{l.inspect}" }
      case filter
        when /^[sgv]/
          l = Usage.filter_line(l, filter) or break
        when /^f/
          field, regex, arg = filter.split('::')
          fields.merge! Usage.filter_field(l, field[1..-1], regex, arg)
      end
      dputs(4) { "l is now #{l}" }
    }
    (fields).size > 0 ? fields : nil
  }.compact
end
filter_files() click to toggle source
# File Entities/Usage.rb, line 31
def filter_files
  #dputs_func
  dputs(3){"#{fetch_files}"}
  fetch_files.sort.reverse.map { |logfile|
    dputs(4){"Using file #{logfile}"}
    filter_file(logfile)
  }.flatten
end
filter_files_cache() click to toggle source
# File Entities/Usage.rb, line 87
def filter_files_cache
  @filter_data ||= filter_files
end
readlines(file) click to toggle source
# File Entities/Usage.rb, line 40
def readlines(file)
  File.open(file, 'r') { |f|
    if file =~ /gz$/
      gz = Zlib::GzipReader.new(f)
      result = gz.readlines
    else
      f.readlines
    end
  }
end