Qmail – Problemas en envíos de mails – Lentitud respuesta al puerto 25


El síntoma era que tardaba unos 5 minutos en contestar el telnet al puerto 25
Por lo que no se podían enviar mails , si recibir.

El problema venia dado porque una de las rbls que usamos estaba inactiva (estaban en periodo de cierre, deja de existir).
Las rbls se configuran dentro del archivo run en /var/qmail/supervise/qmail-smtpd

“-a rwl.dominio.com \

-r “rbl.dominio.com:listado en rbl local” \

-b -r “IM-96Y6-Bxxxxxxxxxxxxxxx33-36QEL.r.mail-abuse.com:blocked using Trend Micro RBL+, please see http://www.mail-abuse.com/cgi-bin/lookup?ip_address=%IP%” \

-B -r “IM-96Y6-xxxxxxxxxxxxxxxxx-36QEL.q.mail-abuse.com:blocked using Trend Micro Network Anti-Spam see http://www.mail-abuse.com/cgi-bin/lookup?ip_address=%IP%” \

-r cbl.abuseat.org \

-r combined.njabl.org \”

Cada lista es la que se pone seguido al parametro -r
“combined.njabl.org” era la del problema,se bajó el servicio, se eliminó esa linea y se levantó el servicio nuevamente y su funcionamiento fue correcto.

qmailctl stop (baja servicio)
vi /var/qmail/supervise/qmail-smtpd/run (edito las rbls)
qmailctl start (levanta servicio)

mysql: reparar tabla por consola / repair table from command line


Para checkear o reparar tablas de mysql por consola, debemos primero ingresar a la base de datos en cuestión:

[factura@localhost ~]$ mysql -uusuario -ppassusuario
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.37 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use dbclientes;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

Luego, podemos hacer un check sobre una tabla específica:

mysql> check table temp_ventas;
+------------------+-------+----------+------------------------------------------------------------------------+
| Table            | Op    | Msg_type | Msg_text                                                               |
+------------------+-------+----------+------------------------------------------------------------------------+
| temp_ventas      | check | error    | Table 'temp_ventas' is marked as crashed and should be repaired        | 
+------------------+-------+----------+------------------------------------------------------------------------+
1 row in set (0.00 sec)

y con un resultado como este, realizar un repair:

mysql> repair table temp_ventas;
+------------------+--------+----------+--------------------------------------+
| Table            | Op     | Msg_type | Msg_text                             |
+------------------+--------+----------+--------------------------------------+
|      temp_ventas | repair | warning  | Number of rows changed from 13 to 14 | 
|      temp_ventas | repair | status   | OK                                   | 
+------------------+--------+----------+--------------------------------------+
2 rows in set (0.03 sec)

cerrar conexiones TCP / killing tcp connections


Si alguna vez tuvimos un servidor bajo ataque, seguramente hemos tenido la necesidad de cerrar o matar determinadas conexiones a nuestro servidor. Con un netstat, vemos la conexión, pero no tenemos opción de matarla.

Para ello, podemos utilizar el comando tcpkill, que viene en el paquete dsniff, junto con otras utilidades de línea de comandos.

Así que si no lo tenemos, primero, lo instalamos:

$ sudo yum install dsniff

Luego, podremos utilizar el tcpkill de diferentes maneras, por ejemplo:

# tcpkill −9 host www.gmail.com
# tcpkill −9 192.168.0.1
# tcpkill −9 host hvivani.com.ar and host www.google.com

Se sienten mas tranquilos ahora ?

Utilizar Lista de Parámetros en Stored Procedure


Tal vez se encuentren en la situación, donde deban pasarle una lista variable de parámetros a un sp. Por ejemplo, supongamos que se seleccionan los id de cliente 1,27,345,73 y deben pasarse a un sp que debe consultar los datos de los id de cliente seleccionados.

Tenemos varias soluciones posibles, inclusive, en SQL Server 2008 es posible solucionarlo utilizando un xml pasado por parámetro, pero vamos a aproximar una solución mas general, que nos sirva para diferentes motores.

Lo que hacemos es crear una función, a la que le pasamos la lista de ids separada por comas, y nos devolverá los id en una tabla que utilizaremos para filtrar los ids en la consulta de clientes.

La función:

CREATE FUNCTION intlist_to_tbl
(@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) 
AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END

El procedimiento:

CREATE PROCEDURE consultarListaClientes 
@ids varchar(50) 
AS
   SELECT id, razonsocial
   FROM   clientes 
   inner join intlist_to_tbl(@ids) i ON clientes.id = i.number

La llamada:

EXEC consultarListaClientes '1, 27, 345, 73'

Vale aclarar que esta solución no es la mas rápida, en terminos de velocidad, si la cantidad de ids a consultar es muy grande, será lenta, pero nos servirá para resolver muchas situaciones simples.

Actualizar Mapas Garmin Argentina bajo Linux


Para actualizar los mapas de un gps Garmin desde Linux, hay un procedimiento muy simple:

Desde el sitio del Proyecto Mapear, descargamos el último “Mapear en Archivo Directo”. (Descargas –> ProyectoMapear). Por ejemplo el MapearV102GPS.exe

Una vez descargado lo instalamos con wine:

$ wine MapearV102GPS.exe

Screenshot from 2013-04-23 18:46:05

Este proceso descomprimirá un archivo llamado GMAPSUPP.img que contiene la última versión de todos los mapas de la argentina.

Por defecto, al finalizar el proceso lo encontraremos en:

/home/usuario/.wine/drive_c/Garmin/GMAPSUPP.img

Lo unico que resta por hacer es copiar este archivo .img a la tarjeta SD de nuestro GPS Garmin.

Consideraciones:

– En el gps debe existir la carpeta Garmin y dentro de esta deberá colocarse el img.

– Es una sana costumbre hacer un backup o guardar el .img anterior por las dudas.

– Los dispositivos viejos leen solo un img. Si por alguna razón tenemos que poner mas de un img, antes debemos unirlos con por ej.: mkgmap

– Para confirmar que los mapas se cargaron con exito reiniciamos el dispositivo y veremos el cartel Loading Maps…

– También podemos verificarlo en el dispositivo en Tools/Settings/Map/Map Info

– Las tarjetas de memoria debe estar formateadas en FAT32, con su consiguiente limitación en tamaño por archivo de 4Gb.

Actualizar Mapas Garmin Argentina


Estos son los pasos para actualizar los mapas de Argentina en un gps Gamin:

1) De la página de Garmin descargamos el Garmin Training Center para Windows

2) Desde la página de Garmin también, descargamos el MapSource

3) Desde el proyecto mapear, descargamos la ultima versión de los mapas. Versión para MapSource. Hay que registrarse en el sitio.

4) Instalamos los programas de los puntos 1) y 2)

5) Abrimos el MapSource y seleccionamos del menú PC Base Map. Ubicamos el archivo descargado de mapear y lo seleccionamos.

6) Veremos un mapa de Argentina con todas las regiones para seleccionar. Las seleccionamos todas.

7) Conectamos el GPS con el cable USB y presionamos el botón “Send To Device”. En la opción “What to Send” debe estar seleccionado “maps”.

Una vez finalizada la carga, tendremos los mapas actualizados y listos para usar.

Utilizando parámetros opcionales en Sql Server Stored Procedure


Supongamos que tenemos un programa que realiza una consulta a una base de datos sql server a través de un stored procedure. Ese programa debe pasarle parámetros, o no, en función de las selecciones del usuario.

En otro post, vimos como podemos pasarle parametros null a un stored procedure. Ahora vamos a utilizarlo para armar una consulta de acuerdo a criterios variables:

CREATE procedure [dbo].[ConsultaPorCriterios]
@idProvincia int,
@superficieMin float,
@superficieMax float,
@dni as varchar(10)
AS

select   idProvincia
        , superficie
        , dni
from tablita
where    (idPersona = @idPersona or @idPersona is null) and
         ((superficie between @superficieMin and @superficieMax) or @superficieMax is null) and
         (dni = @dni or @dni is null)

Pasando parametros null a Sql Server


Aquí un pequeño ejemplo de como pasar parámetros null con C# a un stored procedure en sql server:

        public DataTable Consulta(int? id)
        {
            string[] NomParam = new string[] { "id"};
            object[] arg = new object[] { id == null ? System.Data.SqlTypes.SqlInt32.Null : Int32.Parse(id.ToString()) };

            return conn.execSP("spConsula", arg, NomParam);
        }

El parámetro debe declararse con el simbolo “?” que le indica al compilador que puede venir un null en vez de un int. Luego, el tipo de datos es convertido a su equivalente nulo para sql server, de manera que interprete que es un parámetro con valor null y no que falta un parámetro.