Automatizacion de Backups con Mikrotik y Google Drive Parte 2


En la primera parte, te enseñe como automatizar mediante un script el envio de tus backups. Ahora viene la parte divertida, «donde el google drive cobra vida». Esta segunda parte no tiene nada de Mikrotik, para ello leer la primera parte.

Esta «segunda» parte consiste en recibir el correo con un archivo adjunto (El backup), y dependiendo del asunto del email organizarlo en distintas carpetas y documentar todo en una planilla de calculo.

Como logramos esto?

Con Scripts de Google App Scripts que son muy muy poderosos y te permitirian mejorar funcionalidades en todo esto:

Nosotros lo que haremos es darle funcionalidades especiales dentro de una planilla de calculo «Sheet» que tendra funciones para:

  1. Leer el Gmail,
  2. Manipular el G.Drive
  3. y finalmente escribir el resultado en una planilla de calculo.

Pasos a seguir para implementarlo:

  1. Nos logueamos en la misma cuenta de gmail que utilizamos en la primera parte (donde estarian llegando los backups). Yo les recomiendo que lo hagan en una ventana de incognito.
  2. Luego como se muestra en la imagen, click en aplicaciones, y finalmente en Hojas de calculo. O bien, luego de loguearnos vamos a esta direccion: https://docs.google.com/spreadsheets/

3. Creamos una hoja de calculo nueva. Le damos el nombre que mas nos guste:

4. Usar la primer fila para crear los encabezados para cada columna

IDFECHA SUBIDACARPETAARCHIVOURLTIPOHORA ESCRITURA

5. Ahora iremos al menu «Herramientas» > Editor de secuencias de comandos tal como muestro en la siguiente imagen:

Es lo mismo que acceder a script.google.com, con la diferencia de que aqui queda el codigo ligado a esta planilla

6. Aqui pegaremos el siguiente codigo:


/*
 * Script por Nicolas Daitsch www.tech-nico.com/blog
   30 de septiembre de 2020
 */

// GLOBALS
//Filtro de extenciones de los archivos adjuntos
var fileTypesToExtract = ['backup', 'rsc', 'gz'];
//Carpeta de google drive donde los archivos seran movidos
var folderName = 'MIS-BACKUPS';
//Etiqueta que le pondremos a los correos ya procesados
var labelName = 'read_label';
// ID de la carpeta definida en la variable "folderName"
var DocsfolderID='1kLOIsv1Co_4SA6oE838kskfPXvZUuXcZg4fH';

function GmailToDrive(){
    var query = '';
    for(var i in fileTypesToExtract){
      query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
    }
    query = 'in:inbox has:nouserlabels ' + query;
    var threads = GmailApp.search(query);
    var label = getGmailLabel_(labelName); // Get Label ID
    var parentFolder,parentMyFolder,parentMySubFolder; 
    if(threads.length > 0){
      parentFolder = createFolder(folderName,DocsfolderID); // Si la carpeta existe, traer el ID
    }
    var root = DriveApp.getRootFolder();
    for(var i in threads){
        var mesgs = threads[i].getMessages();
        for(var j in mesgs){
              var subject = mesgs[j].getSubject();
              var subject_array = subject.split("//");
              if(subject_array.length<2) { 
                 threads[i].addLabel(label); 
              }else{ 
                  var subject_folder = subject_array[0];
                  var subject_subfolder = subject_array[1];
                
                  var attachments = mesgs[j].getAttachments();
                  for(var k in attachments){
                      var attachment = attachments[k];
                      var isDefinedType = checkIfDefinedType_(attachment);
                      if(!isDefinedType) continue;
                      var attachmentBlob = attachment.copyBlob();
                      var file = DriveApp.createFile(attachmentBlob);
                      var nom_archivo="";
                      nom_archivo = attachment.getName();

                      parentMyFolder = createFolder(subject_folder,parentFolder.getId());
                      parentMySubFolder = createFolder(subject_subfolder,parentMyFolder.getId());

                      parentMySubFolder.addFile(file);
                      var files = [];
                      files.push({ id:file.getId(), fecha:file.getDateCreated(), carpeta: subject, archivo: file.getName(), url:file.getUrl(), tipo:file.getMimeType()});
                      printInSheet2(files[0])

                      root.removeFile(file);
                  }
              }
            
        }
        threads[i].addLabel(label); // set as just read
    }
}

function getGmailLabel_(name){
  var label = GmailApp.getUserLabelByName(name);
  if(!label){
	label = GmailApp.createLabel(name);
  }
  return label;
}

function checkIfDefinedType_(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
  else return false;
}


function createFolder(Name,folderID){
  
  var PF = DriveApp.getFolderById(folderID);
  if(Name==folderName){ return PF; }
  
  var subFolders = PF.getFolders();
  var doesntExists = true;
  var newFolder = '';
  
  while(subFolders.hasNext()){
    var folder = subFolders.next();
    if(folder.getName() === Name){
      doesntExists = false;
      newFolder = folder;
      return newFolder;
    };
  };
  
  if(doesntExists = true){
    newFolder = PF.createFolder(Name);
    return newFolder;
  };
};



function printInSheet2(objeto) {
  var today = (Utilities.formatDate(new Date(), "GMT-3", "dd-MM-yyyy")).toString();
  var today_hora = (Utilities.formatDate(new Date(), "GMT-3", "HH:mm")).toString();
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var sheet = ss.getSheetByName(today);
  if (!sheet){
    SpreadsheetApp.setActiveSheet(ss.getSheets()[0]); 
  
    ss.duplicateActiveSheet(); 
    ss.renameActiveSheet(today); 
    ss.moveActiveSheet(1); 
    // Prepares tab (clears old content)
    var sheet = ss.getSheetByName(today); 
    sheet.getRange('A2:G200').clearContent(); // clean
    sheet.getRange('A2:G200').setBackground(null);
  }

  var found = sheet.getRange(1,1,sheet.getLastRow()).createTextFinder(objeto["id"]).matchCase(false).findNext(); 
  if ( found==null ){ // only write if any cell content not match with de file ID
      var data, sheet = SpreadsheetApp.getActiveSheet();
      data = [
        objeto["id"],
        objeto["fecha"],
        objeto["carpeta"],
        objeto["archivo"],
        objeto["url"],
        objeto["tipo"],
        today_hora
      ];
      sheet.appendRow(data);
   }
};

La Magia:

Nos quedaria algo asi:

7. Solo tendremos que editar primeras 4 variables, y son obligatorias la creacion de la carpeta MIS-BACKUPS o como quieras llamarla. Al crearla, obtenemos el ID de la carpeta que necesitamos definir en la ultima variable (tambien obligatoria), como muestro a continuacion:

En una nueva solapa vamos a https://drive.google.com/

Presionamos NUEVO:

Elegimos Carpeta:

Finalmente le damos click derecho «Obtener Enlace»

Copiamos el ID, Asegurense de que este completo porque es mas largo de lo que se ve en la captura:

8. Ahora ya podemos ejecutar el codigo y probar si funciona: Volver a la ventana de script.google.com y ejecuta el codigo eliguendo la funcion GmailToDrive y seguidamente presionar el boton Play

Finalmente les va a pedir que le den permisos de lectura para acceder al gmail, drive, etc.

Por supuesto que si no hay correos en tu casilla no va a procesar nada. Y ademas que si el asunto no respeta la doble barra para separar el nombre de la carpeta con la fecha, el mail no va a ser procesado. Si el correo es procesado lo marca con la etiqueta de leido «read_label»:

Finalemente revisamos en nuestro drive la creacion de las carpetas y en la planilla que deberia aparecer el resumen del archivo en solapas por fecha, para que si buscamos entre muchos backusp de una fecha especifica, lo podamos encontrar super rapido!.

9. Para agregar el script a un calendario de ejecucion y que corra el proceso de manera automatica, lo que tenemos que hacer es crear un nuevo Trigger o Activador:

Añadir Activador:

Yo lo configure asi: (Ustedes pueden setearlo a su gusto)

No hace falta que les diga que pueden utilizar este mismo script para recibir backups de Linux, Mikrotik, Windows, o cualquier dispositivo que sea capaz de enviar un mail con un archivo adjunto.

Espero que les haya gustado tanto como a mi, y cualquier cosa que no se entienda puedo armar un video-tutorial.

Saludos
_______________
Por Nicolas en tech-nico.com/blog

2 comentarios en “Automatizacion de Backups con Mikrotik y Google Drive Parte 2

  1. Asegurate de generar la planilla de calculo y el script en una ventana de incognito, y que cuando ejecutas por primera vez, te pida los permisos para la misma cuenta de Gmail con la cual creaste la planilla.

Deja un comentario