5b76cd117e
This commit marks a significant milestone in the NETRAVE project. The first major system has been successfully completed, laying a solid foundation for the subsequent development phases. Key changes include: 1. Completion of the Initial Setup Process: The initial setup process has been successfully implemented. This process gathers necessary information from the user and sets up the basic environment for the application to run. 2. Removal of Redundant Thread in Alert System: An unnecessary thread in the alert system was identified and removed. This change simplifies the alert system's architecture and reduces the potential for concurrency-related issues. 3. Program Efficiency Improvements: Several optimizations have been made to enhance the efficiency of the program. These include changes to the way alerts are handled and displayed, as well as improvements to the handling of the alert queue. These changes have been verified and tested to ensure they work as expected and contribute to the overall functionality and performance of the NETRAVE project.
134 lines
4.1 KiB
Ruby
134 lines
4.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'curses'
|
|
require 'dynamic_curses_input'
|
|
require 'dotenv'
|
|
require_relative 'database_manager'
|
|
require_relative 'system_information_gather'
|
|
require_relative 'utilities'
|
|
require_relative 'alert_manager'
|
|
|
|
# first run class
|
|
class FirstRunInit
|
|
include Utilities
|
|
include Curses
|
|
|
|
def initialize(logger, alert_queue_manager, db_manager = nil)
|
|
@loggman = logger
|
|
@db_manager = db_manager
|
|
@alert_queue_manager = alert_queue_manager
|
|
@info_gatherer = SystemInformationGather.new(@db_manager, @loggman)
|
|
Dotenv.load
|
|
end
|
|
|
|
def run
|
|
first_run_setup
|
|
end
|
|
|
|
def first_run_setup # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
db_details = ask_for_db_details
|
|
|
|
enc_pass = ENV['DB_PASSWORD']
|
|
enc_key = ENV['DB_SECRET_KEY']
|
|
dec_pass = decrypt_string_chacha20(enc_pass, enc_key)
|
|
until @db_manager.test_db_connection(ENV['DB_USERNAME'], dec_pass.to_s, ENV['DB_DATABASE'])
|
|
Curses.setpos(4, 0)
|
|
Curses.addstr("Whoops! We couldn't connect to the database with the details you provided. Please try again!")
|
|
Curses.refresh
|
|
new_db_details = ask_for_db_details
|
|
db_details.merge!(new_db_details) # Update db_details with new details
|
|
end
|
|
|
|
@db_manager.create_system_info_table
|
|
@db_manager.create_services_table
|
|
|
|
uplink_speed = @info_gatherer.ask_for_uplink_speed
|
|
downlink_speed = @info_gatherer.ask_for_downlink_speed
|
|
total_bandwidth = calculate_total_bandwidth(uplink_speed, downlink_speed)
|
|
services = @info_gatherer.ask_for_services
|
|
|
|
system_info = {
|
|
uplink_speed:,
|
|
downlink_speed:,
|
|
total_bandwidth:
|
|
}
|
|
|
|
@db_manager.store_system_info(system_info)
|
|
@db_manager.store_services(services)
|
|
end
|
|
|
|
def ask_for_db_details # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
@loggman.log_info('Asking for Database details...')
|
|
Curses.clear
|
|
|
|
Curses.setpos(1, 0)
|
|
Curses.addstr('Please enter your database username: ')
|
|
Curses.refresh
|
|
alert = Alert.new('This is a test alert', :error)
|
|
@alert_queue_manager.enqueue_alert(alert)
|
|
username = DCI.catch_input(true)
|
|
@loggman.log_info('Database Username entered!')
|
|
|
|
Curses.setpos(2, 0)
|
|
Curses.addstr('Please enter your database password: ')
|
|
Curses.refresh
|
|
Curses.noecho
|
|
password = DCI.catch_input(false)
|
|
@loggman.log_info('Database Password Stored Securely!')
|
|
Curses.echo
|
|
|
|
Curses.setpos(3, 0)
|
|
Curses.addstr('Please enter your database name: ')
|
|
Curses.refresh
|
|
database = DCI.catch_input(true)
|
|
@loggman.log_info('Database Name entered!')
|
|
|
|
# Generate a secret key
|
|
key = generate_key
|
|
@loggman.log_info('Secret Key Generated!')
|
|
|
|
# Encrypt the password
|
|
encrypted_password = encrypt_string_chacha20(password, key)
|
|
@loggman.log_info('Password Encrypted!')
|
|
|
|
db_details = { username:, password: encrypted_password, key:, database: }
|
|
write_db_details_to_config_file(db_details)
|
|
@loggman.log_info('Wiriting Database details to a file!')
|
|
end
|
|
|
|
def write_db_details_to_config_file(db_details) # rubocop:disable Metrics/MethodLength
|
|
# Write the database details to the .env file
|
|
File.open('.env', 'w') do |file|
|
|
file.puts %(DB_USERNAME="#{db_details[:username]}")
|
|
file.puts %(DB_PASSWORD="#{db_details[:password]}")
|
|
file.puts %(DB_SECRET_KEY="#{db_details[:key]}")
|
|
file.puts %(DB_DATABASE="#{db_details[:database]}")
|
|
end
|
|
|
|
@loggman.log_info('Database details saved! Reloading environment...')
|
|
# Load the .env file using dotenv
|
|
Dotenv.load
|
|
@loggman.log_info('Environment restarted!')
|
|
rescue StandardError => e
|
|
@loggman.log_error("Failed to write to .env file: #{e.message}")
|
|
end
|
|
|
|
def ask_for_default_mode
|
|
loop do
|
|
Curses.setpos(8, 0)
|
|
Curses.addstr('Please enter the default mode (TUI, GUI, or WebApp): ')
|
|
Curses.refresh
|
|
mode = Curses.getstr.strip.downcase
|
|
return mode if valid_mode?(mode)
|
|
|
|
Curses.setpos(9, 0)
|
|
Curses.addstr("Whoops! That didn't appear to be a valid mode. Please try again!")
|
|
Curses.refresh
|
|
end
|
|
end
|
|
|
|
def valid_mode?(mode)
|
|
%w[tui gui webapp].include?(mode)
|
|
end
|
|
end
|