# frozen_string_literal: true require 'facter' # Detects active ceph service instances via systemctl and exposes facts # for use in ceph service management profiles. # rubocop:disable Style/ClassAndModuleChildren module Unkin module Ceph # Detects active ceph service instances via systemctl and exposes Facter facts. module Utils TYPES = %w[mon mgr mds osd].freeze def self.services output = Facter::Core::Execution.execute( 'systemctl list-units "ceph*" --no-legend --plain --all 2>/dev/null', on_fail: '' ) parse_units(output) end def self.parse_units(output) result = TYPES.each_with_object({}) { |type, hash| hash[type] = [] } output.each_line do |line| unit = line.split.first next unless unit match_unit(result, unit) end result end def self.match_unit(result, unit) TYPES.each do |type| match = unit.match(/\Aceph-#{type}@(.+)\.service\z/) result[type] << "ceph-#{type}@#{match[1]}" if match end end TYPES.each do |type| define_singleton_method(:"#{type}?") { !services[type].empty? } end end end end # rubocop:enable Style/ClassAndModuleChildren Facter.add('ceph_services') do setcode { Unkin::Ceph::Utils.services } end Unkin::Ceph::Utils::TYPES.each do |type| Facter.add("is_ceph_#{type}") do setcode { Unkin::Ceph::Utils.public_send(:"#{type}?") } end end