MultiFiles

Un sistema para distribución de archivos (firmware) a través de UDP Multicast

Descargar multifiles v0.5

Licencia: GPLv2, GPLv3.

Principios de operación de MultiFiles

El archivo a ser distribuido es enviado cíclicamente a la red en un flujo multicast UDP a una dirección multicast específica (por defecto: 224.2.2.4 puerto 2222). Para recibir el firmware, el cliente necesita iniciarse en el grupo multicast por medio del envío de una solicitud IGMP y, posteriormente, realizar la descarga del archivo. Tan pronto como la descarga haya concluido, el cliente se desconecta del grupo y realiza una verificación de integridad del archivo. Si dicha verificación es exitosa, el archivo (en formato .tar.gz) es desempacado y se inicia la secuencia del script customup.sh que vino con la descarga. El script instala los archivos necesarios y realiza otras operaciones de actualización.

La utilización de este procedimiento multicast permite actualizar cualquier cantidad de cajas decodificadoras IP en una sola acción y un solo flujo.

El cliente no procederá a la actualización si la versión actual de firmware es similar o superior a la que se está distribuyendo en el flujo. Sin embargo, si la opción "actualizar obligatoriamente" está definida en el servidor, la actualización ocurre indiferentemente de la versión de software.

Plan Multifiles
Fig. 1. Esquema de la red con multifiles

Especificaciones del flujo

El flujo consiste en paquetes UDP con el cabezal en el formato siguiente:

struct mulfiles_header{
    uint32_t message_type;
    uint32_t flags;
    uint32_t data_size;
    uint32_t sequence_no;
    uint32_t file_offset;
};

message_type puede tener uno de dos valores:

#define MF_MTYPE_INFO 0x04030201
#define MF_MTYPE_DATA 0x04030202

Los paquetes del tipo MF_MTYPE_INFO son de información y contienen datos sobre el archivo distribuido, incluyendo la información siguiente:

struct mulfiles_message_info{
    uint32_t file_size;
    uint32_t fw_version;
    unsigned char md5sum[16];
    char filename[1024];
};

tamaño del archivo, versión del firmware, nombre del archivo y suma MD5 de verificación de integridad. Los paquetes de información son enviados cada 2 segundos, por defecto.

Los paquetes del tipo MF_MTYPE_DATA llevan el contenido del archivo distribuido. Los cabezales incluyen instrucciones sobre la diferencia de información contenida en el paquete en relación al comienzo del archivo. El cliente puede comenzar a descargar el archivo en cualquier momento, sin esperar por el próximo ciclo. Esta lógica permite la descarga de archivos sin perder tiempo en buscar el principio o fin del archivo.

La velocidad de trasmisión de la información a través de la red puede ser ajustada por las opciones de la línea de comandos de la aplicación del servidor. Por defecto, la velocidad es 100 KBytes por segundo.

Especificaciones de la aplicación del servidor

Opciones de la línea de comandos del servidor:

multifiles # ./mfsrv -h
Utilidad de NetUP para subir archivos en forma multicast (servidor). Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Fecha de compilación: Nov  3 2008 13:22:49
Utilice esta funcionalidad a su propio riesgo.
utilización:
opciones
 [-i IP]          Dirección IP Multicast a utilizar. Por defecto: 224.2.2.4
 [-p port]        Puerto UDP a utilizar. Por defecto: 2222
 [-d]             Habilitar mensajes de debug. Por defecto: inhabilitados
 [-f file]        Nombre del archivo a enviar. Por defecto: testfile.bin
 [-s speed]       Velocidad de subida en Kbytes/seg. Por defecto: 100 Kbytes/seg
 [-t delay]       Demora de mensajes de información profilácticos, en seg. Por defecto: 2 seg.
 [-u]             Opción de actualización obligatoria. Por defecto: actualización obligatoria inhabilitada
 [-a version]     Versión de firmware. Por defecto: 0
 [-h]             Esta ayuda

Ejemplo de inicio del servidor:

multifiles # ./mfsrv  -i 224.5.6.7 -p 1111 -f ./netup.tgz -s 100 -a 1104 -t 6
Using file:./netup.tgz file name:netup.tgz prophylactic_delay:6
Speed:102400 bytes/sec psleep: 13513
+ Sending file:netup.tgz sequence:1
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    Prophylactic info: 1068 bytes from 1068 send to socket:3
o    File:netup.tgz successfully sent
+ Sending file:netup.tgz sequence:2

Tal como se aprecia en el ejemplo, el archivo netup.tgz está siendo enviado al grupo multicast 224.5.6.7:1111, a una velocidad de 100 Kbytes/s. Versión del firmware: 1104.

Especificaciones de la aplicación cliente

Opciones de la línea de comando del cliente:

multifiles # ./mfcln -h
Utilidad de NetUP para subir archivos en forma multicast (cliente). Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Fecha de compilación: Nov  3 2008 13:22:48
Utilice esta funcionalidad a su propio riesgo.
utilización:
opciones
 [-i IP]          Dirección IP Multicast a utilizar. Por defecto: 224.2.2.4
 [-p port]        Puerto UDP a utilizar. Por defecto: 2222
 [-t socket wait timeout]       Tiempo máximo de espera de salida UDP, en seg. Por defecto: 10 seg.
 [-d]             Habilitar mensajes de debug. Por defecto: inhabilitados
 [-f file]        Nombre del archivo a guardar. Por defecto: nombres provenientes del servidor
 [-s stat_file]   Nombre del archivo para guardar estadísticas. Por defecto: /tmp/mfstat.log
 [-a fw_version]  Versión actual del firmware. La descarga se inicia solamente 
                  si la versión recibida es más reciente que la actual. Por defecto: 0
 [-h]             Esta ayuda

Ejemplo de inicio de cliente:

multifiles # ./mfcln -i 224.5.6.7 -p 1111 -a 1100
Waiting for incoming data ...
Info message received. sequence:9240 filename:netup.tgz outfilename:netup.tgz.9240 
size:5741931 bytes
Receiving data ...
Filling file to required 5741931 bytes, blocks size is:1048576
File filled. Size is:5741931 requested size is:5741931. Starting write into
First offset:1379
Prophylactic info message received. filename:netup.tgz offset:208380 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:615480 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1022580 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1431060 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:1838160 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2245260 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:2653740 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3060840 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3467940 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:3875040 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4283520 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:4690620 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5097720 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:5506200 size:5741931 bytes 
force update:0 fw_version:1104
Prophylactic info message received. filename:netup.tgz offset:69000 size:5741931 bytes 
force update:0 fw_version:1104
File 'netup.tgz.9240' received. Checking ...
e7a646426d66b5df3318ba09f1ae33d2 - our file md5. size:5741931
e7a646426d66b5df3318ba09f1ae33d2 - received md5
MD5 check success
File 'netup.tgz.9240' checked. Success.

Tal como puede apreciarse en este ejemplo, el archivo netup.tgz está siendo recibido desde el grupo multicast 224.5.6.7:1111. Versión actual del archivo: 1100. Sin embargo, la versión proporcionada por el servidor es 1104.

Creación del firmware

Contenido del directorio de scripts:

multifiles # ls -al scripts/
total 16
drwxr-xr-x 4 root root   84 Oct 27 13:51 .
drwxr-xr-x 5 root root 4096 Oct 27 15:36 ..
-rwxr-xr-x 1 root root  115 Oct 27 13:51 createfw.sh
-rwxr-xr-x 1 root root  187 Oct 27 13:42 customup.sh
drwxr-xr-x 3 root root   35 Oct 27 13:51 firmware
-rwxr-xr-x 1 root root  889 Oct 27 13:39 update.sh

createfw.sh es el script utilizado para la generación del firmware. A manera de ejemplo, el script contiene:

multifiles # cat scripts/createfw.sh
FWPATH="firmware"
FWNAME="mf_fw.tgz"

(cd $FWPATH; tar cvfz ../$FWNAME ./*)
echo "Firmware created. File: $FWNAME"

Tal como puede apreciarse, el script guarda el contenido de la carpeta del firmware en el archivo mf_fw.tgz. El archivo será enviado a través de la salida multicast tal como se describió anteriormente.

El directorio scripts/firmware/ contiene los archivos necesarios para la actualización y el script customup.sh que ejecuta las acciones necesarias en el dispositivo cliente luego de su descarga. A continuación, un ejemplo sencillo:

multifiles # cat scripts/firmware/customup.sh
echo "Running custom upgrade shell script ... Please, wait"
echo "Copying new files ... "
cp stb_client/bin/stb_client /netup/stb_client/bin/stb_client

echo "Updating config files ... "

Tal como puede apreciarse, el script copia los archivos nuevos y, si fuera necesario, actualiza los archivos de configuración.

Operar el firmware en el cliente

Este es un ejemplo de un script que organiza la recepción y procesamiento del firmware en el dispositivo cliente (este ejemplo sirve para una IP STB):

multifiles # cat scripts/update.sh
MFPATH="/mfupdater"
NEPATH="/netup"
DSTPATH=$MFPATH/dst
STATFILE="/tmp/mfstat.log"

# Show update splash screen
cat $MFPATH/updatesp.bmp > /dev/fb0 2>/dev/null

# get current ver
if [ -f $NEPATH/version ]; then
    export CURVER=`cat $NEPATH/version`
else
    export CURVER=0
fi


$MFPATH/mfcln -s $STATFILE -t 3 -i 224.5.6.7 -p 1111 -f $MFPATH/download.bin -a $CURVER

if [ $? -eq 0 ]; then
    echo "Updating software ... "

    # Create dst path
    mkdir $DSTPATH 2>/dev/null

    # unbzip received file into /netup
    cd $DSTPATH
    cat $MFPATH/download.bin | tar -xz

    # run custom script in received file
    cd $DSTPATH
    sh customup.sh

    # save new version
    if [ -f $STATFILE ]; then
        cat $STATFILE > $NEPATH/version
    fi

    # cleanup dst dir if required. You can do this in customup.sh

    echo "Update done. New fw version:"
    cat $NEPATH/version
fi

Tal como puede verse en el código anterior, el script ejecuta las acciones siguientes:

  • Busca el firmware actual. La información de versión está almacenada en /netup/version
  • Comienza a descargar el firmware desde el grupo multicast
  • Si el archivo se descargó exitosamente, lo desempaca y ejecuta el script customup.sh incluido en el archivo. El script toma las acciones necesarias (copia, actualiza la configuración, etc.)
  • La información de la nueva versión se guarda en /netup/version. La próxima actualización se llevará a cabo si una versión más reciente del firmware llega desde el servidor o la opción "actualizar obligatoriamente" está definida en el servidor.

Construcciones binarias

El archivo contiene construcciones binarias prontas para las plataformas siguientes:

  • SH-4
  • Mipsel uclibc
  • ARM9
  • PPC
  • x86

Mensaje para los productores de cajas decodificadoras IP STB

Se sugiere incluir la aplicación cliente (mfcln) en el paquete básico de IP STB. Con cada inicio de IP STB, se solicita correr esta aplicación a efectos de verificar la presencia del flujo multicast con firmware. La verificación no insumirá más de dos segundos y, si no se encontrase el flujo multicast con firmware o se encontrase un firmware anterior, se procederá a realizar un inicio sencillo, sin cambios. Si se encontrase una versión de firmware nueva, se instalará y, durante el inicio siguiente, se generará el esquema propuesto por el firmware nuevo instalado. Esto le permite al IP STB entrar en operación automáticamente al obtener el firmware específico de la red actual.

 


Get Adobe Flash player