ircu2/configure-interactive.sh

535 lines
14 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 UnderChat 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"
# Domeniu rețea
NETWORK=$(read_input "Domeniu/Rețea (ex: underchat.org)" "underchat.org")
log_ok "Domeniu rețea: $NETWORK"
# Nume server
while true; do
SERVER_NAME=$(read_input "Nume server (ex: ns1.${NETWORK})" "ns1.${NETWORK}")
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: ns1.example.com)"
fi
done
# Descriere
SERVER_DESC=$(read_input "Descriere server" "The ${NETWORK} Network")
log_ok "Descriere: $SERVER_DESC"
# Virtual host (IP local)
VHOST=$(read_input "Virtual Host / IP local" "127.0.0.1")
log_ok "Virtual Host: $VHOST"
# 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 "Configurare Operator Principal"
OPER_NAME=$(read_input "Nume operator" "AdminRoot")
log_ok "Nume: $OPER_NAME"
log_info "Pentru a genera parola, rulează:"
echo -e "${CYAN} $PREFIX/bin/umkpasswd${NC}"
OPER_PASS=$(read_input "Hash parola operator (SMD5/bcrypt)" "")
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" "*@*")
log_ok "Host: $OPER_HOST"
# Oper options
read -p "Is this an admin operator? (y/n) [y]: " -n 1 IS_ADMIN
IS_ADMIN=${IS_ADMIN:-y}
echo ""
}
# 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")
IS_ADMIN_OPER=$([ "$IS_ADMIN" = "y" ] && echo "yes" || echo "no")
cat > "$CONFIG_FILE" << EOFCONFIG
# ============================================================================
# Fișier de configurare UnderChat IRCd
# Generat automat la: $(date)
# Script: configure-interactive.sh
# Model: Professional IRC Server
# ============================================================================
# ============================================================================
# SECȚIUNE: GENERAL
# ============================================================================
General {
name = "$SERVER_NAME";
vhost = "127.0.0.1";
description = "$SERVER_DESC";
numeric = $NUMERIC;
dns server = "8.8.8.8";
dns server = "1.1.1.1";
};
# ============================================================================
# SECȚIUNE: ADMIN
# ============================================================================
Admin {
Location = "The $SERVER_NAME World";
Location = "$ADMIN_LOCATION";
Contact = "$ADMIN_EMAIL";
Contact = "$ADMIN_INFO";
};
# ============================================================================
# SECȚIUNE: CLASE DE CONEXIUNI
# ============================================================================
Class {
name = "Server";
pingfreq = 1 minutes 30 seconds;
connectfreq = 5 minutes;
maxlinks = 1;
sendq = 9000000;
};
Class {
name = "Local";
pingfreq = $PINGFREQ seconds;
sendq = $SENDQ;
maxlinks = $MAXLINKS;
usermode = "+iw";
};
Class {
name = "Other";
pingfreq = $PINGFREQ seconds;
sendq = $SENDQ;
maxlinks = $MAXLINKS;
usermode = "+ix";
};
Class {
name = "Opers";
pingfreq = $PINGFREQ seconds;
sendq = $SENDQ;
maxlinks = 20;
local = no;
freeform = yes;
mode_lchan = yes;
deop_lchan = yes;
walk_lchan = yes;
show_invis = yes;
see_chan = yes;
list_chan = yes;
usermode = "+W";
remove = yes;
};
# ============================================================================
# SECȚIUNE: CLIENT
# ============================================================================
Client {
host = "*@*";
ip = "*@*";
class = "Other";
maxlinks = $MAXLINKS;
};
# ============================================================================
# SECȚIUNE: PORTURI
# ============================================================================
# Port server-to-server
Port {
vhost = "127.0.0.1" $SERVER_PORT;
server = yes;
hidden = yes;
};
# Port standard pentru clienți
Port {
vhost = "127.0.0.1" $PORT1;
hidden = yes;
};
# Port SSL/TLS pentru clienți
Port {
vhost = "127.0.0.1" $PORT2;
ssl = yes;
hidden = yes;
};
# ============================================================================
# SECȚIUNE: OPERATORI
# ============================================================================
Operator {
name = "$OPER_NAME";
password = "$OPER_PASS";
host = "$OPER_HOST";
class = "Opers";
admin = $IS_ADMIN_OPER;
hide_oper = no;
hide_channels = no;
};
# ============================================================================
# SECȚIUNE: JUPE - Nick-uri rezervate
# ============================================================================
Jupe {
nick = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
nick = "StatServ,NoteServ";
nick = "ChanServ,ChanSaver";
nick = "NickServ,NickSaver";
};
# ============================================================================
# SECȚIUNE: FEATURE - Caracteristici
# ============================================================================
features {
"NETWORK" = "UnderchatNetwork";
"DOMAINNAME" = "$SERVER_NAME";
"LOG" = "SYSTEM" "FILE" "$PREFIX/log/ircd.log";
"LOG" = "SYSTEM" "LEVEL" "CRIT";
"HUB" = "TRUE";
"RELIABLE_CLOCK" = "FALSE";
"WALLOPS_OPER_ONLY" = "TRUE";
"NODNS" = "FALSE";
"CLIENT_FLOOD" = "1024";
"BUFFERPOOL" = "27000000";
"HOST_HIDING" = "TRUE";
"HIDDEN_HOST" = "users.underchat.org";
"HIDDEN_IP" = "127.0.0.1";
"MAXCHANNELSPERUSER" = "60";
"CHANNELLEN" = "200";
"MAXBANS" = "50";
"NICKLEN" = "12";
"NICKNAMEHISTORYLENGTH" = "800";
"HANGONGOODLINK" = "300";
"HANGONRETRYDELAY" = "10";
"CONNECTTIMEOUT" = "90";
"PINGFREQUENCY" = "$PINGFREQ";
"CONNECTFREQUENCY" = "600";
"MPATH" = "$PREFIX/etc/ircd.motd";
"PPATH" = "$PREFIX/var/ircd.pid";
"HIS_SERVERNAME" = "*.underchat.org";
"HIS_SERVERINFO" = "The UnderchatNetwork World";
"CHECK" = "TRUE";
"SETHOST" = "TRUE";
"NETWORK_REHASH" = "TRUE";
"HALFOPS" = "TRUE";
};
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 UnderChat 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