Magellan Linux

Contents of /trunk/mage/usr/lib/mage/magequery.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3094 - (show annotations) (download) (as text)
Mon Jun 4 16:49:01 2018 UTC (5 years, 10 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}