#!/bin/bash # # Script helper pentru administrare UnderChat IRCd # Limba: Română # # Culori VERDE='\033[0;32m' GALBEN='\033[1;33m' ALBASTRU='\033[0;34m' ROSU='\033[0;31m' NC='\033[0m' PREFIX="${PREFIX:-$HOME/ircd}" IRCD_BIN="$PREFIX/bin/ircd" UMKPASSWD_BIN="$PREFIX/bin/umkpasswd" CONFIG_FILE="${PREFIX}/etc/ircd.conf" LOG_FILE="${PREFIX}/log/ircd.log" # Functie pentru remediere automata probleme configurare fix_config_issues() { echo -e "${ALBASTRU}" echo "╔════════════════════════════════════════╗" echo "║ Remediere Probleme Configurare ║" echo "╚════════════════════════════════════════╝" echo -e "${NC}" # Verifica daca fix-config.sh exista local fix_script="./fix-config.sh" if [ ! -f "$fix_script" ]; then # Cauta in directorul curent sau parent if [ -f "../fix-config.sh" ]; then fix_script="../fix-config.sh" else echo -e "${ROSU}[EROARE]${NC} Scriptul fix-config.sh nu a fost gasit!" echo "Descarca scriptul de pe repository sau ruleaza manual remedierile." echo "" echo "Presează Enter pentru a continua..." read -r return 1 fi fi echo -e "${GALBEN}[INFO]${NC} Lansez remediere automata..." echo "" # Ruleaza scriptul de remediere bash "$fix_script" "$PREFIX" echo "" echo "Presează Enter pentru a continua..." read -r } # Meniu principal show_menu() { clear # Verifică dacă config există if [ ! -f "$CONFIG_FILE" ]; then echo -e "${ROSU}" echo "╔════════════════════════════════════════╗" echo "║ AVERTISMENT: Config nu găsit! ║" echo "╚════════════════════════════════════════╝" echo -e "${NC}" echo "" echo -e "${GALBEN}Fișierul de configurare nu există la:${NC}" echo " $CONFIG_FILE" echo "" echo -e "${GALBEN}Opțiuni:${NC}" echo " 1) Creare automat config standard" echo " 2) Remediere automata probleme configurare" echo " 3) Continue fără config (nu recomandat)" echo "" read -p "Alege [1-3]: " config_choice case "$config_choice" in 1) create_default_config ;; 2) fix_config_issues ;; 3) echo -e "${GALBEN}[AVERTIZARE]${NC} Continuă fără configurație validă..." ;; esac fi echo -e "${ALBASTRU}" echo "╔════════════════════════════════════════╗" echo "║ Administrator UnderChat IRCd ║" echo "║ Versiune: v1.0.3 ║" echo "╚════════════════════════════════════════╝" echo -e "${NC}" echo "" echo " Opțiuni disponibile:" echo " 1) Pornire server" echo " 2) Oprire server" echo " 3) Restart server" echo " 4) Verifica status" echo " 5) Editare configurare" echo " 6) Vizionare log-uri" echo " 7) Generare parola operator" echo " 8) Test sintaxă configurare" echo " 9) Remediere probleme configurare" echo " 10) Iesire" echo "" read -p "Alege opțiune [1-10]: " choice } # Funcție pentru creare config standard create_default_config() { echo -e "${ALBASTRU}[+] Creare config standard...${NC}" # Crează directoarele dacă nu există mkdir -p "$(dirname "$CONFIG_FILE")" mkdir -p "$PREFIX/log" mkdir -p "$PREFIX/var" # Crează un config de bază cat > "$CONFIG_FILE" << 'EOFCONFIG' # UnderChat IRCd - Configurare Standard # Generated automat - Please customize! General { name = "irc.underchat.org"; vhost = "127.0.0.1"; description = "UnderChat IRCd Server"; numeric = 1; dns server = "8.8.8.8"; dns server = "1.1.1.1"; }; Admin { Location = "UnderChat Network"; Location = "Underchat Edition"; Contact = "admin@underchat.org"; }; Class { name = "Server"; pingfreq = 1 minutes 30 seconds; connectfreq = 5 minutes; maxlinks = 1; sendq = 9000000; }; Class { name = "Local"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 100; usermode = "+iw"; }; Class { name = "Other"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 2048; usermode = "+ix"; }; Class { name = "Opers"; pingfreq = 1 minutes 30 seconds; sendq = 160000; maxlinks = 20; local = no; freeform = yes; show_invis = yes; see_chan = yes; usermode = "+W"; }; Client { host = "*@*"; ip = "*@*"; class = "Other"; maxlinks = 6; }; Jupe { 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"; nick = "ChanServ,NickServ"; }; Port { vhost = "127.0.0.1" 4400; server = yes; hidden = yes; }; Port { vhost = "127.0.0.1" 6667; hidden = yes; }; Port { vhost = "127.0.0.1" 6697; ssl = yes; hidden = yes; }; Operator { name = "root"; password = "$PLAIN$password"; host = "*@*"; class = "Opers"; admin = yes; }; features { "NETWORK" = "underchat.org"; "DOMAINNAME" = "underchat.org"; "LOG" = "SYSTEM" "FILE" "EOFCONFIG_PREFIX/log/ircd.log"; "LOG" = "SYSTEM" "LEVEL" "CRIT"; "HUB" = "FALSE"; "RELIABLE_CLOCK" = "FALSE"; "WALLOPS_OPER_ONLY" = "TRUE"; "HOST_HIDING" = "TRUE"; "HIDDEN_HOST" = "users.underchat.org"; "MAXCHANNELSPERUSER" = "60"; "NICKLEN" = "12"; "PINGFREQUENCY" = "120"; "SETHOST" = "TRUE"; }; EOFCONFIG # Setează permisiuni chmod 600 "$CONFIG_FILE" echo -e "${VERDE}[+] Config standard creat: $CONFIG_FILE${NC}" echo -e "${GALBEN}[!] IMPORTANT: Editează config și schimbă parola operator!${NC}" echo -e "${GALBEN} 1. Deschide config: nano $CONFIG_FILE${NC}" echo -e "${GALBEN} 2. Schimbă parola: $PREFIX/bin/umkpasswd${NC}" } # Pornire server start_server() { echo -e "${VERDE}[+] Pornire server...${NC}" echo "" # Verificări detaliate ale fișierului de configurare echo -e "${GALBEN}[*] Verificare fișier configurare...${NC}" if [ ! -f "$CONFIG_FILE" ]; then echo -e "${ROSU}[-] Config nu găsit la: $CONFIG_FILE${NC}" echo -e "${GALBEN}[!] Creează config cu admin.sh opțiune 5${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Fișier există: $CONFIG_FILE${NC}" # Verifică permisiuni de citire if [ ! -r "$CONFIG_FILE" ]; then echo -e "${ROSU}[-] Fișier există dar nu poate fi citit!${NC}" echo -e "${GALBEN}[*] Permisiuni curente:${NC}" ls -la "$CONFIG_FILE" echo "" echo -e "${GALBEN}[!] Rulează: chmod 600 $CONFIG_FILE${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Permisiuni OK (poate fi citit)${NC}" # Verifică dacă fișierul nu este gol if [ ! -s "$CONFIG_FILE" ]; then echo -e "${ROSU}[-] Fișier de configurare este gol!${NC}" echo -e "${GALBEN}[!] Regenerează config cu admin.sh opțiune 5${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Fișier nu este gol ($(stat -f%z "$CONFIG_FILE" 2>/dev/null || stat -c%s "$CONFIG_FILE" 2>/dev/null) bytes)${NC}" # Verifică directorul de log local log_dir=$(dirname "$LOG_FILE") if [ ! -d "$log_dir" ]; then echo -e "${GALBEN}[*] Creare director log: $log_dir${NC}" mkdir -p "$log_dir" fi # Verifică executabilul echo "" echo -e "${GALBEN}[*] Verificare executabil...${NC}" if [ ! -f "$IRCD_BIN" ]; then echo -e "${ROSU}[-] Executabil ircd nu găsit la: $IRCD_BIN${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi if ! [ -x "$IRCD_BIN" ]; then echo -e "${ROSU}[-] Executabil există dar nu are permisiuni de execuție!${NC}" echo -e "${GALBEN}[!] Rulează: chmod +x $IRCD_BIN${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Executabil OK: $IRCD_BIN${NC}" # Verifica dacă e deja pornit echo "" echo -e "${GALBEN}[*] Verificare proces existent...${NC}" if pgrep -f "$IRCD_BIN" > /dev/null; then echo -e "${ROSU}[-] Server deja pornit!${NC}" echo -e "${GALBEN}[*] PID: $(pgrep -f "$IRCD_BIN")${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Niciun proces activ${NC}" # Porneste server în background echo "" echo -e "${VERDE}[+] Pornire server IRCd...${NC}" echo -e "${GALBEN}[*] Comandă: $IRCD_BIN -f $CONFIG_FILE${NC}" nohup "$IRCD_BIN" -f "$CONFIG_FILE" > "$LOG_FILE" 2>&1 & local ircd_pid=$! echo -e "${GALBEN}[*] Așteptare inițializare (2 secunde)...${NC}" sleep 2 # Verifică dacă procesul rulează if pgrep -f "$IRCD_BIN" > /dev/null; then echo "" echo -e "${VERDE}[+] ✓ Server pornit cu succes!${NC}" echo -e "${VERDE}[+] PID: $(pgrep -f "$IRCD_BIN")${NC}" echo "" echo -e "${GALBEN}Verificare rapidă log:${NC}" tail -5 "$LOG_FILE" | sed 's/^/ /' echo "" echo -n "Apasa Enter pentru a continua..." read return 0 else echo "" echo -e "${ROSU}[-] ✗ Eșec la pornirea serverului!${NC}" echo "" echo -e "${GALBEN}╔════════════════════════════════════════╗${NC}" echo -e "${GALBEN}║ DIAGNOSTICARE EROARE ║${NC}" echo -e "${GALBEN}╚════════════════════════════════════════╝${NC}" echo "" # Afișează ultimele 15 linii din log pentru context echo -e "${GALBEN}[*] Ultimele 15 rânduri din log:${NC}" echo -e "${GALBEN}────────────────────────────────────────${NC}" tail -15 "$LOG_FILE" 2>/dev/null || echo " (log-ul nu poate fi citit)" echo -e "${GALBEN}────────────────────────────────────────${NC}" # Verificări suplimentare echo "" echo -e "${GALBEN}[*] Verificări suplimentare:${NC}" # Test sintaxă config echo -e "${GALBEN} → Test sintaxă configurare:${NC}" if "$IRCD_BIN" -c -f "$CONFIG_FILE" 2>&1 | head -5; then echo -e "${VERDE} Config pare valid${NC}" else echo -e "${ROSU} Erori în config detectate!${NC}" fi # Verifică porturi echo "" echo -e "${GALBEN} → Porturi în uz pe sistem:${NC}" netstat -tuln 2>/dev/null | grep -E ":(6667|6697|4400)" || echo " (niciun conflict detectat)" echo "" echo -e "${GALBEN}╔════════════════════════════════════════╗${NC}" echo -e "${GALBEN}║ SOLUȚII POSIBILE: ║${NC}" echo -e "${GALBEN}╚════════════════════════════════════════╝${NC}" echo -e "${GALBEN}1. Verifică sintaxa config:${NC} ./admin.sh → opțiunea 8" echo -e "${GALBEN}2. Verifică permisiuni:${NC} ls -la $CONFIG_FILE" echo -e "${GALBEN}3. Verifică log complet:${NC} ./admin.sh → opțiunea 6" echo -e "${GALBEN}4. Regenerează config:${NC} ./admin.sh → opțiunea 5" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi } # Oprire server stop_server() { echo -e "${VERDE}[+] Oprire server...${NC}" local pid=$(pgrep -f "$IRCD_BIN") if [ -z "$pid" ]; then echo -e "${ROSU}[-] Server nu este pornit!${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi kill "$pid" sleep 2 if ! pgrep -f "$IRCD_BIN" > /dev/null; then echo -e "${VERDE}[+] Server oprit cu succes${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 0 else echo -e "${GALBEN}[*] Forțare oprire...${NC}" kill -9 "$pid" sleep 1 echo -e "${VERDE}[+] Server oprit forțat${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 0 fi } # Restart server restart_server() { echo -e "${VERDE}[+] Restart server...${NC}" stop_server sleep 2 start_server # Pauza este gestionată deja de funcțiile stop_server și start_server } # Status server check_status() { echo -e "${VERDE}[+] Status server:${NC}" echo "" local pid=$(pgrep -f "$IRCD_BIN") if [ -z "$pid" ]; then echo -e "${ROSU}Status: OPRIT${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE}Status: PORNIT${NC}" echo "PID: $pid" # Informații proces echo "" echo -e "${GALBEN}Detalii proces:${NC}" ps aux | grep "$pid" | grep -v grep | awk '{print " CPU: " $3 "% | RAM: " $6 " KB | Timp: " $11}' # Porturi ascultare echo "" echo -e "${GALBEN}Porturi ascultate:${NC}" netstat -tlnp 2>/dev/null | grep "$pid" | awk '{print " Port " $4 " (" $1 ")"}' # Log ultimele linii echo "" echo -e "${GALBEN}Ultimele intrări în log:${NC}" tail -5 "$LOG_FILE" | sed 's/^/ /' echo "" echo -n "Apasa Enter pentru a continua..." read return 0 } # Editare configurare edit_config() { echo -e "${VERDE}[+] Editare configurare...${NC}" if [ ! -f "$CONFIG_FILE" ]; then echo -e "${ROSU}[-] Fișier configurare nu găsit: $CONFIG_FILE${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi # Backup înainte de editare cp "$CONFIG_FILE" "${CONFIG_FILE}.bak.$(date +%s)" echo -e "${GALBEN}[*] Backup creat: ${CONFIG_FILE}.bak${NC}" # Deschide editor ${EDITOR:-nano} "$CONFIG_FILE" # Test sintaxă echo "" echo -e "${GALBEN}[*] Testare sintaxă...${NC}" if "$IRCD_BIN" -c -f "$CONFIG_FILE" 2>&1 | head -20; then echo -e "${VERDE}[+] Sintaxă OK${NC}" else echo -e "${ROSU}[-] Erori în configurare!${NC}" echo -e "${GALBEN}[*] Poți restaura backup-ul:${NC}" echo " cp ${CONFIG_FILE}.bak.* $CONFIG_FILE" fi echo "" echo -n "Apasa Enter pentru a continua..." read return 0 } # Vizionare log-uri view_logs() { echo -e "${VERDE}[+] Opțiuni log-uri:${NC}" echo " 1) Ultimele 20 de rânduri" echo " 2) Urmărire live (Ctrl+C pentru ieșire)" echo " 3) Căutare text" echo " 4) Înapoi" echo "" echo -n -e "${GALBEN}Alege [1-4]:${NC} " read choice case $choice in 1) echo "" echo -e "${ALBASTRU}Ultimele 20 de rânduri:${NC}" tail -20 "$LOG_FILE" echo "" echo -n "Apasa Enter pentru a continua..." read ;; 2) echo "" echo -e "${ALBASTRU}Urmărire live (apasa Ctrl+C pentru ieșire):${NC}" tail -f "$LOG_FILE" echo "" echo -n "Apasa Enter pentru a continua..." read ;; 3) echo "" read -p "$(echo -e ${GALBEN}Cuvânt cheie de căutare:${NC} )" search_term echo "" echo -e "${ALBASTRU}Rezultate:${NC}" grep -i "$search_term" "$LOG_FILE" | tail -20 echo "" echo -n "Apasa Enter pentru a continua..." read ;; 4) return 0 ;; *) echo -e "${ROSU}Opțiune necunoscută!${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read ;; esac } # Generare parola generate_password() { echo -e "${VERDE}[+] Generator parola operator${NC}" echo "" if [ ! -x "$UMKPASSWD_BIN" ]; then echo -e "${ROSU}[-] Utilitar umkpasswd nu găsit!${NC}" echo -e "${GALBEN}[*] Asigură-te că ai rulat install.sh${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${GALBEN}Utilizează utilarul umkpasswd:${NC}" "$UMKPASSWD_BIN" echo "" echo -e "${GALBEN}[*] Copiază hash-ul și actualizează config:${NC}" echo " nano $CONFIG_FILE" echo " # Cauta secțiunea Operator și înlocuiește password" echo "" echo -n "Apasa Enter pentru a continua..." read return 0 } # Test configurare test_config() { echo -e "${VERDE}[+] Test sintaxă configurare...${NC}" echo "" # Verificări preliminare echo -e "${GALBEN}[*] Verificări preliminare:${NC}" echo "" if [ ! -f "$CONFIG_FILE" ]; then echo -e "${ROSU}[-] Fișier configurare nu găsit: $CONFIG_FILE${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Fișier există: $CONFIG_FILE${NC}" # Verifică permisiuni if [ ! -r "$CONFIG_FILE" ]; then echo -e "${ROSU} ✗ Fișier nu poate fi citit!${NC}" echo "" echo -e "${GALBEN}[*] Permisiuni actuale:${NC}" ls -la "$CONFIG_FILE" echo "" echo -e "${GALBEN}[!] Soluție: chmod 600 $CONFIG_FILE${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Permisiuni OK (citire posibilă)${NC}" # Verifică mărime local file_size=$(stat -f%z "$CONFIG_FILE" 2>/dev/null || stat -c%s "$CONFIG_FILE" 2>/dev/null) if [ "$file_size" -eq 0 ]; then echo -e "${ROSU} ✗ Fișier este gol!${NC}" echo "" echo -e "${GALBEN}[!] Regenerează config cu opțiunea 5${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Mărime OK ($file_size bytes)${NC}" # Verifică executabil if [ ! -x "$IRCD_BIN" ]; then echo -e "${ROSU} ✗ Executabil ircd nu găsit sau fără permisiuni!${NC}" echo -e "${GALBEN} Cale: $IRCD_BIN${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi echo -e "${VERDE} ✓ Executabil OK${NC}" echo "" echo -e "${GALBEN}╔════════════════════════════════════════╗${NC}" echo -e "${GALBEN}║ TEST SINTAXĂ CONFIGURARE ║${NC}" echo -e "${GALBEN}╚════════════════════════════════════════╝${NC}" echo "" echo -e "${GALBEN}[*] Rulare: $IRCD_BIN -c -f $CONFIG_FILE${NC}" echo -e "${GALBEN}────────────────────────────────────────${NC}" echo "" # Capturează output-ul testului local test_output=$("$IRCD_BIN" -c -f "$CONFIG_FILE" 2>&1) local test_result=$? echo "$test_output" echo "" echo -e "${GALBEN}────────────────────────────────────────${NC}" if [ $test_result -eq 0 ]; then echo "" echo -e "${VERDE}╔════════════════════════════════════════╗${NC}" echo -e "${VERDE}║ ✓ CONFIGURARE VALIDĂ! ║${NC}" echo -e "${VERDE}╚════════════════════════════════════════╝${NC}" # Statistici despre config echo "" echo -e "${GALBEN}[*] Statistici configurare:${NC}" echo -e " Mărime fișier: $file_size bytes" echo -e " Linii total: $(wc -l < "$CONFIG_FILE")" echo -e " Blocuri General: $(grep -c "^General {" "$CONFIG_FILE" 2>/dev/null || echo 0)" echo -e " Blocuri Port: $(grep -c "^Port {" "$CONFIG_FILE" 2>/dev/null || echo 0)" echo -e " Blocuri Operator: $(grep -c "^Operator {" "$CONFIG_FILE" 2>/dev/null || echo 0)" echo -e " Blocuri Client: $(grep -c "^Client {" "$CONFIG_FILE" 2>/dev/null || echo 0)" echo "" echo -e "${VERDE}[+] Serverul poate fi pornit cu această configurare!${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read return 0 else echo "" echo -e "${ROSU}╔════════════════════════════════════════╗${NC}" echo -e "${ROSU}║ ✗ ERORI ÎN CONFIGURARE! ║${NC}" echo -e "${ROSU}╚════════════════════════════════════════╝${NC}" echo "" echo -e "${GALBEN}[*] Soluții posibile:${NC}" echo -e " 1. Editează config: ./admin.sh → opțiunea 5" echo -e " 2. Verifică sintaxa manual: nano $CONFIG_FILE" echo -e " 3. Compară cu exemplu: cat doc/example.conf" echo -e " 4. Regenerează config nou" echo "" echo -e "${GALBEN}[*] Verificări rapide:${NC}" # Verifică ghilimele neînchise local unclosed_quotes=$(grep -n '"[^"]*$' "$CONFIG_FILE" | head -5) if [ -n "$unclosed_quotes" ]; then echo -e "${ROSU} ⚠ Posibil ghilimele neînchise:${NC}" echo "$unclosed_quotes" | sed 's/^/ /' fi # Verifică acolade neînchise local open_braces=$(grep -o "{" "$CONFIG_FILE" | wc -l) local close_braces=$(grep -o "}" "$CONFIG_FILE" | wc -l) if [ "$open_braces" -ne "$close_braces" ]; then echo -e "${ROSU} ⚠ Acolade nepotrivite: { = $open_braces, } = $close_braces${NC}" fi echo "" echo -n "Apasa Enter pentru a continua..." read return 1 fi } # Funcție principală main() { while true; do show_menu read choice case $choice in 1) start_server ;; 2) stop_server ;; 3) restart_server ;; 4) check_status ;; 5) edit_config ;; 6) view_logs ;; 7) generate_password ;; 8) test_config ;; 9) fix_config_issues ;; 10) echo -e "${VERDE}La revedere!${NC}" exit 0 ;; *) echo -e "${ROSU}Opțiune necunoscută!${NC}" echo "" echo -n "Apasa Enter pentru a continua..." read ;; esac done } # Lansare main