scripting uma instalação “manual” do apt-get de pacotes guardados

1

TL; DR: existe uma maneira de "automaticamente" instalar qualquer pacote guardado? Eu sei que apt-get dist-upgrade é muito contundente de um instrumento.

Detalhes ...

Eu tenho um script bash que é executado (periodicamente) para manter as VMs do Ubuntu Desktop em um estado consistente.

Ele faz a rotina usual apt-get update ... apt-get upgrade . Claro, existem os pacotes periódicos de devolução.

Resolvi isso até agora adicionando os pacotes mantidos para uma lista manual de apt-get install <whatever was kept back> . Eu comecei a explorar uma maneira de tornar isso menos manual.

Na época em que me encontrei (seriamente) ponderando como refatorar sudo apt-get -V upgrade | grep '=>' | grep -Ei '([A-Z]+(-)?)+' -o | sed 'N;s/\n/ /;' para legibilidade, ocorreu-me que talvez haja uma maneira melhor. (sim ... eu também não consertei os bugs nessa linha)

A horripilância acima foi uma tentativa de retirar os nomes dos pacotes (não versionados) para poderem passar dinamicamente para apt-get install .

Então, é que existe uma maneira melhor de identificar os pacotes guardados e instalá-los via apt-get install ?

    
por hackenfreude 13.05.2015 / 05:32

1 resposta

2

Eu fiz mais coisas sobre o problema (e aprendi muito mais sobre sed ao longo do caminho). Eu não estou convencido de que este é o melhor caminho, mas é um caminho. Se alguém tiver uma maneira melhor de fazer isso, por favor responda, e eu ficarei feliz em responder.

sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d'

A opção -s de apt-get upgrade indica uma execução a seco em vez de uma instalação real. Eu canalizo o texto de saída dry-run para sed, onde a mágica acontece. No sed, -n torna isso silencioso, então apenas o que eu digo para imprimir realmente é impresso. O o que imprimir é definido por um regex inicial e final. Iniciar com uma linha correspondente a "back:" e fim com uma linha correspondente a "upgraded". A sintaxe do sed foi complicada no início ... linuxcommando < ajudou-me a escolher a gama básica de linhas. Esse último p está dizendo sed "ok ... imprima agora".

A saída do primeiro sed é algo como:

  

Os seguintes pacotes foram mantidos:

     

thing1 thing2 newthing3

     

42 atualizados, 7 recém-instalados 1 para remover e 3 não atualizados.

Eu canso que para outro, mais simples sed que cai as primeiras e últimas linhas ( 1d;$d ). Note, existem maneiras de fazer magia de deslocamento de linha no primeiro sed, mas eu senti que isso fez o single sed muito confuso. Eu estou bem usando um segundo sed, que deixa apenas:

  

thing1 thing2 newthing3

E esses são os pacotes mantidos para instalação manual.

kept_back_packages=$(sudo apt-get upgrade -s | sed -n '/back:/,/upgraded./p' | sed '1d;$d')
sudo apt-get install $kept_back_packages -y

(o -y é apenas um suposto yes para o apt-get com script).

Nota:

quando não há pacotes retidos, isso trata tudo graciosamente e não faz nada. Uma string vazia é passada para o apt-get install, e tudo bem.

    
por hackenfreude 15.05.2015 / 05:27