lib/linux_admin/yum.rb in linux_admin-0.0.1 vs lib/linux_admin/yum.rb in linux_admin-0.1.0

- old
+ new

@@ -1,16 +1,93 @@ -module LinuxAdmin - module Yum - def self.updates_available? - exitstatus = Common.run("yum check-update", :return_exitstatus => true) +require 'fileutils' +require 'inifile' + +class LinuxAdmin + class Yum < LinuxAdmin + def self.create_repo(path, options = {}) + raise ArgumentError, "path is required" unless path + options = options.reverse_merge(:database => true, :unique_file_names => true) + + FileUtils.mkdir_p(path) + + cmd = "yum createrepo" + params = {nil => path} + params["--database"] = nil if options[:database] + params["--unique-md-filenames"] = nil if options[:unique_file_names] + + run(cmd, :params => params) + end + + def self.download_packages(path, packages, options = {}) + raise ArgumentError, "path is required" unless path + raise ArgumentError, "packages are required" unless packages + options = options.reverse_merge(:mirror_type => :package) + + FileUtils.mkdir_p(path) + + cmd = case options[:mirror_type] + when :package; "yum repotrack" + else; raise ArgumentError, "mirror_type unsupported" + end + params = {"-p" => path} + params["-a"] = options[:arch] if options[:arch] + params[nil] = packages + + run(cmd, :params => params) + end + + def self.repo_settings + self.parse_repo_dir("/etc/yum.repos.d") + end + + def self.updates_available?(*packages) + cmd = "yum check-update" + params = {nil => packages} unless packages.blank? + + exitstatus = run(cmd, :params => params, :return_exitstatus => true) case exitstatus when 0; false when 100; true else raise "Error: Exit Code #{exitstatus}" end end - def self.update - Common.run("yum -y update") + def self.update(*packages) + cmd = "yum -y update" + params = {nil => packages} unless packages.blank? + + run(cmd, :params => params) + end + + def self.version_available(*packages) + raise ArgumentError, "packages requires at least one package name" unless packages + + cmd = "repoquery --qf=\"%{name} %{version}\"" + params = {nil => packages} + + out = run(cmd, :params => params, :return_output => true) + + items = out.split("\n") + items.each_with_object({}) do |i, versions| + name, version = i.split(" ", 2) + versions[name.strip] = version.strip + end + end + + private + + def self.parse_repo_dir(dir) + repo_files = Dir.glob(File.join(dir, '*.repo')) + repo_files.each_with_object({}) do |file, content| + content[file] = self.parse_repo_file(file) + end + end + + def self.parse_repo_file(file) + int_keys = ["enabled", "cost", "gpgcheck", "sslverify", "metadata_expire"] + content = IniFile.load(file).to_h + content.each do |name, data| + int_keys.each { |k| data[k] = data[k].to_i if data.has_key?(k) } + end end end end \ No newline at end of file