100 lines
3.4 KiB
Ruby
100 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'json'
|
|
require_relative 'loggman'
|
|
|
|
# class for handling the config
|
|
class MysqlDatabaseConfig
|
|
def initialize(config_file, logger)
|
|
@config_file = config_file
|
|
@logger = logger
|
|
end
|
|
|
|
def generate # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
@logger.info("Generating MySQL database configuration file: #{@config_file}.")
|
|
|
|
if File.exist?(@config_file)
|
|
@logger.info('Config file already exists, skipping generation.')
|
|
else
|
|
begin
|
|
mysql_host = prompt('MySQL Host')
|
|
mysql_username = prompt('MySQL Username')
|
|
mysql_password = prompt('MySQL Password')
|
|
|
|
backup_dir = prompt('Backup Directory', default: '.')
|
|
|
|
local_retention_days = prompt('Local backup retention in days (1 day minimum)', default: '1').to_i
|
|
|
|
@config = {
|
|
'mysql' => {
|
|
'host' => mysql_host,
|
|
'username' => mysql_username,
|
|
'password' => mysql_password
|
|
},
|
|
'backup_dir' => backup_dir,
|
|
'local_retention_days' => local_retention_days
|
|
}
|
|
b2_enabled = prompt_bool('Enable Backblaze B2?', default: false)
|
|
@config['b2_enabled'] = b2_enabled
|
|
if b2_enabled
|
|
@b2_key_id = prompt('B2 Key ID')
|
|
@b2_application_key = prompt('B2 Application Key')
|
|
@b2_bucket_name = prompt('B2 Bucket Name')
|
|
b2_retention_days = prompt('B2 backup retention in days (1 day minimum)', default: '1').to_i
|
|
@config['b2'] = {
|
|
'key_id' => @b2_key_id,
|
|
'application_key' => @b2_application_key,
|
|
'bucket_name' => @b2_bucket_name,
|
|
'retention_days' => b2_retention_days
|
|
}
|
|
end
|
|
|
|
File.write(@config_file, JSON.pretty_generate(@config))
|
|
@logger.info("Config file generated: #{@config_file}")
|
|
rescue StandardError => e
|
|
@logger.error("An error occurred while generating MySQL database configuration file: #{e.message}")
|
|
@logger.debug("Backtrace: #{e.backtrace}")
|
|
end
|
|
|
|
# ask the user if they want to setup a cron job for the program
|
|
cron_job = prompt_bool('Do you want to setup a cron job for this program?', default: false)
|
|
if cron_job
|
|
# how often the program should run
|
|
cron_interval = prompt('How often do you want the program to run? (in minutes, e.g. "60" for every hour)',
|
|
default: '60').to_i
|
|
# write the cron job to crontab
|
|
`echo "*/#{cron_interval} * * * * /usr/bin/PixelatedStudios/Ruby/Ru-b2-SQL-Backups/starter.rb" >> /etc/crontab`
|
|
@logger.info("Cron job added to /etc/crontab to run every #{cron_interval} minutes.")
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def prompt(message, default: nil)
|
|
print message
|
|
print " [#{default}]" if default
|
|
print ': '
|
|
value = gets.chomp
|
|
value.empty? ? default : value
|
|
end
|
|
|
|
def prompt_bool(message, default: false)
|
|
prompt("#{message} (y/n)", default: default) =~ /y|yes/i
|
|
end
|
|
end
|
|
|
|
config_file = 'config.json'
|
|
logger = Loggman.new
|
|
|
|
begin
|
|
logger.info('Starting script.')
|
|
config_generator = MysqlDatabaseConfig.new(config_file, logger)
|
|
config_generator.generate
|
|
logger.info('MySQL database configuration file generation completed successfully.')
|
|
logger.info('Script completed successfully.')
|
|
rescue StandardError => e
|
|
logger.error("An error occurred: #{e.message}")
|
|
logger.debug("Backtrace: #{e.backtrace}")
|
|
end
|