You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.4 KiB
136 lines
3.4 KiB
$LOAD_PATH.unshift File.expand_path(".", "locallibs/ruby-rpm-ffi/lib")
|
|
|
|
require "rpm"
|
|
|
|
require_relative "runner"
|
|
require "ptools"
|
|
require "fileutils"
|
|
require "erb"
|
|
|
|
class RPMReader
|
|
def get_rpm_info(path_to_rpm)
|
|
res = { :error => nil }
|
|
if File.exist?(path_to_rpm)
|
|
pkg = RPM::Package.open(path_to_rpm)
|
|
res[:pkginfo] = pkg
|
|
else
|
|
res[:error] = "#{path_to_rpm} не существует"
|
|
end
|
|
res
|
|
end
|
|
end
|
|
|
|
class RepoManagerKeys
|
|
attr :path, :error
|
|
|
|
def initialize(path)
|
|
@error = nil
|
|
@path = path
|
|
end
|
|
|
|
def check_key_exists()
|
|
key_file = File.join(@path, "public", "mockgui-gpg-key")
|
|
File.exist?(key_file)
|
|
end
|
|
|
|
def check_password_exists()
|
|
passwd = nil
|
|
passwd_file = File.join(@path, "save")
|
|
if File.exist?(passwd_file)
|
|
unless File.binary?(passwd_file)
|
|
passwd = File.readlines(passwd_file).first.strip
|
|
end
|
|
end
|
|
passwd
|
|
end
|
|
|
|
def get_publick_key()
|
|
File.join(@path, "public", "mockgui-gpg-key")
|
|
end
|
|
|
|
def sign_package(rpm_path, password)
|
|
cmd_args = %Q(/usr/bin/rpm --define "_gpg_sign_cmd_extra_args --pinentry-mode loopback --passphrase #{password}" --addsign "#{rpm_path}" 2>/dev/null)
|
|
cmd = Runner.new(cmd_args)
|
|
cmd.run
|
|
cmd.exit_status
|
|
end
|
|
end
|
|
|
|
class RepoManager
|
|
attr :path, :error, :last_status, :last_pid
|
|
|
|
def initialize(path)
|
|
@error = nil
|
|
unless File.exist? (path)
|
|
Dir.mkdir(path)
|
|
end
|
|
@path = path
|
|
@reader = RPMReader.new
|
|
end
|
|
|
|
def create_repo
|
|
repo_path = File.join(@path, "repodata")
|
|
cmd_args = %Q(/usr/bin/createrepo_c --database --workers 1 "#{@path}")
|
|
if File.exist?(repo_path)
|
|
cmd_args = %Q(/usr/bin/createrepo_c --database --workers 1 --update "#{@path}")
|
|
end
|
|
cmd = Runner.new(cmd_args)
|
|
cmd.run
|
|
@last_status = cmd.exit_status
|
|
@last_pid = cmd.pid
|
|
end
|
|
|
|
def get_rpm_info(path_to_rpm)
|
|
@reader.get_rpm_info(path_to_rpm)
|
|
end
|
|
|
|
def repoview(url, repo_name, template_dir)
|
|
rpm_list = get_rpms_list(@path)
|
|
result = {}
|
|
rpm_list.each do |item|
|
|
full_rpm_path = File.join(@path, item)
|
|
info = @reader.get_rpm_info(full_rpm_path)
|
|
dirName = File.dirname(item)
|
|
fileName = File.basename(item)
|
|
if result[dirName].nil?
|
|
result[dirName] = []
|
|
end
|
|
pkg_info = {}
|
|
pkg_info[:fname] = fileName
|
|
pkg_info[:stat] = File.stat(full_rpm_path).ctime
|
|
if info[:error].nil?
|
|
pkg_info[:chlog] = info[:pkginfo].changelog.first(5)
|
|
else
|
|
pkg_info[:chlog] = []
|
|
end
|
|
result[dirName] << pkg_info
|
|
end
|
|
repo_name = repo_name
|
|
repo_url = url
|
|
pkg_num = rpm_list.length
|
|
repo_data = []
|
|
data_keys = []
|
|
result.each_pair do |key, value|
|
|
result[key.to_s].sort_by! { |item| item[:fname] }
|
|
data_keys << key.to_s
|
|
end
|
|
data_keys.sort!
|
|
data_keys.each do |item|
|
|
repo_data << result[item]
|
|
end
|
|
tpl_file = File.join(template_dir, "template.erb")
|
|
template = File.read(tpl_file)
|
|
renderer = ERB.new(template)
|
|
result_html = renderer.result(binding)
|
|
|
|
boots_trap_css = File.join(template_dir, "bootstrap.min.css")
|
|
boots_trap_js = File.join(template_dir, "bootstrap.bundle.min.js")
|
|
index_html = File.join(@path, "index.html")
|
|
File.open(index_html, "w") do |f|
|
|
f.write(result_html)
|
|
end
|
|
FileUtils.cp_r(boots_trap_css, @path, verbose: false, remove_destination: true)
|
|
FileUtils.cp_r(boots_trap_js, @path, verbose: false, remove_destination: true)
|
|
end
|
|
end
|