<<~'RUBY'
require "json"
require "rbconfig"
require "rubygems"
require "openssl"
require "psych"
packages = []
if File.file?("/var/lib/dpkg/status")
packages = File.read("/var/lib/dpkg/status").scan(/^Package:\s*(\S+)/).flatten
elsif File.file?("/lib/apk/db/installed")
packages = File.read("/lib/apk/db/installed").scan(/^P:(\S+)/).flatten
end
gems = Gem::Specification.map do |spec|
[spec.name, {
"version" => spec.version.to_s,
"platform" => spec.platform.to_s,
"native_extensions" => !spec.extensions.empty?,
"missing_extensions" => spec.respond_to?(:missing_extensions?) && spec.missing_extensions?,
"prerelease" => spec.version.prerelease?
}]
end.sort.to_h
output = {
"runtime" => {
"engine" => defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby",
"engine_version" => defined?(RUBY_ENGINE_VERSION) ? RUBY_ENGINE_VERSION : RUBY_VERSION,
"ruby_version" => RUBY_VERSION,
"patchlevel" => RUBY_PATCHLEVEL,
"platform" => RUBY_PLATFORM,
"architecture" => RbConfig::CONFIG["arch"],
"host_os" => RbConfig::CONFIG["host_os"],
"host_cpu" => RbConfig::CONFIG["host_cpu"],
"description" => RUBY_DESCRIPTION,
"debug_build" => RbConfig::CONFIG["configure_args"].to_s.include?("--enable-debug"),
"supported" => Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.1.0")
},
"dependencies" => {
"toolchain" => {
"rubygems_version" => Gem::VERSION,
"bundler_version" => Gem.loaded_specs["bundler"]&.version&.to_s
},
"gems" => gems,
"lockfile" => { "platforms" => [] }
},
"native_libraries" => {
"openssl" => {
"compiled" => OpenSSL::OPENSSL_VERSION,
"runtime" => OpenSSL.const_defined?(:OPENSSL_LIBRARY_VERSION) ? OpenSSL::OPENSSL_LIBRARY_VERSION : OpenSSL::OPENSSL_VERSION
},
"libyaml" => Psych.libyaml_version.join("."),
"psych" => Psych::VERSION
},
"configuration" => {
"environment_variables" => ENV.keys.sort.to_h { |name| [name, true] },
"required_environment_variables" => [],
"optional_environment_variables" => [],
"rails" => {}
},
"filesystem" => {
"path_separator" => File::SEPARATOR,
"case_sensitive" => true,
"symlinks_supported" => File.respond_to?(:symlink),
"temporary_directory" => { "present" => File.directory?("/tmp"), "writable" => File.writable?("/tmp"), "path" => "/tmp" },
"required_directories" => { "current" => { "present" => File.directory?(Dir.pwd), "writable" => File.writable?(Dir.pwd), "path" => Dir.pwd } }
},
"operating_system" => {
"name" => RbConfig::CONFIG["host_os"],
"cpu" => RbConfig::CONFIG["host_cpu"],
"capabilities" => {
"make" => ENV.fetch("PATH", "").split(File::PATH_SEPARATOR).any? { |dir| File.executable?(File.join(dir, "make")) },
"gcc" => ENV.fetch("PATH", "").split(File::PATH_SEPARATOR).any? { |dir| File.executable?(File.join(dir, "gcc")) }
},
"ruby_headers" => { "present" => File.directory?(RbConfig::CONFIG["rubyhdrdir"].to_s) },
"system_packages" => packages.sort
}
}
STDOUT.write(JSON.generate(output))
RUBY