Skip to content

Instantly share code, notes, and snippets.

@akrez
Last active May 13, 2025 21:20
Show Gist options
  • Save akrez/c873829ae9617b86380311af00b508be to your computer and use it in GitHub Desktop.
Save akrez/c873829ae9617b86380311af00b508be to your computer and use it in GitHub Desktop.
#!/bin/bash
function error {
echo "$1" 1>&2
exit 1
}
function check_admin() {
if [[ $EUID -ne 0 ]]; then
error "RUN AS ROOT"
fi
}
function change_owner() {
chown -R _apt:root "$1" || error "FAILED TO CHANGE OWNER : $1"
}
function make_directory() {
mkdir -p -m755 "$1" || error "FAILED TO MAKE DIRECTORY : $1"
change_owner "$1" || error "FAILED TO CHANGE OWNER : $1"
}
function detect_os() {
echo $(realpath $(dirname ${BASH_SOURCE[0]}))/$(lsb_release -si)-$(lsb_release -sr)
}
function download() {
if ! apt-cache show "$1" >/dev/null 2>&1; then
error "APT-CACHE NOT FOUND PACKAGE : $1"
fi
dpkg --print-foreign-architectures | grep -q i386 && sudo dpkg --remove-architecture i386
PACKAGES_AND_DEPENDS=$(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances $1 | grep "^\w" | sort -u);
apt download $PACKAGES_AND_DEPENDS
}
function scan() {
dpkg-scanpackages --multiversion ./ /dev/null | gzip -9c >./Packages.gz
echo -e "deb [trusted=yes] file://$ABSOLUTE_BASE_PATH ./" > sources.list
}
if [ $# -gt 0 ]; then
COMMAND="$1"
shift
else
error "EMPTY COMMAND"
fi
check_admin
ABSOLUTE_BASE_PATH=$(detect_os)
make_directory $ABSOLUTE_BASE_PATH
cd $ABSOLUTE_BASE_PATH
if [ $COMMAND == "download" ]; then
for PACKAGE in $*; do
download $PACKAGE
make_directory "$ABSOLUTE_BASE_PATH/$PACKAGE";
done
change_owner $ABSOLUTE_BASE_PATH
scan
elif [ $COMMAND == "scan" ]; then
scan
elif [ $COMMAND == "install" ]; then
sudo apt update -o Dir::Etc::sourcelist="$ABSOLUTE_BASE_PATH/sources.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
sudo apt install -o Dir::Etc::sourcelist="$ABSOLUTE_BASE_PATH/sources.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" $*
else
error "INVALID COMMAND"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment