X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=src%2Fpackage-manager-abstractions;h=9311038c4f0b616d6b7ad1837d25a413edbfb3ff;hb=7fa28f7a5bc32b0e2de513fa7d9ae7c245c09c05;hp=f66a7620b2292f6c402bcf7127ee28b17057db83;hpb=9d5a995ec93be0811b799d2e88c53f7f662d6d3b;p=distro-functions diff --git a/src/package-manager-abstractions b/src/package-manager-abstractions index f66a762..9311038 100644 --- a/src/package-manager-abstractions +++ b/src/package-manager-abstractions @@ -48,6 +48,31 @@ 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() { + 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 + } pp() { # package policy apt-cache policy $@ } @@ -72,30 +97,33 @@ elif command -v apt-get &>/dev/null; then fi } pi() { - if dpkg -s -- "$@" &>/dev/null; then - return 0 - fi - while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done + pcheck "$@" || return 0 pupdate local s; [[ $EUID != 0 ]] && s=sudo - $s $PI_PREFIX apt-get -y --allow-downgrades install --purge --auto-remove "$@" + if [[ $- != *i* ]]; then + echo pi "$@" + fi + $s $PI_PREFIX apt-get -y install --purge --auto-remove "$@" } pi-nostart() { - if dpkg -s -- "$@" &>/dev/null; then - return 0 - fi - while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done + local ret= + pcheck "$@" || return 0 + 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 - $s apt-get -y remove --allow-downgrades --purge --auto-remove "$@" + 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 --allow-downgrades autoremove + $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 --allow-downgrades --purge --auto-remove "$@" - $s apt-get -y autoremove --allow-downgrades + $s apt-get -y dist-upgrade --purge --auto-remove "$@" + $s apt-get -y autoremove + if [[ -e /usr/sbin/checkrestart ]]; then + $s /usr/sbin/checkrestart -p + fi } # package info pl() {