ircu2/configure-interactive.sh

436 lines
11 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Script de configurare interactivă avansată pentru Nefarious IRCd
# Limba: Română
#
set -e
# Culori
ROSU='\033[0;31m'
VERDE='\033[0;32m'
GALBEN='\033[1;33m'
ALBASTRU='\033[0;34m'
MOV='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'
# Variabile
PREFIX="${PREFIX:-$HOME/ircd}"
CONFIG_FILE="${1:-$PREFIX/etc/ircd.conf}"
# Funcții auxiliare
log_title() {
echo ""
echo -e "${MOVE}╔════════════════════════════════════════╗${NC}"
echo -e "${MOVE}$1${NC}"
echo -e "${MOVE}╚════════════════════════════════════════╝${NC}"
}
log_section() {
echo ""
echo -e "${CYAN}>>> $1${NC}"
}
log_ok() {
echo -e "${VERDE}$1${NC}"
}
log_err() {
echo -e "${ROSU}$1${NC}"
}
log_info() {
echo -e "${ALBASTRU} $1${NC}"
}
# Validare input
validate_hostname() {
if [[ $1 =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$ ]]; then
return 0
else
return 1
fi
}
validate_numeric() {
if [[ $1 =~ ^[0-9]+$ ]] && [ "$1" -ge 0 ] && [ "$1" -le 4095 ]; then
return 0
else
return 1
fi
}
validate_port() {
if [[ $1 =~ ^[0-9]+$ ]] && [ "$1" -ge 1024 ] && [ "$1" -le 65535 ]; then
return 0
else
return 1
fi
}
validate_email() {
if [[ $1 =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
return 0
else
return 1
fi
}
# Meniu interactiv
read_input() {
local prompt="$1"
local default="$2"
local input
if [ -n "$default" ]; then
echo -n -e "${GALBEN}${prompt}${NC} [${default}]: "
else
echo -n -e "${GALBEN}${prompt}${NC}: "
fi
read -r input
if [ -z "$input" ]; then
echo "$default"
else
echo "$input"
fi
}
# Etapa 1: Configurare generală
configure_general() {
log_title "CONFIGURARE GENERALĂ"
log_section "Setări de bază ale serverului"
# Nume server
while true; do
SERVER_NAME=$(read_input "Nume server (FQDN)" "localhost.localdomain")
if validate_hostname "$SERVER_NAME"; then
log_ok "Nume server valid: $SERVER_NAME"
break
else
log_err "Nume server invalid! Folosește format FQDN (ex: irc.example.com)"
fi
done
# Descriere
SERVER_DESC=$(read_input "Descriere server" "Nefarious IRCd Server")
log_ok "Descriere: $SERVER_DESC"
# Numeric
while true; do
NUMERIC=$(read_input "Numeric server (0-4095)" "1")
if validate_numeric "$NUMERIC"; then
log_ok "Numeric valid: $NUMERIC"
break
else
log_err "Numeric invalid! Folosește un număr între 0-4095"
fi
done
}
# Etapa 2: Informații administrator
configure_admin() {
log_title "INFORMAȚII ADMINISTRATOR"
ADMIN_LOCATION=$(read_input "Locație" "Romania")
log_ok "Locație: $ADMIN_LOCATION"
while true; do
ADMIN_EMAIL=$(read_input "Email administrator" "admin@underchat.ro")
if validate_email "$ADMIN_EMAIL"; then
log_ok "Email: $ADMIN_EMAIL"
break
else
log_err "Email invalid! Utilizează format corect (ex: admin@example.com)"
fi
done
ADMIN_INFO=$(read_input "Informații contact suplimentare" "Contact: admin")
log_ok "Info contact: $ADMIN_INFO"
}
# Etapa 3: Porturi
configure_ports() {
log_title "CONFIGURARE PORTURI"
log_section "Porturi pentru clienți"
while true; do
PORT1=$(read_input "Port standard (1024-65535)" "6667")
if validate_port "$PORT1"; then
log_ok "Port standard: $PORT1"
break
else
log_err "Port invalid!"
fi
done
while true; do
PORT2=$(read_input "Port SSL/TLS (1024-65535)" "6697")
if validate_port "$PORT2"; then
[ "$PORT2" != "$PORT1" ] && log_ok "Port SSL: $PORT2" || log_err "Portul SSL trebuie să fie diferit de portul standard"
[ "$PORT2" != "$PORT1" ] && break
else
log_err "Port invalid!"
fi
done
log_section "Porturi pentru servere"
while true; do
SERVER_PORT=$(read_input "Port server-to-server" "6666")
if validate_port "$SERVER_PORT"; then
log_ok "Port server: $SERVER_PORT"
break
else
log_err "Port invalid!"
fi
done
}
# Etapa 4: Clase de conexiuni
configure_classes() {
log_title "CONFIGURARE CLASE DE CONEXIUNI"
log_section "Setări pentru clienți"
MAXLINKS=$(read_input "Maxim linkuri per client" "10")
SENDQ=$(read_input "Dimensiune sendq (bytes)" "40000")
PINGFREQ=$(read_input "Frecvență ping (secunde)" "120")
log_ok "Configurare clase complete"
}
# Etapa 5: Operatori
configure_operators() {
log_title "CONFIGURARE OPERATORI"
log_section "Prim operator"
OPER_NICK=$(read_input "Nick operator" "root")
log_ok "Nick: $OPER_NICK"
log_info "Pentru a genera parola, rulează:"
echo -e "${CYAN} $PREFIX/bin/umkpasswd${NC}"
OPER_PASS=$(read_input "Hash bcrypt parola operator" "")
if [ -z "$OPER_PASS" ]; then
log_err "Parola necesară! Generează cu umkpasswd"
OPER_PASS='$2a$04$NTy1i.X/8pXekNBNbMRlOu1JAjIiMfPGIe1sZf0Xqq.2jzqPMfN/G'
log_info "Se folosește parola implicită pentru testing"
fi
OPER_HOST=$(read_input "Host permis pentru operator" "127.0.0.1")
log_ok "Host: $OPER_HOST"
}
# Etapa 6: Setări avansate
configure_advanced() {
log_title "SETĂRI AVANSATE"
log_section "Caracteristici"
read -p "Activezi autentificarea? (y/n) [y]: " -n 1 AUTH_ENABLED
AUTH_ENABLED=${AUTH_ENABLED:-y}
echo ""
[ "$AUTH_ENABLED" = "y" ] && log_ok "Autentificare: Activată" || log_ok "Autentificare: Dezactivată"
read -p "Activezi channelurile persistente? (y/n) [n]: " -n 1 PERSIST_CHANS
PERSIST_CHANS=${PERSIST_CHANS:-n}
echo ""
[ "$PERSIST_CHANS" = "y" ] && log_ok "Canale persistente: Activate" || log_ok "Canale persistente: Dezactivate"
read -p "Activezi SWHOIS? (y/n) [y]: " -n 1 SWHOIS_ENABLED
SWHOIS_ENABLED=${SWHOIS_ENABLED:-y}
echo ""
[ "$SWHOIS_ENABLED" = "y" ] && log_ok "SWHOIS: Activat" || log_ok "SWHOIS: Dezactivat"
IDLETIME=$(read_input "Timp maxim inactivitate (0=ilimitat)" "0")
log_ok "Timp inactivitate: ${IDLETIME}s"
}
# Generare fișier de configurare
generate_config_file() {
log_title "GENERARE FIȘIER CONFIGURARE"
mkdir -p "$(dirname "$CONFIG_FILE")"
# Conversie booleene
AUTH_FEATURE=$([ "$AUTH_ENABLED" = "y" ] && echo "yes" || echo "no")
PERSIST_FEATURE=$([ "$PERSIST_CHANS" = "y" ] && echo "yes" || echo "no")
SWHOIS_FEATURE=$([ "$SWHOIS_ENABLED" = "y" ] && echo "yes" || echo "no")
cat > "$CONFIG_FILE" << EOFCONFIG
# ============================================================================
# Fișier de configurare Nefarious IRCd
# Generat automat la: $(date)
# Script: configure.sh
# ============================================================================
# ============================================================================
# SECȚIUNE: GENERAL
# ============================================================================
General {
name = "$SERVER_NAME";
description = "$SERVER_DESC";
numeric = $NUMERIC;
logfile = "$PREFIX/log/ircd.log";
motd = "$PREFIX/etc/ircd.motd";
opermotd = "$PREFIX/etc/ircd.opermotd";
};
# ============================================================================
# SECȚIUNE: ADMIN
# ============================================================================
Admin {
location = "$ADMIN_LOCATION";
contact = "$ADMIN_EMAIL";
contact = "$ADMIN_INFO";
};
# ============================================================================
# SECȚIUNE: PORTURI
# ============================================================================
# Port standard pentru clienți
Port {
port = $PORT1;
mask = 0.0.0.0;
};
# Port SSL/TLS
Port {
port = $PORT2;
mask = 0.0.0.0;
tls = yes;
};
# Port server-to-server
Port {
port = $SERVER_PORT;
mask = 0.0.0.0;
};
# ============================================================================
# SECȚIUNE: CLASE
# ============================================================================
Class {
name = "clients";
pingfreq = $PINGFREQ;
connectfreq = 60;
maxlinks = $MAXLINKS;
sendq = $SENDQ;
};
Class {
name = "servers";
pingfreq = 60;
connectfreq = 300;
maxlinks = 10;
sendq = 1000000;
};
# ============================================================================
# SECȚIUNE: CLIENT
# ============================================================================
Client {
class = "clients";
maxlinks = $MAXLINKS;
};
# ============================================================================
# SECȚIUNE: OPERATOR
# ============================================================================
Operator {
nick = "$OPER_NICK";
password = "$OPER_PASS";
privileges = "+all";
host = "$OPER_HOST";
};
# ============================================================================
# SECȚIUNE: CARACTERISTICI (Features)
# ============================================================================
Feature {
AUTH = "$AUTH_FEATURE";
PERSIST_CHANS = "$PERSIST_FEATURE";
IDLETIME = $IDLETIME;
SWHOIS = "$SWHOIS_FEATURE";
LOG_FACILITY = "LOG_USER";
};
EOFCONFIG
log_ok "Fișier de configurare generat: $CONFIG_FILE"
}
# Rezumat final
show_summary() {
log_title "REZUMAT CONFIGURARE"
echo -e "${CYAN}Setări general:${NC}"
echo " • Nume: $SERVER_NAME"
echo " • Descriere: $SERVER_DESC"
echo " • Numeric: $NUMERIC"
echo ""
echo -e "${CYAN}Administrator:${NC}"
echo " • Locație: $ADMIN_LOCATION"
echo " • Email: $ADMIN_EMAIL"
echo ""
echo -e "${CYAN}Porturi:${NC}"
echo " • Standard: $PORT1"
echo " • SSL/TLS: $PORT2"
echo " • Server: $SERVER_PORT"
echo ""
echo -e "${CYAN}Operator:${NC}"
echo " • Nick: $OPER_NICK"
echo " • Host: $OPER_HOST"
echo ""
echo -e "${VERDE}Configurare salvată în: $CONFIG_FILE${NC}"
echo ""
}
# Funcție principală
main() {
clear
echo -e "${MOVE}"
echo "╔════════════════════════════════════════╗"
echo "║ Configurator Nefarious IRCd ║"
echo "║ Limba: Română ║"
echo "║ Versiune: 1.0 ║"
echo "╚════════════════════════════════════════╝"
echo -e "${NC}"
# Executare pași
configure_general
configure_admin
configure_ports
configure_classes
configure_operators
configure_advanced
# Generare și rezumat
generate_config_file
show_summary
echo -e "${VERDE}✓ Configurare completă!${NC}"
echo ""
echo -e "${GALBEN}Pași următori:${NC}"
echo " 1. Verifică configurarea: cat $CONFIG_FILE"
echo " 2. Editează după necesitate: nano $CONFIG_FILE"
echo " 3. Pornește serverul: $PREFIX/bin/ircd -f $CONFIG_FILE"
echo ""
}
# Apelează funcția principală
main