first commit
2
dockers/quotas/html/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
express_webapp/node_modules
|
||||
kaz.quota/node_modules
|
51
dockers/quotas/html/LancementAffichageQuota.txt
Normal file
@ -0,0 +1,51 @@
|
||||
------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
KAZ : AFFICHAGE DES QUOTAS
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
------------------------------------------------
|
||||
Auteur du document : GUIQUERRO Nathaniel
|
||||
Création de l'affichage de Quota : GAULTIER Lauryne, GUIQUERRO Nathaniel
|
||||
Date : 7 / 01 / 2022
|
||||
------------------------------------------------
|
||||
|
||||
Installation :
|
||||
|
||||
afin tout lancement 'npm' doit déjà être installé préalablement
|
||||
ensuite il faut récuperer le code contenue dans kaz.quota et express_webapp du git
|
||||
|
||||
Vérifiez bien que express_webapp contient un répertoire bin avec un fichier www dedans.
|
||||
|
||||
ensuite ouvez un terminale et placez vous dans le répertoire express_webapp grâce à la
|
||||
commande cd ./express_webapp et éxécutez al commande 'npm install' et après 'npm start'
|
||||
|
||||
Si aucun message d'erreur s'affiche rendez vous sur votre navigateur préféré pour vous connecter
|
||||
sur l'url : http://localhost:3000/
|
||||
|
||||
|
||||
Bonne Lecture !
|
||||
|
||||
Cordialement l'équipe Nelph
|
||||
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
Installation avec Docker :
|
||||
|
||||
Lancement WEB seul :
|
||||
docker build -t quota .
|
||||
docker run -it -p 127.0.0.1:3000:3000 quotas
|
||||
|
||||
Le page est accessible avec firefox à l'adresse : localhost:3000
|
||||
|
||||
Lancement WEB et DB :
|
||||
docker-compose up
|
||||
|
||||
La DB peut être accédé avec la commande :
|
||||
mysql -h 127.0.0.1 -prougail-saucisse
|
50
dockers/quotas/html/README.md
Normal file
@ -0,0 +1,50 @@
|
||||
# KAZ : AFFICHAGE DES QUOTAS
|
||||
|
||||
Auteur du document : GUIQUERRO Nathaniel, GAULTIER Lauryne
|
||||
Création de l'affichage de Quota : GAULTIER Lauryne, GUIQUERRO Nathaniel
|
||||
Date : 7 / 01 / 2022
|
||||
|
||||
# Installation :
|
||||
Avant tout lancement 'npm' doit déjà être installé.
|
||||
Ensuite il faut récuperer le code contenu dans kaz.quota et express_webapp du git.
|
||||
Vérifiez bien que express_webapp contient un répertoire bin avec un fichier www dedans.
|
||||
|
||||
Ensuite ouvez un terminal et placez vous dans le répertoire express_webapp grâce à la
|
||||
commande cd ./express_webapp et exécutez les commande 'npm install' et 'npm start'.
|
||||
|
||||
Si aucun message d'erreur ne s'affiche, rendez vous sur votre navigateur préféré pour vous connecter sur l'url :
|
||||
|
||||
```bash
|
||||
http://localhost:3000/
|
||||
```
|
||||
|
||||
Bonne lecture !
|
||||
|
||||
Cordialement l'équipe Nelph
|
||||
|
||||
# Installation avec Docker :
|
||||
|
||||
Lancement WEB et DB :
|
||||
|
||||
```bash
|
||||
cd /kaz/src
|
||||
```
|
||||
|
||||
```bash
|
||||
./lancementDocker.sh
|
||||
```
|
||||
Initialiser la base de données:
|
||||
```bash
|
||||
./initDB.sh tartelette
|
||||
```
|
||||
|
||||
Vous pouvez accéder à la DB avec la commande :
|
||||
```bash
|
||||
mysql -h 127.0.0.1 -tartelette
|
||||
```
|
||||
Le page est accessible par navigateur à l'adresse :
|
||||
|
||||
```bash
|
||||
localhost:3000
|
||||
```
|
||||
|
52
dockers/quotas/html/express_webapp/app.js
Normal file
@ -0,0 +1,52 @@
|
||||
var createError = require('http-errors');
|
||||
var express = require('express');
|
||||
var path = require('path');
|
||||
var cookieParser = require('cookie-parser');
|
||||
var logger = require('morgan');
|
||||
|
||||
var indexRouter = require('./routes/index');
|
||||
var usersRouter = require('./routes/users');
|
||||
var indexAdminRouter = require('./routes/indexAdmin');
|
||||
var usersAdminRouter = require('./routes/usersAdmin');
|
||||
var groupesRouter = require('./routes/groupes');
|
||||
var ServiceGRouter = require('./routes/serviceg');
|
||||
|
||||
var app = express();
|
||||
|
||||
// view engine setup
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'jade');
|
||||
|
||||
app.use(logger('dev'));
|
||||
app.use(express.json());
|
||||
app.use(express.urlencoded({ extended: false }));
|
||||
app.use(cookieParser());
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
app.use('/', indexRouter);
|
||||
app.use('/users', usersRouter);
|
||||
|
||||
|
||||
app.use('/admin/', indexAdminRouter);
|
||||
app.use('/admin/users', usersAdminRouter);
|
||||
app.use('/admin/groupes',groupesRouter);
|
||||
app.use('/admin/serviceg',ServiceGRouter);
|
||||
|
||||
|
||||
// catch 404 and forward to error handler
|
||||
app.use(function(req, res, next) {
|
||||
next(createError(404));
|
||||
});
|
||||
|
||||
// error handler
|
||||
app.use(function(err, req, res, next) {
|
||||
// set locals, only providing error in development
|
||||
res.locals.message = err.message;
|
||||
res.locals.error = req.app.get('env') === 'development' ? err : {};
|
||||
|
||||
// render the error page
|
||||
res.status(err.status || 500);
|
||||
res.render('error');
|
||||
});
|
||||
|
||||
module.exports = app;
|
90
dockers/quotas/html/express_webapp/bin/www
Executable file
@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var app = require('../app');
|
||||
var debug = require('debug')('express-webapp:server');
|
||||
var http = require('http');
|
||||
|
||||
/**
|
||||
* Get port from environment and store in Express.
|
||||
*/
|
||||
|
||||
var port = normalizePort(process.env.PORT || '3000');
|
||||
app.set('port', port);
|
||||
|
||||
/**
|
||||
* Create HTTP server.
|
||||
*/
|
||||
|
||||
var server = http.createServer(app);
|
||||
|
||||
/**
|
||||
* Listen on provided port, on all network interfaces.
|
||||
*/
|
||||
|
||||
server.listen(port);
|
||||
server.on('error', onError);
|
||||
server.on('listening', onListening);
|
||||
|
||||
/**
|
||||
* Normalize a port into a number, string, or false.
|
||||
*/
|
||||
|
||||
function normalizePort(val) {
|
||||
var port = parseInt(val, 10);
|
||||
|
||||
if (isNaN(port)) {
|
||||
// named pipe
|
||||
return val;
|
||||
}
|
||||
|
||||
if (port >= 0) {
|
||||
// port number
|
||||
return port;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Event listener for HTTP server "error" event.
|
||||
*/
|
||||
|
||||
function onError(error) {
|
||||
if (error.syscall !== 'listen') {
|
||||
throw error;
|
||||
}
|
||||
|
||||
var bind = typeof port === 'string'
|
||||
? 'Pipe ' + port
|
||||
: 'Port ' + port;
|
||||
|
||||
// handle specific listen errors with friendly messages
|
||||
switch (error.code) {
|
||||
case 'EACCES':
|
||||
console.error(bind + ' requires elevated privileges');
|
||||
process.exit(1);
|
||||
break;
|
||||
case 'EADDRINUSE':
|
||||
console.error(bind + ' is already in use');
|
||||
process.exit(1);
|
||||
break;
|
||||
default:
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Event listener for HTTP server "listening" event.
|
||||
*/
|
||||
|
||||
function onListening() {
|
||||
var addr = server.address();
|
||||
var bind = typeof addr === 'string'
|
||||
? 'pipe ' + addr
|
||||
: 'port ' + addr.port;
|
||||
debug('Listening on ' + bind);
|
||||
}
|
0
dockers/quotas/html/express_webapp/data/db.js
Normal file
18
dockers/quotas/html/express_webapp/database.js
Normal file
@ -0,0 +1,18 @@
|
||||
|
||||
// Creating new Object of Sequelize
|
||||
const sequelize = new Sequelize(
|
||||
process.env.MYSQL_DATABASE,
|
||||
process.env.MYSQL_USER,
|
||||
process.env.MYSQL_PASSWORD, {
|
||||
// Explicitly specifying
|
||||
// mysql database
|
||||
dialect: 'mariadb',
|
||||
// By default host is 'localhost'
|
||||
host: 'db'
|
||||
}
|
||||
);
|
||||
|
||||
// Exporting the sequelize object.
|
||||
// We can use it in another file
|
||||
// for creating models
|
||||
module.exports = sequelize
|
3149
dockers/quotas/html/express_webapp/package-lock.json
generated
Normal file
24
dockers/quotas/html/express_webapp/package.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "express-webapp",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node ./bin/www"
|
||||
},
|
||||
"dependencies": {
|
||||
"alert": "^5.0.10",
|
||||
"billboard.js": "^3.3.3",
|
||||
"chart.js": "^3.7.1",
|
||||
"cookie-parser": "~1.4.4",
|
||||
"debug": "~2.6.9",
|
||||
"express": "~4.16.1",
|
||||
"http-errors": "~1.6.3",
|
||||
"jade": "~1.11.0",
|
||||
"mariadb": "^2.5.5",
|
||||
"morgan": "~1.9.1",
|
||||
"mysql": "^2.18.1",
|
||||
"node-localstorage": "^2.2.1",
|
||||
"sequelize": "^6.15.0",
|
||||
"xg-xcharts": "^0.2.2"
|
||||
}
|
||||
}
|
BIN
dockers/quotas/html/express_webapp/public/images/favicon.ico
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
dockers/quotas/html/express_webapp/public/images/groupe.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
dockers/quotas/html/express_webapp/public/images/individuel.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
dockers/quotas/html/express_webapp/public/images/quotas.png
Normal file
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 35 KiB |
210
dockers/quotas/html/express_webapp/public/stylesheets/style.css
Normal file
@ -0,0 +1,210 @@
|
||||
/*
|
||||
_____________________________________________________________________________________
|
||||
Ce fichier CSS est script permettent de modifier l'apparence de nos page web
|
||||
|
||||
utiliser par : -groupes.jade
|
||||
-index.jade
|
||||
-indexAdmin.jade
|
||||
-serviceg.jade
|
||||
-users.jade
|
||||
-usersError.jade
|
||||
-usersfound.jade
|
||||
|
||||
Auteurs : Lauryne GAULTIER, GUIQUERRO Nathaniel
|
||||
_____________________________________________________________________________________
|
||||
|
||||
*/
|
||||
|
||||
html{
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #f2f3f1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#entete, #menu, #contenu, #footer {
|
||||
padding:1px 0;
|
||||
font-family: "Courier New", monospace;
|
||||
}
|
||||
|
||||
#entete {
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
background-color:#eeecec;
|
||||
color: #585858;
|
||||
}
|
||||
|
||||
#entete:hover{
|
||||
border-bottom-color: transparent;
|
||||
color: #3dbbf5 !important;
|
||||
}
|
||||
|
||||
#main {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#menu {
|
||||
background-color:#eeecec;
|
||||
float:left;
|
||||
position : fixed;
|
||||
top:0;
|
||||
bottom:0;
|
||||
width: 30%;
|
||||
}
|
||||
|
||||
#contenu {
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-size: 125%;
|
||||
color: #585858;
|
||||
text-align: center;
|
||||
position: fixed;
|
||||
top:20;
|
||||
left:50%;
|
||||
overflow: visible;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
#gauche{
|
||||
position: fixed;
|
||||
left: 35%;
|
||||
}
|
||||
|
||||
#droite{
|
||||
position: fixed;
|
||||
left: 65%;
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
background-color:#eeecec;
|
||||
margin-top :5%;
|
||||
position: relative;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 506px;
|
||||
color: #585858;
|
||||
text-align:center;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
button {
|
||||
display: inline-block;
|
||||
background-color: #585858;
|
||||
border-radius: 10px;
|
||||
border: 4px double #cccccc;
|
||||
color: #eeeeee;
|
||||
text-align: center;
|
||||
font-size: 28px;
|
||||
padding: 20px;
|
||||
width: 500px;
|
||||
transition: all 0.5s;
|
||||
cursor: pointer;
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
button span {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
button span:after {
|
||||
content: '\00bb';
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
top: 0;
|
||||
right: -20px;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #3dbbf5
|
||||
}
|
||||
|
||||
button:hover span {
|
||||
padding-right: 25px;
|
||||
}
|
||||
|
||||
button:hover span:after {
|
||||
opacity: 1;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#textAR{
|
||||
margin-left:10%;
|
||||
}
|
||||
|
||||
#valide,
|
||||
#valide::after {
|
||||
-webkit-transition: all 0.3s;
|
||||
-moz-transition: all 0.3s;
|
||||
-o-transition: all 0.3s;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
#valide{
|
||||
background: none;
|
||||
border: 4px solid rgb(53, 53, 53);
|
||||
border-radius: 10px;
|
||||
color: rgb(53, 53, 53);
|
||||
display: block;
|
||||
font-size: 0.5em;
|
||||
font-weight: bold;
|
||||
margin: 10px auto;
|
||||
padding: 2em 6em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
#valide::before,
|
||||
#valide::after {
|
||||
background: rgb(53, 53, 53);
|
||||
content: '';
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
#valide:hover {
|
||||
color: #3dbbf5
|
||||
}
|
||||
|
||||
#valide::after {
|
||||
height: 0;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#valide::after {
|
||||
height: 0;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
#valide:hover:after {
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#champ.textbox[type=text] {
|
||||
width: 60%;
|
||||
border-radius:20px;
|
||||
padding: 12px 20px;
|
||||
text-align: center;
|
||||
font-family: Moderne Sans, sans-serif;
|
||||
color: #1a1919;
|
||||
font-size: 2vmin;
|
||||
box-sizing: border-box;
|
||||
border: 3px solid rgb(104, 103, 103);
|
||||
transition: 0.5s;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#champ.textbox[type=text]:focus {
|
||||
border: 3px solid rgb(37, 37, 37);
|
||||
}
|
16
dockers/quotas/html/express_webapp/routes/groupes.js
Normal file
@ -0,0 +1,16 @@
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
|
||||
//_________________________________________________________________
|
||||
// script route pour la page groupe.jade
|
||||
//
|
||||
// Auteur : Nathaniel GUIQUERRO
|
||||
//_________________________________________________________________
|
||||
|
||||
/* GET users listing. */
|
||||
router.get('/', function(req, res, next) {
|
||||
console.log("J'envoie le render de la page Groupe");
|
||||
res.render('groupes');
|
||||
});
|
||||
|
||||
module.exports = router;
|
15
dockers/quotas/html/express_webapp/routes/index.js
Normal file
@ -0,0 +1,15 @@
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
|
||||
//_________________________________________________________________
|
||||
// script route pour la page index.jade
|
||||
//
|
||||
// Auteur : Nathaniel GUIQUERRO
|
||||
//_________________________________________________________________
|
||||
|
||||
/* GET home page. */
|
||||
router.get('/', function(req, res, next) {
|
||||
res.render('index', { title: 'Express' });
|
||||
});
|
||||
|
||||
module.exports = router;
|
15
dockers/quotas/html/express_webapp/routes/indexAdmin.js
Normal file
@ -0,0 +1,15 @@
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
|
||||
//_________________________________________________________________
|
||||
// script route pour la page indexAdmin.jade
|
||||
//
|
||||
// Auteur : Nathaniel GUIQUERRO
|
||||
//_________________________________________________________________
|
||||
|
||||
/* GET home page. */
|
||||
router.get('/', function(req, res, next) {
|
||||
res.render('indexAdmin', { title: 'Express' });
|
||||
});
|
||||
|
||||
module.exports = router;
|
68
dockers/quotas/html/express_webapp/routes/serviceg.js
Normal file
@ -0,0 +1,68 @@
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
const {Sequelize} = require("sequelize");
|
||||
//___________________________________________________________________________________
|
||||
// Ce petit script permet de connaitre la taille des services de kaz
|
||||
// -Nextcloud
|
||||
// -Postfix
|
||||
// -Agora
|
||||
//!
|
||||
// le script cherche dans la base mariaDB les differents données qui correspond à chaque
|
||||
// services
|
||||
//
|
||||
// Auteur : Nathaniel Guiquerro Lauryne Gaultier
|
||||
// Retourne : Une page serviceg.jade qui permet de afficher les tailles globales des
|
||||
// services kaz
|
||||
// Exemple : Taille Postfix : 50 Mio
|
||||
// Taille Nextcloud : 50 Mio
|
||||
// Taille Agora : 10 Mio
|
||||
//___________________________________________________________________________________
|
||||
function formatBytes(bytes, decimals = 2) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
|
||||
const k = 1024;
|
||||
const dm = decimals < 0 ? 0 : decimals;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
router.get('/', function(req, res, next) {
|
||||
console.log("Demande de tailles aux scriptes de services");
|
||||
|
||||
//__________________________________________________
|
||||
//
|
||||
// Services Global de kaz
|
||||
// concu de : Postfix, Nextcloud, Agora
|
||||
//
|
||||
//__________________________________________________
|
||||
|
||||
// XXX Felix
|
||||
// const sequelize = new Sequelize("quotas","root","tartelette",{
|
||||
// host: "quotasDB",
|
||||
// dialect:"mariadb"
|
||||
// });
|
||||
|
||||
(async ()=>{
|
||||
try{
|
||||
await sequelize.authenticate();
|
||||
//connecté
|
||||
const query = "SELECT * FROM Global Order by date desc";
|
||||
sequelize.query(query).then(([results, metadata]) => {
|
||||
var R = {"Agora: ":formatBytes(results[0].agora),
|
||||
"Postfix: ":formatBytes(results[0].postfix),
|
||||
"NextCloud: ":formatBytes(results[0].nextcloud),
|
||||
"Total: ":formatBytes(results[0].total)};
|
||||
console.log(R);
|
||||
res.render('serviceg',{data:R});
|
||||
})
|
||||
} catch (error){
|
||||
//pas connecté
|
||||
console.log(error);
|
||||
}
|
||||
})();
|
||||
});
|
||||
|
||||
module.exports = router;
|
209
dockers/quotas/html/express_webapp/routes/users.js
Normal file
@ -0,0 +1,209 @@
|
||||
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
const {Sequelize} = require("sequelize");
|
||||
|
||||
//___________________________________________________________________________________
|
||||
// Ce petit script permet de connaitre la taille memoire d'un utilisateur
|
||||
|
||||
// Auteur : Nathaniel Guiquerro Lauryne Gaultier
|
||||
//
|
||||
// GET : Quand on charge la page on tombe sur un formulaire
|
||||
// il faut alors renseigner le email et un nombre entre 1 et 30
|
||||
// ex : contact1@kaz.local et 25
|
||||
// POST: SI l'email existe ou le nombre n'est pas correcte alors on va rechercher si
|
||||
// il existe les quotas avec le script ../../quotas/UtilisateurTailleGlobal.sh
|
||||
// SINON on renvoie l'erreur du script ../../quotas/UtilisateurTailleGlobal.sh
|
||||
//___________________________________________________________________________________
|
||||
|
||||
|
||||
//fonction de convertiseur d'uniter automatique
|
||||
function formatBytes(bytes, decimals = 2) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
|
||||
const k = 1024;
|
||||
const dm = decimals < 0 ? 0 : decimals;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
//fonction qui converti la donnée en paramètre
|
||||
// bytes -----> Mb
|
||||
function getMB(bytes){
|
||||
return bytes/1000000;
|
||||
}
|
||||
|
||||
async function getData(email , nb ){
|
||||
var tabDeDonnee = [];
|
||||
|
||||
// XXX Felix
|
||||
// const sequelize = new Sequelize("quotas","root","tartelette",{
|
||||
// host: "quotasDB",
|
||||
// dialect:"mariadb"
|
||||
// });
|
||||
|
||||
try{
|
||||
await sequelize.authenticate();
|
||||
//connecté
|
||||
const query ="SELECT * FROM Utilisateur WHERE utilisateur='"+email+"' ORDER BY date desc ;";
|
||||
sequelize.query(query).then(([results, metadata]) => {
|
||||
|
||||
var i=0;
|
||||
while(i<nb){
|
||||
tabDeDonnee.push(getMB(results[i].total));
|
||||
var date = new Date(results[i].date);
|
||||
var m =date.getMonth()+1;
|
||||
tabDeDonnee.push(date.getDate()+"/"+m+"/"+date.getFullYear()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
|
||||
i++;
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
} catch (error){
|
||||
//pas connecté
|
||||
console.log(error);
|
||||
|
||||
}
|
||||
return tabDeDonnee;
|
||||
}
|
||||
|
||||
//fonction qui permet de recuperer la limitation de place d'un utilisateur
|
||||
async function getLimit(email, nb ){
|
||||
var tabDeDonnee = [];
|
||||
|
||||
// XXX Felix
|
||||
// const sequelize = new Sequelize("quotas","root","tartelette",{
|
||||
// host: "quotasDB",
|
||||
// dialect:"mariadb"
|
||||
// });
|
||||
|
||||
try{
|
||||
await sequelize.authenticate();
|
||||
//connecté
|
||||
const query ="SELECT * FROM Utilisateur WHERE utilisateur='"+email+"' ORDER BY date desc ;";
|
||||
sequelize.query(query).then(([results, metadata]) => {
|
||||
var i=0;
|
||||
while(i<nb){
|
||||
tabDeDonnee.push(getMB(results[i].limite*1000000000));
|
||||
i++;
|
||||
}
|
||||
tabDeDonnee
|
||||
|
||||
})
|
||||
|
||||
} catch (error){
|
||||
//pas connecté
|
||||
console.log(error);
|
||||
|
||||
}
|
||||
return tabDeDonnee;
|
||||
}
|
||||
|
||||
function splitDonne(array){
|
||||
var tabDonne = [];
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
if(i%2==0){
|
||||
tabDonne.push(array[i]);
|
||||
}
|
||||
}
|
||||
return tabDonne;
|
||||
}
|
||||
|
||||
|
||||
function splitTime(array){
|
||||
var tabTime = [];
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
if(i%2!=0){
|
||||
tabTime.push(array[i]);
|
||||
}
|
||||
}
|
||||
return tabTime;
|
||||
}
|
||||
|
||||
//fonction qui converti le timestamp en un objet Date
|
||||
function timeConverter(UNIX_timestamp){
|
||||
var date = new Date(UNIX_timestamp);
|
||||
|
||||
return (date.getDate()+
|
||||
"/"+(date.getMonth()+1)+
|
||||
"/"+date.getFullYear()+
|
||||
" "+date.getHours()+
|
||||
":"+date.getMinutes()+
|
||||
":"+date.getSeconds());
|
||||
}
|
||||
|
||||
/*
|
||||
GET users listing.
|
||||
Cette page affiche le formulaire avec l'email
|
||||
*/
|
||||
router.get('/', function(req, res, next) {
|
||||
res.render('users');
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
ICI ce trouve le traitement du mail renseignée via le formulaire
|
||||
*/
|
||||
router.post('/', async function(req, res, next) {
|
||||
myArray = req.body.email;
|
||||
var splits = myArray.split("@");
|
||||
|
||||
email=splits[0];
|
||||
|
||||
var nombreJ = req.body.nombreJ;
|
||||
if(nombreJ<1 || nombreJ>30) res.render('usersError');
|
||||
|
||||
// XXX Felix
|
||||
// const sequelize = new Sequelize("quotas","root","tartelette",{
|
||||
// host: "quotasDB",
|
||||
// dialect:"mariadb"
|
||||
// });
|
||||
|
||||
(async ()=>{
|
||||
try{
|
||||
await sequelize.authenticate();
|
||||
var dat = await getData(email,nombreJ);
|
||||
var lim = await getLimit(email,nombreJ);
|
||||
|
||||
setTimeout(function(){
|
||||
console.log("Ready")
|
||||
|
||||
var tabDonne = splitDonne(dat);
|
||||
var tabTime = splitTime(dat);
|
||||
|
||||
|
||||
//connecté
|
||||
const query ="SELECT * FROM Utilisateur WHERE utilisateur='"+email+"' ORDER BY date desc LIMIT 1;";
|
||||
sequelize.query(query).then(([results, metadata]) => {
|
||||
|
||||
var i=0;
|
||||
var trouve =false;
|
||||
while(i<results.length && !trouve ){
|
||||
if(results[i].utilisateur==email){
|
||||
var R = {"nom":email,"Postfix":getMB(results[i].postfix),"NextCloud":getMB(results[i].nextcloud),"Total":getMB(results[i].total),"Dateduprélevement":timeConverter(results[i].date),"dataChart":tabDonne,"labels":tabTime,"Lim":lim};
|
||||
|
||||
res.render('usersfound',{data:R});
|
||||
trouve=true;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if(!trouve){
|
||||
res.render('usersError');
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}, 1000);
|
||||
} catch (error){
|
||||
//pas connecté
|
||||
console.log(error);
|
||||
}
|
||||
})();
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
100
dockers/quotas/html/express_webapp/routes/usersAdmin.js
Normal file
@ -0,0 +1,100 @@
|
||||
|
||||
var express = require('express');
|
||||
var router = express.Router();
|
||||
const {Sequelize} = require("sequelize");
|
||||
|
||||
//___________________________________________________________________________________
|
||||
// Ce petit script permet de connaitre la taille memoire d'un utilisateur
|
||||
|
||||
// Auteur : Nathaniel Guiquerro Lauryne Gaultier
|
||||
//
|
||||
// GET : Quand on charge la page on tombe sur un formulaire
|
||||
// il faut alors renseigner le email et un nombre entre 1 et 30
|
||||
// ex : contact1@kaz.local et 25
|
||||
// POST: SI l'email existe ou le nombre n'est pas correcte alors on va rechercher si
|
||||
// il existe les quotas avec le script ../../quotas/UtilisateurTailleGlobal.sh
|
||||
// SINON on renvoie l'erreur du script ../../quotas/UtilisateurTailleGlobal.sh
|
||||
//___________________________________________________________________________________
|
||||
|
||||
//fonction de convertiseur d'uniter automatique
|
||||
function formatBytes(bytes, decimals = 2) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
|
||||
const k = 1024;
|
||||
const dm = decimals < 0 ? 0 : decimals;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
//fonction qui converti le timestamp en un objet Date
|
||||
function timeConverter(UNIX_timestamp){
|
||||
var date = new Date(UNIX_timestamp);
|
||||
|
||||
return (date.getDate()+
|
||||
"/"+(date.getMonth()+1)+
|
||||
"/"+date.getFullYear()+
|
||||
" "+date.getHours()+
|
||||
":"+date.getMinutes()+
|
||||
":"+date.getSeconds());
|
||||
}
|
||||
|
||||
/*
|
||||
GET users listing.
|
||||
Cette page affiche le formulaire avec l'email
|
||||
*/
|
||||
router.get('/', function(req, res, next) {
|
||||
res.render('users');
|
||||
});
|
||||
|
||||
/*
|
||||
ICI ce trouve le traitement du mail renseignée vvia le formulaire
|
||||
*/
|
||||
router.post('/', function(req, res, next) {
|
||||
myArray = req.body.email;
|
||||
var splits = myArray.split("@");
|
||||
|
||||
email=splits[0];
|
||||
|
||||
// XXX Felix
|
||||
// const sequelize = new Sequelize("quotas","root","tartelette",{
|
||||
// host: "db",
|
||||
// dialect:"mariadb"
|
||||
// });
|
||||
|
||||
(async ()=>{
|
||||
try{
|
||||
await sequelize.authenticate();
|
||||
//connecté
|
||||
const query ="SELECT * FROM Utilisateur ORDER BY date desc LIMIT 1;";
|
||||
sequelize.query(query).then(([results, metadata]) => {
|
||||
var i=0;
|
||||
var trouve =false;
|
||||
while(i<results.length && !trouve ){
|
||||
if(results[i].utilisateur==email){
|
||||
var R = {"Postfix: ":formatBytes(results[i].postfix),
|
||||
"NextCloud: ":formatBytes(results[i].nextcloud),
|
||||
"Total: ":formatBytes(results[i].total),
|
||||
"Date du prélevement: ":timeConverter(results[i].date)};
|
||||
res.render('usersfound',{data:R});
|
||||
trouve=true;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if(!trouve){
|
||||
res.render('usersError');
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
} catch (error){
|
||||
//pas connecté
|
||||
console.log(error);
|
||||
}
|
||||
})();
|
||||
});
|
||||
|
||||
module.exports = router;
|
6
dockers/quotas/html/express_webapp/views/error.jade
Normal file
@ -0,0 +1,6 @@
|
||||
extends layout
|
||||
|
||||
block content
|
||||
h1= message
|
||||
h2= error.status
|
||||
pre #{error.stack}
|
32
dockers/quotas/html/express_webapp/views/groupes.jade
Normal file
@ -0,0 +1,32 @@
|
||||
doctype html
|
||||
//-
|
||||
#_________________________________________________________________
|
||||
Page jade correspondant à l'affichage des groupes de famille et
|
||||
des associations
|
||||
|
||||
Auteur : Lauryne GAULTIER
|
||||
_________________________________________________________________
|
||||
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
title KAZ Quotas Associations
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") Tableau de bord Quotas des Associations
|
||||
p rechercher d'une asssociation pour savoir combien de place il utilise en total dans chaque service
|
||||
#main
|
||||
#menu
|
||||
img(src='/images/groupe.png' width='100%')
|
||||
#contenu
|
||||
button Association 1 :
|
||||
br
|
||||
button Association 2 :
|
||||
br
|
||||
button Association 3 :
|
||||
br
|
||||
#footer
|
||||
button(onclick="window.location.href = '/admin';") Retour
|
||||
br
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
29
dockers/quotas/html/express_webapp/views/index.jade
Normal file
@ -0,0 +1,29 @@
|
||||
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant à l'affichage à la page principale
|
||||
qui regroupe plusieurs boutons pour pouvoir accéder aux différentes
|
||||
pages des quotas
|
||||
|
||||
# Auteur : Lauryne GAULTIER
|
||||
_________________________________________________________________
|
||||
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.ico">
|
||||
title KAZ Quotas
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") LE NUMERIQUE ETHIQUE ET LOCAL
|
||||
h2 Bienvenue
|
||||
p Ci-dessous se trouve les différente catégorie de quotas
|
||||
#main
|
||||
#menu
|
||||
img(id="object-position-1" src='/images/quotas.png' width='100%')
|
||||
#contenu
|
||||
button(onclick="window.location.href = '/users';") Individuels
|
||||
#footer
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
39
dockers/quotas/html/express_webapp/views/indexAdmin.jade
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant à l'affichage à la page principale
|
||||
qui regroupe plusieurs boutons pour pouvoir accéder aux différentes
|
||||
pages des quotas
|
||||
|
||||
# Auteur : Lauryne GAULTIER
|
||||
_________________________________________________________________
|
||||
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.ico">
|
||||
title KAZ Quotas ADMIN
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") LE NUMERIQUE ETHIQUE ET LOCAL
|
||||
p Ci-dessous se trouve les différente catégorie de quotas
|
||||
p Vous Vous trouvez dans la partie ADMINISTRATEUR du service
|
||||
#main
|
||||
#menu
|
||||
img(id="object-position-1" src='/images/quotas.png' width='100%')
|
||||
#contenu
|
||||
br
|
||||
br
|
||||
button(onclick="window.location.href = '/admin/serviceg';") Service Global
|
||||
br
|
||||
button(onclick="window.location.href = '/admin/users';") Individuels
|
||||
br
|
||||
button(onclick="window.location.href = '/admin/groupes';") Groupes
|
||||
br
|
||||
br
|
||||
button(onclick="window.location.href = '/';") Menu Kaznaute
|
||||
br
|
||||
#footer
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
7
dockers/quotas/html/express_webapp/views/layout.jade
Normal file
@ -0,0 +1,7 @@
|
||||
doctype html
|
||||
html
|
||||
head
|
||||
title= title
|
||||
link(rel='stylesheet', href='/stylesheets/style.css')
|
||||
body
|
||||
block content
|
34
dockers/quotas/html/express_webapp/views/serviceg.jade
Normal file
@ -0,0 +1,34 @@
|
||||
doctype html
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant à l'affichage des quotas des differents
|
||||
service qu'offre kaz comme :
|
||||
-Nexcloud
|
||||
-Postfix
|
||||
-Agora
|
||||
|
||||
Auteur : Lauryne GAULTIER
|
||||
_________________________________________________________________
|
||||
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
title KAZ Quotas Global
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") Tableau de bord Quotas Global
|
||||
p voici les différent service de KAZ avec leur poids respectif
|
||||
#main
|
||||
#menu
|
||||
img(src='/images/serviceglobal.png' width='100%')
|
||||
#contenu
|
||||
each val,index in data
|
||||
tr
|
||||
br
|
||||
td= index+ ' ' + val
|
||||
|
||||
#footer
|
||||
button(onclick="window.location.href = '/admin';") Retour
|
||||
br
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
41
dockers/quotas/html/express_webapp/views/users.jade
Normal file
@ -0,0 +1,41 @@
|
||||
doctype html
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant à l'affichage des quotas d'un utilisateur
|
||||
la page comporte un champ de texte où l'on peut entrer l'email
|
||||
d'un utilisateur pour regarder les quotas qu'il utilise on peu
|
||||
aussi entrer un nombre entre 1 et 30 pour pouvoir choisir le nombre
|
||||
de jour afficher dans le graphe
|
||||
|
||||
Auteurs : Lauryne GAULTIER, GUIQUERRO Nathaniel
|
||||
_________________________________________________________________
|
||||
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
title KAZ Quotas Individuels
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") Tableau de bord Quotas Individuels
|
||||
p(id="textAR") rechercher l'email d'un utilisateur pour savoir combien de place il utilise en total dans chaque service
|
||||
#main
|
||||
#menu
|
||||
img(src='/images/individuel.png' width='100%')
|
||||
#contenu
|
||||
form(action='/users' method='POST')
|
||||
label(for='email') Recherche :
|
||||
br
|
||||
input#champ.textbox(type='email' name='email' required='' placeholder="Email utilisateur")
|
||||
br
|
||||
label(for='nombreJ') Nombre de Jours à afficher :
|
||||
br
|
||||
input#champ.textbox(type='number' name='nombreJ' required='' placeholder="1")
|
||||
br
|
||||
p le nombre de jours doivent être entre 1 et 30
|
||||
br
|
||||
input.myButton(id="valide" type='submit' value='Valider')
|
||||
#footer
|
||||
button(onclick="window.location.href = '/';") Retour
|
||||
br
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
40
dockers/quotas/html/express_webapp/views/usersError.jade
Normal file
@ -0,0 +1,40 @@
|
||||
doctype html
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant à l'affichage des quatas d'un utilisateur
|
||||
la page comporte un champs de texte ou l'on peut entrer l'email
|
||||
d'un utilisateur pour regarder le quotas qu'il utilise
|
||||
|
||||
Auteur : Lauryne GAULTIER
|
||||
_________________________________________________________________
|
||||
|
||||
html
|
||||
head
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
title KAZ Quotas Individuels
|
||||
meta(charset='UTF-8')
|
||||
body
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") Tableau de bord Quotas Individuels
|
||||
p rechercher l'email d'un utilisateur pour savoir combien de place il utilise en total dans chaque service
|
||||
#main
|
||||
#menu
|
||||
img(src='/images/individuel.png' width='100%')
|
||||
#contenu
|
||||
p L'utilisateur saisie précedamment n'est pas correct ou le nombre de jours n'est pas correcte
|
||||
form(action='/users' method='POST')
|
||||
label(for='email') Email:
|
||||
br
|
||||
input#email.textbox(type='email' name='email' required='')
|
||||
br
|
||||
label(for='nombreJ') Nombre de Jours à afficher :
|
||||
br
|
||||
input#champ.textbox(type='number' name='nombreJ' required='' placeholder="1")
|
||||
br
|
||||
p le nombre de jours doivent être entre 1 et 30
|
||||
br
|
||||
input.myButton(id="valide" type='submit' value='Valider')
|
||||
#footer
|
||||
button(onclick="window.location.href = '/';") Retour
|
||||
br
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
110
dockers/quotas/html/express_webapp/views/usersfound.jade
Normal file
@ -0,0 +1,110 @@
|
||||
doctype html
|
||||
//-
|
||||
_________________________________________________________________
|
||||
Page jade correspondant au résultat de la recherche de
|
||||
l'utilisateur, renvoie les quotas actuellement utiliser par
|
||||
l'utilisateur via un graphe en forme de camembert où on peut
|
||||
trouver la taille des mails, du cloud, mais aussi l'espace libre qui
|
||||
reste souvent la limitation de l'utilisateur
|
||||
|
||||
il y a aussi un autre graphe qui permet de voir (suit le nombre
|
||||
de jour choisi a la page précédente) le total de place utiliser par
|
||||
rapport a la limite des jours précédents.
|
||||
|
||||
Auteurs : Lauryne GAULTIER, GUIQUERRO Nathaniel
|
||||
_________________________________________________________________
|
||||
|
||||
html
|
||||
head(ng-app='myApp' ng-controller='myCtrl')
|
||||
link(href='/stylesheets/style.css' rel='stylesheet' type='text/css')
|
||||
title KAZ Quotas Individuels
|
||||
meta(charset='UTF-8')
|
||||
#entete
|
||||
h1(onclick="window.location.href = 'https://kaz.bzh/'") Résultat de la recherche pour
|
||||
h1 #{data.nom}
|
||||
#main
|
||||
#menu
|
||||
img(src='/images/individuel.png' width='100%')
|
||||
#contenu
|
||||
#gauche
|
||||
p(style='display:none') #{data.dataChart}
|
||||
p(style='display:none') #{data.labels}
|
||||
p(style='display:none') #{data.Lim}
|
||||
canvas#myChart(display= 'inline-block' width='500' height='600')
|
||||
script(src='https://cdn.jsdelivr.net/npm/chart.js')
|
||||
script.
|
||||
var dataC = (document.getElementsByTagName('p')[0].innerHTML).split(',');
|
||||
var lC = (document.getElementsByTagName('p')[1].innerHTML).split(',');
|
||||
var limC = (document.getElementsByTagName('p')[2].innerHTML).split(',');
|
||||
|
||||
|
||||
|
||||
var ctx = document.getElementById('myChart').getContext('2d');
|
||||
var myChart = new Chart(ctx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
datasets: [{
|
||||
label: 'Unité de mesure :MB',
|
||||
data: dataC,
|
||||
backgroundColor: [
|
||||
'rgba(242, 132, 158, 0.2)'
|
||||
],
|
||||
borderColor: [
|
||||
'rgba(242, 132, 158, 1)'
|
||||
],
|
||||
borderWidth: 1
|
||||
}, {
|
||||
label: 'Limite quotas',
|
||||
data: limC,
|
||||
type: 'line',
|
||||
borderColor: 'black'
|
||||
}],
|
||||
labels: lC
|
||||
}
|
||||
});
|
||||
#droite
|
||||
p(style='display:none') #{data.Postfix}
|
||||
p(style='display:none') #{data.NextCloud}
|
||||
p Votre Quota actuel #{data.Dateduprélevement}
|
||||
canvas#myChart2(display='inline-block' height='300')
|
||||
script.
|
||||
var dPost = (document.getElementsByTagName('p')[3].innerHTML).split(',');
|
||||
var dNext = (document.getElementsByTagName('p')[4].innerHTML).split(',');
|
||||
var dDate = (document.getElementsByTagName('p')[5].innerHTML).split(',');
|
||||
var dLabel = ('Votre Quota actuel' + dDate);
|
||||
|
||||
pPost = ((dPost*100)/limC[limC.length - 1]);
|
||||
pNetf = ((dNext*100)/limC[limC.length - 1]);
|
||||
var pLibre = (100-(pPost+pNetf));
|
||||
|
||||
var tableauDonne = [pPost,pNetf,pLibre];
|
||||
|
||||
|
||||
var ctxy = document.getElementById('myChart2').getContext('2d');
|
||||
var myCharty = new Chart(ctxy, {
|
||||
type: 'pie',
|
||||
data: {
|
||||
datasets: [{
|
||||
label: dLabel,
|
||||
data: tableauDonne,
|
||||
backgroundColor: [
|
||||
'rgba(255, 99, 132, 0.2)',
|
||||
'rgba(54, 162, 235, 0.2)',
|
||||
'rgba(255, 206, 86, 0.2)'
|
||||
],
|
||||
borderColor: [
|
||||
'rgba(255, 99, 132, 1)',
|
||||
'rgba(54, 162, 235, 1)',
|
||||
'rgba(255, 206, 86, 1)'
|
||||
],
|
||||
borderWidth: 1,
|
||||
hoverOffset: 4
|
||||
}],
|
||||
labels: ["Mail","NextCloud","Espace Libre"]
|
||||
}
|
||||
});
|
||||
#footer
|
||||
button(onclick="window.location.href = '/users';") Retour
|
||||
br
|
||||
p Site réalisé par les étudiants du département informatique sous la direction de F. Merciol & N. Le Sommer et G. Kerbellec durant l'année 2021-2022
|
||||
|
32
dockers/quotas/html/groupes.html
Normal file
@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="style.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
<title>KAZ : Aperçu</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="entete">
|
||||
<h1> Tableau de bord Quotas </h1>
|
||||
<p> Ci-dessous se trouve ......... </p>
|
||||
</div>
|
||||
|
||||
<div id="main">
|
||||
<div id="menu">
|
||||
<img src="images/groupe.png" width=200%>
|
||||
</div>
|
||||
|
||||
<div id="contenu">
|
||||
<button >Association 1 : </button><br>
|
||||
<button >Association 2 : </button><br>
|
||||
<button >Association 3 : </button><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<button onclick="window.location.href = 'index.html';">Retour</button><br>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
dockers/quotas/html/images/favicon.ico
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
dockers/quotas/html/images/groupe.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
dockers/quotas/html/images/individuel.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
dockers/quotas/html/images/quotas.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
dockers/quotas/html/images/serviceglobal.png
Normal file
After Width: | Height: | Size: 35 KiB |
35
dockers/quotas/html/index.html
Normal file
@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="style.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
<title>KAZ : Aperçu</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="entete">
|
||||
<h1> Le numérique éthique et local </h1>
|
||||
<p> Ci-dessous se trouve ......... </p>
|
||||
</div>
|
||||
|
||||
<div id="main">
|
||||
<div id="menu">
|
||||
<img src="images/quotas.png" width=200% >
|
||||
</div>
|
||||
|
||||
<div id="contenu">
|
||||
<button onclick="window.location.href = 'serviceG.html';">Service Global</button><br>
|
||||
|
||||
<button onclick="window.location.href = 'individuels.html';">Individuels</button><br>
|
||||
|
||||
<button onclick="window.location.href = 'groupes.html';">Groupes</button><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<p> Ci-dessous se trouve ......... </p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
32
dockers/quotas/html/individuels.html
Normal file
@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="style.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
<title>KAZ : Aperçu</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="entete">
|
||||
<h1> Tableau de bord Quotas </h1>
|
||||
<p> Ci-dessous se trouve ......... </p>
|
||||
</div>
|
||||
|
||||
<div id="main">
|
||||
<div id="menu">
|
||||
<img src="images/individuel.png" width=200% >
|
||||
</div>
|
||||
|
||||
<div id="contenu">
|
||||
<button >Personne 1 : </button><br>
|
||||
<button >Personne 2 : </button><br>
|
||||
<button >Personne 3 : </button><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<button onclick="window.location.href = 'index.html';">Retour</button><br>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
167
dockers/quotas/html/kaz.quota/package-lock.json
generated
Normal file
@ -0,0 +1,167 @@
|
||||
{
|
||||
"name": "kaz.quota",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express-generator": "^4.16.1"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/commander": {
|
||||
"version": "2.15.1",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
|
||||
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
|
||||
},
|
||||
"node_modules/concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
||||
},
|
||||
"node_modules/ejs": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
|
||||
"integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/express-generator": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/express-generator/-/express-generator-4.16.1.tgz",
|
||||
"integrity": "sha512-tWYEx5Y/Llos2qC6yAETmdqEMEPqNUzJ8btGcSZ2zSr8RYOalzffhvh9zx5OQTctvOgJ9kKYxyvFGAIuUuF/wA==",
|
||||
"dependencies": {
|
||||
"commander": "2.15.1",
|
||||
"ejs": "2.6.1",
|
||||
"minimatch": "3.0.4",
|
||||
"mkdirp": "0.5.1",
|
||||
"sorted-object": "2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"express": "bin/express-cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/minimatch": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||
},
|
||||
"node_modules/mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
|
||||
"dependencies": {
|
||||
"minimist": "0.0.8"
|
||||
},
|
||||
"bin": {
|
||||
"mkdirp": "bin/cmd.js"
|
||||
}
|
||||
},
|
||||
"node_modules/sorted-object": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz",
|
||||
"integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw="
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.15.1",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
|
||||
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
||||
},
|
||||
"ejs": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
|
||||
"integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ=="
|
||||
},
|
||||
"express-generator": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/express-generator/-/express-generator-4.16.1.tgz",
|
||||
"integrity": "sha512-tWYEx5Y/Llos2qC6yAETmdqEMEPqNUzJ8btGcSZ2zSr8RYOalzffhvh9zx5OQTctvOgJ9kKYxyvFGAIuUuF/wA==",
|
||||
"requires": {
|
||||
"commander": "2.15.1",
|
||||
"ejs": "2.6.1",
|
||||
"minimatch": "3.0.4",
|
||||
"mkdirp": "0.5.1",
|
||||
"sorted-object": "2.0.1"
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
},
|
||||
"sorted-object": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz",
|
||||
"integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw="
|
||||
}
|
||||
}
|
||||
}
|
14
dockers/quotas/html/kaz.quota/package.json
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "kaz.quota",
|
||||
"version": "1.0.0",
|
||||
"description": "This is used to print quota on a HTML page",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "GUIQUERRO Nathaniel & GAULTIER Lauryne",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express-generator": "^4.16.1"
|
||||
}
|
||||
}
|
6
dockers/quotas/html/package-lock.json
generated
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "html",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {}
|
||||
}
|
1
dockers/quotas/html/package.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
33
dockers/quotas/html/serviceG.html
Normal file
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="style.css" rel="stylesheet" type="text/css">
|
||||
|
||||
|
||||
<title>KAZ : Aperçu</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="entete">
|
||||
<h1> Tableau de bord Quotas </h1>
|
||||
<p> Ci-dessous se trouve ......... </p>
|
||||
</div>
|
||||
|
||||
<div id="main">
|
||||
<div id="menu">
|
||||
<img src="images/serviceglobal.png" width=200% >
|
||||
</div>
|
||||
|
||||
<div id="contenu">
|
||||
<button >NextCloud : </button><br>
|
||||
<button >Agora : </button><br>
|
||||
<button >Postfix : </button><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<button onclick="window.location.href = 'index.html';">Retour</button><br>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
74
dockers/quotas/html/style.css
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
|
||||
body {
|
||||
background-color: #f2f3f1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#entete, #menu, #contenu, #footer {
|
||||
padding:1px 0;
|
||||
}
|
||||
#entete {
|
||||
background-color:#FF9900;
|
||||
text-align:center;
|
||||
}
|
||||
#main {
|
||||
max-with:960px;
|
||||
margin:auto;
|
||||
}
|
||||
#menu {
|
||||
float:left;
|
||||
width:240px;
|
||||
background-color:#FF3366;
|
||||
}
|
||||
#contenu {
|
||||
margin-left:245px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 40%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
#footer {
|
||||
background-color:#669933;
|
||||
text-align:center;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
button {
|
||||
display: inline-block;
|
||||
background-color: #585858;
|
||||
border-radius: 10px;
|
||||
border: 4px double #cccccc;
|
||||
color: #eeeeee;
|
||||
text-align: center;
|
||||
font-size: 28px;
|
||||
padding: 20px;
|
||||
width: 500px;
|
||||
transition: all 0.5s;
|
||||
cursor: pointer;
|
||||
margin: 15px;
|
||||
}
|
||||
button span {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
transition: 0.5s;
|
||||
}
|
||||
button span:after {
|
||||
content: '\00bb';
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
top: 0;
|
||||
right: -20px;
|
||||
transition: 0.5s;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #f2849e
|
||||
}
|
||||
button:hover span {
|
||||
padding-right: 25px;
|
||||
}
|
||||
button:hover span:after {
|
||||
opacity: 1;
|
||||
right: 0;
|
||||
}
|