#!/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 pentru generare hash parola generate_password_hash() { local password="$1" # Verifica daca openssl e disponibil pentru MD5 if command -v openssl &> /dev/null; then # Genereaza MD5 hash (SMD5 format pentru ircd) echo "$password" | openssl dgst -md5 -binary | base64 else # Fallback: foloseste doar password plain (nu e recomandat!) echo "PLAIN:$password" fi } # Funcția pentru validare parola validate_password() { local pass="$1" if [ ${#pass} -lt 4 ]; then return 1 fi return 0 } # 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}" local vhost="${7:-127.0.0.1}" local network="${8:-underchat.org}" 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ă # Model: Node-Ase.ovh Professional IRC Server # ============================================================================ # SECȚIUNE: GENERAL # ============================================================================ General { # Numele serverului (trebuie unic în rețea) name = "EOFCONFIG_NAME"; # Virtual Host - IP pe care ascultă vhost = "EOFCONFIG_VHOST"; # Descrierea serverului description = "EOFCONFIG_DESC"; # Numeric-ul serverului (0-4095, trebuie unic în rețea) numeric = EOFCONFIG_NUMERIC; # Servere DNS pentru rezolvare domenii dns server = "8.8.8.8"; dns server = "1.1.1.1"; }; # ============================================================================ # SECȚIUNE: ADMIN # ============================================================================ Admin { # Locații (maxim 2) Location = "EOFCONFIG_NETWORK World"; Location = "EOFCONFIG_ADMIN_LOC"; # Contacti Contact = "EOFCONFIG_ADMIN_CONTACT"; }; # ============================================================================ # SECȚIUNE: CLASE DE CONEXIUNI # ============================================================================ # Clasă pentru servere principale (hub) Class { name = "Server"; pingfreq = 1 minutes 30 seconds; connectfreq = 5 minutes; maxlinks = 1; sendq = 9000000; }; # Clasă pentru clienți obișnuiți Class { name = "Local"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 100; usermode = "+iw"; }; # Clasă pentru clienți normali (implicit) Class { name = "Other"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 2048; usermode = "+ix"; }; # Clasă pentru operatori Class { name = "Opers"; pingfreq = 1 minutes 30 seconds; sendq = 160000; 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 - Restricții pentru conexiuni # ============================================================================ # Configurare implicită pentru toți clienții Client { host = "*@*"; ip = "*@*"; class = "Other"; maxlinks = 6; }; # ============================================================================ # SECȚIUNE: JUPED NICKS - Nick-uri rezervate # ============================================================================ Jupe { # Litere și caractere speciale 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"; # Servicii de rețea nick = "StatServ,NoteServ"; nick = "ChanServ,ChanSaver"; nick = "NickServ,NickSaver"; }; # ============================================================================ # SECȚIUNE: PORTURI # ============================================================================ # Port pentru server-to-server Port { vhost = "EOFCONFIG_VHOST" 4400; server = yes; hidden = yes; }; # Port standard pentru clienți Port { vhost = "EOFCONFIG_VHOST" 6667; hidden = yes; }; # Port SSL/TLS pentru clienți (opțional) # Port { # vhost = "EOFCONFIG_VHOST" 6697; # ssl = yes; # hidden = yes; # }; # ============================================================================ # SECȚIUNE: OPERATORI # ============================================================================ Operator { # Nickname-ul operatorului name = "AdminRoot"; # Password-ul operatorului (hash MD5/bcrypt/SMD5) # Generează cu: ./ircd/umkpasswd password = "$2a$04$NTy1i.X/8pXekNBNbMRlOu1JAjIiMfPGIe1sZf0Xqq.2jzqPMfN/G"; # Host-uri permise pentru operator (*) host = "*@*"; # Clasă class = "Opers"; # Permisiuni # hide_oper = yes; # hide_channels = yes; # whois_notice = yes; admin = yes; }; # ============================================================================ # SECȚIUNE: CONNECT - Legări cu alte servere # ============================================================================ # Exemplu: Connect la un server hub # Connect { # name = "hub.EOFCONFIG_NETWORK"; # host = "192.168.1.100"; # password = "hub_password"; # port = 4400; # class = "Server"; # autoconnect = yes; # hub; # }; # ============================================================================ # SECȚIUNE: UWORLD - Servere de servicii # ============================================================================ # UWorld { # name = "services.EOFCONFIG_NETWORK"; # }; # ============================================================================ # SECȚIUNE: FEATURE - Caracteristici și setări # ============================================================================ features { # Network details "NETWORK" = "EOFCONFIG_NETWORK"; "DOMAINNAME" = "EOFCONFIG_NETWORK"; # Logging "LOG" = "SYSTEM" "FILE" "EOFCONFIG_PREFIX/log/ircd.log"; "LOG" = "SYSTEM" "LEVEL" "CRIT"; # Server settings "HUB" = "TRUE"; "RELIABLE_CLOCK" = "FALSE"; "WALLOPS_OPER_ONLY" = "TRUE"; "NODNS" = "FALSE"; "NOIDENT" = "FALSE"; # Client settings "CLIENT_FLOOD" = "1024"; "BUFFERPOOL" = "27000000"; "DEFAULTMAXSENDQLENGTH" = "40000"; # Host hiding "HOST_HIDING" = "TRUE"; "HIDDEN_HOST" = "users.EOFCONFIG_NETWORK"; "HIDDEN_IP" = "127.0.0.1"; # Channels "MAXCHANNELSPERUSER" = "60"; "CHANNELLEN" = "200"; "MAXBANS" = "50"; # Nick settings "NICKLEN" = "12"; "NICKNAMEHISTORYLENGTH" = "800"; # Timing "HANGONGOODLINK" = "300"; "HANGONRETRYDELAY" = "10"; "CONNECTTIMEOUT" = "90"; "PINGFREQUENCY" = "120"; "CONNECTFREQUENCY" = "600"; # Welcome messages "MPATH" = "EOFCONFIG_PREFIX/etc/ircd.motd"; "RPATH" = "EOFCONFIG_PREFIX/etc/remote.motd"; "PPATH" = "EOFCONFIG_PREFIX/var/ircd.pid"; # Stats visibility "HIS_STATS_u" = "FALSE"; "HIS_STATS_U" = "TRUE"; # Whois privacy "HIS_WHOIS_SERVERNAME" = "TRUE"; "HIS_WHOIS_IDLETIME" = "TRUE"; "HIS_WHOIS_LOCALCHAN" = "TRUE"; # Who privacy "HIS_WHO_SERVERNAME" = "TRUE"; "HIS_WHO_HOPCOUNT" = "TRUE"; # Network info "HIS_NETSPLIT" = "TRUE"; "HIS_SERVERNAME" = "*.EOFCONFIG_NETWORK"; "HIS_SERVERINFO" = "The EOFCONFIG_NETWORK World"; # Operational "CHECK" = "TRUE"; "CHECK_EXTENDED" = "TRUE"; "MAX_CHECK_OUTPUT" = "1000"; # Admin commands "SETHOST" = "TRUE"; "NETWORK_REHASH" = "TRUE"; # Channel modes "HALFOPS" = "TRUE"; # SSL/TLS # "SSL_CERTFILE" = "EOFCONFIG_PREFIX/etc/ircd.pem"; # "SSL_KEYFILE" = "EOFCONFIG_PREFIX/etc/ircd.pem"; # "SSL_NOSSLv3" = "TRUE"; # CTCP versioning "CTCP_VERSIONING" = "FALSE"; }; 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" sed -i "s|EOFCONFIG_VHOST|$vhost|g" "$config_file" sed -i "s|EOFCONFIG_NETWORK|$network|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 " Domeniu rețea [underchat.org]: " network_name network_name=${network_name:-underchat.org} read -p " Nume server [ns1.${network_name}]: " server_name server_name=${server_name:-ns1.${network_name}} read -p " Descriere server [The ${network_name} Network]: " server_desc server_desc=${server_desc:-The ${network_name} Network} read -p " Virtual Host / IP [127.0.0.1]: " vhost_ip vhost_ip=${vhost_ip:-127.0.0.1} 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@${network_name}]: " admin_contact admin_contact=${admin_contact:-admin@${network_name}} else server_name=$(grep 'name = "' "$CONFIG_FILE" 2>/dev/null | head -1 | cut -d'"' -f2) server_name=${server_name:-localhost.localdomain} vhost_ip="127.0.0.1" network_name="underchat.org" fi generate_config "$conf_file" "$server_name" "$server_desc" "$server_numeric" "$admin_location" "$admin_contact" "$vhost_ip" "$network_name" 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 "$@"