#!/bin/sh # 2004-2009 (c) Etersoft www.etersoft.ru # Author: Vitaly Lipatov <lav@etersoft.ru> # Public domain # # ��������� �������� src.rpm-����� � ������ �� ������������ (�� ��������� ALT Linux) ��� ������ � ��������� ���������. # ����� ����� ����� ������� �������� ������ � ����������� # ������� ������� ������ �� ������� apt-get source ����� # -c - checkonline # -n - do not install # load common functions, compatible with local and installed script . `dirname $0`/../share/eterbuild/functions/common load_mod rpm repl # path to ALT Linux's repositories REPOSITORY="files/SRPMS obsolete orphaned" # loads repos file and fill SYSNAME and SYSURL arrays load_systems_list() { local IDX=0 local line while read line ; do # skip comments echo $line | grep "^#" >/dev/null && continue SYSNAME[$IDX]=${line/ *.*/} #FTP[$IDX]=${line/.* \+/} SYSURL[$IDX]=$(echo $line | sed -e "s|.* \+||g") IDX=$(($IDX+1)) done < $ETERBUILDETC/repos } list_systems() { echo "Known systems:" for ((i=0; i < ${#SYSNAME[*]}; i++)) ; do printf "[%-17s] %s\n" ${SYSNAME[$i]} ${SYSURL[$i]} done echo echo "You can add system to /etc/eterbuild/repos" } html_filter() { grep "src.rpm" | sed -e "s|.*href=\"||g" | sed -e "s|\".*||g" } list_filter() { sed -e "s|.src.rpm$||g" } # Using: git_list idx [force] # set LIST variable to list file get_list() { [ -n "$VERBOSE" ] && echo "get_list for $1" local URL=${SYSURL[$1]} local FORCE=$2 local SYS=${SYSNAME[$1]} local CURL=curl which $CURL 2>/dev/null >/dev/null || fatal "curl command needed for download" LIST=$OURTMPDIR/tmp-rpmgpall-$SYS if [ ! -f "$LIST" ] || [ "$FORCE" = "force" ] ; then echo "Get list for $SYS from $URL" #curl -l $URL/ >$LIST # suitable for ftp and http lists $CURL -l $URL/ | html_filter >$LIST else echo "List for $SYS" fi } get_system_idx() { if [ -z "$1" ] ; then return 1 fi for ((i=0; i < ${#SYSNAME[*]}; i++)) ; do if [ ${SYSNAME[$i]} = "$1" ] ; then echo $i return 0 fi done return 1 } check_name() { if [ -z "$1" ] ; then echo "Error: missed package param" exit 1 fi NLIST=`cat $LIST | grep -i $1` # if [ `cat $LIST | list_filter | grep -i $1 | wc -l` -gt 1 ] ; then #echo "Please type a full name of the package" # print_list $NLIST # return 1 # fi if [ -z "$NLIST" ] ; then echo "$1: Not found" return 1 fi return 0 } check_system() { local i local IDX=$1 local URL=${SYSURL[$IDX]} #echo "Check for $SYSTEM" get_list $IDX #ls -l $LIST check_name $NAME if [ "$DOWNLOADALL" ] ; then for i in $NLIST ; do wget -c $URL/$i done fi } update_cache_list() { load_systems_list # if followed by system name IDX=`get_system_idx "$1"` if [ -n "$IDX" ] ; then get_list $IDX force shift exit 0 fi # update all systems for ((i=0; i < ${#SYSNAME[*]}; i++)) ; do get_list $i force done } Usage="Usage: $name [options] [system] pkgname" function mygetopts() { name=${0##*/} Descr="$name - various package download operations" phelp() { # TODO: improve description echog "$Descr" echog "$Usage" echog "Options:" echog "rpmgp [-a -c -n] [system] pkgname - download src.rpm from 'system' repository to RPM/SRPMS and install it" echog " name - installed package name or src.rpm" echog " system - name of system (ALT Linux by default if -a missed too)" echog " -a search pkgname in all known repositories" echog " -b install packages needed for build (use sudo apt-get) (need spec not package name)" echog " -c check if this package exists in the ALT Linux repository" echog " -d download all matched packages" echog " -l list packages needed for build (in local pkg system notation) (experimental)" echog " -n do not install after download, just download in current dir" echog " -r refresh package list (download it again)" echog " -s list all known remote repositories" exit 0 } TRYINST="1" while getopts :habcdlnrs opt; do case $opt in h) phelp; exit 0;; a) ALLSYSTEM=1 ;; b) INSTALLBINARY=1 ;; c) CHECKONLINE=1 ;; d) DOWNLOADALL=1 ;; l) LISTREQS=1 ;; n) TRYINST="" ;; r) UPDATECACHE=1 ;; s) load_systems_list list_systems exit 0 ;; +?) echog "$name: options should not be preceded by a '+'." 1>&2; exit 2;; # ?) echog "$name: $OPTARG: bad option. Use -h for help." 1>&2 ; exit 2;; ?) OPTIND=$((OPTIND-1)); break; esac done # FIXME: ��������� ���������� � ������ (��������, -i, -b) # remove args that were options if [ $# -gt 0 ]; then shift $((OPTIND - 1)) fi # pass other options to RPM: LISTARGS=$@ } mygetopts "$@" # remove args that were options if [ $# -gt 0 ]; then shift $((OPTIND - 1)) fi # optional arg if [ -n "$UPDATECACHE" ] ; then update_cache_list $1 exit 0 fi test -z "$LISTARGS" && fatal "Please run with spec/package name" # ������ �������� ������, ������� (� ���������?), � ������� ���������� # �������� ���-����� ������� �� �������� ������� # �������� ��������� ����� ����� # # ��������� - [�������] ����� # install binary packages if [ -n "$INSTALLBINARY" ] ; then parse_cmd_pre "$@" pack_src_rpm $LISTRPMARGS echog "Running apt-get for install needed packages for $LISTBUILT" # FIXME: ALT Specific $SUDO apt-get build-dep $LISTBUILT exit 0 fi # lists packages for build if [ -n "$LISTREQS" ] ; then print_target_buildreq $1 exit 0 fi # Check online if [ -n "$CHECKONLINE" ] ; then if [ -f $1 ] ; then build_rpms_name "$1" SRCRPM=$NAMESRPMIN else echo $1 | grep rpm 2>/dev/null && SRCRPM=$1 || SRCRPM=`rpm -q $1 --queryformat "%{SOURCERPM}\n" | tail -n 1` fi RET="MISSED" for i in $REPOSITORY ; do echog "Checking in repository $i ..." rsync -n --progress $RSYNCSISYPHUS/$i/$SRCRPM >/dev/null 2>&1 && { RET=$i; break; } done echog "Repository Filename" printf "%-12s %30s\n" $RET $SRCRPM exit 0 fi if [ -n "$2" ] && [ "$1" = "all" ] ; then shift ALLSYSTEM=1 fi # Check concrete system # two params: system, package if [ -n "$2" ] ; then NAME=$2 load_systems_list IDX=`get_system_idx "$1"` if [ -n "$IDX" ] ; then check_system $IDX print_list $NLIST else #fatal "Unknown system '$1', use rpmgp -s for get list" NAME= fi exit 0 else NAME=$1 fi # Check all systems if [ -n "$ALLSYSTEM" ] ; then load_systems_list # search throw all systems for ((i=0; i < ${#SYSNAME[*]}; i++)) ; do echo check_system $i print_list $NLIST done exit 0 fi echo echo "########################################" if [ -z "${1/*src.rpm/}" ] then # it is src.rpm package SRCRPM=$1 else if [ -z "${1/*rpm/}" ] ; then # it is rpm package (locale placed?) SRCRPM=`rpm -qp $1 --queryformat "%{SOURCERPM}\n"` else SRCRPM=`rpm -q $1 --queryformat "%{SOURCERPM}\n"` fi fi test -z "$SRCRPM" && fatal "Cannon find package for $1" echog "Try to download $SRCRPM" test -z ${TRYINST} || { mkdir -p $RPMTOPDIR/SRPMS && cd $RPMTOPDIR/SRPMS ; } echog "Downloading in $(pwd)" for i in $REPOSITORY do echo "--------Check in $i-----------" rsync -vay --partial --checksum --copy-links \ --delete-after --progress $RSYNCSISYPHUS/$i/$SRCRPM ./$SRCRPM && break done test -z ${TRYINST} && exit 0 echo echog "Installing..." rpm -iv $SRCRPM