| 1 |
#!/usr/bin/bash |
| 2 |
# Generate pkgutil catalog and descriptions from .pkg.gz files in EXPORTDIR |
| 3 |
# Writes catalog + descriptions to OUTDIR. |
| 4 |
|
| 5 |
EXPORTDIR=/export/home/ai/ozsw-export |
| 6 |
OUTDIR=/tmp/ozsw-catalog.$$ |
| 7 |
TMPBASE=$OUTDIR/work |
| 8 |
|
| 9 |
mkdir -p "$OUTDIR" "$TMPBASE" |
| 10 |
> "$OUTDIR/catalog" |
| 11 |
> "$OUTDIR/descriptions" |
| 12 |
|
| 13 |
# Deps to strip: GAR artifacts that don't exist in our repo |
| 14 |
STRIP_DEPS="CSWcas-dictconf OZSWcommon" |
| 15 |
|
| 16 |
for pkgfile in "$EXPORTDIR"/*.pkg.gz; do |
| 17 |
filename=$(basename "$pkgfile") |
| 18 |
echo "Processing $filename ..." >&2 |
| 19 |
|
| 20 |
# File size and md5 |
| 21 |
size=$(wc -c < "$pkgfile" | tr -d ' \t') |
| 22 |
md5=$(/opt/ozsw/bin/openssl md5 < "$pkgfile" | awk '{print $NF}') |
| 23 |
|
| 24 |
# Extract to temp dir |
| 25 |
pkgtmpdir="$TMPBASE/pkg" |
| 26 |
rm -rf "$pkgtmpdir" |
| 27 |
mkdir -p "$pkgtmpdir/stream" "$pkgtmpdir/root" |
| 28 |
|
| 29 |
gunzip -c "$pkgfile" > "$pkgtmpdir/stream/pkg.pkg" |
| 30 |
pkgtrans "$pkgtmpdir/stream/pkg.pkg" "$pkgtmpdir/root" all 2>/dev/null || { |
| 31 |
echo " WARNING: pkgtrans failed for $filename" >&2 |
| 32 |
rm -rf "$pkgtmpdir" |
| 33 |
continue |
| 34 |
} |
| 35 |
|
| 36 |
pkgdir=$(ls -d "$pkgtmpdir/root"/OZSW* 2>/dev/null | head -1) |
| 37 |
if [ -z "$pkgdir" ]; then |
| 38 |
echo " WARNING: no OZSW package dir in $filename, skipping" >&2 |
| 39 |
rm -rf "$pkgtmpdir" |
| 40 |
continue |
| 41 |
fi |
| 42 |
pkgname=$(basename "$pkgdir") |
| 43 |
|
| 44 |
# Common name from OPENCSW_CATALOGNAME (reliable, no spaces) |
| 45 |
common=$(grep '^OPENCSW_CATALOGNAME=' "$pkgdir/pkginfo" | cut -d= -f2-) |
| 46 |
if [ -z "$common" ]; then |
| 47 |
# Fallback: strip OZSW prefix and lowercase |
| 48 |
common=$(echo "$pkgname" | gsed 's/^OZSW//' | tr '[:upper:]' '[:lower:]') |
| 49 |
fi |
| 50 |
|
| 51 |
# Version |
| 52 |
version=$(grep '^VERSION=' "$pkgdir/pkginfo" | cut -d= -f2-) |
| 53 |
|
| 54 |
# Category (first word) |
| 55 |
category=$(grep '^CATEGORY=' "$pkgdir/pkginfo" | cut -d= -f2- | awk '{print $1}') |
| 56 |
[ -z "$category" ] && category="application" |
| 57 |
|
| 58 |
# Description: NAME field is "catalogname - long description" |
| 59 |
namefield=$(grep '^NAME=' "$pkgdir/pkginfo" | cut -d= -f2-) |
| 60 |
desc=$(echo "$namefield" | gsed 's/^[^ ]* - //') |
| 61 |
|
| 62 |
# Dependencies: P lines in install/depend, filter out GAR artifacts |
| 63 |
deps="none" |
| 64 |
if [ -f "$pkgdir/install/depend" ]; then |
| 65 |
deplist=$(grep '^P ' "$pkgdir/install/depend" 2>/dev/null | awk '{print $2}') |
| 66 |
for strip in $STRIP_DEPS; do |
| 67 |
deplist=$(echo "$deplist" | grep -v "^${strip}$") |
| 68 |
done |
| 69 |
deplist=$(echo "$deplist" | tr '\n' ',' | gsed 's/,$//') |
| 70 |
[ -n "$deplist" ] && deps="$deplist" |
| 71 |
fi |
| 72 |
|
| 73 |
echo "$common $version $pkgname $filename $md5 $size $deps $category" >> "$OUTDIR/catalog" |
| 74 |
echo "$pkgname - $desc" >> "$OUTDIR/descriptions" |
| 75 |
|
| 76 |
rm -rf "$pkgtmpdir" |
| 77 |
done |
| 78 |
|
| 79 |
rm -rf "$TMPBASE" |
| 80 |
|
| 81 |
echo "" >&2 |
| 82 |
echo "Generated $(wc -l < $OUTDIR/catalog) catalog entries." >&2 |
| 83 |
echo "Output: $OUTDIR/catalog $OUTDIR/descriptions" >&2 |
| 84 |
echo "$OUTDIR" |