rpmgp 7.02 KB
#!/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