Backup /var/cache/apt/archives Menjadi Repo Lokal
Well, internet is expensive. Sayang rasanya jika paket yang telah diunduh dihapus begitu saja.
Script ini akan mencadangkan paket unduhan dalam /var/cache/apt/archives ke tempat yang ditentukan (sesuai pengaturan local_mir) dengan hierarki sesuai mirror dan dapat digunakan sebagai source bagi debootstrap.
Sebenarnya ada apt-move untuk tugas ini, namun ia memiliki bug yang membuatnya gagal bekerja dan tiada yang sudi memperbaiki.
Pastikan apt-utils terpasang untuk menyediakan apt-ftparchive.#!/usr/bin/env bash
#set -x
: <<'COMMENT'
_Well, internet is expensive_. Sayang rasanya jika paket yang telah diunduh
dihapus begitu saja.
_Script_ ini akan mencadangkan paket unduhan dalam /var/cache/apt/archives
ke tempat yang ditentukan (sesuai pengaturan local_mir) dengan hierarki sesuai
_mirror_ dan dapat digunakan sebagai _source_ bagi debootstrap.
Sebenarnya ada apt-move untuk tugas ini, namun ia memiliki _bug_ yang membuatnya
gagal bekerja dan tiada yang sudi memperbaiki.
So, here you go ...
deps: apt-utils untuk menyediakan apt-ftparchive
COMMENT
## variables -------------------------------------------------------------------
## sesuaikan local_mir dengan path local mirror
local_mir=~/Software/mirrors/debian
src_list=/etc/apt/sources.list
deb_dir=/var/cache/apt/archives
temp_dir=/tmp/repo_$(date +%F_%H-%M-%S)
## functions -------------------------------------------------------------------
print_help() {
printf "%s\n" '
Penggunaan: repo COMMAND
Commands:
edit - sunting /etc/apt/sources.list
local - gunakan repository lokal
online - gunakan repository online
copy - salin paket dari cache ke repo lokal
move - pindahkan paket dari cache ke repo lokal
remove - buang paket yang tidak ada dalam mirror
'
exit
}
cp_deb_to_repo() {
while IFS= read -r lists
do
echo "$lists"
lists_deb="${lists//_/\/}"
mkdir -p "$local_mir/${lists_deb/\/Packages/}"
cp -vT /var/lib/apt/lists/"$lists" "$local_mir/$lists_deb"
find "$deb_dir" -type f -name "*.deb" -printf '%P\n' > "$temp_dir"/in_cache
awk '/Filename/{print $2}' /var/lib/apt/lists/"$lists" > "$temp_dir"/in_mirror
cd "$local_mir/${lists_deb%%dists*}" || exit
while read -r paket; do
mkdir -p "${paket%/*}"
cp -v "$deb_dir/${paket##*/}" "${paket%/*}"
done < <(grep -Fwf "$temp_dir/in_cache" "$temp_dir/in_mirror")
done < <(find /var/lib/apt/lists -type f -iname "*amd64_Packages" -printf '%P\n')
}
buat_release() {
while IFS= read -r pkglist
do
gzip -9c > "$pkglist.gz" < "$pkglist"
echo "Architectures: amd64
Codename: sid
Components: main contrib non-free
Description: Repo lokal
Label: Debian
Origin: Debian
Suite: unstable" > "${pkglist%%/binary*}"/../Release
apt-ftparchive release "${pkglist%%/binary*}"/.. >> "${pkglist%%/binary*}"/../Release
done < <(find "$local_mir" -type f -iname "Packages")
}
use_local() {
sudo sed -i '/^deb http/s/^deb http/#deb http/g' "$src_list"
}
use_online() {
sudo sed -i '/^#deb http/s/^#deb http/deb http/g' "$src_list"
}
remove_old() {
while IFS= read -r deblist
do
find "$deblist"/../dists/ -type f -name Packages -print0 | xargs -0 awk '/Filename/{print $2}' > "$temp_dir/in_mirror"
find "$deblist"/ -type f -name "*.deb" > "$temp_dir/exist"
grep -v -F -f "$temp_dir/in_mirror" "$temp_dir/exist" | xargs -I '{}' mv -v {} /tmp
done < <(find "$local_mir" -type d -iname "pool")
}
## main ------------------------------------------------------------------------
[[ ! -f $(which apt-ftparchive) ]] && exit
mkdir -p "$temp_dir"
case "$1" in
edit)
sudo nano /etc/apt/sources.list
;;
clean)
cp_deb_to_repo
buat_release
remove_old
buat_release
sudo aptitude clean
;;
copy)
cp_deb_to_repo
buat_release
;;
local)
use_local
;;
move)
cp_deb_to_repo
buat_release
sudo aptitude clean
;;
online)
use_online
;;
remove)
remove_old
buat_release
;;
*)
print_help
;;
esac
rm -r "$temp_dir"