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.

795 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# coding: utf-8
hestiacp_ruby_gem_version = "3.3.0"
Gem.paths = {
"GEM_HOME" => "#{__dir__}/vendor/bundle/ruby/#{hestiacp_ruby_gem_version}",
"GEM_PATH" => "#{__dir__}/vendor/bundle/ruby/#{hestiacp_ruby_gem_version}",
}
require "rubygems"
require "sinatra"
require "puma"
require_relative "classes/config"
require_relative "classes/gitinfo"
require_relative "classes/db"
require_relative "classes/systeminfo"
require_relative "classes/utilities"
require_relative "classes/projects"
require_relative "classes/configs"
def print_error_page(error_status, error_meaasge)
@page_name = "Ошибка выполнения"
@status_err = error_status
@error_msg = error_meaasge
halt erb(:page5xx)
end
cfg = IniConfig.new()
db = DBase.new()
set :port, cfg.get_port
set :public_folder, File.dirname(__FILE__) + "/public"
use Rack::Session::Pool, :expire_after => 2592000
get "/" do
@page_name = "Система сборки rpm пакетов"
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo_data = repo.getrepos
@repos_number = repo_data.length
@rcp_number = db.get_recips.length
@prj_number = prj.get_projects.length
erb :index
end
end
end
get "/repos/:reponame/:branch" do
@page_name = params["reponame"]
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
tmp_result = repo.repo_info(params["reponame"], params["branch"])
if tmp_result[:error].nil?
@repo_data = tmp_result
@ip_addr = systeminfo_get_ip
@user_name = systeminfo_get_username
@path_to_repo = File.join(repo.path, params["reponame"] + ".git")
erb :gitinfo
else
print_error_page(503, tmp_result[:error])
end
end
end
get "/repos/:reponame" do
@page_name = params["reponame"]
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
tmp_result = repo.repo_info(params["reponame"])
if tmp_result[:error].nil?
@repo_data = tmp_result
@ip_addr = systeminfo_get_ip
@user_name = systeminfo_get_username
@path_to_repo = File.join(repo.path, params["reponame"] + ".git")
erb :gitinfo
else
print_error_page(503, tmp_result[:error])
end
end
end
post "/gitdelete/:reponame" do
input_name = params["reponamedup"]
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
if params["reponame"] == input_name
repo.delete_repo(input_name)
end
redirect "/repos"
end
end
get "/gitdelete" do
redirect "/repos"
end
get "/repos" do
@page_name = "Список доступных git репозиториев"
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
@repo_data = repo.getrepos
erb :gits
end
end
get "/gitcreate" do
@page_name = "Создать новый пустой git репозиторий"
@error_data = session[:gitcreate_error]
session[:gitcreate_error] = nil
erb :newgit
end
post "/gitcreate" do
if request.form_data?
if params["gitname"].nil?
session[:gitcreate_error] = "Не задано имя репозитория"
else
filename = sanitize_filename(params["gitname"])
if filename != ""
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
if repo.create_git(filename, params["gitdescr"]) != 0
session[:gitcreate_error] = repo.error
else
redirect "/repos"
return
end
end
else
session[:gitcreate_error] = "Название репозитория должно содержать только символы a-z, A-Z. 0-9 и _"
end
end
end
redirect "/gitcreate"
end
get "/recips" do
@page_name = "Список доступных сценариев сборки"
@rcp_data = db.get_recips
erb :receips
end
get "/recips/:rcp_id" do
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
@repo_data = repo.getrepos
@rcp_id = params["rcp_id"]
info = db.get_rcp_info_by_id(@rcp_id)
@page_name = info[:filepath]
@rcp_name = info[:filepath]
if session[:rcp_old_description].nil?
@old_filepath = info[:filepath]
else
@old_filepath = session[:rcp_old_filepath]
end
if session[:rcp_old_description].nil?
@old_description = info[:descr]
else
@old_description = session[:rcp_old_description]
end
if session[:rcp_old_codedata].nil?
@old_codedata = info[:content]
else
@old_codedata = session[:rcp_old_codedata]
end
if session[:rcp_old_gitlst].nil?
@old_gitlst = info[:repos_list]
else
@old_gitlst = session[:rcp_old_gitlst]
end
@error_data = session[:rcpcreate_error]
session[:rcpcreate_error] = nil
session[:rcp_old_filepath] = nil
session[:rcp_old_description] = nil
session[:rcp_old_codedata] = nil
session[:rcp_old_gitlst] = nil
erb :rcpedit
end
end
post "/recips/:rcp_id" do
rcp_id = params["rcp_id"]
session[:rcp_old_filepath] = params["filepath"]
session[:rcp_old_description] = params["description"]
session[:rcp_old_codedata] = params["codedata"]
session[:rcp_old_gitlst] = params["gitlst"]
if params["filepath"].nil? || params["description"].nil? || params["filepath"].strip == "" || params["description"].strip == ""
session[:rcpcreate_error] = "Имя рецепта и описание не должны быть пустыми"
redirect url("/recips/#{rcp_id}")
else
@error_data = db.updaterecip(rcp_id, params["filepath"], params["description"], params["codedata"], params["gitlst"])
unless @error_data.nil?
session[:rcpcreate_error] = @error_data
redirect url("/recips/#{rcp_id}")
else
session[:rcp_old_filepath] = nil
session[:rcp_old_description] = nil
session[:rcp_old_codedata] = nil
session[:rcp_old_gitlst] = nil
redirect "/recips"
end
end
end
post "/rcpdelete/:rcp_id" do
input_name = params["rcpnamedup"]
rcp_id = params["rcp_id"]
info = db.get_rcp_info_by_id(rcp_id)
if info.nil?
print_error_page(404, "Рецепта не существует")
else
if info[:filepath] == input_name
db.delete_rcp(rcp_id)
end
redirect "/recips"
end
end
post "/rcpdelete" do
redirect "/recips"
end
get "/rcpcreate" do
@page_name = "Создать новый рецепт"
@old_filepath = session[:rcp_old_filepath]
@old_description = session[:rcp_old_description]
@old_codedata = session[:rcp_old_codedata]
@old_gitlst = session[:rcp_old_gitlst]
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
@repo_data = repo.getrepos
@error_data = session[:rcpcreate_error]
session[:rcpcreate_error] = nil
erb :rcpcrt
end
end
post "/rcpcreate" do
session[:rcp_old_filepath] = params["filepath"]
session[:rcp_old_description] = params["description"]
session[:rcp_old_codedata] = params["codedata"]
session[:rcp_old_gitlst] = params["gitlst"]
if params["filepath"].nil? || params["description"].nil? || params["filepath"].strip == "" || params["description"].strip == ""
session[:rcpcreate_error] = "Имя рецепта и описание не должны быть пустыми"
redirect "/rcpcreate"
else
@error_data = db.createrecip(params["filepath"], params["description"], params["codedata"], params["gitlst"])
unless @error_data.nil?
session[:rcpcreate_error] = @error_data
redirect "/rcpcreate"
else
session[:rcp_old_filepath] = nil
session[:rcp_old_description] = nil
session[:rcp_old_codedata] = nil
session[:rcp_old_gitlst] = nil
redirect "/recips"
end
end
end
get "/bldcfg" do
@page_name = "Список конфигураций сборки"
cfgs = ConfigsList.new(cfg)
result = cfgs.get_configs
@list_global = result[:global]
@list_local = result[:local]
@list_selected = result[:selected]
erb :cfgslist
end
get "/bldcfginfo" do
@filename = params["info"]
if @filename.nil?
print_error_page(503, "Не задано имя конфигурационного файла")
else
unless check_safe_path(@filename)
print_error_page(503, "Доступ к файлу #{@filename} запрещен")
else
unless File.exist?(@filename)
print_error_page(503, "Файл #{@filename} не существует")
else
@page_name = @filename
@content = File.readlines(@filename)
erb :cfgsinfo
end
end
end
end
get "/projs" do
@page_name = "Список проектов"
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
@prj_list = prj.get_projects
erb :prjlist
end
end
get "/prjcreate" do
@page_name = "Создать новый проект"
@old_name = session[:prj_old_name]
@old_description = session[:prj_old_description]
@old_list = session[:prj_old_list]
cfgs = ConfigsList.new(cfg)
result = cfgs.get_configs
@global_list = result[:global]
@local_list = result[:local]
@error_data = session[:prjcreate_error]
session[:prjcreate_error] = nil
erb :prjcrt
end
post "/prjcreate" do
session[:prj_old_name] = params["projname"]
session[:prj_old_description] = params["description"]
session[:prj_old_list] = params["conflist"]
if params["projname"].nil? || params["description"].nil? || params["projname"].strip == "" || params["description"].strip == "" || params["conflist"].nil? || params["conflist"].strip == ""
session[:rcpcreate_error] = "Имя проекта, описание и окружение сборки не должны быть пустыми"
redirect "/prjcreate"
else
prj = ProjectsActions.new(cfg.get_projects_path, db)
result = prj.create_project(params["projname"], params["description"], params["conflist"])
if result != 0
session[:prjcreate_error] = prj.error
redirect "/prjcreate"
else
session[:prj_old_name] = nil
session[:prj_old_description] = nil
session[:prj_old_list] = nil
redirect "/projs"
end
end
end
get "/prjedit/:id" do
unless session[:prj_modal_text].nil?
@modal_info = session[:prj_modal_info]
@modal_text = session[:prj_modal_text]
session[:prj_modal_info] = nil
session[:prj_modal_text] = nil
end
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
@page_name = prj_info[:projname]
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
@proj_id = prj_info[:id]
repo_lst = repo.getrepos
proj_repo_list = prj.get_project_gits(prj_info[:id], repo)
@repo_list = repo_lst.reject do |item|
fnd = false
proj_repo_list.each do |item2|
if item2[:id] == item[:id]
fnd = true
break
end
end
fnd
end
@proj_repo = proj_repo_list
erb :prjinfo
end
end
end
end
post "/prjagit/:id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
proj_repo_list = prj.get_project_gits(prj_info[:id], repo)
git_info = repo.get_repo_short_info_by_id(params["gitlist"].to_i)
if git_info.nil?
print_error_page(503, "Репозиторий исчез")
else
fnd = false
proj_repo_list.each do |item|
if item[:id] == git_info[:id]
fnd = true
break
end
end
if fnd
session[:prj_modal_info] = "Ошибка"
session[:prj_modal_text] = "Данный git-репозиторий уже добавлен к проекту"
else
err = prj.add_git_to_project(prj_info[:id], git_info[:id], repo, git_info[:reponame])
if err.nil?
session[:prj_modal_info] = nil
session[:prj_modal_text] = nil
else
session[:prj_modal_info] = "Ошибка добавления git проекта"
session[:prj_modal_text] = err
end
end
end
end
end
end
redirect back
end
get "/prjrgit/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
proj_repo_list = prj.get_project_gits(prj_info[:id], repo)
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
if git_info.nil?
print_error_page(503, "Репозиторий исчез")
else
err = prj.renew_git_to_project(prj_info[:id], git_info[:id], repo, git_info[:reponame])
if err.nil?
session[:prj_modal_info] = nil
session[:prj_modal_text] = nil
else
session[:prj_modal_info] = "Ошибка обновления git проекта"
session[:prj_modal_text] = err
end
end
end
end
end
redirect back
end
get "/prjgitf/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
proj_repo_list = prj.get_project_gits(prj_info[:id], repo)
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
if git_info.nil?
print_error_page(503, "Репозиторий исчез")
else
if params["p"].nil?
filepath = ""
else
filepath = params["p"]
end
proj_path = prj.get_project_path_git(prj_info[:id], git_info[:reponame])
f_path = File.join(proj_path, filepath)
if File.exist?(f_path)
if File.directory?(f_path)
@file_content = []
@files_list = Dir[File.join(f_path, "*")].map do |item|
if File.directory?(item)
{ :file => item.delete_prefix(proj_path + "/"), :isdir => true }
else
{ :file => item.delete_prefix(proj_path + "/"), :isdir => false }
end
end
else
@file_content = File.readlines(f_path)
@files_list = Dir[File.join(File.dirname(f_path), "*")].map do |item|
if File.directory?(item)
{ :file => item.delete_prefix(proj_path + "/"), :isdir => true }
else
{ :file => item.delete_prefix(proj_path + "/"), :isdir => false }
end
end
end
if filepath != ""
if File.dirname(f_path) == proj_path
fn = ""
else
if File.directory?(f_path)
fn = File.dirname(f_path).delete_prefix(proj_path + "/")
else
f_path = File.dirname(f_path)
if File.dirname(f_path) == proj_path
fn = ""
else
fn = File.dirname(f_path).delete_prefix(proj_path + "/")
end
end
end
@files_list = [{ :file => "..", :isdir => true, :fname => fn }] + @files_list
end
@page_name = "#{prj_info[:projname]} информация из репозитория #{git_info[:reponame]}"
@proj_info = prj_info
@proj_git_name = git_info
@file_name = filepath
erb :fileinfo
else
print_error_page(503, "Файл не существует")
end
end
end
end
end
end
get "/prjcfg/:id" do
unless session[:prjcfg_modal_text].nil?
@modal_info = session[:prjcfg_modal_info]
@modal_text = session[:prjcfg_modal_text]
session[:prjcfg_modal_info] = nil
session[:prjcfg_modal_text] = nil
end
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
@page_name = "#{prj_info[:projname]} редактирование конфигурации сборки"
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
project_cfg = prj.get_project_config(params["id"])
@project_cfg_tmpl = File.basename(project_cfg)
@file_content = File.readlines(project_cfg).join("")
@proj_id = prj_info[:id]
erb :prjcfged
end
end
end
post "/prjcfg/:id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
pp params
unless params["cancel"].nil?
redirect "/prjedit/#{params["id"]}"
else
if params["cfginfo"].nil? || params["cfginfo"].strip == ""
session[:prjcfg_modal_info] = "Ошибка сохранения файла"
session[:prjcfg_modal_text] = "Содержимое файла не может быть пустым"
redirect "/prjcfg/#{params["id"]}"
else
project_cfg = prj.get_project_config(params["id"])
File.open(project_cfg, "w") { |f| f.write(params["cfginfo"]) }
redirect "/prjcfg/#{params["id"]}"
end
end
end
end
end
get "/gitspec/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
spec_f = db.get_project_repo_spec(params["id"], params["git_id"])
if spec_f.nil?
@spec_file = ""
else
@spec_file = spec_f[:spec_name]
end
@page_name = "#{prj_info[:projname]} редактирование spec для git проекта #{git_info[:reponame]}"
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
@git_name = git_info[:reponame]
@proj_id = prj_info[:id]
@git_id = git_info[:id]
git_path = prj.get_project_path_git(prj_info[:id], git_info[:reponame])
@files_list = get_spec_files_in_dir(git_path)
current_spec_data = db.get_project_repo_spec(prj_info[:id], git_info[:id])
@current_spec = nil
unless current_spec_data.nil?
@current_spec = current_spec_data[:spec_name]
end
erb :prjspec
end
end
end
end
post "/gitspec/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
unless params["cancel"].nil?
redirect "/prjedit/#{params["id"]}"
else
unless params["save"].nil?
save_spec = ""
if params["useCustom"].nil?
save_spec = params["filelst"].strip
else
save_spec = params["speccustom"].strip
end
if save_spec != ""
db.save_project_repo_spec(prj_info[:id], git_info[:id], save_spec)
end
redirect "/prjedit/#{params["id"]}"
else
db.delete_project_repo_spec(prj_info[:id], git_info[:id])
redirect "/prjedit/#{params["id"]}"
end
end
end
end
end
end
get "/prjaddrepo/:id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
@page_name = "#{prj_info[:projname]} - добавить связанные проекты"
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
@proj_id = prj_info[:id]
@projects_list = prj.get_related_projects_list(params["id"])
@all_projects = prj.get_projects
erb :prjprj
end
end
end
post "/prjaddrepo/:id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
unless params["cancel"].nil?
redirect "/prjedit/#{params["id"]}"
else
if params["disableLinks"].nil?
list_id = params["prjlst"]
current_list = prj.get_related_projects_list(params["id"])
current_list_id = current_list.map { |item| item[:proj_id_repository] }
new_ids = list_id - current_list_id
removed_ids = current_list_id - list_id
prj.save_linked_projects(params["id"], new_ids, removed_ids)
prj.regenerate_linked_repos(params["id"])
redirect "/prjedit/#{params["id"]}"
else
prj.delete_linked_projects(params["id"])
prj.regenerate_linked_repos(params["id"])
redirect "/prjedit/#{params["id"]}"
end
end
end
end
end
get "/gitbld/:id/:git_id" do
prj = ProjectsActions.new(cfg.get_projects_path, db)
if prj.path.nil?
print_error_page(503, "Путь к проектам не существует")
else
repo = GitRepo.new(cfg.get_repo, db)
if repo.path.nil?
print_error_page(503, "Путь к репозиториям не существует")
else
prj_info = prj.get_project(params["id"])
if prj_info.nil?
print_error_page(503, "Путь к проектам не существует")
else
git_info = repo.get_repo_short_info_by_id(params["git_id"].to_i)
@page_name = "#{prj_info[:projname]} - сборка #{git_info[:reponame]}"
@proj_name = prj_info[:projname]
@proj_descr = prj_info[:descr]
@git_name = git_info[:reponame]
@build_id = prj.build_projects_git(prj_info[:id], git_info[:id], cfg.get_counter_path)
if @build_id == 0
print_error_page(503, "Ошибка создания или получения информации о сборке, возможно проблемы с файлом блокировки")
else
erb :prjbld
end
end
end
end
end
get "/buildinfo/:build_id" do
content_type "text/plain"
build_id = params["build_id"].to_i
if build_id > 0
info = db.get_build_task_process_log(build_id)
unless info.nil?
if File.exist?(info[:errlogpath])
output = ""
File.readlines(info[:errlogpath]).last(100).each do |line|
output << line
end
output
else
"Файла для чтения сборки уже не существует #{info[:errlogpath]}"
end
else
"Такого build id #{params["build_id"]} нет в базе"
end
else
"Ошибка чтения build id #{params["build_id"]}"
end
end
not_found do
status 404
@page_name = "Кто-то потерялся"
@req_referer = request.referer
erb :page404
end