# 🚀 Git Pusher for Splunk

**Version 2.1** | Application Splunk pour déployer vos applications vers Git et le Search Head Cluster

---

## 📋 Table des matières

- [Présentation](#-présentation)
- [Fonctionnalités](#-fonctionnalités)
- [Architecture](#-architecture)
- [Installation - Serveur Source](#-installation---serveur-source)
- [Installation - SH Deployer Agent](#-installation---sh-deployer-agent)
- [Configuration](#-configuration)
- [Configuration HTTPS](#-configuration-https)
- [Système de Licence](#-système-de-licence)
- [Utilisation](#-utilisation)
- [Sécurité](#-sécurité)
- [Personnalisation du Dashboard](#-personnalisation-du-dashboard)
- [Dépannage](#-dépannage)
- [API Reference](#-api-reference)
- [Changelog](#-changelog)
- [Support](#-support)

---

## 🎯 Présentation

**Git Pusher** est une application Splunk Enterprise qui permet de :
1. **Versionner** vos applications Splunk dans un repository Git
2. **Déployer automatiquement** vers un Search Head Cluster via le SH Deployer

Le workflow complet en un clic :
```
Splunk Source → Push Git → Pull SH Deployer → Apply Bundle → Search Head Cluster
```

Idéal pour :
- 📦 Sauvegarder vos configurations Splunk
- 🔄 Versionner vos dashboards et applications
- 👥 Collaborer en équipe sur les développements Splunk
- 🚀 Mettre en place un workflow CI/CD pour Splunk
- 🎯 Déployer automatiquement vers votre Search Head Cluster

---

## ✨ Fonctionnalités

| Fonctionnalité | Description |
|----------------|-------------|
| **Push vers Git** | Déployez une ou plusieurs applications Splunk vers votre repository Git |
| **Déploiement SH Cluster** | Déploiement automatique vers le Search Head Cluster après le push Git |
| **Interface moderne** | Dashboard intuitif avec sélection visuelle des applications |
| **Multi-repository** | Support de GitHub, GitLab, Gitea, Bitbucket et tout serveur Git |
| **Support HTTPS** | Communication sécurisée avec certificats SSL |
| **Système de licence** | Gestion par fichier `.lic` sécurisé |
| **Credentials sécurisés** | Chiffrement des mots de passe Splunk |
| **Logs détaillés** | Traçabilité complète des opérations |

---

## 🏗 Architecture

```
┌─────────────────────────────────────────────────────────────────┐
│                    SERVEUR SOURCE                                │
│  ┌─────────────┐     ┌─────────────────────────────────────┐    │
│  │   Splunk    │────▶│  Git Pusher Server (:9999)          │    │
│  │  Dashboard  │     │  1. Push apps vers Git              │    │
│  │   (HTTPS)   │     │  2. Appelle le SH Deployer Agent    │    │
│  └─────────────┘     └──────────────────┬──────────────────┘    │
└─────────────────────────────────────────┼───────────────────────┘
                                          │ HTTPS (:9998)
                                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                      SH DEPLOYER                                 │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │  Deployer Agent (:9998)                                  │    │
│  │  1. Git pull dans /opt/splunk/etc/shcluster/apps/       │    │
│  │  2. Exécute: splunk apply shcluster-bundle              │    │
│  └─────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────┘
                                          │
                                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                   SEARCH HEAD CLUSTER                            │
│  ┌───────────┐    ┌───────────┐    ┌───────────┐               │
│  │    SH1    │    │    SH2    │    │    SH3    │               │
│  └───────────┘    └───────────┘    └───────────┘               │
└─────────────────────────────────────────────────────────────────┘
```

### Structure des fichiers

```
SERVEUR SOURCE - pusher_app_prem/
├── bin/
│   ├── git_pusher.py           # Serveur HTTP/HTTPS principal (port 9999)
│   ├── license_validator.py    # Validation des licences
│   ├── license_generator.py    # Génération des licences (vendeur)
│   ├── credentials_manager.py  # Gestion sécurisée des credentials
│   └── start_git_pusher.sh     # Script de démarrage
├── appserver/static/
│   ├── git_pusher.js           # Logique JavaScript principale
│   └── license_validation.js   # Interface de gestion des licences
├── default/data/ui/views/
│   └── git_pusher_-_deploy_applications.xml  # Dashboard principal
├── local/
│   ├── license.lic             # Fichier de licence (après activation)
│   ├── .credentials            # Credentials chiffrés
│   ├── .key                    # Clé de chiffrement
│   └── certs/                  # Certificats SSL
│       ├── server.crt
│       └── server.key
└── README.md

SH DEPLOYER - deployer_agent/
├── bin/
│   ├── deployer_agent.py       # Agent de déploiement (port 9998)
│   └── start_deployer_agent.sh # Script de démarrage
└── local/
    └── certs/                  # Certificats SSL
        ├── server.crt
        └── server.key
```

---

## 📥 Installation - Serveur Source

### Prérequis

- Splunk Enterprise 8.x ou supérieur
- Python 3.7+
- Git installé sur le serveur (`yum install git` ou `apt install git`)
- OpenSSL (pour la génération des certificats HTTPS)
- Accès réseau vers votre repository Git

### Étapes d'installation

#### 1. Extraire l'application

```bash
# Copier l'application dans Splunk
cp -r pusher_app_prem /opt/splunk/etc/apps/

# Définir les permissions
chown -R splunk:splunk /opt/splunk/etc/apps/pusher_app_prem
chmod +x /opt/splunk/etc/apps/pusher_app_prem/bin/*.sh
```

#### 2. Configurer les credentials Splunk

```bash
cd /opt/splunk/etc/apps/pusher_app_prem/bin/
./start_git_pusher.sh credentials setup
```

```
==================================================
Git Pusher - Credentials Setup
==================================================

Splunk Username [admin]: admin
Splunk Password: ********
Confirm Password: ********

✓ Credentials saved securely!
```

#### 3. Configurer HTTPS (si Splunk est en HTTPS)

```bash
# Créer le dossier des certificats
mkdir -p /opt/splunk/etc/apps/pusher_app_prem/local/certs

# Générer un certificat auto-signé (valide 365 jours)
openssl req -x509 -newkey rsa:4096 \
  -keyout /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.key \
  -out /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.crt \
  -days 365 -nodes -subj "/CN=git-pusher"

# Définir les permissions
chmod 600 /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.key
chown -R splunk:splunk /opt/splunk/etc/apps/pusher_app_prem/local/certs/
```

#### 4. Démarrer le serveur Git Pusher

```bash
./start_git_pusher.sh start
```

#### 5. Ouvrir le firewall (si nécessaire)

```bash
# FirewallD
sudo firewall-cmd --add-port=9999/tcp --permanent
sudo firewall-cmd --reload

# UFW
sudo ufw allow 9999/tcp
```

#### 6. Redémarrer Splunk

```bash
/opt/splunk/bin/splunk restart
```

#### 7. Accepter le certificat dans le navigateur

1. Ouvrir : `https://VOTRE_IP_SPLUNK:9999/health`
2. Accepter le certificat auto-signé
3. Rafraîchir le dashboard (Ctrl+Shift+R)

---

## 📥 Installation - SH Deployer Agent

### Sur le serveur SH Deployer

#### 1. Créer l'application

```bash
# Créer les dossiers
mkdir -p /opt/splunk/etc/apps/deployer_agent/bin
mkdir -p /opt/splunk/etc/apps/deployer_agent/local/certs

# Copier les fichiers
cp deployer_agent.py /opt/splunk/etc/apps/deployer_agent/bin/
cp start_deployer_agent.sh /opt/splunk/etc/apps/deployer_agent/bin/

# Rendre exécutable
chmod +x /opt/splunk/etc/apps/deployer_agent/bin/start_deployer_agent.sh
```

#### 2. Configurer le token d'authentification

```bash
nano /opt/splunk/etc/apps/deployer_agent/bin/deployer_agent.py
```

Modifier la ligne `AUTH_TOKEN` :
```python
AUTH_TOKEN = "votre_token_secret_personnalise"
```

#### 3. Configurer le Search Head Captain

Dans le même fichier, trouver la fonction `apply_shcluster_bundle` et modifier l'IP du captain :
```python
target_uri = "https://IP_DU_CAPTAIN:8089"
```

#### 4. Générer les certificats SSL

```bash
cd /opt/splunk/etc/apps/deployer_agent/bin/
./start_deployer_agent.sh gencerts
```

#### 5. Définir les permissions

```bash
chown -R splunk:splunk /opt/splunk/etc/apps/deployer_agent
```

#### 6. Ouvrir le firewall

```bash
sudo firewall-cmd --add-port=9998/tcp --permanent
sudo firewall-cmd --reload
```

#### 7. Démarrer l'agent

```bash
./start_deployer_agent.sh start
```

#### 8. Vérifier le statut

```bash
./start_deployer_agent.sh status
```

#### 9. Accepter le certificat

Ouvrir dans un navigateur : `https://IP_SH_DEPLOYER:9998/health`
Accepter le certificat auto-signé.

---

## ⚙️ Configuration

### Commandes Git Pusher (Serveur Source)

```bash
cd /opt/splunk/etc/apps/pusher_app_prem/bin/

# Démarrer le serveur
./start_git_pusher.sh start

# Arrêter le serveur
./start_git_pusher.sh stop

# Redémarrer le serveur
./start_git_pusher.sh restart

# Voir le statut
./start_git_pusher.sh status

# Voir les logs
./start_git_pusher.sh logs
./start_git_pusher.sh logs -f  # Mode follow

# Gestion des credentials
./start_git_pusher.sh credentials setup
./start_git_pusher.sh credentials status
./start_git_pusher.sh credentials delete
```

### Commandes Deployer Agent (SH Deployer)

```bash
cd /opt/splunk/etc/apps/deployer_agent/bin/

# Démarrer l'agent
./start_deployer_agent.sh start

# Arrêter l'agent
./start_deployer_agent.sh stop

# Redémarrer l'agent
./start_deployer_agent.sh restart

# Voir le statut
./start_deployer_agent.sh status

# Voir les logs
./start_deployer_agent.sh logs
./start_deployer_agent.sh logs -f

# Générer les certificats SSL
./start_deployer_agent.sh gencerts

# Tester la connexion
./start_deployer_agent.sh test
```

### Configuration du SH Deployer dans l'interface

1. Ouvrir le dashboard Git Pusher
2. Cliquer sur **⚙️ Configure** dans la section "Deploy to Search Head Cluster"
3. Remplir :
   - **Host** : IP du SH Deployer (ex: 10.10.40.14)
   - **Port** : 9998
   - **Token** : Le même token que dans `deployer_agent.py`
4. Cliquer sur **Save & Test**

---

## 🔒 Configuration HTTPS

### Git Pusher Server (Port 9999)

```bash
mkdir -p /opt/splunk/etc/apps/pusher_app_prem/local/certs

openssl req -x509 -newkey rsa:4096 \
  -keyout /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.key \
  -out /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.crt \
  -days 365 -nodes -subj "/CN=git-pusher"

chmod 600 /opt/splunk/etc/apps/pusher_app_prem/local/certs/server.key
chown -R splunk:splunk /opt/splunk/etc/apps/pusher_app_prem/local/certs/
```

### Deployer Agent (Port 9998)

```bash
mkdir -p /opt/splunk/etc/apps/deployer_agent/local/certs

openssl req -x509 -newkey rsa:4096 \
  -keyout /opt/splunk/etc/apps/deployer_agent/local/certs/server.key \
  -out /opt/splunk/etc/apps/deployer_agent/local/certs/server.crt \
  -days 365 -nodes -subj "/CN=deployer-agent"

chmod 600 /opt/splunk/etc/apps/deployer_agent/local/certs/server.key
chown -R splunk:splunk /opt/splunk/etc/apps/deployer_agent/local/certs/
```

### Vérifier HTTPS

```bash
# Git Pusher
curl -k https://localhost:9999/health

# Deployer Agent
curl -k https://localhost:9998/health
```

---

## 🔐 Système de Licence

Git Pusher utilise un système de licence par fichier `.lic` pour activer les fonctionnalités.

### Types de licences

| Type | Durée | Apps max | Pushes/jour | Fonctionnalités |
|------|-------|----------|-------------|-----------------|
| **Trial** | 14 jours | 3 | 5 | Push basique |
| **Starter** | 1 an | 10 | 50 | + Push programmé |
| **Professional** | 1 an | Illimité | Illimité | + Multi-repo, Support prioritaire |
| **Enterprise** | 1 an | Illimité | Illimité | + SH Cluster deployment, API |

### Activer une licence

1. Ouvrir le dashboard Git Pusher
2. Glisser-déposer le fichier `.lic`
3. Cliquer sur "Activer"

---

## 📖 Utilisation

### Workflow complet : Push Git + Déploiement SH Cluster

1. **Ouvrir le dashboard** Git Pusher

2. **Sélectionner les applications** à déployer

3. **Configurer Git** :
   - Repository URL : `https://github.com/user/repo.git`
   - Branch : `main`
   - Token : Personal Access Token

4. **Activer le déploiement SH Cluster** :
   - Cocher "Enable automatic deployment"
   - (Optionnel) Remplir les credentials Splunk si différents de l'admin par défaut

5. **Cliquer sur "Deploy to Git"**

Le processus automatique :
```
✅ Push vers Git
✅ Pull sur le SH Deployer
✅ Apply shcluster-bundle
✅ Mise à jour du Search Head Cluster
```

### Obtenir un token Git

#### GitHub
1. Settings → Developer settings → Personal access tokens
2. Generate new token
3. Cocher : `repo` (Full control)

#### GitLab
1. Preferences → Access Tokens
2. Create personal access token
3. Scopes : `write_repository`

#### Gitea
1. Settings → Applications → Generate New Token
2. Permissions : `repository: write`

---

## 🔒 Sécurité

### Credentials Splunk

- **Chiffrés** avec une clé dérivée de l'ID machine
- **Stockés** dans un fichier avec permissions `600`
- **Jamais visibles** en clair

### Communication HTTPS

- SSL/TLS entre tous les composants
- Certificats auto-signés supportés
- Validation du token d'authentification

### Token Deployer Agent

- Authentification par token entre Git Pusher et Deployer Agent
- Token configurable dans les deux composants
- Doit être identique des deux côtés

### Bonnes pratiques

1. ✅ Utiliser HTTPS pour tous les composants
2. ✅ Changer le token par défaut du Deployer Agent
3. ✅ Utiliser des tokens Git avec permissions minimales
4. ✅ Restreindre l'accès réseau au port 9998/9999
5. ✅ Renouveler les certificats régulièrement

---

## 🎨 Personnalisation du Dashboard

### Masquer les boutons d'édition

```bash
nano /opt/splunk/etc/apps/pusher_app_prem/default/data/ui/views/git_pusher_-_deploy_applications.xml
```

Modifier la première ligne :
```xml
<dashboard version="1.1" script="license_validation.js, git_pusher.js" hideEdit="true" hideExport="true">
```

### Options disponibles

| Attribut | Description |
|----------|-------------|
| `hideEdit="true"` | Masque le bouton "Modifier" |
| `hideExport="true"` | Masque le bouton "Exporter" |
| `hideTitle="true"` | Masque le titre du dashboard |
| `hideSplunkBar="true"` | Masque la barre Splunk en haut |
| `hideAppBar="true"` | Masque la barre de l'application |
| `hideFooter="true"` | Masque le footer |

### Appliquer les changements

```bash
rm -rf /opt/splunk/var/run/splunk/appserver/*
/opt/splunk/bin/splunk restart
```

---

## 🔧 Dépannage

### Les boutons ne fonctionnent pas

Le fichier JavaScript doit exposer les fonctions globalement. Vérifier que le bloc suivant est présent à la fin de `git_pusher.js` :

```javascript
// Exposer les fonctions globalement
window.showDeployerConfigModal = showDeployerConfigModal;
window.closeDeployerConfigModal = closeDeployerConfigModal;
window.saveDeployerConfigFromModal = saveDeployerConfigFromModal;
window.toggleDeployerAuth = toggleDeployerAuth;

// Attacher les événements aux boutons
(function attachButtonEvents() {
    function tryAttach() {
        var pushBtn = document.getElementById('push-btn');
        if (pushBtn) {
            pushBtn.addEventListener('click', function(e) {
                e.preventDefault();
                pushDashboards();
            });
        }
        
        var buttons = document.querySelectorAll('button.btn');
        buttons.forEach(function(btn) {
            if (btn.textContent.includes('Reset')) {
                btn.addEventListener('click', function(e) {
                    e.preventDefault();
                    resetForm(true);
                });
            }
        });
        
        var configBtn = document.querySelector('.deployer-config-btn');
        if (configBtn) {
            configBtn.addEventListener('click', function(e) {
                e.preventDefault();
                showDeployerConfigModal();
            });
        }
        
        if (!pushBtn) setTimeout(tryAttach, 500);
    }
    
    if (document.readyState === 'complete') {
        setTimeout(tryAttach, 1000);
    } else {
        window.addEventListener('load', function() {
            setTimeout(tryAttach, 1000);
        });
    }
})();
```

Puis vider le cache :
```bash
rm -rf /opt/splunk/var/run/splunk/appserver/*
/opt/splunk/bin/splunk restart
```

Et dans le navigateur : **Ctrl+Shift+R**

### Erreur 401 Unauthorized (Deployer)

Le token ne correspond pas entre les deux composants.

1. Vérifier le token sur le SH Deployer :
```bash
grep "AUTH_TOKEN" /opt/splunk/etc/apps/deployer_agent/bin/deployer_agent.py
```

2. Configurer le même token dans l'interface (⚙️ Configure)

3. Tester :
```bash
curl -k -H "X-Auth-Token: VOTRE_TOKEN" https://IP_DEPLOYER:9998/status
```

### Erreur "tcsetattr: Inappropriate ioctl for device"

La commande `splunk apply shcluster-bundle` attend une entrée interactive.

Solution : Modifier la fonction `apply_shcluster_bundle` dans `deployer_agent.py` pour utiliser `echo 'y' |` :

```python
shell_cmd = f"echo 'y' | {SPLUNK_BIN} apply shcluster-bundle -target {target_uri} -auth {auth_user}:'{escaped_pass}' -preserve-lookups true"
```

### Erreur CORS

Vider le cache Splunk et navigateur :
```bash
rm -rf /opt/splunk/var/run/splunk/appserver/*
/opt/splunk/bin/splunk restart
```
Puis **Ctrl+Shift+R** dans le navigateur.

### Le SH Deployer ne répond pas

```bash
# Vérifier le statut
./start_deployer_agent.sh status

# Voir les logs
tail -50 /opt/splunk/var/log/splunk/deployer_agent.log

# Redémarrer
./start_deployer_agent.sh restart
```

### Le bundle ne s'applique pas

1. Vérifier que le pull a fonctionné :
```bash
ls -la /opt/splunk/etc/shcluster/apps/
```

2. Vérifier les logs :
```bash
grep -i "bundle\|error" /opt/splunk/var/log/splunk/deployer_agent.log | tail -30
```

3. Tester manuellement :
```bash
echo 'y' | /opt/splunk/bin/splunk apply shcluster-bundle -target https://CAPTAIN_IP:8089 -auth admin:'password' -preserve-lookups true
```

### Vider le cache Splunk

```bash
rm -rf /opt/splunk/var/run/splunk/appserver/*
/opt/splunk/bin/splunk restart
```

---

## 📡 API Reference

### Git Pusher Server (Port 9999)

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/health` | Health check |
| `GET` | `/license` | Statut de la licence |
| `GET` | `/license/hostname` | Hostname Splunk |
| `GET` | `/deployer/health` | Santé du SH Deployer |
| `GET` | `/deployer/status` | Statut du SH Deployer |
| `GET` | `/deployer/config` | Configuration du SH Deployer |
| `POST` | `/license/upload` | Uploader une licence |
| `POST` | `/push` | Pousser les applications |

### Deployer Agent (Port 9998)

| Méthode | Endpoint | Description |
|---------|----------|-------------|
| `GET` | `/health` | Health check (pas d'auth) |
| `GET` | `/status` | Statut du déploiement |
| `GET` | `/apps` | Liste des apps |
| `GET` | `/history` | Historique des déploiements |
| `POST` | `/pull` | Git pull |
| `POST` | `/deploy` | Apply shcluster-bundle |
| `POST` | `/pull-and-deploy` | Pull + Deploy en une opération |

### Exemple : Push avec déploiement SH Cluster

```bash
curl -k -X POST "https://localhost:9999/push?git_url=https://github.com/user/repo.git&git_branch=main&git_token=TOKEN&commit_message=Update&apps=[{\"id\":\"my_app\"}]&user=admin&deploy_to_shcluster=true"
```

---

## 📝 Changelog

### Version 2.1.0 (Février 2026)
- 🚀 **Nouveau** : Déploiement automatique vers Search Head Cluster
- 🔧 **Nouveau** : Agent Deployer pour le SH Deployer
- ⚙️ **Nouveau** : Interface de configuration du SH Deployer
- 🔐 **Amélioration** : Gestion des caractères spéciaux dans les mots de passe
- 🛠️ **Correction** : Mode non-interactif pour shcluster-bundle

### Version 2.0.0 (Février 2026)
- ✨ Nouveau système de licence par fichier `.lic`
- 🔐 Credentials Splunk chiffrés
- 🔒 Support HTTPS avec certificats SSL
- 🎨 Interface utilisateur modernisée
- 📊 Badge de licence en temps réel
- 🔧 Script de gestion amélioré
- 🛡️ Options pour masquer les boutons d'édition du dashboard
- 📝 Logs détaillés
- 🐛 Correction des problèmes CORS

### Version 1.0.0
- 🚀 Version initiale
- Push d'applications vers Git
- Interface basique

---

## 📞 Support

### Obtenir de l'aide

- 📧 Email : support@gitpusher.com
- 🌐 Site web : https://gitpusher.com
- 📖 Documentation : https://docs.gitpusher.com

### Signaler un bug

Incluez dans votre rapport :
1. Version de Git Pusher
2. Version de Splunk
3. Configuration (HTTP/HTTPS)
4. Architecture (standalone, SH Cluster)
5. Logs Git Pusher (`/opt/splunk/var/log/splunk/git_pusher.log`)
6. Logs Deployer Agent (`/opt/splunk/var/log/splunk/deployer_agent.log`)
7. Erreurs de la console navigateur (F12)
8. Étapes pour reproduire le problème

---

## 📄 Licence

Git Pusher est un logiciel propriétaire. Une licence valide est requise pour son utilisation.

© 2026 Git Pusher - Tous droits réservés

---

<p align="center">
  Made with ❤️ for Splunk administrators
</p>
