# Instalare Automată UnderChat IRCd 🚀

Această pagină descrie cum să instalezi și configurezi automat UnderChat IRCd folosind scripturile furnizate.

## 📋 Cerințe

Înainte de a rula scripturile de instalare, asigură-te că ai următoarele pachete instalate:

### Debian/Ubuntu
```bash
sudo apt-get update
sudo apt-get install -y build-essential autoconf automake libtool libssl-dev perl
```

### RHEL/CentOS/Fedora
```bash
sudo yum install -y gcc make autoconf automake libtool openssl-devel perl
```

### macOS
```bash
xcode-select --install
brew install autoconf automake libtool openssl
```

## 🚀 Instalare Rapidă

### Opțiunea 1: Instalare Automată Standard

Cea mai simplă metodă - lase script-ul să facă totul:

```bash
# Clonează repository-ul
git clone https://gitlab.back.ro/underchat/ircu2.git
cd ircu2

# Execută instalarea automată
./install.sh
```

Script-ul va:
1. ✓ Verifica dependențele
2. ✓ Ruleaza `./configure` cu setări optime
3. ✓ Compilează codul sursă
4. ✓ Instalează binare și biblioteci
5. ✓ Cere informații de bază și generează `ircd.conf`
6. ✓ Creează structura de directoare necesară

### Opțiunea 2: Instalare cu Configurare Interactivă

Pentru control complet asupra setărilor:

```bash
./install.sh                              # Instalare standard
./configure-interactive.sh                # Configurare avansată
```

Script-ul interactiv te va ghida prin:
- Setări generale (nume, descriere, numeric)
- Informații administrator
- Configurare porturi
- Clase de conexiuni
- Setări operatori
- Caracteristici avansate

## ⚙️ Opțiuni de Instalare

### Instalare Customizată

```bash
# Instalare cu prefix personalizat
./install.sh --prefix /opt/ircd

# Instalare cu maxim conexiuni diferit
./install.sh --maxcon 8192

# Instalare cu debug activat
./install.sh --debug

# Dezactivare SSL/TLS
./install.sh --no-ssl

# Setare versiune la build
./install.sh --version 1.0.3

# Combinatie de optiuni
./install.sh --prefix /opt/ircd --maxcon 16384 --debug
```

### Toate Opțiunile Disponibile

```
Usage: ./install.sh [OPTIONS]

OPTIONS:
  -h, --help              Afiseaza mesajul de ajutor
  -p, --prefix PATH       Calea de instalare (implicit: $HOME/ircd)
  -m, --maxcon NUM        Numarul maxim de conexiuni (implicit: 4096)
  -d, --debug             Activeaza modul de debug
  -s, --no-ssl            Dezactiveaza suportul SSL/TLS
  -c, --config FILE       Fisier de configurare initial
  -V, --version VER       Seteaza versiunea in PATCHLEVEL (ex: 1.0.3)
```

## 📁 Structura Directoarelor Post-Instalare

După instalare, vei avea:

```
~/ircd/                          (prefix implicit)
├── bin/
│   ├── ircd                      # Executable principal
│   ├── umkpasswd                 # Generator de parole
│   └── ...
├── lib/
│   ├── libircd.a                # Biblioteci compilate
│   └── ...
├── etc/
│   ├── ircd.conf                # Fișier configurare principal
│   ├── ircd.motd                # Message of the Day
│   └── ircd.opermotd            # Operator MOTD
├── log/
│   └── ircd.log                 # Fișier de log
└── var/
    └── ...
```

## 🔧 Pornirea Serverului

### Pornire Standard

```bash
# Folosind fișierul de configurare implicit
~/ircd/bin/ircd

# Sau specificând fișierul de configurare
~/ircd/bin/ircd -f ~/ircd/etc/ircd.conf
```

### Opțiuni de Pornire

```bash
# Pornire în background
nohup ~/ircd/bin/ircd &

# Pornire cu debugging
~/ircd/bin/ircd -d

# Verificare sintaxă configurare
~/ircd/bin/ircd -c

# Afișare versiune
~/ircd/bin/ircd -v
```

## 🔐 Setare Parola Operator

Pentru a folosi comenzi de operator, ai nevoie de o parola hash:

```bash
# Generează parola
~/ircd/bin/umkpasswd

# Output exemplu:
# Introdu parola: ****
# Repeta parola: ****
# Hash: $2a$04$NTy1i.X/8pXekNBNbMRlOu1JAjIiMfPGIe1sZf0Xqq.2jzqPMfN/G

# Copiază hash-ul în ~/ircd/etc/ircd.conf
nano ~/ircd/etc/ircd.conf
# Cauta secțiunea Operator { } și înlocuiește password = "..."
```

## 📝 Editare Configurare

Fișierul de configurare este generat automat, dar poți să-l editezi:

```bash
nano ~/ircd/etc/ircd.conf
```

### Secțiuni Importante

**General** - Setări server
```
General {
    name = "irc.example.com";
    description = "My IRC Server";
    numeric = 1;
};
```

**Operator** - Definire operatori
```
Operator {
    nick = "root";
    password = "$2a$04$...";  # Hash bcrypt
    privileges = "+all";
    host = "127.0.0.1";
};
```

**Port** - Configurare porturi
```
Port {
    port = 6667;
    mask = 0.0.0.0;
};
```

**Class** - Clase de conexiuni
```
Class {
    name = "clients";
    pingfreq = 120;
    maxlinks = 10;
    sendq = 40000;
};
```

## 🌐 Conectare la Server

După pornire, poți să te conectezi cu un client IRC:

```
Server: localhost
Port: 6667 (sau 6697 pentru SSL)
Nick: nickname
```

## 🔍 Verificare Status

### Log-uri

```bash
# Afișare log-uri live
tail -f ~/ircd/log/ircd.log

# Ultimi 50 de rânduri
tail -50 ~/ircd/log/ircd.log

# Căutare erori
grep ERROR ~/ircd/log/ircd.log
```

### Procese Active

```bash
# Verifică dacă ircd rulează
ps aux | grep ircd

# Procese pe port
netstat -tlnp | grep 6667
```

## 🐛 Rezolvare Probleme

### "Check on CPATH (ircd.conf) failed: No such file or directory"

Aceasta este problema nr. 1 din lista ta. Server-ul nu găsește configurația:

```bash
# Verifică locația config-ului
ls -la ~/ircd/etc/ircd.conf

# Dacă nu există, regenerează prin install.sh
./install.sh

# Sau din admin.sh
./admin.sh
# → Opțiunea 9) Regenerare configurație prin install.sh
```

**Cauza**: Configurația e în `lib/` în loc de `etc/` sau CPATH e setat greșit.

### "Config parse error on line X: syntax error"

Problema nr. 2 - erori de sintaxă în configurație:

```bash
# Test sintaxă detaliat
./admin.sh
# → Opțiunea 8) Test sintaxă configurare

# Regenerare completă cu toate remedierile
./install.sh

# Verificare manuală cu context
nano +126 ~/ircd/lib/ircd.conf  # înlocuiește 126 cu linia ta
```

**Cauze comune**:
- Ghilimele neînchise: `"text neinchis`
- Acolade nepotrivite: `{ fără }`
- Virgulă lipsă: `setting = "value" missing;`

### Host hiding nu funcționează (problema nr. 2)

**Simptome**: IP-ul real apare în WHOIS în loc să fie ascuns cu format hexadecimal

**Exemplu problemă**: `~Raducu@188.24.5.202` în loc de `~Raducu@4C5DA6.3305AC.147F4A.B19664.IP`

```bash
# SOLUȚIE COMPLETĂ - regenerare prin install.sh care include toate remedierile
./install.sh

# SAU verifică manual în ircd.conf:
features {
    "HOST_HIDING" = "TRUE";
    "HOST_HIDING_STYLE" = "3";           # CRITIC - folosește 3 pentru format hexadecimal
    "HIDDEN_HOST" = "users.underchat.org";
    "HIDDEN_IP" = "127.0.0.1";           # CRITIC - IP-ul de înlocuire
    "HIDDEN_HOSTTYPE" = "3";             # CRITIC - tipul host-ului ascuns
};

# Verifică clasa utilizatorilor:
Class {
    name = "Other";
    usermode = "+ix";  # TREBUIE să fie +ix, nu doar +i
};

# Restart server după modificări
./admin.sh → opțiunea 3) Restart
```

**Cauze principale**:
1. **HOST_HIDING_STYLE = "1" în loc de "3"** - stilul 3 generează format hexadecimal
2. **HIDDEN_HOSTTYPE lipsă** - necesar pentru formatarea corectă  
3. **Usermode +i în loc de +ix** - modul +x nu se aplică automat
4. **Placeholder-uri neînlocuite** - EOFCONFIG_NETWORK rămâne literal

**Configurația funcțională (de pe ns2.node-ase.ovh)**:
- HOST_HIDING_STYLE = "3" → Format: `4C5DA6.3305AC.147F4A.B19664.IP`
- HIDDEN_HOSTTYPE = "3" → Suportă generarea hexadecimală
- Ascundere automată la conectare cu +ix

**Verificare finală**:
```bash
# După restart, conectează-te și testează:
/mode nickname +x
/whois nickname

# Ar trebui să vezi:
# nickname is ~user@4C5DA6.3305AC.147F4A.B19664.IP * Hosted by me
# în loc de IP-ul real
```

### Operatorii nu primesc +W (problema nr. 3)

**Simptome**: Nu primești notificări când cineva îți dă WHOIS ca operator/administrator

```bash
# SOLUȚIE COMPLETĂ - regenerare prin install.sh cu toate remedierile integrate
./install.sh

# SAU verifică manual în ircd.conf:

# 1. Features pentru notificări WHOIS
features {
    "OPER_WHOIS_PARANOIA" = "TRUE";      # CRITIC
    "WHOIS_NOTICE" = "TRUE";             # CRITIC
    "SPY_WHOIS" = "TRUE";                # CRITIC - pentru notificări complete
    "SNOMASK_OPERDEFAULT" = "1024";      # CRITIC - mask pentru operatori
    "SNOMASK_DEFAULT" = "1024";          # CRITIC - mask pentru utilizatori
};

# 2. Configurația operatorului
Operator {
    name = "root";
    password = "$hash$";
    host = "*@*";
    class = "Opers";
    admin = yes;
    snomask = "+s";                      # SIMPLU - evită conflictele
    privileges = "PRIV_WHOIS_NOTICE", "PRIV_HIDE_OPER", "PRIV_ADMIN";  # CRITIC
};

# 3. Clasa Opers
Class {
    name = "Opers";
    usermode = "+Wx";  # CRITIC - trebuie +Wx, nu doar +W
    # ...alte setări...
};

# Restart server după modificări
./admin.sh → opțiunea 3) Restart
```

**Cauze principale**:
1. **SPY_WHOIS lipsă** - fără asta nu primești notificările
2. **PRIV_WHOIS_NOTICE lipsă** - privilegiul pentru notificări
3. **SNOMASK_OPERDEFAULT lipsă** - mask-ul pentru operatori
4. **Usermode +W în loc de +Wx** - lipsește notificarea completă

**Verificare finală**:
```bash
# După restart, fă-te operator și testează:
/oper username parola
/mode nickname    # ar trebui să vezi +Wx

# Cere cuiva să-ți dea WHOIS:
# Ar trebui să primești:
# *** Notice: nickname (user@host) is doing a WHOIS on you
```

### Porturile publice nu se generează corect

**Simptome**: În ircd.conf pe linia 126 apare `EOFCONFIG_CLIENT_PORTS` în loc de blocurile Port

**Eroarea exactă**: `Config parse error in file ircd.conf on line 126: syntax error`

**Soluție**: Reinstalează cu versiunea corectată:

```bash
# Șterge instalarea veche
rm -rf ~/ircu2

# Reinstalează cu versiunea v1.0.4 care include toate remedierile
git clone https://gitlab.back.ro/underchat/ircu2.git
cd ircu2
./install.sh
```

**Ce include versiunea v1.0.4**:
- ✅ Template-ul generat corect cu toate porturile
- ✅ Placeholder-urile EOFCONFIG înlocuite automat
- ✅ snomask corectat la "+s" (fără erori de sintaxă)
- ✅ IP-ul corect aplicat pe toate porturile
- ✅ Toate remedierile integrate DIRECT în install.sh

**Verificare finală**:
```bash
# După reinstalare, testează sintaxa:
~/ircd/bin/ircd -c -f ~/ircd/lib/ircd.conf
# Ar trebui să afișeze: "Configuration file ircd.conf checked okay."

# Verifică că nu mai sunt placeholder-uri:
grep -i EOFCONFIG ~/ircd/lib/ircd.conf
# Nu ar trebui să găsească nimic
```

### "Permission denied" la ./configure

```bash
# Verifică permisiunile
ls -la configure

# Dacă nu are +x, corecteaza:
chmod +x configure
chmod +x install-sh config.guess config.sub
```

### "Compilation failed"

```bash
# Verifica logul de compilare
make 2>&1 | tail -50

# Curața și încearcă din nou
make clean
./configure --enable-debug
make
```

### "Port already in use"

```bash
# Verifică ce folosește portul
lsof -i :6667

# Schimbă portul în configurare
nano ~/ircd/etc/ircd.conf
# Cauta Port { port = 6667; }
```

### Errori SSL/TLS

Dacă ai probleme cu SSL:

```bash
# Reinstalează fără SSL
./install.sh --no-ssl

# Sau instalează openssl-dev
sudo apt-get install libssl-dev
```

### Script de Regenerare Automată

Pentru remedierea rapidă a problemelor comune, cea mai bună soluție este regenerarea prin install.sh:

```bash
# Regenerează configurația completă cu toate remedierile integrate
./install.sh

# Sau din meniul admin
./admin.sh
# → Opțiunea 9) Regenerare configurație prin install.sh
```

Regenerarea prin install.sh include AUTOMAT:
- ✅ Configurația în directorul corect (lib/)
- ✅ Permisiuni corecte pe fișiere
- ✅ Toate placeholder-urile înlocuite corect
- ✅ Host hiding cu format hexadecimal  
- ✅ Notificări WHOIS pentru operatori
- ✅ Porturi generate cu IP-ul corect specificat
- ✅ Test sintaxă final și reparare automată

## 🛠️ Troubleshooting Avansat

### Debug Mode pentru Dezvoltatori

```bash
# Compilare cu debugging
./install.sh --debug

# Pornire cu verbose output
~/ircd/bin/ircd -d -f ~/ircd/etc/ircd.conf

# Urmărire log-uri în timp real
tail -f ~/ircd/log/ircd.log
```

### Verificare Configurație Completă

```bash
# Validare sintaxă
~/ircd/bin/ircd -c -f ~/ircd/etc/ircd.conf

# Check cu output detaliat
~/ircd/bin/ircd -k -f ~/ircd/etc/ircd.conf 2>&1 | head -20

# Backup și regenerare
cp ~/ircd/etc/ircd.conf ~/ircd/etc/ircd.conf.backup
./install.sh --config ~/ircd/etc/ircd.conf.backup
```
