Registrar información más detallada en el log de exim

Exim va escribiendo en un archivo de log todas las peticiones de conexión que se realizan al servidor. Quedan registradas las IP’s, emails, y las sesiones que se crean y se cierran, así como si la conexión ha sido correcta o ha habido algún error. En general, es información más que suficiente. Aún así hay algo que no se guarda en el log y que puede sernos útil. En concreto, vamos a ver cómo guardar también un registro de los emails eliminados, o movidos de carpeta. Vamos allá:

El fichero en el que queda registro de toda actividad, en mi caso es /var/log/maillog y tiene una pinta parecida a esta:

Sep 11 11:37:06 servername dovecot: imap-login: Login: user=<user@example.com>, method=PLAIN, rip=123.456.789.123, lip=123.456.789.123, mpid=9007, TLS, session=<QVpx3dfsC1DU>

Sep 11 08:25:03 servername dovecot: pop3(user@example.com): Disconnected: Logged out top=0/0, retr=2/41769, del=1/47, size=15946098, bytes=50/43374

Sep 11 08:45:10 servername dovecot: imap(user@example.com): Logged out in=409, out=1405, bytes=409/1405

En la primera linea, el usuario se ha conectado y muestra la IP remota (rip), la IP local (lip), así como el tipo de conexión (TLS) y el identificador de la sesión al final. También nos indica que ha sido una conexión usando imap.

En la segunda línea, el usuario se ha desconectado de su sesión, su conexión era de tipo pop3 y hay un parámetro, que he resaltado en negrita que dice del=1/47. Esto nos indica que durante la sesión, ese usuario ha borrado 1 mensaje de los 47.

En la tercera linea, también se han desconectado de una sesión, en este caso imap, pero ahí sólo aparece los bytes que se han recibido/enviado (in/out) durante la conexión.

Para detallar más el log, hay que activar el plugin MailLog de exim. Esto nos dará detalles sobre los emails eliminados, movidos de una carpeta a otra, ¡perfecto!

Lo primero es editar el fichero de configuración de devecot

nano /etc/dovecot/dovecot.conf

Y buscaremos la linea que contiene mail_plugins, y añadiremos los plugins mail_log notify. En micaso quedará así

mail_plugins = quota quota_clone mail_log notify

Luego, buscaremos dentro de ese mismo fichero el apartado de Plugin settings y deberemos escribir estas lineas:

##
## Plugin settings
##

plugin {

  # Events to log. Defined in src/plugins/mail-log/mail-log-plugin.c - also available: flag_change save mailbox_create
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename

  # Also available: Defined in src/plugins/mail-log/mail-log-plugin.c - flags vsize from subject
  mail_log_fields = uid box msgid size
  (...)

Ya está, sólo tendremos que reiniciar el servicio

/etc/init.d/dovecot restart

Ahora, si borramos o movemos un email dentro de nuestro cliente de correo, quedará detallado en el log. Se verá algo así:

Sep 13 11:46:02 servername dovecot: imap(user@example.com): copy from INBOX: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:02 servername dovecot: imap(user@example.com): expunge: box=INBOX, uid=4750, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:16 servername dovecot: imap(user@example.com): delete: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Eso sí, contad conque el log aumentará considerablemente de tamaño cada día.

Un saludo!

Localizar enlaces rotos con wget

Ahí van un par de comandos que te ayudarán a localizar los enlaces rotos de una web tales como imágenes que ya no existen, enlaces que nos llevan a un error 404, o archivos css que no están donde deberían. Sólo haremos uso del comando wget, para identificarlos de la siguiente manera:

wget --spider -r -l 5 -nd -nv -w 5 -o output.log http://example.com

Los parámetros del comando hacen lo siguiente:

  • –spider , no almacena nada, tan sólo actúa como si de un bot de Google se tratara.
  • -r , lo hace de manera recursiva, es decir, de cada página, buscará los links que existan para seguirlos y continuar
  • -l 5 , esto seguirá recursivamente hasta 5 niveles de links (podemos omitirlo, wget por defecto usa -l 5)
  • -nd , no creará los directorios en local al escaner la web
  • -nv , hará que no muestre nada por pantalla (lo estamos almacenando en output.log)
  • -w 5 , hará que wget espere 5 segundos entre cada petición, útil si quieres que tu servidor web no quede saturado durante el proceso
  • -o output.log , guardará todo el registro de la actividad en un fichero llamado output.log
  • http://example.com , la web que queremos auditar

Una vez haya terminado wget, podremos abrir el fichero ouput.log, para ver los resultados. Para localizar los enlaces rotos fácilmente, podemos usar grep de la siguiente manera:

grep "broken link!" -B1 output.log

Las opciones que aquí tenemos son:

  • «broken link!» , la cadena de texto a buscar, en este caso filtramos por los enlaces rotos. Si usas wget en otro idioma, quizás necesitarás filtrar por otra palabra.
  • -B1 , mostrará la linea que contiene la cadena buscada y justo la anterior (Before 1)
  • output.log, el fichero en el que vamos realizar la búsqueda

Con este sencillo proceso, podremos obtener un listado de enlaces rotos que nos ayudará a localizar problemas en cualquier web.

Apache, MySQL, PHP y otros imprescindibles para mi servidor CentOS 6.6

Acabo de instalar CentOS 6.6 en mi servidor, y ahora ¿qué?

Primer login

Tras instalar CentOS 6.6 minimal, nos encontramos con un terminal de login sin entorno gráfico. Sólo tenemos un usuario (root) así que haremos login usando el password que hemos indicado durante la instalación.

Conexión a internet

Una vez dentro, podemos comprobar que no tenemos conexión a internet, ni con el cable de red contectado:

[root@server ~]# ping www.google.com
ping: unknown host www.google.com

Veamos si están detectadas las tarjetas ethernet, antes de continuar:

[root@server ~]# ifconfig -a
eth0  Link encap:Ethernet HWaddr 12:34:56:67:89:01 
      BROADCAST MULTICAST MTU:1500 Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
      Interrupt: 16

eth1  Link encap:Ethernet HWaddr 12:34:56:67:89:01 
      BROADCAST MULTICAST MTU:1500 Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
      Interrupt: 17

lo    Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING MTU:65536 Metric:1
      RX packets:12 errors:0 dropped:0 overruns:0 frame:0
      TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:836 (836.0 b) TX bytes:836 (836.0 b)

Perfecto, el sistema nos muestra todas las intefaces disponibles. En este caso eth0 y eth1, así como localhost. Yo he conectado el cable RJ45 en el interfaz eth0, así que vamos a intentar autoconfigurarlo mediante DCHP. Tan sencillo como lanzar dhclient.

[root@server ~]# dhclient
... cuando termine, tras algunos segundos ...
[root@server ~]# ifconfig eth0
eth0   Link encap:Ethernet HWaddr 12:34:56:67:89:01 
       inet addr:192.168.1.123 Bcast:192.168.1.255 Mask:255.255.255.0
        inet6 addr: 0123::4567:89ab:cdef:0112/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
        RX packets:153 errors:0 dropped:0 overruns:0 frame:0
        TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000 
        RX bytes:47802 (46.6 KiB) TX bytes:1312 (1.2 KiB)
       Interrupt: 16

Actualizar el sistema

Perfecto, siguiente paso. Vamos a actualizar el sistema. Aunque acabo de instalarlo, seguramente haya actualizaciones de seguridad disponibles, así que vamos a ello.

[root@server ~]# yum -y update

... tras algunas comprobaciones nos hará un resumen de las actualizaciones disponibles ...

Transaction Summary
==========================================
Install        1 Package(s)
Upgrade       51 Package(s)

Total download size: 83 M

Escribimos y para proceder descargar e instalar las actualizaciones disponibles. Es posible que algún paquete requiera de alguna interacción, así que mejor estar delante del monitor.

Instalamos Gnome

Si, es verdad, un servidor no requiere un entorno gráfico, y aunque siempre entro mediante SSH, me resulta muy cómodo tenerlo Gnome listo en caso de necesitar usarlo.

El siguiente comando instalará todo lo necesario para disponer de X Window y Gnome

[root@server ~]# yum -y groupinstall "Desktop" "Desktop Platform" "X Window System" "Fonts"

... tras algunas comprobaciones comenzará la instalación ...
Transaction Summary
==========================================
Install 295 Package(s)

Total download size: 912 M

Esto deberá descargar 1GB aproximadamente. Usando el parámetro -y forzmos a responder siempre «si» en caso de pregunta durante la instalación.

Cuando acabe, tendremos que configurarlo para que se inicie en modo gráfico cada vez que arranque (si queremos). Hacer esto es tan sencillo como modificar la línea «id:3:initdefault:» por «id:5:initdefault:» en el fichero inittab:

[root@server ~]# vi /etc/inittab

Si no te gusta vi, puedes descargar nano: yum -y install nano

Ahora sólo queda reiniciar el sistema usando el comando

[root@server ~]# init 6

Al reiniciar, entraremos en un asistente, en el que nos guiará para crear usuarios y configurar la fecha del sistema/NTP de manera muy sencilla.

Vaya, otra vez sin conexión a internet?

Pues sí, debemos lanzar dhclient cada vez que queramos autoconfigurar la red. Aunque, ya que hemos instalado Gnome, configurar esto para que se ejecute al inicio de manera automática es muy sencillo:

  1. Editamos las conexiones de red,
  2. Seleccionamos eth0 (o el que necesites)
  3. Seleccionames el checkbox de conectar automáticamente.

eth0-auto

Para que nuestro servidor se convierta de verdad un servidor,deberemos instalar Apache, MySQL y PHP.

Instalar Apache

Facilísimo, sólo es necesario ejecutar:

[root@server ~]# yum install httpd

Ya está instalado! Ahora sólo tenemos que levantar el servicio:

[root@server ~]#  service httpd start

Y para comprobar que funciona correctamente, podemos instalar y ejecutar nuestro navegador favorito y comprobar la web por defecto:

[root@server ~]# yum -y install firefox && firefox 127.0.0.1

apache-installed

Instalando MySQL

Instalar MySQL también será muy sencillo. El siguiente comando instala y levanta el servicio MySQL.

[root@server ~]# yum -y install mysql-server && service mysqld start

Por seguridad, vamos a establecer una contraseña de root para MySQL y a eliminar usuarios anónimos:

[root@server ~]# /usr/bin/mysql_secure_installation

... tras responder a unas sencillas preguntas ... 

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Instalando PHP

Instalar PHP es igual de sencillo que instalar Apache y MySQL.

[root@server ~]# yum install -y php php-mysql pgp-gd php-mbstring

Deberemos reiniciar Apache, para que cargue PHP.

[root@server ~]# service httpd restart

Vamos a ver si ha funcionado. Crearemos un pequeño archivo PHP que nos mostrará información de la versión actual y la configuración.

[root@server ~]# echo "<?php phpinfo();" > /var/www/html/phpinfo.php && firefox 127.0.0.1/phpinfo.php

Si la página carga correctamente, ya está listo.

Configurar inicio automático de MySQL y Apache

Para que al reiniciar la máquina se inicie apache y mysql, deberemos ejecutar:

[root@server ~]# chkconfig httpd on && chkconfig mysqld on

Problemas que puedes encontrar

Problem: Funciona todo, pero no puedo acceder desde una máquina remota a la página de prueba de Apache.

Es probable que debas configurar iptables.

[root@server ~]# iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
[root@server ~]# /etc/init.d/iptables save

 

Problem: Necesito otra versión de PHP, la 5.3.3 que se incluye en CentOS 6.6 no me sirve.

Yo he usado los repositorios de Remi, siguiendo este tutorial: https://www.mojowill.com/geek/howto-install-php-5-4-5-5-or-5-6-on-centos-6-and-centos-7/

Otras aplicaciones que pueden resultar útiles

[root@server ~]# yum -y install gedit nano thunderbird gnome-disk-utility gnome-utils wget gcalctool evince libreoffice libreoffice-langpack-ca libreoffice-langpack-es libreoffice-langpack-en unzip zip p7zip transmission git-gui git rsync curl filezilla htop links nmap telnet 

Bibliografía

http://wiki.centos.org/FAQ/CentOS6

*ttp://www.sysads.co.uk/2014/01/installing-gnome-gui-centos-6-5/

https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-6

http://stackoverflow.com/a/19569280

Cómo activar el log de MySQL

mysql

Si dispones una versión de MySQL superior a la 5.1.29, puedes activar el log de toda la actividad de la base de datos de la siguiente manera (atención, necesitas ser root):

  1. Edita el fichero /etc/my.cnf
  2. Añade una línea al final del fichero que contenga: general_log_file=/ruta/a/tu/fichero.log

Reinicia el servicio de MySQL y cuando se haya levantado de nuevo, entra en MySQL y ejecuta la sentencia:

SET global general_log = 1;

Ya está, ahora puedes ver qué está haciendo MySQL en tiempo real con tan sólo escribir:

tail -f /ruta/a/tu/fichero.log

Según la cantidad de tráfico que tengas en tu servidor, el fichero puede llegar a ocupar mucho espacio, así que recuerda echarle un vistazo de vez en cuando.

Laravel 5

LARAVEL

Hace tan sólo unos días que la versión 5 de Laravel ha llegado. Tras hacer algunas pruebas, he encontrado que, a pesar de ser uno de los frameworks mejor documentados, hay algunas cosas que no están explicadas. Aquí van un par de ellas:

Problema: He instalado Laravel y sólo veo el árbol de directorios/archivos.

Solución: Si usas Apache, lo más probable sea que necesites el fichero .htaccess en la raíz del DocumentRoot.

RewriteEngine On

RewriteRule ^(.*)$ public/$1 [L]

si ese no funciona, prueba con este

RewriteEngine On

RewriteBase /
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond /public/%{REQUEST_URI} -d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /public/$1/

RewriteBase /
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /public/$1

RewriteBase /
RewriteRule ^(/)?$ /public/index.php [L]

Problema: veo una página en blanco, pero no aparece la vista de welcome de Laravel.

Solución: Si estás trabajando en local (en un entorno de desarrollo) lo más probable es que sea un problema de permisos. La solución rápida es abrir un terminal y escribir:

cd /path/de/mi/proyecto/laravel/
chmod 777 * -R

Atención! Si estás en un entorno de producción, eso es una barbaridad! Lee la documentación de Laravel para conocer qué permisos son los adecuados.

Otra recomendación es configurar laravel en modo debug, para que muestre el error en tu navegador, seguro que te da alguna pista útil. Para hacerlo, hay que modificar el fichero config/app.php y en la linea que pone ‘debug’ escribir:

 'debug' => true,

Problema: No tengo tabla de usuarios en Laravel!

Solución: Sólo necesitas lanzar el comando migrate de artisan

Ahora Laravel tiene preinstalado un sistema de registro y login de usuarios. Es muy cómodo porque después de una instalación ya tienes disponible un template de ejemplo en http://tudominio/home con un bonito formulario hecho con bootstrap:

sreenshot-laravel5
Screenshot Laravel 5

Pero al intentar registrar un usuario o hacer login, aparece el siguiente error:

QueryException in Connection.php line 614:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.users' doesn't exist (SQL: select count(*) as aggregate from `users` where `email` = my@email.com )

Para arreglarlo, sólo es necesario lanzar el artisan migrate:

cd /path/de/mi/proyecto/laravel/
php artisan migrate

Y creará una hermosa tabla de usuarios. Si prefieres crear la tabla a mano (no recomendado) aquí la tienes para MySQL.

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

--
-- Indexes for table `users`
--
ALTER TABLE `users`
 ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `users_email_unique` (`email`);

--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
 MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;

Suerte!

qTranslate y WordPress

Si usas el plugin qTranslate en un WordPress más nuevo que la versión 3.8.1, lo más probable es que al editar páginas ( o cualquier contenido traducible ) aparezca un error en el backend con el siguiente texto:

The qTranslate Editor has disabled itself because it hasn't been tested with your WordPress version yet. This is done to prevent WordPress from malfunctioning. You can reenable it by clicking here (may cause data loss! Use at own risk!). To remove this message permanently, please update qTranslate to the corresponding version.

El caso es que qTranslate, ha dejado de desarrollarse, por lo que hay dos opciones.

  1. Utilizar mqTranslate, un fork basado en el propio qTranslate y totalmente compatible (más info aquí)
  2. Arreglar qTranslate.

Si tu opción es arreglar qTranslate, debes saber que es bastante sencillo, y que funcionará correctamente – comprobado – hasta con la vesión 4.1 de wordpress (la versión más nueva hasta el día de escribir estas líneas).

Lo único que debes hacer es i) dirigirte al directorio siguiente de tu instalación de wordpress:

/wp-content/plugins/qtranslate

ii) Hacer una copia de seguridad del fichero qtranslate.php

iii) Localizar la línea en que aparece define(‘QT_SUPPORTED_WP_VERSION’, ‘3.8.1’) y sustituir el valor de la constante por tu versión de WordPress. En el caso de la versión 4.1, deberás escribir lo siguiente:

define('QT_SUPPORTED_WP_VERSION', '4.1');

Con esto debería quedar solucionado, aunque con el tiempo es más que probable que haya que migrar definitivamente a mqTranslate.

Suerte!

Instalar LAMP con un solo comando en Ubuntu

Atención, este artículo está desactualizado y puede no ser válido para ediciones recientes de Ubuntu

¿Qué es LAMP?

LAMP es el acrónimo de Linux + Apache + MySQL + PHP, y describe una plataforma de desarrollo web que utiliza Linux como Sistema Operativo, Apache como servidor Web, MySQL como Sistema Gestor de Bases de Datos relacional y PHP como lenguaje de programación.

¿Qué necesito para instalarlo?

Para instalarlo necesitas tener cualquier distribución Linux, yo usaré Ubuntu 10.10 como sistema operativo (aunque el proceso debería ser similar en otras distribuciones), y descargar una aplicación de Debian llamada tasksel. Esta aplicación, agrupa varias aplicaciones por tareas y ofrece al usuario una manera fácil de instalar paquetes según tus necesidades. Para instalarlo, necesitamos escribir en un terminal

pedro@pedro-laptop:~$ sudo apt-get install tasksel

Ya tengo tasksel, ¿y ahora qué?

Una vez instalado, ejecutamos tasksel que será el que haga todo lo necesario para preparar nuestro entorno LAMP

pedro@pedro-laptop:~$ sudo tasksel

Menú inicial de tasksel
Menú inicial de tasksel

Una vez lleguemos a este menú, solo tendremos que seleccionar LAMP Server utilizando la barra espaciadora, y ya que estamos, puedes instalar cualquier otra cosa que necesites. Despues sólo tienes que ir al botón de Ok utilizando el tabulador, y empezará la instalación!

Proceso de instalación de LAMP
Proceso de instalación de LAMP

Deberemos rellenar la contraseña que queramos poner al usuario root de MySQL (y luego nos pedirá repetirla por si acaso).

Contraseña de root en MySQL
Contraseña de root en MySQL

Y ya está listo!!

Podemos comprobar si Apache está funcionando abriendo nuestro navegador favorito y escribiendo http://127.0.0.1/ en la barra de direcciones. Si aparece la siguiente imagen, es que Apache funciona bien!!

Comprobación de Apache
Comprobación de Apache

Apache funciona, pero ¿qué pasa con PHP?

Para probar PHP, puedes generar un phpinfo. Para hacerlo sólo tienes que crear un archivo que se llame /var/www/phpinfo.php. Puedes hacerlo de la siguiente manera:

pedro@pedro-laptop:~$ nano /var/www/phpinfo.php

Y escribir en el editor:

<?php
phpinfo();
?>

Si al visitar http://127.0.0.1/phpinfo.php aparece algo similar a lo que se muestra en la imagen siguiente, es que todo está correcto.

Comprobación de PHP
Comprobación de PHP

¿Ya está? Qué facil!

Ya estas preparado para empezar a programar. El directorio al que apunta por defecto Apache, es /var/www, es allí donde está ubicado index.html y phpinfo.php con el que hemos probado el funcionamiento de Apache y PHP respectivamente.

Personalmente, como complemento imprescindible a todo LAMP, simpre instalo phpmyadmin, un gestor para MySQL que nos facilitará mucho las cosas cuando queramos trabajar con Bases de Datos. Para hacerlo:

pedro@pedro-laptop:~$ sudo apt-get install phpmyadmin

Durante el proceso de instalación nos preguntará qué servidor web es el que utilizaremos, en nuestro caso Apache, así que lo seleccionamos con el espacio y presionamos Ok.

Instalación de phpMyAdmin
Instalación de phpMyAdmin

A continuación nos preguntará si queremos que se configure automáticamente o por el contrario no hacer nada. Si te atreves a configurarlo manualmente (modificando los archivos de configuración) haz clic en No, pero es más cómodo hacer clic en Yes.

Instalación de phpMyAdmin
Instalación de phpMyAdmin

También necesitaremos proporcionar la contraseña que previamente habíamos utilizado al configurar MySQL, así que la escribimos (luego nos la volverá a pedir para confirmar).

Instalación de phpMyAdmin
Instalación de phpMyAdmin

Ahora también tenemos listo nuestro phpMyAdmin. Podemos comprobar que funciona correctamente si visitamos http://127.0.0.1/phpmyadmin.

Comprobación de phpMyAdmin
Comprobación de phpMyAdmin

Voilà!! Ya podemos crear fácilmente tablas, bases de datos para jugar con MySQL!! 😀

Página principal de phpMyAdmin
Página principal de phpMyAdmin

Al final no ha sido un solo comando, pero casi!! Ahora nos queda lo más divertido: empezar a programar en PHP para hacer aplicaciones libres!!