Welcome, connect your terminal

Mysql Database creation script

Apr-18-2012 By dodger

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:
    1
    2
    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' ;
  • 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.

Regexp mortal

Feb-15-2012 By dodger

Hoy realizando una tarea que va a ser repetitiva (MODO CRON ON), he tenido que currar una regexp, la verdad no es muy compleja en sí pero sí larga:

1
'/(project|production)/production/(hs|ga)[0-9]{2}/Runs/[0-9]{6}_SN[0-9]{3}_[0-9]{4}_[0-9A-Z]{8}XX/(Data/Intensities/(L00[0-9]/C*|BaseCalls/L00[0-9]/C*)|Thumbnail_Images/L00[0-9])'

Cuanto tardará find en procesar algo como esto con una jerarquía de unos 36000K ficheros xD
Respuesta en breve :-)

No es ningún tema de fubol por supuesto :P
moc es un reproductor basado en ncurses (para variar), como cualquier otro reproductor X de los simples, con reproducción por listas, exploración de directorios y poquito más (pa qué).
Ocupa poco, funciona realmente bien y no hay mucho que configurar :)

En mi caso lo único a sido asignar las teclas multimedia del teclado, en $HOME/.fluxbox/keys por supuesto:

1
2
3
4
5
None XF86Tools :ExecCommand roxterm -e mocp
None XF86AudioPlay :ExecCommand mocp -G
None XF86AudioLowerVolume :ExecCommand amixer -q set PCM 5%- unmute
None XF86AudioMute :ExecCommand amixer -q set Master toggle
None XF86AudioRaiseVolume :ExecCommand amixer -q set PCM 5%+ unmute

También tenemos la aplicación moc-tray para los tray-lovers ;-) aunque entonces yo optaría por xnoise que tiene todo ya integrado.

Serverstats, el “cacti” ligero

Jan-23-2012 By dodger

En mi búsqueda habitual de aplicaciones lightweight y tras tirar “cacti” a la basura por motivos de rendimiento óbvios, he encontrado “serverstats” a través de un blog donde lo analizan bastante bien, asi que no voy a ponerme a analizarlo yo :P

La cuestión viene cuando he intentando personalizar la configuración inicial.
Lo primero que he visto que aunque en la documentación diga que modificando el fichero “config/sources.php” carga módulos… no lo hace :-P, únicamente hará caso del fichero “config/simple.php“.
Por ejemplo, para activar el módulo de monitorización de mysql he tenido que habilitarlo en el “simple.php“:

1
2
3
4
5
6
7
8
9
10
        'mysql' => array(
                'used' => true,
                'host' => 'localhost',
                'user' => 'serverstats',
                'password' => 'serverstats',
                'graphs' => array(
                        'questions' => array('used' => true, 'title' => 'MySQL: questions per second'),
                        'processes' => array('used' => true, 'title' => 'MySQL: query count ("SHOW PROCESSLIST")')
                )
        ),

Y aún así en el rrd veía un bonito mensaje de error de php :-)
He lanzado un update a mano y generaba un bonito error:

1
2
3
4
exception 'Exception' with message 'Could not connect to database' in /home/www/serverstats.ciberterminal.net/sources/mysql.php:48
Stack trace:
#0 /home/www/serverstats.ciberterminal.net/update.php(48): mysql->init()
#1 {main}

Asi que editando el fichero “sources/mysql.php” y añadiendo unas lineas de debug, me he dado cuenta que el constructor tiene hardcodeadas las credenciales:

1
2
3
4
5
6
        public function __construct($user = 'status', $password = '', $host = 'localhost')
        {
                $this->user = $user;
                $this->password = $password;
                $this->host = $host;
        }

Y como uno no es programador (ni tiene mucho tiempo), he decidido cambiar estos parámetros por los míos ;-)
Un update más y todo listo, ya tenemos stats de mysql funcionando.
Ahora a ver que nos deparan los otros módulos :-P

Hoy un compañero ha tenido un “pequeño” percance con la actualización de unas vmware-tools… Le han petado /root.
Por algún motivo corrompieron todo el fs.
La cuestión es que necesitábamos tener los comandos básicos por que tras diversas acciones “/lib64” desapareció O:-) y no podíamos ejecutar ni un “mv“.
Es decir, teníamos shell y … poco más.
En estas le comento y por qué no metemos un busybox, no tiene dependencias (compilado estático) y tenemos todo!
Se quedó un poco parado por lo de busybox, no lo había oido nunca, asi que como muestra un botón, cogí mi android, puse el terminal emulator y ejecuté:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
dodger:~ $ busybox
BusyBox v1.10.3 (2010-10-13 23:52:46 CEST) multi-call binary
Copyright (C) 1998-2007 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as!

Currently defined functions:
        [, [[, addgroup, adduser, ar, ash, awk, basename, bunzip2, bzcat, bzip2, cat, chgrp, chmod, chown, chroot, chvt, clear, cmp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, deluser, df, diff, dirname,
        dmesg, dos2unix, dpkg, dpkg-deb, du, echo, env, expr, false, fdisk, find, fold, free, getopt, getty, gunzip, gzip, halt, head, hexdump, hostid, hostname, hwclock, id, ifconfig, ifdown, ifup, inetd, init, insmod,
        install, ip, kill, killall, killall5, klogd, less, linuxrc, ln, logger, login, logname, losetup, ls, lsmod, md5sum, mdev, mkdir, mknod, mkswap, mktemp, modprobe, more, mount, mv, netstat, nice, nslookup, od, openvt,
        passwd, patch, pidof, ping, pivot_root, pkill, poweroff, printf, ps, pwd, rdate, readlink, reboot, reset, rm, rmdir, rmmod, route, run-parts, sed, sh, sha1sum, sleep, sort, start-stop-daemon, strings, stty, su,
        sulogin, swapoff, swapon, sync, syslogd, tail, tar, tee, telnet, telnetd, test, time, top, touch, tr, traceroute, true, tty, udhcpc, umount, uname, uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode,
        vi, vlock, wc, wget, which, whoami, xargs, yes, zcat, zcip

Para cualquier amante de trastear routers y cualquier cosa con un linux embebido es el pan de cada día, pero si no te has puesto puede sonar un poco a chino.

Asi que subimos con netcat (esto pa otro día) el busybox compilado para rhel4 de dag.wieers y listo! Comandos básicos ready-to-go.

Hoy comentando con un compañero un filesystem (una partición) que se estaba quedando sin espacio, le he indicado que usase el pbzip2, que lo había dejado yo instalado hace unos días por el mismo problema (y unos ficheros de log enormes).

La verdad es que la teoría es bastante simple, ya que lo único que añade es la opción de paralelismo (pbzip2) sobre bzip2, pero el resultado es bastante impresionante si no quieres esperar a que termine la compresión para irte a casa:

1
2
3
4
5
6
[SERVER02].root:/logs/common/core > time bzip2 -9fv core-2559-1321322015
  core-2559-webseald-1321322015: 22.662:1,  0.353 bits/byte, 95.59% saved, 638181376 in, 28161115 out.

real    0m56.240s
user    0m55.379s
sys     0m0.850s

vs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[SERVER02].root:/logs/common/core > time pbzip2 -9fvp16 core-2559-1321322015
Parallel BZIP2 v1.0.5 - by: Jeff Gilchrist [http://compression.ca]
[Jan. 08, 2009]             (uses libbzip2 by Julian Seward)

         # CPUs: 16
 BWT Block Size: 900k
File Block Size: 900k
-------------------------------------------
         File #: 1 of 1
     Input Name: core-2559-webseald-1321322015
    Output Name: core-2559-webseald-1321322015.bz2

     Input Size: 638181376 bytes
Compressing data...
-------------------------------------------

     Wall Clock: 4.103929 seconds

real    0m4.106s
user    0m55.404s
sys     0m0.923s

En este caso lo que se comprime es un core dumped de un proceso interno y la diferencia está clara (aún usando solo 16 cores de los 64 de la máquina).
Eso sí, si hay un sistema de monitorización muy sensible por medio, puede que salte alguna alarma.

EDIT: Añado pigz que aunque soy fan de bzip2, gzip se usa de manera mucho más habitual…