f2bccfc0b3
1. Bump version to 7.0 2. Use perestroika v5 repo schema 3. Fixing pool permissions after rsync This change corrects the permissions of the pool folder so that it can be consumed as a repository mirror via nginx. 4. Add packages (deb, rpm) specs Related-bug: #1478118 Related-bug: #1476561 Change-Id: Iada03ddab5b7d551f13692cb1c87a634c2f10947
156 lines
4.3 KiB
Bash
156 lines
4.3 KiB
Bash
#!/bin/bash
|
|
|
|
# Guess filename based on POSSIBLE_COMPRESSIONS variable
|
|
# It will cycle through filenames (myname myname.gz myname.bz2 myname.xz etc...)
|
|
# and return first match that exists in the filesystem
|
|
# $1 -- base filename
|
|
guess_filename()
|
|
{
|
|
local to_return=""
|
|
local file="$1"
|
|
|
|
#debug "Guessing filename for $file"
|
|
if [[ ! -f "$file" ]]; then
|
|
for ext in ${POSSIBLE_COMPRESSIONS[@]}; do
|
|
if [[ -f "$file.$ext" ]]; then
|
|
#debug "Got match $file.$ext"
|
|
to_return="$file.$ext"
|
|
break
|
|
fi
|
|
done
|
|
else
|
|
to_return="$file"
|
|
fi
|
|
echo "$to_return"
|
|
}
|
|
|
|
# Determines if file is compressed, and uncompresses into stdout
|
|
# $1 -- file too cat
|
|
# $2=false -- Try to guess filename
|
|
read_file()
|
|
{
|
|
local file="$1"
|
|
local try_to_guess="${2:-'false'}"
|
|
if [[ ! -f "$file" ]]; then
|
|
if [[ "$try_to_guess" = "false" ]]; then
|
|
return
|
|
else
|
|
file=`guess_filename "$file"`
|
|
[[ -f "$file" ]] || return
|
|
fi
|
|
fi
|
|
|
|
case `file "$file"` in
|
|
*gzip*)
|
|
# We got a GZip
|
|
zcat "$file"
|
|
return;;
|
|
*bzip2*)
|
|
# We got a BZip2
|
|
bzcat "$file"
|
|
return;;
|
|
*XZ*)
|
|
# We got a XZ
|
|
xzcat "$file"
|
|
return;;
|
|
*text*)
|
|
# Must be a plain text
|
|
cat "$file"
|
|
return;;
|
|
esac
|
|
}
|
|
|
|
# Gets distro components from Release file
|
|
# $1 -- path to Release file
|
|
# $2 -- user component list
|
|
get_dist_components()
|
|
{
|
|
local dist_components=( `read_file "$1"| egrep "^Components: "| cut -d' ' -f'2-'` )
|
|
local user_components=${2:-""}
|
|
local to_return=""
|
|
|
|
if [[ -z "$user_components" ]]; then
|
|
echo "$dist_components"
|
|
elif [[ -z $dist_components ]]; then
|
|
echo "$user_components"
|
|
else
|
|
for ucomp in $user_components; do
|
|
if contains "$ucomp" "${dist_components[@]}"; then
|
|
to_return="${to_return} $ucomp"
|
|
fi
|
|
done
|
|
fi
|
|
echo $to_return
|
|
}
|
|
|
|
# Gets distro arches from Release file
|
|
# $1 -- path to Release file
|
|
# $2 -- user arch list
|
|
get_dist_architectures()
|
|
{
|
|
local dist_arches=( `read_file "$1"| egrep "^Architectures: "| cut -d' ' -f'2-'` )
|
|
local user_arches=( $* )
|
|
local to_return=""
|
|
# Filter out arches that not listed in 'ARCHs' global variable
|
|
for arch in ${user_arches[@]}; do
|
|
if contains "$arch" "${dist_arches[@]}"; then
|
|
to_return="${to_return} $arch"
|
|
fi
|
|
|
|
# Special case architecture that is not included in Release arches list
|
|
if [[ "$arch" = "all" ]]; then
|
|
to_return="${to_return} $arch"
|
|
fi
|
|
done
|
|
echo $to_return
|
|
}
|
|
|
|
# Checks dist file validity
|
|
# $1 -- Full path to release file
|
|
# $2 -- Relative path to target file from the repository root
|
|
pkg_file_valid()
|
|
{
|
|
local release="$1"
|
|
local pkg="$2"
|
|
|
|
# Check if release file has an md5sum section, if not then just return OK
|
|
if ! egrep -i '^MD5Sum:\s*$' $release &> /dev/null; then
|
|
debug "Release file '$release' doesn't contain MD5 info"
|
|
return 0
|
|
fi
|
|
|
|
# Get distro basedir
|
|
local dist_base=`dirname "$release"`
|
|
local pkg_path="$dist_base/$pkg"
|
|
|
|
|
|
local pkg_line=`cat "$release" | egrep -i "^ [0-9a-f]{32}\s+[0-9]+\s+$pkg\s*$"`
|
|
|
|
# Check if we found files md5 string. if not return all ok
|
|
# TODO: make option to raise error on missing md5sum
|
|
if [[ -z "$pkg_line" ]]; then
|
|
error "Can't find md5sum for '$pkg' in '$release', skipping"
|
|
return 0
|
|
fi
|
|
|
|
# Get line with MD5SUM for current package
|
|
local expected_md5sum=`echo "$pkg_line" | awk '{print $1}'`
|
|
local expected_size=`echo "$pkg_line" | awk '{print $2}'`
|
|
|
|
# Check file validity if it's not found just empty vars
|
|
local size=`stat -c%s "$pkg_path"`
|
|
local md5sum=`md5sum "$pkg_path"| awk '{print $1}'`
|
|
|
|
if [[ -e $pkg_path ]] && \
|
|
[[ $size = $expected_size ]] && \
|
|
[[ $md5sum = $expected_md5sum ]]; then
|
|
debug "File '$pkg' checked by '$release' is OK"
|
|
return 0
|
|
fi
|
|
error "File '$pkg_path' checked by '$release' is BAD"
|
|
debug "File details:"
|
|
debug "size = $size, expected $expected_size"
|
|
debug "md5sum = $md5sum, expected $expected_md5sum"
|
|
return 1
|
|
}
|