Transferir o multifiles v0.5
Licença: GPLv2, GPLv3.
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.
Fig. 1. Um esquema de rede com vários ficheiros
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.
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.
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.
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.
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:
O arquivo inclui compilações binárias prontas para as seguintes plataformas:
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.