Mysql Database creation script

Two days ago one of my client dev’s requested me to be able to create db’s on their MySQL instance.
Of course, I won’t give him the “GRANT GRANT WITH GRANT OPTION” :-P, in that case I will simply give him root password :-P
As i didn’t find anything that solves my problem over Internet, I just did mine, as allways..
Here’s he result.

Prereqs:

  • Create a Mysql user with the following grants:
    [cc lang=”bash”]
    GRANT CREATE, RELOAD, SHOW DATABASES, CREATE USER ON *.* TO ‘database_creator’@’localhost’ IDENTIFIED BY ‘YOUR_PASSWORD’ ;
    GRANT INSERT ON `mysql`.`db` TO ‘database_creator’@’localhost’ ;
    [/cc]
  • That will allow us to create databases, users, make some checks and reload privs, while we don’t create a new “root”…

You can download the script code from the wiki, also you’ll find additional information there.

El típico día a día

Hoy un amigo me planteaba un problema.
Resulta que tiene 2 ficheros con datos del tipo:

  • fichero1: [SERIAL]|[ID], por ejemplo:
    8944110064809868270|1221174
  • fichero2: [ID], por ejemplo:
    1185648

El problema es sencillo, necesita mostrar del fichero1 [SERIAL]|[ID] si [ID] está en fichero2 y de los que no estén en fichero2 mostrar únicamente la ocurrencia con [ID] más alto.
La cuestión es que todos los [ID] de fichero2 están en fichero1.

Después de un buen rato, opté por ignorar fichero2, total, todos los datos están en fichero1, no nos da ningún dato significativo.
Y lo que obtuve fue lo siguiente:
sort -k 2 -n -t "|" fichero1.txt | awk -F\| '{
file1array[$1] = $2
} END{
for (SSN in file1array)
print SSN"|"file1array[SSN] }' > test.file

El razonamiento es sencillo teniendo, la clave la da la ordenación del principio, ya que el array que creo dentro de awk irá machacando [ID] menores.

Script de copia y restauración de un sistema windows

Imagino que todos los sysadm/informaticos de este mundo hemos sufrido alguna vez el caso del “Amigo informatico“.

En mi caso últimamente, después de usar muchas veces ghost, he decidido cambiar… Nada de dar un dvd con la imagen, que para eso tenemos toneladas de gigas de espacio en disco y si el usuario se queja, pues mira, habérselo pedido a otro.

Partiendo de esto, he decidido hacer un script tipo menú de instalación con las opciones mínimas y que sea fácilmente gestionable por el usuario final.

El preparación es simple:

  • Se particiona el disco.
  • Instalamos windows
  • Instalamos un linux “minimal”, y dependencias necesarias para que el script funcione
  • Añadimos nuestro script.
  • Modificamos los parámetros de configuración necesarios en el mismo
  • Creamos un usuario de sistema sin privilegios, modificamos ~/.bashrc para lanzar automáticamente el script cuando se logue el usuario.
  • Deshabilitamos la posibilidad de salir del script (trap) para evitar problemas.
  • Nos guardamos el pass de root ;-)
  • Modificamos grub para que el menú diga algo como Restore or similar y el usuario no se asuste viendo GNU/Linux
  • Informar al usuario de como funciona el entorno, aunque es muy muy sencillo)

Con eso y generar nosotros mismos la primera imagen que será imborrable (desde el script), ya estaría todo.

El funcionamiento es mucho más simple aún:

  1. Restaurar imagen
  2. Generar Imagen
  3. Borrar Imagen
  4. Listar Imágenes
  5. Ayuda
  6. Reboot

No deberían añadirse muchas más opciones, cuanto menos se pueda hacer, mejor.

Las ventajas son bastante óbvias:

  • El propio usuario se gestiona sus imágenes, por lo que cambio de sistema windows (de xp a 7 por ejemplo), no deberían necesitar más ayuda.
  • El script debería funciona en cualquier linux mientras se cumplan las deps.
  • El backup “va contigo”, no hay discos adicionales.

Y las desventajas:

  • Espacio en disco
  • Que se carguen grub
  • Que alguna vez falle el ntfsclone (FAIL!)

Por supuesto puede que el script no esté libre de fallos, por ejemplo, no consigo hacer trap de “CONTROL+Z” aunque haga trap de todas las señales. Aunque probado está ;-)

El script está documentado en la wiki.

The easiest way to start X

Yesterday while reinstalling Arch in the x86_64 flavour :-) I was thinking which will be the best way to start X window system.
I want to start my X window’s without user prompt (so CDM is not an option), and I don’t any of common login-managers (gdm, xdm, kdm or slim)… I’ve tried to use the simplest way, and it works!

Let’s go, deps:
[cc lang=”bash”]
pacman -Ss xorg-xinit screen
[/cc]
And optional:
[cc lang=”bash”]
pacman -Ss xterm xort-twm
[/cc]
Cool? ;-) Of course, you must have the X-window (1 &2) system installed and your preferred lightweight desktop manager.

Add your super-power-user:
[cc lang=”bash”]
useradd -s /bin/bash -c “super-power-user” dodger
[/cc]

And now the script:
[cc lang=”bash”]
vim /etc/rc.d/autofluxbox
[/cc]
[cc lang=”bash”]
#!/bin/bash -x
LOGDIR=/var/log/autofluxbox
[ ! -d $LOGDIR ] && mkdir $LOGDIR
exec 1> $LOGDIR/autofluxbox.$(date +%Y%m%d%H%M).log
exec 2> $LOGDIR/autofluxbox.$(date +%Y%m%d%H%M).err
USER=dodger
STARTX=”/usr/bin/startx”

su – ${USER} -c “screen -S Fluxbox_startup -d -m ${STARTX}”
[/cc]

And:
[cc lang=”bash”]
chmod +x /etc/rc.d/autofluxbox
[/cc]
One thing I’ve just found is ${PATH} seems to be wrong on my X environment ¬¬’… I will continue investigating.

Strange feature in bash script

Today, while programming (or reprogramming) some parts of one script, I’ve noticed a strange thing.
First, the two scripts.

The working one:

#!/bin/bash
let x=0
echo -e "a\nb\nc\nd" > auxfile
while read LINE
do
[[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++
done < auxfile
echo ${AUX[@]}

And the not working (for my purpose):

#!/bin/bash
let x=0
echo -e "a\nb\nc\nd" | while read LINE
do
[[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++
done
echo ${AUX[@]}

The only difference between both is just the piped while.
Someone can explain why seems to be a “reset vars” at the end of the piped while?