Slackmirror

Última versão: 3.3.1

O Slackmirror é um aplicativo que venho desenvolvendo deste 2005. Seu objetivo inicial era manter uma cópia atualizada de um espelho do Slackware-current, para acompanhar as novidades de minha distribuição preferida.

Atualmente ele amadureceu e deixou de ser um simples Script para download do Slackware-current, para se tornar um aplicativo de gerenciamento de espelhos de distribuições Slack-like, em qualquer versão, com cache de md5 para agilizar as atualizações, interface gráfica para gerenciar os downloads, download simultâneo de diversos arquivos e diversas distribuições, e tudo ao alcance de uma única linha de comando ou por meio interface gráfica simples e intuitiva.

Sumário

1. Um Breve Histórico

O Slackware mantém os pacotes de desenvolvimento para a próxima versão da distribuição, no diretório slackware-current, em seus repositórios. Geralmente esta versão está em boas condições de uso em dois a três meses antes do lançamento oficial.

O objetivo do current é justamente coletar dados sobre o estado dos pacotes, dispondo-os para testes pela comunidade. Isto é uma boa oportunidade para aqueles que desejam conhecer as novidades para a nova versão do Slackware, ou que necessitam utilizar novas versões.

Meus motivos já passaram da necessidade até a curiosidade e por muito tempo utilizei aplicativos como o wget, mc e gftp para baixar os pacotes, além de várias linhas de comandos, para remover os arquivos obsoletos e outros indesejáveis, da cópia local do current.

A primeira evolução natural deste processo veio com a criação do aplicativo slackmirror, por volta de setembro de 2005 (ou talvez um pouco antes), sendo todo ele escrito em Bash Script. Esta versão foi, por vezes, paralisada, dado a imaturidade e instabilidade de algumas das versões do Slackware-current lançadas na ocasião, e descontinuada, pela minha inabilidade em fazer um código em Bash descente e duradouro. A idéia somente ganhou folego com o surgimento do Slamd64 e do Bluewhite64, acompanhada da aquisição de minha primeira máquina 64bits.

A partir da versão 2.x, o slackmirror passou a suportar as distribuições Slamd64 e Bluewhite64, sendo totalmente reescrito, ainda em Bash. A última versão em Bash foi a 2.4.23, de agosto de 2008.

Desde então, passei a desenvolver o aplicativo em Python, renomeando a versão para 3.0. Posteriormente reescrevi grandes porções do código Python, necessários para reestruturar alguns gargalos do projeto e renomeei-o para a versão 3.2.

Dentre as novas características do slackmirror, posso destacar:

  • Suporte a várias distribuições Slackware-like – Atualmente o slackmirror suporta as distribuições Slackware, Slamd64, Bluewhite64 e Slackware64;
  • Suporte a vários espelhos simultâneos – é possível fazer vários downloads simultâneos em diversos espelhos diferentes, de diferentes arquivos em uma mesma distribuição. Isto permite ao aplicativo alcançar altas taxas de download, independente das limitações de um espelho em particular. Por padrão, o slackmirror vem com apenas um download por espelho habilitado e três espelhos disponíveis por distribuição;
  • Cache de md5 dos arquivos baixados – ao criar um espelho (opção create), ou fazer um upgrade de um espelho, o slackmirror cria um cache com os md5 gerados, dos arquivos baixados, agilizando o processo de upgrade, deixando-o até 4 vezes mais rápido;
  • Possui gui para administrar downloads – no momento ela apenas chama as instâncias do slackmirror para baixar/atualizar as distribuições;
  • Suporte flexível a espelhos – veja /etc/slackmirror/mirrors para mais detalhes;
  • Controle de taxa de download – o download atualmente é feito pelo wget, isto me deixou livre para me preocupar com outras funcionalidades do aplicativo, mas não é uma solução Pythônica, apenas uma conveniência momentânea.

2. Uso

A sintaxe do slackmirror é apresentada na linha abaixo:

slackmirror <action> [options]

O slackmirror ainda possui um manual com todos estas informações, alcançados pelo comando man do sistema ou pela opção “-h”. Nas duas próximas seções é apresentado as ações possíveis no slackmirror e suas opções.

2.1. Ações

O slackmirror realiza apenas uma única ação por execução, sendo as demais ignoradas. As ações suportadas são apresentadas na tabela abaixo:

Ação Descrição
-h, --help Apresenta o texto de ajuda do programa
-c, --create Criar um espelho novo
-u, --upgrade Atualiza um espelho existente
-s, --show Mostra as opções configuradas atualmente
-m, --mkiso Cria o iso da distribuição selecionada
-b, --burning Cria o iso e grava em um DVD
-l, --clean Remove arquivos antigos do espelho atual. É executado a cara upgrade

2.2. Opções

As opções guiam o slackmirror na execução de suas ações. As opções suportadas são apresentadas na tabela a seguir:

Opção Descrição
--connections-mirror=CM onde CM é o máximo número de conexões por espelho
-v, --verbose habilita modo verbose
-n, --no-stop não para em caso de erro de download (desabilitado)
-d DIST, --distro=DIST DIST deve ser uma das distribuições: slackware, slackware64, slamd64 ou bluewhile64
-i DV, --distro-version=DV onde DV é a versão da distribuição a ser baixada (current)
-q, --quick habilita o modo fast: Pula linguaguens, arquivos git e sources
-f, --force força o upgrade, mesmo se nào houver atualizações em FILELIST.TXT
-a, --halt Desliga o sistema após o termino do download
--limit-rate=WLRATE WLRATE é o limite de banda passado para o wget (--limit-rate) em kB/s
--enable-log habilita arquivo de log
--disable-log desabilita arquivo de log
--wget-options=WGETOPT WGETOPT são as opções de download passadas ao wget
--enable-lang-filter habilita filtro de linguague
--disable-lang-filter desabilita filtro de linguague
--enable-git-filter habilita filtro de arquivos do git
--disable-git-filter desabilita filtro de arquivos do git
--enable-source-filter habilita filtro de arquivos fontes
--disable-source-filter desabilita filtro de arquivos fontes
--set-kde-lang=LKDE LKDE é a linguagem para o KDE (arquivos em kdei)
--set-aspell-lang=LASPELL LASPELL é a linguagem para o Aspell (arquivos em extra/aspell-word-lists/)
--gui-mode modo gui. No momento não faz muito
--http-proxy=HPROXY HPROXY deve conter o proxy http (http://username@passwd:proxy_address:port)
--ftp-proxy=FPROXY FPROXY deve conter o proxy ftp (ftp://username@passwd:proxy_address:port)

2.3. Arquivo de Configurações

O slackmirror possui dois arquivos de configuração situados em /etc/slackmirror, o mirrors e o slackmirror.conf, apresentados a seguir.

2.3.1. /etc/slackmirror/mirrors

O arquivo /etc/mirrors, contém uma lista com várias urls de espelhos do Slackware e Slackware64, Slamd64 e Bluewhite64. Cada linha possui informações sobre o espelho, com a sintaxe apresentada abaixo:

distro%modo%url_base

onde:

  • distro – é o nome da distribuição: slackware, slackware64, slamd64 ou bluewhite64;
  • modo – é o modo como o espelho está organizado:
        0 – se o FILELIST.TXT está na url_base, como:
        url_base/FILELIST.TXT
        1 – se o FILELIST.TXT está em url_base/distro, como:
        url_base/slackware/FILELIST
        2 – se o FILELIST.TXT está em url_base/distro/distro_version:
        url_base/slamd64/slamd64-12.1/FILELIST.TXT
        3 – se o FILELIST.TXT esta em url_base/distro_version:
        url_base/slamd64-12.1/FILELIST.TXT
  • url_base – a url do espelho.

O modo 3 é a arquitetura mais usada nos espelhos Slackware e semelhantes.

Este arquivo vem com três espelhos habilitados por padrão (sem a tralha, #, no início da linha). Em princípio não há limite para o número de espelhos habilitados, apenas estético, no momento de executar o aplicativo. Mas, em geral, três a quatro espelhos são o suficientes para se conseguir taxas bem elevadas de download.

É aconselhável configurar as urls de sua preferência neste arquivo, e não deixe de verificá-las (url+modo). Na ocasião em que fiz este arquivo, tomei o cuidado de adicionar todas as urls disponíveis e conferir os modos selecionados. No entanto, já faz um bom tempo que atualizo apenas endereços específicos e não o arquivo por completo.

2.3.2. /etc/slackmirror/slackmirror.conf

Este arquivo possui as opções padrões utilizadas pelo slackmirror, como distribuição, versão, filtros, … e algumas configurações como paths e dispositivo DVD-Write.

Estas variáveis são apresentadas na tabela a seguir, com o valor padrão entre parenteses:

Variável Descrição
mirror_path diretório onde os espelhos serão gravados (/home/ftp/distro)
iso_path diretório onde as imagens serão gravadas (/home/ftp/distro/isos)
distro distribuição padrão (slackware)
distro_version versão padrão da distribuição (current)
wget_options opções para o wget (--timeout=30)
wget_limit_rate limite de download em kB. Deixe-o vazio para "sem limite"
tmp_dir diretório padrão para arquivos temporários (/tmp)
connections_mirror número de conexões por espelho (1)
git_filter remove arquivos do git da lista de download (True)
lang_filter habilita o filtro de linguagem (False)
lang_aspell define a linguagem padrão para o aspell (pt)
lang_kde define a linguagem padrão para o kde (pt_BR)
source_filter habilita o filtro de fontes. Se habilitado, não baixa as fontes (False)
log_status habilita o log (False)
dvd_device dispositivo DVD-Write da máquina (/dev/dvdrw)
http_proxy o endereço do proxy http (None)
ftp_proxy o endereço do proxy ftp (None)
halt_command comando para desligar o sistema (su -c halt)
terminal terminal para executar o slackmirror pelo gui (xterm)

A variável terminal não está habilitada no programa slackmirrorgui, devido a problemas encontrados com os terminais konsole e Terminal, ainda não resolvidos.

2.3.3. O cache de md5

O slackmirror cria um cache com os md5 gerados dos arquivos baixados, que é renovado apenas a cada novo download de um arquivo. O cache é armazenado em $HOME/.local/var/slackmirror/, em arquivos de nomes <distribuição>_md5.cache.

Estes códigos md5 são comparados com os md5 distribuídos no arquivo CHECKSUMS.md5, distribuídos nos repositórios das distribuições Slack-like, a cada upgrade solicitado, sem a necessidade de gerar novamente o código md5. Isto reduz a velocidade de upgrade em até 1/4.

Em princípio, todo este controle é transparente para o usuário, não necessitando de nenhuma interferência especial. A única situação que vejo a possibilidade de ocorre algum problema com o cache é no caso em que o espelho, ou parte dele, seja apagado do disco por terceiros. Neste caso, um “slackmirror -u“, não irá gerar o efeito desejado, baixando apenas alguns poucos arquivos. Nestas ocasiões é necessário remover o diretório $HOME/.local/var/slackmirror (ou melhor, o arquivo de cache da distribuição alterada), para que no próximo upgrade, todos os arquivos não encontrados no espelho local sejam de fato baixados.

2.4. Exemplos de Uso

A seguir, alguns exemplos de uso do slackmirror.

rudson@khelben:$ slackmirror -d slamd64 -u

Este comando atualiza (-u) o espelho da distribuição (-d) slamd64.

rudson@khelben:$ slackmirror -u -f

Atualiza um espelho do Slackware (distribuição padrão, não necessita do -d). O -f serve para forçar a atualização, o que é necessário quando o slackmirror é interrompido por um CONTROL+C, durante uma criação ou atualização de um espelho.

rudson@khelben:$ slackmirror -d bluewhite64 -c --http-proxy \
> http://192.168.1.1:8080 --ftp-proxy http://192.168.1.1:8080

Cria (-c) um espelho da distribuição (-d) bluewhile64 através do proxy 192.168.1.1, porta 8080.

rudson@khelben:$ slackmirror -d bluewhite64 -u -q

Atualiza o espelho (-u) do bluewhite64 (-d bluewhile64), sem as fontes e os pacotes de linguagem diferentes dos selecionados (-q). Útil para um download rápido.

rudson@khelben:$ slackmirror -d slackware64 -u \
> --set-kde-lang en_GB --set-aspell-lang en \
> --enable-lang-filter

Atualiza o espelho do slackware64, configura a linguagem padrão do KDE para “en_GB” e do Aspell para “en” e, por fim, habilita a filtragem dos pacotes de linguagem.

2.4.1. Aumentando a velocidade de download

Uma das grande mudanças feitas na versão 3.2.x do slackmirror lhe deu a possibilidade de se baixar diversos arquivos simultaneamente, para uma mesma instância do slackmirror. Isto permite maximizar o uso da banda de download, podendo chegar facilmente ao limite físico de sua rede.

Para isto, existe duas formas de se conseguir este aumento na velocidade de download:

  • aumentando o número de espelhos – isto é feito removendo a tralha (#) das linhas no arquivo /etc/slackmirror/mirrors, para a distribuição desejada. Apenas não deixe de verificar os espelhos;
  • aumentar o número de downloads por espelho – para isto basta passar o número de download por espelho pela opção –connections-mirror.

Em princípio não existe um limite quanto ao número de espelhos que se pode ser habilitados para o slackmirror. O gerenciador de download irá procurar um espelho disponível e iniciar um download assim que o encontrar.

Uma forma mais eficaz de aproveitar a banda de download é aumentando o número de download por espelho. Para isto ter efeito significativo, é necessário escolher espelhos com boa banda de download e que aceitem mais de um conexão por IP, de outra forma o servidor pode recusar a solicitação do slackmirror.

A linha abaixo faz o download de 6 arquivos simultaneamente, solicitando duas conexões por espelho, enquanto o /etc/slackmirror/mirrors, possui três espelhos disponíveis para a distro slackware64. Com este comando cheguei a consegui uma taxa média de 700kB/s.

rudson@khelben:$ slackmirror --distro slackware64 \
> --connections-mirror 2 --upgrade
SLACKMIRROR - 3.2.30
Distro: slackware64-current

Mirrors:
[ 0] http://slackware.cs.utah.edu/pub/slackware/slackware64-current
[ 1] http://mirror.pacific.net.au/linux/slackware/slackware64-current
[ 2] http://gd.tuwien.ac.at/opsys/linux/slackware/slackware64-current

Settings:
        log_status : False
       halt_system : False
           verbose : False

2.5. Slackmirror GUI

O slackmirror possui uma gui simples, chamada slackmirrorgui. Esta gui gerencia instancias do slackmirror, permitindo operar a grande maioria dos seus argumentos. Esta gui é feita em PyQt4, e por isto necessita da instalação da biblioteca qt4 e do PyQt4 para funcionar. Observe que a versão 12.2 do Slackware trabalha com a qt3.

Para chamá-la, execute o slackmirrorgui, que deve abrir uma interface, conforme a figura seguir. Clique na imagem para ampliar.

slackmirror_gui-01

Na figura abaixo é mostrado a execução do slackmirrorgui, com três instâncias do slackmirror, abertas para atualizar os espelhos do slackware, slackware64 e do slamd64.

slackmirror_gui-02

3. Changelog

Já faz algum tempo que venho tentando me educar a manter sempre atualizado o Changelog do slackmirror. Nos últimas versões, o tenho mantido em dia. O texto abaixo é o conteúdo atual do Changelog:

Slackmirror 3.3.1:
    - fixado a variável dvd_device para receber o valor de config.dvd_device
 
Slackmirror 3.3.0:
    - calcula a taxa de download rate e o tempo dinamicamente;
    - bug fix: diferenciado o tratamento de arquivos que não existem no 
      CHACKSUM.txt de arquivos novos;
    - adicionado a opção '--check' para checar md5sum dos arquivos (teste);
    - alterado o número de conexões defalt para 2 por espelho.
 
Slackmirror 3.2.33:
    - corrigido os espelhos do Bluewhite64;
    - removido uma linha print esquecida em download_list.
 
Slackmirror 3.2.32:
    - adicionado tratamento de erro no tamanho do arquivo baixado;
    - corrigido bug no endereço do md5_cache de file_dest para 'FILELIST.TXT'
      e feito mais algumas mudanças para receber md5sum_new corretamente;
    - foi adicionado um contador de erro de tamanho baixadona função 
      download_list. O máximo de downloads no momento está fixado em 5 
      tentativas, definido na variável max_download_try, em smlib.py;
    - aumentei o intervalo entre impressões de 0,3 para 0,5, na função 
      download_list.
 
Slackmirror 3.2.31:
    - atualização da página de manual;
    - adição da licença GNU General Public License, versão 2.
 
Slackmirror 3.2.30:
    - correção do texto bluewrile64 para bluewrite64;
    - adição do cache md5 para arquivos baixados. Isto aumenta (em até 4x) 
      a performance para o upgrade dos espelhos, já que o md5sum será 
      gerado somente uma vez por arquivo;
    - adição dos de cache em $HOME/.local/var/slackmirror/ com os nomes
      slackmirror-$DISTRO_md5.cache.
 
Slackmirror 3.2.29:
    - adição da opção connections_mirror na GUI do slackmirrorgui;
    - mudança no título da gui para 
    "'%s - %s' % (__program_name__, __version__)".
 
Slackmirror 3.2.28:
    - adição da função setprocname(), para mudar o proc name para slackmirror
      e slackmirrorgui nos processos;
    - adição do getprocname(), para pegar o proc name do aplicativo;
    - correção do download dos arquivos da base do espelho. Agradecimentos a  
      Marcelo Couto <http ://marcelocouto.net/>.
 
Slackmirror 3.2.27:
    - verifica de existe outras instância do slackmirror rodando, no caso 
      do uso da opção --halt. O comando halt será executado somente 
      quando a última instância do slackmirror terminar;
    - movi set_parameters do slackmirror e slackmirrorgui para a biblioteca 
      sentral smlib.py, e passar settings, config, proxies e filters como 
      parâmetros;
    - adicionar 'http://192.168.1...', como exemplo de proxy.
 
Slackmirror 3.2.26:
    - atualização do help;
    - adição da página de manual (comando man do Unix).
 
Slackmirror 3.2.24:
    - gerar arquivo de log sempre. O Log PID é verificado para controlar as 
      seções do slackmirror;
    - adição de controle para abrir apenas uma seção do slackmirror em uma
      combinação distribution-version;
    - adicionar linhas de impressão em download_file.
 
Slackmirror 3.2.22:
    - acidionado capacidade para baixar vários pacotes simultaneamente;
    - mudanças em slackmirror.conf para usar a função optparse.read_file();
    - adicionar atributos de classe, para substituir dicionário;
    - adicionar arquivos de documentação Changelog e Slackmirror_pt_BR.html;
    - adicionar arquivo slack-desc.
 
Slackmirror 3.2.10:
    - adicionar repositórios e suporte a Slackware64;
    - mudança do módulo md5 para hashlib;
    - fixado bug em realimentação de linha no konsole;
    - habilitar arquivo de log.
 
Slackmirror 3.0.54:
    - reconstruído todo o aplicativo em Python;
    - adicionar maior flexibilidade com espelhos:
        0 -> url/FILELIST.TXT
        1 -> url/distro/FILELIST.TXT
        2 -> url/distro/distro-version/FILELIST.TXT
        3 -> url/distro-version/FILELIST.TXT
    - adicionar suporte a proxy;
    - adicionar flags --enable e --desable em filtros;
    - permite diferentes comandos para o system halt (HALT_COMMAND;
      linha em /etc/slackmirror/slackmirror.conf)
 
    pendencies:
    - create a GUI (not finished);
    - enable verbose mode.
 
slackmirror 2.4.18:
    - adicionado saída para error no wget;
 
Slackmirror 2.4.17:
    - desabilitado a opção continue em UPGRADE_CHECK com a opção force;
    - adicionar Changelog em usr/doc/slackmirror;
    - adicionar Slackmirror_pt_BR.html em usr/doc/slackmirror;
    - adicionado mensagens para opções desconhecidas;
    - show_options mostra lista de espelhos.

4. Download

Nesta seção estão disponível para download as versões empacotadas que sobreviveram a minha desordem. Ainda possuo outras versões anteriores, que talvez em algum outro momento disponha aqui como registro.

4.1. Pacotes

O empacotamento do slackmirror foi feito segundo as normas do Slackware, para ser instalado com as ferramentas do pkgtools. Novas versões serão disponíveis sempre no topo desta pilha.

Segue abaixo os pacotes disponíveis:

4.2. Código fonte

Por se tratar de um código em Python, os pacotes da seção anterior, são muito semelhantes em conteúdo aos empacotamentos disponíveis aqui, com a exceção de alguns poucos arquivos, como o Makefile, o script upgrade_this, o aplicativo mkman entre outros.

Segue abaixo as versões disponíveis:

5. Próximas implementações

Nesta seção estão listadas as implementações para as próximas versões.

  • Slackmirror 3.3.0:
    • estudo: – os espelhos devem ser certificados para garantir o sincronismo do conteúdo. É um problema atual do Slackmirror, em que os espelhos de origem não são certificados quanto ao sincronismo dos dados. Uma possibilidade é baixar o FILELIST.TXT de cada espelho antes de iniciar o download dos arquivos. O inconveniente disto é que o download dos arquivos demoraria mais para iniciar;
    • concluído: – fazer um arquivo de log único e com limite de linhas configurado pelo slackmirror.conf.
      No atual estado, o aplicativo não está encontrando outras instâncias do Slackmirror, na distribuição executada, em processo. A função check_running_distro() não consegue encontrar as instâncias do Slackmirror rodando, como está definida. Necessito criar um arquivo de lock, com informações como: pid, data e horário de início.
      - concluído: – arquivo de lock criado em /tmp com a forma slackmirror-distro-version-pid.lock. O conteúdo deste arquivo é o horário e data em que foi criado. O arquivo é removido após o final da execução do aplicativo, mas não em caso de CONTROL+C;
    • concluído: – mover a remoção do arquivos FILELIST.TXT.old para o final da função de upgrade, assim o upgrade dos arquivos não será interpretado erroneamente ao se cancelar a operação com um CONTROL+C.

6. Licença

Este aplicativo está licenciado sobre a

GNU GENERAL PUBLIC LICENSE 2

180px-Heckert_GNU_white.svg

Better Tag Cloud