Contents of /branches/mage-next/usr/lib/mage/sql_functions.sh
Parent Directory | Revision Log
Revision 2525 -
(show annotations)
(download)
(as text)
Wed Jan 29 10:42:21 2014 UTC (10 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 29937 byte(s)
Wed Jan 29 10:42:21 2014 UTC (10 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 29937 byte(s)
-open mage-next branch
1 | #!/bin/bash |
2 | |
3 | die() |
4 | { |
5 | echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." |
6 | echo -e "$@" |
7 | exit 1 |
8 | } |
9 | |
10 | sql() |
11 | { |
12 | local sqlcmd="$*" |
13 | [[ -z ${sqlcmd} ]] && die "no sqlcmd given." |
14 | |
15 | sqlite3 -nullvalue 'NULL' -list -separator '|' "${DBFILE}" << EOF || die "error running '$@'" |
16 | ${sqlcmd}; |
17 | EOF |
18 | } |
19 | |
20 | mage_setup() |
21 | { |
22 | [ ! -d ${MROOT}${INSTALLDB} ] && install -d ${MROOT}${INSTALLDB} |
23 | [ ! -d ${MROOT}${INSTALLDB}/records ] && install -d ${MROOT}${INSTALLDB}/records |
24 | # [ ! -f ${MROOT}${VIRTUALDB_FILE} ] && touch ${MROOT}${VIRTUALDB_FILE} |
25 | [ ! -d ${PKGDIR} ] && install -d ${PKGDIR} |
26 | [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR} |
27 | [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR} |
28 | |
29 | return 0 |
30 | } |
31 | |
32 | dep2pver() |
33 | { |
34 | local pver |
35 | |
36 | pver="${1##*/}" |
37 | |
38 | # cut version only if not virtual or it will cut the name |
39 | if [[ $(dep2pcat $1) != virtual ]] && \ |
40 | [[ $2 != virtual ]] |
41 | then |
42 | echo "${pver##*-}" |
43 | fi |
44 | } |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | ## atoi string |
51 | atoi() |
52 | { |
53 | local pver="$1" |
54 | local len |
55 | local value |
56 | local finalpver |
57 | |
58 | # first run a basic char to int on argv |
59 | len=${#pver} |
60 | for ((x=0; x < len; x++)) |
61 | do |
62 | value="${pver:${x}:1}" |
63 | case ${value} in |
64 | a) value=".1.";; |
65 | b) value=".2.";; |
66 | c) value=".3.";; |
67 | d) value=".4.";; |
68 | e) value=".5.";; |
69 | f) value=".6.";; |
70 | g) value=".7.";; |
71 | h) value=".8.";; |
72 | i) value=".9.";; |
73 | j) value=".10.";; |
74 | k) value=".11.";; |
75 | l) value=".12.";; |
76 | m) value=".13.";; |
77 | n) value=".14.";; |
78 | o) value=".15.";; |
79 | p) value=".16.";; |
80 | q) value=".17.";; |
81 | r) value=".18.";; |
82 | s) value=".19.";; |
83 | t) value=".20.";; |
84 | u) value=".21.";; |
85 | v) value=".22.";; |
86 | w) value=".23.";; |
87 | x) value=".24.";; |
88 | y) value=".25.";; |
89 | z) value=".26.";; |
90 | _|-|\|) value=".0.";; |
91 | 0*) value="${value/0/.0.}";; |
92 | esac |
93 | |
94 | # save new var |
95 | finalpver="${finalpver}${value}" |
96 | done |
97 | echo ${finalpver} |
98 | } |
99 | |
100 | ## max_len string1 string2 |
101 | max_len() |
102 | { |
103 | local str1="$1" |
104 | local str2="$2" |
105 | local len1 |
106 | local len2 |
107 | |
108 | # substitute spaces |
109 | str1=$(echo "${str1}" | sed "s:\ ::g") |
110 | str2=$(echo "${str2}" | sed "s:\ ::g") |
111 | |
112 | # bash returns lenghts always +1 |
113 | len1=$(( ${#str1} -1 )) |
114 | len2=$(( ${#str2} -1 )) |
115 | |
116 | if [[ ${len1} -ge ${len2} ]] |
117 | then |
118 | echo "${len1}" |
119 | else |
120 | echo "${len2}" |
121 | fi |
122 | } |
123 | |
124 | # is_higher pver1 pver2 |
125 | is_higher() |
126 | { |
127 | local pver1="$1" |
128 | local pver2="$2" |
129 | local fpver |
130 | local fpver |
131 | local arr1 |
132 | local arr2 |
133 | local maxarrlen |
134 | local i |
135 | local x |
136 | |
137 | # build to arrays with fixed pvers |
138 | fpver1=$(atoi ${pver1} | sed "s:\.:\ :g") |
139 | fpver2=$(atoi ${pver2} | sed "s:\.:\ :g") |
140 | |
141 | maxarrlen=$(max_len "${fpver1}" "${fpver2}") |
142 | |
143 | # fill array with values |
144 | declare -i x=0 |
145 | for i in ${fpver1} |
146 | do |
147 | arr1[${x}]="${i}" |
148 | ((x++)) |
149 | done |
150 | # now fill the rest with ZEROS |
151 | if [[ ${x} -lt ${maxarrlen} ]] |
152 | then |
153 | for (( i=x; i<maxarrlen;i++)) |
154 | do |
155 | arr1[${i}]="0" |
156 | done |
157 | fi |
158 | |
159 | # fill array with values |
160 | declare -i x=0 |
161 | for i in ${fpver2} |
162 | do |
163 | arr2[${x}]="${i}" |
164 | ((x++)) |
165 | done |
166 | # now fill the rest with ZEROS |
167 | if [[ ${x} -lt ${maxarrlen} ]] |
168 | then |
169 | for (( i=x; i<maxarrlen;i++)) |
170 | do |
171 | arr2[${i}]="0" |
172 | done |
173 | fi |
174 | |
175 | # now compare the to arrays |
176 | for ((i=0; i < ${maxarrlen}; i++)) |
177 | do |
178 | if [[ ${arr1[${i}]} -ne ${arr2[${i}]} ]] |
179 | then |
180 | if [[ ${arr1[${i}]} -gt ${arr2[${i}]} ]] |
181 | then |
182 | echo "${pver1}" |
183 | return |
184 | else |
185 | echo "${pver2}" |
186 | return |
187 | fi |
188 | fi |
189 | done |
190 | |
191 | # both values are the same, so print the first |
192 | echo "${pver1}" |
193 | } |
194 | |
195 | highest_pkg2() |
196 | { |
197 | local pname="$1" |
198 | local state="$2" |
199 | |
200 | case ${state} in |
201 | stable) search="state='stable'" ;; |
202 | testing) search="state='stable' or state='testing'" ;; |
203 | unstable) search="state='stable' or state='testing' or state='unstable'" ;; |
204 | esac |
205 | |
206 | for current in $(sql "select pver,pbuild from packages where pname='${pname}' and (${search})") |
207 | do |
208 | [[ x -eq 0 ]] && max="${current}" |
209 | max="$(is_higher ${current} ${max})" |
210 | ((x++)) |
211 | done |
212 | |
213 | echo "${max}" |
214 | } |
215 | |
216 | highest_pkg() { |
217 | local pname="$1" |
218 | local state="$2" |
219 | local search |
220 | local retval |
221 | |
222 | case ${state} in |
223 | stable) search="state='stable'" ;; |
224 | testing) search="state='stable' or state='testing'" ;; |
225 | unstable) search="state='stable' or state='testing' or state='unstable'" ;; |
226 | esac |
227 | |
228 | #retval=$(sql "select pver,pbuild from packages where pname='${pname}' and (${search}) order by pver desc,pbuild desc limit 1") |
229 | #echo "${pname}-$(echo ${retval} | cut -d'|' -f1)-r$(echo ${retval} | cut -d'|' -f2)" |
230 | |
231 | retval=$(sql "select pver,pbuild from packages where pname='${pname}' and (${search}) order by pver desc,pbuild desc limit 1") |
232 | echo "${retval}" |
233 | } |
234 | |
235 | all_depends() |
236 | { |
237 | local pname="$1" |
238 | local state="$2" |
239 | local highest |
240 | local retval |
241 | local pver |
242 | local pbuild |
243 | local i |
244 | |
245 | highest=$(highest_pkg2 "${pname}" "${state}") |
246 | pver="${highest%|*}" |
247 | pbuild="${highest##*|}" |
248 | |
249 | sql "select categories.pcat, |
250 | depends.pname, |
251 | depends.pver, |
252 | depends.pbuild |
253 | from depends |
254 | inner join packages |
255 | on depends.pkg_id=packages.id |
256 | and packages.pname='${pname}' |
257 | and packages.pver='${pver}' |
258 | and packages.pbuild='${pbuild}' |
259 | inner join categories |
260 | on depends.pcat_id=categories.id" |
261 | } |
262 | |
263 | all_sdepends() |
264 | { |
265 | local pname="$1" |
266 | local state="$2" |
267 | local highest |
268 | local retval |
269 | local pver |
270 | local pbuild |
271 | local i |
272 | |
273 | highest=$(highest_pkg2 "${pname}" "${state}") |
274 | pver="${highest%|*}" |
275 | pbuild="${highest##*|}" |
276 | |
277 | sql "select categories.pcat, |
278 | sdepends.pname, |
279 | sdepends.pver, |
280 | sdepends.pbuild |
281 | from sdepends |
282 | inner join packages |
283 | on sdepends.pkg_id=packages.id |
284 | and packages.pname='${pname}' |
285 | and packages.pver='${pver}' |
286 | and packages.pbuild='${pbuild}' |
287 | inner join categories |
288 | on sdepends.pcat_id=categories.id" |
289 | } |
290 | |
291 | ALLDEPS="" |
292 | #ALREADY_PROCESSED="" |
293 | resolv_pkgs() { |
294 | local method="$1" |
295 | local pname="$2" |
296 | local state="$3" |
297 | local depcat |
298 | local depname |
299 | local depver |
300 | local depbuild |
301 | local highest |
302 | local fullname |
303 | local searchcmd |
304 | local searchcmd2 |
305 | local pkgid |
306 | |
307 | case ${method} in |
308 | --install) |
309 | searchcmd="all_depends ${pname} ${state}" |
310 | searchcmd2="" |
311 | ;; |
312 | --src-install) |
313 | searchcmd="all_depends ${pname} ${state}" |
314 | searchcmd2="all_sdepends ${pname} ${state}" |
315 | ;; |
316 | esac |
317 | |
318 | [[ -z ${pname} ]] && return 1 |
319 | |
320 | while read line |
321 | do |
322 | [[ -z ${line} ]] && continue |
323 | |
324 | depcat="${line%%|*}" |
325 | depname="${line#*|}" |
326 | depname="${depname%%|*}" |
327 | |
328 | # check processed pnames, to speed things up |
329 | # local i |
330 | # for i in ${ALREADY_PROCESSED} |
331 | # do |
332 | # [[ ${depname} = ${i} ]] && continue |
333 | # done |
334 | |
335 | # hotfix |
336 | if [[ ${depcat} = virtual ]] |
337 | then |
338 | case ${depname} in |
339 | x11) |
340 | depcat=x11-base |
341 | depname=xorg |
342 | ;; |
343 | glibc) |
344 | depcat=sys-libs |
345 | depname=glibc-nptl |
346 | ;; |
347 | kernel) |
348 | depcat=sys-kernel |
349 | depname=kernel26-magellan |
350 | ;; |
351 | kernel-headers) |
352 | depcat=sys-kernel |
353 | depname=linux-libc-headers |
354 | ;; |
355 | kernel-sources) |
356 | depcat=sys-kernel |
357 | depname=kernel26-sources-magellan |
358 | ;; |
359 | java) |
360 | depcat=dev-java |
361 | depname=sun-jdk |
362 | ;; |
363 | mta) |
364 | depcat=net-mail |
365 | depname=ssmtp |
366 | ;; |
367 | editor) |
368 | depcat=app-editors |
369 | depname=nano |
370 | ;; |
371 | cron) |
372 | depcat=sys-apps |
373 | depname=fcron |
374 | ;; |
375 | syslog) |
376 | depcat=app-admin |
377 | depname=syslog-ng |
378 | ;; |
379 | alsa-drivers) |
380 | depcat=sys-kernel |
381 | depname=kernel26-magellan |
382 | ;; |
383 | nvidia-drivers) |
384 | depcat=sys-kernel |
385 | depname=kernel26-magellan |
386 | ;; |
387 | ati-drivers) |
388 | depcat=sys-kernel |
389 | depname=kernel26-magellan |
390 | ;; |
391 | opengl) |
392 | depcat=media-libs |
393 | depname=mesa |
394 | ;; |
395 | esac |
396 | fi |
397 | |
398 | highest=$(highest_pkg2 ${depname} ${state}) |
399 | depver="${highest%|*}" |
400 | depbuild="${highest##*|}" |
401 | |
402 | fullname="${depcat}/${depname}-${depver}-r${depbuild}" |
403 | |
404 | #### check ob DFILE schon installiert ist #### |
405 | is_installed --pcat "${depcat}" --pname "${depname}" --pver "${depver}" --pbuild "${depbuild}" && continue |
406 | |
407 | ## check ob schon in ALLDEPS enthalten dann mach weiter |
408 | if [[ -z $(echo ${ALLDEPS} | fgrep "${fullname}") ]] |
409 | then |
410 | resolv_pkgs "${method}" "${depname}" "${state}" |
411 | ALLDEPS="${ALLDEPS} ${fullname}" |
412 | fi |
413 | |
414 | # list of all processed pnames, to speed things up |
415 | # ALREADY_PROCESSED="${ALREADY_PROCESSED} ${depname}" |
416 | |
417 | # unset all vars |
418 | unset depname |
419 | unset depcat |
420 | unset depver |
421 | unset depbuild |
422 | unset fullname |
423 | unset shighest |
424 | done << EOF |
425 | $(${searchcmd}) |
426 | $(${searchcmd2}) |
427 | EOF |
428 | } |
429 | |
430 | # start_depwanderer pname state |
431 | start_depwanderer() |
432 | { |
433 | local highest |
434 | local method="$1" |
435 | local pname="$2" |
436 | local pver |
437 | local pbuild |
438 | local pcat |
439 | local state="$3" |
440 | local x i |
441 | |
442 | # get some suitable pkg info |
443 | highest=$(highest_pkg2 "${pname}" "${state}") |
444 | pver="${highest%|*}" |
445 | pbuild="${highest##*|}" |
446 | pcat=$(sql "select categories.pcat |
447 | from packages |
448 | inner join categories |
449 | on packages.pcat_id=categories.id |
450 | where packages.pname='${pname}' |
451 | and packages.pver='${pver}' |
452 | and packages.pbuild='${pbuild}'") |
453 | |
454 | # already installed ?? |
455 | if is_installed --pcat "${pcat}" --pname "${pname}" --pver "${pver}" --pbuild "${pbuild}" |
456 | then |
457 | echo "Package ${pcat}/${pname}-${pver}-r${pbuild} already installed." |
458 | return 2 |
459 | fi |
460 | |
461 | resolv_pkgs "${method}" "${pname}" "${state}" |
462 | declare -i x=1 |
463 | for i in ${ALLDEPS} |
464 | do |
465 | #echo "${x}: ${i}" |
466 | echo "${i}" |
467 | ((x++)) |
468 | done |
469 | |
470 | # add the package itself to the dependencies |
471 | #echo "$((x++)): ${pcat}/${pname}-${pver}-r${pbuild}" |
472 | echo "${pcat}/${pname}-${pver}-r${pbuild}" |
473 | } |
474 | |
475 | |
476 | # fetch_packages /path/to/mage/file1 /path/to/mage/file2 |
477 | fetch_packages() |
478 | { |
479 | local list="$@" |
480 | local pkg |
481 | local mirr |
482 | local magefile |
483 | local md5file |
484 | local opt |
485 | local count_current |
486 | local count_total |
487 | local pname |
488 | local pver |
489 | local pbuild |
490 | |
491 | [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your ${MAGERC}." |
492 | |
493 | # get count of total packages |
494 | declare -i count_current=0 |
495 | declare -i count_total=0 |
496 | |
497 | for i in ${list}; do (( count_total++ )); done |
498 | |
499 | for magefile in ${list} |
500 | do |
501 | #pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}" |
502 | |
503 | pname="$(magename2pname ${magefile})" |
504 | pver="$(magename2pver ${magefile})" |
505 | pbuild="$(magename2pbuild ${magefile})" |
506 | pkg="${pname}-${pver}-${ARCH}-${pbuild}.${PKGSUFFIX}" |
507 | |
508 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild/r/}'") |
509 | |
510 | (( count_current++ )) |
511 | xtitle "[ (${count_current}/${count_total}) Fetching ${pkg} ]" |
512 | |
513 | # abort on virtual pkg |
514 | if [[ ${pkgtype} = virtual ]] |
515 | then |
516 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
517 | echo " !fetch virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " |
518 | continue |
519 | fi |
520 | |
521 | # abort on sources pkg |
522 | if [[ ${pkgtype} = sources ]] |
523 | then |
524 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
525 | echo " !fetch sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " |
526 | continue |
527 | fi |
528 | |
529 | # abort if already exist |
530 | if [ -f ${PKGDIR}/${pkg} ] |
531 | then |
532 | echo -ne " ${COLBLUE}***${COLDEFAULT}" |
533 | echo " fetch complete (${count_current}/${count_total}): ${pkg} ... " |
534 | continue |
535 | fi |
536 | |
537 | for mirr in ${MIRRORS} |
538 | do |
539 | echo -ne " ${COLBLUE}***${COLDEFAULT}" |
540 | #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... " |
541 | echo -e " fetching (${count_current}/${count_total}): ${pkg} ... " |
542 | [[ ${VERBOSE} = off ]] && opt="--quiet" |
543 | wget \ |
544 | --passive-ftp \ |
545 | --tries 3 \ |
546 | --continue \ |
547 | --progress bar \ |
548 | --directory-prefix=${PKGDIR} \ |
549 | ${opt} ${mirr}/${PACKAGES_SERVER_PATH}/${pkg} |
550 | if [[ $? = 0 ]] |
551 | then |
552 | break |
553 | else |
554 | continue |
555 | fi |
556 | done |
557 | |
558 | if [ ! -f ${PKGDIR}/${pkg} ] |
559 | then |
560 | die "Could not download ${pkg}" |
561 | fi |
562 | done |
563 | |
564 | # add a crlf for a better view |
565 | if [ ${count_total} -gt 1 ]; then echo; fi |
566 | } |
567 | |
568 | mage_install() |
569 | { |
570 | # local all possible vars of a mage file |
571 | # to prevent bad issues |
572 | local PKGNAME |
573 | local STATE |
574 | local DESCRIPTION |
575 | local HOMEPAGE |
576 | local DEPEND |
577 | local SDEPEND |
578 | local PROVIDE |
579 | local PKGTYPE |
580 | local preinstall |
581 | local postinstall |
582 | local preremove |
583 | local postremove |
584 | |
585 | local pcat |
586 | local pname |
587 | local pver |
588 | local pbuild |
589 | local count_total |
590 | local count_current |
591 | local magefile |
592 | local src_install |
593 | |
594 | # very basic getops |
595 | for i in $* |
596 | do |
597 | case $1 in |
598 | --pcat|-c) shift; pcat="$1" ;; |
599 | --pname|-n) shift; pname="$1" ;; |
600 | --pver|-v) shift; pver="$1" ;; |
601 | --pbuild|-b) shift; pbuild="$1" ;; |
602 | --count-total) shift; count_total="$1" ;; |
603 | --count-current) shift; count_current="$1" ;; |
604 | --src-install|-s) shift; src_install=true ;; |
605 | esac |
606 | shift |
607 | done |
608 | |
609 | # sanity checks; abort if not given |
610 | [ -z "${pcat}" ] && die "mage_install() \$pcat not given." |
611 | [ -z "${pname}" ] && die "mage_install() \$pname not given." |
612 | [ -z "${pver}" ] && die "mage_install() \$pver not given." |
613 | [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given." |
614 | |
615 | # check needed global vars |
616 | [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set." |
617 | [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set." |
618 | [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set." |
619 | |
620 | xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]" |
621 | echo -ne "${COLBLUE} >>> ${COLDEFAULT}" |
622 | echo -n "installing (${count_current}/${count_total}): " |
623 | echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" |
624 | echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}" |
625 | |
626 | # magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage" |
627 | # source ${magefile} |
628 | PKGNAME="${pname}-${pver}-${ARCH}-${pbuild}" |
629 | |
630 | # abort on sources if no srcinstall |
631 | if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]] |
632 | then |
633 | echo |
634 | echo -e "This Package is a Source Package." |
635 | echo |
636 | echo -e "Only 'srcinstall' works with this type of packages" |
637 | echo -en "If you have done a srcinstall before, " |
638 | echo -e "you will find the files in /usr/src." |
639 | echo |
640 | exit 1 |
641 | fi |
642 | |
643 | ## preinstall scripts |
644 | if [ -n "$(typeset -f preinstall)" ] |
645 | then |
646 | echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... " |
647 | preinstall |
648 | unset preinstall |
649 | fi |
650 | |
651 | if [[ ${src_install} = true ]] |
652 | then |
653 | local smage2file |
654 | # check needed global vars |
655 | [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set." |
656 | [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set." |
657 | [ -z "${BINDIR}" ] && die "\$BINDIR not set." |
658 | |
659 | # build the package first |
660 | if [[ ${MAGEDEBUG} = on ]] |
661 | then |
662 | echo M:${pname} |
663 | echo V:${pver} |
664 | echo B:${pbuild} |
665 | fi |
666 | |
667 | smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2 |
668 | if [ -f "${smage2file}" ] |
669 | then |
670 | echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... " |
671 | smage2 ${smage2file} || die "compile failed" |
672 | else |
673 | echo |
674 | echo "$(basename ${SMAGEFILE}) not found." |
675 | echo "update your smage-tree and try it again." |
676 | echo |
677 | die |
678 | fi |
679 | fi |
680 | |
681 | if [[ ${PKGTYPE} != virtual ]] && \ |
682 | [[ ${PKGTYPE} != sources ]] |
683 | then |
684 | echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... " |
685 | build_doinstall ${PKGNAME} |
686 | fi |
687 | |
688 | ## postinstall scripts |
689 | if [ -n "$(typeset -f postinstall)" ] |
690 | then |
691 | echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... " |
692 | postinstall |
693 | unset postinstall |
694 | fi |
695 | |
696 | # install a database entry |
697 | install_database_entry \ |
698 | --pcat "${pcat}" \ |
699 | --pname "${pname}" \ |
700 | --pver "${pver}" \ |
701 | --pbuild "${pbuild}" \ |
702 | --pkgname "${PKGNAME}" \ |
703 | --pkgtype "${PKGTYPE}" \ |
704 | || die "error in mage_install() running install_database_entry()." |
705 | |
706 | # remove the package dir now |
707 | if [ -d ${BUILDDIR}/${PKGNAME} ] |
708 | then |
709 | rm -rf ${BUILDDIR}/${PKGNAME} |
710 | fi |
711 | |
712 | # rebuilds toplevel info node |
713 | if [[ ${MAGE_INFO_REBUILD} = true ]] |
714 | then |
715 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" |
716 | echo -n "rebuilding top-level info node ... " |
717 | ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \ |
718 | > ${MROOT}/usr/share/info/dir && \ |
719 | echo "done." || echo "failure." |
720 | unset MAGE_INFO_REBUILD |
721 | fi |
722 | |
723 | # rebuilds the enviroment with the content of /etc/env.d |
724 | if [[ ${MAGE_ENV_REBUILD} = true ]] |
725 | then |
726 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" |
727 | echo -n "rebuilding environment ... " |
728 | ${MLIBDIR}/env-rebuild.sh > /dev/null && \ |
729 | echo "done." || echo "failure." |
730 | unset MAGE_ENV_REBUILD |
731 | fi |
732 | |
733 | xtitleclean |
734 | |
735 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
736 | echo -n "package " |
737 | # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" |
738 | # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} " |
739 | echo "successfully installed." |
740 | |
741 | # unset these functions |
742 | unset -f preinstall |
743 | unset -f postinstall |
744 | unset -f preremove |
745 | unset -f postremove |
746 | } |
747 | |
748 | md5sum_packages() |
749 | { |
750 | local list="$@" |
751 | local magefile |
752 | local pcat |
753 | local pname |
754 | local pkgname |
755 | local pkgfile |
756 | local pkgtype |
757 | local count_current |
758 | local count_total |
759 | local pver |
760 | local pbuild |
761 | |
762 | # get count of total packages |
763 | declare -i count_current=0 |
764 | declare -i count_total=0 |
765 | |
766 | for i in ${list}; do (( count_total++ )); done |
767 | |
768 | for magefile in ${list} |
769 | do |
770 | pcat=${magefile%%/*} |
771 | pname=$(magename2pname ${magefile}) |
772 | pver=$(magename2pver ${magefile}) |
773 | pbuild=$(magename2pbuild ${magefile}) |
774 | |
775 | pkgname="${pname}-${pver}-${ARCH}-${pbuild}" |
776 | #md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5" |
777 | pkgfile="${pkgname}.${PKGSUFFIX}" |
778 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild/r/}'") |
779 | md5=$(sql "select packages_info.md5 from packages_info inner join packages on packages_info.pkg_id=packages.id where packages.pname='${pname}' and packages.pver='${pver}' and packages.pbuild='${pbuild/r/}' and arch='${ARCH}'") |
780 | #echo "DEBUG: ${md5}" |
781 | |
782 | (( count_current++ )) |
783 | xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]" |
784 | |
785 | # abort on virtual pkg |
786 | if [[ ${pkgtype} = virtual ]] |
787 | then |
788 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
789 | echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... " |
790 | continue |
791 | fi |
792 | |
793 | # abort on sources pkg |
794 | if [[ ${pkgtype} = sources ]] |
795 | then |
796 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
797 | echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... " |
798 | continue |
799 | fi |
800 | |
801 | # if [ -f "${md5file}" ] |
802 | # then |
803 | echo -ne "${COLBLUE} *** ${COLDEFAULT}" |
804 | echo -ne "checking md5sum (${count_current}/${count_total}): " |
805 | #( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed" |
806 | ( cd ${PKGDIR}; md5sum --check << EOF ;)|| die "md5 for ${pkgfile} failed" |
807 | ${md5} ${pkgfile} |
808 | EOF |
809 | |
810 | # else |
811 | # echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
812 | # echo -e "!! no md5sum file found for ${pkgfile} :(" |
813 | # fi |
814 | done |
815 | |
816 | # add a crlf for a better view |
817 | if [ ${count_total} -gt 1 ]; then echo; fi |
818 | } |
819 | |
820 | unpack_packages() |
821 | { |
822 | local list="$@" |
823 | local magefile |
824 | local pkg |
825 | local pkgtype |
826 | local count_current |
827 | local count_total |
828 | |
829 | # get count of total packages |
830 | declare -i count_current=0 |
831 | declare -i count_total=0 |
832 | |
833 | for i in ${list}; do (( count_total++ )); done |
834 | |
835 | for magefile in ${list} |
836 | do |
837 | #pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}" |
838 | #pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})" |
839 | |
840 | pname=$(magename2pname ${magefile}) |
841 | pver=$(magename2pver ${magefile}) |
842 | pbuild=$(magename2pbuild ${magefile}) |
843 | pkg="${pname}-${pver}-${ARCH}-${pbuild}.${PKGSUFFIX}" |
844 | pkgtype=$(sql "select pkgtype from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild/r/}'") |
845 | |
846 | (( count_current++ )) |
847 | xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]" |
848 | |
849 | # abort on virtual pkg |
850 | if [[ ${pkgtype} = virtual ]] |
851 | then |
852 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
853 | echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " |
854 | continue |
855 | fi |
856 | |
857 | # abort on sources pkg |
858 | if [[ ${pkgtype} = sources ]] |
859 | then |
860 | echo -ne " ${COLBLUE}---${COLDEFAULT}" |
861 | echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... " |
862 | continue |
863 | fi |
864 | |
865 | echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... " |
866 | tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}" |
867 | done |
868 | |
869 | # add a crlf for a better view |
870 | if [ ${count_total} -gt 1 ]; then echo; fi |
871 | } |
872 | |
873 | install_packages() |
874 | { |
875 | local list="$@" |
876 | local pkg |
877 | local pcat |
878 | local pname |
879 | local pver |
880 | local pbuild |
881 | local total_pkgs |
882 | local current_pkg |
883 | local src_install |
884 | local uninstall_list |
885 | |
886 | # check for --src-install |
887 | if [[ $1 = --src-install ]] |
888 | then |
889 | # remove --src-install from list |
890 | list=${list/--src-install/} |
891 | # enable src-install |
892 | src_install="--src-install" |
893 | fi |
894 | |
895 | # reset MAGE_PROTECT_COUNTER |
896 | declare -i MAGE_PROTECT_COUNTER=0 |
897 | export MAGE_PROTECT_COUNTER |
898 | |
899 | # get count of total packages |
900 | declare -i total_pkgs=0 |
901 | declare -i current_pkg=0 |
902 | for i in ${list}; do (( total_pkgs++ )); done |
903 | |
904 | echo |
905 | |
906 | if [[ -n ${MROOT} ]] |
907 | then |
908 | echo -ne ${COLRED} |
909 | echo "!! installing in MROOT=${MROOT}" |
910 | echo -ne ${COLDEFAULT} |
911 | echo |
912 | fi |
913 | |
914 | for pkg in ${list} |
915 | do |
916 | (( current_pkg++ )) |
917 | #pcat=$(magename2pcat ${pkg}) |
918 | pcat="${pkg%%/*}" |
919 | pname=$(magename2pname ${pkg}) |
920 | pver=$(magename2pver ${pkg}) |
921 | pbuild=$(magename2pbuild ${pkg}) |
922 | |
923 | mage_install \ |
924 | --pcat ${pcat} \ |
925 | --pname ${pname} \ |
926 | --pver ${pver} \ |
927 | --pbuild ${pbuild} \ |
928 | --count-total ${total_pkgs} \ |
929 | --count-current ${current_pkg} \ |
930 | ${src_install} |
931 | |
932 | # check for allready installed packages and remove them |
933 | # except the package we have installed |
934 | uninstall_list="$(get_uninstall_candidates \ |
935 | --pcat "${pcat}" \ |
936 | --pname "${pname}" \ |
937 | --protected ${pcat}/${pname}-${pver}-${pbuild})" |
938 | |
939 | # uninstall all packges in uninstall_list if not empty |
940 | if [ -n "${uninstall_list}" ] |
941 | then |
942 | echo |
943 | uninstall_packages ${uninstall_list} \ |
944 | || die "install_packges() uninstalling not-needed." |
945 | fi |
946 | |
947 | # crlf for better view in VERBOSE mode |
948 | #if [[ ${VERBOSE} = on ]]; then echo; fi |
949 | echo |
950 | done |
951 | |
952 | #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}" |
953 | show_etc_update_mesg |
954 | } |
955 | |
956 | uninstall_packages() |
957 | { |
958 | local list="$@" |
959 | local pcat |
960 | local pname |
961 | local pver |
962 | local pbuild |
963 | local can_pcat |
964 | local can_pname |
965 | local can_ver_list |
966 | |
967 | if [[ -n ${MROOT} ]] |
968 | then |
969 | echo -ne ${COLRED} |
970 | echo "!! uninstalling from MROOT=${MROOT}" |
971 | echo -ne ${COLDEFAULT} |
972 | echo |
973 | fi |
974 | |
975 | # generate a candidates list |
976 | for pkg in ${list} |
977 | do |
978 | #pcat=$(dep2pcat ${pkg}) |
979 | pcat="${pkg%%/*}" |
980 | pname=$(magename2pname ${pkg}) |
981 | pver=$(magename2pver ${pkg}) |
982 | pbuild=$(magename2pbuild ${pkg}) |
983 | can_pcat="${pcat}" |
984 | can_pname="${pname}" |
985 | |
986 | if [ -z "${can_ver_list}" ] |
987 | then |
988 | can_ver_list=" ${pver}-${pbuild}" |
989 | else |
990 | can_ver_list="${can_ver_list}, ${pver}-${pbuild}" |
991 | fi |
992 | done |
993 | |
994 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
995 | echo "following candidate(s) will be removed:" |
996 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
997 | echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}" |
998 | echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}" |
999 | echo |
1000 | if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ] |
1001 | then |
1002 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
1003 | echo "( Press [CTRL+C] to abort )" |
1004 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
1005 | echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..." |
1006 | for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--)) |
1007 | do |
1008 | echo -ne "${COLRED} ${i}${COLDEFAULT}" |
1009 | sleep 1 |
1010 | done |
1011 | echo |
1012 | echo |
1013 | fi |
1014 | |
1015 | for pkg in ${list} |
1016 | do |
1017 | pcat=$(dep2pcat ${pkg}) |
1018 | pname=$(magename2pname ${pkg}) |
1019 | pver=$(magename2pver ${pkg}) |
1020 | pbuild=$(magename2pbuild ${pkg}) |
1021 | |
1022 | mage_uninstall \ |
1023 | --pcat ${pcat} \ |
1024 | --pname ${pname} \ |
1025 | --pver ${pver} \ |
1026 | --pbuild ${pbuild} \ |
1027 | --count-total ${total_pkgs} \ |
1028 | --count-current ${current_pkg} \ |
1029 | ${src_install} |
1030 | |
1031 | # crlf for better view in VERBOSE mode |
1032 | #if [[ ${VERBOSE} = on ]]; then echo; fi |
1033 | echo |
1034 | done |
1035 | } |
1036 | |
1037 | is_installed() |
1038 | { |
1039 | local DBFILE |
1040 | local pkgid |
1041 | local pcat |
1042 | local pname |
1043 | local pbuild |
1044 | local pver |
1045 | |
1046 | # very basic getops |
1047 | for i in $* |
1048 | do |
1049 | case $1 in |
1050 | --pcat|-c) shift; pcat="$1" ;; |
1051 | --pname|-n) shift; pname="$1" ;; |
1052 | --pver|-v) shift; pver="$1" ;; |
1053 | --pbuild|-b) shift; pbuild="$1" ;; |
1054 | esac |
1055 | shift |
1056 | done |
1057 | |
1058 | DBFILE="${MAGE_INSTALL_DB}" |
1059 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
1060 | |
1061 | [[ ! -z ${pkgid} ]] && return 0 |
1062 | return 1 |
1063 | } |
1064 | |
1065 | reverse_depends() |
1066 | { |
1067 | local DBFILE |
1068 | local pname="$1" |
1069 | |
1070 | DBFILE="${MAGE_INSTALL_DB}" |
1071 | sql "select categories.pcat, |
1072 | packages.pname, |
1073 | packages.pver, |
1074 | packages.pbuild |
1075 | from depends |
1076 | inner join packages on packages.id=depends.pkg_id |
1077 | inner join categories on categories.id=packages.pcat_id |
1078 | where depends.pname='${pname}'" |
1079 | } |
1080 | |
1081 | reverse_sdepends() |
1082 | { |
1083 | local DBFILE |
1084 | local pname="$1" |
1085 | |
1086 | DBFILE="${MAGE_INSTALL_DB}" |
1087 | sql "select categories.pcat, |
1088 | packages.pname, |
1089 | packages.pver, |
1090 | packages.pbuild |
1091 | from sdepends |
1092 | inner join packages on packages.id=sdepends.pkg_id |
1093 | inner join categories on categories.id=packages.pcat_id |
1094 | where sdepends.pname='${pname}'" |
1095 | } |
1096 | |
1097 | create_database_layout() |
1098 | { |
1099 | sql "create table categories(id integer primary key, pcat text unique)" |
1100 | sql "create table packages(id integer primary key, |
1101 | pname text, |
1102 | pver text, |
1103 | pbuild text, |
1104 | pcat_id numeric, |
1105 | state text, |
1106 | provide text, |
1107 | pkgtype text |
1108 | )" |
1109 | sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
1110 | sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
1111 | sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" |
1112 | #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" |
1113 | sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" |
1114 | } |
1115 | |
1116 | install_database_entry() |
1117 | { |
1118 | local pcat |
1119 | local pname |
1120 | local pver |
1121 | local pbuild |
1122 | local pkgtype |
1123 | local pkgname |
1124 | local magefile |
1125 | local dbrecorddir |
1126 | local provide |
1127 | local homepage |
1128 | local description |
1129 | local pkgid |
1130 | local depends |
1131 | local sdepends |
1132 | local relation |
1133 | local depcatid |
1134 | local depname |
1135 | local depver |
1136 | local depbuild |
1137 | local mage_pkg_id |
1138 | local i |
1139 | local install_pkg_id |
1140 | local table |
1141 | |
1142 | # very basic getops |
1143 | for i in $* |
1144 | do |
1145 | case $1 in |
1146 | --pcat|-c) shift; pcat="$1" ;; |
1147 | --pname|-n) shift; pname="$1" ;; |
1148 | --pver|-v) shift; pver="$1" ;; |
1149 | --pbuild|-b) shift; pbuild="$1" ;; |
1150 | --pkgname|-a) shift; pkgname="$1" ;; |
1151 | # --state|-s) shift; state="$1" ;; |
1152 | --pkgtype|-t) shift; pkgtype="$1" ;; |
1153 | esac |
1154 | shift |
1155 | done |
1156 | |
1157 | # sanity checks; abort if not given |
1158 | [[ -z ${pcat} ]] && die "install_database_entry() \$pcat not given." |
1159 | [[ -z ${pname} ]] && die "install_database_entry() \$pname not given." |
1160 | [[ -z ${pver} ]] && die "install_database_entry() \$pver not given." |
1161 | [[ -z ${pbuild} ]] && die "install_database_entry() \$pbuild not given." |
1162 | [[ -z ${pkgname} ]] && die "install_database_entry() \$pkgname not given." |
1163 | # [[ -z ${state} ]] && die "install_database_entry() \$state not given." |
1164 | |
1165 | # check needed global vars |
1166 | [[ -z ${MAGEDIR} ]] && die "install_database_entry() \$MAGEDIR not set." |
1167 | [[ -z ${INSTALLDB} ]] && die "install_database_entry() \$INSTALLDB not set." |
1168 | |
1169 | # first of all convert pbuild to database format (remove the r) |
1170 | pbuild="${pbuild/r/}" |
1171 | |
1172 | # check if |
1173 | # copy all things over over |
1174 | # mage.pkg_id |
1175 | DBFILE="${MAGE_PACKAGES_DB}" |
1176 | mage_pkg_id=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
1177 | |
1178 | DBFILE="${MAGE_INSTALL_DB}" |
1179 | # add pcat to installdb if missing |
1180 | if [[ -z $(sql "select id from categories where pcat='${pcat}'") ]] |
1181 | then |
1182 | sql "insert into categories (pcat) values ('${pcat}')" |
1183 | fi |
1184 | |
1185 | # attach install database |
1186 | # install.categories.id != main.categories.id !!! |
1187 | # so get pcat from pcat_id via inner join. |
1188 | # then query install db which id pcat has and use this one |
1189 | # final phase copies the whole crap to the install db |
1190 | # use some more rows to copy the whole table |
1191 | sqlite3 ${MAGE_PACKAGES_DB} \ |
1192 | "attach database '${MAGE_INSTALL_DB}' as install; |
1193 | insert into install.packages |
1194 | (pcat_id, |
1195 | pname, |
1196 | pver, |
1197 | pbuild, |
1198 | state, |
1199 | provide, |
1200 | pkgtype) |
1201 | select mage_id, |
1202 | main.packages.pname, |
1203 | main.packages.pver, |
1204 | main.packages.pbuild, |
1205 | main.packages.state, |
1206 | main.packages.provide, |
1207 | main.packages.pkgtype |
1208 | from main.packages, |
1209 | (select id as mage_id |
1210 | from install.categories where pcat=( |
1211 | select pcat from main.packages |
1212 | inner join main.categories |
1213 | on main.categories.id=main.packages.pcat_id |
1214 | where main.packages.id='${mage_pkg_id}') |
1215 | ) |
1216 | where main.packages.id=${mage_pkg_id};" |
1217 | |
1218 | # get install db pkg_id |
1219 | install_pkg_id=$(sql "select max(id) from packages") |
1220 | |
1221 | # now copy dependencies |
1222 | # replace pkg with the one from insatll.db |
1223 | for table in depends sdepends |
1224 | do |
1225 | sqlite3 ${MAGE_PACKAGES_DB} \ |
1226 | "attach database '${MAGE_INSTALL_DB}' as install; |
1227 | insert into install.${table} |
1228 | (pkg_id, |
1229 | relation, |
1230 | pcat_id, |
1231 | pname, |
1232 | pver, |
1233 | pbuild) |
1234 | select '${install_pkg_id}', |
1235 | relation, |
1236 | pcat_id, |
1237 | pname, |
1238 | pver, |
1239 | pbuild |
1240 | from main.${table} where pkg_id='${mage_pkg_id}'" |
1241 | done |
1242 | |
1243 | # and now the package infos |
1244 | sqlite3 ${MAGE_PACKAGES_DB} \ |
1245 | "attach database '${MAGE_INSTALL_DB}' as install; |
1246 | insert into install.packages_info |
1247 | (pkg_id, |
1248 | arch, |
1249 | md5, |
1250 | mtime, |
1251 | homepage, |
1252 | description, |
1253 | size) |
1254 | select '${install_pkg_id}', |
1255 | arch, |
1256 | md5, |
1257 | mtime, |
1258 | homepage, |
1259 | description, |
1260 | size |
1261 | from main.packages_info |
1262 | where pkg_id='${mage_pkg_id}' and arch='${ARCH}'" |
1263 | |
1264 | # now install PKGTYPE specific files |
1265 | case ${pkgtype} in |
1266 | virtual) echo ;; |
1267 | sources) echo ;; |
1268 | *) |
1269 | # and finally the package_content |
1270 | # but we first need to know the pkg_info id |
1271 | # because of the arch dependency |
1272 | pkg_info_id=$(sql "select max(id) from packages_info") |
1273 | |
1274 | sql "insert into packages_content |
1275 | (pkginfo_id, |
1276 | char, |
1277 | dirs, |
1278 | files, |
1279 | pipes, |
1280 | symlinks) |
1281 | values('${pkg_info_id}', |
1282 | 'records/${pkg_info_id}/char.bz2', |
1283 | 'records/${pkg_info_id}/dirs.bz2', |
1284 | 'records/${pkg_info_id}/files.bz2', |
1285 | 'records/${pkg_info_id}/pipes.bz2', |
1286 | 'records/${pkg_info_id}/symlinks.bz2')" |
1287 | # create compressed content files |
1288 | entrydir=${BUILDDIR}/${pname}-${pver}-${ARCH}-r${pbuild} |
1289 | local entryfile |
1290 | for entryfile in char dirs files pipes symlinks |
1291 | do |
1292 | install -d $(dirname ${MAGE_INSTALL_DB})/records/${pkg_info_id} |
1293 | cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${MAGE_INSTALL_DB})/records/${pkg_info_id}/${entryfile}.bz2 |
1294 | done |
1295 | ;; |
1296 | esac |
1297 | } |