Finalmente eu criei vergonha na cara e organizei meu repositório de SlackBuilds e pacotes pré-compilados para o Slackware.

Na verdade, ele já estava publicado há bastante tempo, desde 04/04/2014 para ser mais preciso, e vem recebendo atualizações constantes desde então. O que eu não havia parado para fazer direito era torná-lo compatível com as ferramentas de gestão de pacotes do Slackware, especificamente o Slackpkg+. Pois bem, agora está feito e vou contar um pouco de como foi e como usar.

Alien BOB, esse cabra... {#alien-bob-esse-cabra...}

Quando eu criei esse repositório, a única coisa com a qual eu me preocupei inicialmente foi com os hashes de verificação (checksum) dos arquivos para que quem os usasse pudesse ao menos verificar se os pacotes eram realmente aqueles feitos por mim. Para isso, fiz um scriptizinho mequetrefe para gerar os checksums dos pacotes usando minha chave GPG. Mais nada.

Daí para um repositório compatível com o Slackpkg+ faltava um bocado: os checksums comprimidos, log de mudanças, listas de arquivos, manifesto, listagem e metadados geral e de cada um dos pacotes, assinaturas GPG de cada pacote e, claro, uma fonte RSS para quem quiser saber das atualizações no repositório.

Mas e a preguiça que eu tinha de escrever um script pra fazer tudo isso? Sem contar que eu sempre me perguntava: "Porra! Tem uma galera mantendo repositórios por aí... Deve ter um jeito mais fácil de fazer isso, não deve?!?"

Aí eu estava navegando pela rede esses dias e me deparei com isso:

Some useful scripts I wrote.

-- Eric Hameleers, or Alien BOB

Fui olhar o que tinha lá dentro e achei isso:

Generate the PACKAGES.TXT FILELIST.TXT and CHECKSUMS.md5 files, needed by 3rd-party Slackware package management tools.

-- Eric Hameleers

Rá, meu véio! Era a peça que faltava! O script do Eric faz a porra toda! Ele diz que gera apenas o PACKAGES.TXT, FILELIST.TXT e CHECKSUMS.md5, mas ele faz muito mais do que isso. Ele gera todos os arquivos necessários para o repositório, inclusive o RSS, formata strings e muito mais. Cabra da peste esse Eric!

Aí, meu bom, foi só criar um ~/.genreprc com os parâmetros de execução do gen_repos_files.sh, dar um tapa aqui e outro ali nos arquivos do repositório e correr para o abraço.

Criar o ~/.genreprc é importante se você não quer ficar alterando o script original do Eric. Se esse arquvio existir, o script do Eric vai carregar as configurações e rodar numa boa. Com isso não faz sentido alterar o script original. Sem contar que fica mais fácil você manter o ~/.genreprc sob versionamento do que ficar controlando o código inteiro do gen_repos_files.sh. Lembra do dotfiles? Pois é.

O meu ~/.genreprc ficou assim:

REPOSROOT="/home/deny/code/mine/slackbuilds/pkg64/"
REPOSOWNER="Deny Dias <https://mexapi.macpress.com.br/foss.html>"
REPOSOWNERGPG="7CD25ACF5D0BCAEB"
RSS_TITLE="Deny Dias's Slackware64 packages"
RSS_LINK="https://github.com/denydias/slackbuilds/tree/master/pkg64"
RSS_UUID="6f8fcea2-1b48-11e4-a497-ac220b6b5a67"
USE_GPGAGENT=1
RSS_ICON="https://raw.githubusercontent.com/denydias/slackbuilds/master/tools/"
RSS_ICON+="blueorb.png"
RSS_CLURL="https://raw.githubusercontent.com/denydias/slackbuilds/master"
RSS_CLURL+="/pkg64/ChangeLog.txt"
RSS_DESCRIPTION="Deny Dias's Slackware64 packages repository. This directory "
RSS_DESCRIPTION+="includes binary packages only. The SlackBuild scripts for "
RSS_DESCRIPTION+="each package here are in its own directory in the repository "
RSS_DESCRIPTION+="root. Packages in ./sbopkg have no SlackBuild scripts on "
RSS_DESCRIPTION+="this repository as they are available from their sources."

É só ler os comentários iniciais do gen_repos_files.sh para saber qual a função de cada variável dessa e como obter os dados para cada uma delas. Mole, mole.

Depois de configurado, é só rodar o gen_repos_files.sh e ver a mágica acontecer. Em poucos segundos o seu repositório estará prontinho para ser publicado, com RSS e tudo.

GitHub, essa cabra... {#github-essa-cabra...}

Eu ando desapontado com o GitHub. Nada a ver com o serviço e as funcionalidades em si, que eu considero excepcionais.

Este ano eles pisaram feio na bola com assuntos que dou a maior importância: machismo e liberdade. Não vou entrar em detalhes neste artigo porque não é o contexto para isso. Basta dizer que para mim a reputação deles foi manchada de modo severo segundo os meus padrões e que estou observando como eles estão reagindo.

Mas não posso deixar de dizer que a fita deles melhorou um beiço de pulga comigo por conta desse repositório. Eu estava preocupado com uma coisa: se o GitHub não servir diretamente os arquivos do repositório, sem passar pelo frontend deles, mas os arquivos raw mesmo, f-o-d-e-u! Eu teria que configurar e manter um servidor na internet só para essa função. E não estou nem um pouco a fim de fazer isso.

Que o GitHub serve todos os arquivos 'como são' eu sei de velho. Mas usando o GitHub, se você precisar listar um diretório para 'chupar' os arquivos a partir da lista retornada, não rola. Não dá pra fazer um mirror ou crawling no GitHub. Por exemplo, isso não funciona:

lftp -c "open https://raw.githubusercontent.com/denydias/slackbuilds/master/; mirror pkg64"

Para o Slackpkg+ funcionar com o meu repositório publicado no GitHub, o próprio Slackpkg+ teria que fazer as requisições para cada arquivo diretamente na URL completa do arquivo raw. Se por um acaso ele contasse com alguma formação de URL por parte de algo retornado pelo servidor, bem, babou.

Qual foi minha grata constatação ao ver que o Slackpkg+ faz exatamente isso: a requisição é feita com uma URL completa para cada arquivo necessário para a atualização do repositório e dos pacotes.

A parte que o GitHub ganhou pontos é que ele não atrapalha isso. As requisições raw são atendidas e ponto final. Só dele não impedir esse caso de uso já é uma grande coisa! Ponto para o GitHub.

Na verdade, a camada de aplicação do GitHub que serve arquivos raw é tão boa que até o RSS pode funcionar (e funciona) nela. Eles possuem até um domínio específico para isso, o que simplifica escrever as URLs estáticas: raw.githubusercontent.com. Bem bom!

Meus SlackBuilds

A sementinha de qualquer pacote do Slackware é um script em bash chamado SlackBuild. Todo e qualquer pacote do Slackware (aqueles *.tgz ou *.txz), mesmo os da distribuição oficial, começaram sua vida com o SlackBuild apropriado.

O meu repositório não é diferente. Todos os pacotes compilados possuem o seu SlackBuild.

Mas algumas coisas são diferentes nos meus SlackBuilds. Se você tem alguma experiência com o Slackware e conhece a anatomia de um SlackBuild, eis o que eu faço de diferente do establishment:

  1. Eu não forneço os códigos fontes de nenhum software. Ao invés disso, os códigos fontes são baixados diretamente dos repositórios oficiais de cada software;
  2. Todos os downloads efetuados tem seus checksums verificados. Quando o autor provê um hash para isso, eu prefiro usar esse hash público para fazer a verificação, seja ele qual for. Se não há um hash publicamente disponível, eu mesmo gero um com SHA256. AVISO: isto pode levar a um ataque MITM;
  3. Eu faço uma limpeza depois que o pacote está criado. Quando um pacote é compilado com sucesso, o único arquivo que você verá é o pacote (*.tgz). O código fonte e todos os diretórios temporários são apagados assim que o SlackBuild roda sem erros. Se você decidir compilar o pacote novamente, tudo será baixado/descompactado/compilado novamente;
  4. Você não precisa ser root para compilar os pacotes (mas root é necessário para instalá-los). AVISO: Se você executar os SlackBuilds com o seu usuário padrão, espere algumas mudanças de proprietário em seu sistema de arquivos. Se você não quer isso, rode-os como root, já que os meus SlackBuilds não roda o chown em nada.

Baixar, compilar e instalar

Os comandos abaixo farão tudo o que você precisa para gerar um pacote a partir dos meus SlackBuilds. Tomemos como exemplo o clusterssh:

$ svn export https://github.com/denydias/slackbuilds/trunk/clusterssh
$ mkdir pkg64 && cd clusterssh && ./clusterssh.SlackBuild
$ sudo /sbin/installpkg ../pkg64/clusterssh-3.28-x86_64-1deny.tgz

Depois que a instalação estiver concluída, você pode apagar tudo com:

$ cd .. && rm -rf clusterssh pkg64

Facinho assim!

E onde estão os SlackBuilds? Aqui!

Pacotes Slackware64

Todos os pacotes que estão em meu repositório são compilados e testados por mim apenas no Slackware64 -current. Se você precisa de pacotes 32bit ou para outras vertentes do Slackware, você terá que compilar os pacotes a partir dos SlackBuilds usando as instruções acima. Eu não posso garantir que eles vão funcionar em outras versões do Slackware, mas não há nada que impeça isso de acontecer.

Compatível Slackpkg+ {#compatível-slackpkg}

Se você não leu o meu artigo sobre o Slacpkg+, faça isso agora.

Para adicionar o meu repositório ao seu Slackpkg+, faça isso:

  1. Edite /etc/slackpkg/slackpkgplus.conf e adicione conforme a sua conveniência:

    ...
    PKGS_PRIORITY=( multilib:.* denydias:.* ktown:.* restricted_current:.* alienbob_current:.* )
    ...
    REPOPLUS=( alienbob_current denydias ktown multilib restricted_current slackpkgplus )
    ...
    MIRRORPLUS['denydias']=https://raw.githubusercontent.com/denydias/slackbuilds/master/pkg64/
  2. Abra /etc/slackpkg/blacklist e /etc/slackpkg/greylist e certifique-se de que NÃO existe [0-9]+deny listado;
  3. Como root, execute slackpkg update gpg para adicionar minha chave pública GPG;
  4. Como root, execute slackpkg update para obter os metadados do repositório;
  5. Execute slackpkg search tragtor. Você verá:

    [ Status           ] [ Repository               ] [ Package                                  ]
    uninstalled          denydias                     tragtor-0.8.82-noarch-1deny
  6. A partir daí você poderá instalar/atualizar qualquer coisa do meu repositório usando apenas o Slackpkg+. Por exemplo:
# slackpkg install tragtor
# slackpkg upgrade tragtor
# slackpkg upgrade-all

Por dentro das atualizações {#por-dentro-das-atualizações}

Você poderá se manter informado sobre todas as atualizações que eu fizer no repositório assinando o RSS disponível em:

https://raw.githubusercontent.com/denydias/slackbuilds/master/pkg64/ChangeLog.rss

Faca quente na manteiga.