]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - src/utils.js
Finalise the join in a network and add the ability to quit it
[github/Chocobozzz/PeerTube.git] / src / utils.js
index 0b21565dd74d3db9ae23db3a09cc9f28d5994d0b..176648a312b0a7229f711b9585c41d067300055f 100644 (file)
@@ -1,23 +1,25 @@
 ;(function () {
   'use strict'
 
-  var request = require('request')
-  var replay = require('request-replay')
-  var ursa = require('ursa')
+  var async = require('async')
   var config = require('config')
+  var crypto = require('crypto')
   var fs = require('fs')
   var openssl = require('openssl-wrapper')
-  var crypto = require('crypto')
+  var request = require('request')
+  var replay = require('request-replay')
+  var ursa = require('ursa')
 
+  var constants = require('./constants')
   var logger = require('./logger')
 
+  var utils = {}
+
   var http = config.get('webserver.https') ? 'https' : 'http'
   var host = config.get('webserver.host')
   var port = config.get('webserver.port')
   var algorithm = 'aes-256-ctr'
 
-  var utils = {}
-
   // ----------- Private functions ----------
 
   function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) {
       }
     }
 
-    logger.debug('Sending informations to %s', to_pod.url, { params: params })
+    logger.debug('Make retry requests to %s.', to_pod.url)
 
-    // Replay 15 times, with factor 3
     replay(
       request.post(params, function (err, response, body) {
-        callbackEach(err, response, body, to_pod.url)
+        callbackEach(err, response, body, params.url, to_pod)
       }),
       {
-        retries: 10,
+        retries: constants.REQUEST_RETRIES,
         factor: 3,
         maxTimeout: Infinity,
         errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ]
   utils.certDir = __dirname + '/../' + config.get('storage.certs')
 
   // { path, data }
-  utils.makeMultipleRetryRequest = function (all, pods, callbackEach, callback) {
+  utils.makeMultipleRetryRequest = function (all_data, pods, callbackEach, callback) {
     if (!callback) {
       callback = callbackEach
-      callbackEach = function () {}
+      callbackEach = null
     }
 
     var url = http + '://' + host + ':' + port
     var signature
 
-    // Signature ?
-    if (all.method === 'POST' && all.data && all.sign === true) {
-      var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'petube.key.pem'))
+    // Add signature if it is specified in the params
+    if (all_data.method === 'POST' && all_data.data && all_data.sign === true) {
+      var myKey = ursa.createPrivateKey(fs.readFileSync(utils.certDir + 'peertube.key.pem'))
       signature = myKey.hashAndSign('sha256', url, 'utf8', 'hex')
     }
 
     // Make a request for each pod
-    for (var pod of pods) {
+    async.each(pods, function (pod, callback_each_async) {
+      function callbackEachRetryRequest (err, response, body, url, pod) {
+        if (callbackEach !== null) {
+          callbackEach(err, response, body, url, pod, function () {
+            callback_each_async()
+          })
+        } else {
+          callback_each_async()
+        }
+      }
+
       var params = {
-        url: pod.url + all.path,
-        method: all.method
+        url: pod.url + all_data.path,
+        method: all_data.method
       }
 
       // Add data with POST requst ?
-      if (all.method === 'POST' && all.data) {
-        logger.debug('Make a POST request.')
-
+      if (all_data.method === 'POST' && all_data.data) {
         // Encrypt data ?
-        if (all.encrypt === true) {
-          logger.debug(pod.publicKey)
+        if (all_data.encrypt === true) {
           var crt = ursa.createPublicKey(pod.publicKey)
 
           // TODO: ES6 with let
           ;(function (crt_copy, copy_params, copy_url, copy_pod, copy_signature) {
-            utils.symetricEncrypt(JSON.stringify(all.data), function (err, dataEncrypted) {
+            utils.symetricEncrypt(JSON.stringify(all_data.data), function (err, dataEncrypted) {
               if (err) throw err
 
               var passwordEncrypted = crt_copy.encrypt(dataEncrypted.password, 'utf8', 'hex')
                 key: passwordEncrypted
               }
 
-              makeRetryRequest(copy_params, copy_url, copy_pod, copy_signature, callbackEach)
+              makeRetryRequest(copy_params, copy_url, copy_pod, copy_signature, callbackEachRetryRequest)
             })
           })(crt, params, url, pod, signature)
         } else {
-          params.json = { data: all.data }
-          makeRetryRequest(params, url, pod, signature, callbackEach)
+          params.json = { data: all_data.data }
+          makeRetryRequest(params, url, pod, signature, callbackEachRetryRequest)
         }
       } else {
-        logger.debug('Make a GET/DELETE request')
-        makeRetryRequest(params, url, pod, signature, callbackEach)
+        makeRetryRequest(params, url, pod, signature, callbackEachRetryRequest)
       }
-    }
-
-    return callback()
+    }, callback)
   }
 
   utils.certsExist = function (callback) {
-    fs.exists(utils.certDir + 'petube.key.pem', function (exists) {
+    fs.exists(utils.certDir + 'peertube.key.pem', function (exists) {
       return callback(exists)
     })
   }
         return callback(new Error(string))
       }
 
-      logger.debug('Gen RSA keys...')
-      openssl.exec('genrsa', { 'out': utils.certDir + 'petube.key.pem' }, function (err) {
+      logger.info('Generating a RSA key...')
+      openssl.exec('genrsa', { 'out': utils.certDir + 'peertube.key.pem', '2048': false }, function (err) {
         if (err) {
           logger.error('Cannot create private key on this pod.', { error: err })
           return callback(err)
         }
+        logger.info('RSA key generated.')
 
-        logger.debug('Manage public key...')
-        openssl.exec('rsa', { 'in': utils.certDir + 'petube.key.pem', 'pubout': true, 'out': utils.certDir + 'petube.pub' }, function (err) {
+        logger.info('Manage public key...')
+        openssl.exec('rsa', { 'in': utils.certDir + 'peertube.key.pem', 'pubout': true, 'out': utils.certDir + 'peertube.pub' }, function (err) {
           if (err) {
             logger.error('Cannot create public key on this pod .', { error: err })
             return callback(err)
           }
 
+          logger.info('Public key managed.')
           return callback(null)
         })
       })
     return dec
   }
 
+  utils.cleanForExit = function (webtorrent_process) {
+    logger.info('Gracefully exiting')
+    process.kill(-webtorrent_process.pid)
+  }
+
   module.exports = utils
 })()