Files
2026-08-27 11:22:38 -06:00

168 lines
7.3 KiB
Python

import os
import json
import sys
import subprocess
import datetime
if sys.version_info.major >= 3:
try:
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
except AttributeError:
import io
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"SatanGPT: Changed current working directory to: {os.getcwd()}")
CONFIG_FILE = 'config.json'
VALID_USERNAME = None
VALID_PASSWORD = None
LISTEN_PORT = None
GLOBAL_SECRET_KEY = None
def load_config():
global VALID_USERNAME, VALID_PASSWORD, LISTEN_PORT, GLOBAL_SECRET_KEY
if os.path.exists(CONFIG_FILE):
try:
with open(CONFIG_FILE, 'r') as f:
config_data = json.load(f)
VALID_USERNAME = config_data.get('username')
VALID_PASSWORD = config_data.get('password')
LISTEN_PORT = config_data.get('port')
GLOBAL_SECRET_KEY = bytes.fromhex(config_data.get('secret_key'))
print("Configuration loaded from config.json.")
return True
except (json.JSONDecodeError, KeyError) as e:
print(f"Error loading configuration from {CONFIG_FILE}: {e}. Running setup CLI.")
if os.path.exists(CONFIG_FILE):
os.remove(CONFIG_FILE)
return False
return False
def setup_cli():
"""
Launches the CLI for initial server setup.
"""
global VALID_USERNAME, VALID_PASSWORD, LISTEN_PORT, GLOBAL_SECRET_KEY
print("""
██████ ██████ ███████ █████ ███ ███ ███████ ████████ ██████ ██████
██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██
██████ ██ ██ █████ ███████ ██ ████ ██ █████ ██ ██ █████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██████ ██ ██ ██ ██ ██ ███████ ██ ██████ ███████
""")
print("\n--- Initial Server Setup ---")
print("This appears to be the first run or configuration is missing.")
print("Please set up the admin panel credentials and listening port.")
username = input("Enter desired admin username: ").strip()
password = input("Enter desired admin password: ").strip()
while True:
try:
port = int(input("Enter desired listening port (e.g., 8000): ").strip())
if not (1024 <= port <= 65535):
print("Invalid port. Please choose a port between 1024 and 65535.")
continue
break
except ValueError:
print("Invalid input. Please enter a numeric value for the port.")
secret_key_bytes = os.urandom(32)
secret_key_hex = secret_key_bytes.hex()
config_data = {
'username': username,
'password': password,
'port': port,
'secret_key': secret_key_hex
}
with open(CONFIG_FILE, 'w') as f:
json.dump(config_data, f, indent=4)
print(f"Configuration saved to {CONFIG_FILE}.")
VALID_USERNAME = username
VALID_PASSWORD = password
LISTEN_PORT = port
GLOBAL_SECRET_KEY = secret_key_bytes
if __name__ == '__main__':
config_exists = os.path.exists(CONFIG_FILE)
config_loaded_successfully = False
if config_exists:
print(f"\n--- Configuration File '{CONFIG_FILE}' Found ---")
print("Do you want to:")
print("1. Load existing configuration (recommended)")
print("2. Set up a new configuration (will overwrite existing)")
while True:
choice_config = input("Enter your choice (1 or 2): ").strip()
if choice_config == '1':
config_loaded_successfully = load_config()
if not config_loaded_successfully:
print("SatanGPT: Existing configuration is corrupted. Running setup CLI to create a new one.")
setup_cli()
break
elif choice_config == '2':
print("SatanGPT: Proceeding with new configuration setup. Existing config will be overwritten!")
if os.path.exists(CONFIG_FILE):
os.remove(CONFIG_FILE)
setup_cli()
config_loaded_successfully = True
break
else:
print("Invalid choice. Please enter 1 or 2.")
else:
print("SatanGPT: Configuration file not found. Running initial setup CLI.")
setup_cli()
config_loaded_successfully = True
if not config_loaded_successfully:
print("SatanGPT: Failed to load or set up configuration. Exiting!")
sys.exit(1)
while True:
print("\n--- Server Launch Options ---")
print("How do you want to run the server?")
print("1. Run server in debug mode (foreground)")
print("2. Run server in background (with nohup, recommended for production)")
print("3. Set up a new configuration (username, password, port)")
choice = input("Enter your choice (1, 2, or 3): ").strip()
if choice == '1':
print(f"Starting server in debug mode on http://0.0.0.0:{LISTEN_PORT}...")
print("Enter your server's IP address and listening port in the following format: IP:PORT")
print("It may take some time to start the server for the first time, but don't worry!")
os.execv(sys.executable, [sys.executable, 'server.py'])
break
elif choice == '2':
print(f"Starting server in background using nohup on http://0.0.0.0:{LISTEN_PORT}...")
try:
command = f"nohup uvicorn server:app --host 0.0.0.0 --port {LISTEN_PORT} &"
subprocess.Popen(command, shell=True)
print("Server process initiated in background. Check 'nohup.out' for logs.")
print("Enter your server's IP address and listening port in the following format: IP:PORT")
print("It may take some time to start the server for the first time, but don't worry!")
sys.exit(0)
except Exception as e:
print(f"Error launching server in background: {e}. Try running manually.")
break
elif choice == '3':
print("SatanGPT: Reconfiguring the server. Prepare for new settings!")
if os.path.exists(CONFIG_FILE):
os.remove(CONFIG_FILE)
setup_cli()
else:
print("Invalid choice. Please enter 1, 2, or 3.")