Contents of /trunk/mage/usr/lib/mage/magequery.sh
Parent Directory | Revision Log
Revision 3094 -
(show annotations)
(download)
(as text)
Mon Jun 4 16:49:01 2018 UTC (5 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 5293 byte(s)
Mon Jun 4 16:49:01 2018 UTC (5 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 5293 byte(s)
-speed up search logic via find and an array instead of just ls'ing through the directories and fail if no arguments are given to options which require them
1 | #!/bin/bash |
2 | |
3 | # query mage database for installed packages |
4 | # $Id$ |
5 | |
6 | # always export C locale to fix utf-8 issues |
7 | export LC_ALL=C |
8 | |
9 | print_usage() |
10 | { |
11 | echo "$(basename $0 .sh) querys the mage database for installed packages." |
12 | echo |
13 | echo " -n NAME searches for name NAME" |
14 | echo " -v VER searches for version VER, needs -n" |
15 | echo " -b BUILD searches for build number BUILD, needs -n -v" |
16 | echo " -c CAT shows all packages of given categorie" |
17 | echo " -i shows an inventory of all installed packages" |
18 | echo " -f PATH searches packages which own given file" |
19 | echo " -e PATH searches the package which owns the exact given filename" |
20 | echo |
21 | echo " Examples:" |
22 | echo |
23 | echo " $(basename $0 .sh) -n xorg -v 6.8.0 -b r1" |
24 | echo " searches for package xorg-6.8.0-r1" |
25 | echo |
26 | } |
27 | |
28 | # default args: |
29 | GET_INVENTORY=false |
30 | SEARCH_ONLY_PATH=false |
31 | SEARCH_ONLY_CAT=false |
32 | SEARCH_EXACT_FILENAME=false |
33 | |
34 | # no params given, or is only an arg not ar param, exit |
35 | if [[ $# -lt 1 ]] || [[ ${1:0:1} != - ]] |
36 | then |
37 | print_usage |
38 | exit 1 |
39 | fi |
40 | |
41 | # very basic getops |
42 | for i in $* |
43 | do |
44 | case $1 in |
45 | -n) shift; S_PNAME="$1"; if [[ -z ${S_PNAME} ]]; then print_usage; exit 1; fi ;; |
46 | -v) shift; S_PVER="$1"; if [[ -z ${S_PVER} ]]; then print_usage; exit 1; fi ;; |
47 | -b) shift; S_PBUILD="$1"; if [[ -z ${S_PBUILD} ]]; then print_usage; exit 1; fi ;; |
48 | -i) GET_INVENTORY="true" ;; |
49 | -f) SEARCH_ONLY_PATH="true"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; |
50 | -e) SEARCH_ONLY_PATH="true"; SEARCH_EXACT_FILENAME="true"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; |
51 | -c) SEARCH_ONLY_CAT="true"; shift; SEARCH_CAT="$1"; if [[ -z ${SEARCH_CAT} ]]; then print_usage; exit 1; fi ;; |
52 | -h) print_usage; exit 0 ;; |
53 | -*) print_usage; exit 1 ;; |
54 | esac |
55 | shift |
56 | done |
57 | |
58 | source /etc/mage.rc.global |
59 | source ${MAGERC} |
60 | RETVAL=1 |
61 | |
62 | if [[ ${SEARCH_ONLY_PATH} = true ]] |
63 | then |
64 | unset S_PACKAGES |
65 | unset i pkg |
66 | if [[ ${SEARCH_EXACT_FILENAME} = true ]] |
67 | then |
68 | # fix ++, which gets interpreted as a regex |
69 | SEARCH_PATH="${SEARCH_PATH//+/\\+}" |
70 | # fix [, which gets interpreted as a regex |
71 | SEARCH_PATH="${SEARCH_PATH//[/\\[}" |
72 | S_CANDIDATES=$(egrep -rl "^${SEARCH_PATH}§" ${INSTALLDB}) |
73 | else |
74 | S_CANDIDATES=$(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) |
75 | fi |
76 | for i in ${S_CANDIDATES} |
77 | do |
78 | # ignore magefiles! |
79 | case ${i} in |
80 | *.mage) continue ;; |
81 | esac |
82 | |
83 | # print categorie and pkgname |
84 | pkg="$(basename ${i%/*/*})/$(basename ${i%/*})" |
85 | if [[ -z $(echo ${S_PACKAGES} | grep ${pkg}) ]] |
86 | then |
87 | S_PACKAGES="${S_PACKAGES} ${pkg}" |
88 | fi |
89 | done |
90 | |
91 | # show packages |
92 | for pkg in ${S_PACKAGES} |
93 | do |
94 | echo "${pkg}" |
95 | done |
96 | |
97 | exit 0 |
98 | fi |
99 | |
100 | if [[ ${SEARCH_ONLY_CAT} = true ]] |
101 | then |
102 | # no packages of SEARCH_CAT are installed |
103 | [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 |
104 | find ${MROOT}${INSTALLDB}/${SEARCH_CAT} -maxdepth 1 -mindepth 1 -printf "${SEARCH_CAT}/%P\n" | sort |
105 | |
106 | exit 0 |
107 | fi |
108 | |
109 | # generate multidim array |
110 | declare -i INSTALL_DATABASE_COUNT=0 |
111 | for line in $(find ${MROOT}${INSTALLDB} -maxdepth 2 -mindepth 2 -printf '%P\n' | sort) |
112 | do |
113 | INSTALL_DATABASE_PCAT[${INSTALL_DATABASE_COUNT}]="${line%/*}" |
114 | pkgname="${line#*/}" |
115 | INSTALL_DATABASE_PNAME[${INSTALL_DATABASE_COUNT}]="${pkgname%-*-*}" |
116 | pkgversion="${pkgname//${pkgname%-*-*}-}" |
117 | INSTALL_DATABASE_PVER[${INSTALL_DATABASE_COUNT}]="${pkgversion%-*}" |
118 | INSTALL_DATABASE_PBUILD[${INSTALL_DATABASE_COUNT}]="${pkgname##*-}" |
119 | (( INSTALL_DATABASE_COUNT++ )) |
120 | done |
121 | |
122 | if [[ ${GET_INVENTORY} = true ]] |
123 | then |
124 | # build the list first |
125 | for ((i=0; i<INSTALL_DATABASE_COUNT; i++)) |
126 | do |
127 | echo "${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]}" |
128 | done |
129 | |
130 | exit 0 |
131 | fi |
132 | |
133 | for ((i=0; i<INSTALL_DATABASE_COUNT; i++)) |
134 | do |
135 | if [[ ${INSTALL_DATABASE_PNAME[${i}]} == ${S_PNAME} ]] |
136 | then |
137 | INST_PNAME=yes |
138 | |
139 | if [[ -n ${S_PVER} ]] |
140 | then |
141 | if [[ ${INSTALL_DATABASE_PVER[${i}]} == ${S_PVER} ]] |
142 | then |
143 | INST_PVER=yes |
144 | fi |
145 | |
146 | if [[ -n ${S_PBUILD} ]] |
147 | then |
148 | if [[ ${INSTALL_DATABASE_PBUILD[${i}]} == ${S_PBUILD} ]] |
149 | then |
150 | INST_PBUILD=yes |
151 | fi |
152 | fi |
153 | fi |
154 | |
155 | # search for pname only |
156 | if [[ -n ${S_PNAME} ]] && [[ -z ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] |
157 | then |
158 | if [[ ${INST_PNAME} = yes ]] |
159 | then |
160 | echo "${S_PNAME} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]" |
161 | RETVAL=0 |
162 | break |
163 | fi |
164 | fi |
165 | |
166 | # search for pname and pver |
167 | if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] |
168 | then |
169 | if [[ ${INST_PNAME} = yes ]] && [[ ${INST_PVER} = yes ]] |
170 | then |
171 | echo "${S_PNAME}-${S_PVER} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]" |
172 | RETVAL=0 |
173 | break |
174 | fi |
175 | fi |
176 | |
177 | # search for pname, pver and pbuild |
178 | if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -n ${S_PBUILD} ]] |
179 | then |
180 | if [[ ${INST_PNAME} = yes ]] && [[ ${INST_PVER} = yes ]] && [[ ${INST_PBUILD} = yes ]] |
181 | then |
182 | echo "${S_PNAME}-${S_PVER}-${S_PBUILD} is installed [ ${INSTALL_DATABASE_PCAT[${i}]}/${INSTALL_DATABASE_PNAME[${i}]}-${INSTALL_DATABASE_PVER[${i}]}-${INSTALL_DATABASE_PBUILD[${i}]} ]" |
183 | RETVAL=0 |
184 | break |
185 | fi |
186 | fi |
187 | fi |
188 | done |
189 | |
190 | exit ${RETVAL} |