ircu2/fix-config.sh

389 lines
11 KiB
Bash

#!/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"