ftp - MutakamwoyoCloud/MCloud GitHub Wiki
3.3.2.3.3 Módulo ftp
Dependencia: modulo FTP.
Funcionalidad de la parte back-end del servidor (node) que se encargará de la parte cliente-servidor relativa al protocolo de comunicaciones necesario para enviar los paquetes con peticiones.
Es el responsable de la implementación de las distintas funcionalidades de nuestro protocolo de comunicacones sobre ftp:
var action = {
idle : 0,
push : 1,
pull : 2,
fetch : 3,
flush : 4
};
Implementación del protocolo de comunicaciones.
Las principales acciones de nuestro protocolo de comunicaciones son: push, fetch, pull, flush. Todas ellas se encargan de hacer llegar datos al otro extremo, básicamente se conectan por ftp al directorio remoto y acceden al sistema de ficheros del proveedor para hacer comprobaciones.
En esta sección se comentara los detalles de implementación que tiene el protocolo de comunicación de Mcloud, los detalles de diseño que tiene este protocolo se detallaron en la seccion 3.3.1 Comunicación.
A continuación pasaremos a describir cada bloque de código por separado:
Push
Este bloque se dedica a iterar sobre todos los paquetes almacenados en la carpeta de push, en cada iteración y a través de un socket FTP envía la información a la zona proveedora.
case action.push:
fs.readdir(pushFolder, (err, files) => {
files.forEach(file => {
c.put(function(err) { ... });
});
});
break;
Flush
Esta operación es la encargada de borrar los paquetes de peticiones que ya tengamos procesados por el proveedor y almacenados en nuestro modelo.
Principalmente lo que hace es iterar sobre la carpeta borrando todo lo que no necesitemos.
case action.flush:
fs.readdir(flushFolder, (err, files) => {
files.forEach(file => {
c.put(...) { ... });
});
});
break;
Pull
La operación pull tiene el papel de descargar del proovedor los paquetes procesados necesarios, una vez recogida toda la información tenemos que decirle a nuestro modelo de datos que se ha efectuado dicha descarga.
case action.pull:
if (handler){
handler.emitter.on('pull', function(item){
c.get(fetchFolder+name , function(err, stream) {
stream.once('close', function() { c.end(); });
stream.pipe(fs.createWriteStream(pullFolder+name));
handler.pull();
});
}
});
handler.data.do(...);
}
break;
Fetch
Este bloque de código es el encargado de consultar si esta disponible un dato para la descarga, apoyándose en el manejador que consulta el modelo, básicamente consulta en unos datos cacheados los paquetes pendientes de descarga y marca una flag cuando están preparados.
Entre otras cosas también nos sirve para mantener un orden a la hora de descargar todos los paquetes.
case action.fetch:
c.list(fetchFolder, function(err, list) {
list.forEach(function(elem){
if (...) {
handler.data.do(...)
}
else if(...) {
handler.data.do(...);
}
});
c.end();
});
break;
Métodos principales
make_operations
Función que se llamará una vez la petición de entrada ftp tenga éxito, en este caso lo único que haría es listar el contenido del sistema de ficheros de entrada de nuestro servidor ftp.
function make_operations(list){ ... }
Evento ready
c es el objeto sacado de la dependencia ftp donde guardamos la estancia del cliente que accede al servidor. Una vez que la conexión ftp se ha realizado con éxito (cliente->servidor) la librería ftp dispara un evento llamado "ready", esta es la definición de ese evento que ejecutara un callback pasado por parámetro a list(callback), ese es el motivo de que la siguiente función que llamemos sea make_operations (solo se ejecutará una vez se realize la conexión), c.list() recibe como parámetro el objeto list que contiene la lista de archivos/carpetas dentro del sistema de ficheros que se ha accedido
c.on('ready', function() { ... });
send_info
Esta es la función principal que enviará un objeto con los datos de conexión que requiere el servidor para conectarse tales como la password, el usuario...
function send_info(){ ... }