Module: OS::Linux::Diagnostic::Checks Private

Extended by:
T::Helpers
Included in:
Homebrew::Diagnostic::Checks
Defined in:
extend/os/linux/diagnostic.rb

Overview

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Linux-specific diagnostic checks for Homebrew.

Instance Method Summary collapse

Instance Method Details

#check_cask_software_versionsString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



301
302
303
304
305
306
# File 'extend/os/linux/diagnostic.rb', line 301

def check_cask_software_versions
  super
  add_info "Linux", OS::Linux.os_version

  nil
end

#check_for_symlinked_homeString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'extend/os/linux/diagnostic.rb', line 242

def check_for_symlinked_home
  return unless File.symlink?("/home")

  <<~EOS
    Your /home directory is a symlink.
    This is known to cause issues with formula linking, particularly when installing
    multiple formulae that create symlinks in shared directories.

    While this may be a standard directory structure in some distributions
    (e.g. Fedora Silverblue) there are known issues as-is.

    If you encounter linking issues, you may need to manually create conflicting
    directories or use `brew link --overwrite` as a workaround.

    We'd welcome a PR to fix this functionality.
    See https://github.com/Homebrew/brew/issues/18036 for more context.

    #{support_tier_message(tier: 2)}
  EOS
end

#check_gcc_dependent_linkageString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# File 'extend/os/linux/diagnostic.rb', line 264

def check_gcc_dependent_linkage
  gcc_dependents = ::Formula.installed.select do |formula|
    next false unless formula.tap&.core_tap?

    # FIXME: This includes formulae that have no runtime dependency on GCC.
    formula.recursive_dependencies.map(&:name).include? "gcc"
  rescue TapFormulaUnavailableError
    false
  end
  return if gcc_dependents.empty?

  badly_linked = gcc_dependents.select do |dependent|
    dependent_prefix = dependent.any_installed_prefix
    # Keg.new() may raise an error if it is not a directory.
    # As the result `brew doctor` may display `Error: <keg> is not a directory`
    # instead of proper `doctor` information.
    # There are other checks that test that, we can skip broken kegs.
    next if dependent_prefix.nil? || !dependent_prefix.exist? || !dependent_prefix.directory?

    keg = ::Keg.new(dependent_prefix)
    keg.binary_executable_or_library_files.any? do |binary|
      paths = binary.rpaths
      versioned_linkage = paths.any? { |path| path.match?(%r{lib/gcc/\d+$}) }
      unversioned_linkage = paths.any? { |path| path.match?(%r{lib/gcc/current$}) }

      versioned_linkage && !unversioned_linkage
    end
  end
  return if badly_linked.empty?

  inject_file_list badly_linked, <<~EOS
    Formulae which link to GCC through a versioned path were found. These formulae
    are prone to breaking when GCC is updated. You should `brew reinstall` these formulae:
  EOS
end

#check_glibc_minimum_versionString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'extend/os/linux/diagnostic.rb', line 105

def check_glibc_minimum_version
  return unless OS::Linux::Glibc.below_minimum_version?

  <<~EOS
    Your system glibc #{OS::Linux::Glibc.system_version} is too old.
    We only support glibc #{OS::Linux::Glibc.minimum_version} or later.

    We recommend updating to a newer version via your distribution's
    package manager, upgrading your distribution to the latest version,
    or changing distributions.

    #{support_tier_message(tier: :unsupported)}
  EOS
end

#check_glibc_next_versionString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'extend/os/linux/diagnostic.rb', line 140

def check_glibc_next_version
  return if OS::LINUX_GLIBC_NEXT_CI_VERSION.blank?
  return if OS::Linux::Glibc.below_ci_version?
  return if OS::Linux::Glibc.system_version >= OS::LINUX_GLIBC_NEXT_CI_VERSION

  # We want to bypass this check in some tests.
  return if ENV["HOMEBREW_GLIBC_TESTING"] || ENV["CI"] || ENV["HOMEBREW_TEST_BOT"].present?

  <<~EOS
    Your system glibc #{OS::Linux::Glibc.system_version} is older than #{OS::LINUX_GLIBC_NEXT_CI_VERSION}.
    An upcoming brew release will automatically install a newer version.

    We recommend updating to a newer version via your distribution's
    package manager, upgrading your distribution to the latest version,
    or changing distributions.
  EOS
end

#check_glibc_versionString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'extend/os/linux/diagnostic.rb', line 121

def check_glibc_version
  return unless OS::Linux::Glibc.below_ci_version?

  # We want to bypass this check in some tests.
  return if ENV["HOMEBREW_GLIBC_TESTING"]

  <<~EOS
    Your system glibc #{OS::Linux::Glibc.system_version} is too old.
    We will need to automatically install a newer version.

    We recommend updating to a newer version via your distribution's
    package manager, upgrading your distribution to the latest version,
    or changing distributions.

    #{support_tier_message(tier: 2)}
  EOS
end

#check_kernel_minimum_versionString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'extend/os/linux/diagnostic.rb', line 159

def check_kernel_minimum_version
  return unless OS::Linux::Kernel.below_minimum_version?

  <<~EOS
    Your Linux kernel #{OS.kernel_version} is too old.
    We only support kernel #{OS::Linux::Kernel.minimum_version} or later.
    You will be unable to use binary packages (bottles).

    We recommend updating to a newer version via your distribution's
    package manager, upgrading your distribution to the latest version,
    or changing distributions.

    #{support_tier_message(tier: 3)}
  EOS
end

#check_linux_sandboxString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'extend/os/linux/diagnostic.rb', line 176

def check_linux_sandbox
  return unless Homebrew::EnvConfig.sandbox_linux?
  return if OS::Linux.inside_docker?

  state = ::Sandbox.state
  return if [:disabled, :available].include?(state)

  reason = ::Sandbox.failure_reason || "The Linux sandbox is not available."
  lines = case state
  when :missing
    [
      reason,
      "",
      "Install Bubblewrap and ensure a rootless `bwrap` executable is available on `PATH`.",
    ]
  when :setuid
    [
      reason,
      "",
      "Homebrew's Linux sandbox requires a rootless `bwrap` executable.",
      "Install a non-setuid Bubblewrap or put it earlier on `PATH`.",
    ]
  when :unavailable
    [
      reason,
      "",
      "Homebrew's Linux sandbox requires rootless Bubblewrap and unprivileged",
      "user namespaces. Check and update this system configuration:",
      *::Sandbox.configuration_command_messages,
    ]
  else
    [reason]
  end

  "#{[
    *lines,
    "",
    "As a final workaround, disable the Linux sandbox:",
    "  export HOMEBREW_NO_SANDBOX_LINUX=1",
  ].join("\n")}\n"
end

#check_linuxbrew_bottle_domainString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



231
232
233
234
235
236
237
238
239
# File 'extend/os/linux/diagnostic.rb', line 231

def check_linuxbrew_bottle_domain
  return unless Homebrew::EnvConfig.bottle_domain.include?("linuxbrew")

  <<~EOS
    Your `$HOMEBREW_BOTTLE_DOMAIN` still contains "linuxbrew".
    You must unset it (or adjust it to not contain linuxbrew
    e.g. by using homebrew instead).
  EOS
end

#check_linuxbrew_coreString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



219
220
221
222
223
224
225
226
227
228
# File 'extend/os/linux/diagnostic.rb', line 219

def check_linuxbrew_core
  return unless Homebrew::EnvConfig.no_install_from_api?
  return unless CoreTap.instance.linuxbrew_core?

  <<~EOS
    Your Linux core repository is still linuxbrew-core.
    You must either unset `$HOMEBREW_NO_INSTALL_FROM_API` or set
    the repository's remote to homebrew-core to update core formulae.
  EOS
end

#check_supported_architectureString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



92
93
94
95
96
97
98
99
100
101
102
# File 'extend/os/linux/diagnostic.rb', line 92

def check_supported_architecture
  return if ::Hardware::CPU.intel?
  return if ::Hardware::CPU.arm64?

  <<~EOS
    Your CPU architecture (#{::Hardware::CPU.arch}) is not supported. We only support
    x86_64 or ARM64/AArch64 CPU architectures. You will be unable to use binary packages (bottles).

    #{support_tier_message(tier: 2)}
  EOS
end

#check_tmpdir_executableString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'extend/os/linux/diagnostic.rb', line 61

def check_tmpdir_executable
  f = Tempfile.new(%w[homebrew_check_tmpdir_executable .sh], HOMEBREW_TEMP)
  f.write "#!/bin/sh\n"
  f.chmod 0700
  f.close
  return if system T.must(f.path)

  <<~EOS
    The directory #{HOMEBREW_TEMP} does not permit executing
    programs. It is likely mounted as "noexec". Please set `$HOMEBREW_TEMP`
    in your #{Utils::Shell.profile} to a different directory, for example:
      export HOMEBREW_TEMP=~/tmp
      echo 'export HOMEBREW_TEMP=~/tmp' >> #{Utils::Shell.profile}
  EOS
ensure
  f&.unlink
end

#check_tmpdir_sticky_bitString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
# File 'extend/os/linux/diagnostic.rb', line 47

def check_tmpdir_sticky_bit
  message = super
  return if message.nil?

  message + <<~EOS
    If you don't have administrative privileges on this machine,
    create a directory and set the `$HOMEBREW_TEMP` environment variable,
    for example:
      install -d -m 1755 ~/tmp
      #{Utils::Shell.set_variable_in_profile("HOMEBREW_TEMP", "~/tmp")}
  EOS
end

#check_umask_not_zeroString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



80
81
82
83
84
85
86
87
88
89
# File 'extend/os/linux/diagnostic.rb', line 80

def check_umask_not_zero
  return unless File.umask.zero?

  <<~EOS
    umask is currently set to 000. Directories created by Homebrew cannot
    be world-writable. This issue can be resolved by adding "umask 002" to
    your #{Utils::Shell.profile}:
      echo 'umask 002' >> #{Utils::Shell.profile}
  EOS
end

#fatal_build_from_source_checksArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



31
32
33
34
35
# File 'extend/os/linux/diagnostic.rb', line 31

def fatal_build_from_source_checks
  (super + %w[
    check_linux_sandbox
  ]).freeze
end

#fatal_preinstall_checksArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



22
23
24
25
26
27
28
# File 'extend/os/linux/diagnostic.rb', line 22

def fatal_preinstall_checks
  %w[
    check_access_directories
    check_linuxbrew_core
    check_linuxbrew_bottle_domain
  ].freeze
end

#supported_configuration_checksArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



38
39
40
41
42
43
44
# File 'extend/os/linux/diagnostic.rb', line 38

def supported_configuration_checks
  %w[
    check_glibc_minimum_version
    check_kernel_minimum_version
    check_supported_architecture
  ].freeze
end