# limitations under the License.
distro-name() {
+ local x
if [[ -f /etc/fedora-release ]]; then
echo fedora
elif [[ -e /etc/os-release ]]; then
sed -rn 's/^ID=(.*)/\1/p' /etc/os-release
+ elif type -p lsb_release &>/dev/null; then
+ # well, this is more standard, but it's 2 ms vs 200 ms
+ x=$(lsb_release -si); echo ${x,,}
else
echo "unknown distro"
return 1
fi
}
+distro-name-compat() {
+ local x=$(distro-name)
+ case $x in
+ trisquel)
+ echo ubuntu
+ ;;
+ *)
+ echo $x
+ ;;
+ esac
+}
+
distro-name-ver() {
echo `distro-name``debian-archive`
}
debian-archive() {
isdeb || return 0
- local archive
+ local archive expression pri name highpri shortest
local policy="${1:-$(apt-cache policy)}"
# a = archive
# n = codename
# o = origin
# c = component (licensing component)
# l = label (Debian{,-Security,-Updates})
- { for archive in stable testing unstable; do
- # print priority + archive name. priority is in
- # the previous line after finding the archive.
- read -rd '' expression <<EOF ||:
-/o=Debian,a=$archive,.*l=Debian,c=main/{x;s/^ *([-0-9]+).*/\1 $archive/p;q};h
+ local d=$(distro-name)
+ # goto b for archive lines we are interested in, a for lines we arent
+ # print priority + archive name. priority is in
+ # the previous line from the archive line.
+ # case insensitive, because $d is lower and we are matching with first char upper
+ read -rd '' expression <<EOF ||:
+/o=$d/I!b a;/l=$d/I!b a;/c=main/!b a b b;
+: a;s/^ *([-0-9]+).*/\1/;h;b;
+: b;s/^.*a=([^,]+).*/ \1/;H;x;s/\n//;p
EOF
- echo "$policy" | sed -rn "$expression"
- done
- } | sort -rn | head -n1 | grep -oE "\w+$"
+ while read -r pri name; do
+# in ubuntu, we get archives like flidas, flidas-updates, all the same pri,
+# so just pick the shortest one.
+ if [[ ! $highpri ]]; then
+ highpri=$pri;
+ shortest=$name
+ continue
+ fi
+ if [[ $pri != $highpri ]]; then
+ break
+ fi
+ if (( ${#shortest} > ${#name} )); then
+ shortest=$name
+ fi
+ done < <(echo "$policy" | sed -rn "$expression" | sort -rn)
+ echo "$shortest"
+
}
archive=$(debian-archive "$policy")
echo "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q"
}
+debian-codename-compat() {
+ local n=$(debian-codename)
+ case $n in
+ flidas)
+ echo xenial
+ ;;
+ *)
+ echo $n
+ ;;
+ esac
+}
+
isfedora() {
[[ $(distro-name) == fedora ]]
}
isarch() {
[[ $(distro-name) == arch ]]
}
-# is debian/apt based
-isdeb() { command -v apt-get &>/dev/null; }
isubuntu() {
[[ $(distro-name) == ubuntu ]]
}
+istrisquel() {
+ [[ $(distro-name) == trisquel ]]
+}
+# is debian/apt based
+isdeb() { command -v apt-get &>/dev/null; }
fi
}
pi() {
+ if dpkg -s -- "$@" &>/dev/null; then
+ return 0
+ fi
pupdate
local s; [[ $EUID != 0 ]] && s=sudo
$s apt-get -y install --purge --auto-remove "$@"
}
+ pi() {
+ if dpkg -s -- "$@" &>/dev/null; then
+ return 0
+ fi
+ pupdate
+ local s; [[ $EUID != 0 ]] && s=sudo
+ $s $PI_PREFIX apt-get -y install --purge --auto-remove "$@"
+ }
+
pi-nostart() {
+ if dpkg -s -- "$@" &>/dev/null; then
+ return 0
+ fi
+ pupdate
local s; [[ $EUID != 0 ]] && s=sudo
local f=/usr/sbin/policy-rc.d
$s dd of=$f <<EOF
exit 101
EOF
$s chmod +x $f
- pi "$@"
+ $s apt-get -y install --purge --auto-remove "$@"
$s rm $f
}
pf() {
apt-file find -x "$file"\$
else
apt-file find -x /"$file"\$
+ update-alternatives --list "$file" 2>/dev/null
fi
}
pkgfiles() {