168 lines
7.3 KiB
Python
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.") |