#!/bin/bash # # Script COMPLET de diagnostic, curățare și instalare pentru Madrid Server # Rulează direct pe server: bash fix-and-install-madrid.sh # Versiune: v1.0.6-madrid-final # set -e # Culori ROSU='\033[0;31m' VERDE='\033[0;32m' GALBEN='\033[1;33m' ALBASTRU='\033[0;34m' NC='\033[0m' log_info() { echo -e "${VERDE}[INFO]${NC} $1"; } log_success() { echo -e "${VERDE}[✓]${NC} $1"; } log_warn() { echo -e "${GALBEN}[!]${NC} $1"; } log_error() { echo -e "${ROSU}[✗]${NC} $1"; } clear echo -e "${ALBASTRU}" cat << "EOF" ╔════════════════════════════════════════════════════╗ ║ UnderChat IRCd - Serverul Madrid ║ ║ Script de Instalare v1.1.0-madrid-stabil ║ ║ Gestionare inteligentă a instalării ║ ╚════════════════════════════════════════════════════╝ EOF echo -e "${NC}" echo "" # =================================================================== # PARTEA 1: DIAGNOSTIC ȘI PREGĂTIRE # =================================================================== log_info "PARTEA 1/3: Diagnostic și pregătire sistem..." echo "" # Oprește procese IRCd active log_info "Oprire procese IRCd active..." if pgrep -x ircd > /dev/null; then log_warn "Găsit proces IRCd activ, oprire..." pkill -15 ircd 2>/dev/null || true sleep 2 # Dacă încă rulează, forțează oprirea if pgrep -x ircd > /dev/null; then log_warn "Forțare oprire proces..." pkill -9 ircd 2>/dev/null || true sleep 1 fi log_success "Procese IRCd oprite" else log_info "Niciun proces IRCd activ" fi # Verifică dependențe necesare log_info "Verificare dependențe de compilare..." DEPENDENTE_LIPSA=() if ! command -v gcc &> /dev/null; then DEPENDENTE_LIPSA+=("gcc") fi if ! command -v make &> /dev/null; then DEPENDENTE_LIPSA+=("make") fi if ! command -v git &> /dev/null; then DEPENDENTE_LIPSA+=("git") fi if [ ${#DEPENDENTE_LIPSA[@]} -gt 0 ]; then log_error "Dependențe lipsă: ${DEPENDENTE_LIPSA[*]}" log_error "Instalează cu: sudo apt-get install build-essential git" exit 1 fi log_success "Toate dependențele sunt instalate" echo "" log_success "✓ PARTEA 1 COMPLETĂ: Sistem pregătit pentru instalare" echo "" # =================================================================== # PARTEA 2: OBȚINERE SURSĂ ȘI COMPILARE # =================================================================== log_info "PARTEA 2/3: Obținere cod sursă și compilare..." echo "" # Determină directorul de lucru DIR_SURSA="$HOME/ircu2" # Verifică dacă repository-ul există deja if [ -d "$DIR_SURSA/.git" ]; then log_info "Repository existent găsit în $DIR_SURSA" cd "$DIR_SURSA" # Verifică dacă sunt modificări locale if ! git diff-index --quiet HEAD -- 2>/dev/null; then log_warn "Există modificări locale nesalvate" log_info "Păstrarea modificărilor locale și actualizare..." git stash push -m "Salvare automată înainte de actualizare - $(date '+%Y-%m-%d %H:%M:%S')" || true fi # Actualizează repository-ul log_info "Actualizare repository din GitLab..." if git pull origin master 2>/dev/null || git pull origin main 2>/dev/null; then log_success "Repository actualizat" # Restaurează modificările locale dacă au fost salvate if git stash list | grep -q "Salvare automată"; then log_info "Restaurare modificări locale..." git stash pop || log_warn "Nu s-au putut restaura toate modificările" fi else log_warn "Nu s-a putut actualiza repository-ul, continuăm cu versiunea existentă" fi else log_info "Clonare repository UnderChat IRCd..." cd ~ if [ -d "$DIR_SURSA" ]; then log_warn "Director $DIR_SURSA există dar nu e repository git, ștergere..." rm -rf "$DIR_SURSA" fi if ! git clone https://gitlab.back.ro/underchat/ircu2.git; then log_error "Eșec la clonarea repository-ului!" log_error "Verifică conexiunea la internet și accesul la GitLab" exit 1 fi cd "$DIR_SURSA" log_success "Repository clonat cu succes" fi # Gestionare arhitectură sistem log_info "Detectare arhitectură sistem: $(uname -m)" ARHITECTURA=$(uname -m) if [ "$ARHITECTURA" = "aarch64" ] || [ "$ARHITECTURA" = "arm64" ]; then log_warn "Arhitectură ARM64 detectată - actualizare fișiere config necesară" # Verifică dacă config.guess poate recunoaște arhitectura if ! ./config.guess &>/dev/null; then log_info "Descărcare fișiere config actualizate pentru ARM64..." if command -v wget &>/dev/null; then wget -q -O config.guess.new 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' && \ wget -q -O config.sub.new 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' if [ -f config.guess.new ] && [ -s config.guess.new ]; then mv config.guess.new config.guess mv config.sub.new config.sub chmod +x config.guess config.sub log_success "Fișiere config actualizate pentru ARM64" fi elif command -v curl &>/dev/null; then curl -sL -o config.guess.new 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' && \ curl -sL -o config.sub.new 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' if [ -f config.guess.new ] && [ -s config.guess.new ]; then mv config.guess.new config.guess mv config.sub.new config.sub chmod +x config.guess config.sub log_success "Fișiere config actualizate pentru ARM64" fi else log_warn "wget/curl indisponibile - folosesc flag --build explicit" fi fi fi # Pregătire pentru compilare log_info "Configurare parametri compilare..." PREFIX="$HOME/ircd" CONFIGURE_FLAGS="--prefix=$PREFIX --with-maxcon=4096" # Adaugă parametri specifici pentru ARM64 if [ "$ARHITECTURA" = "aarch64" ] || [ "$ARHITECTURA" = "arm64" ]; then CONFIGURE_FLAGS="$CONFIGURE_FLAGS --build=aarch64-unknown-linux-gnu" log_info "Parametri ARM64: $CONFIGURE_FLAGS" fi # Rulează configure log_info "Configurare pentru compilare (./configure)..." if ! ./configure $CONFIGURE_FLAGS 2>&1 | tee configure.log; then log_error "Eșec la configurare!" log_error "Ultimele linii din log:" tail -n 20 configure.log exit 1 fi log_success "Configurare completă" # Curățare compilări anterioare log_info "Curățare fișiere compilate anterior..." make clean &>/dev/null || true # Compilare log_info "Compilare cod sursă (make)..." log_info "Acest pas poate dura câteva minute..." NUMAR_PROCESOARE=$(nproc 2>/dev/null || echo "2") if ! make -j"$NUMAR_PROCESOARE" 2>&1 | tee make.log; then log_error "Eșec la compilare!" log_error "Ultimele linii din log:" tail -n 30 make.log exit 1 fi log_success "Compilare completă" # Instalare binare log_info "Instalare binare în $PREFIX..." if ! make install 2>&1 | tee install.log; then log_error "Eșec la instalare!" log_error "Verifică permisiunile pentru $PREFIX" exit 1 fi log_success "Binare instalate" # Verifică că binarul a fost instalat corect if [ ! -f "$PREFIX/bin/ircd" ]; then log_error "Binarul ircd nu a fost găsit în $PREFIX/bin/ircd!" exit 1 fi if [ ! -x "$PREFIX/bin/ircd" ]; then log_error "Binarul ircd nu are permisiuni de execuție!" chmod +x "$PREFIX/bin/ircd" log_success "Permisiuni de execuție setate" fi echo "" log_success "✓ PARTEA 2 COMPLETĂ: Compilare și instalare reușită" echo "" # =================================================================== # PARTEA 3: GENERARE CONFIGURAȚIE MADRID # =================================================================== log_info "PARTEA 3/3: Generare configurație Madrid..." echo "" PREFIX="$HOME/ircd" NETWORK_NAME="UnderChat.org" SERVER_NAME="Madrid.ES.EU.UnderChat.org" VHOST_IPV4="10.0.0.125" OPERATOR_NAME="Raducu" OPERATOR_PASS="muiesteaua" # Creare structură directoare log_info "Creare structură directoare..." mkdir -p "$PREFIX/lib" mkdir -p "$PREFIX/etc" mkdir -p "$PREFIX/log" mkdir -p "$PREFIX/var" log_success "Directoare create" # Găsește fișierul example.conf EXAMPLE_CONF="" if [ -f "$DIR_SURSA/doc/example.conf" ]; then EXAMPLE_CONF="$DIR_SURSA/doc/example.conf" elif [ -f "$HOME/ircu2/doc/example.conf" ]; then EXAMPLE_CONF="$HOME/ircu2/doc/example.conf" elif [ -f "doc/example.conf" ]; then EXAMPLE_CONF="doc/example.conf" fi if [ -z "$EXAMPLE_CONF" ] || [ ! -f "$EXAMPLE_CONF" ]; then log_error "Nu s-a găsit fișierul example.conf!" log_error "Căutat în: $DIR_SURSA/doc/example.conf" exit 1 fi log_info "Folosesc șablon: $EXAMPLE_CONF" # Verifică dacă configurația există deja FISIER_CONFIG="$PREFIX/lib/ircd.conf" if [ -f "$FISIER_CONFIG" ]; then log_warn "Configurație existentă găsită în $FISIER_CONFIG" BACKUP_CONFIG="$FISIER_CONFIG.backup-$(date +%Y%m%d-%H%M%S)" cp "$FISIER_CONFIG" "$BACKUP_CONFIG" log_info "Backup creat: $BACKUP_CONFIG" fi # Copiază example.conf ca punct de plecare log_info "Generare configurație Madrid..." cp "$EXAMPLE_CONF" "$FISIER_CONFIG" # Funcție pentru înlocuire sigură în configurație inlocuieste_in_config() { local PATTERN="$1" local REPLACE="$2" local DESCRIERE="$3" if sed -i.tmp "$PATTERN" "$FISIER_CONFIG" 2>/dev/null; then rm -f "$FISIER_CONFIG.tmp" log_info " ✓ $DESCRIERE" return 0 else log_warn " ⚠ Nu s-a putut actualiza: $DESCRIERE" rm -f "$FISIER_CONFIG.tmp" return 1 fi } log_info "Personalizare configurație pentru Madrid..." # Actualizare nume server inlocuieste_in_config \ 's/^[[:space:]]*name[[:space:]]*=[[:space:]]*"[^"]*";/ name = "'"$SERVER_NAME"'";/' \ "Nume server: $SERVER_NAME" # Actualizare vhost inlocuieste_in_config \ 's/^[[:space:]]*vhost[[:space:]]*=[[:space:]]*"[^"]*";/ vhost = "'"$VHOST_IPV4"'";/g' \ "VHost IPv4: $VHOST_IPV4" # Actualizare descriere inlocuieste_in_config \ 's/^[[:space:]]*description[[:space:]]*=[[:space:]]*"[^"]*";/ description = "The UnderChat.org Network - Madrid Node";/' \ "Descriere server" # Actualizare feature NETWORK inlocuieste_in_config \ 's/"NETWORK"[[:space:]]*=[[:space:]]*"[^"]*"/"NETWORK" = "'"$NETWORK_NAME"'"/' \ "Feature NETWORK" # Actualizare feature DOMAINNAME inlocuieste_in_config \ 's/"DOMAINNAME"[[:space:]]*=[[:space:]]*"[^"]*"/"DOMAINNAME" = "'"$NETWORK_NAME"'"/' \ "Feature DOMAINNAME" # Actualizare căi fișiere inlocuieste_in_config \ 's|/path/to|'"$PREFIX"'|g' \ "Căi generale" inlocuieste_in_config \ 's|"MPATH"[[:space:]]*=[[:space:]]*"[^"]*"|"MPATH" = "'"$PREFIX"'/lib/ircd.motd"|' \ "Cale MOTD" inlocuieste_in_config \ 's|"CPATH"[[:space:]]*=[[:space:]]*"[^"]*"|"CPATH" = "'"$PREFIX"'/lib/ircd.conf"|' \ "Cale configurație" inlocuieste_in_config \ 's|"PPATH"[[:space:]]*=[[:space:]]*"[^"]*"|"PPATH" = "'"$PREFIX"'/var/ircd.pid"|' \ "Cale PID" # Actualizare cale log - mai complexă if grep -q '"LOG"' "$FISIER_CONFIG"; then inlocuieste_in_config \ 's|"LOG"[[:space:]]*=[[:space:]]*"SYSTEM"[[:space:]]*"FILE"[[:space:]]*"[^"]*"|"LOG" = "SYSTEM" "FILE" "'"$PREFIX"'/log/ircd.log"|' \ "Cale fișier log" fi # Configurare operator Raducu log_info "Configurare operator: $OPERATOR_NAME" # Găsește prima secțiune Operator și înlocuiește-o if grep -q "^Operator[[:space:]]*{" "$FISIER_CONFIG"; then # Folosește perl pentru înlocuire multi-linie dacă e disponibil if command -v perl &>/dev/null; then perl -i.bak -0pe 's/Operator\s*\{[^}]*\}/Operator {\n name = "'"$OPERATOR_NAME"'";\n password = "\$PLAIN\$'"$OPERATOR_PASS"'";\n host = "*@*";\n class = "Opers";\n admin = yes;\n hide_oper = no;\n hide_channels = no;\n snomask = "+s";\n privileges = "PRIV_WHOIS_NOTICE", "PRIV_HIDE_OPER", "PRIV_ADMIN";\n};/s' "$FISIER_CONFIG" 2>/dev/null && rm -f "$FISIER_CONFIG.bak" log_info " ✓ Operator configurat" else log_warn " ⚠ Perl nu e disponibil, configurare manuală necesară pentru operator" fi else # Adaugă secțiunea Operator dacă nu există cat >> "$FISIER_CONFIG" < "$PREFIX/lib/ircd.motd" <<'MOTD_FINAL' ╔═══════════════════════════════════════╗ ║ Bine venit pe UnderChat IRCd! ║ ║ Madrid.ES.EU.UnderChat.org ║ ║ ║ ║ Versiune: v1.1.0-madrid-stabil ║ ║ ║ ║ Pentru suport: #support ║ ║ Website: https://underchat.org ║ ╚═══════════════════════════════════════╝ 🌟 UnderChat Network - Nod Madrid • Protecție identitate utilizatori (host hiding) • Protecție anti-spam și anti-flood • Canale cu moduri și opțiuni diverse Distracție plăcută pe UnderChat! 🎉 MOTD_FINAL log_success "MOTD generat" # Setare permisiuni log_info "Setare permisiuni fișiere..." chmod 600 "$FISIER_CONFIG" chmod 644 "$PREFIX/lib/ircd.motd" # Copiere fișiere în directorul etc (backup) cp "$PREFIX/lib/ircd.motd" "$PREFIX/etc/ircd.motd" 2>/dev/null || true cp "$FISIER_CONFIG" "$PREFIX/etc/ircd.conf" 2>/dev/null || true log_success "Permisiuni setate" # Verificare sintaxă configurație log_info "Verificare sintaxă configurație..." if [ ! -f "$PREFIX/bin/ircd" ]; then log_error "Binarul ircd nu există în $PREFIX/bin/ircd!" exit 1 fi # Test sintaxă cu timeout pentru a evita blocarea log_info "Rulare test configurație..." if timeout 10 "$PREFIX/bin/ircd" -c -f "$FISIER_CONFIG" 2>&1 | tee "$PREFIX/log/config-test.log"; then log_success "✓ Sintaxa configurației este CORECTĂ!" else REZULTAT_TEST=$? if [ $REZULTAT_TEST -eq 124 ]; then log_warn "⚠ Testul configurației a depășit timeout-ul (posibil OK)" else log_error "✗ EROARE în configurație!" echo "" echo "Detalii eroare în: $PREFIX/log/config-test.log" echo "" echo "Rulează manual pentru diagnostic:" echo " $PREFIX/bin/ircd -c -f $FISIER_CONFIG" exit 1 fi fi echo "" log_success "✓ PARTEA 3 COMPLETĂ: Configurație Madrid validată" echo "" # =================================================================== # FINALIZARE ȘI INSTRUCȚIUNI # =================================================================== echo -e "${VERDE}" cat << "EOF" ╔════════════════════════════════════════════════════╗ ║ ✓✓✓ INSTALARE MADRID COMPLETĂ CU SUCCES! ✓✓✓ ║ ╚════════════════════════════════════════════════════╝ EOF echo -e "${NC}" echo "" echo -e "${ALBASTRU}═══ CONFIGURAȚIE MADRID ═══${NC}" echo " Server: Madrid.ES.EU.UnderChat.org" echo " IP: 10.0.0.125" echo " Port: 6667" echo " Operator: Raducu / muiesteaua" echo " Config: $PREFIX/lib/ircd.conf" echo "" echo -e "${ALBASTRU}═══ PORNIRE SERVER ═══${NC}" echo " Pornește acum:" echo -e " ${VERDE}$PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf${NC}" echo "" echo " SAU pornire în fundal (background):" echo -e " ${VERDE}nohup $PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf &${NC}" echo "" echo -e "${ALBASTRU}═══ VERIFICARE ═══${NC}" echo " Verifică că serverul rulează:" echo -e " ${VERDE}ps aux | grep ircd${NC}" echo "" echo " Verifică porturile deschise:" echo -e " ${VERDE}netstat -tlnp | grep -E '(6667|4400)'${NC}" echo "" echo " Verifică fișierul de log:" echo -e " ${VERDE}tail -f $PREFIX/log/ircd.log${NC}" echo "" echo -e "${ALBASTRU}═══ CONECTARE ═══${NC}" echo " Cu client IRC:" echo " Server: Madrid.ES.EU.UnderChat.org (sau 10.0.0.125)" echo " Port: 6667" echo "" echo " Autentificare ca operator:" echo " /oper Raducu muiesteaua" echo "" echo -e "${VERDE}🎉 Distracție plăcută pe UnderChat Network! 🎉${NC}" echo "" # Întreabă dacă să pornească serverul automat echo "" read -p "Dorești să pornesc serverul ACUM? [D/n] (Da/nu): " pornire_acum pornire_acum=${pornire_acum:-D} if [[ "$pornire_acum" =~ ^[DdYy]$ ]]; then echo "" log_info "Pornire server IRCd cu configurația Madrid..." # Verifică dacă există deja un proces if pgrep -x ircd > /dev/null; then log_warn "Un proces IRCd rulează deja!" ps aux | grep "[i]rcd" echo "" read -p "Dorești să-l opresc și să pornesc unul nou? [D/n]: " opreste_si_porneste opreste_si_porneste=${opreste_si_porneste:-D} if [[ "$opreste_si_porneste" =~ ^[DdYy]$ ]]; then log_info "Oprire proces existent..." pkill -15 ircd 2>/dev/null || true sleep 2 if pgrep -x ircd > /dev/null; then pkill -9 ircd 2>/dev/null || true sleep 1 fi log_success "Proces oprit" else log_info "Păstrare proces existent, ieșire din script" exit 0 fi fi # Pornește serverul cu calea completă spre configurație log_info "Lansare proces ircd..." if "$PREFIX/bin/ircd" -f "$PREFIX/lib/ircd.conf"; then sleep 3 # Verifică dacă procesul rulează if pgrep -x ircd > /dev/null; then log_success "✓✓✓ SERVER PORNIT CU SUCCES! ✓✓✓" echo "" echo "Proces IRCd activ:" ps aux | grep "[i]rcd" echo "" log_success "Poți conecta la: Madrid.ES.EU.UnderChat.org:6667" echo "" # Verifică log-ul pentru eventuale avertismente if [ -f "$PREFIX/log/ircd.log" ]; then echo "Ultimele linii din log:" tail -n 10 "$PREFIX/log/ircd.log" fi else log_error "Serverul nu rulează după pornire!" echo "" log_error "Verifică log-urile pentru erori:" echo " tail -f $PREFIX/log/ircd.log" echo "" log_info "Sau rulează manual cu:" echo " $PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf" fi else log_error "Eșec la pornirea serverului!" echo "" log_error "Verifică configurația și încearcă manual:" echo " $PREFIX/bin/ircd -c -f $PREFIX/lib/ircd.conf # Test configurație" echo " $PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf # Pornire server" fi else echo "" log_info "OK! Pornește serverul manual când ești pregătit:" echo " $PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf" echo "" log_info "Sau în fundal:" echo " nohup $PREFIX/bin/ircd -f $PREFIX/lib/ircd.conf > $PREFIX/log/startup.log 2>&1 &" fi echo "" log_success "Script finalizat cu succes!" echo ""