Seedbox transfert automatique via Raspberry Pi

serveurs-seedbox

08 mai Seedbox transfert automatique via Raspberry Pi

J’utilise un serveur en seedbox : vitesse de transfert et libération de ma bande passante…

Le seul hic, c’est le ménage…
Du coup, je souhaite vérifier l’état des téléchargements au fil de l’eau, transférer les fichiers de la seedbox à mon PC, supprimer les fichiers de la seedbox lorsque le ratio souhaité est atteint ou lorsque ces derniers sont restés assez longtemps.
Avec un petit bonus : vérifier que la suppression de la seedbox est bien effective (problème de nommage des fichiers)

Etant pour le moment très pris par ma DomoBox…
Je laisse ici les idées et piste.

Récupérer l’état des transferts de la SeedBox

La SeedBox est gérée via Transmission.
En utilisant la class php suivante : Transmission class PHP (258)
ligne 492, remplacer [url_serveur] par l’url de la seedbox.

et le bout de code suivant :

<?php
  header('Content-Type: text/xml; charset=UTF-8');
 
  require_once( dirname( __FILE__ ) . '/class/TransmissionRPC.class.php' );
 
 
   function print_r_xml($arr,$first=true) {
     $output = "";
     if ($first) $output .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n";
     foreach($arr as $key => $val) {
      if (is_numeric($key)) $key = "arr_".$key; // <0 is not allowed
      switch (gettype($val)) {
        case "array":
         $output .= "<".htmlspecialchars($key).">".
           print_r_xml($val,false)."</".htmlspecialchars($key).">\n"; break;
        case "boolean":
         $output .= "<".htmlspecialchars($key).">".
           "</".htmlspecialchars($key).">\n"; break;
        case "integer":
         $output .= "<".htmlspecialchars($key).">".
           htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
        case "double":
         $output .= "<".htmlspecialchars($key).">".
           htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
        case "string":
         $output .= "<".htmlspecialchars($key).">".
           htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
        default:
         $output .= "<".htmlspecialchars($key).">".
           "</".htmlspecialchars($key).">\n"; break;
      }
     }
     if ($first) $output .= "</data>\n";
     return $output;
   }
   
   
$rpc = new TransmissionRPC();
$rpc->username = 'username';
$rpc->password = 'password';

try
{
  $rpc->return_as_array = true;
   $result = $rpc->get();
 
      $data = array_reverse( $result['arguments']['torrents'] );
      echo print_r_xml($data);
 
  $rpc->return_as_array = false;
 
} catch (Exception $e) {
  die('[ERROR] ' . $e->getMessage() . PHP_EOL);
}

?>

On obtient un retour XML contenant l’id, le nom, le status, les dates, le répertoire, le nom des fichiers, le ratio d’upload…
Le détail des informations est modifiable ligne 165 de la class PHP.

Donc avec le bout de code en PHP et la class associée, nous pouvons voir les différentes données des téléchargements et supprimer un téléchargement.

Transférer de la SeedBox vers le disque dur local en SSH

Etant très concentré sur Node.js depuis un moment (DomoBox oblige), j’ai de suite pensé à lui ;)
Du coup, nous utiliserons le module ssh2 pour Node.
Information récupérable ici.

Un exemple de bout de code :

var Connection = require('ssh2');

var c = new Connection();
c.on('connect', function() {
  console.log('Connection :: connect');
});
c.on('ready', function() {
  console.log('Connection :: ready');
  c.exec('uptime', function(err, stream) {
    if (err) throw err;
    stream.on('data', function(data, extended) {
      console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ')
                  + data);
    });
    stream.on('end', function() {
      console.log('Stream :: EOF');
    });
    stream.on('close', function() {
      console.log('Stream :: close');
    });
    stream.on('exit', function(code, signal) {
      console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
      c.end();
    });
  });
});
c.on('error', function(err) {
  console.log('Connection :: error :: ' + err);
});
c.on('end', function() {
  console.log('Connection :: end');
});
c.on('close', function(had_error) {
  console.log('Connection :: close');
});
c.connect({
  host: '192.168.100.100',
  port: 22,
  username: 'frylock',
  privateKey: require('fs').readFileSync('/here/is/my/key')
});

ou

var fs = require('fs');
var ssh2 = require('/usr/local/node/node_modules/ssh2');
 
var conn = new ssh2();
 
conn.on(
    'connect',
    function () {
        console.log( "- connected" );
    }
);
 
conn.on(
    'ready',
    function () {
        console.log( "- ready" );
 
        conn.sftp(
            function (err, sftp) {
                if ( err ) {
                    console.log( "Error, problem starting SFTP: %s", err );
                    process.exit( 2 );
                }
 
                console.log( "- SFTP started" );
 
                // upload file
                var readStream = fs.createReadStream( "/proc/meminfo" );
                var writeStream = sftp.createWriteStream( "/tmp/meminfo.txt" );
 
                // what to do when transfer finishes
                writeStream.on(
                    'close',
                    function () {
                        console.log( "- file transferred" );
                        sftp.end();
                        process.exit( 0 );
                    }
                );
 
                // initiate transfer of file
                readStream.pipe( writeStream );
            }
        );
    }
);
 
conn.on(
    'error',
    function (err) {
        console.log( "- connection error: %s", err );
        process.exit( 1 );
    }
);
 
conn.on(
    'end',
    function () {
        process.exit( 0 );
    }
);
 
conn.connect(
    {
        "host": "10.0.0.1",
        "port": 22,
        "username": "root",
        "privateKey": "/home/root/.ssh/id_root"
    }
);

Fonctionnement global

Dans le principe, nous aurons un Node (voir cron pour node) vérifiant périodiquement l’état des téléchargements.
L’ensemble des données seront stockées dans une base de donnée (mysql normalement).
Lorsqu’un nouveau téléchargement sera terminé, Node lancera un autre node afin de procéder au téléchargement des fichiers vers le local.
Afin de suivre le téléchargement, une communication entre les deux nodes sera réalisée via socket.
Le nombre de téléchargement simultanée sera donc maitrisable.
Le node principal aura une liaison avec Domobox afin de limiter les téléchargements lorsque nous sommes présent et non couché.
Une fois le téléchargement terminé, les fichiers ne seront pas supprimé de la seedbox. Le node contrôlera régulièrement le ratio ainsi que la date de fin de récupération. Lorsque l’un de ces deux critères seront atteint, un node enfant sera exécuté pour supprimer via transmission les fichiers.
Une fois les fichiers supprimés de la seedbox, la base de donnée locale sera mise à jours.

Ainsi, plus besoin de récupérer à la main ou de faire du ménage… ce sera automatique !!
Et bien entendu, tout pourra fonctionner sur mon mini-PC ou sur le Raspberry PI.

Bonus :
– Une fois la suppression terminée, une vérification de l’absence des fichiers (avec suppression via commande linux si besoin) sera réalisée.
– Classer correctement les fichiers récupéré en fonction du type (film, série, android…)
– avoir un monitoring des actions

Be Sociable, Share!
No Comments

Post A Comment