Baixa os pacotes de uma determinada versão do Slackware para posterior atualizaçao

Publicado por Rodrigo Albuquerque Serafim (última atualização em 07/01/2018)

[ Hits: 668 ]

Homepage: https://www.vivaolinux.com.br/~raserafim

Download script-down-pkg-slackware.sh




Baixa os pacotes de uma determinada versão do Slackware para posterior atualização do sistema em off-line.


Ou seja, o Script faz o download dos pacotes de uma determinada versão do Slackware para possibilitar uma posterior atualização do sistema de maneira off-line.

Características de Operação:
- faz apenas o download dos pacotes de uma determinada versão do Slackware;
- possibilita uma posterior atualização do sistema de maneira off-line.
- não faz nenhuma alteração no sistema;
- é possível selecionar alguns conjuntos de pacotes (diretórios) para o download;
- quando seleciona o KDE faz o download apenas das linguagens informadas;
- informa o espaço estimado dos downloads;
- faz verificação da integridade dos pacotes em quatro dimensões:
   - verifica através do wget;
   - verifica através do md5sum;
   - verifica se faltam arquivos;
   - verifica se tem arquivos a mais;
- permite definir a versão do Slackware que se quer baixar;
- permite definir o mirror que se quer utilizar (FTP, HTTP e HTTPS);
- permite definir o modo de operação do protoloco FTP (passivo|ativo);


O script foi concebido com a idéia de fornecer:
1) um meio rápido e fácil de baixar os pacotes para uma porteior atualização da versão do Slackware;
2) um meio de baixar apenas os diretórios pretendidos;
3) um meio de verificar se todos os arquivos estão íntegros;


Embora a cada nova versão do Slackware deva ser acompanhada de uma nova versão deste script, a versão do Slackware que o script efetivamente vai baixar pode ser redefinida em tempo de execução (em certo sentid este script é universal: serve para todas as versões do Slackware desde a versão 8.1).

Neste script, os dois primeiros conjuntos de números dizem respeito a versão do próprio script; os dois últimos conjuntos de números dizem respeito a versão correspondente do Slackware.


Particularmente, o utilizo para fazer o download dos pacotes de uma versão mais nova do Slackware para, assim, depois, proceder a atualização do sistema de maneira off-line: seguindo os passos do arquivo UPGRADE.TXT.

Em conjunto com este Script, como parte de uma etapa posterior, utilizo um outro (também de minha autoria) que me assiste nos processos de atualização do sistema: (<https://www.vivaolinux.com.br/~raserafim/scripts/>).


O aplicativo slackpkg também consegue fazer o download dos pacotes para serem atualizados em offline.  

No entanto, o que marca a diferença e, talvez, alguma vantagem deste script em relação ao slackpkg no que toca ao download dos pacotes de atualização é que neste script é possível escolher apenas alguns conjuntos de pacotes (diretórios) para o download. Por exemplo, é possível deixar de fora os pacotes relacionados ao KDE, ou ao XFCE. E, no caso de se decidir por baixar os pacotes do KDE, apenas os pacotes nas linguagens definidas é que serão baixados: por padrão, o português e o inglês.

Outra singularidade deste script em relação ao slackpkg é que este script possui uma opção de verificação da integridade dos arquivos baixados: de modo a buscar garantir que tanto os arquivos baixados estão íntegros quanto não tem nem arquivos a menos nem arquivos a mais.


Publicizo o presente Script na expectativa de que contribua de alguma maneira para aqueles que, porventura, tenham a mesma necessidade que eu; ou, então, para aqueles que o Script tenha serventia com algumas adaptações ou como material que contém alguma ideia útil para outros Scripts.

Como Executar:
- baixar o arquivo do Script; OU copiar o texto do Script diretamente da WEB para um arquivo texto criado no computador;
- dar permissão de execução para o arquivo com o Script:
    - por exemplo: $ chmod +x script-down-pkg-slackware.sh;
- copiá-lo (ou movê-lo) para o diretório local que contém os arquivos a serem convertidos;
- executar o Script com o comando: $ ./script-down-pkg-slackware.sh
    - obs: o prefixo "./" (ponto-barra) deve vir antes do nome do arquivo para especificar que o arquivo a ser executado está no diretório local (corrente), e não em um dos caminhos do "PATH".

Para mais detalhes, ver minha dica: Como dar Permissão de Execução a Arquivo (script ou binário) no GNU/Linux - Abordagem Prática (https://www.vivaolinux.com.br/dica/Como-dar-Permissao-de-Execucao-a-Arquivo-script-ou-binario-no-GNULinux-Abordagem-Pratica/)

Para dar permissão de alteração do conteúdo do Script, utilizar o comando, por exemplo: $ chmod a+w script-down-pkg-slackware.sh

"Para mais detalhes, ver minha dica: Como dar Permissão de Execução a Arquivo (script ou binário) no GNU/Linux - Abordagem Prática (https://www.vivaolinux.com.br/dica/Como-dar-Permissao-de-Execucao-a-Arquivo-script-ou-binario-no-GNULinux-Abordagem-Pratica/)"

  



Esconder código-fonte

#!/bin/sh

# script-down-slackware.sh - faz download dos pacotes de uma determinada versão do Slackware para possibilitar uma posterior atualização do sistema de maneira off-line.


# Copyright 2017 Rodrigo Albuquerque Serafim.

# Autor: Rodrigo Albuquerque Serafim (raserafim)
# Contato: https://www.vivaolinux.com.br/~raserafim
# Versão: 1.0.14.1
# Data: 23-11-2017 
# Dependências: 
# Licença: GPL v3 <https://www.gnu.org/licenses/gpl-3.0.html>

#   Este programa é um software livre; você pode redistribuí-lo e/ou 
#   modificá-lo sob os termos da Licença Pública Geral GNU como publicada
#   pela Fundação do Software Livre (FSF); na versão 3 da Licença,
#   ou (a seu critério) qualquer versão posterior.

#   Este programa é distribuído na esperança de que possa ser útil, 
#   mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO
#   a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
#   Licença Pública Geral GNU para mais detalhes.

#   Você deve ter recebido uma cópia da Licença Pública Geral GNU junto
#   com este programa. Se não, veja <http://www.gnu.org/licenses/>.

#   Esta é uma tradução não oficial da GNU General Public License em Português.

### [version] ###################################################################

# Características de Operação:
# - faz apenas o download dos pacotes de uma determinada versão do Slackware;
# - possibilita uma posterior atualização do sistema de maneira off-line.
# - não faz nenhuma alteração no sistema;
# - é possível selecionar alguns conjuntos de pacotes (diretórios) para o download;
# - quando seleciona o KDE faz o download apenas das línguas informadas;
# - informa o espaço estimado dos downloads;
# - faz verificação da integridade dos pacotes em quatro dimensões:
#   - verifica através do wget;
#   - verifica através do md5sum;
#   - verifica se faltam arquivos;
#   - verifica se tem arquivos a mais;
# - permite definir a versão do Slackware que se quer baixar;
# - permite definir o mirror que se quer utilizar (FTP, HTTP e HTTPS);
# - permite definir o modo de operação do protocolo FTP (passivo|ativo);

# VERSÃO 1.0 (23-11-2017)

### [end version] ###################################################################

version_slack32="slackware-14.2"   #este valor deve ser alterado a cada versão nova do Slackware
version_slack64="slackware64-14.2"   #este valor deve ser alterado a cada versão nova do Slackware

mirror32_1="ftp://ftp.slackware-brasil.com.br/slackware-14.2/"      #este valor deve ser alterado a cada versão nova do Slackware
mirror32_2="http://ftp.slackware-brasil.com.br/slackware-14.2/"      #este valor deve ser alterado a cada versão nova do Slackware
mirror64_1="ftp://ftp.slackware-brasil.com.br/slackware64-14.2/"   #este valor deve ser alterado a cada versão nova do Slackware
mirror64_2="http:ftp://ftp.slackware-brasil.com.br/slackware64-14.2/"   #este valor deve ser alterado a cada versão nova do Slackware

dir_slack32="slackware"      #nome do diretório do slackware de 32 bits
dir_slack64="slackware64"   #nome do diretório do slackware de 64 bits

#

DIRSELECTS_DEFAULT=(a ap d f k l n x xap)   #lista dos diretórios padrões básicos para fazer o download

LANGUAGE_KDEI=(pt_BR en_GB)         #lista das línguas do kde a serem baixadas

verif_except=(CHECKSUMS.md5 CHECKSUMS.md5.asc FILELISTselected.TXT CHECKSUMSselected.md5 CHECKSUMSreport.txt)  #exceções na verificação da integridade

verif_removed="removed_a_mais"         #nome do diretório que armazenará os arquivos excluídos na verificação

show_wget="-nv --show-progress"         #opções do wget relacionados ao formato das mensagens [-nv --show-progress]
opt_wget=               #opções do wget relacionados aos downloads [--no-passive-ftp | -nc]

#

VERSION_SLACK=               #[$version_slack32|version_slack64]

DIR_SLACK=               #[$dir_slack32|$dir_slack64]

mirror_num_default=            #[1|2]

MIRROR=                  #[$mirror32_1|$mirror32_2|$mirror64_1|$mirror64_2]

TMPDIR="/tmp"               #[$PWD|/tmp]

dirscript=$PWD

dirselects=($(printf '%s\n' "${DIRSELECTS_DEFAULT[@]}" | sort | uniq))  #copia o conteúdo e faz a ordenação do conteúdo da variável e exclui os duplicados

dirselect_kde=      #[yes|no]
dirselect_xfce=      #[yes|no]
dirselect_patches=   #[yes|no]


### Funções ###

function fun_checksum()  #função que faz a Verificação da integridade
{

cd $dirscript/$VERSION_SLACK 2>/dev/null

echo " "
echo "Iniciando o processo de verificação da integridade dos pacotes baixados ..."
echo " "

if [ ! -s "CHECKSUMSselected.md5" ]  #verifica se o arquivo existe
then
  echo " "
  echo "ERRO: não foi possível fazer a verificação da integridade. Arquivo CHECKSUMSselected.md5 não encontrado."
  echo " "
  exit
fi

echo "Aguarde (etapa 1) ..."
echo " "

cat CHECKSUMSselected.md5 | md5sum -c |& tee /dev/tty > CHECKSUMSreport.txt

if [ ! -s "CHECKSUMSreport.txt" ]  #verifica se o arquivo existe
then
  echo " "
  echo "ERRO: CHECKSUMSreport.txt não foi gerado. Provavelmente, por falta de espaço ou privilégios."
  echo " "
  exit
fi

echo " "
echo "CHECKSUMSreport.txt gerado! O arquivo contém um relatório das consistências e das inconsistências."
echo " "

checkerr_md5=$(cat CHECKSUMSreport.txt | grep "md5sum: WARNING:" | wc -l)  #armazena a quantidade de linhas com erro
checkerr_more=0

cd $dirscript/$VERSION_SLACK

echo " "
echo "Aguarde (etapa 2) ..."
echo " "

find . -maxdepth 9 -type f -iname "*" | sort > $TMPDIR/file_comp1.tmp
cat $dirscript/$VERSION_SLACK/CHECKSUMSselected.md5 | awk {'print$2'} | sort > $TMPDIR/file_comp2.tmp

if [ ! -s $TMPDIR/file_comp1.tmp ] || [ ! -s $TMPDIR/file_comp2.tmp ]  #verifica se o arquivo existe
then
  echo " "
  echo "ERRO: Arquivo temporário não foi gerado. Provavelmente, por falta de espaço ou privilégios."
  echo " "
  exit
fi

file_result=$(diff $TMPDIR/file_comp1.tmp $TMPDIR/file_comp2.tmp | grep "< " | sed "s/< //g" | sed "s/$/: FALHOU: Arquivo a mais./g") 2>/dev/null

rm -f $TMPDIR/file_comp1.tmp 2>/dev/null
rm -f $TMPDIR/file_comp2.tmp 2>/dev/null

for e in ${verif_except[@]}
do
  file_result=$(echo "${file_result[@]}" | grep -v "$e") 2>/dev/null  #remove o que for de exceções
done

checkerr_more=$(echo "${file_result[@]}" | grep "^\.\/" | wc -l) 2>/dev/null

echo "${file_result[@]}" |& tee /dev/tty  >> $dirscript/$VERSION_SLACK/CHECKSUMSreport.txt

echo " "
echo "CHECKSUMSreport.txt atualizado! O arquivo contém um relatório das consistências e das inconsistências."
echo " "

if [ $checkerr_md5 -eq 0 ] && [ $checkerr_more -eq 0 ]  #se = 0
then
  echo " "
  echo "Resumo: "
  echo "Valores md5sum consistentes: sim (sucesso!)"
  echo "Arquivos a mais: não (sucesso!)"
  echo " "
  echo "SUCESSO: Nenhum erro foi encontrado na verificação da integridade a partir do CHECKSUMSselected.md5!"
else
  echo " "
  echo "Resumo: "
  if [ $checkerr_md5 -eq 0 ]  #se = 0
  then
    echo "Valores md5sum consistentes: sim (sucesso!)"
  else
    echo "Valores md5sum consistentes: não (erro)"
  fi
  if [ $checkerr_more -eq 0 ]  #se = 0
  then
    echo "Arquivos a mais: não (sucesso!)"
  else
    echo "Arquivos a mais: sim (erro)"
  fi
  echo " "
  echo "ERRO: CUIDADO, inconsistências foram encontradas na verificação da integridade a partir do CHECKSUMSselected.md5."

  echo " "
  echo "1) Finalizar: não fazer a reparação automaticamente."
  echo "2) Iniciar a reparação automática."
  read -p "Digite o número da opção desejada: " digitval
  if [ -z $digitval ]
  then
    echo "Opção padrão assumida: 1"
    digitval="1"
  elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
  then
    echo "Valor não corresponde às opções indicadas."
    echo "Opção padrão assumida: 1"
    digitval="1"
  fi
  if [ "$digitval" == "1" ]
  then
    exit
  elif [ "$digitval" == "2" ]
  then
    fun_reparar
  else
    echo "Valor não corresponde às opções indicadas."
    echo "Erro desconhecido."
  fi
fi

}


function fun_reparar()  #função que faz a reparação
{

echo " "
echo "Iniciando reparação ..."
echo " "

echo "Aguarde (etapa 1) ..."
echo " "

CHECKSUMSreportFAIL_mem=$(cat CHECKSUMSreport.txt | grep -E "(FALH|FAIL)" | grep -v "FALHOU: Arquivo a mais" | awk {'print$1'} | sed "s/:$//g")

for l in $(printf '%s\n' $CHECKSUMSreportFAIL_mem)
do
  destdir="$(echo $l | rev | cut -d"/" -f2-99 | rev)"  #pega apenas o caminho (tudo antes da última barra)
  cd $dirscript/$VERSION_SLACK
  rm -f $l 2>/dev/null  #remove o arquivo a ser reparado

  mkdir -p "$destdir" 2>/dev/null  #força a criação do subdiretório (cria o diretório caso necessário)
  cd $destdir

  k=$? $(wget $show_wget $opt_wget -c "$MIRROR$l")  #armazena "0" quando realizado o download com sucesso
  if [ $k -ne 0 ]  #se <> 0
  then
    echo " "
    echo "ERRO: Downloads não foram concluídos. Provavelmente, por alguma falha de conexão com a internet ou por falta de espaço."
    echo " "
    exit
  fi
done

echo " "
echo "Aguarde (etapa 2) ..."
echo " "

unset CHECKSUMSreportFAIL_mem

cd $dirscript/$VERSION_SLACK

CHECKSUMSreportFAIL_mem=$(cat CHECKSUMSreport.txt | grep "FALHOU: Arquivo a mais" | awk {'print$1'} | sed "s/:$//g")

for l in $(printf '%s\n' $CHECKSUMSreportFAIL_mem)
do
  cd $dirscript
  mkdir -p "$verif_removed" 2>/dev/null  #força a criação do subdiretório (cria o diretório caso necessário)

  mv -b -S .old $dirscript/$VERSION_SLACK/$l $dirscript/$verif_removed
done

unset CHECKSUMSreportFAIL_mem

echo " "
echo "Reparação concluída!"
echo " "

}


function fun_configmenu()  #função que exibe o Menu de Configurações
{

clear
echo " "
echo " "
echo "Menu de Configurações (obs: configurações não persistentes): "
echo " "
echo "1) Manter versões padrão: 32 Bits ["$version_slack32"] e 64 Bits ["$version_slack64"]"
echo "2) Definir versões"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  digitval="1"
elif [ "$digitval" == "2" ]
then
  read -p "Digite a versão de 32 Bits desejada: " digitval
  version_slack32="$digitval"
  read -p "Digite a versão de 64 Bits desejada: " digitval
  version_slack64="$digitval"
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter os diretórios "'"'"${dirselects[@]}"'"'""
echo "2) Incluir "'"'"e t tcl y"'"'""
echo "3) Redefinir manualmente os diretórios padrão"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ] && [ "$digitval" != "3" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  digitval="1"
elif [ "$digitval" == "2" ]
then
  dirselects[${#dirselects[@]}]="e"
  dirselects[${#dirselects[@]}]="t"
  dirselects[${#dirselects[@]}]="tcl"
  dirselects[${#dirselects[@]}]="y"
  dirselects=($(printf '%s\n' "${dirselects[@]}" | sort | uniq))  #faz a ordenação do conteúdo da variável e exclui os duplicados
elif [ "$digitval" == "3" ]
then
  unset dirselects  #zera o array
  echo "Digite uma língua por linha. Para finalizar, entre com uma linha vazia."
  while read dir
  do
    if [ -z $dir ]
    then
      break
    else
      dirselects[${#dirselects[@]}]="$dir"
    fi
  done
  dirselects=($(printf '%s\n' "${dirselects[@]}" | sort | uniq))  #faz a ordenação do conteúdo da variável e exclui os duplicados
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter mirror 1 como padrão: [32 Bits: $mirror32_1] e [64 Bits: $mirror64_1]"
echo "2) Definir mirror 2 como padrão: [32 Bits: $mirror32_2] e [64 Bits: $mirror64_2]"
echo "3) Definir endereço de mirror para download"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ] && [ "$digitval" != "3" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  mirror_num_default="1"
elif [ "$digitval" == "2" ]
then
  mirror_num_default="2"
elif [ "$digitval" == "3" ]
then
  read -p "Digite o endereço do mirror desejado: " digitval
  MIRROR="$digitval"
  mirror32_1="$digitval"
  mirror64_1="$digitval"
  mirror_num_default="1"
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter as línguas do KDE (${LANGUAGE_KDEI[@]})"
echo "2) Definir línguas do KDE"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  digitval="1"
elif [ "$digitval" == "2" ]
then
  unset LANGUAGE_KDEI  #zera o array
  echo "Digite uma língua por linha. Para finalizar, entre com uma linha vazia."
  while read lang
  do
    if [ -z $lang ]
    then
      break
    else
      LANGUAGE_KDEI[${#LANGUAGE_KDEI[@]}]="$lang"
    fi
  done
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter a utilização do modo Passivo do FTP"
echo "2) Utilizar o modo Ativo do FTP"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  opt_wget+=" "
elif [ "$digitval" == "2" ]
then
  opt_wget+=" --no-passive-ftp"
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter mensagens Simplificadas dos downloads"
echo "2) Definir mensagens Detalhadas dos downloads"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  show_wget=" -nv --show-progress"
elif [ "$digitval" == "2" ]
then
  show_wget=" "
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Manter a verificação Integral para a retomada do download interrompido (verifica se cada arquivo realmente foi baixado por completo antes de seguir baixando os restantes)"
echo "2) Definir a verificação Acelerada para a retomada do download interrompido (verifica apenas se existem os arquivos; não verifica se os arquivos estão baixados por completo) [± 11x]"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  opt_wget+=" "
elif [ "$digitval" == "2" ]
then
  opt_wget+=" -nc"
  show_wget=" "  #necessário ter mensagens detalhadas
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "Finalizando o Menu de Configurações... e iniciando o Menu de Operações..."
echo " "
clear

}


function fun_printheader()  #função que exibe o cabeçalho de informações do script
{

header_year=$(cat $0 | head -n 15 | grep "^# Data: [0-9]" | cut -d"-" -f3 | sed "s/ //g")  #filtra o cabeçalho do script pegando apenas o ano da Data
header_version=$(cat $0 | head -n 15 | grep "^# Versão: [0-9]" | sed "s/^# Versão: //g")  #filtra o cabeçalho do script pegando apenas o número da Versão
header_description=$(cat $0 | head -n 15 | grep -A 1 "^# script-" | sed "s/# //g")   #filtra o cabeçalho do script pegando a(s) linha(s) que contém o nome e a descrição do script
header_author=$(cat $0 | head -n 15 | grep "^# Autor: " | sed "s/^# Autor: //g")  #filtra o cabeçalho do script pegando o Autor
header_contact=$(cat $0 | head -n 15 | grep "^# Contato: " | sed "s/^# Contato: //g")  #filtra o cabeçalho do script pegando o Contato
header_license=$(cat $0 | head -n 15 | grep "^# Licença: " | sed "s/^# Licença: //g")  #filtra o cabeçalho do script pegando a Licença

echo $header_description
echo "Versão: $header_version ($header_year) - $header_author"
echo "Contato: $header_contact"
echo "Licença: $header_license"

}


function fun_printversion()  #função que exibe informações da(s) versão(ões) do script
{

numlin_start=$(cat $0 | grep -n "^### \[version\] ###" | cut -d ":" -f1)  #armazena o número da linha
let numlin_start=$numlin_start+1
numlin_end=$(cat $0 | grep -n "^### \[end version\] ###" | cut -d ":" -f1)  #armazena o número da linha
let numlin_end=$numlin_end-1

printf '%s\n' "$(cat $0 | head -n $numlin_end | tail -n $(($numlin_start-$numlin_end)) | sed "s/# //g")"

}

### ###


### Tratamento dos Parâmetros ###

if [ $# -gt 0 ]  #se > 0 (se foi passado algum parâmetro...)
then
  prmtrue="no"  #indica se é um parâmetro válido

  for p in "$@"
  do
    if [ "$p" == "-v" ] || [ "$p" == "--version" ]  #testa a existência do parâmetro conhecido
    then
      prmtrue="yes"
      echo " "
      fun_printheader
      echo " "
      fun_printversion
      echo " "
      exit
    fi
    if [ "$p" == "-c" ] || [ "$p" == "--configmenu" ]  #testa a existência do parâmetro conhecido
    then
      prmtrue="yes"
      fun_configmenu
    fi
  done

  if [ "$prmtrue" == "no" ]  #testa a inexistência de um parâmetro conhecido
  then

    echo " "
    fun_printheader
    echo " "
    echo "Usage: $0 [OPTIONS] {PARAMETERS: no parameters ...}"
    echo " "
    echo "Options: "
    echo "   -c   --configmenu      exibe o menu de configurações (altera versões, mirror, modo do FTP [passivo|ativo], pacotes, tipo de mensagens e de retomada dos downloads ...)"
    echo "   -v   --version      exibe informações da(s) versão(ões) e da licença"
    echo "   -?   --help         exibe informações de ajuda"
    echo " "
    echo "Usage: Ex.: $ $0"
    echo "Usage: Ex.: $ $0 -c"
    echo "Usage: Ex.: $ $0 --configmenu"
    exit
  fi

fi

### ###


### Menu ###

echo " "
echo " "
echo "1) 32 Bits ["$version_slack32"]"
echo "2) 64 Bits ["$version_slack64"]"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  VERSION_SLACK="$version_slack32"
  DIR_SLACK="$dir_slack32"
  if [ "$mirror_num_default" == "2" ]
  then
    MIRROR="$mirror32_2"
  else
    MIRROR="$mirror32_1"
  fi
elif [ "$digitval" == "2" ]
then
  VERSION_SLACK="$version_slack64"
  DIR_SLACK="$dir_slack64"
  if [ "$mirror_num_default" == "2" ]
  then
    MIRROR="$mirror64_2"
  else
    MIRROR="$mirror64_1"
  fi
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Download dos pacotes (iniciar/continuar) [± 1200-2400 MB]"
echo "2) Verificação da integridade (e reparação)"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  break
elif [ "$digitval" == "2" ]
then
  fun_checksum
  exit
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Apenas os diretórios "'"'"${dirselects[@]}"'"'""
echo "2) Incluir kde e kdei(${LANGUAGE_KDEI[@]})"
echo "3) Incluir xfce"
echo "4) Incluir kde, kdei(${LANGUAGE_KDEI[@]}) e xfce"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ] && [ "$digitval" != "3" ] && [ "$digitval" != "4" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  dirselect_kde=no
  dirselect_xfce=no  
elif [ "$digitval" == "2" ]
then
  dirselect_kde=yes
  dirselect_xfce=no  
elif [ "$digitval" == "3" ]
then
  dirselect_kde=no
  dirselect_xfce=yes  
elif [ "$digitval" == "4" ]
then
  dirselect_kde=yes
  dirselect_xfce=yes
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

echo " "
echo "1) Incluir Patches (/patches/packages/)"
echo "2) Não incluir Patches"
read -p "Digite o número da opção desejada: " digitval
if [ -z $digitval ]
then
  echo "Opção padrão assumida: 1"
  digitval="1"
elif [ "$digitval" != "1" ] && [ "$digitval" != "2" ]
then
  echo "Valor não corresponde às opções indicadas."
  echo "Opção padrão assumida: 1"
  digitval="1"
fi
if [ "$digitval" == "1" ]
then
  dirselect_patches=yes
elif [ "$digitval" == "2" ]
then
  dirselect_patches=no
else
  echo "Valor não corresponde às opções indicadas."
  echo "Erro desconhecido."
fi

### ###


### Geração da lista de diretórios ###

if [ "$dirselect_kde" == "yes" ]  #adiciona ou não o kde e kdei à lista de diretórios a serem baixados
then
  dirselects[${#dirselects[@]}]="kde"
  dirselects[${#dirselects[@]}]="kdei"
fi

if [ "$dirselect_xfce" == "yes" ]  #adiciona ou não o xfce à lista de diretórios a serem baixados
then
  dirselects[${#dirselects[@]}]="xfce"
fi

dirselects=($(printf '%s\n' "${dirselects[@]}" | sort | uniq))  #faz a ordenação do conteúdo da variável e exclui os duplicados

### ###


### Validação da lista dos diretórios pretendidos ###

cd $dirscript
mkdir $VERSION_SLACK 2>/dev/null
cd $dirscript/$VERSION_SLACK  

echo " "
echo "Iniciando a validação dos diretórios pretendidos ..."
echo " "

rm -f FILELIST.TXT 2>/dev/null

k=$? $(wget $show_wget $opt_wget -c $MIRROR"FILELIST.TXT")  #armazena "0" quando realizado o download com sucesso
if [ $k -ne 0 ]  #se <> 0
then
  echo " "
  echo "ERRO: Lista dos diretórios pretendidos não foi validada. Provavelmente, por alguma falha de conexão com a internet ou por falta de espaço."
  echo " "
  exit
else
  filelist_mem="$(cat FILELIST.TXT | grep "^drw" | grep "\.\/$DIR_SLACK/" | awk {'print$8'} | sed "s/\.\/$DIR_SLACK\///g")"

  dirvalidexit="yes"
  for dir in "${dirselects[@]}"
  do
    dirvalid="no"
    for l in $(printf '%s\n' $filelist_mem)
    do
      if [ "$dir" == "$l" ]
      then
        dirvalid="yes"
        dirvalidexit="no"
        break
      fi
    done

    if [ "$dirvalid" == "no" ]
    then
      echo "diretório inválido para o mirror indicado: $dir"
      dirvalidexit="yes"
    fi
  done

  if [ "$dirvalidexit" == "yes" ]
  then
    exit
  else
    echo " "
    echo "Lista dos diretórios pretendidos validada!"
    echo " "
  fi

fi

### ###


### Início das atividades ###

cd $dirscript
mkdir $VERSION_SLACK 2>/dev/null
cd $dirscript/$VERSION_SLACK  

echo " "
echo "Iniciando as atividades ... "

### ###


### Geração do arquivo FILELISTselected.TXT ###

echo " "
echo "Gerando FILELISTselected.TXT contendo apenas os diretórios pretendidos ..."
echo " "

k=$? $(wget $show_wget $opt_wget -c $MIRROR"FILELIST.TXT")  #armazena "0" quando realizado o download com sucesso
if [ $k -ne 0 ]  #se <> 0
then
  echo " "
  echo "ERRO: FILELISTselected.TXT não foi gerado. Provavelmente, por alguma falha de conexão com a internet ou por falta de espaço."
  echo " "
  exit
else
  filelist_mem="$(cat FILELIST.TXT | grep "^-rw")"  #copia o arquivo para uma variável filtrando apenas as linhas que correspondem à arquivos
  
  printf '%s\n' "$filelist_mem" | grep -v "[^.]/" > FILELISTselected.TXT  #apenas os arquivos da raiz

  printf '%s\n' "$filelist_mem" | grep "\.\/$DIR_SLACK/" | grep -v "\.\/$DIR_SLACK/[a-z/]" >> FILELISTselected.TXT  #apenas os arquivos da raiz

  for dir in ${dirselects[@]}
  do
    if [ "$dir" == "kdei" ]
    then
      for lang in ${LANGUAGE_KDEI[@]}
      do
        printf '%s\n' "$filelist_mem" | grep "\.\/$DIR_SLACK/$dir/.*$lang.*" >> FILELISTselected.TXT  #apenas os arquivos da língua
      done
    else
      printf '%s\n' "$filelist_mem" | grep "\.\/$DIR_SLACK/$dir/" >> FILELISTselected.TXT
    fi
  done

  if [ "$dirselect_patches" == "yes" ]
  then
    printf '%s\n' "$filelist_mem" | grep "\.\/patches/" | grep -v "\.\/patches/[a-z/]" >> FILELISTselected.TXT
    printf '%s\n' "$filelist_mem" | grep "\.\/patches/packages/" >> FILELISTselected.TXT
  fi

  unset filelist_mem
fi

if [ -s "FILELISTselected.TXT" ]
then
  echo " "
  echo "FILELISTselected.TXT gerado!"
  echo " "
else
  echo " "
  echo "ERRO: FILELISTselected.TXT não foi gerado. Provavelmente, por falta de espaço ou privilégios."
  echo " "
  exit
fi

### ###


### Geração do Cálculo Estimado de Espaço ###

echo " "
echo "Gerando os cálculos do espaço estimado dos downloads ..."
echo " "

if [ -s "FILELISTselected.TXT" ]  #verifica se o arquivo existe
then
  echo " "
  echo "Espaço estimado dos downloads: $(cat FILELISTselected.TXT | awk {'print$5'} | awk '{SUM += $1} END {print SUM /1024 /1024}' | cut -d"." -f1) MB"
  echo " "
  sleep 2
else
  echo " "
  echo "ERRO: Não foi possível fazer a verificação da integridade. Arquivo FILELISTselected.TXT não encontrado."
  echo " "
fi

### ###


### Geração do arquivo CHECKSUMSselected.md5 ###

echo " "
echo "Gerando CHECKSUMSselected.md5 contendo apenas os diretórios pretendidos ..."
echo " "

k=$? $(wget $show_wget $opt_wget -c $MIRROR"CHECKSUMS.md5")  #armazena "0" quando realizado o download com sucesso
if [ $k -ne 0 ]  #se <> 0
then
  echo " "
  echo "ERRO: CHECKSUMSselected.md5 não foi gerado. Provavelmente, por alguma falha de conexão com a internet."
  echo " "
  exit
fi

cat CHECKSUMS.md5 | grep "\.\/" > CHECKSUMSselected.md5  #copia o conteúdo do arquivo

cat FILELISTselected.TXT | awk {'print$8'} | grep "\.\/" | sed "s/^/................................  /g" | sed "s/$/!!!:more:/g" >> CHECKSUMSselected.md5  #acrescenta o conteúdo do arquivo.. e acrescenta uma coluna de pontos.. e acrescenta um texto no final (:more:) para que na ordenação essas linhas fiquem a baixo das linhas correspondentes do arquivo anterior

CHECKSUMSselected_mem=$(cat CHECKSUMSselected.md5)  #copia o conteúdo do arquivo à memória

echo "$CHECKSUMSselected_mem" | sort -k 2 | sed "s/!!!:more://g" | uniq -d -f1 > CHECKSUMSselected.md5  #ordena e retira o texto acrescentado ao final da linha (:more:)

unset CHECKSUMSselected_mem

if [ -s "CHECKSUMSselected.md5" ]
then
  echo " "
  echo "CHECKSUMSselected.md5 gerado!"
  echo " "
else
  echo " "
  echo "ERRO: CHECKSUMSselected.md5 não foi gerado. Provavelmente, por falta de espaço ou privilégios."
  echo " "
fi

### ###


### Downloads dos pacotes ###

cd $dirscript/$VERSION_SLACK  

if [ "$dirselect_patches" == "yes" ]
then
  echo " "
  echo "Iniciando os downloads dos diretórios "'"'"${dirselects[@]}"'"'" e do "'"'"patches"'"'" ..."
  echo " "
else
  echo " "
  echo "Iniciando os downloads dos diretórios "'"'"${dirselects[@]}"'"'" ..."
  echo " "
fi

for l in $(cat FILELISTselected.TXT | awk {'print$8'})
do
  destdir="$(echo $l | rev | cut -d"/" -f2-99 | rev)"  #pega apenas o caminho (tudo antes da última barra)
  cd $dirscript/$VERSION_SLACK  
  mkdir -p "$destdir" 2>/dev/null  #força a criação do subdiretório (cria o diretório caso necessário)
  cd $destdir

  k=$? $(wget $show_wget $opt_wget -c "$MIRROR$l")  #armazena "0" quando realizado o download com sucesso
  if [ $k -ne 0 ]  #se <> 0
  then
    echo " "
    echo "ERRO: Downloads não foram concluídos. Provavelmente, por alguma falha de conexão com a internet ou por falta de espaço."
    echo " "
    exit
  fi
done

echo " "
echo "Downloads concluídos!"
echo " "

### ###


fun_checksum  #chama a verificação da integridade

### ###

Scripts recomendados

Ativando Numlock como serviço e no boot

Exibir configurações de rede

Simples inventário de máquinas em Shell Script

DHCP Configurator

Instalar o wine


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts