Module: ForemanMaintain::Concerns::SystemHelpers

Defined Under Namespace

Classes: Version

Constant Summary

Constants included from OsFacts

OsFacts::FALLBACK_OS_RELEASE_FILE, OsFacts::OS_RELEASE_FILE

Class Method Summary collapse

Instance Method Summary collapse

Methods included from OsFacts

#centos?, #cpu_cores, #deb_major_version, #debian?, #debian_or_ubuntu?, #el7?, #el8?, #el?, #el_major_version, #el_short_name, #facts, #memory, #os_id, #os_id_like_list, #os_name, #os_release_file, #os_version, #os_version_codename, #os_version_id, #rhel?, #ubuntu?, #ubuntu_major_version

Methods included from Finders

#check, #detector, #feature, #find_all_scenarios, #find_checks, #find_procedures, #find_scenarios, #procedure

Methods included from Logger

#logger

Class Method Details

.included(klass) ⇒ Object



13
14
15
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 13

def self.included(klass)
  klass.extend(self)
end

Instance Method Details

#check_max_version(name, maximal_version) ⇒ Object



42
43
44
45
46
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 42

def check_max_version(name, maximal_version)
  check_version(name) do |current_version|
    version(maximal_version) >= current_version
  end
end

#check_min_version(name, minimal_version) ⇒ Object



36
37
38
39
40
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 36

def check_min_version(name, minimal_version)
  check_version(name) do |current_version|
    current_version >= version(minimal_version)
  end
end

#command_present?(command_name) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 53

def command_present?(command_name)
  execute?("command -v #{command_name}")
end

#create_lv_snapshot(name, block_size, path) ⇒ Object



170
171
172
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 170

def create_lv_snapshot(name, block_size, path)
  execute!("lvcreate -n#{name} -L#{block_size} -s #{path}")
end

#directory_empty?(dir) ⇒ Boolean

Returns:

  • (Boolean)


162
163
164
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 162

def directory_empty?(dir)
  Dir.entries(dir).size <= 2
end

#execute(command, options = {}) ⇒ Object



73
74
75
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 73

def execute(command, options = {})
  execute_runner(command, options).output
end

#execute!(command, options = {}) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 64

def execute!(command, options = {})
  command_runner = execute_runner(command, options)
  if command_runner.success?
    command_runner.output
  else
    raise command_runner.execution_error
  end
end

#execute?(command, options = {}) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
51
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 48

def execute?(command, options = {})
  execute(command, options)
  $CHILD_STATUS.success?
end

#execute_runner(command, options = {}) ⇒ Object



57
58
59
60
61
62
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 57

def execute_runner(command, options = {})
  command_runner = Utils::CommandRunner.new(logger, command, options)
  execution.puts '' if command_runner.interactive? && respond_to?(:execution)
  command_runner.run
  command_runner
end

#execute_with_status(command, options = {}) ⇒ Object



77
78
79
80
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 77

def execute_with_status(command, options = {})
  command_runner = execute_runner(command, options)
  [command_runner.exit_status, command_runner.output]
end

#file_exists?(filename) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 82

def file_exists?(filename)
  File.exist?(filename)
end

#file_nonzero?(filename) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 86

def file_nonzero?(filename)
  File.exist?(filename) && !File.zero?(filename)
end

#find_dir_containing_file(directory, target) ⇒ Object



178
179
180
181
182
183
184
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 178

def find_dir_containing_file(directory, target)
  result = nil
  Find.find(directory) do |path|
    result = File.dirname(path) if File.basename(path) == target
  end
  result
end

#find_package(name) ⇒ Object



90
91
92
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 90

def find_package(name)
  package_manager.find_installed_package(name)
end


156
157
158
159
160
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 156

def find_symlinks(dir_path)
  cmd = "find '#{dir_path}' -maxdepth 1 -type l"
  result = execute(cmd).strip
  result.split(/\n/)
end

#foreman_plugin_name(plugin) ⇒ Object



204
205
206
207
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 204

def foreman_plugin_name(plugin)
  plugin = plugin.tr('_', '-') if debian_or_ubuntu?
  ruby_prefix + plugin
end

#format_shell_args(options = {}) ⇒ Object



152
153
154
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 152

def format_shell_args(options = {})
  options.map { |shell_optn, val| " #{shell_optn} #{shellescape(val)}" }.join
end

#get_lv_info(dir) ⇒ Object



166
167
168
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 166

def get_lv_info(dir)
  execute("findmnt -n --target #{dir} -o SOURCE,FSTYPE").split
end

#get_lv_path(lv_name) ⇒ Object



174
175
176
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 174

def get_lv_path(lv_name)
  execute("lvs --noheadings -o lv_path -S lv_name=#{lv_name}").strip
end

#hammer_packageObject



225
226
227
228
229
230
231
232
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 225

def hammer_package
  hammer_prefix = if debian_or_ubuntu?
                    'hammer-cli'
                  else
                    'hammer_cli'
                  end
  ruby_prefix + hammer_prefix
end

#hammer_plugin_name(plugin) ⇒ Object



220
221
222
223
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 220

def hammer_plugin_name(plugin)
  plugin = plugin.tr('_', '-') if debian_or_ubuntu?
  [hammer_package, plugin].join(debian_or_ubuntu? ? '-' : '_')
end

#hostnameObject



94
95
96
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 94

def hostname
  execute('hostname -f')
end

#package_managerObject



186
187
188
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 186

def package_manager
  ForemanMaintain.package_manager
end

#package_version(name) ⇒ Object



117
118
119
120
121
122
123
124
125
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 117

def package_version(name)
  ver = if el?
          '%{VERSION}'
        elsif debian_or_ubuntu?
          '${VERSION}'
        end
  pkg = package_manager.find_installed_package(name, ver)
  version(pkg) unless pkg.nil?
end

#packages_action(action, packages, options = {}) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 102

def packages_action(action, packages, options = {})
  options.validate_options!(:assumeyes, :yum_options)
  case action
  when :install
    package_manager.install(packages, :assumeyes => options[:assumeyes])
  when :update
    package_manager.update(packages, :assumeyes => options[:assumeyes],
                                     :yum_options => options[:yum_options])
  when :remove
    package_manager.remove(packages, :assumeyes => options[:assumeyes])
  else
    raise ArgumentError, "Unexpected action #{action} expected #{expected_actions.inspect}"
  end
end

#parse_csv(data) ⇒ Object



127
128
129
130
131
132
133
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 127

def parse_csv(data)
  parsed_data = CSV.parse(data)
  header = parsed_data.first
  parsed_data[1..-1].map do |row|
    Hash[*header.zip(row).flatten(1)]
  end
end

#parse_json(json_string) ⇒ Object



135
136
137
138
139
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 135

def parse_json(json_string)
  JSON.parse(json_string)
rescue StandardError
  nil
end

#proxy_plugin_name(plugin) ⇒ Object



209
210
211
212
213
214
215
216
217
218
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 209

def proxy_plugin_name(plugin)
  if debian_or_ubuntu?
    plugin = plugin.tr('_', '-')
    proxy_plugin_prefix = 'smart-proxy-'
  else
    proxy_plugin_prefix = 'smart_proxy_'
  end
  scl = check_min_version('foreman-proxy', '2.0')
  ruby_prefix(scl) + proxy_plugin_prefix + plugin
end

#repository_managerObject



190
191
192
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 190

def repository_manager
  ForemanMaintain.repository_manager
end

#ruby_prefix(scl = true) ⇒ Object



194
195
196
197
198
199
200
201
202
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 194

def ruby_prefix(scl = true)
  if debian_or_ubuntu?
    'ruby-'
  elsif el7? && scl
    'tfm-rubygem-'
  else
    'rubygem-'
  end
end

#server?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 98

def server?
  find_package('foreman')
end

#shellescape(string) ⇒ Object



141
142
143
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 141

def shellescape(string)
  Shellwords.escape(string)
end

#systemd_installed?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 32

def systemd_installed?
  File.exist?('/usr/bin/systemctl')
end

#version(value) ⇒ Object



145
146
147
148
149
150
# File 'lib/foreman_maintain/concerns/system_helpers.rb', line 145

def version(value)
  # packages versions, especially on Debian, sometimes include a + or a ~,
  # but Gem::Version can't handle that.
  value.gsub!(/[+~]/, '-')
  Version.new(value)
end