#!/opt/brepo/ruby33/bin/ruby # info: action with bunkerweb API # options: COMMAND [SERVICE_NAME | SSL_CERT | SSL_KEY | FORMAT] # # example: v-ext-modules list json # # This function enables and disables additional modules # # Commands: # add [domain_name] # addssl [domain_name] [SSL_CERT_PATH] [SSL_KEY_PATH] # delete [domain_name] # updssl [domain] [SSL_CERT_PATH] [SSL_KEY_PATH] # list #----------------------------------------------------------# # Variables & Functions # #----------------------------------------------------------# # Argument definition v_command = ARGV[0] v_format = nil require "/usr/local/hestia/func_ruby/global_options" load_ruby_options_defaults $HESTIA = load_hestia_default_path_from_env require "main" require "modules" require "HestiaBunkerWebApi" require 'json' unless defined?(JSON) hestia_check_privileged_user load_global_bash_variables "/etc/hestiacp/hestia.conf" if $HESTIA.nil? hestia_print_error_message_to_cli "Can't find HESTIA base path" exit 1 end load_global_bash_variables "#{$HESTIA}/conf/hestia.conf" #----------------------------------------------------------# # Verifications # #----------------------------------------------------------# check_args 1, ARGV, "COMMAND [COMMAND_OPTIONS] [ACTION]" # Perform verification if read-only mode is enabled check_hestia_demo_mode #----------------------------------------------------------# # Action # #----------------------------------------------------------# case v_command.to_sym when :add v_domain = ARGV[1].strip v_format = ARGV[2] unless ARGV[2].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? || existing_services.strip.empty? result_arr = [] else services_data = JSON.parse(existing_services) if services_data["services"] if services_data["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 = services_data["services"] else result_arr = [] end end api.create_service(v_domain, { ssl: "no", reverse_proxy_host: "http://127.0.0.1:#{$PROXY_PORT}" }) 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 v_format = ARGV[2] unless ARGV[2].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? || existing_services.strip.empty? result_arr = [] else services_data = JSON.parse(existing_services) if services_data["services"] result_arr = services_data["services"] else result_arr = [] end end unless result_arr.any? { |s| s["id"] == v_domain } hestia_print_error_message_to_cli "domain does not exist" log_event E_NOTEXIST, $ARGUMENTS exit 1 end api.delete_service(v_domain) rescue BunkerWebApiError => e hestia_print_error_message_to_cli "[ERROR] Ошибка API: #{e.message}" log_event E_INVALID, $ARGUMENTS exit 1 end end when :addssl, :updssl v_domain = ARGV[1].strip v_ssl_cert = ARGV[2] v_ssl_key = ARGV[3] v_format = ARGV[4] unless ARGV[4].nil? if v_domain.nil? || v_domain == "" || v_ssl_cert.nil? || v_ssl_key.nil? || !File.exist?(v_ssl_cert) || !File.exist?(v_ssl_key) hestia_print_error_message_to_cli "domain, SSL cert and key must be provided and must exist" 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? || existing_services.strip.empty? result_arr = [] else services_data = JSON.parse(existing_services) if services_data["services"] result_arr = services_data["services"] else result_arr = [] end end unless result_arr.any? { |s| s["id"] == v_domain } hestia_print_error_message_to_cli "domain does not exist" log_event E_NOTEXIST, $ARGUMENTS exit 1 end api.update_service_ssl(v_domain, v_ssl_cert, v_ssl_key) rescue BunkerWebApiError => e hestia_print_error_message_to_cli "[ERROR] Ошибка API: #{e.message}" log_event E_INVALID, $ARGUMENTS exit 1 end end when :list v_format = ARGV[1] unless ARGV[1].nil? begin api = HestiaBunkerWebApi.new("http://127.0.0.1:8888") existing_services = api.list_services() if existing_services.nil? || existing_services.strip.empty? result_arr = [] else services_data = JSON.parse(existing_services) if services_data["services"] result_arr = services_data["services"] else result_arr = [] end end hestia_print_array_of_hashes(result_arr, v_format, "id, method, is_draft, creation_date, last_update, template, security_mode") rescue BunkerWebApiError => e hestia_print_error_message_to_cli "[ERROR] Ошибка API: #{e.message}" log_event E_INVALID, $ARGUMENTS exit 1 end else hestia_print_error_message_to_cli "unknown command" log_event E_ARGS, $ARGUMENTS exit 1 end exit 0