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.

318 lines
7.6 KiB

#!/opt/brepo/ruby33/bin/ruby
require "date"
require "envbash"
require "interface"
require "json"
require "csv"
date_internal = DateTime.now
di = date_internal.strftime("%d%m%Y%H%M")
# Internal variables
$HOMEDIR = "/home"
$BACKUP = "/backup"
$BACKUP_GZIP = 9
$BACKUP_DISK_LIMIT = 95
$BACKUP_LA_LIMIT = %x(cat /proc/cpuinfo | grep processor | wc -l)
$RRD_STEP = 300
$BIN = "#{$HESTIA}/bin"
$HESTIA_INSTALL_DIR = "#{$HESTIA}/install/rpm"
$HESTIA_COMMON_DIR = "#{$HESTIA}/install/common"
$HESTIA_BACKUP = "/root/hst_backups/#{di}"
$HESTIA_PHP = "#{$HESTIA}/php/bin/php"
$USER_DATA = "#{$HESTIA}/data/users/#{$user}"
$WEBTPL = "#{$HESTIA}/data/templates/web"
$MAILTPL = "#{$HESTIA}/data/templates/mail"
$DNSTPL = "#{$HESTIA}/data/templates/dns"
$RRD = "#{$HESTIA}/web/rrd"
$SENDMAIL = "#{$HESTIA}/web/inc/mail-wrapper.php"
$HESTIA_GIT_REPO = "https://dev.brepo.ru/bayrepo/hestiacp"
$HESTIA_THEMES = "#{$HESTIA}/web/css/themes"
$HESTIA_THEMES_CUSTOM = "#{$HESTIA}/web/css/themes/custom"
$SCRIPT = File.basename($PROGRAM_NAME)
# Return codes
OK = 0
E_ARGS = 1
E_INVALID = 2
E_NOTEXIST = 3
E_EXISTS = 4
E_SUSPENDED = 5
E_UNSUSPENDED = 6
E_INUSE = 7
E_LIMIT = 8
E_PASSWORD = 9
E_FORBIDEN = 10
E_DISABLED = 11
E_PARSING = 12
E_DISK = 13
E_LA = 14
E_CONNECT = 15
E_FTP = 16
E_DB = 17
E_RRD = 18
E_UPDATE = 19
E_RESTART = 20
E_PERMISSION = 21
E_MODULE = 22
$ARGUMENTS = ""
ARGV.each_with_index do |item, index|
if !$HIDE.nil? && $HIDE == index
$ARGUMENTS = "#{$ARGUMENTS} '******'"
else
$ARGUMENTS = "#{$ARGUMENTS} #{item}"
end
end
class File
class << self
def append(path, content)
File.open(path, "a") { |f| f << content }
end
def append!(path, content)
File.open(path, "a") { |f| f << (content + "\n") }
end
end
end
def hestia_print_error_message_to_cli(error_message)
puts "Error: #{error_message}"
end
def load_global_bash_variables(*scripts)
local_arr = {}
scripts.each do |script|
EnvBash.load(script, into: local_arr) if File.exist? script
end
diff_arr = local_arr.reject { |key, _value| ENV.key? key }
diff_arr.each do |key, val|
e_val = val.gsub(/'/) { |_c| "\\'" }
str_data = "$#{key}='#{e_val}'"
eval str_data
end
end
def new_timestamp()
date = DateTime.now
$time = date.strftime("%T")
$date = date.strftime("%d-%m-%Y")
end
def log_event(error_string, args)
if $time.nil?
date = DateTime.now
log_time = date.strftime("%Y-%m-%d %T")
log_time = "#{log_time} #{File.basename($PROGRAM_NAME)}"
else
log_time = "#{$date} #{$time} #{File.basename($PROGRAM_NAME)}"
end
code_number = error_string.to_i
if code_number.zero?
File.append! "#{$HESTIA}/log/system.log", "#{log_time} #{args}" unless $HESTIA.nil?
else
File.append! "#{$HESTIA}/log/error.log", "#{log_time} #{args} [Error #{error_string}]" unless $HESTIA.nil?
end
end
def check_result(error_code:, error_message:, custom_error: -1, silent: false, callback_func: nil)
if error_code != OK
loc_error = custom_error != -1 ? custom_error : error_code
return callback_func(error_code, error_message) if callback_func
hestia_print_error_message_to_cli error_message unless silent
log_event loc_error, $ARGUMENTS
exit error_code
end
OK
end
def check_args(req_params, params, usage)
if req_params > params.length
puts "Usage #{File.basename($PROGRAM_NAME)} #{usage}"
check_result error_code: E_ARGS, error_message: "not enought arguments", silent: true
else
OK
end
end
def check_hestia_demo_mode
File.open("/usr/local/hestia/conf/hestia.conf") do |f|
until f.eof?
item = f.gets.strip
conf_data = item.split("=").map(&:strip!)
if conf_data.length > 1 && conf_data[0] == "DEMO_MODE" && conf_data[1].downcase == "yes"
hestia_print_error_message_to_cli "Unable to perform operation due to security restrictions that are in place."
exit(1)
end
end
end
end
def hestia_check_privileged_user
if Process.uid != 0
hestia_print_error_message_to_cli "Script must run under privileged user"
log_event E_PERMISSION, $ARGUMENTS
exit(1)
end
end
def hestia_format_cli_table(in_array)
arr_max_len = {}
in_array.each do |elem|
elem.each_with_index do |item, index|
arr_max_len[index] = item.to_s.length unless arr_max_len.key? index
arr_max_len[index] = item.to_s.length if arr_max_len.key?(index) && (arr_max_len[index] < item.to_s.length)
end
end
in_array.each do |elem|
elem.each_with_index do |item, index|
print " %s " % item.to_s.ljust(arr_max_len[index])
end
print "\n"
end
end
def hestia_print_array_of_hashes(in_array = nil, format = "shell", header = nil)
return if in_array.nil? && (format == "json" || format == "plain" || format == "csv")
case format
when "json"
puts in_array.to_json
when "plain"
in_array.each do |item|
data_wrapper = []
item.each do |key, val|
data_wrapper << val.to_s
end
puts data_wrapper.join("\t")
end
when "csv"
data_wrapper = in_array.map do |row|
row.values.to_csv
end
puts data_wrapper
else
headers = nil
unless header.nil?
headers = header.split(",").map(&:strip)
end
if !in_array.nil? && headers.nil?
headers = []
in_array.first.each_key do |key|
headers << key.to_s
end
end
data_out = []
unless headers.nil?
data_out << headers
data_out << headers.map { |i| "-" * i.to_s.length }
end
unless in_array.nil?
in_array.each do |val|
row = []
headers.each do |item|
row << if val.key? item
val[item]
elsif val.key? item.to_sym
val[item.to_sym]
else
""
end
end
data_out << row
end
end
hestia_format_cli_table(data_out)
end
end
def hestia_write_to_config_with_lock(config_file, values, perms = 0600)
File.open(config_file, File::WRONLY | File::CREAT, perms) do |f|
f.flock(File::LOCK_EX)
f.truncate(0)
values.each { |item| f.puts(item) }
f.flush
end
end
def hestia_read_config_with_lock(config_file)
arr = []
File.open(config_file, File::RDONLY) do |f|
f.flock(File::LOCK_SH)
f.each { |line| arr << line.strip }
end
arr
end
def hestia_get_file_key_pair(file, key)
value = ""
if File.exist?(file)
File.open(file, File::RDONLY) do |f|
f.flock(File::LOCK_SH)
f.each do |line|
result = line.strip.split("=", 2)
if result.length > 1
k = result[0].strip
v = result[1].strip
if k == key
value = v
break
end
end
end
end
end
value
end
def hestia_get_file_keys_value(file)
value = Hash.new
if File.exist?(file)
File.open(file, File::RDONLY) do |f|
f.flock(File::LOCK_SH)
f.each do |line|
result = line.strip.split("=", 2)
if result.length > 1
k = result[0].strip
v = result[1].strip
if k != ""
value[k] = v
end
end
end
end
end
value
end
def hestia_save_file_key_pair(file, key, value)
File.open(file, File::RDWR | File::CREAT, 0600) do |f|
f.flock(File::LOCK_EX)
f.rewind
storage = {}
f.each do |line|
result = line.strip.split("=", 2)
if result.length > 1
k = result[0].strip
v = result[1].strip
storage[k] = v
end
end
if value.strip == ""
if storage.key?(key.strip)
storage.delete(key.strip)
end
else
storage[key.strip] = value.strip
end
f.rewind
f.truncate(0)
storage.each do |k, v|
f.puts("#{k}=#{v}")
end
end
end