Version 0.3.0 - Add of Services
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Neutral/pipeline/head This commit looks good
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Neutral/pipeline/head This commit looks good
				
			This commit is contained in:
		@@ -93,7 +93,7 @@ class ViewWindow {
 | 
			
		||||
                    <div id='${properties.title}_header' class='view-window-header'>
 | 
			
		||||
                    <span style='width: 40px'></span>
 | 
			
		||||
                    <p>${properties.title}</p>
 | 
			
		||||
                    <button id='${properties.title}_close' class='btn min red'><span><i class='fa fa-xmark'></i></span></button>
 | 
			
		||||
                    <span id='${properties.title}_close' class='view-close'><i class='fa fa-xmark'></i></span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div id='${properties.title}_content' class='view-window-content'>
 | 
			
		||||
                    </div>
 | 
			
		||||
@@ -182,10 +182,10 @@ class ViewWindow {
 | 
			
		||||
 | 
			
		||||
    createPopup(properties) {
 | 
			
		||||
 | 
			
		||||
        this.ViewPopupHTML = `<div id='${properties.title}_popup' class='view-popup'>
 | 
			
		||||
        this.ViewPopupHTML = `<div id="${properties.title}_popup" class='view-popup'>
 | 
			
		||||
            <div class='view-popup-bar'>
 | 
			
		||||
                <p>${properties.title}</p>
 | 
			
		||||
                <span id='${properties.title}_popupClose' class='btn-cover'><i  class='fa fa-xmark'></i></span>
 | 
			
		||||
                <span id="${properties.title}_popupClose" class='btn-cover'><i  class='fa fa-xmark'></i></span>
 | 
			
		||||
            </div>
 | 
			
		||||
            ${properties.content}
 | 
			
		||||
        </div>`
 | 
			
		||||
@@ -243,17 +243,13 @@ class ViewWindow {
 | 
			
		||||
function createView(viewType) {
 | 
			
		||||
    if(viewType == 'files_explorer') {
 | 
			
		||||
 | 
			
		||||
        generateFileExplorer()
 | 
			
		||||
        generateFileExplorerView()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    if(viewType == 'service') {
 | 
			
		||||
 | 
			
		||||
        const View = new ViewWindow({
 | 
			
		||||
            title: "Gestionnaire des services",
 | 
			
		||||
            width: "1000px",
 | 
			
		||||
            height: "600px"
 | 
			
		||||
        })
 | 
			
		||||
       generateServiceView()
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ document.addEventListener("contextmenu", (e) => {
 | 
			
		||||
    e.preventDefault()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
function generateFileExplorer() {
 | 
			
		||||
function generateFileExplorerView() {
 | 
			
		||||
 | 
			
		||||
    const View = new ViewWindow({
 | 
			
		||||
        title: `<i class="fa fa-folder"></i> Gestionnaire de fichiers`,
 | 
			
		||||
@@ -68,7 +68,7 @@ function generateFileExplorer() {
 | 
			
		||||
    newFolder.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
        View.createPopup({
 | 
			
		||||
            title: `<i class="fa fa-folder"></i> Nouveau dossier`,
 | 
			
		||||
            title: `<i class='fa fa-folder'></i> Nouveau dossier`,
 | 
			
		||||
            content: `
 | 
			
		||||
                <input type='text' class='field' id='${View.getViewTitle()}_foldername'>
 | 
			
		||||
                <div id='${View.getViewTitle()}_folderInfo'></div>
 | 
			
		||||
@@ -126,7 +126,7 @@ function generateFileExplorer() {
 | 
			
		||||
    newFile.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
        View.createPopup({
 | 
			
		||||
            title: `<i class="fa-solid fa-file-arrow-up"></i> Nouveau fichier`,
 | 
			
		||||
            title: `<i class='fa-solid fa-file-arrow-up'></i> Nouveau fichier`,
 | 
			
		||||
            content: `
 | 
			
		||||
                <input type='text' class='field' id='${View.getViewTitle()}_filename'>
 | 
			
		||||
                <div id='${View.getViewTitle()}_fileInfo'></div>
 | 
			
		||||
@@ -181,7 +181,7 @@ function generateFileExplorer() {
 | 
			
		||||
            fileInfo.clear()
 | 
			
		||||
            View.destroyPopup(`<i class="fa-solid fa-file-arrow-up"></i> Nouveau fichier`)
 | 
			
		||||
            View.createPopup({
 | 
			
		||||
                title: `<i class="fa-solid fa-file-arrow-up"></i> Upload`,
 | 
			
		||||
                title: `<i class='fa-solid fa-file-arrow-up'></i> Upload`,
 | 
			
		||||
                content: `
 | 
			
		||||
                    <input type='file' class='field' id='${View.getViewTitle()}_fileuploadInput'>
 | 
			
		||||
                    <div id='${View.getViewTitle()}_fileuploadInfo'></div>
 | 
			
		||||
@@ -374,7 +374,7 @@ function generateFileExplorer() {
 | 
			
		||||
                                    loadFiles(result)
 | 
			
		||||
                                }) 
 | 
			
		||||
                                View.createPopup({
 | 
			
		||||
                                    title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                    title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                    content: `<p class='yellow'>Vous n'avez pas les permissions pour supprimer ce fichier.</p>`
 | 
			
		||||
                                })
 | 
			
		||||
                            } else {
 | 
			
		||||
@@ -383,7 +383,7 @@ function generateFileExplorer() {
 | 
			
		||||
                                    loadFiles(result)
 | 
			
		||||
                                }) 
 | 
			
		||||
                                View.createPopup({
 | 
			
		||||
                                    title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                    title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                    content: `<p class='yellow'>Une erreur est survenue.</p>`
 | 
			
		||||
                                })
 | 
			
		||||
                             
 | 
			
		||||
@@ -394,7 +394,7 @@ function generateFileExplorer() {
 | 
			
		||||
 | 
			
		||||
                        dropMenu.hide()
 | 
			
		||||
                        View.createPopup({
 | 
			
		||||
                            title: `<i class="fa fa-file-signature"></i> Renommer`,
 | 
			
		||||
                            title: `<i class='fa fa-file-signature'></i> Renommer`,
 | 
			
		||||
                            content: `
 | 
			
		||||
                                <input type='text' class='field' id='${View.getViewTitle()}_rename'>
 | 
			
		||||
                                <div id='${View.getViewTitle()}_renameInfo'></div>
 | 
			
		||||
@@ -416,7 +416,7 @@ function generateFileExplorer() {
 | 
			
		||||
                                return
 | 
			
		||||
                            }
 | 
			
		||||
            
 | 
			
		||||
                            const regex = new RegExp(/^[a-zA-Z0-9-_]+$/)
 | 
			
		||||
                            const regex = new RegExp(/^[a-zA-Z0-9-_.]+$/)
 | 
			
		||||
            
 | 
			
		||||
                            if(!regex.test(rename.value) | rename.value.replace(/\s/g, '').length < 1) {
 | 
			
		||||
                                renameInfo.err("Le nom du fichier / dossier est invalide.")
 | 
			
		||||
@@ -451,12 +451,12 @@ function generateFileExplorer() {
 | 
			
		||||
                        reqFiles.then((result) => {
 | 
			
		||||
                            if(result == "NOT_PERMITTED") {
 | 
			
		||||
                                View.createPopup({
 | 
			
		||||
                                    title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                    title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                    content: `<p class='yellow'>Vous n'avez pas les permissions pour partager ce fichier.</p>`
 | 
			
		||||
                                })
 | 
			
		||||
                            } else {
 | 
			
		||||
                                View.createPopup({
 | 
			
		||||
                                    title: `<i class="fa fa-share"></i> Partager`,
 | 
			
		||||
                                    title: `<i class='fa fa-share'></i> Partager`,
 | 
			
		||||
                                    content: `
 | 
			
		||||
                                        <input style='width: 300px' type='text' class='field' id='${View.getViewTitle()}_sharelink'>
 | 
			
		||||
                                        <div id='${View.getViewTitle()}_shareInfo'></div>
 | 
			
		||||
@@ -495,7 +495,7 @@ function generateFileExplorer() {
 | 
			
		||||
                        reqFiles.then((result) => {
 | 
			
		||||
                            if(result == "NOT_PERMITTED") {
 | 
			
		||||
                                View.createPopup({
 | 
			
		||||
                                    title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                    title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                    content: `<p class='yellow'>Vous n'avez pas les permissions pour télécharger ce fichier.</p>`
 | 
			
		||||
                                })
 | 
			
		||||
                            } else {
 | 
			
		||||
@@ -527,7 +527,7 @@ function generateFileExplorer() {
 | 
			
		||||
                    reqFiles.then((result) => {
 | 
			
		||||
                        if(result == "NOT_PERMITTED") {
 | 
			
		||||
                            View.createPopup({
 | 
			
		||||
                                title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                content: `<p class='yellow'>Vous n'avez pas les permissions pour éditer ce fichier.</p>`
 | 
			
		||||
                            })
 | 
			
		||||
                        } else {
 | 
			
		||||
@@ -564,13 +564,13 @@ function generateFileExplorer() {
 | 
			
		||||
                                            loadFiles(result)
 | 
			
		||||
                                        })
 | 
			
		||||
                                    } else if(result == "NOT_PERMITTED") {
 | 
			
		||||
                                        View.createPopup({
 | 
			
		||||
                                            title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                        editor.createPopup({
 | 
			
		||||
                                            title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                            content: `<p class='yellow'>Vous n'avez pas les permissions pour éditer ce fichier.</p>`
 | 
			
		||||
                                        })
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        View.createPopup({
 | 
			
		||||
                                            title: `<i class="fa fa-warning"></i> Erreur`,
 | 
			
		||||
                                        editor.createPopup({
 | 
			
		||||
                                            title: `<i class='fa fa-warning'></i> Erreur`,
 | 
			
		||||
                                            content: `<p class='yellow'>Une erreur est survenue.</p>`
 | 
			
		||||
                                        })
 | 
			
		||||
                                    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										240
									
								
								public/javascripts/service.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								public/javascripts/service.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,240 @@
 | 
			
		||||
async function generateServiceView() {
 | 
			
		||||
 | 
			
		||||
    class Service {
 | 
			
		||||
        name = null
 | 
			
		||||
        description = null
 | 
			
		||||
        icon = null
 | 
			
		||||
        url = null
 | 
			
		||||
        canAccess = false
 | 
			
		||||
        isOnline  = false
 | 
			
		||||
        constructor(properties) {
 | 
			
		||||
            this.name = properties.name
 | 
			
		||||
            this.description = properties.description
 | 
			
		||||
            this.icon = properties.icon
 | 
			
		||||
            this.url = properties.url
 | 
			
		||||
            this.canAccess = properties.canAccess
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        generateHTML() {
 | 
			
		||||
            return `
 | 
			
		||||
            <div class="sv">
 | 
			
		||||
                <div class='sv-info'>
 | 
			
		||||
                    <img class="sv-icon" src="${this.icon}" alt="${this.name}">
 | 
			
		||||
                    <div>
 | 
			
		||||
                        <h1>${this.name}</h1>
 | 
			
		||||
                        <p>${this.description}</p>
 | 
			
		||||
                        <p>Etat : <span id='${this.name}_status' class="sv-status"></span></p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                
 | 
			
		||||
                <div class="sv-actions">
 | 
			
		||||
                    ${this.canAccess ? `<a href="${this.url}" target="_blank"><button class="btn green"><span>Accéder au service</span></button></a>` : ""}
 | 
			
		||||
                    <button id='${this.name}_svpower' class='btn yellow'n><span>Options d'alimentation<span></button>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            `
 | 
			
		||||
    
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        loadScript() {
 | 
			
		||||
    
 | 
			
		||||
            return new Promise((resolve, reject) => {
 | 
			
		||||
                const statusSpan = getID(`${this.name}_status`)
 | 
			
		||||
                const request = post(`SV_GET_SERVICE_STATUS`, this.url) 
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
                request.then((answer) => {
 | 
			
		||||
                    if(answer.name == this.url) {
 | 
			
		||||
                        if(answer.answer == "ONLINE") {
 | 
			
		||||
                            statusSpan.innerHTML = '<span style="font-size: 12px;"><i class="fa-solid fa-circle green"></i> En ligne</span>'
 | 
			
		||||
                            this.isOnline  = true
 | 
			
		||||
                        } else {
 | 
			
		||||
                            statusSpan.innerHTML = '<span style="font-size: 12px;"><i class="fa-solid fa-circle red"></i> Hors ligne</span>'
 | 
			
		||||
                  
 | 
			
		||||
                        }
 | 
			
		||||
                        resolve("LOADED")
 | 
			
		||||
                    }
 | 
			
		||||
                
 | 
			
		||||
                })
 | 
			
		||||
    
 | 
			
		||||
                const powerButton = getID(`${this.name}_svpower`)
 | 
			
		||||
    
 | 
			
		||||
                // Make a popup of View to select if you want to start, stop or restart the service by doing a request
 | 
			
		||||
    
 | 
			
		||||
                powerButton.addEventListener("click", () => {
 | 
			
		||||
                    View.createPopup({
 | 
			
		||||
                        title: `<i class='fa-solid fa-power-off'></i> Gestion de l'alimentation du service`,
 | 
			
		||||
                        content: `
 | 
			
		||||
                        
 | 
			
		||||
                        <p class='sv-power-select'>${this.name}</p>
 | 
			
		||||
                        <p id='sv-power-info'></p>
 | 
			
		||||
                        <div class="sv-power">
 | 
			
		||||
                            <button id="${this.name}_start" class="btn green"><span>Démarrer</span></button>
 | 
			
		||||
                            <button id="${this.name}_restart" class="btn yellow"><span>Redémarrer</span></button>
 | 
			
		||||
                            <button id="${this.name}_stop" class="btn red"><span> Arrêter</span></button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        `
 | 
			
		||||
                    })
 | 
			
		||||
    
 | 
			
		||||
                    const startButton = getID(`${this.name}_start`)
 | 
			
		||||
                    const stopButton = getID(`${this.name}_stop`)
 | 
			
		||||
                    const restartButton = getID(`${this.name}_restart`)
 | 
			
		||||
                    const info = new InfoPop("sv-power-info")
 | 
			
		||||
                    
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    if(this.isOnline) {
 | 
			
		||||
                        startButton.style.display = "none"
 | 
			
		||||
                        info.info("Verifiez que le service n'est pas utilisé par quelqu'un d'autre avant de le redémarrer ou de l'arrêter")
 | 
			
		||||
                    } else {
 | 
			
		||||
                        stopButton.style.display = "none"
 | 
			
		||||
                        restartButton.style.display = "none"
 | 
			
		||||
                        info.info("Si le service ne démarre pas, vérifiez l'intégrité du service")
 | 
			
		||||
                    }
 | 
			
		||||
    
 | 
			
		||||
                    startButton.addEventListener("click", () => {
 | 
			
		||||
                        const request = post(`SV_START_SERVICE`, this.url) 
 | 
			
		||||
                        
 | 
			
		||||
 | 
			
		||||
                        request.then((answer) => {
 | 
			
		||||
                            if(answer.answer == "OK") {
 | 
			
		||||
                                statusSpan.innerHTML = '<span style="font-size: 12px;"><i class="fa-solid fa-circle green"></i> En ligne</span>'
 | 
			
		||||
                                View.destroyPopup("`<i class='fa-solid fa-power-off'></i> Gestion de l'alimentation du service`")
 | 
			
		||||
                                this.isOnline  = true
 | 
			
		||||
                            } else {
 | 
			
		||||
                                info.err("Impossible de démarrer le service")
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                        })
 | 
			
		||||
    
 | 
			
		||||
                    })
 | 
			
		||||
 | 
			
		||||
                    stopButton.addEventListener("click", () => {
 | 
			
		||||
                        const request = post(`SV_STOP_SERVICE`, this.url) 
 | 
			
		||||
    
 | 
			
		||||
                        request.then((answer) => {
 | 
			
		||||
                            if(answer.answer == "OK") {
 | 
			
		||||
                                statusSpan.innerHTML = '<span style="font-size: 12px;"><i class="fa-solid fa-circle red"></i> Hors ligne</span>'
 | 
			
		||||
                                this.isOnline  = false
 | 
			
		||||
                                View.destroyPopup("`<i class='fa-solid fa-power-off'></i> Gestion de l'alimentation du service`")
 | 
			
		||||
                              
 | 
			
		||||
                            } else {
 | 
			
		||||
                                info.err("Impossible d'arrêter le service")
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                        
 | 
			
		||||
                        })
 | 
			
		||||
                    })
 | 
			
		||||
 | 
			
		||||
                    restartButton.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
                        console.log("RESTART")
 | 
			
		||||
 | 
			
		||||
                        const request = post(`SV_RESTART_SERVICE`, this.url) 
 | 
			
		||||
    
 | 
			
		||||
                        request.then((answer) => {
 | 
			
		||||
                            if(answer.answer == "OK") {
 | 
			
		||||
                                statusSpan.innerHTML = '<span style="font-size: 12px;"><i class="fa-solid fa-circle green"></i> En ligne</span>'
 | 
			
		||||
                                View.destroyPopup("`<i class='fa-solid fa-power-off'></i> Gestion de l'alimentation du service`")
 | 
			
		||||
                                this.isOnline  = true
 | 
			
		||||
                            } else {
 | 
			
		||||
                                info.err("Impossible de redémarrer le service")
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                            
 | 
			
		||||
                        })
 | 
			
		||||
                    })
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
            })
 | 
			
		||||
            
 | 
			
		||||
         })
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * CODE OF SERVICE.JS
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    const allServices = new Array()
 | 
			
		||||
 | 
			
		||||
    const View = new ViewWindow({
 | 
			
		||||
        title: '<i class="fa fa-layer-group"></i> Gestion des services',
 | 
			
		||||
        width: "700px",
 | 
			
		||||
        height: "600px"
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const subsonicsService = new Service({
 | 
			
		||||
        name: "Subsonics",
 | 
			
		||||
        description: "Bot de streaming musical sur Discord",
 | 
			
		||||
        icon: "/images/services/subsonics.png",
 | 
			
		||||
        url: "https://subsonics.raphix.fr" ,
 | 
			
		||||
        canAccess: true
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const giteaService = new Service({
 | 
			
		||||
        name: "Gitea",
 | 
			
		||||
        description: "Gestionnaire de dépôt Git",
 | 
			
		||||
        icon: "/images/services/gitea.svg",
 | 
			
		||||
        url: "https://git.raphix.fr" ,
 | 
			
		||||
        canAccess: true
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const jenkinsService = new Service({
 | 
			
		||||
        name: "Jenkins",
 | 
			
		||||
        description: "Gestionnaire de pipeline",
 | 
			
		||||
        icon: "/images/services/jenkins.svg",
 | 
			
		||||
        url: "https://jenkins.raphix.fr" ,
 | 
			
		||||
        canAccess: true
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const raphixwebsite = new Service({
 | 
			
		||||
        name: "Raphix.fr",
 | 
			
		||||
        description: "Site web de Raphix",
 | 
			
		||||
        icon: "/images/services/raphix.png",
 | 
			
		||||
        url: "https://raphix.fr",
 | 
			
		||||
        canAccess: true
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const cvraphix = new Service({
 | 
			
		||||
        name: "CV Raphix",
 | 
			
		||||
        description: "Curriculum Vitae de Raphix",
 | 
			
		||||
        icon: "/images/services/cv.png",
 | 
			
		||||
        url: "https://cv.raphix.fr",
 | 
			
		||||
        canAccess: true
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const lavalink = new Service({
 | 
			
		||||
        name: "Lavalink",
 | 
			
		||||
        description: "Serveur Lavalink pour Subsonics",
 | 
			
		||||
        icon: "/images/services/lavalink.svg",
 | 
			
		||||
        url: "http://omega.raphix.fr:2333",
 | 
			
		||||
        canAccess: false
 | 
			
		||||
    })
 | 
			
		||||
    
 | 
			
		||||
    allServices.push(subsonicsService.generateHTML())
 | 
			
		||||
    allServices.push(lavalink.generateHTML())
 | 
			
		||||
    allServices.push(giteaService.generateHTML())
 | 
			
		||||
    allServices.push(jenkinsService.generateHTML())
 | 
			
		||||
    allServices.push(raphixwebsite.generateHTML())
 | 
			
		||||
    allServices.push(cvraphix.generateHTML())
 | 
			
		||||
 | 
			
		||||
    View.setContent(`<div class='sv-list'>${allServices.join("")}</div>`)
 | 
			
		||||
 | 
			
		||||
    await subsonicsService.loadScript()
 | 
			
		||||
    await giteaService.loadScript()
 | 
			
		||||
    await jenkinsService.loadScript()
 | 
			
		||||
    await raphixwebsite.loadScript()
 | 
			
		||||
    await cvraphix.loadScript()
 | 
			
		||||
    await lavalink.loadScript()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user