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
+
+
+
+
+
+
+
+
+ | Name |
+ Status |
+ ID |
+ Actions |
+
+
+
`;
- 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
-
-
-
-
-
-
-
-
-
- | Name |
- Status |
- ID |
- Actions |
-
-
-
- `;
-
- 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 += `
-
- | ${row.nom} |
- ${statusText} |
- ${row.id} |
-
- Editer |
- Supprimer
- ${logLink}
- ${mediainfoLink}
- ${dlLink}
- |
-
- `;
- });
+ 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 += `
-
-
-
-
-
-
-
-
- ×
-
Editer Release
-
-
-
-
-
-
-
-
-
-
-
-
-
- `;
- 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")