From ece93146bcd36e07acc7f8652adc9c02a84b77a9 Mon Sep 17 00:00:00 2001 From: firdaous elhalafi Date: Tue, 23 Jan 2024 22:58:54 +0100 Subject: [PATCH 1/2] traitement d'envoie des requettes aux esclaves --- README.md | 21 ++++++++++++++++++++ app.js | 40 ++++++++++++++++++++++++++++++++++++-- docker-compose.esclave.yml | 6 ++++++ docker-compose.yml | 1 + package-lock.json | 23 +++++++++++++++++++++- package.json | 3 ++- scalabilite/Dockerfile | 9 +++++++++ scalabilite/main.sh | 0 8 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 docker-compose.esclave.yml create mode 100644 scalabilite/Dockerfile create mode 100644 scalabilite/main.sh diff --git a/README.md b/README.md index 829a7fa..6e1a739 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,23 @@ # TP Final Docker +## Lancement de l'application +```shell +sudo docker compose up --build +``` + +## L'esclave (hash_extractor) +```shell +sudo docker swarm init +sudo docker run -ti --network host --rm servuc/hash_extractor:latest ./hash_extractor s ws://127.0.0.1:3000 +``` + +## Scalabilité +```shell +sudo docker build -t scalabilite . +sudo docker service create --name scaler --network host scalabilite +``` + +## Redis +```shell +sudo docker service create --name redis-db --network mon-reseau redis:alpine +``` diff --git a/app.js b/app.js index 2869235..88787e5 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,8 @@ const express = require('express'); const crypto = require('crypto'); const redis = require('redis'); +const WebSocket = require('ws'); +const http = require('http'); const app = express(); app.use(express.json()); @@ -24,13 +26,36 @@ async function connectRedis() { connectRedis(); +// Création du serveur HTTP +const server = http.createServer(app); + +// Création du serveur WebSocket en attachant au serveur HTTP +const wss = new WebSocket.Server({ server }); + +// Gestionnaire d'ouverture de la connexion WebSocket +wss.on('connection', (ws) => { + console.log('Connexion WebSocket avec un client établie'); + + // Gestion des messages WebSocket + ws.on('message', (message) => { + console.log('Message reçu du client:', message); + }); +}); + app.post('/calculate-md5', async (req, res) => { try { const text = req.body.text; const hash = crypto.createHash('md5').update(text).digest('hex'); // on stocke le hash dans Redis avec la chaîne originale comme clé - await client.set(text, hash); + // await client.set(text, hash); + + // Envoi du texte au service esclave via WebSocket + wss.clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) { + client.send(hash); + } + }); res.json({ text: text, hash: hash }); } catch (err) { @@ -54,6 +79,17 @@ app.get('/get-md5/:text', async (req, res) => { }); const PORT = 3000; -app.listen(PORT, () => { +server.listen(PORT, () => { console.log(`Serveur démarré sur le port ${PORT}`); }); + + +const socket = new WebSocket('ws://127.0.0.1:3000'); + +socket.addEventListener('open', (event) => { + console.log('Connexion WebSocket établie avec le serveur'); +}); + +socket.addEventListener('message', (event) => { + console.log('Message reçu du serveur:', event.data); +}); \ No newline at end of file diff --git a/docker-compose.esclave.yml b/docker-compose.esclave.yml new file mode 100644 index 0000000..94b3dc7 --- /dev/null +++ b/docker-compose.esclave.yml @@ -0,0 +1,6 @@ +version: '3.8' + +services: + esclave: + image: servuc/hash_extractor + command: "./hash_extractor s ws://localhost:3000" diff --git a/docker-compose.yml b/docker-compose.yml index 1120cfa..0f74bcd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,3 +15,4 @@ services: image: redis:alpine ports: - "6379:6379" + diff --git a/package-lock.json b/package-lock.json index 4e2b1f5..360eeb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "express": "^4.18.2", "md5": "^2.3.0", - "redis": "^4.6.12" + "redis": "^4.6.12", + "ws": "^8.16.0" } }, "node_modules/@redis/bloom": { @@ -769,6 +770,26 @@ "node": ">= 0.8" } }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 4a1124a..a92053d 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "express": "^4.18.2", "md5": "^2.3.0", - "redis": "^4.6.12" + "redis": "^4.6.12", + "ws": "^8.16.0" } } diff --git a/scalabilite/Dockerfile b/scalabilite/Dockerfile new file mode 100644 index 0000000..e3bfbc3 --- /dev/null +++ b/scalabilite/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine:3.14 + +RUN apk add --no-cache docker + +WORKDIR /app + +COPY main.sh . + +CMD ["sh", "main.sh"] diff --git a/scalabilite/main.sh b/scalabilite/main.sh new file mode 100644 index 0000000..e69de29 -- GitLab From 87d87b5444522898226b97041d2a325ab4bafba7 Mon Sep 17 00:00:00 2001 From: firdaous elhalafi Date: Tue, 23 Jan 2024 23:22:33 +0100 Subject: [PATCH 2/2] Generation des hash par rapport au niveau de difficulte passe en param --- .gitignore | 1 + Dockerfile => app/Dockerfile | 2 +- app.js => app/app.js | 21 +++++++++++++++++++- docker-compose.yml => app/docker-compose.yml | 0 package-lock.json => app/package-lock.json | 0 package.json => app/package.json | 0 app/utils.js | 19 ++++++++++++++++++ docker-compose.esclave.yml | 6 ------ 8 files changed, 41 insertions(+), 8 deletions(-) rename Dockerfile => app/Dockerfile (91%) rename app.js => app/app.js (81%) rename docker-compose.yml => app/docker-compose.yml (100%) rename package-lock.json => app/package-lock.json (100%) rename package.json => app/package.json (100%) create mode 100644 app/utils.js delete mode 100644 docker-compose.esclave.yml diff --git a/.gitignore b/.gitignore index 18f0865..85d09d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Dépendances /node_modules +app/node_modules # Logs logs diff --git a/Dockerfile b/app/Dockerfile similarity index 91% rename from Dockerfile rename to app/Dockerfile index 9b48d41..8a1e911 100644 --- a/Dockerfile +++ b/app/Dockerfile @@ -6,7 +6,7 @@ COPY package*.json ./ RUN npm install -COPY . . +COPY .. . EXPOSE 3000 diff --git a/app.js b/app/app.js similarity index 81% rename from app.js rename to app/app.js index 88787e5..076595c 100644 --- a/app.js +++ b/app/app.js @@ -4,6 +4,8 @@ const redis = require('redis'); const WebSocket = require('ws'); const http = require('http'); +const { generateSimulatedHash } = require('./utils'); + const app = express(); app.use(express.json()); @@ -42,13 +44,30 @@ wss.on('connection', (ws) => { }); }); + app.post('/generateHash', (req, res) => { + const difficulty = req.body.data; + + if (!difficulty) { + return res.status(400).json({ error: 'Missing data in the request.' }); + } + + const hash = generateSimulatedHash(difficulty); + wss.clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) { + client.send(hash); + } + }); + + res.json({ hash }); + }); + app.post('/calculate-md5', async (req, res) => { try { const text = req.body.text; const hash = crypto.createHash('md5').update(text).digest('hex'); // on stocke le hash dans Redis avec la chaîne originale comme clé - // await client.set(text, hash); + await client.set(text, hash); // Envoi du texte au service esclave via WebSocket wss.clients.forEach((client) => { diff --git a/docker-compose.yml b/app/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to app/docker-compose.yml diff --git a/package-lock.json b/app/package-lock.json similarity index 100% rename from package-lock.json rename to app/package-lock.json diff --git a/package.json b/app/package.json similarity index 100% rename from package.json rename to app/package.json diff --git a/app/utils.js b/app/utils.js new file mode 100644 index 0000000..accc27f --- /dev/null +++ b/app/utils.js @@ -0,0 +1,19 @@ +const crypto = require('crypto'); +function generateSimulatedHash(difficulty) { + let data; + + if (difficulty === 'gentil') { + data = crypto.randomBytes(16).toString('hex'); // Mode gentil (faible complexité) + } else if (difficulty === 'normal') { + data = crypto.randomBytes(1000).toString('hex'); // Mode normal (moyenne complexité) + } else if (difficulty === 'agressif') { + data = crypto.randomBytes(1000).toString('hex'); // Mode agressif (haute complexité) + } + + const hash = crypto.createHash('md5').update(data).digest('hex'); + return hash; +} + +module.exports = { + generateSimulatedHash, +}; \ No newline at end of file diff --git a/docker-compose.esclave.yml b/docker-compose.esclave.yml deleted file mode 100644 index 94b3dc7..0000000 --- a/docker-compose.esclave.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: '3.8' - -services: - esclave: - image: servuc/hash_extractor - command: "./hash_extractor s ws://localhost:3000" -- GitLab