Tag Archives: Directadmin

Recalcular quota en Directadmin

Directadmin utiliza el sistema de quotas del sistema operativo para calcular el espacio que está siendo utilizado por cada usuario. A veces, por diversas circunstancias, puede ser que necesitemos recalcular estos datos. Particularmente, en estos días tuvimos un problema con el acceso a un dispositivo que generó problemas en la ejecución del comando repquota y cuando solucioné el problema, tuve que recalcular la quota de todos los usuarios del sistema. Me pareció que sería útil explicar cómo hacerlo, porque si bien es algo que está explicado en la Knowledge Base de Directadmin, allí está en inglés.

Para que el sistema recalcule las quotas, es decir, analice todo el filesystem verificando el uso del disco y cree, confirme o repare los archivos de quotas, necesitamos correr el comando quotacheck. Para ello necesitamos deshabilitar las quotas, chequear y volver a habilitarlas.

# /sbin/quotaoff -a
# /sbin/quotacheck -avugm
# /sbin/quotaon -a

Esto tomará algunos minutos (particularmente el proceso quotacheck). Luego de lo cual podemos esperar que Directadmin corra el tally y recalcule los valores para cada usuario, o podemos indicarle explícitamente que lo haga en este momento. Para ello debemos agregar la tarea del tally a la cola:

# echo "action=tally&value=all" >> /usr/local/directadmin/data/task.queue

El tally se ejecutará cuando corra el proceso dataskq de Directadmin (que se ejecuta cada minuto). Podemos ver los logs de este proceso en /var/log/directadmin/system.log.

Pero si somos demasiado impacientes o queremos ver información de debug, podemos correr explícitamente el dataskq.

# /usr/local/directadmin/dataskq d10

Listo. Una vez que Directadmin re-procese todos los usuarios, los datos de consumo de disco de cada uno se habrá sincronizado con la información actual del sistema.

Cmd: Creando una consola interactiva con Python

Python

Python

Siguiendo con los ejemplos de los grandes recursos que ofrece la standard library de Python, así como el otro día hablé sobre BaseHTTPServer, hoy voy a hablar de Cmd.

Cmd es un módulo que nos permite crear una consola interactiva, como la propia consola de Python, en unas pocas líneas. La consola incluye manejo de distintos prompts, hooks para la ejecución de comandos, manejo de historial, ayuda general y por comando, y autocompletado de comandos y parámetros, etc. Lo único que tenemos que hacer para implementarla es extender la clase cmd.Cmd e implementar métodos do_* para los distintos comandos que queramos definir.

Veamos las opciones disponibles con un ejemplo muy sencillo:

# -*- coding: utf-8 -*-
import cmd

class Console(cmd.Cmd):

    prompt = "> "

    _colors = {‘red’: ‘#FF0000′,
               ‘white’: ‘#FFFFFF’,
               ‘black’: ‘#000000′}

    def __init__ (self):
        """Constructor"""
        cmd.Cmd.__init__(self)

    def do_hello (self, name):
        """Says hello to someone"""
        print "Hello %s!" % name

    def do_get_color (self, color):
        """Prints out the hex representation of a color"""
        if color in self._colors:
            print "%s: %s" % (color, self._colors[color])
        else:
            print "I don’t know: %s" % color

    def complete_get_color (self, text, line, begidx, endix):
        """Complete function for get_color"""
        return [i for i in self._colors if i.startswith(text)]

    def do_quit (self, s):
        print "Bye, bye…"
        return True

    def help_quit (self):
        print "Quits the console"

    do_EOF = do_quit
    help_EOF = help_quit

if __name__ == "__main__":
    console = Console()
    try:
        console.cmdloop("Hola!")
    except KeyboardInterrupt:
        console.do_quit(None)

Inicialización

Lo primero que hacemos es definir la clase Console que extiende cmd.Cmd. Luego definimos la propiedad pública “prompt”, que será el prompt de la consola (por default “(Cmd)”).

Un método básico

Luego tenemos el método do_hello que toma un argumento y le dice hola al argumento. Notesé que el texto que definimos en el comentario (“Says hello to someone”), además de ser la documentación de la función es tomada por Cmd para mostrarlo como ayuda del comando. Si en la consola ponemos “? hello” o “help hello”, se imprimirá esa cadena.

Autocompletado

A continuación tenemos el método do_get_colors que imprime el código hexadecimal de un color, según el diccionario _colors. Además de tener su texto de ayuda, a continuación tenemos el método complete_get_colors que lo que hace es manejar el autocompletado de los parámetros. Aquí lo que hacemos es ver el texto que se tipeó y devolver todas las claves del diccionario _colors que empiecen con ese texto.

Salir de la consola

Para salir del loop de la consola un método tiene que devolver True. Para ello definimos el método do_quit. Aquí imprimimos un saludo y salimos. Las novedades son, por un lado, la función help_quit que cumple la misma función que el docstring: imprime la ayuda del comando quit. Y además duplicamos la función do_quit como do_EOF (y help_quit como help_EOF). De esta forma, cuando la consola reciba EOF (es decir, Ctrl+D) ejecutará do_quit y saldrá.

Ejecutando la consola

Por último, al final del código instanciamos la clase Console y ejecutamos el método cmdloop() que inicia el loop de la consola. De paso agregamos el handling de la excepción KeyboardInterrupt (es decir, Ctrl+C) para que ejecute do_quit y cierre la consola adecuadamente.

Otro ejemplo

Así como hice la última vez, les dejo otro ejemplo más completo en el que anduve trabajando. En este caso es parte del código de mi modesto proyecto python-directadmin. Se trata de DAConsole, una pequeña consola interactiva para interactuar con Directadmin, donde implemento todas estas cosas vistas aquí, además de la posibilidad de crear consolas anidadas.

Ver código de DAConsole.

Referencias

Actualizar software con Custombuild para Directadmin

En esta pequeña guía veremos cómo actualizar muy sencillamente el software de nuestro servidor Directadmin usando Custombuild. Ya en otro artículo habíamos visto lo sencillo que era instalar software con Custombuild. En esta oportunidad, veremos que es igual de sencillo utilizarlo para mantener nuestro software actualizado.

Lo primero que debemos hacer es un update para descargar las nuevas versiones de las aplicaciones:

# cd /usr/local/directadmin/custombuild
# ./build update

Ahora que tenemos actualizado el propio custombuild, verificadas las versiones locales del software y descargadas las actualizaciones, podemos ver qué podemos actualizar.

# ./build versions

Esto nos va a mostrar por cada uno de los programas y librerías que maneja Custombuild, qué versión tenemos instalada y si hay una nueva para instalar. En base a esta lista, lo que podemos hacer es instalar la actualización para un programa/librería en particular, o actualizar todo.

Por ejemplo, si queremos actualizar solamente Apache, usaremos:

# ./build httpd

En cambio, si queremos actualizar todo, ejecutaremos:

# ./build update_versions

El Cron

Custombuild permite instalar un cronjob para manejar las actualizaciones. Tiene dos funcionalidades: avisarnos por mail cuando hay actualizaciones y actualizar automáticamente el software. Esto se configura en el archivo options.conf de Custombuild.

#Cron settings
cron=yes
email=nuestroemail@dominio.com
notifications=yes
updates=no

La variable “cron” habilita/deshabilita el cronjob. Si lo queremos instalar tiene que estar en “yes”. La variable “email” es la dirección donde recibiremos las notificaciones. Luego “notifications” habilita/deshabilita las notificaciones por email y “updates” habilita/deshabilita la actualización automática.

Personalmente, recomiendo no activar las actualizaciones automáticas, pues puede generar problemas inesperados en momentos en que no podemos resolverlos. Es preferible hacerlas manualmente cuando lo consideremos adecuado. Por otro lado, el cron se ocupa de actualizar automáticamente las aplicaciones web (los webmails), lo cual no suele traer problemas.

Para instalar el cron debemos configurar las opciones mencionadas en el options.conf (indicando cron=yes) y luego ejecutar:

# ./build cron

Python-Directadmin: API para conectarse a Directadmin desde Python

Este post viene un poco postergado. Hace algún tiempo que empecé con un pequeño proyecto y tenía pensado escribir una entrada en el blog para presentarlo, pero por distintos compromisos no he podido hacerlo hasta ahora, así que aquí va.

Para los que no lo sepan, Directadmin tiene una API para realizar distintas operaciones en el panel de control desde otra aplicación. La API no es más que una serie de URLs que reciben información por HTTP POST, ejecutan una acción y devuelven un resultado. De esa forma se pude acceder a muchas de las operaciones que uno realiza manualmente a través del panel (salvo algunas que parecen no estar muy bien implementadas/probadas).

En el foro de Directadmin existe una clase hecha en PHP a la que se le da bastante crédito, que lo que hace es abrir un socket y enviar requests HTTP a un servidor Directadmin y devolver la respuesta. Personalmente me parece que la clase es bastante mala y pobre, por las siguientes razones:

  • Está pensada para PHP 4.
  • No utiliza cURL, con lo cual hay demasiado código para hacer tareas que ya están implementadas en otras librerías.
  • Tiene un manejo de errores muy pobre
  • No es una implementación de la API de Directadmin (no implementa comandos específicos), sino que, como su nombre lo indica, se limita a crear un socket a un puerto HTTP y enviar requests (nuevamente… cURL).
  • El código no sigue ningún estándar de formato y “mejores prácticas”.

A pesar de todos estos problemas, tampoco me parecía un aporte muy interesante reescribir esa clase utilizando cURL. Además no tenía ganas de programar en PHP. Por lo tanto, lo que hice fue crear una implementación de la API en Python. Es decir, una librería que se ocupe de conectarse a un servidor Directadmin, enviar comandos, procesar sus respuestas y ofrecer una interfaz de programación cómoda para el desarrollador. De paso, el proyecto me sirvió para aprender un poco más de Python que es un lenguaje que me gusta mucho.

El resultado fue este proyecto que alojé en Google Code: http://code.google.com/p/python-directadmin/

El código es bastante sencillo (e incluso un poco tosco). Si ven el código del módulo directadmin, van a ver que hay una serie de clases. La más importante es la clase Api, que implementa los distintos métodos de la API de Directadmin (salvo algunos que no implementé aún). Esa clase hace uso de ApiConnector que es una clase muy sencilla que resume en unas pocas líneas lo que hacía la clase de PHP, utilizando urllib2. Luego hay un par de clases más para representar los tipos de usuarios, que no revisten mayor interés.

Posibles implementaciones

Cuando publiqué mi contribución en el foro de Directadmin obtuve una respuesta bastante poco amistosa de un usuario que no le veía utilidad a mi aporte. Más allá de esa persona, que afirma no conocer a nadie que programe en Python (sin comentarios…), yo creo que hay al menos tres vías de implementación de esta librería:

  • La más básica: crear scripts de consola para automatizar tareas (ver ejemplos más adelante).
  • Desarrollo web: así como el principal objetivo de la clase en PHP era que las empresas de hosting pudieran integrar sus sitios institucionales con el panel de control, esta implementación en Python permite el mismo tipo de integración para sitios desarrollados en Python (por ejemplo usando frameworks como Django, web2py, TurboGears, Pylons, etc.).
  • Aplicaciones de escritorio: no hay ni punto de comparación entre el soporte que ofrece Python para aplicaciones de escritorio con el que ofrece PHP. Hoy por hoy, un porcentaje muy alto de las aplicaciones de escritorio para Linux se escriben en Python y librerías como PyQt permiten hacer software desktop para Linux, Windows y Mac. Una aplicación de escritorio para monitorear y administrar múltiples servidores Directadmin se podría hacer sencillamente utilizando esta librería.

Ejemplos

Utilizar la API es bastante sencillo. En la página del proyecto podrán ver algunos ejemplos básicos como éste, para listar todos los usuarios del panel.

import directadmin

api = directadmin.Api("admin", "password", "hostname.com", 2222)
print api.list_all_users()

Además en el paquete incluí un archivo de ejemplo que se llama suspension.py. Este script utiliza la API para suspender/desuspender usuarios desde la consola. Se utiliza de la siguiente forma:

./suspension.py suspend

Tiene algunas otras opciones para especifiar host, puerto, usuario y password para conectarse Directadmin. Para ver las opciones disponibles pueden poner:

./suspension.py --help

Pendientes

Aún quedan varias cosas pendientes por hacer. Hay algunos métodos que no he implementado aún. Hay otros que los he probado y no funcionan, pero porque obtengo errores de parte de Directadmin y todavía nadie me ha sabido contestar por qué. También me gustaría crear un script de instalación con setuptools, pero todavía debo interiorizarme un poco más en el tema. Por último, me gustaría también hacer una implementación de más alto nivel, pues ahora la clase Api es una especie de bolsa de funciones que no me convence del todo.

Links

Instalar ConfigServer Security & Firewall en Linux con Directadmin

ConfigServer Security & Firewall

En esta sencilla guía vamos a ver cómo instalar ConfigServer Security & Firewall (CSF), un paquete de aplicaciones para Linux que incluye in firewall ampliamente configurable y herramientas para análisis de logs y detección de intrusiones. Además se integra como plugin a Directadmin, y chequea distintos items de la configuración del servidor para darnos ideas sobre cuestiones a mejorar.

La instalación es muy sencilla.

cd /usr/src
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh

Cuando lo probé yo me dio un error indicando que necesitaba el módulo LWP de Perl, el cual instalé con CPAN.

cpan -i LWP

Por último, es importante correr las pruebas que vienen incluidas para ver si tenemos todos los módulos de iptables necesarios. Aquí lo importante es que no dé FATAL ERRORS.

perl /etc/csf/csftest.pl

Eso es todo. Ahora ingresamos como admin a Directadmin, y en la sección de plugins encontraremos a ConfigServer. Allí podemos cambiar la configuración del firewall. Una vez terminado de configurar, cuando estamos seguros que todo funciona, debemos deshabilitar el testing mode. Este último lo que hace es limpiar el iptables regularmente, por si nos equivocamos, para no quedarnos sin acceder al servidor. También desde aquí podemos pedirle a ConfigServer que ejecute sus pruebas para ver la seguridad del servidor, y nos indique qué puntos nos quedan asegurar.