ircu2/install.sh

686 lines
18 KiB
Bash
Executable File

#!/bin/bash
#
# Script de instalare automată pentru Nefarious IRCd
# Limba: Română
# Data: 2026
#
# Culori pentru output
ROSU='\033[0;31m'
VERDE='\033[0;32m'
GALBEN='\033[1;33m'
ALBASTRU='\033[0;34m'
NC='\033[0m' # Fără culoare
# Setări implicite
PREFIX="${HOME}/ircd"
MAXCON=4096
ENABLE_DEBUG=0
ENABLE_SSL=1
# Funcția de afișare a ajutorului
show_help() {
cat << EOF
${ALBASTRU}Script de instalare automată pentru Nefarious IRCd${NC}
Utilizare: ./install.sh [OPȚIUNI]
${GALBEN}OPȚIUNI:${NC}
-h, --help Afișează acest mesaj de ajutor
-p, --prefix PATH Calea de instalare (implicit: \$HOME/ircd)
-m, --maxcon NUM Numărul maxim de conexiuni (implicit: 4096)
-d, --debug Activează modul de debug
-s, --no-ssl Dezactivează suportul SSL/TLS
-c, --config FILE Fișier de configurare inițial
${GALBEN}EXEMPLE:${NC}
./install.sh
./install.sh --prefix /opt/ircd --maxcon 8192
./install.sh --debug --config myconfig.conf
EOF
}
# Funcția de log
log_info() {
echo -e "${VERDE}[INFO]${NC} $1"
}
log_warn() {
echo -e "${GALBEN}[AVERTIZARE]${NC} $1"
}
log_error() {
echo -e "${ROSU}[EROARE]${NC} $1"
}
log_success() {
echo -e "${VERDE}[SUCCES]${NC} $1"
}
# Funcția pentru generare hash parola
generate_password_hash() {
local password="$1"
# Verifica daca openssl e disponibil pentru MD5
if command -v openssl &> /dev/null; then
# Genereaza MD5 hash (SMD5 format pentru ircd)
echo "$password" | openssl dgst -md5 -binary | base64
else
# Fallback: foloseste doar password plain (nu e recomandat!)
echo "PLAIN:$password"
fi
}
# Funcția pentru validare parola
validate_password() {
local pass="$1"
if [ ${#pass} -lt 4 ]; then
return 1
fi
return 0
}
# Funcția de verificare a dependențelor
check_dependencies() {
log_info "Verificare dependențe..."
local missing_deps=0
# Verifică compilatorul C
if ! command -v gcc &> /dev/null && ! command -v cc &> /dev/null; then
log_error "GCC/CC nu este instalat!"
missing_deps=1
else
log_success "Compilator C găsit"
fi
# Verifică make
if ! command -v make &> /dev/null; then
log_error "Make nu este instalat!"
missing_deps=1
else
log_success "Make găsit"
fi
# Verifică autoconf
if ! command -v autoconf &> /dev/null; then
log_warn "Autoconf nu este instalat (optional)"
else
log_success "Autoconf găsit"
fi
# Verifică bibliotecile SSL
if command -v pkg-config &> /dev/null; then
if ! pkg-config --exists openssl; then
log_warn "OpenSSL dev nu este instalat (optional)"
else
log_success "OpenSSL găsit"
fi
fi
if [ $missing_deps -eq 1 ]; then
log_error "Lipsesc dependențe! Instalează-le și încearcă din nou."
return 1
fi
return 0
}
# Funcția pentru fixare config.guess pentru aarch64
fix_config_guess() {
log_info "Verificare support aarch64 în config.guess..."
# Verifică dacă config.guess e vechi și nu suportă aarch64
if [ -f "./config.guess" ] && ! grep -q "aarch64" ./config.guess; then
log_warn "config.guess e vechi, adaugă suport aarch64..."
# Patch pentru aarch64
if grep -q "case \"\$machine\" in" ./config.guess; then
# Adaugă case pentru aarch64 înainte de default
sed -i '/case "$machine" in/a\
\t\taarch64*|arm64*)\
\t\t\techo aarch64-unknown-linux-gnu\
\t\t\texit 0\
\t\t\t;;' ./config.guess
log_success "Support aarch64 adăugat la config.guess"
fi
fi
# Dacă config.guess tot nu merge, folosește --build flag
return 0
}
# Funcția de configurare
configure_ircd() {
log_info "Configurare Nefarious IRCd..."
# Fixează config.guess pentru aarch64
fix_config_guess
local config_args="--prefix=$PREFIX"
config_args="$config_args --with-maxcon=$MAXCON"
if [ $ENABLE_DEBUG -eq 1 ]; then
config_args="$config_args --enable-debug"
fi
if [ $ENABLE_SSL -eq 0 ]; then
config_args="$config_args --disable-ssl"
fi
# Adaugă --build flag pentru sisteme care nu pot detecta
if [ "$(uname -m)" = "aarch64" ]; then
config_args="$config_args --build=aarch64-unknown-linux-gnu"
log_info "Detectat aarch64, adaugă --build=aarch64-unknown-linux-gnu"
fi
log_info "Parametri configure: $config_args"
if [ ! -f "./configure" ]; then
log_error "Fișierul configure nu găsit!"
return 1
fi
./configure $config_args
if [ $? -ne 0 ]; then
log_error "Configurare eșuată!"
return 1
fi
log_success "Configurare finalizată cu succes"
return 0
}
# Funcția de compilare
compile_ircd() {
log_info "Compilare Nefarious IRCd..."
make clean > /dev/null 2>&1
make
if [ $? -ne 0 ]; then
log_error "Compilare eșuată!"
return 1
fi
log_success "Compilare finalizată cu succes"
return 0
}
# Funcția de instalare
install_ircd() {
log_info "Instalare Nefarious IRCd..."
make install
if [ $? -ne 0 ]; then
log_error "Instalare eșuată!"
return 1
fi
log_success "Instalare finalizată cu succes"
return 0
}
# Funcția de generare a fișierului de configurare
generate_config() {
local config_file="$1"
local server_name="${2:-localhost.localdomain}"
local server_desc="${3:-Nefarious IRCd Server}"
local server_numeric="${4:-1}"
local admin_location="${5:-Romania}"
local admin_contact="${6:-admin@underchat.ro}"
local vhost="${7:-127.0.0.1}"
local network="${8:-underchat.org}"
log_info "Generare fișier de configurare: $config_file"
mkdir -p "$(dirname "$config_file")"
cat > "$config_file" << 'EOFCONFIG'
# Fișier de configurare pentru Nefarious IRCd
# Generat automat în data: 2026
# Limba: Română
# Model: Node-Ase.ovh Professional IRC Server
# ============================================================================
# SECȚIUNE: GENERAL
# ============================================================================
General {
# Numele serverului (trebuie unic în rețea)
name = "EOFCONFIG_NAME";
# Virtual Host - IP pe care ascultă
vhost = "EOFCONFIG_VHOST";
# Descrierea serverului
description = "EOFCONFIG_DESC";
# Numeric-ul serverului (0-4095, trebuie unic în rețea)
numeric = EOFCONFIG_NUMERIC;
# Servere DNS pentru rezolvare domenii
dns server = "8.8.8.8";
dns server = "1.1.1.1";
};
# ============================================================================
# SECȚIUNE: ADMIN
# ============================================================================
Admin {
# Locații (maxim 2)
Location = "EOFCONFIG_NETWORK World";
Location = "EOFCONFIG_ADMIN_LOC";
# Contacti
Contact = "EOFCONFIG_ADMIN_CONTACT";
};
# ============================================================================
# SECȚIUNE: CLASE DE CONEXIUNI
# ============================================================================
# Clasă pentru servere principale (hub)
Class {
name = "Server";
pingfreq = 1 minutes 30 seconds;
connectfreq = 5 minutes;
maxlinks = 1;
sendq = 9000000;
};
# Clasă pentru clienți obișnuiți
Class {
name = "Local";
pingfreq = 1 minutes 30 seconds;
sendq = 160000;
maxlinks = 100;
usermode = "+iw";
};
# Clasă pentru clienți normali (implicit)
Class {
name = "Other";
pingfreq = 1 minutes 30 seconds;
sendq = 160000;
maxlinks = 2048;
usermode = "+ix";
};
# Clasă pentru operatori
Class {
name = "Opers";
pingfreq = 1 minutes 30 seconds;
sendq = 160000;
maxlinks = 20;
local = no;
freeform = yes;
mode_lchan = yes;
deop_lchan = yes;
walk_lchan = yes;
show_invis = yes;
see_chan = yes;
list_chan = yes;
usermode = "+W";
remove = yes;
};
# ============================================================================
# SECȚIUNE: CLIENT - Restricții pentru conexiuni
# ============================================================================
# Configurare implicită pentru toți clienții
Client {
host = "*@*";
ip = "*@*";
class = "Other";
maxlinks = 6;
};
# ============================================================================
# SECȚIUNE: JUPED NICKS - Nick-uri rezervate
# ============================================================================
Jupe {
# Litere și caractere speciale
nick = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
# Servicii de rețea
nick = "StatServ,NoteServ";
nick = "ChanServ,ChanSaver";
nick = "NickServ,NickSaver";
};
# ============================================================================
# SECȚIUNE: PORTURI
# ============================================================================
# Port pentru server-to-server
Port {
vhost = "EOFCONFIG_VHOST" 4400;
server = yes;
hidden = yes;
};
# Port standard pentru clienți
Port {
vhost = "EOFCONFIG_VHOST" 6667;
hidden = yes;
};
# Port SSL/TLS pentru clienți (opțional)
# Port {
# vhost = "EOFCONFIG_VHOST" 6697;
# ssl = yes;
# hidden = yes;
# };
# ============================================================================
# SECȚIUNE: OPERATORI
# ============================================================================
Operator {
# Nickname-ul operatorului
name = "AdminRoot";
# Password-ul operatorului (hash MD5/bcrypt/SMD5)
# Generează cu: ./ircd/umkpasswd
password = "$2a$04$NTy1i.X/8pXekNBNbMRlOu1JAjIiMfPGIe1sZf0Xqq.2jzqPMfN/G";
# Host-uri permise pentru operator (*)
host = "*@*";
# Clasă
class = "Opers";
# Permisiuni
# hide_oper = yes;
# hide_channels = yes;
# whois_notice = yes;
admin = yes;
};
# ============================================================================
# SECȚIUNE: CONNECT - Legări cu alte servere
# ============================================================================
# Exemplu: Connect la un server hub
# Connect {
# name = "hub.EOFCONFIG_NETWORK";
# host = "192.168.1.100";
# password = "hub_password";
# port = 4400;
# class = "Server";
# autoconnect = yes;
# hub;
# };
# ============================================================================
# SECȚIUNE: UWORLD - Servere de servicii
# ============================================================================
# UWorld {
# name = "services.EOFCONFIG_NETWORK";
# };
# ============================================================================
# SECȚIUNE: FEATURE - Caracteristici și setări
# ============================================================================
features {
# Network details
"NETWORK" = "EOFCONFIG_NETWORK";
"DOMAINNAME" = "EOFCONFIG_NETWORK";
# Logging
"LOG" = "SYSTEM" "FILE" "EOFCONFIG_PREFIX/log/ircd.log";
"LOG" = "SYSTEM" "LEVEL" "CRIT";
# Server settings
"HUB" = "TRUE";
"RELIABLE_CLOCK" = "FALSE";
"WALLOPS_OPER_ONLY" = "TRUE";
"NODNS" = "FALSE";
"NOIDENT" = "FALSE";
# Client settings
"CLIENT_FLOOD" = "1024";
"BUFFERPOOL" = "27000000";
"DEFAULTMAXSENDQLENGTH" = "40000";
# Host hiding
"HOST_HIDING" = "TRUE";
"HIDDEN_HOST" = "users.EOFCONFIG_NETWORK";
"HIDDEN_IP" = "127.0.0.1";
# Channels
"MAXCHANNELSPERUSER" = "60";
"CHANNELLEN" = "200";
"MAXBANS" = "50";
# Nick settings
"NICKLEN" = "12";
"NICKNAMEHISTORYLENGTH" = "800";
# Timing
"HANGONGOODLINK" = "300";
"HANGONRETRYDELAY" = "10";
"CONNECTTIMEOUT" = "90";
"PINGFREQUENCY" = "120";
"CONNECTFREQUENCY" = "600";
# Welcome messages
"MPATH" = "EOFCONFIG_PREFIX/etc/ircd.motd";
"RPATH" = "EOFCONFIG_PREFIX/etc/remote.motd";
"PPATH" = "EOFCONFIG_PREFIX/var/ircd.pid";
# Stats visibility
"HIS_STATS_u" = "FALSE";
"HIS_STATS_U" = "TRUE";
# Whois privacy
"HIS_WHOIS_SERVERNAME" = "TRUE";
"HIS_WHOIS_IDLETIME" = "TRUE";
"HIS_WHOIS_LOCALCHAN" = "TRUE";
# Who privacy
"HIS_WHO_SERVERNAME" = "TRUE";
"HIS_WHO_HOPCOUNT" = "TRUE";
# Network info
"HIS_NETSPLIT" = "TRUE";
"HIS_SERVERNAME" = "*.EOFCONFIG_NETWORK";
"HIS_SERVERINFO" = "The EOFCONFIG_NETWORK World";
# Operational
"CHECK" = "TRUE";
"CHECK_EXTENDED" = "TRUE";
"MAX_CHECK_OUTPUT" = "1000";
# Admin commands
"SETHOST" = "TRUE";
"NETWORK_REHASH" = "TRUE";
# Channel modes
"HALFOPS" = "TRUE";
# SSL/TLS
# "SSL_CERTFILE" = "EOFCONFIG_PREFIX/etc/ircd.pem";
# "SSL_KEYFILE" = "EOFCONFIG_PREFIX/etc/ircd.pem";
# "SSL_NOSSLv3" = "TRUE";
# CTCP versioning
"CTCP_VERSIONING" = "FALSE";
};
EOFCONFIG
# Înlocuiește placeholder-ele
sed -i "s|EOFCONFIG_NAME|$server_name|g" "$config_file"
sed -i "s|EOFCONFIG_DESC|$server_desc|g" "$config_file"
sed -i "s|EOFCONFIG_NUMERIC|$server_numeric|g" "$config_file"
sed -i "s|EOFCONFIG_PREFIX|$PREFIX|g" "$config_file"
sed -i "s|EOFCONFIG_ADMIN_LOC|$admin_location|g" "$config_file"
sed -i "s|EOFCONFIG_ADMIN_CONTACT|$admin_contact|g" "$config_file"
sed -i "s|EOFCONFIG_VHOST|$vhost|g" "$config_file"
sed -i "s|EOFCONFIG_NETWORK|$network|g" "$config_file"
log_success "Fișier de configurare generat: $config_file"
return 0
}
# Funcția principală
main() {
# Parsare argumente
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-p|--prefix)
PREFIX="$2"
shift 2
;;
-m|--maxcon)
MAXCON="$2"
shift 2
;;
-d|--debug)
ENABLE_DEBUG=1
shift
;;
-s|--no-ssl)
ENABLE_SSL=0
shift
;;
-c|--config)
CONFIG_FILE="$2"
shift 2
;;
*)
log_error "Opțiune necunoscută: $1"
show_help
exit 1
;;
esac
done
echo -e "${ALBASTRU}"
echo "========================================="
echo " Instalare Nefarious IRCd"
echo "========================================="
echo -e "${NC}"
# Verificare dependențe
check_dependencies
if [ $? -ne 0 ]; then
exit 1
fi
# Configurare
configure_ircd
if [ $? -ne 0 ]; then
exit 1
fi
# Compilare
compile_ircd
if [ $? -ne 0 ]; then
exit 1
fi
# Instalare
install_ircd
if [ $? -ne 0 ]; then
exit 1
fi
# Generare fișier de configurare
local conf_file="${PREFIX}/etc/ircd.conf"
if [ -z "$CONFIG_FILE" ]; then
# Citire interactivă de parametri
echo ""
echo -e "${GALBEN}Completare setări server:${NC}"
read -p " Domeniu rețea [underchat.org]: " network_name
network_name=${network_name:-underchat.org}
read -p " Nume server [ns1.${network_name}]: " server_name
server_name=${server_name:-ns1.${network_name}}
read -p " Descriere server [The ${network_name} Network]: " server_desc
server_desc=${server_desc:-The ${network_name} Network}
read -p " Virtual Host / IP [127.0.0.1]: " vhost_ip
vhost_ip=${vhost_ip:-127.0.0.1}
read -p " Numeric server [1]: " server_numeric
server_numeric=${server_numeric:-1}
read -p " Locație admin [Romania]: " admin_location
admin_location=${admin_location:-Romania}
read -p " Contact admin [admin@${network_name}]: " admin_contact
admin_contact=${admin_contact:-admin@${network_name}}
else
server_name=$(grep 'name = "' "$CONFIG_FILE" 2>/dev/null | head -1 | cut -d'"' -f2)
server_name=${server_name:-localhost.localdomain}
vhost_ip="127.0.0.1"
network_name="underchat.org"
fi
generate_config "$conf_file" "$server_name" "$server_desc" "$server_numeric" "$admin_location" "$admin_contact" "$vhost_ip" "$network_name"
if [ $? -ne 0 ]; then
exit 1
fi
# Creare directoare
log_info "Creare structură de directoare..."
mkdir -p "$PREFIX/log"
mkdir -p "$PREFIX/etc"
mkdir -p "$PREFIX/var"
# Creare fișiere MOTD
if [ ! -f "$PREFIX/etc/ircd.motd" ]; then
cat > "$PREFIX/etc/ircd.motd" << 'EOFMOTD'
╔═══════════════════════════════════════╗
║ Bine venit pe Nefarious IRCd! ║
║ Versiune: Underchat Edition ║
║ Data: 2026 ║
╚═══════════════════════════════════════╝
Aceasta este o rețea IRC privată.
Respectă regulile serverului!
EOFMOTD
log_success "Fișier MOTD creat: $PREFIX/etc/ircd.motd"
fi
# Rezumat instalare
echo ""
echo -e "${VERDE}"
echo "========================================="
echo " ✓ Instalare completă!"
echo "========================================="
echo -e "${NC}"
echo ""
echo -e "${GALBEN}Informații de instalare:${NC}"
echo " Calea de instalare: $PREFIX"
echo " Fișier configurare: $conf_file"
echo " Fișier log: $PREFIX/log/ircd.log"
echo " Maxim conexiuni: $MAXCON"
echo " Debug: $([ $ENABLE_DEBUG -eq 1 ] && echo 'Activat' || echo 'Dezactivat')"
echo " SSL/TLS: $([ $ENABLE_SSL -eq 1 ] && echo 'Activat' || echo 'Dezactivat')"
echo ""
echo -e "${GALBEN}Pași următori:${NC}"
echo " 1. Editează configurarea: nano $conf_file"
echo " 2. Generează parola operator: $PREFIX/bin/umkpasswd"
echo " 3. Pornește serverul: $PREFIX/bin/ircd -f $conf_file"
echo " 4. Conectează-te: irc://localhost:6667"
echo ""
}
# Apelează funcția principală
main "$@"