From b0aca695963cb954cdd6b731f770dcf5ba5f3771 Mon Sep 17 00:00:00 2001 From: unfr Date: Mon, 23 Jun 2025 14:27:18 +0200 Subject: [PATCH] Ajout du support de MYSQL --- autopost/common.sh | 13 + autopost/conf.sh | 9 +- autopost/config.js | 7 + autopost/db.js | 90 +++++ autopost/posteur.sh | 21 +- autopost/server.js | 871 ++++++++++++++++++++------------------------ install.sh | 91 +++-- update.sh | 10 +- 8 files changed, 603 insertions(+), 509 deletions(-) create mode 100644 autopost/db.js diff --git a/autopost/common.sh b/autopost/common.sh index d8c36b7..150e3ed 100644 --- a/autopost/common.sh +++ b/autopost/common.sh @@ -34,3 +34,16 @@ SOULIGNE='\e[4m' CLIGNOTANT='\e[5m' INVERSE='\e[7m' NORMAL='\e[0m' + +db_query() { + local sql="$1" + if [ "$dbtype" = "sqlite" ]; then + sqlite3 "$DB_FILE" "$sql" + else + # Le séparateur par défaut de --batch est tabulation + mysql --batch --raw --default-character-set=utf8mb4 \ + -h "$MYSQL_HOST" -P "$MYSQL_PORT" \ + -u "$MYSQL_USER" -p"$MYSQL_PASS" \ + -D "$MYSQL_DB" -e "$sql" | sed '1d' | tr '\t' '|' + fi +} \ No newline at end of file diff --git a/autopost/conf.sh b/autopost/conf.sh index 6adf65c..db2fbb9 100644 --- a/autopost/conf.sh +++ b/autopost/conf.sh @@ -2,7 +2,7 @@ #CONFIG A MODIF URL_API="A NOUS DEMANDER SUR DISCORD" APIKEY="A RETROUVER DANS VOTRE PROFIL" -DB_FILE="/home/$USER/autopost/base_autopost.db" + DOSSIER_GLOBAL="/home/$USER/" DOSSIER_NFO="/home/$USER/autopost/mediainfo/" DOSSIER_LOGS="/home/$USER/autopost/logs/" @@ -16,5 +16,12 @@ NG_USER="" NG_PASS="" NG_NBR_CONN="" +dbtype="sqlite" # ou "mysql" +DB_FILE="/home/$USER/autopost/base_autopost.db" +MYSQL_HOST="" +MYSQL_PORT= +MYSQL_USER="" +MYSQL_PASS="" +MYSQL_DB="" diff --git a/autopost/config.js b/autopost/config.js index e829462..bfe2090 100644 --- a/autopost/config.js +++ b/autopost/config.js @@ -8,6 +8,13 @@ module.exports = { // Chemin vers le fichier de base de données SQLite dbFile: path.join(__dirname, 'base_autopost.db'), + + //MySQL + DB_HOST: '', + DB_PORT: , + DB_USER: '', + DB_PASSWORD: '', + DB_DATABASE: '', // Chemins personnalisables pour les dossiers finishdirectory: path.join(__dirname, 'FINIS'), diff --git a/autopost/db.js b/autopost/db.js new file mode 100644 index 0000000..2d31328 --- /dev/null +++ b/autopost/db.js @@ -0,0 +1,90 @@ +// db.js +const config = require('./config'); + +let db, mysqlPool, sqlite3; +const dbtype = config.dbtype; + +if (dbtype === 'mysql') { + const mysql = require('mysql2/promise'); + mysqlPool = mysql.createPool({ + host: config.DB_HOST, + port: config.DB_PORT, + user: config.DB_USER, + password: config.DB_PASSWORD, + database: config.DB_DATABASE, + waitForConnections: true, + connectionLimit: 10, + }); + + db = { + async query(sql, params = []) { + return await mysqlPool.query(sql, params); + }, + async close() { + await mysqlPool.end(); + } + }; + async function testConnection() { + try { + const conn = await mysqlPool.getConnection(); + await conn.ping(); + conn.release(); + console.log('[DATABASE] Connexion MySQL OK'); + } catch (err) { + console.error('[DATABASE] Échec connexion MySQL:', err.message); + process.exit(1); + } + } + db.testConnection = testConnection; +} else { + // SQLite + sqlite3 = require('sqlite3').verbose(); + db = { + async query(sql, params = []) { + return new Promise((resolve, reject) => { + const lowered = sql.trim().toLowerCase(); + let base = new sqlite3.Database(config.dbFile, lowered.startsWith('select') ? sqlite3.OPEN_READONLY : sqlite3.OPEN_READWRITE); + if (lowered.startsWith('select') && lowered.includes('count(')) { + base.get(sql, params, (err, row) => { + base.close(); + if (err) return reject(err); + resolve([[row]]); + }); + } else if (lowered.startsWith('select')) { + base.all(sql, params, (err, rows) => { + base.close(); + if (err) return reject(err); + resolve([rows]); + }); + } else { + base.run(sql, params, function(err) { + base.close(); + if (err) return reject(err); + resolve([{ affectedRows: this.changes }]); + }); + } + }); + }, + async close() {} + }; + async function testConnection() { + try { + let base = new sqlite3.Database(config.dbFile); + base.get('SELECT 1', [], (err, row) => { + base.close(); + if (err) { + console.error('[DATABASE] Échec connexion SQLite:', err.message); + process.exit(1); + } else { + console.log('[DATABASE] Connexion SQLite OK'); + } + }); + } catch (err) { + console.error('[DATABASE] Échec connexion SQLite:', err.message); + process.exit(1); + } + } + db.testConnection = testConnection; +} + +module.exports = db; diff --git a/autopost/posteur.sh b/autopost/posteur.sh index d29b042..c41524b 100644 --- a/autopost/posteur.sh +++ b/autopost/posteur.sh @@ -1,5 +1,6 @@ #!/bin/bash -source $HOME/autopost/common.sh + +source /home/$USER/autopost/common.sh # Vérification et création des dossiers for dossier in "$DOSSIER_NFO" "$DOSSIER_NZB_ATTENTE" "$DOSSIER_NZB_FINAL" "$DOSSIER_LOGS" "tmp" @@ -28,10 +29,11 @@ checkusenet(){ fi } -cd ${DOSSIER_GLOBAL} +cd "${DOSSIER_GLOBAL}" while true; do - verif=$(sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; SELECT id, nom FROM release WHERE status = 0 LIMIT 1; COMMIT;") + # Utilisation universelle + verif=$(db_query "SELECT id, nom FROM \`release\` WHERE status = 0 LIMIT 1;") if [ -n "$verif" ]; then id=$(echo "$verif" | awk -F "|" '{print $1}' | xargs) name=$(echo "$verif" | awk -F "|" '{print $2}' | xargs) @@ -40,19 +42,16 @@ while true; do echo -e "${VERT}DEBUT DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}" | tee -a "$LOG" echo -e "${CYAN}CREATION DES PAR2${NORMAL}" | tee -a "$LOG" - # Lancement de parpar et redirection vers tee sans sous-shell - parpar -s10M -r20%+2 -m4096M -p1l -o "${FILESANSEXT}.par2" "${name}" \ + parpar -s10M -S -m4096M -t16 -r20% -O -o "${FILESANSEXT}.par2" "${name}" \ > >(tee -a "$LOG") 2> >(tee -a "$LOG" >&2) ret=$? if [ $ret -ne 0 ]; then echo -e "${ROUGE}Erreur parpar (code $ret). Marquage en échec.${NORMAL}" | tee -a "$LOG" - sqlite3 "$DB_FILE" \ - "BEGIN IMMEDIATE; UPDATE release SET status = 2 WHERE id = ${id}; COMMIT;" + db_query "UPDATE \`release\` SET status = 2 WHERE id = ${id};" rm -f "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*" continue fi - # Suite du traitement loggué { echo -e "${VERT}UPLOAD SUR USENET${NORMAL}" checkusenet @@ -72,7 +71,7 @@ while true; do if [[ ${nzbsizebit} -le ${jsonsizebit} ]] || [[ ${nzbsizebit} = "NAN" ]]; then echo -e "${ROUGE}PROBLEME TAILLE NZB${NORMAL}" rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb" "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*" - sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; UPDATE release SET status = 2 WHERE id = ${id}; COMMIT;" + db_query "UPDATE \`release\` SET status = 2 WHERE id = ${id};" else echo -e "${CYAN}ENVOI SUR LE SITE${NORMAL}" curl -s -k -L -m 60 --output /dev/null \ @@ -88,7 +87,7 @@ while true; do mv "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.7z" "${DOSSIER_NZB_FINAL}${first_char}/" rm -rf "${FILESANSEXT}"* rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb" - sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; UPDATE release SET status = 1 WHERE id = ${id}; COMMIT;" + db_query "UPDATE \`release\` SET status = 1 WHERE id = ${id};" echo -e "${VERT}FIN DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}" fi else @@ -96,5 +95,5 @@ while true; do fi } > >(tee -a "$LOG") 2>&1 fi - attente 10 + attente 3 done diff --git a/autopost/server.js b/autopost/server.js index 2c7083b..1ab3eff 100644 --- a/autopost/server.js +++ b/autopost/server.js @@ -1,15 +1,15 @@ const express = require('express'); const session = require('express-session'); -const sqlite3 = require('sqlite3').verbose(); const path = require('path'); const fs = require('fs'); const AnsiToHtml = require('ansi-to-html'); const convert = new AnsiToHtml(); const { exec } = require('child_process'); const os = require('os'); - -// Import de la configuration depuis config.js const config = require('./config'); +const db = require('./db'); + +db.testConnection(); // vérification au démarrage const app = express(); const port = config.port; @@ -17,33 +17,20 @@ const port = config.port; // Middleware pour parser les formulaires POST app.use(express.urlencoded({ extended: true })); -// Configuration des sessions en utilisant le secret depuis la config app.use(session({ - secret: config.sessionSecret, - resave: false, - saveUninitialized: false + secret: config.sessionSecret, + resave: false, + saveUninitialized: false })); -// Servir des fichiers statiques (CSS, images, etc.) app.use(express.static('public')); -// Chemin vers la base SQLite défini dans la config -const DB_FILE = config.dbFile; - -// Création du routeur pour /autopost const autopostRouter = express.Router(); -// Servir les fichiers statiques dans le contexte du routeur autopostRouter.use('/js', express.static(path.join(__dirname, '../node_modules/@tailwindcss/browser/dist'))); - -// Servir les fichiers jQuery depuis node_modules/jquery/dist autopostRouter.use('/jquery', express.static(path.join(__dirname, '../node_modules/jquery/dist'))); -/* ------------------------------------------------------------------------- - Routes non protégées (login, logout) sous /autopost -------------------------------------------------------------------------- */ - -// Affichage du formulaire de login à l'URL /autopost/login +// --------------------------- Auth non protégée ----------------------------- autopostRouter.get('/login', (req, res) => { res.send(` @@ -73,228 +60,350 @@ autopostRouter.get('/login', (req, res) => { `); }); -// Traitement du formulaire de login en utilisant la config pour vérifier les identifiants autopostRouter.post('/login', (req, res) => { - const { username, password } = req.body; - if (username === config.auth.username && password === config.auth.password) { - req.session.authenticated = true; - res.redirect('/autopost'); - } else { - res.send('Identifiants invalides. Réessayer'); - } + const { username, password } = req.body; + if (username === config.auth.username && password === config.auth.password) { + req.session.authenticated = true; + res.redirect('/autopost'); + } else { + res.send('Identifiants invalides. Réessayer'); + } }); - -// Déconnexion autopostRouter.get('/logout', (req, res) => { - req.session.destroy(); - res.redirect('/autopost/login'); + req.session.destroy(); + res.redirect('/autopost/login'); }); -/* ------------------------------------------------------------------------- - Middleware de protection pour les routes suivantes -------------------------------------------------------------------------- */ function checkAuth(req, res, next) { - if (req.session && req.session.authenticated) { - next(); - } else { - res.redirect(req.baseUrl + '/login'); - } + if (req.session && req.session.authenticated) { + next(); + } else { + res.redirect(req.baseUrl + '/login'); + } } autopostRouter.use(checkAuth); -/* ------------------------------------------------------------------------- - Route GET principale pour /autopost avec pagination -------------------------------------------------------------------------- */ -autopostRouter.get('/', (req, res) => { +// --------------------------- PAGE PRINCIPALE ----------------------------- +autopostRouter.get('/', async (req, res) => { const limit = 100; // enregistrements par page const page = parseInt(req.query.page) || 1; const offset = (page - 1) * limit; - let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READONLY, (err) => { - if (err) { - console.error(err.message); - return res.status(500).send("Erreur lors de l'ouverture de la base de données."); - } - }); - - // Récupérer le nombre total d'enregistrements - const countQuery = "SELECT COUNT(*) as total FROM release"; - db.get(countQuery, [], (err, countResult) => { - if (err) { - console.error(err.message); - res.status(500).send("Erreur lors du comptage des enregistrements."); - return; - } - const totalRecords = countResult.total; + try { + // Récupérer le nombre total d'enregistrements + const [countResult] = await db.query("SELECT COUNT(*) as total FROM `release`"); + const totalRecords = countResult[0].total; const totalPages = Math.ceil(totalRecords / limit); - const query = ` - SELECT nom, status, id FROM release - ORDER BY (status = 2) DESC, id DESC - LIMIT ${limit} OFFSET ${offset}; + const [rows] = await db.query( + "SELECT nom, status, id FROM `release` ORDER BY (status = 2) DESC, id DESC LIMIT ? OFFSET ?", + [limit, offset] + ); + + let html = ` + + + + + Suivi Autopost + + + + + +
+

Suivi Autopost

+

+ Déconnexion +

+ + + +
+ + + + + + + + + + `; - db.all(query, [], (err, rows) => { - if (err) { - console.error(err.message); - res.status(500).send("Erreur lors de la requête."); - return; + + rows.forEach(row => { + let statusText = ''; + let statusClass = ''; + switch (parseInt(row.status)) { + case 0: + statusText = 'EN ATTENTE'; + statusClass = 'bg-cyan-500 text-black font-bold'; + break; + case 1: + statusText = 'ENVOI TERMINÉ'; + statusClass = 'bg-green-300 text-black font-bold'; + break; + case 2: + statusText = 'ERREUR'; + statusClass = 'bg-red-300 text-black font-bold'; + break; + case 3: + statusText = 'DEJA DISPONIBLE'; + statusClass = 'bg-pink-300 text-black font-bold'; + break; + default: + statusText = 'INCONNU'; } - - let html = ` - - - - - Suivi Autopost - - - - - - -
-

Suivi Autopost

-

- Déconnexion -

- - - - -
-
NameStatusIDActions
- - - - - - - - - - `; - - rows.forEach(row => { - let statusText = ''; - let statusClass = ''; - switch (row.status) { - case 0: - statusText = 'EN ATTENTE'; - statusClass = 'bg-cyan-500 text-black font-bold'; - break; - case 1: - statusText = 'ENVOI TERMINÉ'; - statusClass = 'bg-green-300 text-black font-bold'; - break; - case 2: - statusText = 'ERREUR'; - statusClass = 'bg-red-300 text-black font-bold'; - break; - case 3: - statusText = 'DEJA DISPONIBLE'; - statusClass = 'bg-pink-300 text-black font-bold'; - break; - default: - statusText = 'INCONNU'; - } - let logLink = (parseInt(row.status) === 1 || parseInt(row.status) === 2) - ? ' | Log' - : ''; - let mediainfoLink = (parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2) - ? ' | Mediainfo' - : ''; - let dlLink = row.status === 1 - ? ` | DL` - : ''; - - html += ` - - - - - - - `; - }); + let logLink = (parseInt(row.status) === 1 || parseInt(row.status) === 2) + ? ' | Log' + : ''; + let mediainfoLink = (parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2) + ? ' | Mediainfo' + : ''; + let dlLink = row.status === 1 + ? ` | DL` + : ''; html += ` - -
NameStatusIDActions
${row.nom}${statusText}${row.id} - Editer | - Supprimer - ${logLink} - ${mediainfoLink} - ${dlLink} -
-
-
- - - - - - - - - - - - - - `; - res.send(html); - db.close(); - }); - }); + }); + }); + + + + `; + res.send(html); + } catch (err) { + console.error(err.message); + res.status(500).send("Erreur lors de la requête DB."); + } }); -/* ------------------------------------------------------------------------- - Route GET pour la recherche côté serveur -------------------------------------------------------------------------- */ -autopostRouter.get('/search', (req, res) => { - const q = req.query.q || ""; - const searchQuery = "%" + q + "%"; - let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READONLY, (err) => { - if (err) { - console.error(err.message); - return res.status(500).json({ error: "Erreur lors de l'ouverture de la base de données." }); +// --------------------------- Recherche ----------------------------- +autopostRouter.get('/search', async (req, res) => { + const q = req.query.q || ""; + const searchQuery = "%" + q + "%"; + try { + const [rows] = await db.query( + "SELECT nom, status, id FROM `release` WHERE nom LIKE ? ORDER BY id DESC LIMIT 500", + [searchQuery] + ); + res.json(rows); + } catch (err) { + console.error(err.message); + res.status(500).json({ error: "Erreur lors de la requête." }); } - }); - db.all("SELECT nom, status, id FROM release WHERE nom LIKE ? ORDER BY id DESC LIMIT 500", [searchQuery], (err, rows) => { - if (err) { - console.error(err.message); - res.status(500).json({ error: "Erreur lors de la requête." }); - return; - } - res.json(rows); - db.close(); - }); }); -/* ------------------------------------------------------------------------- - Route GET pour récupérer le contenu d'un fichier log -------------------------------------------------------------------------- */ +// --------------------------- Log ----------------------------- autopostRouter.get('/log', (req, res) => { const filename = req.query.name; if (!filename) { @@ -534,9 +484,7 @@ autopostRouter.get('/log', (req, res) => { }); }); -/* ------------------------------------------------------------------------- - Route GET pour récupérer le contenu d'un fichier mediainfo -------------------------------------------------------------------------- */ +// --------------------------- Mediainfo ----------------------------- autopostRouter.get('/mediainfo', (req, res) => { const filename = req.query.name; if (!filename) { @@ -559,9 +507,7 @@ autopostRouter.get('/mediainfo', (req, res) => { }); }); -/* ------------------------------------------------------------------------- - Route GET pour télécharger le fichier NZB -------------------------------------------------------------------------- */ +// --------------------------- Download ----------------------------- autopostRouter.get('/dl', (req, res) => { const filename = req.query.name; if (!filename) { @@ -603,67 +549,46 @@ autopostRouter.get('/dl', (req, res) => { }); }); -/* ------------------------------------------------------------------------- - Route POST pour mettre à jour le statut (édition) -------------------------------------------------------------------------- */ -autopostRouter.post('/edit/:id', (req, res) => { - const id = req.params.id; - const newStatus = req.body.status; - let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READWRITE, (err) => { - if (err) { - console.error(err.message); - return res.status(500).send("Erreur lors de l'ouverture de la base de données."); +// --------------------------- Édition ----------------------------- +autopostRouter.post('/edit/:id', async (req, res) => { + const id = req.params.id; + const newStatus = req.body.status; + try { + await db.query("UPDATE `release` SET status = ? WHERE id = ?", [newStatus, id]); + if (req.xhr || req.headers.accept.indexOf('json') > -1) { + res.json({ success: true }); + } else { + res.redirect("/autopost/"); + } + } catch (err) { + console.error(err.message); + res.status(500).send("Erreur lors de la mise à jour."); } - }); - db.run("UPDATE release SET status = ? WHERE id = ?", [newStatus, id], function(err) { - if (err) { - console.error(err.message); - res.status(500).send("Erreur lors de la mise à jour."); - return; - } - if (req.xhr || req.headers.accept.indexOf('json') > -1) { - res.json({ success: true }); - } else { - res.redirect("/autopost/"); - } - db.close(); - }); }); -/* ------------------------------------------------------------------------- - Route POST pour supprimer un enregistrement -------------------------------------------------------------------------- */ -autopostRouter.post('/delete/:id', (req, res) => { - const id = req.params.id; - let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READWRITE, (err) => { - if (err) { - console.error(err.message); - return res.status(500).send("Erreur lors de l'ouverture de la base de données."); +// --------------------------- Suppression ----------------------------- +autopostRouter.post('/delete/:id', async (req, res) => { + const id = req.params.id; + try { + await db.query("DELETE FROM `release` WHERE id = ?", [id]); + if (req.xhr || req.headers.accept.indexOf('json') > -1) { + res.json({ success: true }); + } else { + res.redirect("/autopost/"); + } + } catch (err) { + console.error(err.message); + res.status(500).send("Erreur lors de la suppression."); } - }); - db.run("DELETE FROM release WHERE id = ?", [id], function(err) { - if (err) { - console.error(err.message); - res.status(500).send("Erreur lors de la suppression."); - return; - } - if (req.xhr || req.headers.accept.indexOf('json') > -1) { - res.json({ success: true }); - } else { - res.redirect("/autopost/"); - } - db.close(); - }); }); -// Redirection de la route GET d'édition si accès direct +// Redirection accès direct GET /edit/:id autopostRouter.get('/edit/:id', (req, res) => { - res.redirect("/autopost/"); + res.redirect("/autopost/"); }); -// Monter le routeur sur le chemin /autopost app.use('/autopost', autopostRouter); app.listen(port, () => { - console.log(`Serveur démarré sur http://localhost:${port}/autopost`); + console.log(`Serveur démarré sur http://localhost:${port}/autopost`); }); diff --git a/install.sh b/install.sh index 20eee41..932a98e 100644 --- a/install.sh +++ b/install.sh @@ -92,28 +92,67 @@ else fi fi -# Vérifier et installer sqlite3 si manquant -if command -v sqlite3 > /dev/null 2>&1; then - LISTE_APPLIS+=("sqlite3") -else - echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}" - if $sudook; then - sudo apt install sqlite3 - LISTE_APPLIS+=("sqlite3") - echo -e "${VERT}sqlite3 installé${NORMAL}" - else - curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip" - unzip sqlite-tools.zip -d "$BIN_DIR" - chmod 777 "$BIN_DIR/sqlite3" - - # Nettoyage des fichiers inutiles - rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync" - - LISTE_APPLIS+=("$BIN_DIR/sqlite3") - echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}" - - fi -fi +# Demande à l'utilisateur +echo "Quel système de base de données voulez-vous utiliser ?" +select BDD in "SQLite" "MySQL"; do + case $BDD in + "SQLite") + echo "Vous avez choisi SQLite." + # Bloc vérification/install sqlite3 + if command -v sqlite3 > /dev/null 2>&1; then + LISTE_APPLIS+=("sqlite3") + else + echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}" + if $sudook; then + sudo apt install -y sqlite3 + LISTE_APPLIS+=("sqlite3") + echo -e "${VERT}sqlite3 installé${NORMAL}" + else + curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip" + unzip sqlite-tools.zip -d "$BIN_DIR" + chmod 777 "$BIN_DIR/sqlite3" + # Nettoyage + rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync" + LISTE_APPLIS+=("$BIN_DIR/sqlite3") + echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}" + fi + fi + break + ;; + "MySQL") + echo "Vous avez choisi MySQL." + if command -v mysql > /dev/null 2>&1; then + LISTE_APPLIS+=("mysql") + echo -e "${VERT}MySQL est disponible${NORMAL}" + # Place ici le code MySQL à exécuter + else + echo -e "${ROUGE}MySQL n'est pas installé. Bascule automatique sur SQLite.${NORMAL}" + # Bloc vérification/install sqlite3 (copié plus haut) + if command -v sqlite3 > /dev/null 2>&1; then + LISTE_APPLIS+=("sqlite3") + else + echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}" + if $sudook; then + sudo apt install -y sqlite3 + LISTE_APPLIS+=("sqlite3") + echo -e "${VERT}sqlite3 installé${NORMAL}" + else + curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip" + unzip sqlite-tools.zip -d "$BIN_DIR" + chmod 777 "$BIN_DIR/sqlite3" + rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync" + LISTE_APPLIS+=("$BIN_DIR/sqlite3") + echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}" + fi + fi + fi + break + ;; + *) + echo "Choix invalide." + ;; + esac +done # Vérifier et installer jq si manquant if command -v jq > /dev/null 2>&1; then @@ -314,7 +353,7 @@ export NVM_DIR="$HOME/.nvm" # Vérification des modules npm nécessaires log "Vérification des modules npm requis..." -modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "autoprefixer" "jquery") +modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "autoprefixer" "jquery" "mysql2") missing_modules=() for module in "${modules[@]}"; do @@ -339,6 +378,12 @@ if [ ! -f "$AUTOPOST_DIR/server.js" ]; then updated="1" fi +if [ ! -f "$AUTOPOST_DIR/db.js" ]; then + log "Téléchargement de db.js..." + wget -q -O "$AUTOPOST_DIR/db.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/db.js" + updated="1" +fi + if [ ! -f "$AUTOPOST_DIR/config.js" ]; then log "Téléchargement de config.js..." wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js" diff --git a/update.sh b/update.sh index 6c08a51..c4341db 100644 --- a/update.sh +++ b/update.sh @@ -209,7 +209,7 @@ export NVM_DIR="$HOME/.nvm" # Vérification des modules npm nécessaires log "Vérification des modules npm requis..." -modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "jquery") +modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "jquery" "mysql2") missing_modules=() for module in "${modules[@]}"; do @@ -235,12 +235,20 @@ if [ ! -f "$AUTOPOST_DIR/server.js" ]; then updated="1" fi +if [ ! -f "$AUTOPOST_DIR/db.js" ]; then + log "Téléchargement de db.js..." + wget -q -O "$AUTOPOST_DIR/db.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/db.js" + updated="1" +fi + if [ ! -f "$AUTOPOST_DIR/config.js" ]; then log "Téléchargement de config.js..." wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js" echo -e "${BLEU}Installation terminée. Vous pouvez maintenant configurer $AUTOPOST_DIR/config.js.${NORMAL}" fi + + # Vérifier et installer 7z si manquant if command -v 7z > /dev/null 2>&1; then LISTE_APPLIS+=("7z")