# # Receive a package version into dpkg_archive # Script run by ssh to receive a compressed package and to save it # Works in bash and dash # # Assumes that compressed tar output as stdin # #set -x set -e error() { echo ERROR: $* exit 1; } delete_dir() { if [ -d "$1" ] ; then chmod -R u+w "$1" rm -rf "$1" fi } # User options LinkName= while getopts DL: arg ; do case $arg in D) set -x ;; L) LinkName="$OPTARG" ;; *) error Unknown option: $arg ;; esac done shift $(($OPTIND - 1)) # User arguments pname=${1:?Need package name} pver=${2:?Need package version} dpkg="dpkg_archive" [ -d $dpkg ] || error dpkg_archive not found # # Names of working directories # newdir="$dpkg/${pname}/${pver}.NEW.TMPDIR" olddir="$dpkg/${pname}/${pver}.OLD.TMPDIR" realdir="$dpkg/${pname}/${pver}" pkgdir="$dpkg/${pname}" # # Create package directory # Ensure its writable mkdir -p "$pkgdir" chmod u+w "$pkgdir" # # Delete possible tmp directory delete_dir "$newdir" delete_dir "$olddir" mkdir -p "$newdir" chmod u+w "$newdir" # # De-tar the input stream into a working space # The tarZip contains 2 directory elements that need to be discarded tar -zx --strip-components=2 -C "$newdir" if [ ! -f "$newdir/descpkg" ] ; then delete_dir "$newdir" error Received package does not have descpkg file fi # # Swap in the new directory - minimize disruption # Then delete the old # if [ -d "$realdir" ] ; then mv "$realdir" "$olddir" fi mv "$newdir" "$realdir" # Delete the original directory delete_dir "$olddir" # Process possible link if [ "$LinkName" ] ; then rm -f "$pkgdir/$LinkName" ln -s "$pver" "$pkgdir/$LinkName" fi # Fix up permissions on the package and package-version chmod a-w "$pkgdir" chmod a-w "$realdir"