diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..2d6a078 --- /dev/null +++ b/install.sh @@ -0,0 +1,1665 @@ +#!/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 "$@" +