Error en exim: Initialization failed: namespace configuration error

Si te encuentras con este error en el el log de dovecot, solucionarlo es bastante fácil, de hecho, está escrito en el propio error. El error en cuestión es:

Error: user your@username.tld: Initialization failed: namespace configuration error: inbox=yes namespace missing

Para solucionarlo, tan sólo hay que editar el archivo /etc/dovecot/conf.d/*-mailboxes.conf  y añadir lo siguiente dentro de  namespace inbox { }

inbox = yes

Luego tan sólo queda reiniciar exim con el comando:

systemctl restart exim.service

Y listo! ya tenemos funcionando de nuevo el email

Nota: También podemos añadir la linea auto=subscribe en cada mailbox para que quede así:

mailbox Trash {
  auto = subscribe
  special_use = \Trash
}

Ahora cualquier cliente de correo, al configurar esa cuenta, se suscribirá por defecto a la carpeta de Trash.

Modificar las conexiones máximas por IP de dovecot

Mi cliente de email a veces se quejaba de que no podía conectar al servidor. El caso es que la configuración de la cuenta de email era correcta, porque normalmente accedía sin problemas. Pues mirando en /var/log/maillog he visto que aparecía este mensaje:

dovecot: imap-login: Maximum number of connections from user+IP exceeded

He encontrado la solución al problema, sólo es necesario cambiar la configuracíon de la variable mail_max_userip_connections e incrementarlo de manera que permita más conexiones simultáneas. Si el límite de conexiones es muy bajo, es muy facil llegar a él, ya que por cada cuenta de email que tengamos en el servidor, y por cada «carpeta» (Inbox, Spam, Trash, etc..) realiza una conexión individual. Esto optimiza la descarga de emails, pero también debe realizar muchas más conexiones.

Para cambiar este parámetro, editamos el fichero de configuración

nano /etc/dovecot/conf.d/imap.conf

y añadimos un limite de 50 conexiones por IP (o las que necesites)

protocol imap {
   mail_plugins = $mail_plugins autocreate
   mail_max_userip_connections = 50
}

Sólo queda reiniciar el servicio

systemctl restart dovecot.service

Y ya está!

Cómo arreglar el gráfico de uso de memoria de Vesta si no funciona en Centos7

Acabo de realizar una instalación limpia de CentOS7 en mi servidor, seguidamente he instalado la última versión de Vesta, actualmente la Vesta 0.9.8-16, como panel de control y me he dado cuenta de que el gráfico de uso de memoria (Memory Usage) no está mostrando nada. Hace tiempo leí cómo arreglar este problema aquí, y parece que estará corregido para la próxima versión. Aún así dejo el workaround, ya que seguro que resulta útil.

  1. Editamos el fichero /usr/local/vesta/bin/v-update-sys-rrd-mem y buscamos las siguientes líneas de código
     used=$(echo "$mem" |awk '{print $3}'|head -n3 |tail -n1)
     free=$(echo "$mem" |awk '{print $4}'|head -n3 |tail -n1)
  2. Las sustituimos por estas
     used=$(echo "$mem" |awk '{print $3}'|head -n2 |tail -n1)
     free=$(echo "$mem" |awk '{print $4}'|head -n2 |tail -n1)
  3. Guardar, salir y listo!

El truco está en cambiar el head -n3 por head -n2. Por lo visto el resultado del comand free -m es diferente para Centos6 y 7 por lo que necesita ese pequeño ajuste.

Tendremos que esperar un rato para que empezemos a ver los datos que empezarán a entrar en el gráfico, pero acabará viéndose perfectamente, os dejo mi ejemplo!

memory-usage-working-centos7

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!

Comandos útiles para gestionar exim desde el terminal

Acceder por ssh a un servidor remoto para comprobar el estado de los emails es bastante habitual. Exim, es el MTA más común para servidores linux, y es con el que me encuentro a diario. Aquí dejo una lista de comandos que me han resultado útiles en más de una ocasión para el mantenimiento de los servidores.

Mostrar el número de emails en cola

exim -bpc

Eliminar todos los emails en cola

exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash

Mostrar los emails en cola

exim -bp

Se mostrará algo parecido a esto

46h  1.7K 1bi4YL-000123-AB <> *** frozen ***
          root@your-server.net

43h  1.7K 1bi7MY-000123-AB <> *** frozen ***
          root@your-server.net

(...)

Resumen de emails en cola

exim -bp | exiqsumm

Se mostrará

Count  Volume  Oldest  Newest  Domain
-----  ------  ------  ------  ------

   16    27KB     46h     82m  your-server.net
---------------------------------------------------------------
   16    27KB     46h     82m  TOTAL

Actividad actual de exim

exiwhat
783 daemon: -q1h, listening for SMTP on port xxx (IPv6 and IPv4) port xxx (IPv6 and IPv4) port xxx (IPv6 and IPv4) and for SMTPS on port xxx (IPv6 and IPv4)

Mostrar configuración de exim

exim -bP

Mostrar emails enviados desde remitente

exiqgrep -f usuario@dominio.tld

Mostrar emails para un destinatario

exiqgrep -r usuario@dominio.tld

Mostrar emails en cola más antiguos de n segundos (en este ejemplo 1h)

exiqgrep -o 3600

Mostrar emails en cola creados hace menos de n segundos (en este ejemplo 1h)

exiqgrep -y 3600

Comprobar la ruta de una direccion de email

exim -bt usuario@dominio.tld
test@gmail.com
  router = dnslookup, transport = remote_smtp
  host gmail-smtp-in.l.google.com      [2a00:1450:400c:c08::1a] MX=5
  host gmail-smtp-in.l.google.com      [74.125.140.27]          MX=5
  host alt1.gmail-smtp-in.l.google.com [2a00:1450:4010:c03::1a] MX=10
  host alt1.gmail-smtp-in.l.google.com [209.85.233.27]          MX=10
  host alt2.gmail-smtp-in.l.google.com [2404:6800:4003:c01::1a] MX=20
  host alt2.gmail-smtp-in.l.google.com [74.125.130.27]          MX=20
  host alt3.gmail-smtp-in.l.google.com [2404:6800:4008:c03::1a] MX=30
  host alt3.gmail-smtp-in.l.google.com [74.125.203.27]          MX=30
  host alt4.gmail-smtp-in.l.google.com [2404:6800:4008:c01::1a] MX=40
  host alt4.gmail-smtp-in.l.google.com [173.194.72.26]          MX=40

Procesar los emails en cola

exim -q -v

Eliminar un email concreto de la cola

exim -Mrm <id_email>
Message 1bi4YL-000123-AB has been removed

Congelar un email (no se enviará)

exim -Mf <id_email>

Procesar un email tanto si está congelado como si no (se enviará)

exim -M <id_email>

Forzar el fallo de un email y retornar el estado «cancelado por administrador»

exim -Mg <id_email>

Eliminar todos los emails congelados

exiqgrep -z -i | xargs exim -Mrm
Message 1bi4YL-000123-AB has been removed
(...)
Message 1bi7MY-000123-AB has been removed

Eliminar emails más antiguos de n segundos (en este ejemplo 1h)

exiqgrep -o 3600 -i | xargs exim -Mrm

Congelar todos los emails de un remitente

exiqgrep -i -f usuario@dominio.tld | xargs exim -Mf

Mostrar las cabeceras de un email

exim -Mvh <id_email>

Mostrar el contenido del email

exim -Mvb <id_email>

Mostrar el log de un email

exim -Mvl <id_email>

Añadir un destinatario a un email

exim -Mar <id_email> usuario@dominio.tld [ <usuario2@dominio.tld> [...] ]

Modificar el remitente de un email

exim -Mes <id_email> usuario@dominio.tld

Parar exim (diferentes maneras según tu sistema operativo)

systemctl stop eximd.service
service exim stop
/etc/init.d/exim stop

Iniciar exim (según tu sistema operativo)

systemctl start eximd.service
service exim start
/etc/init.d/exim start

Reiniciar exim (según tu sistema operativo)

systemctl restart eximd.service
service exim restart
/etc/init.d/exim restart

Comprobar el estado de exim (según tu sistema operativo)

systemctl status eximd.service
service exim status
/etc/init.d/exim status

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.

Uso práctico de GPG: cifrando y descifrando archivos

GPG es el acrónimo de GNU Privacy Guard, un sistema de cifrado de código abierto. Los usos más populares vienen de la mano de envío de emails cifrados o con firma digital, pero hoy vamos a ver cómo cifrar (que no encriptar) un archivo cualquiera, para poder enviarlo asegurándonos de que nadie más que el destinatario va a poder recibirlo. Eso sí, tanto remitente como receptor, deben conocer la clave de cifrado.

Cifrar un archivo

He creado un archivo de texto plano, en el que he escrito un mensaje.

user@my-laptop:~$ cat mi-archivo.txt
Shhhh... Este es un mensaje secreto...

Para cifrarlo, sólo tendremos que hacer lo siguiente:

user@my-laptop:~$ gpg -c mi-archivo.txt 
Enter passphrase: <poner aquí cualquier clave>
Repeat passphrase: <repetir aquí la misma clave>

El archivo cifrado se llamará igual que el original, pero añadiendo la extensión .gpg. Esto genera un archivo llamado, en mi caso, mi-archivo.txt.gpg. Veamos qué contiene:

user@my-laptop:~$ cat mi-archivo.txt.gpg
/�4G��`�H��J%,����0�er�]�&
>�^�*�[�s���(^���=SoUDZ��-y��pV>�4bˑE��=H

Perfecto, listo para enviar sin preocuparnos de nuestra privacidad.

Cabe decir, que es un buen sistema para guardar información (imágenes, backups, o cualquier archivo) de manera segura en servicios en la nube poco securos como Dropbox o Google. Si por algún motivo olvidas la contraseña, puedes olvidarte de recuperar el contenido.

Cómo descifrar el archivo

Descifrarlo es, si cabe, aún más facil que cifrarlo. Veamos como descifrar el arhivo de antes:

user@my-laptop:~$ gpg mi-archivo.txt.gpg 
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
Enter passphrase: <usar la misma clave de antes>
user@my-laptop:~$ cat mi-archivo.txt
Shhhh... Este es un mensaje secreto...

Yuhuuu! ya lo tenemos de vuelta 🙂

(gnome-ssh-askpass:3270): Gtk-WARNING **: cannot open display:

Más que un post, es una autonota, pero allá va.

Recientemente, tras installar un servidor con CentOS 6.6 y su entorno gráfico Gnome, me he encontrado con que al usar GIT para hacer un fetch de la última versión del repositorio, desde una conexión remota con SSH, lanza el siguiente error:

[root@SERVER html]# git fetch
(gnome-ssh-askpass:3270): Gtk-WARNING **: cannot open display:

Al parecer, al haber instalado Gnome, intenta lanzar la ventana de «introduzca password» del repositorio GIT, pero al estar conectado por SSH, no tengo entorno GTK. La solución es bien sencilla. Ejecutamos el siguiente comando y listo.

[root@SERVER html]# unset SSH_ASKPASS

Cada vez que iniciemos sesión, necesitaremos desactivar el SSH_ASKPASS, por lo que os recomiendo añadirlo en .bashrc para mayor comodidad.

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!

Backlight de la pantalla de Acer

Atención! Este artículo puede estar obsoleto. En nuevas versiones de Linux Mint (a partir de la 17.3) ya está solucionado y no es necesario tocar nada para que funcione correctamente.

Me he encontrado en las últimas versiones de Ubuntu y Linux Mint que no funciona correctamente la opción de subir o bajar el brillo de la pantalla en mi portátil Acer, utilizando las teclas [Fn] + izq/der. No sé a que puede ser debido que en las últimas versiones falle, cuando antes funcionaba perfectamente, pero he encontrado aquí cómo solucionarlo:

Editar como root el fichero /etc/default/grub

y en la linea que empieza conGRUB_CMDLINE_LINUX

debe quedar de la siguiente manera:GRUB_CMDLINE_LINUX="quiet splash acpi_osi=Linux acpi_backlight=vendor"

Tras hacer el cambio, ejecutarsudo update-grub

y reiniciar el PC.

Con esto se soluciona el problema. 🙂