2 # Copyright (C) 2014 Ian Kelling
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # basic yum/apt package manager abstraction, plus a few minor conveniences
17 if command -v yum
&> /dev
/null
; then
20 local s
; [[ $EUID != 0 ]] && s
=sudo
25 local s
; [[ $EUID != 0 ]] && s
=sudo
26 $s yum
-y install "$@"
30 local s
; [[ $EUID != 0 ]] && s
=sudo
33 # package remove/uninstall
35 local s
; [[ $EUID != 0 ]] && s
=sudo
36 $s yum autoremove
"$@"
39 local s
; [[ $EUID != 0 ]] && s
=sudo
40 $s yum
-y distro-sync full
"$@"
47 yum whatprovides \
*/$1
50 elif command -v apt-get
&>/dev
/null
; then
52 if dpkg
-s -- "$@" |
grep -Fx "Status: install ok installed" &>/dev
/null
; then
57 pp
() { # package policy
61 local s
; [[ $EUID != 0 ]] && s
=sudo
64 $s apt-get
--purge --auto-remove "$@"
72 local s f
; [[ $EUID != 0 ]] && s
=sudo
73 # update package list if its more than an 2 hours old
74 f
=/var
/cache
/apt
/pkgcache.bin
76 ||
(( $
(( $
(date +%s
) - $
(stat
-c %Y
$f ) )) > 60*60*2 )); then
81 pcheck
"$@" ||
return 0
82 while fuser
/var
/lib
/dpkg
/lock
&>/dev
/null
; do sleep 1; done
84 local s
; [[ $EUID != 0 ]] && s
=sudo
85 $s $PI_PREFIX apt-get
-y install --purge --auto-remove "$@"
89 pcheck
"$@" ||
return 0
90 while fuser
/var
/lib
/dpkg
/lock
&>/dev
/null
; do sleep 1; done
92 local s
; [[ $EUID != 0 ]] && s
=sudo
93 local f
=/usr
/sbin
/policy-rc.d
99 $s apt-get
-y install --purge --auto-remove "$@"
103 # package name and descriptions
104 apt-cache search
"$@"
107 local s
; [[ $EUID != 0 ]] && s
=sudo
108 # nice aptitude search from emacs shell. package description width as
109 # wide as the screen, and package name field small aptitude
110 # manual can't figure out how wide emacs terminal is, of course
111 # it doesn't consult the $COLUMNS variable... and in a normal
112 # terminal, it makes the package name field ridiculously big
113 # also, remove that useless dash before the description
114 aptitude
-F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search
"$@"
117 local s
; [[ $EUID != 0 ]] && s
=sudo
118 while fuser
/var
/lib
/dpkg
/lock
&>/dev
/null
; do sleep 1; done
119 $s apt-get
-y remove
--purge --auto-remove "$@"
120 # seems slightly redundant, but it removes more stuff sometimes.
121 $s apt-get
-y autoremove
124 while fuser
/var
/lib
/dpkg
/lock
&>/dev
/null
; do sleep 1; done
126 local s
; [[ $EUID != 0 ]] && s
=sudo
127 $s apt-get
-y dist-upgrade
--purge --auto-remove "$@"
128 $s apt-get
-y autoremove
129 if [[ -e /usr
/sbin
/checkrestart
]]; then
130 $s /usr
/sbin
/checkrestart
-p
135 if type -p aptitude
&>/dev
/null
; then
143 # ucfq can tell us about config files which are not tracked
144 # with apt-file. but, for at least a few files I tested
145 # which are tracked with apt-file, ucfq doesn't show their
146 # package name. So, commenting this, waiting to find
147 # a config file only tracked by ucfq to see if it gives the
148 # package name and if I can identify this kind of file.
149 # if [[ $file == /* ]] && ! ucfq -w $file | grep ::: &>/dev/null; then
152 if [[ $file == */* ]]; then
153 apt-file
find -x "$file"\$
155 apt-file
find -x /"$file"\$
156 update-alternatives
--list "$file" 2>/dev
/null
160 if dpkg
-s "$1" &>/dev
/null
; then
163 apt-file
-x list
"^$1$"
167 elif command -v pacman
&>/dev
/null
; then
172 pacaur
-S --noconfirm --needed --noedit "$@"
178 pacaur
-Rs --noconfirm "$@"
179 if p
=$
(pacaur
-Qdtq); then
185 aur
='https://aur.archlinux.org'
186 curl
-s $aur/$
(curl
-s "$aur/rpc.php?type=info&arg=$p" \
187 | jq
-r .results.URLPath
) |
tar xz
192 local s
; [[ $EUID != 0 ]] && s
=sudo
194 curl
-s "https://www.archlinux.org/mirrorlist/\
195 ?country=US&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on" \
196 |
sed -r 's/^[ #]*(Server *=)/\1/' > $x
197 if (( $
(stat
-c %s
$x ) > 10 )); then
198 $s cp $x /etc
/pacman.d
/mirrorlist
203 local s
; [[ $EUID != 0 ]] && s
=sudo
204 # file_time + 24 hours > current_time
205 if ! (( $
(stat
-c%Y
/etc
/pacman.d
/mirrorlist
) + 60*60*24 > $
(date +%s
) ))
209 pacaur
-Syu --noconfirm "$@"
219 if pacaur
-Qs "^$1$" &>/dev
/null
; then