Introducción
Cuando se trata de crear copias de seguridad en lo primero que pienso siempre es es Google Drive; ya que es una de las plataformas más usadas y que más espacio gratuito ofrece. Sin embargo a veces me da flojera tener que estar cargando los archivos manualmente, así que decidí crear un script que combina Bash y Python que me permite hacerlo de forma automática. Si bien en los sistemas operativos de Windows y Mac existe la aplicación de Google Drive, en Linux no existe una aplicación oficial, por lo que tenemos que ingeniarnos la forma de poder subir archivos a Google Drive. Y es por eso que creé este script o aplicación, llámalo como quieras, que me permite subir archivos a Google Drive de forma automática. Lo estoy automatizando con Cron, pero puedes usarlo como quieras. Dado que no soy muy brillante que digamos, decidí llamarlo HomeBack (si, soy muy original).
Requisitos
Python 3.6 o superior. Lo puedes descargar desde aquí
pip3. Lo puedes instalar con el comando
sudo apt install python3-pip
o haciendo clic aquíCredenciales de Google.
Obtención de credenciales
Una vez instalados Python y Pip3 es necesario conseguir las credenciales de Google, para eso vamos a ir a este enlace
Nos aparecerá una página como esta:
Buscaremos Google Drive y entramos al enlace de Google Drive API
Al ingresar a esa página habilitamos la API, en mi caso ya se encuentra habilitada. Después ingresamos a Administrar.
Una vez en esta pantalla nos vamos a la sección de Credenciales.
A continuación damos click en el botón de Crear Credenciales. Y seleccionamos ID de cliente de OAuth
- En tipo de aplicación colocamos Aplicación Web
- Le damos el nombre que deseemos.
Donde nos pide agregar uri colocamos lo siguiente:
- Orígenes autorizados de Javascript: http://localhost:8080
- URI de redireccionamiento autorizados: http://localhost:8080/
Es de suma importancia que en el apartado de "URI de redireccionamiento autorizados" se coloque la diagonal "/" al final.
Una vez agregadas las uri podemos darle clic al botón de Crear.
Nos arrojará la siguiente ventana con la confirmación de la creación de las credenciales. Descargaremos el JSON.
El archivo descargado lo renombramos como client_secret.json
y lo movemos a la carpeta raíz.
Funcionamiento
Es necesario crear un archivo .env
con la siguiente estructura:
ID_CARPETA=
CLIENT_ID=
CLIENT_SECRET=
## Sin la de abajo no funciona el script
DIRECTORIO_HOME=/home/<NombreUsuario>
## Sin la de arriba no funciona el script
El CLIENT_ID
y CLIENT_SECRET
se encuentran en el archivo JSON descargado.
El ID_CARPETA
lo podemos conseguir al ingresar a la carpeta de drive donde queremos guardar el backup, el link se ve de la siguiente manera:
https://drive.google.com/drive/folders/aquiseencuentraeliddecarpeta
Cuando se descarga el archivo settings.yaml
del repositorio se deben de modificar las variables CLIENT_ID
y CLIENT_SECRET
con los que se descargaron en el paso anterior. Se puede dejar con las variables, pero ocasiona error con la autenticación y es necesario autenticarte cada vez que ejecutas el script. De mi parte colocando las credenciales en el archivo settings.yaml
no me ha ocasionado ningún problema de seguridad, pero si no te sientes cómodo puedes dejarlo con las variables de entorno.
client_config_backend: settings
client_config:
client_id: {{ CLIENT_ID }}
client_secret: {{ CLIENT_SECRET }}
save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials_module.json
get_refresh_token: True
oauth_scope:
- https://www.googleapis.com/auth/drive
Partes de interés
Si quieres curiosear en el código para eso está el repositorio
Para poder excluir carpetas se debe de modificar esta parte del script de bash:
# Carpetas a excluir en la copia de seguridad
declare -A carpetas_excluidas=(
["$HOME/.cache"]='',
["$HOME/.bin"]='',
["$HOME/snap"]='',
["$HOME/.mozilla"]='',
["$HOME/.backup"]='',
["$HOME/.local"]='',
)
Como pudimos ver en el Diagrama de funcionamiento el script de Bash finaliza y ejecuta el script de Python. En el script de Python hay un trozo de código en donde nos permite colocar un máximo de archivos, es decir que nos permite tener varias versiones de la copia de seguridad. Como es sabido las cuentas gratuitas de Google Drive únicamente permiten almacenar 15GB, por lo que podemos dejar ese máximo de archivos en 1. Como se muestra a continuación:
# Carga las variables de entorno desde el archivo .env
load_dotenv()
# Obtiene el ID de carpeta de las variables de entorno
id_carpeta = os.getenv("ID_CARPETA")
# Obtiene las credenciales de la API de Google Drive de las variables de entorno
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
directorio_home = os.getenv("DIRECTORIO_HOME")
# Usa las variables de entorno para acceder a la API de Google Drive
if len(sys.argv) < 2:
print("Debes pasar el nombre del archivo como argumento")
sys.exit(1)
max_archivo = 1
nombre_archivo = sys.argv[1]
print("Subiendo archivo: " + nombre_archivo)
Cron
Cron es un poderoso sistema de programación de tareas utilizado en sistemas operativos tipo Unix y sistemas basados en Linux. Este servicio nos permite programar comandos o scripts para que se ejecuten automáticamente en momentos específicos, lo que facilita la automatización de tareas repetitivas y programadas.
La automatización con Cron tiene varias ventajas:
- Ahorro de tiempo: La automatización de tareas repetitivas ahorra tiempo y esfuerzo, ya que no es necesario ejecutarlas manualmente.
- Precisión: Cron asegura que las tareas se ejecuten en el momento exacto especificado, evitando posibles errores humanos.
- Planificación flexible: Permite programar tareas diarias, semanales, mensuales o incluso en horarios más complejos.
- Administración del sistema simplificada: Cron se utiliza ampliamente para tareas de mantenimiento, copias de seguridad, limpieza de archivos temporales y más.
Estructura de tiempo de Cron
El tiempo en Cron se divide en cinco campos, cada uno indicando cuándo se ejecutará la tarea programada. Los campos son los siguientes:
- Minuto (0-59)
- Hora (0-23)
- Día del mes (1-31)
- Mes (1-12) 5 Día de la semana (0-7), donde 0 y 7 representan domingo.
* * * * * comando a ejecutar
- - - - -
| | | | |
| | | | +----- día de la semana (0 - 6) (Domingo = 0)
| | | +------- mes (1 - 12)
| | +--------- día del mes (1 - 31)
| +----------- hora (0 - 23)
+------------- minuto (0 - 59)
Usando combinaciones específicas en estos campos, se puede configurar la frecuencia exacta y el momento en que se activarán las tareas.
Ejemplo de uso
Por ejemplo para que el script de HomeBack se ejecute todos los domingos a las 03:00 quedaría así:
0 3 * * 0 /aqui/va/la/ruta/al/script/HomeBack.sh
Conclusiones
La creación del script HomeBack
ha sido una solución eficiente y práctica para automatizar la tarea de respaldar archivos en la nube de Google.
HomeBack representa una solución efectiva y accesible para aquellos usuarios de sistemas Linux que deseen respaldar sus archivos de forma automática en Google Drive, brindando tranquilidad y confianza en la preservación de su información importante. El proyecto continúa siendo accesible y está disponible para su exploración y contribución en el repositorio de Github.