MultiFiles

Um sistema para distribuição de ficheiros (Firmware) por multicast UDP

Transferir o multifiles v0.5

Licença: GPLv2, GPLv3.

Princípios de funcionamento do MultiFiles

O ficheiro a ser distribuído é enviado ciclicamente para a rede num fluxo multicast UDP para um endereço multicast especificado (por defeito 224.2.2.4 porta 2222). Para receber o firmware. o cliente deve aderir ao grupo multicast enviando um pedido IGMP e para começar a transferir o ficheiro. Assim que a transferência estiver concluída, o cliente desliga-se do grupo e verifica a integridade do ficheiro. Se a verificação for efectuada com sucesso, o ficheiro é descompactado (o formato é .tar.gz) e o script customup.sh é iniciado contendo o ficheiro acabado de transferir. O script actualiza os ficheiros necessários e efectua outras acções necessárias para a actualização.

A utilização de multicast permite actualizar rapidamente qualquer número de receptores IP através de um único fluxo.

O cliente não efectua a actualização se a versão actual do firmware for semelhante ou mais recente do que a distribuída no fluxo. Contudo, se for especificada a opção "forçar actualização" no servidor, a actualização é sempre efectuada, independentemente da versão do software.

Esquema de vários ficheiros
Fig. 1. Um esquema de rede com vários ficheiros

Especificações do fluxo

O fluxo é composto por pacotes UDP com o cabeçalho possuindo o seguinte formato:

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

message_type pode ter um de dois valores:

#define MF_MTYPE_INFO 0x04030201
#define MF_MTYPE_DATA 0x04030202

Os pacotes do tipo MF_MTYPE_INFO são pacotes informais e contêm informações acerca do ficheiro distribuído, incluindo os seguintes dados:

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

nome do ficheiro, versão de firmware, nome do ficheiro e somatório MD5 para verificação da integridade. Os pacotes informais são enviados a cada 2 segundos por defeito.

Os pacotes do tipo MF_MTYPE_DATA contêm o conteúdo do ficheiro distribuído. O cabeçalho inclui informações sobre o desvio dos dados contidos no pacote relativamente ao início do ficheiro. O cliente pode começar a transferir o ficheiro a qualquer momento sem aguardar que o próximo seguinte comece. Esta lógica permite transferir ficheiros sem quaisquer atrasos suplementares devido à pesquisa no início ou final do ficheiro.

A velocidade da transmissão de dados através da rede pode ser ajustada através das opções da linha de comandos da aplicação do servidor. Por defeito a velocidade é de 100 KBytes por segundo.

As especificações da aplicação do servidor

Opções da linha de comandos do servidor:

multifiles # ./mfsrv -h
Utilitário de transferência de ficheiros multicast da NetUP (servidor).
Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Data de compilação: Nov  3 2008 13:22:49
 Utilize este utilitário por sua própria conta.
utilização:
opções
 [-i IP]          Endereço IP multicast a utilizar. Padrão: 224.2.2.4
 [-p port]                Porta UDP a utilizar. Padrão: 2222
 [-d]             Activar mensagens de depuração. Padrão: desactivado
 [-f file]                Nome do ficheiro a enviar. Padrão: testfile.bin
 [-s speed]               Velocidade de transferência Kbytes/seg. Padrão: 100 Kbytes/seg
 [-t delay]               Padrão em segundos do atraso de mensagens de informação 
                          profiláticas: 2 seg
 [-u]             Definição da sinalização de actualização 
                          forçada. Padrão: sinalização de actualização 
			  forçada não definida
 [-a version]             Versão do firmware. Padrão: 0
 [-h]             Esta ajuda

Um exemplo do arranque do servidor:

multifiles # ./mfsrv  -i 224.5.6.7 -p 1111 -f ./netup.tgz -s 100 -a 1104 -t 6
Utilização do ficheiro:./netup.tgz file name:netup.tgz prophylactic_delay:6
Velocidade:102400 bytes/sec psleep: 13513
+ Enviar ficheiro:netup.tgz sequence:1
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Informações profiláticas: 1068 bytes de 1068 enviados para o socket:3
o    Ficheiro:netup.tgz enviado com sucesso
+ A enviar ficheiro:netup.tgz sequence:2

Como pode ser visualizado a partir deste exemplo, o ficheiro netup.tgz está a ser enviado para o grupo multicast 224.5.6.7:1111 e uma velocidade de 100 Kbytes/s. A versão do firmware é 1104.

As especificações da aplicação cliente

Opções da linha de comandos do cliente:

multifiles # ./mfcln -h
Utilitário de transferência de ficheiros multicast da NetUP (cliente). 
Copyright (c) 2001-2008 NetUP Inc.
www.netup.tv. Data de compilação: Nov  3 2008 13:22:48
 Utilize este utilitário por sua própria conta.
utilização:
opções
 [-i IP]          Endereço IP multicast a utilizar. Padrão: 224.2.2.4
 [-p port]        Porta UDP a utilizar. Padrão: 2222
 [-t socket wait timeout]       Padrão em segundos do prazo do socket UDP: 10 seg.
 [-d]             Activar mensagens de depuração. Padrão: desactivado
 [-f file]        Nome do ficheiro a guardar. Padrão utilizando o nome de 
                  ficheiro proveniente do servidor
 [-s stat_file]   Estado do nome do ficheiro a guardar. Padrão: /tmp/mfstat.log
 [-a fw_version]  Versão actual do fw. A transferência é iniciada apenas se
                  a versão recebida for mais recente do que a actual. Padrão: 0
 [-h]             Esta ajuda

Um exemplo do arranque do cliente:

multifiles # ./mfcln -i 224.5.6.7 -p 1111 -a 1100
A aguardar a recepção de dados...
Mensagem de informações recebida. sequência:9240 nome 
do ficheiro:netup.tgz nome do ficheiro enviado:netup.tgz.9240 
tamanho:5741931 bytes
A receber dados...
Preenchimento do ficheiro até atingir 5741931 bytes, o tamanho do bloco é:1048576
Ficheiro preenchido. O tamanho é:5741931 o tamanho solicitado é:5741931. 
A começar a gravar em
Primeiro desvio:1379
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
208380 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
615480 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
1022580 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
1431060 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
1838160 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida:netup.tgz desvio:
2245260 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
2653740 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
3060840 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
3467940 tamanho:5741931 bytes 
Mensagem de informações profiláticas recebida:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
3875040 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
4283520 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
4690620 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
5097720 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz desvio:
5506200 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Mensagem de informações profiláticas recebida. nome do ficheiro:netup.tgz offset:
69000 tamanho:5741931 bytes forçar actualização:0 fw_version:1104
Ficheiro 'netup.tgz.9240' recebido. A verificar...
e7a646426d66b5df3318ba09f1ae33d2 - o nosso ficheiro md5. tamanho:5741931
e7a646426d66b5df3318ba09f1ae33d2 - recebido md5
Verificação MD5 com sucesso
Ficheiro 'netup.tgz.9240' verificado. Sucesso.

Como pode ser visualizado a partir deste exemplo, o ficheiro netup.tgz está a ser recebido do grupo multicast 224.5.6.7:1111. A versão actual do ficheiro é 1100, mas a versão fornecida pelo servidor é 1104.

Criação do firmware

Conteúdo do directório de scripts:

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

O script createfw.sh é utilizado para a criação do firmware. Como exemplo, o script é:

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

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

Como é possível confirmar, o script arquiva o conteúdo da pasta do firmware no ficheiro mf_fw.tgz. O ficheiro será fornecido através de multicast conforme acima descrito.

O directório scripts/firmware/ contém ficheiros necessários para a actualização e o script customup.sh que efectua acções necessárias no dispositivo do cliente após a transferência. Abaixo é apresentado um exemplo simples desse script:

multifiles # cat scripts/firmware/customup.sh
echo "A executar script personalizado do ambiente de actualização... Aguarde"
echo "A copiar novos ficheiros... "
cp stb_client/bin/stb_client /netup/stb_client/bin/stb_client

echo "A actualizar ficheiros de configuração... "

Como é possível confirmar, o script copia novos ficheiros e, se necessário, actualiza os ficheiros de configuração.

Trabalhar com o firmware no cliente

Um exemplo do script que organiza a recepção e processamento do firmware no dispositivo cliente (é fornecido um exemplo para um STB IP):

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 "A actualizar formware... "

    # 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. Pode efectuá-lo em customup.sh

    echo "Actualização efectuada. Nova versão do fw:"
    cat $NEPATH/version
fi

Conforme é possível verificar através do código acima apresentado, o script efectua os seguintes passos:

  • Solicita a versão actual do firmware. As informações da versão são armazenadas em /netup/version
  • Começa a transferir o firmware a partir do grupo de multicast
  • Se o ficheiro tiver sido transferido com sucesso, é descompactado e executado no script customup.sh existente no arquivo. O script efectua as acções necessárias (cópia, actualização da configuração, etc.)
  • Os dados da nova versão são guardados no ficheiro /netup/version. A próxima actualização será efectuada se for enviada uma nova versão de firmware a partir do servidor ou se a opção "forçar actualização" for definida no servidor.

Compilações binárias

O arquivo inclui compilações binárias prontas para as seguintes plataformas:

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

Para fabricantes de STB IP

Sugerimos incluir a aplicação cliente (mfcln) no fornecimento de STB IP. Aquando do arranque de cada STB IP, é necessário executar a aplicação de modo a verificar a presença do fluxo multicast com o firmware. A verificação não irá demorar mais de 2 segundos e se não for encontrado qualquer fluxo de multicast de firmware ou for fornecido um firmware anterior, é efectuado um arranque normal sem a realização de quaisquer alterações. Se for obtida uma nova versão do firmware, é instalada e os próximos arranques podem seguir um diferente esquema fornecido pelo firmware instalado. Isso permite que apenas o STB IP instalado seja colocado novamente em funcionamento tornando o firmware específico para a rede actual.


Get Adobe Flash player