1666 lines
55 KiB
Bash
Executable File
1666 lines
55 KiB
Bash
Executable File
#!/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 "$@"
|
||
|