From a3888d10b4d8fe117a7c8b5dec1955c2f465dbe4 Mon Sep 17 00:00:00 2001 From: Alexey Berezhok Date: Sun, 3 May 2026 16:32:53 +0300 Subject: [PATCH] Fixes 3 --- bin/v-add-web-domain | 5 +- bin/v-add-web-domain-alias | 6 ++ bin/v-bunkerweb-module | 36 ++++++++++ bin/v-delete-web-domain-alias | 6 ++ func_ruby/HestiaBunkerWebApi.rb | 65 +++++++++++++++++++ func_ruby/ext-modules/bunkerweb_module.mod | 16 +++++ func_ruby/ext-modules/update_module.mod | 5 +- web/extm/bunkerweb_module/edit/index.php | 6 +- web/extm/update_module/edit/index.php | 64 ++++++++++++++++++ .../extmodules/extmodules_update_module.php | 63 ++++++++++++++++++ 10 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 web/extm/update_module/edit/index.php create mode 100644 web/templates/pages/extmodules/extmodules_update_module.php diff --git a/bin/v-add-web-domain b/bin/v-add-web-domain index 5392aac..b85197e 100755 --- a/bin/v-add-web-domain +++ b/bin/v-add-web-domain @@ -9,7 +9,7 @@ # www.domain.tld type will be automatically assigned to the domain unless # "none" is transmited as argument. If ip have associated dns name, this # domain will also get the alias domain-tpl.$ipname. An alias with the ip -# name is useful during the site testing while dns isn't moved to server yet. +# name is useful during the site testing while dns isn't moved to server yaliet. #----------------------------------------------------------# # Variables & Functions # @@ -255,6 +255,9 @@ check_result $? "Proxy restart failed" > /dev/null module_state=$($BIN/v-ext-modules state bunkerweb_module json | jq -r '.[0].STATE') if [ "$module_state" = "enabled" ]; then $BIN/v-ext-modules-run bunkerweb_module add "$domain" + if [ -n "%$ALIAS" ]; then + $BIN/v-ext-modules-run bunkerweb_module alias "$domain" "$ALIAS" + fi fi # Logging diff --git a/bin/v-add-web-domain-alias b/bin/v-add-web-domain-alias index b32a7fc..7e11884 100755 --- a/bin/v-add-web-domain-alias +++ b/bin/v-add-web-domain-alias @@ -108,6 +108,12 @@ check_result $? "Web restart failed" > /dev/null $BIN/v-restart-proxy "$restart" check_result $? "Proxy restart failed" > /dev/null +# Execute bunkerweb_module if it's enabled +module_state=$($BIN/v-ext-modules state bunkerweb_module json | jq -r '.[0].STATE') +if [ "$module_state" = "enabled" ]; then + $BIN/v-ext-modules-run bunkerweb_module alias "$domain" "$ALIAS" +fi + $BIN/v-log-action "$user" "Info" "Web" "Added new web domain alias (Alias: $aliases, Domain: $domain)." log_event "$OK" "$ARGUMENTS" diff --git a/bin/v-bunkerweb-module b/bin/v-bunkerweb-module index 4e55eb2..fef00bd 100755 --- a/bin/v-bunkerweb-module +++ b/bin/v-bunkerweb-module @@ -94,6 +94,42 @@ when :add exit 1 end end +when :alias + + v_domain = ARGV[1].strip + v_alias = ARGV[2].strip + v_format = ARGV[3] unless ARGV[3].nil? + + if v_domain.nil? || v_domain == "" + hestia_print_error_message_to_cli "domain should not be empty" + log_event E_ARGS, $ARGUMENTS + exit 1 + else + + begin + api = HestiaBunkerWebApi.new("http://127.0.0.1:8888") + existing_services = api.list_services() + if existing_services.nil? + result_arr = [] + else + if existing_services["services"] + if existing_services["services"].any? { |s| s["id"] == v_domain } + hestia_print_error_message_to_cli "domain already exists" + log_event E_EXISTS, $ARGUMENTS + exit 1 + end + result_arr = existing_services["services"] + else + result_arr = [] + end + end + api.set_alias(v_domain, v_alias) + rescue BunkerWebApiError => e + hestia_print_error_message_to_cli "[ERROR] Ошибка API: #{e.message}" + log_event E_INVALID, $ARGUMENTS + exit 1 + end + end when :delete v_domain = ARGV[1].strip diff --git a/bin/v-delete-web-domain-alias b/bin/v-delete-web-domain-alias index d9766fb..52b52c1 100755 --- a/bin/v-delete-web-domain-alias +++ b/bin/v-delete-web-domain-alias @@ -92,6 +92,12 @@ check_result $? "Web restart failed" > /dev/null $BIN/v-restart-proxy "$restart" check_result $? "Proxy restart failed" > /dev/null +# Execute bunkerweb_module if it's enabled +module_state=$($BIN/v-ext-modules state bunkerweb_module json | jq -r '.[0].STATE') +if [ "$module_state" = "enabled" ]; then + $BIN/v-ext-modules-run bunkerweb_module alias "$domain" "$ALIAS" +fi + # Logging $BIN/v-log-action "$user" "Info" "Web" "Deleted web domain alias (Alias: $dom_alias, Domain: $domain)." log_event "$OK" "$ARGUMENTS" diff --git a/func_ruby/HestiaBunkerWebApi.rb b/func_ruby/HestiaBunkerWebApi.rb index 96640bb..03766b1 100644 --- a/func_ruby/HestiaBunkerWebApi.rb +++ b/func_ruby/HestiaBunkerWebApi.rb @@ -301,6 +301,71 @@ class HestiaBunkerWebApi return response[:body] || {} end + + def set_alias(service_name, list_aliases) + @extra_info = "" + + # First get current service configuration to preserve existing settings + get_service_response = api_call("GET", "/services/#{service_name}", {}) + + if get_service_response[:status] != 200 + raise BunkerWebApiError.new("Service '#{service_name}' not found") + end + + # Extract current variables from the service configuration + current_vars = get_service_response[:body]["variables"] || {} + + # Clean the list_aliases string according to the rules + cleaned_aliases = list_aliases.to_s + + # Replace commas (with or without space) with a single space + cleaned_aliases.gsub!(/,\s?/, ' ') + + # Replace multiple spaces with a single space + cleaned_aliases.gsub!(/\s{2,}/, ' ') + + # Strip leading/trailing whitespace + cleaned_aliases.strip! + + # Ensure the main service name appears first in the alias list + aliases_array = cleaned_aliases.split(' ') + unless aliases_array.include?(service_name) + # If service_name not present, add it at the front + aliases_array.unshift(service_name) + else + # If present but not first, reorder to make it first + aliases_array.delete(service_name) + aliases_array.unshift(service_name) + end + # Rebuild cleaned string + cleaned_aliases = aliases_array.join(' ') + + # Update alias settings + updated_vars = { + "SERVER_NAME" => cleaned_aliases + } + + # Merge with existing variables (keep non-SSL settings) + final_vars = current_vars.merge(updated_vars) + + service_body = { + server_name: nil, # Not changing name + is_draft: false, # Keep as online + variables: final_vars + } + + response = api_call("PATCH", "/services/#{service_name}", {}, JSON.generate(service_body)) + + if response[:status] == 200 + puts "[INFO] SSL configuration updated for service '#{service_name}'" + else + raise BunkerWebApiError.new("Failed to update SSL configuration: status=#{response[:status]}, body=#{response[:raw_body]}") + end + + return response[:body] || {} + end + + def delete_service_ssl(service_name) @extra_info = "" diff --git a/func_ruby/ext-modules/bunkerweb_module.mod b/func_ruby/ext-modules/bunkerweb_module.mod index a1bb536..da07b37 100644 --- a/func_ruby/ext-modules/bunkerweb_module.mod +++ b/func_ruby/ext-modules/bunkerweb_module.mod @@ -189,6 +189,22 @@ class BunkerwebWorker < Kernel::ModuleCoreWorker puts output ACTION_OK end + when "alias" + m_domain = args[1].strip unless args[1].nil? + m_alias = args[2].strip unless args[1].nil? + if m_domain.nil? + log_return("Domain should be specified. #{args}") + else + + log("add alias to domain to bunkerweb protection") + output = `/usr/local/hestia/bin/v-bunkerweb-module alias #{m_domain} "#{m_alias}" shell` + exit_status = $?.exitstatus + if exit_status != 0 + log_return("Command failed with status #{exit_status}") + else + ACTION_OK + end + end when "help" puts "#{$0} bunkerweb_module COMMAND [OPTIONS] [json|csv|plain]" puts "COMMANDS:" diff --git a/func_ruby/ext-modules/update_module.mod b/func_ruby/ext-modules/update_module.mod index 3383dbe..6a2bf84 100644 --- a/func_ruby/ext-modules/update_module.mod +++ b/func_ruby/ext-modules/update_module.mod @@ -2,6 +2,7 @@ require 'pathname' require 'fileutils' +require 'digest' class UpdateWorker < Kernel::ModuleCoreWorker MODULE_ID = "update_module" @@ -17,7 +18,6 @@ class UpdateWorker < Kernel::ModuleCoreWorker end def file_changed?(new_file, old_file) - require 'digest/sha256' return true unless File.exist?(old_file) new_hash = Digest::SHA256.file(new_file).hexdigest old_hash = Digest::SHA256.file(old_file).hexdigest @@ -80,6 +80,9 @@ class UpdateWorker < Kernel::ModuleCoreWorker result = [] result = list.map do |new_dir, new_file, old_file| file_name = Pathname.new(new_file).relative_path_from(Pathname.new(new_dir)).to_s + dir_name = File.basename(new_dir) + relative_path = Pathname.new(new_file).relative_path_from(Pathname.new(new_dir)).to_s + file_name = File.join(dir_name, relative_path) { "FILE_NAME" => file_name, "NEW_SIZE" => File.size(new_file), diff --git a/web/extm/bunkerweb_module/edit/index.php b/web/extm/bunkerweb_module/edit/index.php index 9f51704..fab93d5 100644 --- a/web/extm/bunkerweb_module/edit/index.php +++ b/web/extm/bunkerweb_module/edit/index.php @@ -17,11 +17,11 @@ exec( $output, $return_var, ); -$check_passenger_enabled = json_decode(implode("", $output), true); +$check_bunkerweb_enabled = json_decode(implode("", $output), true); if ( $return_var != 0 || - empty($check_passenger_enabled) || - $check_passenger_enabled[0]["STATE"] != "enabled" + empty($check_bunkerweb_enabled) || + $check_bunkerweb_enabled[0]["STATE"] != "enabled" ) { header("Location: /list/extmodules/"); exit(); diff --git a/web/extm/update_module/edit/index.php b/web/extm/update_module/edit/index.php new file mode 100644 index 0000000..a645676 --- /dev/null +++ b/web/extm/update_module/edit/index.php @@ -0,0 +1,64 @@ +\n", $output); +} + +unset($output); + +// Render page +render_page($user, $TAB, "extmodules/extmodules_update_module"); + +// Back uri +$_SESSION["back"] = $_SERVER["REQUEST_URI"]; diff --git a/web/templates/pages/extmodules/extmodules_update_module.php b/web/templates/pages/extmodules/extmodules_update_module.php new file mode 100644 index 0000000..f885b05 --- /dev/null +++ b/web/templates/pages/extmodules/extmodules_update_module.php @@ -0,0 +1,63 @@ + +
+
+ +
+
+ + +
+ + + + + + +

+ +

+ +
+
+
+
+
+
+ + $value) { ?> +
+
+ : + +
+
+ : + +
+
+ : + +
+
+ +
+ +
+ +