[Script] Para atualizar espelhos [mirror] no Arch (16-02-2020)

19-02-20
atualizado comando do rankmirror ( -r community )

20-01-2020
atualizado o texto do pacote que não está instalado

Oi pessoal
Existem alguns scripts para este processo.
Segue um script que fiz e utilizo para atualizar as mirror no Arch.
Trabalha direto com o arquivo all, disponibilizado pelo Arch.
https://www.archlinux.org/mirrorlist/all/

  • Baixa as mirrors dos países escolhidos
  • Descomenta as mirrors
  • Aplica rankmirrors
  • Faz backup e copia a mirrorlist e apaga backup
  • Os arquivos são criados na pasta /tmp
  • Se necessário o sudo será utilizado
#!/bin/bash
# 
# swatquest

declare -rx NOMESCRIPT=${0##*/} # NOMESCRIPT é o nome deste script
declare -rx curl="/usr/bin/curl" # comando curl
declare -rx pv="/usr/bin/pv" # comando pv
declare -rx rankmirrors="/usr/bin/rankmirrors"  # comando rankmirrors

if [ ! -x "$curl" ]; then
 printf "$NOMESCRIPT: O pacote curl não está instalado.\n" >&2
 exit 192
fi

if [ ! -x "$pv" ]; then
 printf "$NOMESCRIPT: O pacote pv não está instalado.\n" >&2
 exit 192
fi

if [ ! -x "$rankmirrors" ]; then
 printf "$NOMESCRIPT: O pacote pacman-contrib não está instalado.\n" >&2
 exit 192
fi

[ "$UID" != 0 ] && SU=sudo

# Pega mirrorlist all do site
curl -s  https://www.archlinux.org/mirrorlist/all/ -o /tmp/all

# Verifica se está conectado
if [[  $? != 0 ]]; then
echo "Não conectado";
exit 0
fi

paises() {
   cat /tmp/all | grep "^##" | sed -r -n '5,$ s/([^*]+).*/\0/p' | sed 's/^## //g'
}

# Monta lista de países
paises | nl -s" "|column 

QTD=`paises | wc -l`;
let "QTD2=$QTD +1"

while read -p "Escolha os países [ padrão=todos ]:" -a PAISES ; do
  for a in ${PAISES[@]}; do
   [[ $a -ge $QTD ]] && break
  done
   [[ $PAISES = [a-z]* ]] && continue
   [[ $a -lt $QTD2 ]] && break
done

# Salvar e alterar IFS 
ANTIGOIFS=$IFS
IFS=$'\n'

CAPTURA=($(for i in "${PAISES[@]}"; do paises | awk "NR == $i {print; exit}";done))

# Restaurar IFS e LANG
IFS=$ANTIGOIFS 

contador=${#CAPTURA[@]}

if [[ ${contador} -eq 0 ]]; then
  cat /tmp/all  > /tmp/all2 
else
  for (( i=0; i<${contador}; i++ )); do  cat /tmp/all  | sed -r -n "/${CAPTURA[$i]}/,/^$/p";done > /tmp/all2 
fi

# Remover arquivo all
rm /tmp/all

# Descomentar mirrors
   echo "Descomentando as mirrors."
   sed '/^#S/ s|#||' -i "/tmp/all2"

# Aplicar rankmirrors
   echo -e "Atenção:\n É recomendável utilizar o rankmirrors, pois ele determina a melhor conexão."
   while read -p "Você quer utilizar o script rankmirrors? [S/n]" RESPRANK ; do
     if [[ $RESPRANK = "" ]]; then
       RESPRANK="S"; break
     elif [[ $RESPRANK = [SsNn] ]]; then
       break
     fi
    done
     if [[ $RESPRANK = [Ss] ]]; then
       while read -p "Qual a quantidade de servidores? [padrão 6, 0 para todos, máximo 999]" RESPQUANT ; do
          if [[ $RESPQUANT = "" ]]; then
              RESPQUANT="6"; break
          elif  [[ $RESPQUANT = [0-9] ]]; then
            break
          elif  [[ $RESPQUANT = [0-9][0-9] ]]; then
            break          
          elif  [[ $RESPQUANT = [0-9][0-9][0-9] ]]; then
            break
           fi
       done
       echo "Executando rankmirrors."
       echo "O processo pode demorar um pouco."
   	 rankmirrors -r community  -n $RESPQUANT "/tmp/all2" | pv -t > /tmp/mirrorlist
         rm /tmp/all2
   	 echo "Rankmirrors finalizado."
     elif [[ $RESPRANK = [Nn] ]]; then
   	 echo "Rankmirrors não executado."
     fi

# Backup e copia do arquivo
   echo "Se for necessário, o comando sudo será utilizado."
   echo "Será feito um backup da mirrorlist em /etc/pacman.d/ com o nome \"mirrolist.bkp\"."
   while read -p "Você quer mover o arquivo para a pasta \"/etc/pacman.d/\"? [S/n]" RESPCOPIAR ; do
     if [[ $RESPCOPIAR = "" ]]; then
       RESPCOPIAR="S"; break
     else  	   
       [[ $RESPCOPIAR = [SsNn] ]] && break
     fi
    done
     if [[ $RESPCOPIAR = [Ss] ]]; then
       echo "Criando backup."
       $SU cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bkp
        if [[ -f /tmp/all2 ]]; then
	  echo "Definindo permisão para 744."
          chmod 744 /tmp/all2
 		  chmod -x /tmp/all2
	  echo "Modificando nome do dono e do grupo para root." 
          $SU chown root:root /tmp/all2
   	  echo "Movendo arquivo."
   	  $SU mv /tmp/all2 /etc/pacman.d/mirrorlist
	elif [[ -f /tmp/mirrorlist ]]; then
	  echo "Definindo permisão para 744."
          chmod 744 /tmp/mirrorlist
          chmod -x /tmp/mirrorlist
	  echo "Modificando nome do dono e do grupo para root." 
          $SU chown root:root /tmp/mirrorlist 
   	  echo "Movendo arquivo."
   	  $SU mv /tmp/mirrorlist /etc/pacman.d/mirrorlist
	fi
     elif [[ $RESPCOPIAR = [Nn] ]]; then
       echo "Arquivo não copiado."
       echo "Um dos arquivos temporários estão na pasta \""/tmp/"\""
       echo -e "Com rankmirrors: mirrorlist\nSem rankmirrors: all2" 
       exit 0
      fi


# Apagar arquivo
   while read -p "Você quer apagar o arquivo de backup ou restaurar a mirrolist? [A/r]" RESPDELBACKUP ;
   do
     if [[ $RESPDELBACKUP = "" ]]; then
       RESPDELBACKUP="A"; break
     else  	   
       [[ $RESPDELBACKUP = [AaRr] ]] && break
     fi
   done
     if [[ $RESPDELBACKUP = [Aa] ]]; then
       echo "Apagando o arquivo de backup em \"/etc/pacman.d/\"."
       $SU rm /etc/pacman.d/mirrorlist.bkp
     elif [[ $RESPDELBACKUP = [Rr] ]]; then
       echo "Restaurando o arquivo de backup em \"/etc/pacman.d/\"."
       $SU mv /etc/pacman.d/mirrorlist.bkp /etc/pacman.d/mirrorlist
     fi

exit 0
7 Curtidas

atualizado comando

para
rankmirrors -r community -n $RESPQUANT “/tmp/all2” | pv -t > /tmp/mirrorlist

agora trabalhará direto com o repositório community

Por ser o maior repositório a resposta será mais confiável.

1 Curtida