EdgeMAX - ¿Cómo puedo añadir nuevos paquetes y características para EdgeOS?

Resumen


Los lectores aprenderán a añadir nuevas funcionalidades a la plataforma de enrutamiento EdgeOS central. Vamos a analizar el proceso por ejemplo de comunidad contribuye paquete de vyatta-cron (usted puede obtener una copia en https://github.com/SO3Group/vyatta-cron).

Vyatta/EdgeOS está basado en Debian. Por lo tanto hereda su sistema de embalaje. Para simplificar el proceso, he creado un paquete dummy: https://github.com/SO3Group/vyatta-dummy

Elegir un nombre para el paquete. Tradicionalmente los nombres comienzan con "vyatta". Si desea crear paquetes separados para operativa y comandos de configuración, los llaman "vyatta - op-*" y "vyatta - cfg-*". Nuestro paquete es pequeño, así que no dividirlo. Como es un front-end para cron, sería razonable llamarlo "vyatta-cron".

Pasos


Instalar Debian Squeeze, por ejemplo, en una máquina virtual.

Instalar los siguientes paquetes:

sudo aptitude install build-essential devscripts debhelper autotools-dev autoconf fakeroot automake

 
Crear un directorio llamado "vyatta-cron" y copiar el esqueleto de vyatta-dummy allí (todo aparte .git, vamos git init desde cero). Repositorio git init

git init

 Añadir el usuario apropiado y correo electrónico a ".git/config".

[user]
        name = J. Random hacker
        email = jrhacker@example.net

Config para mandos a distancia depende de la configuración. Para github es como:

[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git@github.com:YOURUSER/repo-name.git

Estructura del paquete


Hay muchos archivos y subdirectorios varios.

/debian/            # Debian package build specs
    /control        # Package metadata
    /rules          # Package makefile
    /copyright
    /README
/changelog /scripts/ /templates-cfg/ /templates-op/
AUTHORS
Makefile.am
configure.ac

Configure.AC

Esto es lo que produce el script configure. Lo único que puede cambiar es la parte AC_INIT.

AC_INIT([vyatta-cron], VERSION_ID, [maintainers@so3group.net])

 Introduzca su nombre de paquete en lugar de "vyatta-cron" y su correo electrónico.

/ debian

En primer lugar, edite "debian/copyright" y "debian/README". Son sencillos, sustituir el nombre original y descripciones con el suyo.

debian/changelog

Reemplazar su contenido con la entrada "lanzamiento inicial". De lo contrario causará conflicto de nombres en tiempo de compilación si se mantiene una entrada con el viejo nombre del paquete se.

debian/control

Entonces, el "debian/control". Este archivo define el nombre del paquete, descripciones, dependencias y así sucesivamente. Esto es lo que parece en mi paquete:

Source: vyatta-cron
Section: contrib/net
Priority: extra
Maintainer: SO3 Group <maintainers@so3group.net>
Standards-Version: 3.9.1
Build-Depends: debhelper (>= 5), autotools-dev, autoconf

Package: vyatta-cron
Architecture: all
Depends: vyatta-cfg-system,
 vyatta-cfg,
 vyatta-op,
 cron,
 ${misc:Depends}
Description: Vyatta task scheduler configuration
 Vyatta task scheduler configuration utiliites, templates and scripts.

Lo que usted necesita cambiar:

  1. "Fuente:". La fuente nombre del paquete, que afecta sobre todo el nombre del archivo de fuente generado junto con el .deb en paquete build. Generalmente es el nombre del paquete arriba, pero nosotros somos nuestras propias aguas arriba, así que lo mismo que el nombre del paquete.
  2. «Mantenedor: ". Usted y su correo electrónico de contacto.
  3. "Paquete:". Que tendrá el paquete binario de nombre.

"Arquitectura: todos" significa que el paquete contiene sólo los archivos independientes de la plataforma. Si su paquete sólo tiene cáscara y scripts en Perl, es lo que usted necesita.

debian/rules

Para casos sencillos hay no mucho que cambiar allí. Busque la línea que dice "paquete =" y reemplace el nombre con el nombre del paquete. En nuestro caso:

PACKAGE=vyatta-cron

 Ahora usted debe verificar que su paquete construye lo siguiente desde el directorio de paquete:

debuild -us -uc

 "-nosotros - uc" significa "no firme".

Si construye y produce un .deb en el directorio de nivel superior, hiciste todo bien. Ahora que el código real.

Definir los comandos

En primer lugar, pensar en cuáles serán sus comandos. En la mayoría de los casos es una buena idea no enlazar a los nombres de implementación subyacente y estructura demasiado cerca, pensar en entidades que se están agregando, declaraciones de configuración backend no específicos.

Nosotros Inicio wil con comandos de configuración, de los que se ejecutan después de "configurar" y modificar la configuración.

Para cron necesitamos la única entidad: tarea. Tenemos que ser capaces de establecer las propiedades siguientes para él: intervalo de ejecución, ruta de acceso ejecutable y argumentos pasan al ejecutable. ¿Por qué dividir el ejecutable y sus argumentos? De esta manera podremos averiguar si el ejecutable existe y ahorrar al usuario algún tiempo en la solución de problemas. También, argumentos suelen cambiar más a menudo que la ruta de acceso ejecutable, por lo que el usuario no tendrá que introducir el nombre del archivo ejecutable una y otra vez.

Para usuarios no familiarizados con UNIX podemos proporcionar sintaxis fácil para intervalos de tiempo (cada 10 minutos, cada hora etc..). Sin embargo, es una buena idea proporcionar expers UNIX experimentados la oportunidad de entrar en la especificación de tiempo completo de cron.

Por lo tanto, vamos a convertir estas consideraciones en el árbol de comandos:

system
    task-scheduler
        task <name>                          # Task name
            cron-spec <UNIX cron time spec>
            executable
                arguments <arguments string>
                path <path to executable>
            interval
                <int32>[mhd]                 # m for minutes, h for hours, d for days

Ahora necesitamos decirle a Vyatta qué comandos que queremos. Vyatta usa "templates" para él. Plantillas consisten en árbol de directorios donde directorio denominado partido nombres de ruta de configuración y archivos especiales llamados "node.def" que definen el comportamiento de comand.

Ir a nuestro paquete "plantillas-cfg". Eliminar el directorio y crear el siguiente árbol de directorios:

templates-cfg/
    system/
        task-scheduler/
            node.def
            task/

 Cada nivel del árbol de directorio necesita un "node.def", aunque no define ningún comportamiento (de lo contrario el sistema ignora ese directorio). Para el "sistema /" nosotros heredamos ese archivo del sistema (como ya está definido por paquete de vyatta-cfg-sistema), para "sistema /-programador de tareas" tenemos nuestro propio.

Editar "system/task-scheduler/node.def" y escribir allí:

help:  Task scheduler settings

 Texto de ayuda que se mostrará en la terminación (y decir el sistema es un directorio de plantillas).

Ahora a la parte delicada. Obviamente tenemos que ser capaces de crear múltiples tareas. ¿Cómo? EdgeOS/Vyatta llama nodos que pueden tener varias instancias y sirven como contenedores para otros nodos "nodos de etiqueta". No hay sintaxis de plantilla especial para él.

task/
    node.def
    node.tag/
        crontab-spec/
            node.def
        executable/
            arguments/
                node.def
            path/
                node.def
        interval/
            node.def

Todo lo que ponemos en dir "node.tag" aparecerá en cada instancia de la tarea. Ahora tenemos que crear un node.def para notificar a Vyatta "tarea" es un nodo de etiqueta y cómo manejarlo.

Editar el "system/task-scheduler/task/node.def":

tag:
type: txt
help: Scheduled task
val_help: Task name
priority: 999
end:
    if [ ${COMMIT_ACTION} == DELETE ]; then
        sudo rm -f /etc/cron.d/vyatta-crontab
    else
        sudo /opt/vyatta/sbin/vyatta-update-crontab.pl --update || exit 1
    fi
  1.  "tipo:" definido permite el tipo de valor, el sistema rechazará establecer los valores de otros tipos. Los tipos comunes son: "txt" — cadena con formato de comprobación, "int32" — entero sin signo, "ipv4" — única dirección IPv4, "ipv4net" — CIDR IPv4, "ipv6", única dirección IPv6, "ipv6net" — IPv6 CIDR.
  2. "etiqueta:" es lo que dicen Vyatta es un nodo de etiqueta.
  3. "ayuda:" es la cadena de ayuda que aparece en la terminación.
  4. "val_help:" es la cadena de ayuda que aparece en el segundo nivel de terminación (lengüeta doble).
  5. «priorty: "define donde en commit proceso un subárbol es procesado.» 999" significa básicamente"después de todo". Hacemos esto porque los scripts de usuario están probable que dependen del estado del sistema coherente.
  6. "fin:" es donde definimos el comportamiento. Es un fragmento de cáscara de Bourne que llama scripts externos o realiza acciones para configurar el sistema según los valores directamente (por ejemplo, si sólo desea establecer valor de sysctl, no necesita comandos externos probablemente).

"fin:" es muy útil para los casos toda la configuración se maneja por comandos externos, como en nuestro caso. Para los casos que necesitamos diferentes acciones en la creación, supresión o cambio de valor, hay otras declaraciones:

  • «crear: «— ejecutada cuando se crean nodos que no existía.
  • "actualización:" — cuando se cambia el valor del nodo.
  • «eliminar: "— cuando se elimina el nodo.
  • «comienza: «— ejecutado antes de cualquier otras declaraciones.

Ahora necesitamos escribir otros node.def. La mayoría de ellos no es interesante, voy a describir sólo "ejecutable /" nodo de ruta aquí. Es interesante porque su valor puede comprobarse fácilmente en el tiempo, y lo haremos:

ype: txt
syntax:expression: exec
    "if [ ! -x $VAR(@) ]; then \
        echo \"File $VAR(@) does not exist or is not executable\"; \
        exit 1; \
    fi; "
help: Path to executable

 Nota la "Sintaxis: expresión:". Es una declaración de shell (sí, declaración, \'s que son necesarios si se rompen las líneas). Si devuelve un valor distinto de cero, el comando set no.

Comandos de modo de funcionamiento

Hay manera más simple de configuración mod. Crear directorios y poner node.def con contenidos como:

help: Help string
run: Command to execute

 En cron tenemos un script que llama a "restart /etc/init.d/cron" si existe la configuración del "sistema programador de tareas".

scripts /

Poner allí los scripts.

El script cron es bastante sencillo, se puede encontrar la configuración API de shell aquí: http://vyattawiki.net/wiki/Cli-shell-api y aquí para Perl: http://vyattawiki.net/wiki/Vyatta::Config

Makefile.AM

Ahora necesitamos saber el proceso de compilación los archivos para tomar y dónde colocarlos. Si no estás familiarizado con autotools, piensa es como magia (y aprender acerca de autotools).

«Makefile.am» Edit. En primer lugar, necesitamos poner nuestra configuración de secuencias de comandos "/ opt/vyatta/sbin" dir, y escribimos:

sbin_SCRIPTS = scripts/vyatta-update-crontab.pl

 Script de reinicio de servicio va a "/ opt/vyatta/bin/sudo-users" y escribimos:

bin_sudo_users_SCRIPTS = scripts/vyatta-restart-crond.sh

Control de revisión

No te olvides de añadir los cambios acertados a git.

Inicialmente, hacer:

git add *
git commit

Puede agregar archivos simplemente que cambiaste para saber a git que hiciste:

git add scripts/*
git add Makefile.am
git commit

Evitar ir "git añadir *" después de que un paquete como usted obtendrá un montón de basura genera automáticamente en el repositorio! Siempre agregar sólo cambiaste, o hacer 'git clean' primera.

Conclusión

Esto es lo mínimo que necesitas para crear tu propio paquete. Busque en las páginas wiki API, mira en otros paquetes del archivo GPL y experimento, y muy pronto usted podrá hacer casi lo que quieras.

Notas de la


Usted puede sistema de control de revisión de su elección (Subversion, Mercurial, Bazaar, etc.), pero los desarrolladores EdgeOS y Vyatta usa git, así que si vas a obtener tu paquete integrado en el upstream, mejor utiliza git.