[BASH] Script para Backupear tus proyectos web

Standard

backup-web-project-script-linux

Muchas veces es necesario hacer un backup de nuestros proyectos web’s, ya sea de la base de datos como de los archivos. Hoy les traigo un pequeño script auto denominado “Backup Web Project Script”.

Tomamos como premisa que tu SO es Linux (sino nose que haces acá) y que la base de datos debe estar en MySQL.

Este script backup.sh debe guardarse un directorio antes que el directorio del proyecto, en nuestro ejemplo este directorio es trunk.

Se debe configurar:

  • Usuario de la base de datos: DBUSER
  • Password de la base de datos: DBPASS
  • Nombre de la base de datos: DBNAME
  • Directorio para backupear: DIRNAME

backup.sh

#!/bin/bash

## Name: Backup Web Project Script
## Description: Generate Backup Files & MySQL
## Development: Chuecko
## Site: http://www.zarpele.com.ar
## License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
## Version: 1.0

DBUSER='zarpele'
DBPASS='password'
DBNAME='zarpeledb'
DIRNAME='trunk'

BACKUPDIR='backup'
BACKUPDATEFILE=$(date +%Y%m%d_%H%M%S)
BACKUPDATE=$(date +%Y%m%d)

mkdir -p $BACKUPDIR/db/$BACKUPDATE
mkdir -p $BACKUPDIR/files/$BACKUPDATE

##DB BACKUP
echo "\033[31mBackup DB starting..."
mysqldump -u $DBUSER -p$DBPASS $DBNAME | gzip > "$DBNAME-$BACKUPDATEFILE.sql.gz";
mv $DBNAME-$BACKUPDATEFILE.sql.gz $BACKUPDIR/db/$BACKUPDATE
echo "\033[32mBackup DB finish."

##BACKUP FILES
echo "\033[31mBackup FILES starting..."
tar -zcf $DIRNAME-$BACKUPDATEFILE-files.tar.gz $DIRNAME
mv $DIRNAME-$BACKUPDATEFILE-files.tar.gz $BACKUPDIR/files/$BACKUPDATE
echo "\033[32mBackup FILES finish."

Comportamiento:
Fácil, lo primero que hace el script es crear las carpetas donde se van a guardar los backups. backup/db es la carpeta de la base de datos y backup/files es la de los archivos.

Realiza el mysqldump correspondiente (comprimido) y lo guarda en la carpeta antes mencionada y crea una nueva carpeta de este estilo 20130313 que representa el año, mes y dia, y un archivo con el nombre de la base de datos mas los datos de la fecha actual.

Lo mismo para los archivos, realiza un tar del directorio indicado (trunk en nuestro ejemplo) y lo guarda en la carpeta de backup de los archivos siguiendo la misma metodología de nombre anteriormente mencionada.

Saludos, espero que le sirva a alguien. Con que le sirva a uno cumplí con mi objetivo de compartir :D

Actualizar phpMyAdmin a mano en GNU/Linux!

Standard

No voy a recaer en hacer una descripción completa de esta tremenda herramienta para administrar nuestras Bases de Datos en Mysql, eso lo verán ustedes mismos en Google.

Es muy importante mantener actualizado todos los sistemas que dependen de “terceros”, esto es un problema de seguridad critico, a menudo van apareciendo bugs que dejan a descubiertos ciertos datos e información a personas no autorizadas y al tratarse de una herramientas para administrar Mysql esto podría dejar a descubierto todas las bases de datos.

Como saber que versión tengo? solo desde nuestro navegador… http://localhost/phpmyadmin Accedemos…

Esta marcado como rojo la versión…

  • 1. Descargamos la ultima versión.
    Nos dirigimos a la web oficial y descargamos la ultima versión.
  • 2. Resguardando los archivos viejos.
    Hacemos un backup del archivo config.inc.php y un backup comprimido de todo phpMyAdmin viejo.

    cp /usr/share/phpmyadmin/config.inc.php
    tar -zcvf phpmyadmin.tar.gz /usr/share/phpmyadmin/
  • 3. Instalando la nueva version de phpMyAdmin.

    Borramos el viejo phpMyAdmin.

    sudo rm -R /usr/share/phpmyadmin/

    Copiamos el nuevo al mismo lugar (notese que la versión puede variar).

    sudo cp -R phpMyAdmin-3.5.3-all-languages /usr/share/phpmyadmin

    Copiamos el archivo de configuración.

    sudo cp config.inc.php /usr/share/phpmyadmin
  • 4. Listo!

Buen código!

Operaciones matematicas desde consola…

Standard

Muchas veces necesito hacer cálculos sencillos cuando estoy trabajando y como siempre tengo una consola abierta utilizo la misma para hacer dichos cálculos.

Para esto hay varias formas echo, expr, bc, etc. la mas practica y rápida a mi gusto es expr, claro siempre y cuando sean enteros.

expr
Muestra el valor de la EXPRESIÓN en la salida estándar. Recordar que es solo para enteros (nada de operaciones en coma flotante).

Ejemplo:

expr 15 + 23

Salida: 38

Ejemplo:

expr 50 / 2

Salida: 25

echo
Tambien podemos utilizar para nuestros cálculos (enteros), el ultra conocido echo pero claro debemos decirle al mismo que los números son variables encerrando la operacion con $(( NUM1 OPER NUM2 )) por ejemplo.

Ejemplo:

echo $((15 + 23))

Salida: 38

Ejemplo:

echo $(( 50 / 2))

Salida: 25

bc
Llego la hora de hacer operaciones aritméticas enteras y punto flotante, bases, binarios, hexadecimales, senos, cosenos, tangentes, potencias, etc.

Ejemplo:

echo '2^3' | bc

Salida: 8

Ejemplo:

echo '10/3' | bc -l

Salida: 3.33333333333333333333

Ejemplo:

echo 'ibase=2;obase=A;10' | bc

Salida: 2

Como ven esta ultima opción tiene infinidades de parámetros para divertirse, y tendria muy poco sentido que hable aqui de ellos, por eso los invito a ver su manual, asi que en consola:

man bc

[MySql] Script para generar backup por cada base de datos…

Standard

Una de las cosas que debe tener un desarrollador, es una política propia de Backup ya sea de archivos o de base de datos. Ni hablar en un sitio en producción, esto debe existir si o si, así evitar una catástrofe de grandes proporciones ya sea por culpa del humano/maquina (el primero es mas común :D ).

En mi caso, no me ocupo de los servidores de producción pero si hago un backup en las pc’s donde desarrollo, esto me puede ahorrar muchas horas de trabajo y dolores de cabeza ante un imprevisto.

En esta ocasión, les traigo un sencillo script que crea un fichero (con compresión gzip) por cada base de datos mysql en el sistema.

Me dirán, pero si existe el la opción de mysqldump –all-databases. Claro, pero esto te genera un único fichero que contiene todas las bases de datos. Dos puntos en contra de esta ultima opción es, si tenemos muchas DB se genera un fichero sumamente grande y cuando deseemos importar una DB en particular nos obliga a importar todas las demás.

#!/bin/bash
BACKUPUSER="guido"
BACKUPDIR="/home/$BACKUPUSER/backup/mysql"
BACKUPDATEDB=$(date +%Y%m%d_%H%M%S)
BACKUPDATE=$(date +%Y%m%d)

DBUSER="root"
DBPASS="zarpele"

mkdir -p $BACKUPDIR/$BACKUPDATE

for DB in `mysql -u $DBUSER -p$DBPASS -e "SHOW DATABASES" | grep -v Database`;
do
	echo -n "BACKUP $DB DATABASE..."
	mysqldump -u $DBUSER -p$DBPASS $DB | gzip > "$BACKUPDIR/$BACKUPDATE/$DB-$BACKUPDATEDB.sql.gz";
	echo "OK"
done

chown -R $BACKUPUSER:$BACKUPUSER $BACKUPDIR/$BACKUPDATE

El script se puede mejorar a gusto del consumidor, por ejemplo podemos agregar un par de lineas y borrar X directorios a partir del día de la fecha así ahorrar espacio en el disco.

Este script lo ejecuto todos los días mediante cron, y asi todos los dias tengo un backup de las base de datos en las que trabajo sin mas que prender la computadora :D

Saludos…

Averiguar mi IP publica por consola…

Standard

Muchas veces, necesitamos saber nuestra IP publica por x razón. Algunos entran a este tipo de paginas www.cualesmiip.com y otros usuarios mas avanzados y se fijan la IP publica que tiene el módem de nuestro “queridisimo” ISP o en nuestro router en caso de que el módem este configurado como Pure Bridge.

Para averiguar nuestra IP publica por consola, necesitamos que “alguien” de afuera nos diga a través de cual IP accedemos a ese “alguien”. Para esto mismo utilizaremos curl.

curl es un cliente para obtener archivos de servidores utilizando cualquiera de los protocolos soportados. La orden está diseñada para funcionar sin interacción del usuario o ninguna clase de interacción.

curl ofrece una gran cantidad de trucos útiles como soporte para proxy, auteticación de usuarios, subidas por FTP, post HTTP, reanudación de transferencias HTTP y más.

Para instalarlo…

chuecko@zarpele ~ $ sudo apt-get install curl

Y listo, solo hacer…

chuecko@zarpele ~ $ curl http://www.zarpele.com.ar/some/ip.php
chuecko@zarpele ~ $ 190.229.136.245

Saludos…

Consola: Mostrar los ficheros que un proceso esta utilizando…

Standard

Este es un pequeño tip, para ver los ficheros que tiene abierto un determinado proceso, cuando digo fichero me refiero a directorios, registros, pipes, socket, bibliotecas, etc ya que como sabemos en el mundo Linux todo es un fichero :D

Para esto utilizaremos el comando lsof
Descripción:

List open files. Muestra los archivos que un proceso ha abierto para poder ejecutarse. Mas info ~ $ man lsof

Para hacer la prueba, vamos a mostrar los ficheros que tiene abierto un proceso simple como lo es el mismisimo man, ya que si queremos observar por ejemplo los procesos de Firefox, tendríamos una lista larga larga que no vale la pena mostrar en esta simple guía.

Por ejemplo visualizamos el manual del comando cp (copiar)…

chuecko@zarpele ~ $ man cp

Sin terminar el proceso anterior, desde otra terminal obtendremos el PID del proceso anterior…

chuecko@zarpele ~ $ ps -ed | grep man
   54 ?        00:00:03 kondemand/0
   55 ?        00:00:00 kondemand/1
  887 ?        00:00:00 modem-manager
 2268 ?        00:00:02 gnome-power-man
18184 pts/1    00:00:00 man

La ultima linea es la que nos interesa, el pid del proceso man (en este caso) es 18184 y ahora procedemos a listar los ficheros abiertos por este proceso.

chuecko@zarpele ~ $ lsof -p 18184
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
man     18184 chuecko  cwd    DIR    8,3     4096 196660 /usr/share/man
man     18184 chuecko  rtd    DIR    8,3     4096      2 /
man     18184 chuecko  txt    REG    8,3   173084   2036 /usr/bin/man
man     18184 chuecko  mem    REG    8,3  1319364 174375 /lib/tls/i686/cmov/libc-2.10.1.so
man     18184 chuecko  mem    REG    8,3    21840   3520 /usr/lib/libgdbm.so.3.0.0
man     18184 chuecko  mem    REG    8,3    83608    526 /lib/libz.so.1.2.3.3
man     18184 chuecko  mem    REG    8,3   113320     64 /lib/ld-2.10.1.so
man     18184 chuecko  mem    REG    8,3    20841 189160 /usr/share/locale-langpack/es/LC_MESSAGES/man-db.mo
man     18184 chuecko  mem    REG    8,3   256316 395749 /usr/lib/locale/es_AR.utf8/LC_CTYPE
man     18184 chuecko  mem    REG    8,3   966954 214312 /usr/lib/locale/es_AR.utf8/LC_COLLATE
man     18184 chuecko  mem    REG    8,3       54 395670 /usr/lib/locale/es_AR.utf8/LC_NUMERIC
man     18184 chuecko  mem    REG    8,3     2378 188952 /usr/lib/locale/es_AR.utf8/LC_TIME
man     18184 chuecko  mem    REG    8,3      286 188956 /usr/lib/locale/es_AR.utf8/LC_MONETARY
man     18184 chuecko  mem    REG    8,3       54 214315 /usr/lib/locale/es_AR.utf8/LC_MESSAGES/SYS_LC_MESSAGES
man     18184 chuecko  mem    REG    8,3       34 395635 /usr/lib/locale/es_AR.utf8/LC_PAPER
man     18184 chuecko  mem    REG    8,3       62 395633 /usr/lib/locale/es_AR.utf8/LC_NAME
man     18184 chuecko  mem    REG    8,3      127 188957 /usr/lib/locale/es_AR.utf8/LC_ADDRESS
man     18184 chuecko  mem    REG    8,3       51 188958 /usr/lib/locale/es_AR.utf8/LC_TELEPHONE
man     18184 chuecko  mem    REG    8,3       23 395751 /usr/lib/locale/es_AR.utf8/LC_MEASUREMENT
man     18184 chuecko  mem    REG    8,3    26048 263920 /usr/lib/gconv/gconv-modules.cache
man     18184 chuecko  mem    REG    8,3      351 188960 /usr/lib/locale/es_AR.utf8/LC_IDENTIFICATION
man     18184 chuecko    0u   CHR  136,1      0t0      4 /dev/pts/1
man     18184 chuecko    1u   CHR  136,1      0t0      4 /dev/pts/1
man     18184 chuecko    2u   CHR  136,1      0t0      4 /dev/pts/1

Y listo, nos muestra todos los ficheros abiertos indicando tambien su tipo. Para mas info sobre este comando…

chuecko@zarpele ~ $ lsof --help

Saludos…