diff --git a/app.rb b/app.rb index 0035885..dfaeb30 100644 --- a/app.rb +++ b/app.rb @@ -1916,6 +1916,134 @@ get "/prjuplrpm/:id" do end +get "/prjcstmbld/: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 проекта #{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] + cust_bld = prj.get_project_custom_build(prj_info[:id], git_info[:id]) + if session[:errora_data].nil? + @old_filepath = cust_bld[:script_name] + else + @old_filepath = session[:old_filepath] + end + if session[:old_content].nil? + @old_content = cust_bld[:content] + else + @old_content = session[:old_content] + end + if session[:old_descr].nil? + @old_descr = cust_bld[:description] + else + @old_descr = session[:old_descr] + end + @error_data = session[:errora_data] + session[:errora_data] = nil + session[:old_filepath] = nil + session[:old_descr] = nil + session[:old_content] = nil + erb :prjcustombld + end + end + end +end + +post "/prjcstmbld/:id/:git_id" do + unless params["cancel"].nil? + session[:old_filepath] = nil + session[:old_descr] = nil + session[:old_content] = nil + redirect "/prjedit/#{params["id"]}" + else + session[:old_filepath] = params["filepath"] + session[:old_descr] = params["description"] + session[:old_content] = params["codedata"] + if params["filepath"].nil? || params["description"].nil? || params["filepath"].strip == "" || params["description"].strip == "" + session[:errora_data] = "Имя рецепта и описание не должны быть пустыми" + redirect "/prjcstmbld/#{params["id"]}/#{params["git_id"]}" + else + if params["filepath"] =~ /^[0-9a-zA-Z_\.]+$/ + # Valid filepath + # Proceed with further processing + codedata = params["codedata"].gsub(/\r$/, "") + 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 + unless params["save"].nil? + prj.set_project_custom_build(params["id"], params["git_id"], params["filepath"], params["description"], codedata) + redirect "/prjedit/#{params["id"]}" + end + end + end + end + else + # Invalid filepath + session[:errora_data] = "Недопустимые символы в имени файла" + redirect "/prjcstmbld/#{params["id"]}/#{params["git_id"]}" + end + end + + end + +end + +post "/prjcstmblddel/: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) + input_name = params["rcpnamedup"] + info = prj.get_project_custom_build(prj_info[:id], git_info[:id]) + if info.nil? + print_error_page(404, "Скрипта не существует") + else + puts input_name + puts info + if info[:script_name] == input_name + prj.del_project_custom_build(params["id"], params["git_id"]) + end + redirect "/prjedit/#{params["id"]}" + end + end + end + end + +end get "/sanitize" do #Подчистим гит проекты, которые есть в базе, но нет в файловой системе diff --git a/classes/db.rb b/classes/db.rb index bf15bc8..844eec7 100644 --- a/classes/db.rb +++ b/classes/db.rb @@ -42,6 +42,9 @@ end class RpmUploaded < Sequel::Model(:rpm_uploaded) end +class CustomBuildScript < Sequel::Model(:custom_build_script) +end + class DBase attr :error, :last_id, :cfg @@ -79,6 +82,7 @@ class DBase rep_id = Repos.where(reponame: repo_name).first unless rep_id[:id].nil? id = rep_id[:id] + CustomBuildScript.where(repo_id: id).delete RepocRecips.where(repo_id: id).delete ReposProjects.where(repo_id: id).delete Repos.where(reponame: repo_name).delete @@ -369,6 +373,7 @@ class DBase count = count + 1 end return 1 if count > 0 + CustomBuildScript.where(proj_id: proj_id.to_i).delete RpmUploaded.where(proj_id: prj_id.to_i).delete ReposProjects.where(proj_id: prj_id.to_i).delete ProjectsReposSpec.where(proj_id: prj_id.to_i).delete @@ -431,4 +436,22 @@ class DBase def get_project_uploaded_rpms(proj_id) RpmUploaded.where(proj_id: proj_id.to_i) end + + def get_project_custom_build(proj_id, git_id) + CustomBuildScript.where(proj_id: proj_id.to_i, repo_id: git_id.to_i) + end + + def set_project_custom_build(id, repo_id, script_name, descr, content) + result = get_project_custom_build(id, repo_id).first + unless result.nil? + CustomBuildScript.where(id: result[:id]).update(:content => content, :filepath => script_name, :descr => descr) + else + id = CustomBuildScript.insert(:content => content, :filepath => script_name, :descr => descr, :proj_id => id.to_i, :repo_id => repo_id.to_i) + @last_id = id + end + end + + def del_project_custom_build(id, repo_id) + CustomBuildScript.where(proj_id: id.to_i, repo_id: repo_id.to_i).delete + end end diff --git a/classes/projects.rb b/classes/projects.rb index c506ab2..6175225 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -585,4 +585,24 @@ class ProjectsActions end list end + + def get_project_custom_build(id, repo_id) + data = {:script_name => nil, :content => nil, :description => nil, :created => nil } + result = @db.get_project_custom_build(id, repo_id).first + unless result.nil? + data[:script_name]=result[:filepath] + data[:content]=result[:content] + data[:description]=result[:descr] + data[:created]=result[:create_at] + end + data + end + + def set_project_custom_build(id, repo_id, script_name, descr, content) + @db.set_project_custom_build(id, repo_id, script_name, descr, content) + end + + def del_project_custom_build(id, repo_id) + @db.del_project_custom_build(id, repo_id) + end end diff --git a/db/migrations/202604180000000_create_custom_build.rb b/db/migrations/202604180000000_create_custom_build.rb new file mode 100644 index 0000000..cf1d2ed --- /dev/null +++ b/db/migrations/202604180000000_create_custom_build.rb @@ -0,0 +1,17 @@ +require "sequel" + +Sequel.migration do + change do + + create_table(:custom_build_script) do + primary_key :id + String :content, text: true + String :filepath, text: true + String :descr, text: true + Datetime :create_at, default: Sequel.lit("CURRENT_TIMESTAMP") + foreign_key :proj_id, :projects, :key => :id + foreign_key :repo_id, :repos, :key => :id + end + + end +end \ No newline at end of file diff --git a/install/docker_install.yml b/install/docker_install.yml new file mode 100644 index 0000000..8a39bda --- /dev/null +++ b/install/docker_install.yml @@ -0,0 +1,47 @@ +--- +- name: Install Docker on AlmaLinux + hosts: localhost + connection: local + become: True + become_user: root + become_method: su + tasks: + - name: Remove old Docker packages + dnf: + name: + - docker + - docker-client + - docker-client-latest + - docker-common + - docker-latest + - docker-latest-logrotate + - docker-logrotate + - docker-engine + - podman + - runc + state: absent + + - name: Add Docker repository + command: sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + + - name: Install Docker components + dnf: + name: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + state: present + + - name: Start and enable Docker service + systemd: + name: docker + state: started + enabled: yes + + - name: Add user mockgui to the docker group + user: + name: mockgui + groups: docker + append: yes \ No newline at end of file diff --git a/views/prjcustombld.erb b/views/prjcustombld.erb new file mode 100644 index 0000000..b448959 --- /dev/null +++ b/views/prjcustombld.erb @@ -0,0 +1,124 @@ +<%= erb :header %> + + + <% unless @error_data.nil? %> +
+ +
+ <% end %> +
+
+
+

+ <%= @proj_name %> +

+
<%= @proj_descr %>
+
git репозиторий <%= @git_name %>
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + <% unless @old_filepath.nil? %> + + <% end %> +
+
+
+
+
+
+ + +<%= erb :footer %> \ No newline at end of file diff --git a/views/prjinfo.erb b/views/prjinfo.erb index ae82a66..d7fec1d 100644 --- a/views/prjinfo.erb +++ b/views/prjinfo.erb @@ -92,9 +92,9 @@ <% @proj_repo.each do |item| %>
<% unless item[:is_repo_synced] %> -
+
<% else %> -
+ @@ -115,6 +115,9 @@
+
+ +
<% end %>