Crear un nuevo device.map para el GRUB


Puede que luego de añadir discos necesitemos crear nuevamente el mapa de dispositivos del GRUB:

Para eso primero renombramos el map existente:
# mv /boot/grub/device.map /boot/grub/device.map.bak

Generamos uno nuevo:
# grub –device-map=/boot/grub/device.map
esto nos mostrara el prompt de GRUB, del que salimos con quit   y tendremos listo el nuevo device.map

Creando RAID 1 por software


En un par de discos nuevos en un servidor vamos a crear un
RAID 1 (espejo) para tener algo de tolerancia a fallos:

Identificamos los discos/dispositivos a utilizar:
/dev/sdc
/dev/hdc

En uno de los discos debemos crear la particion:

Creamos partición de tipo raid en la totalidad del disco:
#fdisk /dev/sdc
new partition: n
primary partition: p
particion number: 1
First cylinder: 1
Last cylinder: (last)

Change partition type: t
Hex code: fd (Linux raid autodetect)

grabamos cambios y salimos: w

Creamos el dispositivo RAID:
# mdadm –create –level=1 –raid-devices=2 /dev/md1 /dev/sdc /dev/hdc

Podemos monitorear el proceso de espejado de los discos con:
# cat /proc/mdstat

o

# mdadm –detail /dev/md1

Formateamos file system ext3:
#mkfs.ext3 /dev/md1

Armamos el montaje del raid:
Creamos el directorio de montaje:
# mkdir /data

Editamos el /etc/fstab y agregamos el punto de montaje:
/dev/md1                /data                   ext3    defaults        1 1

Releemos el fstab para verificar y montar de acuerdo a la nueva entrada:
# mount -a

Creamos la entrada en el /etc/mdadm.conf para definir el nuevo raid:
# mdadm –examine –scan  >> /etc/mdadm.conf

C# tcp listener modo consola


Acá va un ejemplo sencillo de un tcplistener  en C# modo consola a pedido de Matias – el negro 🙂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace tcplistener_console
{
    class Program
    {
        static int Main(string[] args)
        {
            Console.Write(“tcplistener by hvivani – 20110225 – para el negro: \r\n”);
            if (args.Length == 0)
            {
                System.Console.WriteLine(“Parametros: Puerto IP   \r\n”);
                System.Console.WriteLine(“Ejemplo: tcplistener 2525 127.0.0.1  \r\n”);
                System.Console.WriteLine(“si tenes mas de una interfaz de red, usa la ip de dicha interfaz.  \r\n”);
                return 1;
            }

            TcpListener server = null;
            // Set the TcpListener on port.
            Int32 port = int.Parse(args[0]);
            IPAddress localAddr = IPAddress.Parse(args[1]);

            // TcpListener server = new TcpListener(port);
            server = new TcpListener(localAddr, port);

            // Start listening for client requests.
            server.Start();

            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;

            // Enter the listening loop.
            while (true)
            {
                Console.Write(“Waiting for a connection… “);

                // Perform a blocking call to accept requests.
                // You could also user server.AcceptSocket() here.
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine(“Connected!”);

                data = null;

                // Get a stream object for reading and writing
                NetworkStream stream = client.GetStream();

                int i;

                // Loop to receive all the data sent by the client.
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    Console.WriteLine(“Received: {0}”, data);

                    // Process the data sent by the client.
                    data = data.ToUpper();

                    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                    // Send back a response.
                    //stream.Write(msg, 0, msg.Length);
                    //Console.WriteLine(“Sent: {0}”, data);
                }

                // Shutdown and end connection
                client.Close();
                }

        } 
    }
}

Ejecutar SQL Server Stored Procedures desde PHP bajo Linux


Tratando de ejecutar Stored Procedures existentes en una base de datos SQL Server desde PHP bajo Linux, me encontré con el problema de que al querer ejecutar un stored procedure simple, sin parámetros, obtenía siempre el mismo error: “stored procedure execution failed”.
La sentencia de llamada era muy simple:

$conn = mssql_connect($host, $user, $pass);
mssql_select_db(‘nombredb’, $conn);
$proc = mssql_init(‘nombre_proc’, $conn);
$proc_result = mssql_execute($proc);

La solución es hacer una declaración explícita de los datos del servidor SQL Server en el archivo /etc/freetds.org de la siguiente manera:
[servidor]
        host =xxx.xxx.xxx.xxx
        port = 1433
        tds version = 8.0

Leer archivos de texto desde Flash


La manera de leer contenido de archivos de texto para embeber dentro de un flash es utilizando la función loadVariables().

Dentro de los archivos de texto se escriben párrafos, con un nombre de variable. De esta manera, al definir en el flash el mismo nombre de variable para un campo de texto dinámico, es posible cargar el texto desde los archivos sin modificar el flash.

Manos a la obra:

1) Creamos un archivo test.txt con el siguiente contenido:
&texto=este texto se mostrara en el campo de texto dinamico que tenga definido el nombre de variable texto &

la variable se llama “texto” y se colocan “&” al inicio y final del uso de dicha varaible.

2) En el flash agregamos un campo de texto dinámico y le ponemos como nombre de variable “texto”.
3) Nos situamos en el primer frame del flash y agregamos lo siguiente:
loadVariablesNum(“test.txt”,0);

Esta es la ruta del archivo a leer. En este caso está en el mismo directorio que el flash, pero podemos ponerle el path completo del dominio: http://www.dominio.com/test.txt

0 es el nivel de carga. Si queremos que se cargue en _root, debemos colocar “_root”.

Con esto ya podemos cargar el contenido de los archivos de texto en nuestro flash sin necesidad de modificarlo.

IMPORTANTE: Un problema con el que me choqué fué que al cargar el texto, no me mostraba los caracteres especiales o acentuados.
Para que el flash muestre correctamente estos caracteres, el archivo de texto debe ser guardado en formato UTF-8. Normalmente los archivos de texto son guardados en ANSI y en este formato no son reconocidos estos caracteres.

Error “Failed to get lock using fcntl(2)” en Evolution


Bueno, la verdad es que suena horrible este error, dado que la funciónm fcnl es utilizada a nivel filesystem para administrar lockeo o bloqueo los archivos que etán siendo accedidos.

La cuestión es que un equipo donde se hallan configurados los homes centralizados a través de NFS, comenzó a dar este error al intentar abrir cualquier correo dentro del evolution.
Dado que la red en ese momento estaba funcionando correctamente así como los servicios de NFS y los usuarios con homes compartidos se estaba logueando correctamente, mi primer intento de solución fué eliminar los *.index * en /home/usuario/.evolution/mail/local a fin de que al abrir el evolution se reconstruyan los indices…

Pero sin resultado positivo.

Así que aplicamos el plan B: realicé un respaldo completo de la cuenta del evolution a través del menú “Backup Settings”. Eliminé por completo los archivos de datos del evolution. Desinstalé el evolution. Lo volví a instalar… y restauré el backup de la cuenta de usuario.
Resultado ? volvió a funcionar correctamente.

Mi conclusión: en algún lado, quedó algún archivo de configuración del evolution con los datos erroneos ante algún problema de red.

Si alguien le encontró una solución mas facil… soy todo oidos…
Si alguien sabe la causa exacta de este problem…también soy todo oídos…

Restaurar menu de aplicaciones de gnome / Restore gnome applications menu


Resulta que en un equipo, el menú “Aplicaciones” no mostraba su contenido. Los menúes “Lugares” y “Sistema” funcionaban correctamente mostrando su contenido.
Luego de buscar un rato encontré que para restaurar el menú de aplicaciones de gnome a su contenido original, lo que hay que hacer es eliminar el archivo:
/home/usuario/.config/menus/applications.menu ó copiarlo desde otro equipo…
en mi caso particular, el archivo estaba en tamaño 0 bytes, probablemente por algún problema de red con los homes compartidos por NFS.

Script de notificación de uso de quota de disco / Disk Quota Notification Script


Estuve un rato buscando si alguien se había tomado el trabajito de armar un script para enviar un mail a los usuarios cuando estos estuvieran superando la quota de disco (al menos la SOFT quota) pero no econtré nada similar, así que no me quedó otra que hacerlo… Aquí dejo mi aporte para los que lo necesiten:

Lo que hace es recorrer los usuarios existentes en el /etc/passwd con UID >= 500. Esto es para Linux CentOS, Fedora, Redhat, pero pueden modificarlo para otros linuxes.
Para cada uno de ellos utiliza el comando repquota y compara los campos soft y hard para calcular el espacio utilizado.
En base a esto envía un mail de notificación al usuario y otro a sistemas para que nos enteremos que determinado usuario tiene problemas de quota.

#!/bin/sh
#hvivani. 20101217
#verifica quotas de usuario en filesystem y envía mail notificando exceso de soft quota.

for name in $(awk -F: ‘($3>=500) && ($3!=65534) {print $1}’ /etc/passwd)
do
      limiteSoft=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $4}’`
      usado=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $3}’`
      limiteHard=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $5}’`

      ### si el limite soft no es nulo
      if [ -n “$limiteSoft” ]
      then
         ### si el limite soft supera el espacio utilizado
         if [ “$usado” -ge “$limiteSoft” ]
         then
            nota=”Usuario: $name, Ud. esta excediendo su espacio en disco: Limite: $limiteSoft Bytes. Utilizado: $usado Bytes. Por favor, libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “ATENCION: Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado SOFT quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
         ### si el limite hard supera el espacio utilizado
         if [ “$usado” -ge “$limiteHard” ]
         then
            nota=”Usuario $name, Ud, esta excediendo su espacio en disco: Limite: $limiteHard Bytes. Utilizado: $usado Bytes. No podrá escribir en su sistema hasta que libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado HARD quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
      fi

done

Configurar sendmail con servidor smtp externo / Configure sendmail using smarthost


Dado que varias veces me he topado con la necesidad de configurar un sendmail en un servidor para que utilice un smtp externo, aqui lo agendamos:

Necesitaremos instalar el paquete sendmail-cf:
# yum install sendmail-cf

cambiamos el /etc/mail/sendmail.mc:
descomentamos la línea del SMARTHOST y agregamos un FEATURE:
define(`SMART_HOST’, `your-smtp-server’)
FEATURE(authinfo)dnl 

Recompilamos el sendmal.mc:
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf 

Creamos o editamos el /etc/mail/authinfo con la siguiente linea:
AuthInfo: “U:” “P:” “M:DIGEST-MD5”

Creamos el authinfo.db:
# makemap hash /etc/mail/authinfo < /etc/mail/authinfo

Restarteamos el sendmail:
# /sbin/service sendmail restart 
Un detalle importante, si reciben como respuesta el mensaje:
553 sorry, your envelope sender domain must exist (#5.7.1)

Es porque no está correctamente seteado el hostname en el equipo. Pueden verificarlo con el comando:
# hostname -f