#!/bin/bash # # Script de instalare automată pentru Nefarious IRCd # Limba: Română # Data: 2026 # # Culori pentru output ROSU='\033[0;31m' VERDE='\033[0;32m' GALBEN='\033[1;33m' ALBASTRU='\033[0;34m' NC='\033[0m' # Fără culoare # Setări implicite PREFIX="${HOME}/ircd" MAXCON=4096 ENABLE_DEBUG=0 ENABLE_SSL=1 # Funcția de afișare a ajutorului show_help() { cat << EOF ${ALBASTRU}Script de instalare automată pentru Nefarious IRCd${NC} Utilizare: ./install.sh [OPȚIUNI] ${GALBEN}OPȚIUNI:${NC} -h, --help Afișează acest mesaj de ajutor -p, --prefix PATH Calea de instalare (implicit: \$HOME/ircd) -m, --maxcon NUM Numărul maxim de conexiuni (implicit: 4096) -d, --debug Activează modul de debug -s, --no-ssl Dezactivează suportul SSL/TLS -c, --config FILE Fișier de configurare inițial ${GALBEN}EXEMPLE:${NC} ./install.sh ./install.sh --prefix /opt/ircd --maxcon 8192 ./install.sh --debug --config myconfig.conf EOF } # Funcția de log log_info() { echo -e "${VERDE}[INFO]${NC} $1" } log_warn() { echo -e "${GALBEN}[AVERTIZARE]${NC} $1" } log_error() { echo -e "${ROSU}[EROARE]${NC} $1" } log_success() { echo -e "${VERDE}[SUCCES]${NC} $1" } # Funcția de verificare a dependențelor check_dependencies() { log_info "Verificare dependențe..." local missing_deps=0 # Verifică compilatorul C if ! command -v gcc &> /dev/null && ! command -v cc &> /dev/null; then log_error "GCC/CC nu este instalat!" missing_deps=1 else log_success "Compilator C găsit" fi # Verifică make if ! command -v make &> /dev/null; then log_error "Make nu este instalat!" missing_deps=1 else log_success "Make găsit" fi # Verifică autoconf if ! command -v autoconf &> /dev/null; then log_warn "Autoconf nu este instalat (optional)" else log_success "Autoconf găsit" fi # Verifică bibliotecile SSL if command -v pkg-config &> /dev/null; then if ! pkg-config --exists openssl; then log_warn "OpenSSL dev nu este instalat (optional)" else log_success "OpenSSL găsit" fi fi if [ $missing_deps -eq 1 ]; then log_error "Lipsesc dependențe! Instalează-le și încearcă din nou." return 1 fi return 0 } # Funcția pentru fixare config.guess pentru aarch64 fix_config_guess() { log_info "Verificare support aarch64 în config.guess..." # Verifică dacă config.guess e vechi și nu suportă aarch64 if [ -f "./config.guess" ] && ! grep -q "aarch64" ./config.guess; then log_warn "config.guess e vechi, adaugă suport aarch64..." # Patch pentru aarch64 if grep -q "case \"\$machine\" in" ./config.guess; then # Adaugă case pentru aarch64 înainte de default sed -i '/case "$machine" in/a\ \t\taarch64*|arm64*)\ \t\t\techo aarch64-unknown-linux-gnu\ \t\t\texit 0\ \t\t\t;;' ./config.guess log_success "Support aarch64 adăugat la config.guess" fi fi # Dacă config.guess tot nu merge, folosește --build flag return 0 } # Funcția de configurare configure_ircd() { log_info "Configurare Nefarious IRCd..." # Fixează config.guess pentru aarch64 fix_config_guess local config_args="--prefix=$PREFIX" config_args="$config_args --with-maxcon=$MAXCON" if [ $ENABLE_DEBUG -eq 1 ]; then config_args="$config_args --enable-debug" fi if [ $ENABLE_SSL -eq 0 ]; then config_args="$config_args --disable-ssl" fi # Adaugă --build flag pentru sisteme care nu pot detecta if [ "$(uname -m)" = "aarch64" ]; then config_args="$config_args --build=aarch64-unknown-linux-gnu" log_info "Detectat aarch64, adaugă --build=aarch64-unknown-linux-gnu" fi log_info "Parametri configure: $config_args" if [ ! -f "./configure" ]; then log_error "Fișierul configure nu găsit!" return 1 fi ./configure $config_args if [ $? -ne 0 ]; then log_error "Configurare eșuată!" return 1 fi log_success "Configurare finalizată cu succes" return 0 } # Funcția de compilare compile_ircd() { log_info "Compilare Nefarious IRCd..." make clean > /dev/null 2>&1 make if [ $? -ne 0 ]; then log_error "Compilare eșuată!" return 1 fi log_success "Compilare finalizată cu succes" return 0 } # Funcția de instalare install_ircd() { log_info "Instalare Nefarious IRCd..." make install if [ $? -ne 0 ]; then log_error "Instalare eșuată!" return 1 fi log_success "Instalare finalizată cu succes" return 0 } # Funcția de generare a fișierului de configurare generate_config() { local config_file="$1" local server_name="${2:-localhost.localdomain}" local server_desc="${3:-Nefarious IRCd Server}" local server_numeric="${4:-1}" local admin_location="${5:-Romania}" local admin_contact="${6:-admin@underchat.ro}" log_info "Generare fișier de configurare: $config_file" mkdir -p "$(dirname "$config_file")" cat > "$config_file" << 'EOFCONFIG' # Fișier de configurare pentru Nefarious IRCd # Generat automat în data: 2026 # Limba: Română # ============================================================================ # BLOC GENERAL - Setările principale ale serverului # ============================================================================ General { # Numele serverului (trebuie să fie unic în rețea) name = "EOFCONFIG_NAME"; # Descrierea serverului description = "EOFCONFIG_DESC"; # Numeric-ul serverului (0-4095, trebuie unic în rețea) numeric = EOFCONFIG_NUMERIC; # Calea către fișierul de log logfile = "EOFCONFIG_PREFIX/log/ircd.log"; # Calea către motd (Message of the Day) motd = "EOFCONFIG_PREFIX/etc/ircd.motd"; # Calea către opmotd (Message for operators) opermotd = "EOFCONFIG_PREFIX/etc/ircd.opermotd"; }; # ============================================================================ # BLOC ADMIN - Informații administrator # ============================================================================ Admin { # Locație location = "EOFCONFIG_ADMIN_LOC"; # Contact contact = "EOFCONFIG_ADMIN_CONTACT"; }; # ============================================================================ # BLOC PORT - Porturile de ascultare # ============================================================================ Port { # Port pentru clienți normali (implicit 6667) port = 6667; mask = 0.0.0.0; }; # Port pentru SSL Port { port = 6697; mask = 0.0.0.0; tls = yes; }; # ============================================================================ # BLOC ULINED - Servere de rețea (pentru testing local) # ============================================================================ Uline { # Nume server server = "services.underchat.ro"; }; # ============================================================================ # BLOC CLASS - Clase de conexiuni # ============================================================================ Class { name = "clients"; pingfreq = 120; connectfreq = 60; maxlinks = 100; sendq = 40000; }; Class { name = "servers"; pingfreq = 60; connectfreq = 300; maxlinks = 10; sendq = 1000000; }; # ============================================================================ # BLOC CLIENT - Restricții pentru clienți # ============================================================================ Client { class = "clients"; maxlinks = 10; }; # ============================================================================ # BLOC CONNECT - Configurare conectări la alte servere # ============================================================================ # Exemplu: Connect la un alt server # Connect { # name = "other.server.com"; # host = "192.168.1.100"; # port = 6667; # maxlinks = 1; # class = "servers"; # password = "linker_password"; # }; # ============================================================================ # BLOC OPERATOR - Configurare operatori # ============================================================================ Operator { # Nickname-ul operatorului nick = "root"; # Password-ul operatorului (hash bcrypt) # Generează cu: ./ircd/umkpasswd password = "$2a$04$NTy1i.X/8pXekNBNbMRlOu1JAjIiMfPGIe1sZf0Xqq.2jzqPMfN/G"; # Permisiuni operator (vezi doc/opercmds.html) privileges = "+all"; # Host-uri permise pentru operator host = "127.0.0.1"; host = "localhost"; }; # ============================================================================ # BLOC FEATURE - Caracteristici dinamice # ============================================================================ Feature { # Activează autenticarea AUTH = "yes"; # Activează channelurile persistente PERSIST_CHANS = "no"; # Timp maxim de inactivitate (secunde) IDLETIME = 0; # Activează SWHOIs SWHOIS = "yes"; }; EOFCONFIG # Înlocuiește placeholder-ele sed -i "s|EOFCONFIG_NAME|$server_name|g" "$config_file" sed -i "s|EOFCONFIG_DESC|$server_desc|g" "$config_file" sed -i "s|EOFCONFIG_NUMERIC|$server_numeric|g" "$config_file" sed -i "s|EOFCONFIG_PREFIX|$PREFIX|g" "$config_file" sed -i "s|EOFCONFIG_ADMIN_LOC|$admin_location|g" "$config_file" sed -i "s|EOFCONFIG_ADMIN_CONTACT|$admin_contact|g" "$config_file" log_success "Fișier de configurare generat: $config_file" return 0 } # Funcția principală main() { # Parsare argumente while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -p|--prefix) PREFIX="$2" shift 2 ;; -m|--maxcon) MAXCON="$2" shift 2 ;; -d|--debug) ENABLE_DEBUG=1 shift ;; -s|--no-ssl) ENABLE_SSL=0 shift ;; -c|--config) CONFIG_FILE="$2" shift 2 ;; *) log_error "Opțiune necunoscută: $1" show_help exit 1 ;; esac done echo -e "${ALBASTRU}" echo "=========================================" echo " Instalare Nefarious IRCd" echo "=========================================" echo -e "${NC}" # Verificare dependențe check_dependencies if [ $? -ne 0 ]; then exit 1 fi # Configurare configure_ircd if [ $? -ne 0 ]; then exit 1 fi # Compilare compile_ircd if [ $? -ne 0 ]; then exit 1 fi # Instalare install_ircd if [ $? -ne 0 ]; then exit 1 fi # Generare fișier de configurare local conf_file="${PREFIX}/etc/ircd.conf" if [ -z "$CONFIG_FILE" ]; then # Citire interactivă de parametri echo "" echo -e "${GALBEN}Completare setări server:${NC}" read -p " Nume server [localhost.localdomain]: " server_name server_name=${server_name:-localhost.localdomain} read -p " Descriere server [Nefarious IRCd Server]: " server_desc server_desc=${server_desc:-Nefarious IRCd Server} read -p " Numeric server [1]: " server_numeric server_numeric=${server_numeric:-1} read -p " Locație admin [Romania]: " admin_location admin_location=${admin_location:-Romania} read -p " Contact admin [admin@underchat.ro]: " admin_contact admin_contact=${admin_contact:-admin@underchat.ro} else server_name=$(grep 'name = "' "$CONFIG_FILE" 2>/dev/null | head -1 | cut -d'"' -f2) server_name=${server_name:-localhost.localdomain} fi generate_config "$conf_file" "$server_name" "$server_desc" "$server_numeric" "$admin_location" "$admin_contact" if [ $? -ne 0 ]; then exit 1 fi # Creare directoare log_info "Creare structură de directoare..." mkdir -p "$PREFIX/log" mkdir -p "$PREFIX/etc" mkdir -p "$PREFIX/var" # Creare fișiere MOTD if [ ! -f "$PREFIX/etc/ircd.motd" ]; then cat > "$PREFIX/etc/ircd.motd" << 'EOFMOTD' ╔═══════════════════════════════════════╗ ║ Bine venit pe Nefarious IRCd! ║ ║ Versiune: Underchat Edition ║ ║ Data: 2026 ║ ╚═══════════════════════════════════════╝ Aceasta este o rețea IRC privată. Respectă regulile serverului! EOFMOTD log_success "Fișier MOTD creat: $PREFIX/etc/ircd.motd" fi # Rezumat instalare echo "" echo -e "${VERDE}" echo "=========================================" echo " ✓ Instalare completă!" echo "=========================================" echo -e "${NC}" echo "" echo -e "${GALBEN}Informații de instalare:${NC}" echo " Calea de instalare: $PREFIX" echo " Fișier configurare: $conf_file" echo " Fișier log: $PREFIX/log/ircd.log" echo " Maxim conexiuni: $MAXCON" echo " Debug: $([ $ENABLE_DEBUG -eq 1 ] && echo 'Activat' || echo 'Dezactivat')" echo " SSL/TLS: $([ $ENABLE_SSL -eq 1 ] && echo 'Activat' || echo 'Dezactivat')" echo "" echo -e "${GALBEN}Pași următori:${NC}" echo " 1. Editează configurarea: nano $conf_file" echo " 2. Generează parola operator: $PREFIX/bin/umkpasswd" echo " 3. Pornește serverul: $PREFIX/bin/ircd -f $conf_file" echo " 4. Conectează-te: irc://localhost:6667" echo "" } # Apelează funcția principală main "$@"