Tenho uma máquina localizada em um ambiente seguro que não possui acesso à internet. Eu tenho uma carga base do CentOS com um punhado de RPMs adicionais. Isso inclui uma instalação básica do PERL sem módulos adicionais. Também não tem o GCC instalado, então não posso instalar novos módulos manualmente nem usar o CPAN para instalá-los. Portanto, preciso de uma solução Perl pura.
Pediram-me para criar um script Perl que validará se a máquina possui uma lista específica de RPMs instalados e se eles são de uma versão específica ou mais recente.
Aqui está o que eu tenho até agora:
#!/usr/bin/perl
use strict;
use warnings;
# This is the list of RPMs to look for on the machine.
my @RPMs = ("bwm-ng",
"celt051",
"device-mapper-multipath",
"device-mapper-multipath-libs",
"dhcp",
"dhcp-common",
"ebtables",
"freeglut",
"glusterfs-api",
"glusterfs-libs",
"gnutls-utils",
"gpm",
"hmaccalc",
"iftop",
"iperf",
"ipsec-tools",
"iptraf",
"iscsi-initiator-utils",
"libsysfs",
"lm_sensors",
"lm_sensors-libs",
"log4cpp",
"lrzsz",
"lzop",
"mcsctrans",
"minicom",
"nc",
"netcf-libs",
"net-snmp",
"net-snmp-libs",
"net-snmp-utils",
"omping",
"perl-AppConfig",
"perl-Pod-POM",
"perl-Template-Toolkit",
"pimd",
"python-lxml",
"quagga",
"radvd",
"smcroute",
"usbredir",
"yajl");
# These are the RPM versions that they should be equal to or newer than.
my @RPMVersions = ("bwm-ng-0.6-6.el6.2.x86_64",
"celt051-0.5.1.3-0.el6.x86_64",
"device-mapper-multipath-0.4.9-87.el6.x86_64",
"device-mapper-multipath-libs-0.4.9-87.el6.x86_64",
"dhcp-4.1.1-49.P1.el6.centos.x86_64",
"dhcp-common-4.1.1-49.P1.el6.centos.x86_64",
"ebtables-2.0.9-6.el6.x86_64",
"freeglut-2.6.0-1.el6.x86_64",
"glusterfs-api-3.4.0.57rhs-1.el6_5.x86_64",
"glusterfs-libs-3.4.0.57rhs-1.el6_5.x86_64",
"gnutls-utils-2.8.5-18.el6.x86_64",
"gpm-1.20.6-12.el6.x86_64",
"hmaccalc-0.9.12-2.el6.x86_64",
"iftop-1.0-0.7.pre4.el6.x86_64",
"iperf-2.0.5-11.el6.x86_64",
"ipsec-tools-0.8.0-25.3.x86_64",
"iptraf-3.0.1-14.el6.x86_64",
"iscsi-initiator-utils-6.2.0.873-14.el6.x86_64",
"libsysfs-2.1.0-7.el6.x86_64",
"lm_sensors-3.1.1-17.el6.x86_64",
"lm_sensors-libs-3.1.1-17.el6.x86_64",
"log4cpp-1.0-13.el6_5.1.x86_64",
"lrzsz-0.12.20-27.1.el6.x86_64",
"lzop-1.02-0.9.rc1.el6.x86_64",
"mcsctrans-0.3.1-4.el6.x86_64",
"minicom-2.3-6.1.el6.x86_64",
"nc-1.84-24.el6.x86_64",
"netcf-libs-0.2.4-3.el6.x86_64",
"net-snmp-5.5-54.el6.x86_64",
"net-snmp-libs-5.5-54.el6.x86_64",
"net-snmp-utils-5.5-54.el6.x86_64",
"omping-0.0.4-1.el6.x86_64",
"perl-AppConfig-1.66-6.el6.x86_64",
"perl-Pod-POM-0.25-2.el6.x86_64",
"perl-Template-Toolkit-2.22-5.el6.x86_64",
"pimd-2.3.0-1.x86_64",
"python-lxml-2.2.3-1.1.el6.x86_64",
"quagga-0.99.23.1-2014082501.x86_64",
"radvd-1.6-1.el6.x86_64",
"smcroute-2.0.0-0.x86_64",
"usbredir-0.5.1-2.el6.x86_64",
"yajl-1.0.7-3.el6.x86_64");
my $RPMname; #This reprepsents an individual RPM name within the @RPMs array.
foreach $RPMname (@RPMs){ # Loop through the @RPMs array and query the RPM database for each RPM.
my $cmd = "rpm -qa | grep " . $RPMname;
my @cmdResults = `$cmd`;
if (! @cmdResults){
print "\tMissing RPM: " . $RPMname . "\n\n"; # If the RPM isn't installed; inform the user.
} else {
foreach(@cmdResults){
print "\t" . $_ . "\n"; # Print the version of the RPM that's currently installed.
# Compare the RPM version that's installed with the corresponding version that should be installed
# as listed in the @RPMVersions array.
# write some magic here. <------
}
}
}
exit(0);
Eu encontrei o que parece ser uma solução possível, mas não consigo descobrir como ajustar o código de ajuste ao meu cenário.
veja aqui: http://www.perlmonks.org/bare/?node=240384
Não posso usar o RPM::VersionSort ou vários outros módulos relacionados ao RPM por causa das restrições que mencionei acima.
Qualquer ajuda seria grandemente agradecida.
Obrigado!
Algumas dicas
Você não precisa grep por exemplo
Se um pacote estiver faltando $? é 1
Você pode obter a versão de um pacote rpm instalado usando --queryformat
Há muito mais que você pode fazer com apenas o rpm— dê uma olhada no site rpm.org .
Você pode até conseguir escapar sem usar perl, então dê uma olhada na resposta de Dennis aqui no SO .
Embora isso não responda à minha pergunta original, gostaria de fornecer o que acabei. Consegui convencer aqueles que estão no poder a permitir que eu instale o módulo Perl RPM::VersionSort. Portanto, esta não é uma solução Pure Perl como eu esperava encontrar.
Aqui está o que estou usando agora para quem estiver interessado:
;