gnuworld/install.sh

1666 lines
55 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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