Skip to content
Snippets Groups Projects
Select Git revision
  • f29e211dcefcdbce4a6ec2dbc3b16546fa7fe0a3
  • master default protected
  • dev
  • appimage
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.53.2
  • 0.53.1
  • 0.53.0
  • 0.52.0
  • 0.51.1
  • 0.51.0
  • 0.50.5
  • 0.50.4
  • 0.50.3
  • 0.50.2
  • 0.50.1
  • 0.50.0
  • 0.33.0rc7
  • 0.33.0rc6
  • 0.33.0rc5
  • 0.33.0rc4
  • 0.33.0rc3
  • 0.33.0rc2
  • 0.33.0rc1
  • 0.32.10post1
41 results

gen_resources.py

Blame
  • index.js 4.12 KiB
    "use strict";
    
    const co = require('co');
    const bodyParser = require('body-parser');
    const http    = require('http');
    const express = require('express');
    const path    = require('path');
    const cors = require('cors');
    const fileUpload = require('express-fileupload');
    const webminController = require('./server/controller/webmin.js');
    
    // Inject 'webstart' command if no argument was given
    if (process.argv.length === 2) {
      process.argv.push('direct_webstart');
    }
    
    module.exports = {
      duniter: {
    
        cliOptions: [
    
          // Webmin options
          { value: '--webmhost <host>', desc: 'Local network interface to connect to (IP)' },
          { value: '--webmport <port>', desc: 'Local network port to connect', parser: parseInt }
        ],
    
        cli: [{
    
          name: 'webstart',
          desc: 'Starts Duniter as a daemon (background task).',
          logs: false,
          onConfiguredExecute: (server, conf, program, params) => co(function*() {
            yield server.checkConfig()
            const daemon = server.getDaemon('direct_webstart', 'webstart')
            yield startDaemon(program, daemon)
          })
        }, {
    
          name: 'webrestart',
          desc: 'Stops Duniter daemon and restart it with its web interface.',
          logs: false,
          onConfiguredExecute: (server, conf, program, params) => co(function*() {
            yield server.checkConfig()
            const daemon = server.getDaemon('direct_webstart', 'webrestart')
            yield stopDaemon(daemon)
            yield startDaemon(program, daemon)
          })
        }, {
          name: 'direct_webstart',
          desc: 'Do a webstart',
          onDatabaseExecute: (server, conf, program, params, startServices, stopServices) => co(function*(){
    
            try {
    
              /****************************************
               * SPECIALISATION
               ***************************************/
    
              const app = express();
              const HOTE = program.webmhost || 'localhost';
              const PORT = program.webmport || 9220;
    
              /**
               * Sur appel de l'URL /abc
               */
              app.use(express.static(path.join(__dirname, '..', 'duniter-ui', 'public')));
    
              app.use(cors());
    
              // File upload for backup API
              app.use(fileUpload());
    
              app.use(bodyParser.urlencoded({
                extended: true
              }));
              app.use(bodyParser.json());
    
              const wbmin = webminController(server, startServices, stopServices);
              const httpServer = http.createServer(app);
              httpServer.listen(PORT, HOTE);
              server.logger.info("Web administration accessible at following address: http://%s:%s", HOTE, PORT);
    
              require('./server/lib/routes').webmin(wbmin, app);
              require('./server/lib/routes').webminWS(wbmin)(httpServer);
    
              yield wbmin.startAllServices();
    
              // Never ending promise
              return new Promise((resolve) => {});
    
              /****************************************/
    
            } catch (e) {
              console.error(e);
              process.exit(1);
            }
          })
        }]
      }
    };
    
    function startDaemon(program, daemon) {
      return co(function*() {
    
        const PORT = program.webmport || 9220
    
        const isPortAlreadyTaken = yield new Promise((resolve) => {
          isPortTaken(PORT, (err, taken) => err ? reject(err) : resolve(taken))
        })
    
        if (isPortAlreadyTaken) {
          console.error('Port ' + PORT + ' already used.')
          process.exit(3)
        }
    
        return new Promise((resolve, reject) => daemon.start((err) => {
          if (err) return reject(err)
          resolve()
        }))
      })
    }
    
    /**
     * Checks if a port is already taken by another app.
     *
     * Source: https://gist.github.com/timoxley/1689041
     * @param port
     * @param fn
     */
    function isPortTaken(port, fn) {
      const net = require('net')
      const tester = net.createServer()
        .once('error', function (err) {
          if (err.code != 'EADDRINUSE') return fn(err)
          fn(null, true)
        })
        .once('listening', function() {
          tester.once('close', function() { fn(null, false) })
            .close()
        })
        .listen(port)
    }
    
    function stopDaemon(daemon) {
      return new Promise((resolve, reject) => daemon.stop((err) => {
        err && console.error(err);
        if (err) return reject(err)
        resolve()
      }))
    }