Skip to content

Instantly share code, notes, and snippets.

@tkishel
Created October 9, 2020 19:12
Show Gist options
  • Save tkishel/77f3d215900aff1bb1a06561d5537681 to your computer and use it in GitHub Desktop.
Save tkishel/77f3d215900aff1bb1a06561d5537681 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'uri'
require 'net/http'
# require 'openssl'
#### METHODS
def get_package(package)
if (matched = package.match(%r{^(?<name>.+)-(?<version>[^-]+)-(?<release>[^-]+)\.(?<architecture>\w+)}))
result = {
name: matched[:name],
version: matched[:version],
release: matched[:release],
architecture: matched[:architecture]
}
else
result = {}
end
result
end
def get_packages(repo)
url = URI(repo)
http = Net::HTTP.new(url.host, url.port)
# http.use_ssl = true
# http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["accept"] = '*/*'
response = http.request(request)
if response.code == '200' then
packages = response.body
else
puts 'Error: HTTP Error'
packages = []
end
packages
end
def version(v)
Gem::Version.new(v)
end
def release(r)
r.split('.')[0]
end
#### ARGUMENTS
# For example:
# zlib-1.2.7-18.el7.i686
rhel_package_filename = ARGV[0]
unless rhel_package_filename
puts 'Error: Please specify a RHEL package, minus the extension'
exit
end
#### MAIN
rhel_package_hash = get_package(rhel_package_filename)
if rhel_package_filename.empty?
puts 'Error: Unable to parse RHEL package filename'
exit
end
package_cache = '/tmp/packages.html'
if File.exists?(package_cache)
packages_html = File.read(package_cache)
else
repo = 'http://mirror.centos.org/centos/7/os/x86_64/Packages/'
packages_html = get_packages(repo)
File.write("/tmp/packages.html", packages_html)
end
packages_array = packages_html.scan(%r{a href\=\"(\S+).rpm"})
packages_hash = {}
packages_array.each do |captures|
package_filename = captures[0] # a scan with a capture returns an array of arrays
package_hash = get_package(package_filename)
packages_hash["#{package_hash[:name]}"] = package_hash unless package_hash.empty?
end
centos_package_hash = packages_hash[rhel_package_hash[:name]]
puts "RHEL Package:"
puts rhel_package_hash
puts
puts "CentOS Package:"
puts centos_package_hash
puts
if version(centos_package_hash[:version]) < version(rhel_package_hash[:version])
puts "No CentOS Fix is Available"
end
if version(centos_package_hash[:version]) == version(rhel_package_hash[:version])
centos_release_number = release(centos_package_hash[:release])
rhel_release_number = release(rhel_package_hash[:release])
if version(centos_release_number) < version(rhel_release_number)
puts "No CentOS Fix is Available (Same Version, Older Release)"
else
puts "A CentOS Fix is Available (Same Version, Same or Newer Release)"
end
end
if version(centos_package_hash[:version]) > version(rhel_package_hash[:version])
# CentOS ahead of RHEL?
puts "A CentOS Fix is Available (Newer Version)"
end
@tkishel
Copy link
Author

tkishel commented Oct 9, 2020

Usage:

centos_fix_for_redhat_package.rb zlib-1.2.9-18.el7.i686

RHEL Package:
{:name=>"zlib", :version=>"1.2.9", :release=>"18.el7", :architecture=>"i686"}

CentOS Package:
{:name=>"zlib", :version=>"1.2.7", :release=>"18.el7", :architecture=>"x86_64"}

No CentOS Fix is Available
centos_fix_for_redhat_package.rb zlib-1.2.7-18.el7.i686

RHEL Package:
{:name=>"zlib", :version=>"1.2.7", :release=>"18.el7", :architecture=>"i686"}

CentOS Package:
{:name=>"zlib", :version=>"1.2.7", :release=>"18.el7", :architecture=>"x86_64"}

A CentOS Fix is Available (Same Version, Same or Newer Release)
centos_fix_for_redhat_package.rb zlib-1.2.7-19.el7.i686

RHEL Package:
{:name=>"zlib", :version=>"1.2.7", :release=>"19.el7", :architecture=>"i686"}

CentOS Package:
{:name=>"zlib", :version=>"1.2.7", :release=>"18.el7", :architecture=>"x86_64"}

No CentOS Fix is Available (Same Version, Older Release)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment