2009-12-10 6 views
0

Я хочу, чтобы написать сценарий, чтобы найти последнюю версию оборотов данного пакета доступных от зеркала для например: http://mirror.centos.org/centos/5/updates/x86_64/RPMS/найти последнюю версию RPMs от зеркала

Скрипт должен быть в состоянии работать на большинстве linux (например, centos, redhat, ubuntu). Поэтому решение на основе yum не является вариантом. Есть ли существующий скрипт, который делает это? Или может кто-нибудь дать мне общую идею о том, как это сделать?

ответ

1

Thx к levislevis85 для WGET кли. Попробуйте следующее:

Оставьте комментарий, иначе код будет не читаемым.

Попробуйте это:

ARCH="i386" 
PKG="pidgin-devel" 
URL=http://mirror.centos.org/centos/5/updates/x86_64/RPMS 
DL=`wget -O- -q $URL | sed -n 's/.*rpm.>\('$PKG'.*'$ARCH'.rpm\).*<td align="right">\(.*\)-\(.*\)-\(.*\) \(..\):\(..\) <\/td><td.*/\4 \3 \2 \5 \6 \1/p' | sort -k1n -k2M -k3n -k4n -k5n | cut -d ' ' -f 6 | tail -1` 
wget $URL/$DL 

Что это делает:
Wget - получить индексный файл
СЭД - вырезать некоторые части и положить его вместе в другом порядке. Если в результате Год Месяц День Час Минута и пакет, как:

2009 Oct 27 01 14 pidgin-devel-2.6.2-2.el5.i386.rpm 
2009 Oct 30 10 49 pidgin-devel-2.6.3-2.el5.i386.rpm 

рода - порядок столбцов п остается для численного и М в месяц
вырезать - вырезать, поданную 6
хвост - показать только последнюю запись

проблема с этим может быть, если какой-то более старый пакет выпускается после более нового, тогда этот скрипт также потерпит неудачу. Если результат сайта изменится, сценарий завершится неудачно. Всегда есть много точек, где сценарий может потерпеть неудачу.

+0

Отлично. Большое спасибо. –

+0

это не работает, потому что сортировка не соответствует действительности. См. Мой комментарий для Dennis Williamson –

+0

ответ на мой пост, для лучшей читаемости. Надеюсь, поможет. – user224243

0

Попробуйте это (что требует lynx):

lynx -dump -listonly -nonumbers http://mirror.centos.org/centos/5/updates/x86_64/RPMS/ | 
    grep -E '^.*xen-libs.*i386.rpm$' | 
    sort --version-sort | 
    tail -n 1 

Если ваш sort не --version-sort, то вам придется разобрать версию из файла или надеяться, что правильный сорт будет делать правильная вещь.

Возможно, вы можете сделать что-то подобное с wget или curl или даже скриптом Bash с использованием перенаправления с /dev/tcp/HOST/PORT. Проблема заключается в том, что тогда вам нужно будет parse HTML.

+0

Эй спасибо за сортировку - отзыв-sort tip. –

+0

вид -V, похоже, есть ошибка cat a | /build/toolchain/lin32/coreutils-8.2/bin/sort -V kernel-2.6.18-164.2.1.el5.x86_64.rpm kernel-2.6.18-164.6.1.el5.x86_64.rpm kernel -2.6.18-164.el5.x86_64.rpm результат должен быть ядра 2.6.18-164.el5.x86_64.rpm ядра 2.6.18-164.2.1.el5.x86_64.rpm ядра -2.6.18-164.6.1.el5.x86_64.rpm –

+0

Это действительно не означает номера версий. Он не знает, что «el5» должен появиться до «2.1.el5».Главное, что он знает, это, например, «a10z», «a1z», «a2z» - это альфа-порядок, а «a1z», «a2z», «a10z» - порядок версий. В этом примере «az» будет сортироваться в конце в любом случае. –

1

с помощью Wget и поглазеть

#!/bin/bash 
pkg="kernel-headers" 
wget -O- -q http://mirror.centos.org/centos/5/updates/x86_64/RPMS | awk -vpkg="$pkg" 'BEGIN{ 
    RS="\n";FS="</a>" 
    z=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",D,"|") 
    for(i=1;i<=z;i++){ 
     date[D[i]]=sprintf("%02d",i) 
    } 
    temp=0 
} 
$1~pkg{ 
    p=$1 
    t=$2 
    gsub(/.*href=\042/,"",p) 
    gsub(/\042>.*/,"",p) 
    m=split(t,timestamp," ") 
    n=split(timestamp[1],d,"-") 
    q=split(timestamp[2],hm,":") 
    datetime=d[3]date[d[2]]d[1]hm[1]hm[2] 
    if (datetime >= temp){ 
     temp=datetime 
     filepkg = p 
    } 
} 
END{ 
    print "Latest package: "filepkg", date: ",temp 
}' 

пример пробег выше:

linux$ ./findlatest.sh 
Latest package: kernel-headers-2.6.18-164.6.1.el5.x86_64.rpm, date: 200911041457 
+0

Я дал вам голосование за «wget -O- -q » cli. Я должен был лениться, чтобы прочитать страницу man для wget. – user224243

Смежные вопросы