Solaris: PKG - Script para verificar todos os pacotes exceto por alguns

5

Estou tentando verificar todos os pacotes, exceto uma lista predefinida de pacotes que sei que vão falhar por razões conhecidas. Esse script será executado em todos os sistemas Solaris em nosso ambiente para confirmar uma linha de base do sistema.

Estou aberto a qualquer técnica que funcione aqui, e é possível colocar uma única linha (Limitação da ferramenta que estou usando para validação).

Meu pensamento inicial era que eu pegaria uma lista de pacotes, passaria pelo AWK para pegar o nome do pacote, filtraria os pacotes que eu não queria e depois executaria um pacote individual de verificação em cada pacote que permanecesse individualmente. / p>

Este é o código que criei abaixo:

pkg list | awk 'BEGIN {c=0} $1 == "exclude1" || $1 == "exclude2" { next } { system("pkg verify " $1); c++ } END { if (c == 0) print "none" }'

O problema em que estou me deparando é que não estou vendo nenhuma saída, embora eu saiba que deve haver algumas coisas que falham na verificação do pacote.

Eu pensei que o sistema (iria capturar a saída, mas eu sou relativamente novo no AWK, e poderia ser que eu esteja entendendo mal alguma coisa.

    
por Doug 05.05.2015 / 22:38

2 respostas

1

No Solaris 11.3, você desejará usar nawk em vez de awk . nawk ("new awk ") é instalado por padrão e deve estar no seu caminho ( /usr/bin/nawk ).

A função system() em awk (qualquer implementação) não retorna a saída do comando, mas seu código de saída. Está tudo bem, você provavelmente não quer a saída real de pkg de qualquer maneira. O comando pkg sairá com um código de saída diferente de zero se algo der errado (consulte o manual pkg ).

O pipeline a seguir pegará a saída pkg list e ignorará a primeira linha (que é um cabeçalho) e todas as linhas correspondentes aos nomes dos pacotes excluídos. Para as linhas restantes de entrada, ele executará pkg verify a system() com o nome do pacote.

Se pkg verify retornar um status de saída diferente de zero, ele incrementará um contador. No final do processamento, o contador será exibido, mostrando quantos erros de verificação ocorreram.

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { if (system("pkg verify " $1)) { e++ } } END { printf("%d errors\n", e) }'

Isso é bastante ineficiente. É mais rápido obter uma lista dos pacotes e verificá-los de uma só vez:

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { print $1 }' | ( xargs pkg verify ) || echo "there were errors"

Se você tem uma lista de pacotes para ignorar em um arquivo:

pkg list | /usr/xpg4/bin/grep -F -v -f excluded.txt | nawk 'NR > 1 { print }' | ( xargs pkg verify ) || echo "there were errors"
    
por 17.02.2017 / 17:03
0

Altere seu script para usar o gawk em vez do awk.

Teste simples:

# pkg list|awk '{system("pkg verify $1")}'
# 

# pkg list|gawk '{system("pkg verify $1")}'
PACKAGE                                                                 STATUS
pkg://solaris/driver/storage/ssd                                         ERROR
    
por 06.05.2015 / 11:03