fixes and impreovements
[distro-functions] / src / package-manager-abstractions
index 2c291e83c8f244588cdd15d715fe8f7812c761ab..9311038c4f0b616d6b7ad1837d25a413edbfb3ff 100644 (file)
@@ -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 -- "$@" | grep -Fx "Status: install ok installed" &>/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 <<EOF
+    $s dd of=$f 2>/dev/null <<EOF
 #!/bin/sh
 exit 101
 EOF
     $s chmod +x $f
-    $s apt-get -y install --allow-downgrades --purge --auto-remove "$@"
+    if [[ $- != *i* ]]; then
+      echo pi-nostart "$@"
+    fi
+    $s apt-get -y install --purge --auto-remove "$@" || ret=$?
     $s rm $f
+    return $ret
   }
   pf() {
     # package name and descriptions
@@ -113,17 +141,28 @@ EOF
   }
   pu() {
     local s; [[ $EUID != 0 ]] && s=sudo
-    while fuser /var/lib/dpkg/lock &>/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() {