X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=src%2Fpackage-manager-abstractions;h=dece84830169562a1217de1a7b71f019c7b866ba;hb=1550d2b551dd02700d4e3e1317d34f2fa25a2192;hp=a050be9dc4061ff2bbae3e3c4fac2aceb394fb14;hpb=7d92a4f0b607ead76ccf488ee639a849c5ffeb83;p=distro-functions diff --git a/src/package-manager-abstractions b/src/package-manager-abstractions index a050be9..dece848 100644 --- a/src/package-manager-abstractions +++ b/src/package-manager-abstractions @@ -48,8 +48,27 @@ if command -v yum &> /dev/null; then } elif command -v apt-get &>/dev/null; then + plock-wait() { + local i + i=0 + while fuser /var/lib/dpkg/lock &>/dev/null; do + sleep 1 + i=$(( i+1 )) + if (( i > 300 )); then + echo "error: timed out waiting for /var/lib/dpkg/lock" >&2 + return 1 + fi + done + } pcheck() { - if dpkg -s -- "$@" | grep -Fx "Status: install ok installed" &>/dev/null; then + for arg; do + if [[ $1 == -* ]]; then + shift + else + break + fi + done + if dpkg -s -- "$@" |& grep -Fx "Status: install ok installed" &>/dev/null; then return 1 fi return 0 @@ -69,35 +88,56 @@ elif command -v apt-get &>/dev/null; then esac } pupdate() { - local s f; [[ $EUID != 0 ]] && s=sudo + local now t s f cachetime limittime; [[ $EUID != 0 ]] && s=sudo # update package list if its more than an 2 hours old f=/var/cache/apt/pkgcache.bin - if [[ ! -r $f ]] \ - || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*2 )); then + if [[ -r $f ]]; then + cachetime=$(stat -c %Y $f ) + else + cachetime=0 + fi + now=$(date +%s) + limittime=$(( now - 60*60*2 )) + for f in /etc/apt/sources.list /etc/apt/sources.list.d/*.list; do + if [[ -r $f ]]; then + t=$(stat -c %Y $f ) + if (( t > limittime )); then + limittime=$t + fi + fi + done + if (( cachtime > limittime )); then $s apt-get update fi } pi() { pcheck "$@" || return 0 - while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done pupdate local s; [[ $EUID != 0 ]] && s=sudo + if [[ $- != *i* ]]; then + echo pi "$@" + fi $s $PI_PREFIX apt-get -y install --purge --auto-remove "$@" } pi-nostart() { + local ret= pcheck "$@" || return 0 - while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done + plock-wait pupdate local s; [[ $EUID != 0 ]] && s=sudo local f=/usr/sbin/policy-rc.d - $s dd of=$f </dev/null </dev/null; do sleep 1; done + local needed=false + for arg; do + if dpkg -s -- "$arg" &>/dev/null; then + needed=true + break + fi + done + $needed || return 0 + plock-wait $s apt-get -y remove --purge --auto-remove "$@" # seems slightly redundant, but it removes more stuff sometimes. $s apt-get -y autoremove } pup() { # upgrade - while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done + plock-wait pupdate local s; [[ $EUID != 0 ]] && s=sudo $s apt-get -y dist-upgrade --purge --auto-remove "$@"