#!/bin/bash # ============================================================================= # Script de Instalare Automată - GNUWorld UnderChat # ============================================================================= # Acest script instalează și configurează GNUWorld cu toate serviciile # pentru rețeaua UnderChat IRC. # # Autor: Echipa UnderChat # Versiune: 2.1.6 # Data: 2026-03-06 # Repository: https://gitlab.back.ro/underchat/gnuworld.git # ============================================================================= # --- Culori pentru afișare --- ROSU='\033[0;31m' VERDE='\033[0;32m' GALBEN='\033[1;33m' ALBASTRU='\033[0;34m' CYAN='\033[0;36m' ALB='\033[1;37m' RESET='\033[0m' BOLD='\033[1m' # --- Variabile globale --- VERSIUNE="2.1.6" GIT_URL="https://gitlab.back.ro/underchat/gnuworld.git" DIR_INSTALL="" UTILIZATOR_CURENT=$(whoami) DIR_GNUWORLD="" PG_BIN="" PG_HOST="127.0.0.1" PG_PORT="5432" PG_USER="gnuworld" PG_PASS="gnuworld" IRCD_HOST="127.0.0.1" IRCD_PORT="4400" IRCD_PASS="54321" NUME_SERVER="channels.underchat.org" DESCRIERE_SERVER="Servicii UnderChat" NUMERIC_SERVER="51" HIDDEN_HOST=".users.underchat.org" NUME_RETEA="underchat" HOSTNAME_RETEA="underchat.org" ADMIN_USER="Admin" ADMIN_NICK="Admin" # Servicii: implicit cservice + ccontrol, restul opționale ACTIV_CSERVICE=true ACTIV_CCONTROL=true ACTIV_OPENCHANFIX=false ACTIV_DRONESCAN=false ACTIV_SNOOP=false ACTIV_SCANNER=false ACTIV_STATS=false ACTIV_CLONER=false ACTIV_NICKSERV=false # Fișier jurnal JURNAL="install_gnuworld.log" # ============================================================================= # FUNCȚII UTILITARE # ============================================================================= jurnal() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$JURNAL" } afiseaza_banner() { clear echo -e "${CYAN}" echo "╔══════════════════════════════════════════════════════════════════════╗" echo "║ ║" echo "║ ██╗ ██╗███╗ ██╗██████╗ ███████╗██████╗ ██████╗██╗ ██╗ ║" echo "║ ██║ ██║████╗ ██║██╔══██╗██╔════╝██╔══██╗██╔════╝██║ ██║ ║" echo "║ ██║ ██║██╔██╗ ██║██║ ██║█████╗ ██████╔╝██║ ███████║ ║" echo "║ ██║ ██║██║╚██╗██║██║ ██║██╔══╝ ██╔══██╗██║ ██╔══██║ ║" echo "║ ╚██████╔╝██║ ╚████║██████╔╝███████╗██║ ██║╚██████╗██║ ██║ ║" echo "║ ╚═════╝ ╚═╝ ╚═══╝╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ║" echo "║ ║" echo "║ Script de Instalare GNUWorld - Rețeaua UnderChat ║" echo "║ Versiune: ${VERSIUNE} ║" echo "║ ║" echo "╚══════════════════════════════════════════════════════════════════════╝" echo -e "${RESET}" echo "" } afiseaza_sectiune() { echo "" echo -e "${ALBASTRU}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo -e "${BOLD}${ALB} $1${RESET}" echo -e "${ALBASTRU}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo "" } mesaj_ok() { echo -e " ${VERDE}✔${RESET} $1" jurnal "[OK] $1" } mesaj_eroare() { echo -e " ${ROSU}✘${RESET} $1" jurnal "[EROARE] $1" } mesaj_info() { echo -e " ${GALBEN}ℹ${RESET} $1" jurnal "[INFO] $1" } mesaj_atentie() { echo -e " ${GALBEN}⚠${RESET} $1" jurnal "[ATENTIE] $1" } citeste_cu_implicit() { # $1 = mesaj, $2 = valoare implicită, $3 = numele variabilei de rezultat local mesaj="$1" local implicit="$2" local __rezultat=$3 local raspuns echo -ne " ${CYAN}→${RESET} ${mesaj} [${GALBEN}${implicit}${RESET}]: " read raspuns if [ -z "$raspuns" ]; then raspuns="$implicit" fi eval $__rezultat="'$raspuns'" } citeste_da_nu() { # $1 = mesaj, $2 = implicit (d/n), $3 = numele variabilei de rezultat local mesaj="$1" local implicit="$2" local __rezultat=$3 local raspuns if [ "$implicit" = "d" ]; then echo -ne " ${CYAN}→${RESET} ${mesaj} [${VERDE}D${RESET}/n]: " else echo -ne " ${CYAN}→${RESET} ${mesaj} [d/${VERDE}N${RESET}]: " fi read raspuns raspuns=$(echo "$raspuns" | tr '[:upper:]' '[:lower:]') if [ -z "$raspuns" ]; then raspuns="$implicit" fi if [ "$raspuns" = "d" ] || [ "$raspuns" = "da" ] || [ "$raspuns" = "y" ] || [ "$raspuns" = "yes" ]; then eval $__rezultat=true else eval $__rezultat=false fi } citeste_parola() { # $1 = mesaj, $2 = valoare implicită, $3 = numele variabilei de rezultat local mesaj="$1" local implicit="$2" local __rezultat=$3 local raspuns echo -ne " ${CYAN}→${RESET} ${mesaj} [${GALBEN}${implicit}${RESET}]: " read -s raspuns echo "" if [ -z "$raspuns" ]; then raspuns="$implicit" fi eval $__rezultat="'$raspuns'" } verifica_root() { if [ "$EUID" -eq 0 ]; then return 0 else return 1 fi } # ============================================================================= # PASUL 1: VERIFICARE SISTEM ȘI DEPENDENȚE # ============================================================================= verifica_sistem() { afiseaza_sectiune "PASUL 1: Verificare Sistem și Dependențe" # Verificăm dacă suntem pe un sistem compatibil if [ -f /etc/os-release ]; then . /etc/os-release mesaj_ok "Sistem de operare detectat: ${PRETTY_NAME}" else mesaj_atentie "Nu pot detecta sistemul de operare. Continuăm oricum..." fi # Verificăm arhitectura ARCH=$(uname -m) mesaj_info "Arhitectură: ${ARCH}" # Verificăm dacă rulăm ca root sau utilizator normal if verifica_root; then mesaj_info "Rulezi ca ROOT. Vom instala dependențele automat." ESTE_ROOT=true else mesaj_atentie "Nu rulezi ca root. Dependențele trebuie instalate manual de root." mesaj_info "Scriptul va verifica dacă sunt deja instalate." ESTE_ROOT=false fi echo "" } instaleaza_dependente() { afiseaza_sectiune "PASUL 2: Instalare Dependențe" # Lista de pachete necesare local pachete_necesare=( "gcc" "g++" "cpp" "make" "automake" "autoconf" "libtool" "flex" "byacc" "bison" "openssl" "libssl-dev" "git" "libpq-dev" "libreadline-dev" "zlib1g-dev" "postgresql" "postgresql-client" "postgresql-server-dev-all" ) # Pachete opționale pentru TOTP și sendmail local pachete_optionale=( "liboath-dev" "mailutils" ) if [ "$ESTE_ROOT" = true ]; then mesaj_info "Se actualizează lista de pachete..." apt-get update -qq > /dev/null 2>&1 mesaj_ok "Lista de pachete actualizată." mesaj_info "Se instalează pachetele necesare..." for pachet in "${pachete_necesare[@]}"; do if dpkg -l "$pachet" 2>/dev/null | grep -q "^ii"; then mesaj_ok "${pachet} — deja instalat" else echo -ne " ${GALBEN}⏳${RESET} Se instalează ${pachet}..." if apt-get install -y -qq "$pachet" > /dev/null 2>&1; then echo -e "\r ${VERDE}✔${RESET} ${pachet} — instalat cu succes " jurnal "[OK] ${pachet} instalat" else echo -e "\r ${ROSU}✘${RESET} ${pachet} — EROARE la instalare! " jurnal "[EROARE] ${pachet} nu a putut fi instalat" fi fi done echo "" mesaj_info "Se instalează pachetele opționale..." for pachet in "${pachete_optionale[@]}"; do if dpkg -l "$pachet" 2>/dev/null | grep -q "^ii"; then mesaj_ok "${pachet} — deja instalat" else echo -ne " ${GALBEN}⏳${RESET} Se instalează ${pachet}..." if apt-get install -y -qq "$pachet" > /dev/null 2>&1; then echo -e "\r ${VERDE}✔${RESET} ${pachet} — instalat cu succes " else echo -e "\r ${GALBEN}⚠${RESET} ${pachet} — nu s-a putut instala (opțional) " fi fi done else mesaj_info "Verificăm dacă dependențele sunt instalate..." local lipsa=() for pachet in "${pachete_necesare[@]}"; do if dpkg -l "$pachet" 2>/dev/null | grep -q "^ii"; then mesaj_ok "${pachet} — prezent" else mesaj_eroare "${pachet} — LIPSEȘTE!" lipsa+=("$pachet") fi done if [ ${#lipsa[@]} -gt 0 ]; then echo "" mesaj_eroare "Următoarele pachete lipsesc și trebuie instalate de root:" echo -e " ${GALBEN}sudo apt-get install ${lipsa[*]}${RESET}" echo "" citeste_da_nu "Dorești să continuăm oricum?" "n" CONTINUA if [ "$CONTINUA" = false ]; then mesaj_eroare "Instalare anulată. Instalează dependențele și reia scriptul." exit 1 fi fi fi echo "" } # ============================================================================= # PASUL 3: DETECTARE POSTGRESQL # ============================================================================= detecteaza_postgresql() { afiseaza_sectiune "PASUL 3: Configurare PostgreSQL" # Detectăm pg_config mesaj_info "Se caută instalarea PostgreSQL..." # Căutăm pg_config în locații cunoscute local pg_config_gasit="" local locatii_posibile=( "/usr/lib/postgresql/17/bin/pg_config" "/usr/lib/postgresql/16/bin/pg_config" "/usr/lib/postgresql/15/bin/pg_config" "/usr/lib/postgresql/14/bin/pg_config" "/usr/lib/postgresql/13/bin/pg_config" "/usr/lib/postgresql/12/bin/pg_config" "/usr/lib/postgresql/11/bin/pg_config" "/usr/bin/pg_config" "/usr/local/pgsql/bin/pg_config" "/usr/local/bin/pg_config" ) for loc in "${locatii_posibile[@]}"; do if [ -f "$loc" ]; then pg_config_gasit="$loc" break fi done # Încercăm și cu which if [ -z "$pg_config_gasit" ]; then pg_config_gasit=$(which pg_config 2>/dev/null) fi if [ -n "$pg_config_gasit" ]; then PG_CONFIG="$pg_config_gasit" PG_BIN=$(dirname "$PG_CONFIG") local pg_versiune=$("$PG_CONFIG" --version 2>/dev/null) mesaj_ok "PostgreSQL găsit: ${pg_versiune}" mesaj_ok "pg_config: ${PG_CONFIG}" mesaj_ok "Directorul bin: ${PG_BIN}" else mesaj_eroare "Nu s-a găsit pg_config!" mesaj_info "Specificați manual calea către pg_config." citeste_cu_implicit "Calea completă către pg_config" "/usr/lib/postgresql/13/bin/pg_config" PG_CONFIG if [ ! -f "$PG_CONFIG" ]; then mesaj_eroare "Fișierul ${PG_CONFIG} nu există!" exit 1 fi PG_BIN=$(dirname "$PG_CONFIG") fi echo "" # Detectăm psql și createdb PSQL="${PG_BIN}/psql" CREATEDB="${PG_BIN}/createdb" # Dacă nu sunt în PG_BIN, căutăm în PATH if [ ! -f "$PSQL" ]; then PSQL=$(which psql 2>/dev/null) fi if [ ! -f "$CREATEDB" ]; then CREATEDB=$(which createdb 2>/dev/null) fi if [ -n "$PSQL" ] && [ -f "$PSQL" ]; then mesaj_ok "psql găsit: ${PSQL}" else mesaj_eroare "psql nu a fost găsit!" exit 1 fi if [ -n "$CREATEDB" ] && [ -f "$CREATEDB" ]; then mesaj_ok "createdb găsit: ${CREATEDB}" else mesaj_eroare "createdb nu a fost găsit!" exit 1 fi echo "" # Configurare conexiune PostgreSQL mesaj_info "Configurare conexiune la baza de date PostgreSQL:" echo "" citeste_cu_implicit "Adresa IP a serverului PostgreSQL" "$PG_HOST" PG_HOST citeste_cu_implicit "Portul PostgreSQL" "$PG_PORT" PG_PORT citeste_cu_implicit "Utilizatorul PostgreSQL" "$PG_USER" PG_USER citeste_parola "Parola PostgreSQL" "$PG_PASS" PG_PASS echo "" # Verificăm conexiunea la PostgreSQL mesaj_info "Se verifică conexiunea la PostgreSQL..." if PGPASSWORD="$PG_PASS" "$PSQL" -h "$PG_HOST" -p "$PG_PORT" -U "$PG_USER" -d postgres -c "SELECT 1;" > /dev/null 2>&1; then mesaj_ok "Conexiunea la PostgreSQL funcționează!" else mesaj_atentie "Nu m-am putut conecta la PostgreSQL cu aceste date." mesaj_info "Posibile cauze:" mesaj_info " - PostgreSQL nu rulează" mesaj_info " - Utilizatorul/parola sunt greșite" mesaj_info " - pg_hba.conf nu permite conexiunea" echo "" citeste_da_nu "Dorești să continuăm oricum?" "d" CONTINUA if [ "$CONTINUA" = false ]; then exit 1 fi fi echo "" } # ============================================================================= # PASUL 4: CONFIGURARE REȚEA # ============================================================================= configureaza_retea() { afiseaza_sectiune "PASUL 4: Configurare Rețea IRC" mesaj_info "Configurează parametrii de conectare la serverul IRC (ircd):" echo "" citeste_cu_implicit "Adresa IP a serverului IRC (uplink)" "$IRCD_HOST" IRCD_HOST citeste_cu_implicit "Portul de conectare la ircd" "$IRCD_PORT" IRCD_PORT citeste_parola "Parola de conectare la ircd" "$IRCD_PASS" IRCD_PASS echo "" mesaj_info "Configurare identitate server GNUWorld:" echo "" citeste_cu_implicit "Numele serverului GNUWorld" "$NUME_SERVER" NUME_SERVER citeste_cu_implicit "Descrierea serverului" "$DESCRIERE_SERVER" DESCRIERE_SERVER citeste_cu_implicit "Numeric-ul serverului (unic pe rețea)" "$NUMERIC_SERVER" NUMERIC_SERVER citeste_cu_implicit "Sufixul hidden host" "$HIDDEN_HOST" HIDDEN_HOST echo "" mesaj_info "Configurare rețea:" echo "" citeste_cu_implicit "Numele rețelei (fără spații)" "$NUME_RETEA" NUME_RETEA citeste_cu_implicit "Hostname-ul rețelei" "$HOSTNAME_RETEA" HOSTNAME_RETEA echo "" mesaj_info "Configurare administrator principal:" echo "" citeste_cu_implicit "Numele contului de admin (autentificare IRC)" "$ADMIN_USER" ADMIN_USER echo "" } # ============================================================================= # PASUL 5: SELECTARE SERVICII # ============================================================================= selecteaza_servicii() { afiseaza_sectiune "PASUL 5: Selectare Servicii" echo -e " ${ALB}Serviciile implicite (activate automat):${RESET}" echo -e " ${VERDE}✔${RESET} CService (X) — Serviciul principal de canale" echo -e " ${VERDE}✔${RESET} CControl (UWorld) — Control și administrare rețea" echo "" echo -e " ${ALB}Servicii adiționale disponibile:${RESET}" echo "" citeste_da_nu "Activezi OpenChanFix (C) — Reparare automată operatori canal?" "d" ACTIV_OPENCHANFIX if [ "$ACTIV_OPENCHANFIX" = true ]; then mesaj_ok "OpenChanFix va fi activat." fi citeste_da_nu "Activezi DroneScan (E) — Detectare automată drone/flood?" "d" ACTIV_DRONESCAN if [ "$ACTIV_DRONESCAN" = true ]; then mesaj_ok "DroneScan va fi activat." fi citeste_da_nu "Activezi Snoop (snoopy) — Supraveghere și monitorizare?" "n" ACTIV_SNOOP if [ "$ACTIV_SNOOP" = true ]; then mesaj_ok "Snoop va fi activat." fi citeste_da_nu "Activezi Scanner (netscan) — Scanner de rețea?" "n" ACTIV_SCANNER if [ "$ACTIV_SCANNER" = true ]; then mesaj_ok "Scanner va fi activat." fi citeste_da_nu "Activezi Stats (ubercow) — Statistici rețea?" "n" ACTIV_STATS if [ "$ACTIV_STATS" = true ]; then mesaj_ok "Stats va fi activat." fi citeste_da_nu "Activezi Cloner — Generator de clone pentru teste?" "n" ACTIV_CLONER if [ "$ACTIV_CLONER" = true ]; then mesaj_ok "Cloner va fi activat." fi citeste_da_nu "Activezi NickServ — Serviciul de pseudonime?" "n" ACTIV_NICKSERV if [ "$ACTIV_NICKSERV" = true ]; then mesaj_ok "NickServ va fi activat." fi echo "" } # ============================================================================= # PASUL 6: DESCĂRCARE ȘI COMPILARE # ============================================================================= descarca_si_compileaza() { afiseaza_sectiune "PASUL 6: Descărcare și Compilare GNUWorld" # Determinăm directorul de instalare citeste_cu_implicit "Directorul de instalare (unde se va clona)" "$HOME/gnuworld" DIR_GNUWORLD # Verificăm dacă directorul există deja if [ -d "$DIR_GNUWORLD" ]; then mesaj_atentie "Directorul ${DIR_GNUWORLD} există deja!" citeste_da_nu "Dorești să-l ștergem și să clonăm din nou?" "d" STERGE if [ "$STERGE" = true ]; then rm -rf "$DIR_GNUWORLD" mesaj_ok "Directorul vechi a fost șters." else mesaj_info "Folosim directorul existent." fi fi # Clonăm repository-ul dacă nu există if [ ! -d "$DIR_GNUWORLD" ]; then mesaj_info "Se clonează repository-ul GNUWorld..." echo "" if git clone "$GIT_URL" "$DIR_GNUWORLD"; then mesaj_ok "Repository clonat cu succes!" else mesaj_eroare "Eroare la clonarea repository-ului!" mesaj_info "Verifică conexiunea la internet și URL-ul: ${GIT_URL}" exit 1 fi fi cd "$DIR_GNUWORLD" || exit 1 echo "" # Construim lista de module pentru configure local module="cservice,ccontrol" if [ "$ACTIV_OPENCHANFIX" = true ]; then module="${module},openchanfix" fi if [ "$ACTIV_DRONESCAN" = true ]; then module="${module},dronescan" fi if [ "$ACTIV_SNOOP" = true ]; then module="${module},snoop" fi if [ "$ACTIV_SCANNER" = true ]; then module="${module},scanner" fi if [ "$ACTIV_STATS" = true ]; then module="${module},stats" fi if [ "$ACTIV_CLONER" = true ]; then module="${module},cloner" fi if [ "$ACTIV_NICKSERV" = true ]; then module="${module},nickserv" fi mesaj_info "Module selectate: ${VERDE}${module}${RESET}" echo "" # Construim comanda configure local CONFIGURE_CMD="./configure --with-pgconfig=${PG_CONFIG} --enable-modules=${module}" # Verificăm dacă liboath este disponibilă if [ -f "/usr/include/liboath/oath.h" ] || dpkg -l liboath-dev 2>/dev/null | grep -q "^ii"; then CONFIGURE_CMD="${CONFIGURE_CMD} --with-liboath --with-liboath-lib=/usr/lib/ --with-liboath-include=/usr/include/" mesaj_info "Suport TOTP (liboath) detectat și activat." fi mesaj_info "Se rulează configure..." mesaj_info "Comanda: ${CONFIGURE_CMD}" echo "" if eval "$CONFIGURE_CMD" 2>&1 | tee -a "$JURNAL"; then mesaj_ok "Configurare completă!" else mesaj_eroare "Eroare la configurare!" mesaj_info "Verifică jurnalul: ${JURNAL}" citeste_da_nu "Dorești să continuăm oricum?" "n" CONTINUA if [ "$CONTINUA" = false ]; then exit 1 fi fi echo "" mesaj_info "Se compilează GNUWorld (aceasta poate dura câteva minute)..." echo "" # Detectăm numărul de procesoare pentru make paralel local NR_PROC=$(nproc 2>/dev/null || echo 1) mesaj_info "Se folosesc ${NR_PROC} fire de compilare." if make -j${NR_PROC} 2>&1 | tee -a "$JURNAL"; then mesaj_ok "Compilare reușită!" else mesaj_eroare "Eroare la compilare!" mesaj_info "Verifică jurnalul: ${JURNAL}" exit 1 fi echo "" mesaj_info "Se instalează binarele..." if make install 2>&1 | tee -a "$JURNAL"; then mesaj_ok "Instalare binare reușită!" else mesaj_eroare "Eroare la instalarea binarelor!" exit 1 fi echo "" } # ============================================================================= # PASUL 7: CREARE BAZE DE DATE # ============================================================================= creeaza_baze_de_date() { afiseaza_sectiune "PASUL 7: Creare Baze de Date" cd "$DIR_GNUWORLD/doc" || exit 1 local PSQL_CMD="PGPASSWORD='${PG_PASS}' ${PSQL} -h ${PG_HOST} -p ${PG_PORT} -U ${PG_USER}" local CREATEDB_CMD="PGPASSWORD='${PG_PASS}' ${CREATEDB} -h ${PG_HOST} -p ${PG_PORT} -U ${PG_USER}" # --- Baza de date CService --- mesaj_info "Se creează baza de date 'cservice'..." if eval "${CREATEDB_CMD} --template=template0 -E=SQL_ASCII cservice" 2>/dev/null; then mesaj_ok "Baza de date 'cservice' creată." else mesaj_atentie "Baza de date 'cservice' există deja sau nu a putut fi creată." citeste_da_nu "Continuăm cu importul SQL?" "d" CONTINUA_SQL if [ "$CONTINUA_SQL" = false ]; then return fi fi mesaj_info "Se importă structura cservice..." eval "${PSQL_CMD} cservice < cservice.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < cservice.config.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < languages.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < language_table.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < greeting.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < cservice.help.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < cservice.web.sql" 2>&1 | tail -1 eval "${PSQL_CMD} cservice < cservice.addme.sql" 2>&1 | tail -1 mesaj_ok "Baza de date 'cservice' populată cu succes." echo "" # --- Baza de date CControl --- mesaj_info "Se creează baza de date 'ccontrol'..." if eval "${CREATEDB_CMD} --template=template0 -E=SQL_ASCII ccontrol" 2>/dev/null; then mesaj_ok "Baza de date 'ccontrol' creată." else mesaj_atentie "Baza de date 'ccontrol' există deja sau nu a putut fi creată." fi mesaj_info "Se importă structura ccontrol..." eval "${PSQL_CMD} ccontrol < ccontrol.sql" 2>&1 | tail -1 eval "${PSQL_CMD} ccontrol < ccontrol.help.sql" 2>&1 | tail -1 eval "${PSQL_CMD} ccontrol < ccontrol.addme.sql" 2>&1 | tail -1 eval "${PSQL_CMD} ccontrol < ccontrol.commands.sql" 2>&1 | tail -1 mesaj_ok "Baza de date 'ccontrol' populată cu succes." echo "" # --- Baza de date DroneScan (opțional) --- if [ "$ACTIV_DRONESCAN" = true ]; then mesaj_info "Se creează baza de date 'dronescan'..." if eval "${CREATEDB_CMD} --template=template0 -E=SQL_ASCII dronescan" 2>/dev/null; then mesaj_ok "Baza de date 'dronescan' creată." else mesaj_atentie "Baza de date 'dronescan' există deja." fi eval "${PSQL_CMD} dronescan < dronescan.sql" 2>&1 | tail -1 mesaj_ok "Baza de date 'dronescan' populată." echo "" fi # --- Baza de date OpenChanFix (opțional) --- if [ "$ACTIV_OPENCHANFIX" = true ]; then mesaj_info "Se creează baza de date 'chanfix'..." if eval "${CREATEDB_CMD} --template=template0 -E=SQL_ASCII chanfix" 2>/dev/null; then mesaj_ok "Baza de date 'chanfix' creată." else mesaj_atentie "Baza de date 'chanfix' există deja." fi local CHANFIX_DOC="${DIR_GNUWORLD}/mod.openchanfix/doc" eval "${PSQL_CMD} chanfix < ${CHANFIX_DOC}/chanfix.sql" 2>&1 | tail -1 eval "${PSQL_CMD} chanfix < ${CHANFIX_DOC}/chanfix.languages.sql" 2>&1 | tail -1 eval "${PSQL_CMD} chanfix < ${CHANFIX_DOC}/chanfix.language.english.sql" 2>&1 | tail -1 eval "${PSQL_CMD} chanfix < ${CHANFIX_DOC}/chanfix.help.sql" 2>&1 | tail -1 eval "${PSQL_CMD} chanfix < ${CHANFIX_DOC}/chanfix.addme.sql" 2>&1 | tail -1 mesaj_ok "Baza de date 'chanfix' populată." echo "" fi echo "" } # ============================================================================= # PASUL 8: CONFIGURARE FIȘIERE # ============================================================================= genereaza_configurari() { afiseaza_sectiune "PASUL 8: Generare Fișiere de Configurare" local BIN_DIR="${DIR_GNUWORLD}/bin" cd "$BIN_DIR" || exit 1 # --- GNUWorld.conf (configurare principală) --- mesaj_info "Se generează GNUWorld.conf..." local MODULE_LINES="" MODULE_LINES+="module = libcservice.la cservice.conf\n" MODULE_LINES+="module = libccontrol.la ccontrol.conf\n" if [ "$ACTIV_OPENCHANFIX" = true ]; then MODULE_LINES+="module = libchanfix.la openchanfix.conf\n" fi if [ "$ACTIV_DRONESCAN" = true ]; then MODULE_LINES+="module = libdronescan.la dronescan.conf\n" fi if [ "$ACTIV_SNOOP" = true ]; then MODULE_LINES+="module = libsnoop.la snoop.conf\n" fi if [ "$ACTIV_SCANNER" = true ]; then MODULE_LINES+="module = libscanner.la scanner.conf\n" fi if [ "$ACTIV_STATS" = true ]; then MODULE_LINES+="module = libstats.la stats.conf\n" fi if [ "$ACTIV_CLONER" = true ]; then MODULE_LINES+="module = libcloner.la cloner.conf\n" fi if [ "$ACTIV_NICKSERV" = true ]; then MODULE_LINES+="module = libnickserv.la nickserv.conf\n" fi cat > "${BIN_DIR}/GNUWorld.conf" << GNUWORLD_EOF # ============================================================================= # Fișier de Configurare Principal GNUWorld — Rețeaua UnderChat # Generat automat de scriptul de instalare la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # Adresa IP a serverului IRC (ircd) la care ne conectăm uplink = ${IRCD_HOST} # Portul de conectare la ircd port = ${IRCD_PORT} # Parola de conectare (trebuie să coincidă cu cea din ircd.conf) password = ${IRCD_PASS} # Numele serverului GNUWorld (cum apare pe rețea) name = ${NUME_SERVER} # Descrierea serverului description = ${DESCRIERE_SERVER} # Numeric-ul serverului (trebuie să fie unic pe rețea) numeric = ${NUMERIC_SERVER} # Reconectare automată la deconectare auto_reconnect = yes # Numărul maxim de clienți (folosește numere impare!) maxclients = 1023 # Sufixul de gazdă ascunsă pentru utilizatori hidden_host_suffix = ${HIDDEN_HOST} # Fișierul cu mapările comenzilor server command_map = server_command_map # Directorul cu modulele compilate libdir = ../lib # ---- Module Active ---- $(echo -e "$MODULE_LINES") # ---- Controlul Serverului ---- # Pseudonimul de control (pentru comenzi administrative) controlnick = control # Conturile cu acces la comenzile de control allowcontrol = ${ADMIN_USER} # ---- Setări Avansate ---- # Intervalul de verificare gline-uri expirate (secunde) glineUpdateInterval = 15 # Intervalul de ping către uplink (secunde) pingUpdateInterval = 60 GNUWORLD_EOF mesaj_ok "GNUWorld.conf generat." # --- cservice.conf --- mesaj_info "Se generează cservice.conf..." cat > "${BIN_DIR}/cservice.conf" << CSERVICE_EOF # ============================================================================= # Fișier de Configurare CService (Botul X) — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # ---- Conexiune Bază de Date ---- sql_host = ${PG_HOST} sql_port = ${PG_PORT} sql_db = cservice sql_user = ${PG_USER} sql_pass = ${PG_PASS} # ---- Identitate Bot ---- nickname = X username = cservice hostname = ${HOSTNAME_RETEA} userdescription = Pentru ajutor tastați: /msg X help mode = +idk # ---- Canale de Administrare ---- # URL-ul pentru vizualizarea aplicațiilor de canal pending_page_url = http://www.${HOSTNAME_RETEA}/live/view_app.php # Canalul de retransmisie (relay) pentru mesaje de flood/avertismente relay_channel = #coder-com # Canalul de retransmisie pentru utilizatori privilegiați priv_relay_channel = #coder-com # Canalul de depanare (debug) debug_channel = #coder-com # Canalul programatorilor coder_channel = #coder-com # ---- Timpi și Intervale ---- # Frecvența de verificare a bazei de date pentru actualizări (secunde) update_interval = 180 # Durata ferestrei de eșantionare flood (secunde) flood_duration = 30 # Rata de flood la intrare (puncte în flood_duration secunde) input_flood = 3000 # Rata de flood la ieșire (bytes în flood_duration secunde) output_flood = 20480 # Durata minimă de topic pe canal non-inactiv (secunde) topic_duration = 1800 # Interval verificare conturi inactive din memorie (secunde) expire_interval = 3600 # Timp de inactivitate înainte de a scoate contul din cache (secunde) cache_interval = 3600 # Interval de notificare/salvare canale în așteptare (secunde) pending_duration = 1800 # Frecvența verificare conexiune BD (secunde) connection_check_frequency = 10 # Număr încercări de reconectare la BD connection_retry_total = 5 # Interval verificare floating-limit pe canale (secunde) limit_check = 30 # Întârziere autentificare după pornire (secunde) login_delay = 5 # ---- Notificări ---- # Perioadă și limită pentru trimiterea notelor note_duration = 3600 note_limit = 5 max_notes = 30 # ---- Cache și Performanță ---- # Pre-încarcă conturile autentificate din ultimele X zile preload_user_days = 1 # ---- Jurnale ---- admin_logfile = admin.log command_logfile = cs.log # ---- Comanda HELLO ---- # Perioadă de blocare la flood cu hello (secunde) hello_block_period = 3600 # Trimite parola prin email (1) sau afișare directă (0) # IMPORTANT: pachetul mailutils trebuie instalat! hello_sendmail_enabled = 0 # Adresa expeditorului la trimiterea emailului sendmail_from = cservice@${HOSTNAME_RETEA} # ---- WebRelay ---- webrelay_interval = 10 # ---- Expirare Canale Inactive ---- # Timp de inactivitate în canal înainte de a-l părăsi (secunde, implicit 2 zile) part_idle_chan = 172800 # ---- TOTP (Autentificare cu doi factori) ---- # 1 = activat, 0 = dezactivat enable_totp = 0 # ---- Expirare Utilizatori ---- # Zile până la expirare (0 = nu expiră niciodată) users_expire_days = 60 # ---- MIA (Manager Inactiv) ---- # Zile înainte de a marca canalul ca MIA MIA_start_days = 21 # Zile înainte de a curăța canalele MIA MIA_end_days = 30 # ---- Frecvență Verificări BD ---- # Verificare ultimii utilizatori văzuți (ore) users_db_idle = 1 # Verificare canale cu manageri lipsă (ore) channels_db_idle = 1 # ---- Unități de Timp ---- hour_seconds = 3600 day_seconds = 86400 # ---- Descrieri MIA ---- MIA_start_desc = Managerul nu s-a autentificat. Pentru a vota un nou manager, contactați administrația. MIA_URL = Doar operatori 400+ MIA_end_desc = Managerul s-a autentificat. Acesta a fost ultimul avertisment pentru neautentificare. # ---- Judecător (Înregistrare Canale) ---- required_supporters = 2 judge_day_seconds = 360 min_days_before_reg = 1 min_days_before_support = 1 max_concurrent_supports = 3 noreg_days_on_nosupport = 1 reject_app_on_userfraud = 1 rewiev_on_object = 1 rewievs_expire_time = 100 pendings_expire_time = 30 max_days = 5 unique_joins = 5 joins = 15 min_supporters = 2 min_supporters_joins = 3 notify_days = 2 support_days = 1 reviewer_id = 1 # Mesaj de bun venit pentru canalele nou acceptate welcome_newchan_message = Felicitări! Canalul %s a fost înregistrat pe ${NUME_RETEA}! welcome_newchan_topic = *** Felicitări! Aplicația canalului tău a fost acceptată! *** # ---- Hostname-uri Rezervate ---- reservedHost = *.${HOSTNAME_RETEA} CSERVICE_EOF mesaj_ok "cservice.conf generat." # --- ccontrol.conf --- mesaj_info "Se generează ccontrol.conf..." cat > "${BIN_DIR}/ccontrol.conf" << CCONTROL_EOF # ============================================================================= # Fișier de Configurare CControl (UWorld) — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # ---- Conexiune Bază de Date ---- sql_host = ${PG_HOST} sql_port = ${PG_PORT} sql_db = ccontrol sql_user = ${PG_USER} sql_pass = ${PG_PASS} # ---- Identitate Bot ---- username = UWorld nickname = UWorld hostname = UWorld.${HOSTNAME_RETEA} userdescription = UWorld - Servicii de Administrare mode = +iodkw # ---- Canale ---- operchanmodes = +isn operchan = #coder-com msgchan = #coder-com # ---- Gline-uri ---- # Durata implicită a gline-ului (secunde) glength = 3600 # Motivul implicit la adăugare canal de operatori operchanreason = Acesta este un canal exclusiv pentru Operatorii IRC # Numărul maxim de canale afișate cu LIST (0 = toate) maxlistchannels = 0 # ---- Rapoarte ---- abuse_mail = abuse@${HOSTNAME_RETEA} ccemail = uworld-report@${HOSTNAME_RETEA} sendmail = /usr/sbin/sendmail mail_report = 0 # ---- Intervale ---- gline_interval = 3600 max_connection = 5 max_GLen = 86400 max_threads = 100 check_gates = 0 check_clones = 0 Expired_interval = 60 dbinterval = 60 # ---- Diverse ---- showCGIpsInLogs = 1 AnnounceNick = A CCONTROL_EOF mesaj_ok "ccontrol.conf generat." # --- openchanfix.conf (dacă e activat) --- if [ "$ACTIV_OPENCHANFIX" = true ]; then mesaj_info "Se generează openchanfix.conf..." cat > "${BIN_DIR}/openchanfix.conf" << OPENCHANFIX_EOF # ============================================================================= # Fișier de Configurare OpenChanFix (C) — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # ---- Identitate Bot ---- nickname = C username = chanfix hostname = ${HOSTNAME_RETEA} userdescription = Serviciu de reparare canale mode = +idk # ---- Conexiune Bază de Date ---- sqlHost = ${PG_HOST} sqlPort = ${PG_PORT} sqlDB = chanfix sqlcfUser = ${PG_USER} sqlPass = ${PG_PASS} # ---- Canale ---- consoleChan = #coder-com consoleChanModes = +nst sendConsoleNotices = true joinChan = #chanfix joinChanModes = +nt # ---- Setări de Reparare ---- enableAutoFix = true enableChanFix = true enableChannelBlocking = true joinChannels = true autoFixNotice = true manualFixNotice = true stopAutoFixOnOp = true stopChanFixOnOp = true allowTopOpFix = false allowTopOpAlert = true topOpPercent = 10 minFixScore = 1000 minCanFixScore = 500 minRequestOpTime = 720 # ---- Setări de Rețea ---- version = 12 useBurstToFix = true numServers = 10 minServersPresent = 75 chanServName = ${NUME_SERVER} # ---- Interfață ---- numTopScores = 10 # ---- Bază de Date ---- minClients = 4 clientNeedsIdent = false # ---- Diverse ---- connectCheckFreq = 10 adminLogFile = chanfix-admin.log debugLogFile = chanfix-debug.log OPENCHANFIX_EOF mesaj_ok "openchanfix.conf generat." fi # --- dronescan.conf (dacă e activat) --- if [ "$ACTIV_DRONESCAN" = true ]; then mesaj_info "Se generează dronescan.conf..." cat > "${BIN_DIR}/dronescan.conf" << DRONESCAN_EOF # ============================================================================= # Fișier de Configurare DroneScan (E) — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # ---- Identitate Bot ---- nickname = E username = dronescan hostname = ${HOSTNAME_RETEA} userdescription = Scanner de Drone mode = +idk # ---- Canale ---- consoleChannel = #ds.console consoleChannelModes = +ntsim setAutoTopic = false # ---- Conexiune Bază de Date ---- sqlHost = ${PG_HOST} sqlPort = ${PG_PORT} sqlDB = dronescan sqlUser = ${PG_USER} sqlPass = ${PG_PASS} # ---- Margini Detecție ---- channelMargin = 0.8 nickMargin = 0.1 channelCutoff = 10 consoleLevel = 1 voteCutoff = 30 dcInterval = 600 rcInterval = 300 fakeOperLevel = 300 # ---- Contor Intrări (Join Flood) ---- jcInterval = 10 jcCutoff = 10 jcMinJoinToGline = 1 jcGlineEnable = 0 jcMinJoinsPerIPToGline = 4 jcJoinsPerIPTime = 14400 jcMinJoinToGlineJOnly = 2 jcMinJFJOnlySizeToGline = 25 jcMinJFSizeToGline = 20 jcGlineReason = Flood-ul nu este tolerat pe aceasta retea! jcGlineLength = 3600 # ---- Contor Schimbări Pseudonim ---- ncInterval = 10 ncCutoff = 10 # ---- Interval Canal ---- channelRange = 0.2 # ---- MaxChans ---- maxChans = 2 # ---- CommonReal ---- realCutoff = 4 # ---- Coadă Gline-uri ---- gbCount = 2 gbInterval = 1 DRONESCAN_EOF mesaj_ok "dronescan.conf generat." fi # --- snoop.conf (dacă e activat) --- if [ "$ACTIV_SNOOP" = true ]; then mesaj_info "Se generează snoop.conf..." cat > "${BIN_DIR}/snoop.conf" << SNOOP_EOF # ============================================================================= # Fișier de Configurare Snoop — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # ---- Identitate Bot ---- username = snoopy nickname = snoopy hostname = ${HOSTNAME_RETEA} userdescription = Serviciu de Supraveghere UnderChat mode = +i # ---- Acces ---- permit_user = ${ADMIN_USER} allow_opers = true # ---- Comenzi ---- cmdchar = ! # ---- Canale ---- adminchan = #coder-com relaychan = #coder-com # ---- Diverse ---- defaultquitmessage = Se deconecteaza maxnicklen = 15 SNOOP_EOF mesaj_ok "snoop.conf generat." fi # --- scanner.conf (dacă e activat) --- if [ "$ACTIV_SCANNER" = true ]; then mesaj_info "Se generează scanner.conf..." cat > "${BIN_DIR}/scanner.conf" << SCANNER_EOF # ============================================================================= # Fișier de Configurare Scanner — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= nickname = netscan username = netscan hostname = ${HOSTNAME_RETEA} userdescription = Scanner de Rețea UnderChat mode = +iok max_connects = 1500 SCANNER_EOF mesaj_ok "scanner.conf generat." fi # --- stats.conf (dacă e activat) --- if [ "$ACTIV_STATS" = true ]; then mesaj_info "Se generează stats.conf..." cat > "${BIN_DIR}/stats.conf" << STATS_EOF # ============================================================================= # Fișier de Configurare Stats — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= nickname = S username = stats hostname = ${HOSTNAME_RETEA} userdescription = Servicii Statistice UnderChat mode = +iok permit_user = ${ADMIN_USER} allow_opers = true logDuringBurst = false data_path = . part_message = La revedere! STATS_EOF mesaj_ok "stats.conf generat." fi # --- cloner.conf (dacă e activat) --- if [ "$ACTIV_CLONER" = true ]; then mesaj_info "Se generează cloner.conf..." cat > "${BIN_DIR}/cloner.conf" << CLONER_EOF # ============================================================================= # Fișier de Configurare Cloner — Rețeaua UnderChat # Generat automat la $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= username = Cloner nickname = Cloner hostname = ${HOSTNAME_RETEA} userdescription = Generatorul de Clone mode = +iodk permit_user = ${ADMIN_USER} allow_opers = true fakeservername = spawn.${HOSTNAME_RETEA} fakeserverdescription = Server de clone UnderChat fakehost = guest.${HOSTNAME_RETEA} fakehost = user.${HOSTNAME_RETEA} fakehost = chat.${HOSTNAME_RETEA} fakeuser = guest fakeuser = user fakeuser = visitor fakeuser = chatter clonedescription = Utilizator UnderChat fakedescription = Utilizator UnderChat fakedescription = Sunt pe UnderChat! fakedescription = IRC este super! fakedescription = Salutare din UnderChat clonemode = +d minnicklength = 5 maxnicklength = 12 cloneburstcount = 35 CLONER_EOF mesaj_ok "cloner.conf generat." fi # --- nickserv.conf (dacă e activat) --- if [ "$ACTIV_NICKSERV" = true ]; then mesaj_info "Se generează nickserv.conf..." if [ -f "${BIN_DIR}/nickserv.example.conf.in" ]; then cp "${BIN_DIR}/nickserv.example.conf.in" "${BIN_DIR}/nickserv.conf" elif [ -f "${BIN_DIR}/nickserv.example.conf" ]; then cp "${BIN_DIR}/nickserv.example.conf" "${BIN_DIR}/nickserv.conf" fi mesaj_ok "nickserv.conf generat." fi echo "" } # ============================================================================= # PASUL 9: CREARE UTILIZATOR ADMIN # ============================================================================= creeaza_admin() { afiseaza_sectiune "PASUL 9: Configurare Utilizator Administrator" mesaj_info "Se configurează utilizatorul administrator în baza de date..." echo "" # Verificăm dacă Manager1K.sh există local MANAGER_SCRIPT="${DIR_GNUWORLD}/doc/cmaster/maint/Manager1K.sh" if [ -f "$MANAGER_SCRIPT" ]; then mesaj_info "Scriptul Manager1K.sh a fost găsit." mesaj_info "Poți folosi acest script pentru a promova un utilizator la nivel 1000." mesaj_info "Comandă: cd ${DIR_GNUWORLD}/doc/cmaster/maint && ./Manager1K.sh" else mesaj_atentie "Scriptul Manager1K.sh nu a fost găsit." fi echo "" mesaj_info "NOTĂ: Utilizatorul '${ADMIN_USER}' a fost configurat în fișierele de configurare" mesaj_info "ca administrator pentru GNUWorld.conf (allowcontrol) și servicii." mesaj_info "" mesaj_info "Pentru a crea contul în baza de date, poți folosi:" mesaj_info " 1. Comanda /msg X HELLO pe IRC (dacă hello este activat)" mesaj_info " 2. Scriptul Manager1K.sh pentru a seta nivelul 1000" mesaj_info " 3. Direct prin SQL cu psql" echo "" } # ============================================================================= # PASUL 10: CREARE SCRIPT DE PORNIRE # ============================================================================= creeaza_script_pornire() { afiseaza_sectiune "PASUL 10: Creare Script de Pornire" local BIN_DIR="${DIR_GNUWORLD}/bin" # Script de pornire cat > "${BIN_DIR}/start.sh" << 'START_EOF' #!/bin/bash # Script de pornire GNUWorld — UnderChat # Pornește GNUWorld în fundal cu verificare de proces existent SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" PIDFILE="gnuworld.pid" if [ -f "$PIDFILE" ]; then PID=$(cat "$PIDFILE") if kill -0 "$PID" 2>/dev/null; then echo "[!] GNUWorld deja rulează cu PID $PID" echo " Folosește stop.sh pentru a-l opri sau restart.sh pentru a reporni." exit 1 else echo "[i] PID vechi găsit ($PID) dar procesul nu mai rulează. Se curăță..." rm -f "$PIDFILE" fi fi echo "[*] Se pornește GNUWorld..." ./gnuworld & PID=$! echo $PID > "$PIDFILE" echo "[✔] GNUWorld pornit cu succes! PID: $PID" echo "[i] Jurnal: verifică mesajele cu 'tail -f gnuworld.log' (dacă există)" START_EOF chmod +x "${BIN_DIR}/start.sh" mesaj_ok "start.sh creat." # Script de oprire cat > "${BIN_DIR}/stop.sh" << 'STOP_EOF' #!/bin/bash # Script de oprire GNUWorld — UnderChat SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" PIDFILE="gnuworld.pid" if [ -f "$PIDFILE" ]; then PID=$(cat "$PIDFILE") if kill -0 "$PID" 2>/dev/null; then echo "[*] Se oprește GNUWorld (PID: $PID)..." kill "$PID" sleep 2 if kill -0 "$PID" 2>/dev/null; then echo "[!] Procesul nu s-a oprit. Se forțează..." kill -9 "$PID" fi rm -f "$PIDFILE" echo "[✔] GNUWorld oprit." else echo "[i] Procesul nu mai rulează. Se curăță PID-ul..." rm -f "$PIDFILE" fi else # Încercăm să găsim procesul manual PID=$(pgrep -f "./gnuworld" 2>/dev/null | head -1) if [ -n "$PID" ]; then echo "[*] Proces GNUWorld găsit cu PID: $PID. Se oprește..." kill "$PID" sleep 2 echo "[✔] GNUWorld oprit." else echo "[i] GNUWorld nu rulează." fi fi STOP_EOF chmod +x "${BIN_DIR}/stop.sh" mesaj_ok "stop.sh creat." # Script de repornire cat > "${BIN_DIR}/restart.sh" << 'RESTART_EOF' #!/bin/bash # Script de repornire GNUWorld — UnderChat SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" echo "[*] Se repornește GNUWorld..." ./stop.sh sleep 3 ./start.sh RESTART_EOF chmod +x "${BIN_DIR}/restart.sh" mesaj_ok "restart.sh creat." # Script de status cat > "${BIN_DIR}/status.sh" << 'STATUS_EOF' #!/bin/bash # Script de verificare status GNUWorld — UnderChat SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" PIDFILE="gnuworld.pid" echo "═══════════════════════════════════════" echo " Status GNUWorld — UnderChat" echo "═══════════════════════════════════════" if [ -f "$PIDFILE" ]; then PID=$(cat "$PIDFILE") if kill -0 "$PID" 2>/dev/null; then UPTIME=$(ps -o etime= -p "$PID" 2>/dev/null | tr -d ' ') MEM=$(ps -o rss= -p "$PID" 2>/dev/null | tr -d ' ') MEM_MB=$((MEM / 1024)) echo " Stare: ✔ ACTIV" echo " PID: ${PID}" echo " Uptime: ${UPTIME}" echo " Memorie: ${MEM_MB} MB" else echo " Stare: ✘ OPRIT (PID vechi: $PID)" fi else PID=$(pgrep -f "./gnuworld" 2>/dev/null | head -1) if [ -n "$PID" ]; then echo " Stare: ✔ ACTIV (fără fișier PID)" echo " PID: ${PID}" else echo " Stare: ✘ OPRIT" fi fi echo "═══════════════════════════════════════" STATUS_EOF chmod +x "${BIN_DIR}/status.sh" mesaj_ok "status.sh creat." # Adăugăm în crontab repornire automată echo "" citeste_da_nu "Dorești să adăugăm pornirea automată în crontab (la restart server)?" "d" ADAUGA_CRON if [ "$ADAUGA_CRON" = true ]; then local CRON_LINE="@reboot cd ${BIN_DIR} && ./start.sh >> ${BIN_DIR}/cron_start.log 2>&1" (crontab -l 2>/dev/null | grep -v "gnuworld"; echo "$CRON_LINE") | crontab - mesaj_ok "Pornire automată adăugată în crontab." fi echo "" } # ============================================================================= # PASUL 11: REZUMAT FINAL # ============================================================================= afiseaza_rezumat() { afiseaza_sectiune "INSTALARE COMPLETĂ!" echo -e "${VERDE}" echo "╔══════════════════════════════════════════════════════════════════════╗" echo "║ INSTALARE FINALIZATĂ CU SUCCES! ║" echo "╚══════════════════════════════════════════════════════════════════════╝" echo -e "${RESET}" echo "" echo -e " ${ALB}Rezumat configurare:${RESET}" echo -e " ─────────────────────────────────────────────────────────────────" echo -e " Directorul GNUWorld: ${CYAN}${DIR_GNUWORLD}${RESET}" echo -e " Server IRC (uplink): ${CYAN}${IRCD_HOST}:${IRCD_PORT}${RESET}" echo -e " Numele serverului: ${CYAN}${NUME_SERVER}${RESET}" echo -e " Numeric server: ${CYAN}${NUMERIC_SERVER}${RESET}" echo -e " Baza de date: ${CYAN}${PG_HOST}:${PG_PORT} (user: ${PG_USER})${RESET}" echo -e " Administrator: ${CYAN}${ADMIN_USER}${RESET}" echo "" echo -e " ${ALB}Servicii activate:${RESET}" echo -e " ─────────────────────────────────────────────────────────────────" echo -e " ${VERDE}✔${RESET} CService (X) — Serviciul de canale" echo -e " ${VERDE}✔${RESET} CControl (UWorld) — Control și administrare" if [ "$ACTIV_OPENCHANFIX" = true ]; then echo -e " ${VERDE}✔${RESET} OpenChanFix (C) — Reparare automată canale" fi if [ "$ACTIV_DRONESCAN" = true ]; then echo -e " ${VERDE}✔${RESET} DroneScan (E) — Detectare drone" fi if [ "$ACTIV_SNOOP" = true ]; then echo -e " ${VERDE}✔${RESET} Snoop (snoopy) — Supraveghere" fi if [ "$ACTIV_SCANNER" = true ]; then echo -e " ${VERDE}✔${RESET} Scanner (netscan) — Scanner rețea" fi if [ "$ACTIV_STATS" = true ]; then echo -e " ${VERDE}✔${RESET} Stats (S) — Statistici" fi if [ "$ACTIV_CLONER" = true ]; then echo -e " ${VERDE}✔${RESET} Cloner — Generator clone" fi if [ "$ACTIV_NICKSERV" = true ]; then echo -e " ${VERDE}✔${RESET} NickServ — Serviciul de pseudonime" fi echo "" echo -e " ${ALB}Fișiere de configurare:${RESET}" echo -e " ─────────────────────────────────────────────────────────────────" echo -e " Principal: ${CYAN}${DIR_GNUWORLD}/bin/GNUWorld.conf${RESET}" echo -e " CService: ${CYAN}${DIR_GNUWORLD}/bin/cservice.conf${RESET}" echo -e " CControl: ${CYAN}${DIR_GNUWORLD}/bin/ccontrol.conf${RESET}" if [ "$ACTIV_OPENCHANFIX" = true ]; then echo -e " ChanFix: ${CYAN}${DIR_GNUWORLD}/bin/openchanfix.conf${RESET}" fi if [ "$ACTIV_DRONESCAN" = true ]; then echo -e " DroneScan: ${CYAN}${DIR_GNUWORLD}/bin/dronescan.conf${RESET}" fi if [ "$ACTIV_SNOOP" = true ]; then echo -e " Snoop: ${CYAN}${DIR_GNUWORLD}/bin/snoop.conf${RESET}" fi if [ "$ACTIV_SCANNER" = true ]; then echo -e " Scanner: ${CYAN}${DIR_GNUWORLD}/bin/scanner.conf${RESET}" fi if [ "$ACTIV_STATS" = true ]; then echo -e " Stats: ${CYAN}${DIR_GNUWORLD}/bin/stats.conf${RESET}" fi if [ "$ACTIV_CLONER" = true ]; then echo -e " Cloner: ${CYAN}${DIR_GNUWORLD}/bin/cloner.conf${RESET}" fi echo "" echo -e " ${ALB}Comenzi utile:${RESET}" echo -e " ─────────────────────────────────────────────────────────────────" echo -e " Pornire: ${GALBEN}cd ${DIR_GNUWORLD}/bin && ./start.sh${RESET}" echo -e " Oprire: ${GALBEN}cd ${DIR_GNUWORLD}/bin && ./stop.sh${RESET}" echo -e " Repornire: ${GALBEN}cd ${DIR_GNUWORLD}/bin && ./restart.sh${RESET}" echo -e " Status: ${GALBEN}cd ${DIR_GNUWORLD}/bin && ./status.sh${RESET}" echo "" echo -e " ${ALB}Pași următori:${RESET}" echo -e " ─────────────────────────────────────────────────────────────────" echo -e " 1. Verifică fișierele de configurare din ${CYAN}${DIR_GNUWORLD}/bin/${RESET}" echo -e " 2. Asigură-te că ircd-ul este pornit și ascultă pe ${CYAN}${IRCD_HOST}:${IRCD_PORT}${RESET}" echo -e " 3. Verifică parola din ircd.conf să fie: ${CYAN}${IRCD_PASS}${RESET}" echo -e " 4. Pornește GNUWorld: ${GALBEN}cd ${DIR_GNUWORLD}/bin && ./start.sh${RESET}" echo -e " 5. Creează contul admin cu /msg X HELLO sau Manager1K.sh" echo "" echo -e " ${ALB}Jurnal instalare salvat în: ${CYAN}${JURNAL}${RESET}" echo "" echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${RESET}" echo -e "${BOLD} Mulțumim că folosești GNUWorld pe Rețeaua UnderChat! 🎉${RESET}" echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${RESET}" echo "" } # ============================================================================= # MENIU PRINCIPAL # ============================================================================= meniu_principal() { afiseaza_banner echo -e " ${ALB}Bine ai venit la scriptul de instalare GNUWorld!${RESET}" echo "" echo -e " Acest script va instala și configura automat GNUWorld cu" echo -e " toate serviciile necesare pentru rețeaua ta IRC." echo "" echo -e " ${ALB}Ce va face acest script:${RESET}" echo -e " 1. Verificare sistem și dependențe" echo -e " 2. Instalare dependențe (dacă e nevoie)" echo -e " 3. Detectare și configurare PostgreSQL" echo -e " 4. Configurare parametri rețea IRC" echo -e " 5. Selectare servicii dorite" echo -e " 6. Descărcare și compilare GNUWorld" echo -e " 7. Creare baze de date" echo -e " 8. Generare fișiere de configurare" echo -e " 9. Configurare administrator" echo -e " 10. Creare scripturi de pornire/oprire" echo "" citeste_da_nu "Dorești să începem instalarea?" "d" START_INSTALARE if [ "$START_INSTALARE" = false ]; then echo "" mesaj_info "Instalare anulată. La revedere!" exit 0 fi } # ============================================================================= # FUNCȚIE PRINCIPALĂ # ============================================================================= main() { # Inițializăm jurnalul echo "=========================================" > "$JURNAL" echo " Instalare GNUWorld — $(date)" >> "$JURNAL" echo "=========================================" >> "$JURNAL" meniu_principal verifica_sistem instaleaza_dependente detecteaza_postgresql configureaza_retea selecteaza_servicii descarca_si_compileaza creeaza_baze_de_date genereaza_configurari creeaza_admin creeaza_script_pornire afiseaza_rezumat } # Rulăm programul principal main "$@"