Source: routes/admin/maintenance.js

const BackupManager = require('../../models/backupmanager');
const fs = require('fs');
const path = require('path');
const pm2 = require('pm2');

module.exports = {
    /**
     * render the Backup-Page
     */
    BackupPage:(req, res) => {

        var BM = new BackupManager();
        var fileList = [];
        BM.getListOfBackupfilesInFolder((filesArray) => {
            console.log('found files: ' + filesArray.length);
            filesArray.forEach(file => {
                fileList.push(path.basename(file));
            });
            res.render('admin/backupfiles.ejs', {
                title: 'ALARMiator | Backup',
                navarea: 'admin',
                avatarpath: req.session.avatar,
                name: req.session.name,
                organizationname: req.session.organization,
                session: req.session,
                filesList: fileList,
            });
        })
    },
    /**
     * create a backup of the coredatabse and the picture in public/assets/img as a zip-file under the backup-folder
     */
    createBackup: (req, res) => {

        var BM = new BackupManager();
        BM.Create((err) => {
            if(err === null){
                console.log('CORE | MODELS | BACKUP | create of backup-file started.');
            }
            else if(err === 'reloadPage')
            {
                console.log('CORE | MODELS | BACKUP | create of backup-file finished.');
                res.redirect('/admin/backup/files');
            }
            else{
                console.log('CORE | MODELS | BACKUP | error on create a backup-file!');
                console.log('CORE | MODELS | BACKUP | ' + err);
            }
        });
    },
    /**
     * create a backup of the coredatabse and the picture in public/assets/img as a zip-file under the backup-folder
     */
    restoreBackup: (req, res) => {

        var backupfile = req.params.backupfile;

        var BM = new BackupManager();
        BM.Restore(backupfile, (err) => {
            if(err === null)
            {
                console.log('CORE | MODELS | BACKUP | restore of backup-file started.');
            }
            else if(err === 'finished')
            {
                console.log('CORE | MODELS | BACKUP | restore of backup-file finished.');
                console.log('CORE | MODELS | BACKUP | reboot server.');
                res.redirect('/admin/system/reboot');
                
            }
            else
            {
                console.log('CORE | MODELS | BACKUP | error on restire a backup-file!');
                console.log('CORE | MODELS | BACKUP | ' + err);
            }
        });
    },
    /**
     * delete a backup-file
     */
    deleteBackup: (req, res) => {
        
        var backupfile = req.params.backupfile;

        var BM = new BackupManager();
        BM.Delete(backupfile, (err) => {
            if(err === null){
                res.redirect('/admin/backup/files');
            }
            else{
                console.log('CORE | MODELS | BACKUP | error on delete ' + backupfile + '!');
                console.log('CORE | MODELS | BACKUP | ' + err);
            }
        });

    },
    /**
     * download a backup-file
     */
    downloadBackup: (req, res) => {

        var backupfile = req.params.backupfile;

        var BM = new BackupManager();
        BM.GetBackupfilePath(backupfile, (fullbackupfilepath) => {
            if(fullbackupfilepath === null)
            {
                console.log('CORE | MODELS | BACKUP | error on download ' + backupfile + '!');
            }
            else
            {
                res.download(fullbackupfilepath); // Set disposition and send it.
            }
        });
    },

    /**
     * reboots the server
     */
    RebootSytem: (req, res)=>{

            setTimeout(function () {
                
                if(global.serverStartedByPM2){
                    console.log('CORE | restart server with pm2!');
                    pm2.connect(function(err) {
                        if(err)
                        {
                            console.log('CORE | error at connect to pm2!');
                            console.log('CORE | ' + err);        
                        }
                    });

                    pm2.restart(global.PM2_Name, (err, proc) => {
                        if(err)
                        {
                            console.log('CORE | error at restart with pm2!');
                            console.log('CORE | ' + err);        
                        }
                    });

                    pm2.disconnect();
                }
                else
                {
                    console.log('CORE | restart server with process.exit and detached child-process!')
                    process.on("exit", function () {
            
                        require("child_process").spawn(process.argv.shift(), process.argv, {
                            cwd: process.cwd(),
                            detached : true,
                            stdio: "inherit"
                        });
                    });
                    process.exit();
                }
            }, 1000);

        res.redirect('/auth/logoff');
    },

     /**
     * shutdown the server
     */
    ShutdownSytem: (req, res)=>{
        setTimeout(function () {
            if(global.serverStartedByPM2){
                console.log('CORE | restart server with pm2!');
                pm2.connect(function(err) {
                    if(err)
                    {
                        console.log('CORE | error at connect to pm2!');
                        console.log('CORE | ' + err);        
                    }
                });

                pm2.stop(global.PM2_Name, (err, proc) => {
                    if(err)
                    {
                        console.log('CORE | error at stop with pm2!');
                        console.log('CORE | ' + err);        
                    }
                });

                pm2.disconnect();
            }
            else
            {
                process.exit();
            }
        }, 1000);
        res.redirect('/auth/logoff');
    }
};