x-pack/lib/geoip_database_management/metadata.rb (92 lines of code) (raw):

# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one # or more contributor license agreements. Licensed under the Elastic License; # you may not use this file except in compliance with the Elastic License. require_relative 'util' require_relative 'constants' require "csv" module LogStash module GeoipDatabaseManagement class Metadata include LogStash::Util::Loggable include GeoipDatabaseManagement::Constants include GeoipDatabaseManagement::Util def initialize(paths) @paths = paths @metadata_path = paths.resolve("metadata.csv") end attr_reader :paths # csv format: database_type, check_at, gz_md5, dirname, is_eula def save_metadata(database_type, dirname, gz_md5:) metadata = get_metadata(database_type, false) current_timestamp = Time.now.to_i entry = [] entry[Column::DATABASE_TYPE] = database_type entry[Column::CHECK_AT] = current_timestamp entry[Column::GZ_MD5] = gz_md5 entry[Column::DIRNAME] = dirname metadata << entry update(metadata) end def update_timestamp(database_type) update_each_row do |row| row[Column::CHECK_AT] = Time.now.to_i if row[Column::DATABASE_TYPE].eql?(database_type) row end end def update_each_row(&block) metadata = get_all.map do |row| yield row end update(metadata) end def update(metadata) metadata = metadata.sort_by { |row| row[Column::DATABASE_TYPE] } ::CSV.open(@metadata_path, 'w') do |csv| metadata.each { |row| csv << row } end logger.trace("metadata updated", :metadata => metadata) end def touch update_each_row(&:itself) end def unset_path(database_type) update_each_row do |row| row[Column::DIRNAME] = "" if row[Column::DATABASE_TYPE].eql?(database_type) row end end def get_all file_exist?(@metadata_path) ? ::CSV.read(@metadata_path, headers: false) : Array.new end # Give rows of metadata that match/exclude the type def get_metadata(database_type, match = true) get_all.select { |row| row[Column::DATABASE_TYPE].eql?(database_type) == match } end # Return a valid database path def database_path(database_type) get_metadata(database_type).map { |metadata| @paths.db(database_type, metadata[Column::DIRNAME]) } .reject(&:empty?) .select { |path| file_exist?(path) } .last end def has_type?(database_type) get_metadata(database_type).any? end def gz_md5(database_type) get_metadata(database_type).map { |metadata| metadata[Column::GZ_MD5] } .last || '' end def check_at(database_type) (get_metadata(database_type).map { |metadata| metadata[Column::CHECK_AT] } .last || 0).to_i end # Return all active dirname def dirnames get_all.map { |metadata| metadata[Column::DIRNAME] }.reject(&:empty?) end def exist? file_exist?(@metadata_path) end def delete ::File.delete(@metadata_path) if exist? end module Column DATABASE_TYPE = 0 CHECK_AT = 1 GZ_MD5 = 2 DIRNAME = 3 end end end end