Descargar multifiles v0.5
Licencia: GPLv2, GPLv3.
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.
Fig. 1. Esquema de la red con multifiles
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.
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.
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.
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.
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:
El archivo contiene construcciones binarias prontas para las plataformas siguientes:
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.