#!/bin/bash # # Script de remediere probleme configurare UnderChat IRCd # Limba: Română # # Culori ROSU='\033[0;31m' VERDE='\033[0;32m' GALBEN='\033[1;33m' ALBASTRU='\033[0;34m' NC='\033[0m' log_info() { echo -e "${ALBASTRU}[INFO]${NC} $1"; } log_success() { echo -e "${VERDE}[SUCCES]${NC} $1"; } log_warn() { echo -e "${GALBEN}[AVERTIZARE]${NC} $1"; } log_error() { echo -e "${ROSU}[EROARE]${NC} $1"; } echo -e "${ALBASTRU}" echo "════════════════════════════════════════" echo " Remediere Probleme Configurare IRCd" echo "════════════════════════════════════════" echo -e "${NC}" # Detectează directorul PREFIX if [ -n "$1" ]; then PREFIX="$1" elif [ -d "$HOME/ircd" ]; then PREFIX="$HOME/ircd" elif [ -d "/home/ircd/ircd" ]; then PREFIX="/home/ircd/ircd" else log_error "Nu pot detecta directorul IRCd!" echo "Utilizare: $0 [PREFIX_PATH]" echo "Exemplu: $0 /home/ircd/ircd" exit 1 fi log_info "Folosesc PREFIX: $PREFIX" # Pas 1: Verifică și corectează structura directoarelor log_info "Pas 1: Verificare structură directoare..." if [ ! -d "$PREFIX/etc" ]; then log_warn "Directorul $PREFIX/etc nu există, îl creez..." mkdir -p "$PREFIX/etc" fi if [ ! -d "$PREFIX/lib" ]; then log_warn "Directorul $PREFIX/lib nu există, îl creez..." mkdir -p "$PREFIX/lib" fi # Verifică dacă config-ul e în lib în loc de etc CONFIG_ETC="$PREFIX/etc/ircd.conf" CONFIG_LIB="$PREFIX/lib/ircd.conf" if [ -f "$CONFIG_LIB" ] && [ ! -f "$CONFIG_ETC" ]; then log_warn "Configurația este în lib/ în loc de etc/, o mut..." mv "$CONFIG_LIB" "$CONFIG_ETC" log_success "Mutat $CONFIG_LIB -> $CONFIG_ETC" elif [ -f "$CONFIG_LIB" ] && [ -f "$CONFIG_ETC" ]; then log_warn "Configurația există în ambele locuri, verific care e mai nouă..." if [ "$CONFIG_LIB" -nt "$CONFIG_ETC" ]; then log_info "Versiunea din lib/ e mai nouă, o copiez în etc/" cp "$CONFIG_LIB" "$CONFIG_ETC.backup.$(date +%s)" mv "$CONFIG_LIB" "$CONFIG_ETC" else log_info "Versiunea din etc/ e mai nouă, șterg duplicatul din lib/" rm "$CONFIG_LIB" fi fi if [ ! -f "$CONFIG_ETC" ]; then log_error "Fișierul de configurare nu există: $CONFIG_ETC" log_info "Generez o configurație minimă..." cat > "$CONFIG_ETC" << 'EOF' General { name = "localhost.localdomain"; description = "UnderChat IRCd Server"; numeric = 1; vhost = "127.0.0.1"; }; Admin { Location = "UnderChat Network"; Location = "Romania"; Contact = "admin@underchat.ro"; }; Class { name = "Other"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 100; usermode = "+ix"; }; Client { host = "*@*"; ip = "*@*"; class = "Other"; maxlinks = 6; }; Port { port = 6667; vhost = "127.0.0.1"; hidden = yes; }; Operator { name = "AdminRoot"; password = "$PLAIN$password"; host = "*@*"; class = "Other"; }; features { "NETWORK" = "underchat.org"; "DOMAINNAME" = "underchat.org"; "HOST_HIDING" = "TRUE"; "HOST_HIDING_STYLE" = "3"; "HIDDEN_HOST" = "users.underchat.org"; "HIDDEN_IP" = "127.0.0.1"; "HIDDEN_HOSTTYPE" = "3"; "CPATH" = "$PREFIX/etc/ircd.conf"; "MPATH" = "$PREFIX/etc/ircd.motd"; "RPATH" = "$PREFIX/etc/remote.motd"; "PPATH" = "$PREFIX/var/ircd.pid"; }; EOF log_success "Configurație minimă generată: $CONFIG_ETC" fi # Pas 2: Identifică eroarea pe linia 126 log_info "Pas 2: Verificare syntaxă configurație..." if command -v "$PREFIX/bin/ircd" >/dev/null 2>&1; then log_info "Test syntaxă cu ircd -k..." # Salvează output-ul pentru analiză SYNTAX_CHECK=$("$PREFIX/bin/ircd" -k -f "$CONFIG_ETC" 2>&1) SYNTAX_EXIT=$? if [ $SYNTAX_EXIT -eq 0 ]; then log_success "Sintaxa configurației este corectă!" else log_error "Erori de sintaxă detectate:" echo "$SYNTAX_CHECK" # Încearcă să identifice linia problematică if echo "$SYNTAX_CHECK" | grep -q "line [0-9]*"; then ERROR_LINE=$(echo "$SYNTAX_CHECK" | grep -o "line [0-9]*" | grep -o "[0-9]*") log_warn "Eroare pe linia $ERROR_LINE, verific..." # Arată contextul erorii log_info "Context linia $ERROR_LINE:" sed -n "$((ERROR_LINE-2)),$((ERROR_LINE+2))p" "$CONFIG_ETC" | nl -ba -v$((ERROR_LINE-2)) fi fi else log_warn "Binarul ircd nu găsit, sar peste testul sintaxă" fi # Pas 3: Verifică și corectează probleme comune log_info "Pas 3: Corectare probleme comune configurație..." # Backup configurația cp "$CONFIG_ETC" "$CONFIG_ETC.backup.$(date +%s)" log_success "Backup creat: $CONFIG_ETC.backup.$(date +%s)" # Corectări comune: log_info "Aplicare corectări comune..." # 1. Șterge linii goale multiple sed -i '/^$/N;/^\n$/d' "$CONFIG_ETC" # 2. Corectează spațiile în jurul = sed -i 's/[[:space:]]*=[[:space:]]*/ = /g' "$CONFIG_ETC" # 3. Corectează placeholder-urile neînlocuite log_info "Corectez placeholder-urile EOFCONFIG..." sed -i "s|EOFCONFIG_PREFIX|$PREFIX|g" "$CONFIG_ETC" sed -i "s|EOFCONFIG_NETWORK|underchat.org|g" "$CONFIG_ETC" sed -i "s|\\.EOFCONFIG_NETWORK|.underchat.org|g" "$CONFIG_ETC" sed -i "s|\\*\\.EOFCONFIG_NETWORK|*.underchat.org|g" "$CONFIG_ETC" # Corectare specială pentru EOFCONFIG_CLIENT_PORTS if grep -q "EOFCONFIG_CLIENT_PORTS" "$CONFIG_ETC"; then log_warn "EOFCONFIG_CLIENT_PORTS găsit - îl înlocuiesc cu blocuri Port..." CLIENT_PORTS_BLOCK='# Porturi publice pentru clienți Port { vhost = "127.0.0.1" 6660; hidden = yes; }; Port { vhost = "127.0.0.1" 6661; hidden = yes; }; Port { vhost = "127.0.0.1" 6662; hidden = yes; }; Port { vhost = "127.0.0.1" 6663; hidden = yes; }; Port { vhost = "127.0.0.1" 6664; hidden = yes; }; Port { vhost = "127.0.0.1" 6665; hidden = yes; }; Port { vhost = "127.0.0.1" 6666; hidden = yes; }; Port { vhost = "127.0.0.1" 6667; hidden = yes; }; Port { vhost = "127.0.0.1" 6668; hidden = yes; }; Port { vhost = "127.0.0.1" 6669; hidden = yes; }; Port { vhost = "127.0.0.1" 7000; hidden = yes; };' awk -v replacement="$CLIENT_PORTS_BLOCK" ' /EOFCONFIG_CLIENT_PORTS/ {print replacement; next} {print} ' "$CONFIG_ETC" > "$CONFIG_ETC.tmp" && mv "$CONFIG_ETC.tmp" "$CONFIG_ETC" log_success "EOFCONFIG_CLIENT_PORTS înlocuit cu blocurile Port" fi # Corectare specială pentru EOFCONFIG_SSL_PORTS if grep -q "EOFCONFIG_SSL_PORTS" "$CONFIG_ETC"; then log_warn "EOFCONFIG_SSL_PORTS găsit - îl înlocuiesc cu blocuri SSL..." SSL_PORTS_BLOCK='# Porturi SSL/TLS pentru clienți Port { vhost = "127.0.0.1" 6697; ssl = yes; hidden = yes; }; Port { vhost = "127.0.0.1" 9999; ssl = yes; hidden = yes; };' awk -v replacement="$SSL_PORTS_BLOCK" ' /EOFCONFIG_SSL_PORTS/ {print replacement; next} {print} ' "$CONFIG_ETC" > "$CONFIG_ETC.tmp" && mv "$CONFIG_ETC.tmp" "$CONFIG_ETC" log_success "EOFCONFIG_SSL_PORTS înlocuit cu blocurile SSL" fi # 4. Verifică și corectează setările de host hiding log_info "Verificare și corectare host hiding..." # Verifică dacă HOST_HIDING_STYLE există if ! grep -q '"HOST_HIDING_STYLE"' "$CONFIG_ETC"; then log_warn "HOST_HIDING_STYLE lipsește, îl adaug..." # Adaugă după HOST_HIDING = TRUE sed -i '/"HOST_HIDING" = "TRUE"/a\ "HOST_HIDING_STYLE" = "3";' "$CONFIG_ETC" else # Actualizează la versiunea 3 pentru format hexadecimal sed -i 's/"HOST_HIDING_STYLE" = "[^"]*"/"HOST_HIDING_STYLE" = "3"/' "$CONFIG_ETC" log_warn "HOST_HIDING_STYLE actualizat la 3 (format hexadecimal)" fi # Verifică dacă HIDDEN_IP există if ! grep -q '"HIDDEN_IP"' "$CONFIG_ETC"; then log_warn "HIDDEN_IP lipsește, îl adaug..." # Adaugă după HIDDEN_HOST sed -i '/"HIDDEN_HOST" = /a\ "HIDDEN_IP" = "127.0.0.1";' "$CONFIG_ETC" fi # Verifică dacă HIDDEN_HOSTTYPE există (necesar pentru format hexadecimal) if ! grep -q '"HIDDEN_HOSTTYPE"' "$CONFIG_ETC"; then log_warn "HIDDEN_HOSTTYPE lipsește, îl adaug pentru format hexadecimal..." # Adaugă după HIDDEN_IP sed -i '/"HIDDEN_IP" = "127.0.0.1"/a\ "HIDDEN_HOSTTYPE" = "3";' "$CONFIG_ETC" fi # Verifică dacă CPATH există în features if ! grep -q '"CPATH"' "$CONFIG_ETC"; then log_warn "CPATH lipsește din features, îl adaug..." # Adaugă în secțiunea features sed -i '/features {/a\ "CPATH" = "'$PREFIX'/etc/ircd.conf";' "$CONFIG_ETC" fi # Verifică și adaugă setări pentru notificări WHOIS la operatori if ! grep -q '"SPY_WHOIS"' "$CONFIG_ETC"; then log_warn "Setări WHOIS pentru operatori lipsesc, le adaug..." sed -i '/WHOIS_NOTICE.*TRUE/a\ "SPY_WHOIS" = "TRUE";\n "SNOMASK_OPERDEFAULT" = "1024";\n "SNOMASK_DEFAULT" = "1024";' "$CONFIG_ETC" fi # Verifică dacă operatorii au privilegiile WHOIS_NOTICE if ! grep -q 'PRIV_WHOIS_NOTICE' "$CONFIG_ETC"; then log_warn "Privilegii WHOIS pentru operatori lipsesc, le adaug..." sed -i '/admin = yes/a\ snomask = "+HACK,THROTTLE,OLDSNO,NETWORK,OPERKILL,GLINE";\n privileges = "PRIV_WHOIS_NOTICE", "PRIV_HIDE_OPER", "PRIV_ADMIN";' "$CONFIG_ETC" fi # 5. Verifică și corectează modul utilizatorilor în clasa Other if grep -q 'usermode = "+i"' "$CONFIG_ETC"; then log_warn "Corectez usermode pentru clasa Other: +i -> +ix" sed -i 's/usermode = "+i"/usermode = "+ix"/' "$CONFIG_ETC" fi # 6. Verifică ghilimelele if grep -n '[^"]"[^"]' "$CONFIG_ETC" >/dev/null; then log_warn "Posibile probleme cu ghilimele găsite" grep -n '[^"]"[^"]' "$CONFIG_ETC" fi # 7. Verifică acoladele OPEN_BRACES=$(grep -o '{' "$CONFIG_ETC" | wc -l) CLOSE_BRACES=$(grep -o '}' "$CONFIG_ETC" | wc -l) if [ "$OPEN_BRACES" -ne "$CLOSE_BRACES" ]; then log_error "Acolade necorect balansate: $OPEN_BRACES deschise, $CLOSE_BRACES închise" else log_success "Acolade corect balansate: $OPEN_BRACES perechi" fi # Pas 4: Setează permisiuni log_info "Pas 4: Setare permisiuni..." chmod 600 "$CONFIG_ETC" chown $(whoami):$(whoami) "$CONFIG_ETC" 2>/dev/null || true log_success "Permisiuni setate: 600 pe $CONFIG_ETC" # Pas 5: Test final log_info "Pas 5: Test final configurație..." if [ -x "$PREFIX/bin/ircd" ]; then FINAL_TEST=$("$PREFIX/bin/ircd" -k -f "$CONFIG_ETC" 2>&1) FINAL_EXIT=$? if [ $FINAL_EXIT -eq 0 ]; then echo -e "${VERDE}" echo "════════════════════════════════════════" echo " ✓ CONFIGURAȚIA A FOST REPARATĂ!" echo "════════════════════════════════════════" echo -e "${NC}" log_success "Configurația este acum validă" log_info "Poți porni serverul cu: $PREFIX/bin/ircd -f $CONFIG_ETC" else log_error "Configurația încă are erori:" echo "$FINAL_TEST" echo "" log_warn "Încearcă să regenerezi configurația cu ./install.sh" fi else log_warn "Nu pot testa configurația (ircd nu găsit)" log_info "Verifică manual cu: $PREFIX/bin/ircd -k -f $CONFIG_ETC" fi echo "" log_info "Locația configurației corecte: $CONFIG_ETC" log_info "Pentru editare: nano $CONFIG_ETC"