Version 1.0.0 - Basic Web Application

This commit is contained in:
2024-12-29 15:18:12 +01:00
parent 0ffcafdf3f
commit 6f637968bd
50 changed files with 42 additions and 6643 deletions

View File

@ -34,7 +34,7 @@ module.exports.check = function(token) {
}
/**
* Permet de se connecter à Neutral
* Permet de se connecter à Inventory
* @param {object} data
* @returns Token or AUTH_FAILED
*/

View File

@ -35,11 +35,6 @@ module.exports.updateFile = function (file) {
}
}
module.exports.getSettings = function () {
const file = this.getFile()
return {"jenkins_token": file.JENKINS_TOKEN, "omega_token": file.OMEGA_KEY}
}
module.exports.saveSettings = function (settings) {
const file = this.getFile()
file.JENKINS_TOKEN = settings.jenkins_token

View File

@ -1,268 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const clog = new LogType("Fichier")
const os = require("os");
const uuid = require('uuid');
var mime = require('mime-types');
// check if shared folder exist, if not create it
if(!fs.existsSync(__glob.SHARED)) {
fs.mkdirSync(__glob.SHARED)
}
module.exports.getFiles = function(root) {
var response = new Object()
response.content = new Array()
try{
if(root == "homepath") {
root = os.homedir()
}
if(root == "sharepath") {
root = __glob.SHARED
}
if(root == "logpath") {
root = __glob.LOGS
}
if(!fs.existsSync(root)) {
response.content = "NOT_EXIST"
} else {
for(var file of fs.readdirSync(root)) {
const stat = fs.statSync(root + path.sep + file)
response.content.push({"name":file, id: uuid.v4().toString() ,"fileDirectory" : root + path.sep + file , "type":mime.lookup(file), "size":stat.size, "lastedition":stat.mtimeMs, "directory":stat.isDirectory()})
}
}
}catch(err) {
response.content = "NOT_PERMITTED"
}
response.root = root
response.parent = path.dirname(root)
return response
}
module.exports.createFolder = function(root) {
// Check if folder already exist
if(!fs.existsSync(root)) {
try {
fs.mkdirSync(root)
return "OK"
} catch(err) {
return "NOT_PERMITTED"
}
} else {
return 'EXIST'
}
}
module.exports.deleteFile = function(root) {
if(fs.existsSync(root)) {
try {
fs.rmSync(root, { recursive: true, force: true })
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else {
return "NOT_EXIST"
}
}
module.exports.renameFile = function(settings) {
if(fs.existsSync(settings.root)) {
try {
fs.renameSync(settings.root + path.sep + settings.oldName, settings.root + path.sep + settings.newName)
return "OK"
} catch(err) {
return "NOT_PERMITTED"
}
} else {
return "NOT_EXIST"
}
}
module.exports.shareFile = function(settings) {
if(fs.existsSync(settings.root)) {
try {
//Create a sybolic link to shared folder
fs.symlinkSync(settings.root + path.sep + settings.name, __glob.SHARED + path.sep + settings.name)
// return the link of the file shared
if(process.env.DEV) {
return "http://localhost:3001/shared/" + settings.name
} else {
return "https://neutral.raphix.fr/shared/" + settings.name
}
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else {
return "NOT_EXIST"
}
}
module.exports.getFile = function(root) {
if(fs.existsSync(root)) {
try {
// Check if the file is an image and if it is return the base64
if(mime.lookup(root).includes("image")) {
return "data:" + mime.lookup(root) + ";base64," + fs.readFileSync(root, "base64")
} else {
return fs.readFileSync(root, "utf-8")
}
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else {
return "NOT_EXIST"
}
}
module.exports.saveFile = function(settings) {
try {
fs.writeFileSync(settings.root + path.sep + settings.name, settings.content)
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
}
module.exports.downloadFile = function(root) {
if(fs.existsSync(root)) {
try {
return fs.readFileSync(root)
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else {
return "NOT_EXIST"
}
}
module.exports.uploadFile = function(settings) {
try {
fs.writeFileSync(settings.root + path.sep + settings.name, settings.file)
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
}
module.exports.newFile = function(settings) {
if(!fs.existsSync(settings)) {
try {
fs.writeFileSync(settings, "")
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else {
return "EXIST"
}
}
module.exports.pasteFile = function(settings) {
if(settings.action == "cut") {
try {
fs.renameSync(settings.file.fileDirectory, settings.newPath + path.sep + settings.name)
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
} else if(settings.action == "copy") {
try {
fs.copyFileSync(settings.file.fileDirectory, settings.newPath + path.sep + settings.name)
return "OK"
} catch(err) {
console.log(err)
return "NOT_PERMITTED"
}
}
}

View File

@ -5,12 +5,9 @@ const __glob = {
ROUTES: root + path.sep + "routes" + path.sep,
ROOT: root,
LOGS: root + path.sep + "logs",
ICON: root + path.sep + "public" + path.sep + 'images' + path.sep + "FormatLogo_WHITE.ico",
DATA: root + path.sep + "data",
USERS: root + path.sep + "data" + path.sep + "users.json",
CONFIG: root + path.sep + "data" + path.sep + "config.json",
SHARED: root + path.sep + "data" + path.sep + "shared",
USERS_IMAGES: root + path.sep + "data" + path.sep + "user_images",
PACKAGE_JSON: root + path.sep + "package.json",
};

View File

@ -1,106 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const ulog = new LogType("Links")
const uuid = require("uuid")
const config = require("./config")
const {ApplyLinks} = require("../routes/link")
if(!fs.existsSync(__glob.DATA + path.sep + "links.json")) {
fs.writeFileSync(__glob.DATA + path.sep + "links.json", JSON.stringify([], null, 2))
}
module.exports.getLinks = function() {
return JSON.parse(fs.readFileSync(__glob.DATA + path.sep + "links.json"))
}
const FirstLinkManager = new ApplyLinks(this.getLinks())
module.exports.addLink = function(settings) {
var canDo = true
const links = this.getLinks()
var id = makeid(8)
if(settings.abstractLink) {
settings.dest = id.toString()
}
// Check if a destination already exists between links and if it's the case, we return an error "ALREADY_EXiST"
links.forEach((link) => {
if(link.dest == settings.dest) {
canDo = false
}
})
const link = {
id: id,
title: settings.title,
url: settings.url,
dest: settings.dest,
}
if(canDo) {
links.push(link)
fs.writeFileSync(__glob.DATA + path.sep + "links.json", JSON.stringify(links, null, 2))
const LinkManager = new ApplyLinks(this.getLinks())
return "OK"
} else {
return "ALREADY_EXIST"
}
}
module.exports.removeLink = function(id) {
const links = this.getLinks()
const newLinks = []
links.forEach((link) => {
if(link.id != id) {
newLinks.push(link)
}
})
fs.writeFileSync(__glob.DATA + path.sep + "links.json", JSON.stringify(newLinks, null, 2))
const LinkManager = new ApplyLinks(this.getLinks())
return "OK"
}
module.exports.updateLink = function(id, settings) {
const links = this.getLinks()
const newLinks = []
links.forEach((link) => {
if(link.id == id) {
link.title = settings.title
link.url = settings.url
}
newLinks.push(link)
})
fs.writeFileSync(__glob.DATA + path.sep + "links.json", JSON.stringify(newLinks, null, 2))
const LinkManager = new ApplyLinks(this.getLinks())
return "OK"
}
function makeid(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}

View File

@ -1,128 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
var CryptoJS = require("crypto-js")
const { __glob } = require("./global-variables")
const { captureRejectionSymbol } = require("events")
const clog = new LogType("Metrics")
if(!fs.existsSync(__glob.DATA + path.sep + "metrics.json")) {
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify([], null, 2))
}
module.exports.getDataMetrics = function() {
return JSON.parse(fs.readFileSync(__glob.DATA + path.sep + "metrics.json"))
}
module.exports.getMetrics = function() {
const metrics = this.getDataMetrics()
var metricsToReturn = new Array()
return new Promise(async (resolve, reject) => {
// Count the number processed
var processed = 0
if(metrics.length == 0) {
resolve(metricsToReturn)
}
await metrics.forEach(async (metric) => {
// Try to connect to the metric server with the key in query params named "privatekey"
// If the connection is successful, we add the metric to the list of metrics to return
const url = `http://${metric.address}:${metric.port}/metrics?privatekey=${metric.key}`
const fet = await fetch(url, {
method: "GET",
headers: {
"Accept": "application/json",
},
credentials: "include"
}).then(res => res.json())
.then(res => {
if(res) {
metric.data = res
metricsToReturn.push(metric)
processed++
} else {
metric.data = "ERROR"
metricsToReturn.push(metric)
}
if(processed == metrics.length) {
resolve(metricsToReturn)
}
}).catch((err) => {
metric.data = "ERROR"
metricsToReturn.push(metric)
processed++
if(processed == metrics.length) {
resolve(metricsToReturn)
}
})
})
})
}
module.exports.addMetric = function(settings) {
const metrics = this.getDataMetrics()
const metric = {
id: makeid(8),
name: settings.name,
address: settings.address,
port: settings.port,
key: settings.key,
}
metrics.push(metric)
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify(metrics, null, 2))
return "OK"
}
module.exports.deleteMetric = function(id) {
const metrics = this.getDataMetrics()
metrics.forEach((metric) => {
if(metric.id == id) {
metrics.splice(metrics.indexOf(metric), 1)
}
})
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify(metrics, null, 2))
return "OK"
}
function makeid(length) {
var result = [];
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
var charactersLength = characters.length;
for ( var i = 0; i < length; i++ ) {
result.push(characters.charAt(Math.floor(Math.random() *
charactersLength)));
}
return result.join('');
}

View File

@ -1,138 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const clog = new LogType("Pïpeline")
const config = require("./config")
const tokenkey = config.getFile().JENKINS_TOKEN
module.exports.getAllPipelines = function() {
return new Promise((resolve, reject) => {
fetch(`https://jenkins.raphix.fr/api/json`, {
method: "GET",
headers: {
"Accept": "application/json",
"Authorization": `Basic ${tokenkey}`
},
credentials: "include"
})
.then(res => res.json())
.then(async list => {
const pipelinesJobs = new Array()
for(const job of list.jobs) {
await fetch(`${job.url}/api/json`, {
method: "GET",
headers: {
"Accept": "application/json",
"Authorization": `Basic ${tokenkey}`
},
credentials: "include"
})
.then(res => res.json())
.then(async res => {
if(res._class == "org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject") {
await getJobMain(res).then(resJ => {
res.jobs[0] = resJ
pipelinesJobs.push(res)
})
} else {
pipelinesJobs.push(res)
}
})
}
list.jobs = pipelinesJobs
resolve(list)
})
.catch(err => {
resolve("UNAVAILABLE")
})
})
}
module.exports.startPipeline = function(pipeline) {
// If it's a freestyle job, build with params
if(pipeline.type == "org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject") {
return new Promise((resolve, reject) => {
fetch(`${pipeline.url}/job/${pipeline.jobname}/build?delay=0sec`, {
method: "POST",
headers: {
"Authorization": `Basic ${tokenkey}`
},
credentials: "include"
})
.then(res => {
resolve("OK")
})
})
} else {
return new Promise((resolve, reject) => {
const parameters = pipeline.fields
const formatedParams = new URLSearchParams()
for(const param of parameters) {
formatedParams.append(param.name, param.value)
}
fetch(`${pipeline.url}/buildWithParameters?delay=0sec`, {
method: "POST",
headers: {
"Authorization": `Basic ${tokenkey}`,
"Content-Type": "application/x-www-form-urlencoded"
},
credentials: "include",
body: formatedParams
})
.then(res => {
resolve("OK")
})
})
}
}
function getJobMain(res) {
return new Promise(async (resolve, reject) => {
await fetch(`${res.jobs[0].url}/api/json`, {
method: "GET",
headers: {
'Accept': 'application/json',
'Authorization': `Basic ${tokenkey}`
},
credentials: 'include'
}).then(res => res.json())
.then(res => {
resolve(res)
})
})
}

View File

@ -1,74 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const clog = new LogType("Serveur Metrics")
const osutils = require("os-utils")
const os = require("os")
const { statfs } = require("fs")
const config = require("./config")
module.exports.getMetrics = async function(server) {
return new Promise((resolve, reject) => {
if(server == "Alpha") {
var resp = "NULL"
const space = statfs("/", (err, stats) => {
if (err) {
throw err
}
osutils.cpuUsage(function(cpuUsage) {
resp = {
cpu: Math.round(cpuUsage * 1000),
usedram: osutils.totalmem() - osutils.freemem(),
totalram: osutils.totalmem(),
usedisk: stats.blocks - stats.bfree,
totaldisk: stats.blocks,
name: server
}
resolve(resp)
})
})
} else if(server == "Omega") {
const key = config.getFile().OMEGA_KEY;
fetch("http://omega.raphix.fr:4000/metrics?key="+key, {
method: "GET",
headers: {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
}
})
.then(response => response.json())
.then(raw => {
raw.name = server;
resolve(raw);
})
.catch(error => {
reject(error);
});
}
})
}

View File

@ -1,296 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables.js")
const auth = require("./auth.js")
const users = require("./users.js")
const files = require("./files.js")
const config = require("./config.js")
const links = require("./links.js")
const service = require("./services.js")
const pipeline = require("./pipelines.js")
const plog = new LogType("Web")
const cook = require("cookie")
const http = require("http")
const servermetrics = require("./server-metrics.js")
const metrics = require("./metrics.js")
const pm2 = require('pm2');
/**
* NOTE INTERNE
*
* Changer les pictures de users autre part
*/
/**
*
* @param {http.Server} server
*/
module.exports.serverIO = function(server) {
const io = require('socket.io')(server, {
maxHttpBufferSize: 1e8,
pingTimeout: 60000
})
io.on("connection", (socket) => {
let token = cook.parse(socket.handshake.headers.cookie).token
var user = auth.getUserByToken(token)
if(user) {
plog.log("Connexion au panel par '" + user.username + "' avec le socket : " + socket.id)
user.setLastLogin(new Date())
/**
* GET REQUEST
*/
// Get Users
GetRequest("USERINFO", () => {
user = auth.getUserByToken(token)
GetAnswer("USERINFO", {username: user.username, display_name: user.display_name ,picture: user.picture, permission: user.permission})
})
/**
* POST REQUEST
*/
PostRequest("US_EDIT_PERSONNAL", async (settings) => {
user = auth.getUserByToken(token)
PostAnswer("US_EDIT_PERSONNAL", await users.editMySelf(settings, user))
})
if(user.checkPermission("FILES_EXPLORER")) {
PostRequest("FX_GET", (root) => {
PostAnswer("FX_GET", files.getFiles(root))
})
PostRequest("FX_NEW_FOLDER", (root) => {
PostAnswer("FX_NEW_FOLDER", files.createFolder(root))
})
PostRequest("FX_DELETE", (root) => {
PostAnswer("FX_DELETE", files.deleteFile(root))
} )
PostRequest("FX_RENAME", (settings) => {
PostAnswer("FX_RENAME", files.renameFile(settings))
})
PostRequest("FX_SHARE", (settings) => {
PostAnswer("FX_SHARE", files.shareFile(settings))
})
PostRequest("FX_GETFILE", (root) => {
PostAnswer("FX_GETFILE", files.getFile(root))
})
PostRequest("FX_SAVEFILE", (settings) => {
PostAnswer("FX_SAVEFILE", files.saveFile(settings))
})
PostRequest("FX_NEW_FILE", (settings) => {
PostAnswer("FX_NEW_FILE", files.newFile(settings))
})
PostRequest("FX_UPLOAD", (settings) => {
PostAnswer("FX_UPLOAD", files.uploadFile(settings))
})
PostRequest("FX_PASTE", (settings) => {
PostAnswer("FX_PASTE", files.pasteFile(settings))
})
}
if(user.checkPermission("SERVICES")) {
PostRequest("SV_GET_SERVICE_STATUS", async (sv) => {
PostAnswer("SV_GET_SERVICE_STATUS", {answer: await service.getServiceStatus(sv), name: sv})
})
PostRequest("SV_START_SERVICE", async (sv) => {
PostAnswer("SV_START_SERVICE", {answer: await service.startService(sv), name: sv})
})
PostRequest("SV_STOP_SERVICE", async (sv) => {
PostAnswer("SV_STOP_SERVICE", {answer: await service.stopService(sv), name: sv})
})
PostRequest("SV_RESTART_SERVICE", async (sv) => {
PostAnswer("SV_RESTART_SERVICE", {answer: await service.restartService(sv), name: sv})
})
}
if(user.checkPermission("LINKS")) {
PostRequest("LINKS_GET_ALL", () => {
PostAnswer("LINKS_GET_ALL", {answer: "OK", links: links.getLinks()})
})
PostRequest("LINKS_ADD", (settings) => {
PostAnswer("LINKS_ADD", {answer: links.addLink(settings)})
})
PostRequest("LINKS_DELETE", (id) => {
PostAnswer("LINKS_DELETE", links.removeLink(id))
})
PostRequest("LINKS_EDIT", (settings) => {
PostAnswer("LINKS_EDIT", links.updateLink(settings.id, settings))
})
}
if(user.checkPermission("SERVERS")) {
PostRequest("SERVER_GET_METRICS_Alpha", async (settings) => {
PostAnswer("SERVER_GET_METRICS_Alpha", {answer: "OK", metrics: await servermetrics.getMetrics(settings), name: settings});
});
PostRequest("SERVER_GET_METRICS_Omega", async (settings) => {
PostAnswer("SERVER_GET_METRICS_Omega", {answer: "OK", metrics: await servermetrics.getMetrics(settings), name: settings});
});
}
if(user.checkPermission("PIPELINES")) {
GetRequest("PL_GET_ALL", async () => {
GetAnswer("PL_GET_ALL", await pipeline.getAllPipelines())
})
PostRequest("PL_START", async (settings) => {
PostAnswer("PL_START", await pipeline.startPipeline(settings))
})
}
if(user.checkPermission("USERS")) {
GetRequest("US_ALL", async () => {
GetAnswer("US_ALL", await users.getAllUsers())
})
PostRequest("US_ADD", async (settings) => {
PostAnswer("US_ADD", await users.addUser(settings))
})
PostRequest("US_DELETE", async (settings) => {
PostAnswer("US_DELETE", await users.deleteUser(settings))
})
PostRequest("US_EDIT", async (settings) => {
PostAnswer("US_EDIT", await users.editUser(settings))
})
PostRequest("US_CLEAR_TOKENS", async (settings) => {
PostAnswer("US_CLEAR_TOKENS", await users.clearTokens(settings))
})
}
if(user.checkPermission("SETTINGS")) {
PostRequest("SETTINGS_SAVE", async (settings) => {
PostAnswer("SETTINGS_SAVE", await config.saveSettings(settings))
})
PostRequest("SERVER_RESTART", async () => {
pm2.restart('Neutral')
})
PostRequest("SERVER_STOP", async () => {
pm2.stop('Neutral')
})
GetRequest("SERVER_GET_LOGS", async () => {
GetAnswer("SERVER_GET_LOGS", await fs.readdirSync(__glob.LOGS))
})
PostRequest("SERVER_READ_LOG", async (logs) => {
PostAnswer("SERVER_READ_LOG", await fs.readFileSync(__glob.LOGS + path.sep + logs).toString())
})
GetRequest("SETTINGS_GET", async () => {
GetAnswer("SETTINGS_GET", await config.getSettings())
})
}
if(user.checkPermission("METRICS")) {
GetRequest("MT_ALL", async () => {
GetAnswer("MT_ALL", await metrics.getMetrics())
})
PostRequest("MT_ADD", async (settings) => {
PostAnswer("MT_ADD", await metrics.addMetric(settings))
})
PostRequest("MT_DELETE", async (settings) => {
PostAnswer("MT_DELETE", await metrics.deleteMetric(settings))
})
}
socket.on("disconnect", (reason) => {
plog.log("Déconnexion du panel par '" + user.username + "' avec le socket : " + socket.id)
})
socket.on("connect_error", (err) => {
console.log(err)
console.log(err.message); // prints the message associated with the error
});
function GetRequest(GQname, GQcallback) {
socket.on("GET/" + GQname, () => {
plog.log(user.username + " - Socket : " + socket.id + " - GET/" + GQname + " - [RECIEVED]")
GQcallback()
})
}
function GetAnswer(GRname, GRvalue) {
plog.log(user.username + " - Socket : " + socket.id + " - GET/" + GRname + " - [ANSWERED]")
socket.emit("ANSWER/GET/" + GRname, GRvalue)
}
function PostRequest(GQname, GQcallback) {
socket.on("POST/" + GQname, (value) => {
plog.log(user.username + " - Socket : " + socket.id + " - POST/" + GQname + " - [RECIEVED]")
GQcallback(value)
})
}
function PostAnswer(GRname, GRvalue) {
plog.log(user.username + " - Socket : " + socket.id + " - POST/" + GRname + " - [ANSWERED]")
socket.emit("ANSWER/POST/" + GRname, GRvalue)
}
} else {
socket.disconnect()
plog.warn("Connexion directe vers le panel avec un token inexistant : " + this.token)
}
})
}

View File

@ -1,137 +0,0 @@
const { LogType } = require("loguix")
const fs = require("fs")
const path = require("path")
const { __glob } = require("./global-variables")
const clog = new LogType("Services")
const http = require('http');
const https = require('https');
module.exports.getServiceStatus = function(service) {
const protocol = service.startsWith('https') ? https : http;
const url = new URL(service);
const options = {
method: 'HEAD',
host: url.hostname,
port: url.port,
path: url.pathname,
};
return new Promise((resolve, reject) => {
const req = protocol.request(options, (res) => {
if(res.statusCode !== 502) {
resolve("ONLINE");
} else {
resolve("OFFLINE");
}
});
req.on('error', (err) => {
resolve("OFFLINE");
});
req.end();
});
}
module.exports.stopService = function(service) {
return new Promise((resolve, reject) => {
const child_process = require('child_process');
if(service == `https://subsonics.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 stop "Subsonics"'`)
resolve("OK")
} else if(service == `https://git.raphix.fr` ) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl stop gitea`)
resolve("OK")
} else if(service == `https://jenkins.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl stop jenkins `)
resolve("OK")
} else if(service == `https://raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 stop "Website - Raphix"'`)
resolve("OK")
} else if(service == `https://cv.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 stop "CV - Raphael"'`)
resolve("OK")
} else if(service == `http://omega.raphix.fr:2333`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl stop lavalink `)
resolve("OK")
} else {
resolve(false)
}
});
}
module.exports.startService = function(service) {
return new Promise((resolve, reject) => {
const child_process = require('child_process');
if(service == `https://subsonics.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 start /home/gitlab-ci/subsonic.config.js'`)
resolve("OK")
} else if(service == `https://git.raphix.fr` ) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl start gitea`)
resolve("OK")
} else if(service == `https://jenkins.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl start jenkins `)
resolve("OK")
} else if(service == `https://raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 start /home/gitlab-ci/website.config.js'`)
resolve("OK")
} else if(service == `https://cv.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 start /home/gitlab-ci/cv.config.js'`)
resolve("OK")
} else if(service == `http://omega.raphix.fr:2333`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl start lavalink `)
resolve("OK")
} else {
resolve(false)
}
});
}
module.exports.restartService = function(service) {
return new Promise((resolve, reject) => {
const child_process = require('child_process');
if(service == `https://subsonics.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 restart "Subsonics"'`)
resolve("OK")
} else if(service == `https://git.raphix.fr` ) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl restart gitea`)
resolve("OK")
} else if(service == `https://jenkins.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl restart jenkins `)
resolve("OK")
} else if(service == `https://raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 restart "Website - Raphix"'`)
resolve("OK")
} else if(service == `https://cv.raphix.fr`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@alpha.raphix.fr sudo -S -u gitlab-ci 'pm2 restart "CV - Raphael"'`)
resolve("OK")
} else if(service == `http://omega.raphix.fr:2333`) {
let req = child_process.exec(`ssh -o StrictHostKeyChecking=no raphix@omega.raphix.fr sudo -S systemctl restart lavalink `)
resolve("OK")
} else {
resolve(false)
}
});
}

View File

@ -50,10 +50,8 @@ module.exports.fetchUsers = function () {
username: userFetched.username,
password: userFetched.password,
display_name: userFetched.display_name,
permission: userFetched.permission,
tokens: userFetched.tokens,
lastLogin: userFetched.lastLogin,
picture: userFetched.picture
})
@ -63,21 +61,10 @@ module.exports.fetchUsers = function () {
if(usersList.size == 0) {
const adminUser = new this.User({
"username": "admin",
"password": "neutral",
"password": "inventory",
"display_name": "Administrateur",
"permission": [
"FILES_EXPLORER",
"SERVICES",
"SERVERS",
"PIPELINES",
"METRICS",
"USERS",
"LINKS",
"SETTINGS"
],
"tokens": [],
"lastLogin": "DEFAULT ACCOUNT",
"picture": "/images/default.jpg"
})
@ -94,16 +81,14 @@ module.exports.fetchUsers = function () {
/**
* User Class is used to access to default user's properties and methods
* @param {object} properties User properties with : username, password, display_name, permission...
* @param {object} properties User properties with : username, password, display_name
*/
module.exports.User = class {
username = null
password = null;
display_name = null
permission = []
tokens = []
lastLogin = new Date()
picture = "/images/default.jpg"
constructor(properties) {
@ -112,10 +97,8 @@ module.exports.User = class {
this.username = properties.username
this.password = keygen.encrypt(properties.password)
this.display_name = properties.display_name
this.permission = properties.permission
this.tokens = properties.tokens
this.lastLogin = properties.lastLogin
this.picture = properties.picture
const userFile = getFile()
@ -125,7 +108,6 @@ module.exports.User = class {
this.username = userFetched.username
this.password = userFetched.password
this.display_name = userFetched.display_name
this.permission = userFetched.permission
this.tokens = userFetched.tokens
this.lastLogin = userFetched.lastLogin
}
@ -150,22 +132,14 @@ module.exports.User = class {
ulog.warn("'" + this.username + "' is without display name !")
this.display_name = this.username
}
if(this.permission == null) {
ulog.warn("'" + this.username + "' has no longer permission !")
}
if(this.tokens == null) {
this.tokens = []
}
if(this.permission == null) {
this.permission = []
}
if(this.lastLogin == null) {
this.lastLogin = new Date()
}
if(this.picture == null) {
this.picture = "/images/default.jpg"
}
}
@ -211,47 +185,7 @@ module.exports.User = class {
usersList.delete(this.username)
}
checkPermission(name) {
this.#sync()
if(this.permission.includes(name)) {
return true
} else {
return false
}
}
addPermission(name) {
this.#sync()
for(var perms of this.permission) {
if(name == perms) {
ulog.warn("'" + this.username + "' a déjà la permission : " + name)
return false
}
}
this.permission.push(name)
this.register()
}
removePermission(name) {
this.#sync()
var havePermission = false
for(var perms of this.permission) {
if(name == perms) {
havePermission = true
}
}
if(havePermission) {
this.permission.splice(this.permission.indexOf(name), 1)
this.register()
} else {
ulog.warn("'" + this.username + "' n'a pas la permission : " + name)
return false
}
}
setPassword(newPassword) {
this.#sync()
@ -293,14 +227,6 @@ module.exports.User = class {
}
setPicture(text) {
this.#sync()
this.picture = text
this.register()
ulog.log("La photo de l'utilisateur a été modifié : " + this.username)
}
setDisplayName(text) {
this.#sync()
this.display_name = text
@ -325,24 +251,6 @@ module.exports.User = class {
this.register()
}
setPicture(file) {
this.#sync()
var pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
if(!fs.existsSync(__glob.USERS_IMAGES)) {
fs.mkdirSync(__glob.USERS_IMAGES)
}
fs.writeFileSync(pictureDir, file)
this.picture = pictureDir.replace(__glob.USERS_IMAGES + path.sep, "/users/")
this.register()
}
setPermissions(permissions) {
this.#sync()
this.permission = permissions
this.register()
}
clearTokens() {
this.#sync()
this.tokens = []
@ -357,7 +265,6 @@ module.exports.User = class {
this.username = userFetched.username
this.password = userFetched.password
this.display_name = userFetched.display_name
this.permission = userFetched.permission
this.tokens = userFetched.tokens
this.lastLogin = userFetched.lastLogin
}
@ -382,23 +289,10 @@ module.exports.addUser = function(settings) {
return "ALREADY_EXIST"
} else {
ulog.step.init("add_user", "Ajout d'un utilisateur dans la base de donnée : " + settings.username)
var pictureDir = null
if(settings.picture == null) {
pictureDir = "/images/default.jpg"
} else {
pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
fs.writeFileSync(pictureDir, settings.picture)
}
const user = new this.User({
username: settings.username,
display_name: settings.display_name,
permission: settings.permissions,
picture: pictureDir.replace(__glob.USERS_IMAGES + path.sep, "/images/users/")
display_name: settings.display_name
})
@ -451,13 +345,8 @@ module.exports.editUser = function(settings) {
user.setPassword(settings.password)
}
if(settings.picture) {
user.setPicture(settings.picture)
}
if(settings.permissions) {
user.setPermissions(settings.permissions)
}
ulog.step.end("edit_user")
return "OK"
} else {
@ -497,10 +386,7 @@ module.exports.editMySelf = function (settings, user) {
if(settings.password) {
user.setPassword(settings.password)
}
if(settings.picture) {
user.setPicture(settings.picture)
}
ulog.step.end("edit_user")
return "OK"
} else {

View File

@ -20,13 +20,12 @@ wlog.step.init("start_server", "Démarrage du serveur Express JS")
var app = require('../main');
var http = require('http');
var config = require("./config")
var serverIO = require("./servers")
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3001');
var port = normalizePort(process.env.PORT || '5005');
app.set('port', port);
/**
@ -34,7 +33,6 @@ app.set('port', port);
*/
var server = http.createServer(app);
serverIO.serverIO(server)
/**
* Listen on provided port, on all network interfaces.