Contents of /trunk/mage/usr/lib/mage/mage4.functions2.sh
Parent Directory | Revision Log
Revision 226 -
(show annotations)
(download)
(as text)
Fri Sep 9 16:35:46 2005 UTC (18 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 42976 byte(s)
Fri Sep 9 16:35:46 2005 UTC (18 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 42976 byte(s)
complete rewrite
1 | #!/bin/bash |
2 | # Magellan Linux Installer Functions (mage.functions.sh) |
3 | # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions2.sh,v 1.1 2005-09-09 16:35:33 niro Exp $ |
4 | |
5 | mage_setup() |
6 | { |
7 | [ ! -d ${INSTALLDB} ] && install -d ${INSTALLDB} |
8 | [ ! -d ${PKGDIR} ] && install -d ${PKGDIR} |
9 | [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR} |
10 | [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR} |
11 | } |
12 | |
13 | fatal_error() |
14 | { |
15 | # $1 is the missing file |
16 | echo -e "\nFatal Error: Package seemed to be corrupt." |
17 | echo -e "$1 was not found in ${PKGNAME}" |
18 | exit 1 |
19 | } |
20 | |
21 | # build_unpackpkg() |
22 | # { |
23 | # tar xjmf ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} -C ${BUILDDIR} || die "Unpacking package" |
24 | # } |
25 | |
26 | unpack_packages() |
27 | { |
28 | local list="$@" |
29 | local magefile |
30 | local pkg |
31 | local pkgtype |
32 | |
33 | for magefile in ${list} |
34 | do |
35 | pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}" |
36 | pkgtype="$(get_value_from_magefile PKGTYPE ${magefile}).${PKGSUFFIX}" |
37 | |
38 | # abort on virtual pkg |
39 | [[ ${pkgtype} = virtual ]] && continue |
40 | |
41 | echo -e " ${COLBLUE}***${COLDEFAULT} unpacking ${pkg} ... " |
42 | tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}" |
43 | done |
44 | } |
45 | |
46 | update_mtime() |
47 | { |
48 | local M_MTIME |
49 | DB_ENTRY=${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
50 | |
51 | # forcing mtime to same value |
52 | echo |
53 | echo -n ">>>> Forcing mtime to the same value ..." |
54 | #find ${BUILDDIR}/${PKGNAME}/binfiles \ |
55 | # -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \ |
56 | # && echo done || echo false |
57 | |
58 | |
59 | # get new M_MTIME from .mtime |
60 | M_MTIME=$(stat -c %Y ${DB_ENTRY}/.mtime) |
61 | |
62 | # updating .files db entries; only if not empty, or they get killed |
63 | if [ -e "${DB_ENTRY}/.files" ] |
64 | then |
65 | if [ -n "$(cat ${DB_ENTRY}/.files)" ] |
66 | then |
67 | # make backup |
68 | mv ${DB_ENTRY}/.files \ |
69 | ${DB_ENTRY}/.files-old |
70 | |
71 | # sets fieldseperator to "§" instead of " " |
72 | IFS=§ |
73 | |
74 | # update |
75 | while read pathto posix user group mtime md5sum |
76 | do |
77 | echo "${pathto}§${posix}§${user}§${group}§${M_MTIME}§${md5sum}" \ |
78 | >> ${DB_ENTRY}/.files |
79 | touch -c -m -r ${DB_ENTRY}/.mtime ${pathto} |
80 | done < ${DB_ENTRY}/.files-old |
81 | |
82 | # remove old list |
83 | rm -f ${DB_ENTRY}/.files-old |
84 | |
85 | # very important: unsetting the '§' fieldseperator |
86 | unset IFS |
87 | fi |
88 | else |
89 | fatal_error .files |
90 | fi |
91 | |
92 | |
93 | # updating .symlink db entries; only if not empty, or they get killed |
94 | if [ -e "${DB_ENTRY}/.symlinks" ] |
95 | then |
96 | if [ -n "$(cat ${DB_ENTRY}/.symlinks)" ] |
97 | then |
98 | # make backup |
99 | mv ${DB_ENTRY}/.symlinks \ |
100 | ${DB_ENTRY}/.symlinks-old |
101 | |
102 | # sets fieldseperator to "§" instead of " " |
103 | IFS=§ |
104 | |
105 | # update |
106 | while read pathto posix link mtime |
107 | do |
108 | echo "${pathto}§${posix}§${link}§${M_MTIME}" \ |
109 | >> ${DB_ENTRY}/.symlinks |
110 | touch -c -m -r ${DB_ENTRY}/.mtime ${pathto} |
111 | done < ${DB_ENTRY}/.symlinks-old |
112 | |
113 | # remove old list |
114 | rm -f ${DB_ENTRY}/.symlinks-old |
115 | |
116 | # very important: unsetting the '§' fieldseperator |
117 | unset IFS |
118 | fi |
119 | else |
120 | fatal_error .symlinks |
121 | fi |
122 | } |
123 | |
124 | ################################################### |
125 | # function install_direcories # |
126 | # install_direcories $PKGNAME # |
127 | ################################################### |
128 | install_directories() |
129 | { |
130 | local pkgname="$1" |
131 | local pathto |
132 | local posix |
133 | local user |
134 | local group |
135 | local IFS |
136 | |
137 | # sanity checks; abort if not given |
138 | [ -z "${pkgname}" ] && die "install_directories() \$pkgname not given." |
139 | |
140 | # check needed global vars |
141 | [ -z "${BUILDDIR}" ] && die "install_directories() \$BUILDDIR not set." |
142 | |
143 | [ ! -f ${BUILDDIR}/${pkgname} ] && die ".dir not found" |
144 | |
145 | # sets fieldseperator to "§" instead of " " |
146 | IFS=§ |
147 | |
148 | while read pathto posix user group |
149 | do |
150 | [ -z "${pathto}" ] && continue |
151 | [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR: ${pathto}" |
152 | install -m "${posix}" -o "${user}" -g "${group}" -d "${MAGE_INSTALL_ROOT}${pathto}" |
153 | done < ${BUILDDIR}/${pkgname}/.dirs |
154 | |
155 | # very important: unsetting the '§' fieldseperator |
156 | IFS=$'\n' |
157 | } |
158 | |
159 | |
160 | ################################################### |
161 | # function install_files # |
162 | # install_files $PKGNAME # |
163 | ################################################### |
164 | install_files() |
165 | { |
166 | local PKGNAME |
167 | local RETVAL |
168 | local COUNTER |
169 | local FILENAME |
170 | local DESTINATION |
171 | |
172 | PKGNAME=$1 |
173 | |
174 | if [ -e ${BUILDDIR}/${PKGNAME}/.files ] |
175 | then |
176 | # sets fieldseperator to "§" instead of " " |
177 | IFS=§ |
178 | |
179 | while read pathto posix user group mtime md5sum |
180 | do |
181 | [ -z "${pathto}" ] && continue |
182 | [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${pathto}" |
183 | |
184 | ### small hotfix fix ### |
185 | [ ! -d "$(dirname "${pathto}")" ] && install -d "$(dirname "${pathto}")" |
186 | |
187 | # when file exists, check if protected |
188 | if [ -e "${pathto}" ] |
189 | then |
190 | is_config_protected "${pathto}" |
191 | RETVAL=$? |
192 | |
193 | # 0 - not protected # |
194 | # 1 - error # |
195 | # 2 - protected # |
196 | # 3 - protected but masked # |
197 | |
198 | case ${RETVAL} in |
199 | # file is not protected - overwrite it |
200 | 0|3) |
201 | FILE="$pathto" |
202 | install -m ${posix} -o ${user} -g ${group} \ |
203 | ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \ |
204 | "$pathto" |
205 | ;; |
206 | |
207 | #file is protected - write backup file |
208 | # "._cfg${COUNTER}_{FILENAME} |
209 | 2) |
210 | if [ "${VERBOSE}" == "on" ] |
211 | then |
212 | # moves the cursor up |
213 | echo -en \\033[A |
214 | echo -e "${COLRED}! prot ${COLDEFAULT} === FILE: $pathto" |
215 | fi |
216 | FILENAME="$(basename "${pathto}")" |
217 | FILE="$pathto" |
218 | COUNTER=$(count_protected_files "${FILE}") |
219 | DESTINATION="$(dirname "$pathto")/._cfg${COUNTER}_${FILENAME}" |
220 | install -m ${posix} -o ${user} -g ${group} \ |
221 | ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \ |
222 | "${DESTINATION}" |
223 | |
224 | #set run_etc_update=true |
225 | PROTECT_COUNT=${PROTECT_COUNT}+1 |
226 | ;; |
227 | esac |
228 | else |
229 | # install file because it does not exists |
230 | FILE="$pathto" |
231 | install -m ${posix} -o ${user} -g ${group} \ |
232 | ${BUILDDIR}/${PKGNAME}/binfiles/$FILE \ |
233 | "$pathto" |
234 | fi |
235 | |
236 | #not needed anymore ? |
237 | #if [ ! -z $user ] |
238 | #then |
239 | # chown $user:$group $FILE ### <---- test |
240 | #fi |
241 | done < ${BUILDDIR}/${PKGNAME}/.files |
242 | |
243 | # very important: unsetting the '§' fieldseperator |
244 | unset IFS |
245 | else |
246 | fatal_error .files |
247 | fi |
248 | } |
249 | |
250 | |
251 | ################################################### |
252 | # function install_symlinks # |
253 | # install_symlinks $PKGNAME # |
254 | ################################################### |
255 | install_symlinks() |
256 | { |
257 | local PKGNAME |
258 | PKGNAME=$1 |
259 | |
260 | if [ -e ${BUILDDIR}/${PKGNAME}/.symlinks ] |
261 | then |
262 | # sets fieldseperator to "§" instead of " " |
263 | IFS=§ |
264 | |
265 | while read pathto posix link mtime |
266 | do |
267 | if [ ! -z "$pathto" ] |
268 | then |
269 | if [ "$VERBOSE" == "on" ] |
270 | then |
271 | echo -e "\t>>> LINK: $pathto" |
272 | fi |
273 | ln -snf $link "$pathto" |
274 | fi |
275 | done < ${BUILDDIR}/${PKGNAME}/.symlinks |
276 | |
277 | # very important: unsetting the '§' fieldseperator |
278 | unset IFS |
279 | else |
280 | fatal_error .symlinks |
281 | fi |
282 | } |
283 | |
284 | |
285 | ################################################### |
286 | # function install_blockdevices # |
287 | # install_blockdevices $PKGNAME # |
288 | ################################################### |
289 | install_blockdevices() |
290 | { |
291 | local PKGNAME |
292 | PKGNAME=$1 |
293 | |
294 | if [ -e ${BUILDDIR}/${PKGNAME}/.pipes ] |
295 | then |
296 | # sets fieldseperator to "§" instead of " " |
297 | IFS=§ |
298 | |
299 | while read pathto posix |
300 | do |
301 | if [ ! -z "$pathto" ] |
302 | then |
303 | if [ "$VERBOSE" == "on" ] |
304 | then |
305 | echo -e "\t>>> PIPE: $pathto" |
306 | fi |
307 | mkfifo -m $posix "$pathto" |
308 | fi |
309 | done < ${BUILDDIR}/${PKGNAME}/.pipes |
310 | |
311 | # very important: unsetting the '§' fieldseperator |
312 | unset IFS |
313 | else |
314 | fatal_error .pipes |
315 | fi |
316 | } |
317 | |
318 | |
319 | ################################################### |
320 | # function install_characterdevices # |
321 | # install_characterdevices $PKGNAME # |
322 | ################################################### |
323 | install_characterdevices() |
324 | { |
325 | local PKGNAME |
326 | PKGNAME=$1 |
327 | |
328 | if [ -e ${BUILDDIR}/${PKGNAME}/.char ] |
329 | then |
330 | # sets fieldseperator to "§" instead of " " |
331 | IFS=§ |
332 | |
333 | while read pathto posix |
334 | do |
335 | if [ ! -z "$pathto" ] |
336 | then |
337 | if [ "$VERBOSE" == "on" ] |
338 | then |
339 | echo -e "\t>>> CHAR: $pathto" |
340 | fi |
341 | mknode -m $posix -c "$pathto" |
342 | fi |
343 | done < ${BUILDDIR}/${PKGNAME}/.char |
344 | |
345 | # very important: unsetting the '§' fieldseperator |
346 | unset IFS |
347 | else |
348 | fatal_error .char |
349 | fi |
350 | |
351 | #very important: unsetting the '§' fieldseperator |
352 | unset IFS |
353 | } |
354 | |
355 | |
356 | ################################################### |
357 | # function build_doinstall # |
358 | # build_doinstall $PKGNAME # |
359 | # NOTE: this is an wrapper do install packages # |
360 | ################################################### |
361 | build_doinstall() |
362 | { |
363 | local pkgname="$1" |
364 | |
365 | echo "DEBUG: pkgname=${pkgname}" |
366 | |
367 | # sanity checks; abort if not given |
368 | [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given." |
369 | |
370 | echo "DEBUG=jojo" |
371 | |
372 | # this is only a wrapper |
373 | |
374 | # NOTE: |
375 | # !! we use § as field seperator !! |
376 | # doing so prevent us to get errors by filenames with spaces |
377 | |
378 | install_directories ${pkgname} || die "install directories ${pkgname}" |
379 | # install_files ${pkgname} || die "install files ${pkgname}" |
380 | # install_symlinks ${pkgname} || die "install symlinks ${pkgname}" |
381 | # install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}" |
382 | # install_characterdevices ${pkgname} || die "install chardevices ${pkgname}" |
383 | } |
384 | |
385 | |
386 | ################################################### |
387 | # function install_database_entry # |
388 | # install_database_entry $PKGNAME $PKGTYPE # |
389 | # PKGTYPE can be "virtual", "sources" or nothing # |
390 | ################################################### |
391 | install_database_entry() |
392 | { |
393 | local PKGNAME |
394 | local PKGTYPE |
395 | |
396 | PKGNAME=$1 |
397 | PKGTYPE=$2 |
398 | |
399 | # add package to database |
400 | install -d ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
401 | |
402 | # install mage-file to database |
403 | install -m 0644 -o root -g root \ |
404 | ${MAGEFILE} \ |
405 | ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
406 | |
407 | # create fake file descriptors |
408 | # used by virtual and source packages |
409 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.dirs |
410 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.symlinks |
411 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.files |
412 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.pipes |
413 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.char |
414 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.mtime |
415 | |
416 | # put category to database |
417 | echo ${CATEGORIE} > ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.categorie |
418 | |
419 | # install PKGTYPE specific files |
420 | case ${PKGTYPE} in |
421 | virtual) |
422 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.virtual |
423 | ;; |
424 | |
425 | sources) |
426 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.sources |
427 | ;; |
428 | |
429 | *) |
430 | # normal packages needs these files |
431 | cp -f ${BUILDDIR}/${PKGNAME}/.{char,dirs,files,pipes,symlinks,mtime} \ |
432 | ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
433 | ;; |
434 | esac |
435 | } |
436 | |
437 | |
438 | ################################################### |
439 | # function remove_database_entry # |
440 | # remove_database_entry $PKGNAME $PKGTYPE # |
441 | # PKGTYPE can be "virtual", "sources" or nothing # |
442 | ################################################### |
443 | remove_database_entry() |
444 | { |
445 | local PKGNAME |
446 | local PKGTYPE |
447 | |
448 | PKGNAME=$1 |
449 | PKGTYPE=$2 |
450 | |
451 | #removes database entry |
452 | if [ -d ${INSTALLDB}/${PKGNAME} ] |
453 | then |
454 | rm -rf ${INSTALLDB}/${PKGNAME} |
455 | fi |
456 | } |
457 | |
458 | |
459 | ################################################### |
460 | # function compare_mtime # |
461 | # compare_mtime $PKGNAME /path/to/file # |
462 | # # |
463 | # returns: # |
464 | # 0=delete me # |
465 | # 1=keep me # |
466 | # # |
467 | # compares mtime of given files in packages # |
468 | ################################################### |
469 | compare_mtime() |
470 | { |
471 | local DBDIR |
472 | local pathto |
473 | local x |
474 | |
475 | DBDIR=$1 |
476 | pathto=$2 |
477 | |
478 | M_MTIME=$(stat -c %Y ${INSTALLDB}/${DBDIR}/.mtime) |
479 | |
480 | # if $pathto is a symlink than compare linked binary |
481 | if [ -L ${pathto} ] |
482 | then |
483 | #readlink -f resolves full path of linked file |
484 | x=$(stat -c %Y "$(readlink -f "${pathto}")") |
485 | else |
486 | x=$(stat -c %Y "${pathto}") |
487 | fi |
488 | |
489 | if [ "${M_MTIME}" -eq "${x}" ] |
490 | then |
491 | #echo "delete me: ${pathto}" |
492 | return 0 |
493 | else |
494 | #echo "keep me : ${pathto}" |
495 | return 1 |
496 | fi |
497 | } |
498 | |
499 | |
500 | ################################################### |
501 | # function remove_symlinks # |
502 | # remove_symlinks $PKGNAME # |
503 | ################################################### |
504 | remove_symlinks() |
505 | { |
506 | local PKGNAME |
507 | local RETVAL |
508 | |
509 | PKGNAME=$1 |
510 | |
511 | if [ -e ${INSTALLDB}/${PKGNAME}/.symlinks ] |
512 | then |
513 | # sets fieldseperator to "§" instead of " " |
514 | IFS=§ |
515 | |
516 | while read pathto posix link mtime |
517 | do |
518 | if [ ! -z "$pathto" ] |
519 | then |
520 | if [ -L "$pathto" ] |
521 | then |
522 | compare_mtime ${PKGNAME} "${pathto}" |
523 | RETVAL=$? |
524 | # 0=delete me # |
525 | # 1=keep me # |
526 | case ${RETVAL} in |
527 | 0) |
528 | if [ "${VERBOSE}" == "on" ] |
529 | then |
530 | echo -e "\t<<< LINK: $pathto" |
531 | fi |
532 | rm "$pathto" |
533 | ;; |
534 | 1) |
535 | if [ "${VERBOSE}" == "on" ] |
536 | then |
537 | echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: $pathto" |
538 | fi |
539 | ;; |
540 | esac |
541 | else |
542 | if [ "${VERBOSE}" == "on" ] |
543 | then |
544 | echo -e "${COLRED}! exist${COLDEFAULT} === LINK: $pathto" |
545 | fi |
546 | fi |
547 | fi |
548 | done < ${INSTALLDB}/${PKGNAME}/.symlinks |
549 | |
550 | # very important: unsetting the '§' fieldseperator |
551 | unset IFS |
552 | else |
553 | fatal_error .symlinks |
554 | fi |
555 | } |
556 | |
557 | |
558 | ################################################### |
559 | # function remove_files # |
560 | # remove_files $PKGNAME # |
561 | ################################################### |
562 | remove_files() |
563 | { |
564 | local PKGNAME |
565 | local RETVAL |
566 | |
567 | PKGNAME=$1 |
568 | |
569 | # uninstall of files |
570 | if [ -e ${INSTALLDB}/${PKGNAME}/.files ] |
571 | then |
572 | # sets fieldseperator to "§" instead of " " |
573 | IFS=§ |
574 | |
575 | while read pathto posix user group mtime md5sum |
576 | do |
577 | if [ ! -z "$pathto" ] |
578 | then |
579 | if [ -e "$pathto" ] |
580 | then |
581 | compare_mtime ${PKGNAME} "${pathto}" |
582 | RETVAL=$? |
583 | # 0=delete me # |
584 | # 1=keep me # |
585 | case ${RETVAL} in |
586 | 0) |
587 | if [ "${VERBOSE}" == "on" ] |
588 | then |
589 | echo -e "\t<<< FILE: $pathto" |
590 | fi |
591 | rm "$pathto" |
592 | ;; |
593 | 1) |
594 | if [ "${VERBOSE}" == "on" ] |
595 | then |
596 | echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: $pathto" |
597 | fi |
598 | ;; |
599 | esac |
600 | else |
601 | if [ "${VERBOSE}" == "on" ] |
602 | then |
603 | echo -e "${COLRED}! exist${COLDEFAULT} === FILE: $pathto" |
604 | fi |
605 | fi |
606 | fi |
607 | done < ${INSTALLDB}/${PKGNAME}/.files |
608 | |
609 | # very important: unsetting the '§' fieldseperator |
610 | unset IFS |
611 | else |
612 | fatal_error .files |
613 | fi |
614 | } |
615 | |
616 | |
617 | ################################################### |
618 | # function remove_blockdevices # |
619 | # remove_blockdevices $PKGNAME # |
620 | ################################################### |
621 | remove_blockdevices() |
622 | { |
623 | local PKGNAME |
624 | PKGNAME=$1 |
625 | |
626 | if [ -e ${INSTALLDB}/${PKGNAME}/.pipes ] |
627 | then |
628 | # sets fieldseperator to "§" instead of " " |
629 | IFS=§ |
630 | |
631 | while read pathto posix |
632 | do |
633 | if [ ! -z "$pathto" ] |
634 | then |
635 | if [ "${VERBOSE}" == "on" ] |
636 | then |
637 | echo -e "\t<<< PIPE: $pathto" |
638 | fi |
639 | rm "$pathto" |
640 | fi |
641 | done < ${INSTALLDB}/${PKGNAME}/.pipes |
642 | |
643 | # very important: unsetting the '§' fieldseperator |
644 | unset IFS |
645 | else |
646 | fatal_error .pipes |
647 | fi |
648 | } |
649 | |
650 | |
651 | ################################################### |
652 | # function remove_characterdevices # |
653 | # remove_characterdevices $PKGNAME # |
654 | ################################################### |
655 | remove_characterdevices() |
656 | { |
657 | local PKGNAME |
658 | PKGNAME=$1 |
659 | |
660 | if [ -e ${INSTALLDB}/${PKGNAME}/.char ] |
661 | then |
662 | # sets fieldseperator to "§" instead of " " |
663 | IFS=§ |
664 | |
665 | while read pathto posix |
666 | do |
667 | if [ ! -z "$pathto" ] |
668 | then |
669 | if [ "${VERBOSE}" == "on" ] |
670 | then |
671 | echo -e "\t<<< CHAR: $pathto" |
672 | fi |
673 | rm "$pathto" |
674 | fi |
675 | done < ${INSTALLDB}/${PKGNAME}/.char |
676 | |
677 | # very important: unsetting the '§' fieldseperator |
678 | unset IFS |
679 | else |
680 | fatal_error .char |
681 | fi |
682 | } |
683 | |
684 | |
685 | ################################################### |
686 | # function remove_direcories # |
687 | # remove_direcories $PKGNAME # |
688 | ################################################### |
689 | remove_directories() |
690 | { |
691 | local PKGNAME |
692 | PKGNAME=$1 |
693 | |
694 | # uninstall of dirs ## added small hack to fix dirs |
695 | # must be reverse -> smage2 doesn't sort them |
696 | if [ -e ${INSTALLDB}/${PKGNAME}/.dirs ] |
697 | then |
698 | |
699 | # sort directory order |
700 | mv ${INSTALLDB}/${PKGNAME}/.dirs ${INSTALLDB}/${PKGNAME}/.dirs_old |
701 | cat ${INSTALLDB}/${PKGNAME}/.dirs_old | sort > ${INSTALLDB}/${PKGNAME}/.dirs |
702 | |
703 | # sets fieldseperator to "§" instead of " " |
704 | IFS=§ |
705 | |
706 | while read pathto posix |
707 | do |
708 | if [ ! -z "$pathto" ] |
709 | then |
710 | if [ -e "$pathto" ] |
711 | then |
712 | if [ "${VERBOSE}" == "on" ] |
713 | then |
714 | echo -e "\t<<< DIR: $pathto" |
715 | fi |
716 | rmdir "$pathto" &> /dev/null |
717 | if [ "$?" -ne "0" ] |
718 | then |
719 | if [ "${VERBOSE}" == "on" ] |
720 | then |
721 | # moves the cursor up |
722 | echo -en \\033[A |
723 | echo -e "${COLRED}! empty${COLDEFAULT} === DIR: $pathto" |
724 | fi |
725 | fi |
726 | else |
727 | if [ "${VERBOSE}" == "on" ] |
728 | then |
729 | echo -e "${COLRED}! exist${COLDEFAULT} === DIR: $pathto" |
730 | fi |
731 | fi |
732 | fi |
733 | done < ${INSTALLDB}/${PKGNAME}/.dirs |
734 | |
735 | # very important: unsetting the '§' fieldseperator |
736 | unset IFS |
737 | else |
738 | fatal_error .dirs |
739 | fi |
740 | } |
741 | |
742 | |
743 | ################################################### |
744 | # function build_douninstall # |
745 | # build_douninstall $PKGNAME # |
746 | # NOTE: this is an wrapper do remove packages # |
747 | ################################################### |
748 | build_douninstall() |
749 | { |
750 | # this is only a wrapper |
751 | |
752 | # NOTE: |
753 | # !! we use § as field seperator !! |
754 | # doing so prevent us to get errors by filenames with spaces |
755 | |
756 | local PKGNAME |
757 | PKGNAME=$1 |
758 | |
759 | remove_symlinks ${PKGNAME} |
760 | remove_files ${PKGNAME} |
761 | remove_blockdevices ${PKGNAME} |
762 | remove_characterdevices ${PKGNAME} |
763 | remove_directories ${PKGNAME} |
764 | } |
765 | |
766 | # fetch_packages /path/to/mage/file1 /path/to/mage/file2 |
767 | fetch_packages() |
768 | { |
769 | local pkg |
770 | local mirr |
771 | local magefile |
772 | local md5file |
773 | local opt |
774 | |
775 | [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc." |
776 | |
777 | for magefile in $@ |
778 | do |
779 | pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}" |
780 | pkgtype="$(get_value_from_magefile PKGTYPE ${magefile}).${PKGSUFFIX}" |
781 | |
782 | # abort on virtual pkg |
783 | [[ ${pkgtype} = virtual ]] && continue |
784 | |
785 | # abort if already exist |
786 | if [ -f ${PKGDIR}/${pkg} ] |
787 | then |
788 | echo -e " ${COLBLUE}***${COLDEFAULT} fetch complete ${pkg} ... " |
789 | continue |
790 | fi |
791 | |
792 | for mirr in ${MIRRORS} |
793 | do |
794 | echo -e " ${COLBLUE}***${COLDEFAULT} fetching ${mirr}/${pkg} ... " |
795 | [[ ${VERBOSE} = off ]] && opt="--quiet" |
796 | wget \ |
797 | --passive-ftp \ |
798 | --tries 3 \ |
799 | --continue \ |
800 | --progress bar \ |
801 | --directory-prefix=${PKGDIR} \ |
802 | ${opt} ${mirr}/packages/${pkg} |
803 | if [[ $? = 0 ]] |
804 | then |
805 | break |
806 | else |
807 | continue |
808 | fi |
809 | done |
810 | |
811 | if [ ! -f ${PKGDIR}/${pkg} ] |
812 | then |
813 | die "Could not download ${pkg}" |
814 | fi |
815 | done |
816 | } |
817 | |
818 | syncmage() |
819 | { |
820 | if [ -z "${RSYNC}" ] |
821 | then |
822 | die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc." |
823 | fi |
824 | |
825 | local i |
826 | for i in ${RSYNC} |
827 | do |
828 | rsync \ |
829 | --recursive \ |
830 | --links \ |
831 | --perms \ |
832 | --times \ |
833 | --devices \ |
834 | --timeout=600 \ |
835 | --verbose \ |
836 | --compress \ |
837 | --progress \ |
838 | --stats \ |
839 | --delete \ |
840 | --delete-after \ |
841 | ${i} ${MAGEDIR} |
842 | if [[ $? = 0 ]] |
843 | then |
844 | break |
845 | else |
846 | continue |
847 | fi |
848 | done |
849 | |
850 | # clean up backup files (foo~) |
851 | find ${MAGEDIR} -name *~ -exec rm '{}' ';' |
852 | |
853 | # check if an newer mage version is available |
854 | is_newer_mage_version_available |
855 | } |
856 | |
857 | cleanpkg() |
858 | { |
859 | if [ -d "${PKGDIR}" ] |
860 | then |
861 | echo -n "Removing downloaded packages... " |
862 | rm -rf ${PKGDIR}/* |
863 | echo "done." |
864 | fi |
865 | } |
866 | |
867 | ################################################### |
868 | # function keepfiles # |
869 | # keepfiles "$CATEGORIE/$PNAME" "$filename" # |
870 | # note wildchars allowed # |
871 | ################################################### |
872 | keepfiles() |
873 | { |
874 | local name |
875 | local keep |
876 | name="`echo $1| cut -d '/' -f2`" |
877 | keep="$2" |
878 | |
879 | DELPKG="`find ${INSTALLDB} -name ${name}*.mage`" |
880 | DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)" |
881 | cp ${DELDIR}/.files ${DELDIR}/.files-orig |
882 | sed "s:${keep}::" \ |
883 | ${DELDIR}/.files-orig > ${DELDIR}/.files |
884 | rm ${DELDIR}/.files-orig |
885 | } |
886 | |
887 | |
888 | ################################################### |
889 | # function injectpkg # |
890 | # injectpkg "$CATEGORIE/$PNAME" # |
891 | # note wildchars allowed # |
892 | ################################################### |
893 | injectpkg() |
894 | { |
895 | local name |
896 | local categorie |
897 | local magename |
898 | name="`echo $1| cut -d '/' -f2`" |
899 | categorie="`echo $1| cut -d '/' -f1`" |
900 | |
901 | INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`" |
902 | for i in ${INJPKG} |
903 | do |
904 | magename="$(basename ${INJPKG} .mage)" |
905 | echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}" |
906 | install -d ${INSTALLDB}/${magename} |
907 | touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char} |
908 | |
909 | #installs magefile |
910 | install -m 0644 -o root -g root \ |
911 | ${MAGEDIR}/${categorie}/${magename}.mage \ |
912 | ${INSTALLDB}/${magename} |
913 | done |
914 | } |
915 | |
916 | ################################################### |
917 | # function reminjected # |
918 | # reminjected # |
919 | # note: removes all injected packages # |
920 | ################################################### |
921 | reminjected() |
922 | { |
923 | DELINJ="`find ${INSTALLDB} -name .injected`" |
924 | for i in ${DELINJ} |
925 | do |
926 | magename=$(dirname ${i}) |
927 | if [ -d "${magename}" ] |
928 | then |
929 | # small fix to protect the mage-db deleting itself, that is not so funny :) |
930 | if [ "${magename}" != "${INSTALLDB}" ] |
931 | then |
932 | echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}" |
933 | rm -rf ${magename} |
934 | fi |
935 | fi |
936 | done |
937 | } |
938 | |
939 | |
940 | xtitle() |
941 | { |
942 | if [ ${TERM} == "xterm" ] |
943 | then |
944 | echo -ne "\033]0;Mage: $1\007" |
945 | fi |
946 | return 0 |
947 | } |
948 | |
949 | |
950 | xtitleclean() |
951 | { |
952 | if [ ${TERM} == "xterm" ] |
953 | then |
954 | echo -ne "\033]0;\007" |
955 | fi |
956 | return 0 |
957 | } |
958 | |
959 | |
960 | spin_processbar() |
961 | { |
962 | |
963 | # does not works as it should -- disabled |
964 | # you musst add and remove a tempfile outside this funktion |
965 | # to leave this funktion ... |
966 | |
967 | # before you call this function do this: |
968 | # |
969 | # touch /var/tmp/proz |
970 | # build_doinstall|spin_processbar |
971 | |
972 | echo -en "Processing: " |
973 | while [ -f /var/tmp/proz ] |
974 | do |
975 | echo -en "-\b" |
976 | sleep 0.01 |
977 | echo -en "\\ \b\b" |
978 | sleep 0.01 |
979 | echo -en "|\b" |
980 | sleep 0.01 |
981 | echo -en "/\b" |
982 | sleep 0.01 |
983 | done |
984 | echo "done" |
985 | return 0 |
986 | |
987 | # when you want to leave the funktion do |
988 | # something like this: |
989 | # |
990 | # #remove spinner tempfile |
991 | # if [ "$VERBOSE" == "off" ] |
992 | # then |
993 | # if [ -f /var/tmp/proz ] |
994 | # then |
995 | # rm /var/tmp/proz |
996 | # fi |
997 | # fi |
998 | |
999 | } |
1000 | |
1001 | |
1002 | # cuts full pathnames or versioniezed names down to basename |
1003 | choppkgname() |
1004 | { |
1005 | #we want this only if full name was used |
1006 | if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ] |
1007 | then |
1008 | #cuts ARCH and PBUILD |
1009 | #ARCH comes from /etc/mage.rc |
1010 | MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g") |
1011 | |
1012 | #cuts version number |
1013 | MAGENAME=$(basename ${MAGENAME%-*} .mage) |
1014 | fi |
1015 | } |
1016 | |
1017 | |
1018 | # # get_categorie $PNAME, returns CATEGORIE |
1019 | # # ret 0=ok, 1=not_found |
1020 | # getcategorie() |
1021 | # { |
1022 | # local pname="$1" |
1023 | # local pcat |
1024 | # |
1025 | # for CAT in ${MAGEDIR}/* |
1026 | # do |
1027 | # if [ -d ${CAT}/${MAGENAME} ] |
1028 | # then |
1029 | # # debug only |
1030 | # if [[ ${MAGEDEBUG} = on ]] |
1031 | # then |
1032 | # echo "${MAGENAME} found -> ${CAT}/${MAGENAME}" |
1033 | # echo "categorie = $(basename ${CAT})" |
1034 | # fi |
1035 | # CATEGORIE=$(basename ${CAT}) |
1036 | # fi |
1037 | # done |
1038 | # |
1039 | # # package does not exists |
1040 | # [ -z "${CATEGORIE}" ] && die "Package '${MAGENAME}' does not exists." |
1041 | # |
1042 | # echo "${CATEGORIE}" |
1043 | # } |
1044 | |
1045 | |
1046 | # get_categorie $PNAME, returns CATEGORIE |
1047 | # ret 0=ok, 1=not_found |
1048 | pname2pcat() |
1049 | { |
1050 | local pname="$1" |
1051 | local pcat |
1052 | local categorie |
1053 | |
1054 | for pcat in ${MAGEDIR}/* |
1055 | do |
1056 | if [ -d ${pcat}/${pname} ] |
1057 | then |
1058 | # for debug only |
1059 | if [[ ${MAGEDEBUG} = on ]] |
1060 | then |
1061 | echo "${MAGENAME} found -> ${pcat}/${pname}" |
1062 | echo "categorie = $(basename ${pcat})" |
1063 | fi |
1064 | categorie=$(basename ${pcat}) |
1065 | fi |
1066 | done |
1067 | |
1068 | # package does not exists |
1069 | [ -z "${categorie}" ] && die "Package '${pname}' does not exists." |
1070 | |
1071 | echo "${categorie}" |
1072 | } |
1073 | |
1074 | # check_stable_package /path/to/foo.mage |
1075 | # returns 0=stable 1=unstable |
1076 | check_stable_package() |
1077 | { |
1078 | local STATE |
1079 | STATE="$(get_value_from_magefile STATE "$1")" |
1080 | |
1081 | # state testing |
1082 | if [[ ${USE_TESTING} = true ]] |
1083 | then |
1084 | case ${STATE} in |
1085 | testing|stable) return 0 ;; |
1086 | *) return 1 ;; |
1087 | esac |
1088 | fi |
1089 | |
1090 | # state unstable |
1091 | if [[ ${USE_UNSTABLE} = true ]] |
1092 | then |
1093 | case ${STATE} in |
1094 | unstable|testing|stable) return 0 ;; |
1095 | *) return 1 ;; |
1096 | esac |
1097 | fi |
1098 | |
1099 | # no use_state given = stable |
1100 | case ${STATE} in |
1101 | stable) return 0 ;; |
1102 | *) return 1 ;; |
1103 | esac |
1104 | } |
1105 | |
1106 | |
1107 | # get_highest_magefile ${PCAT} ${PNAME} |
1108 | # fake at moment returns only stable pkgs (must set to be one) |
1109 | # return $HIGHEST_MAGEFILE |
1110 | get_highest_magefile() |
1111 | { |
1112 | local HIGHEST_MAGEFILE |
1113 | local PCAT="$1" |
1114 | local PNAME="$2" |
1115 | local magefile |
1116 | |
1117 | for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*) |
1118 | do |
1119 | # we exclude subdirs (for stuff like a md5sum dir) |
1120 | [ -d ${magefile} ] && continue |
1121 | if check_stable_package ${magefile} |
1122 | then |
1123 | HIGHEST_MAGEFILE=${magefile} |
1124 | #for debug only |
1125 | [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}" |
1126 | fi |
1127 | done |
1128 | |
1129 | # stop here if HIGHEST_MAGEFILE is zero |
1130 | # this package must be unstable or old |
1131 | if [ -z "${HIGHEST_MAGEFILE}" ] |
1132 | then |
1133 | echo |
1134 | echo -n "All packages named " |
1135 | echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT} |
1136 | echo -n " are marked " |
1137 | echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT} |
1138 | echo "." |
1139 | echo "You need to declare USE_UNSTABLE=true to install this." |
1140 | echo |
1141 | echo "Example:" |
1142 | echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}" |
1143 | echo |
1144 | echo "Be warned that these packages are not stable and may cause serious problems." |
1145 | echo "You should know what you are doing, so don't complain about any damage." |
1146 | echo |
1147 | return 1 |
1148 | fi |
1149 | |
1150 | echo "${HIGHEST_MAGEFILE}" |
1151 | return 0 |
1152 | } |
1153 | |
1154 | |
1155 | ################################################### |
1156 | # function is_config_protected # |
1157 | # is_config_protected /path/to/file # |
1158 | # # |
1159 | # returns: # |
1160 | # 0 - not protected # |
1161 | # 1 - error # |
1162 | # 2 - protected # |
1163 | # 3 - protected but masked # |
1164 | # # |
1165 | ################################################### |
1166 | is_config_protected() |
1167 | { |
1168 | local EXPFILE |
1169 | local TEST |
1170 | local PROTECTED |
1171 | local IFS |
1172 | |
1173 | EXPFILE=$1 |
1174 | |
1175 | # to be safe; it may be '§' |
1176 | IFS=' ' |
1177 | |
1178 | # check ob in config protect |
1179 | for i in ${CONFIG_PROTECT} |
1180 | do |
1181 | # ersetzen von $i nur wenn am anfang der variable |
1182 | TEST="${EXPFILE/#${i}/Protected}" |
1183 | if [ "${TEST}" != "${EXPFILE}" ] |
1184 | then |
1185 | # setzen das es protected ist |
1186 | PROTECTED=TRUE |
1187 | |
1188 | # check ob nicht doch maskiert |
1189 | for x in ${CONFIG_PROTECT_MASK} |
1190 | do |
1191 | TEST="${EXPFILE/#${x}/Protect_Masked}" |
1192 | if [ "${TEST}" != "${EXPFILE}" ] |
1193 | then |
1194 | PROTECTED=MASKED |
1195 | fi |
1196 | done |
1197 | fi |
1198 | done |
1199 | |
1200 | unset IFS |
1201 | |
1202 | case ${PROTECTED} in |
1203 | TRUE) |
1204 | #echo "I'm protected" |
1205 | return 2 |
1206 | ;; |
1207 | MASKED) |
1208 | #echo "I'm protected, but masked - delete me" |
1209 | return 3 |
1210 | ;; |
1211 | *) |
1212 | #echo "delete me" |
1213 | return 0 |
1214 | ;; |
1215 | esac |
1216 | } |
1217 | |
1218 | |
1219 | ################################################### |
1220 | # function count_protected_files # |
1221 | # count_protected_files /path/to/file # |
1222 | # # |
1223 | # note: prints number of protected files # |
1224 | # exp: 0012 # |
1225 | ################################################### |
1226 | count_protected_files() |
1227 | { |
1228 | ${MLIBDIR}/writeprotected "$1" |
1229 | } |
1230 | |
1231 | |
1232 | #call with 'get_magefile_to_uninstall SEARCHSTRING' |
1233 | #returns /path/to/magefile |
1234 | get_magefile_to_uninstall() |
1235 | { |
1236 | local RESULT |
1237 | local SSTRING |
1238 | local i |
1239 | local x |
1240 | local z |
1241 | |
1242 | SSTRING=$1 |
1243 | |
1244 | for i in ${INSTALLDB}/*/* |
1245 | do |
1246 | #echo ${i} |
1247 | #to be sure |
1248 | if [ -d ${i} ] |
1249 | then |
1250 | #echo "DEBUG: stripped i: $(basename ${i%-*-*})" |
1251 | if [ $(basename ${i%-*-*}) == ${SSTRING} ] |
1252 | then |
1253 | #RESULT="${RESULT} ${i}" |
1254 | CATEGORIE=$(< ${i}/.categorie) |
1255 | #echo ${CATEGORIE}/$(basename ${RESULT}) |
1256 | RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})" |
1257 | fi |
1258 | fi |
1259 | done |
1260 | |
1261 | if [ -n "${RESULT}" ] |
1262 | then |
1263 | #check if ONE package was found and not more |
1264 | declare -i x=0 |
1265 | for i in ${RESULT} |
1266 | do |
1267 | x=${x}+1 |
1268 | done |
1269 | if [ ${x} -eq 1 ] |
1270 | then |
1271 | #echo "jo ich uninstall $(basename ${RESULT}) ..." |
1272 | #the mage file |
1273 | #echo "${RESULT}/$(basename ${RESULT}).mage" |
1274 | |
1275 | #gets categorie of the package |
1276 | #CATEGORIE=$(< ${i}/.categorie) |
1277 | #echo ${CATEGORIE}/$(basename ${RESULT}) |
1278 | echo "${RESULT}" |
1279 | return 0 |
1280 | else |
1281 | #echo "More than one package found ..." |
1282 | echo "${RESULT}" |
1283 | return 2 |
1284 | fi |
1285 | else |
1286 | #echo "No package found named '${SSTRING}'." |
1287 | echo "${SSTRING}" |
1288 | return 1 |
1289 | fi |
1290 | } |
1291 | |
1292 | |
1293 | # reads virtualdb file |
1294 | #$1 = virtualname; $2 commands: showpkgs, showline |
1295 | #return 0 == installed -> shows installed pkg as well |
1296 | #return 1 == not installed |
1297 | virtuals_read() |
1298 | { |
1299 | local VIRTUAL_NAME COMMAND VIRT_LINE line x i |
1300 | |
1301 | VIRTUAL_NAME=$1 |
1302 | COMMAND=$2 |
1303 | |
1304 | # parse file to get virtual_name line |
1305 | IFS=$'\n' |
1306 | for line in $(< ${VIRTUALDB_FILE}) |
1307 | do |
1308 | IFS=$' ' |
1309 | for x in ${line} |
1310 | do |
1311 | if [ "${x}" == "${VIRTUAL_NAME}" ] |
1312 | then |
1313 | VIRT_LINE="${line}" |
1314 | |
1315 | if [ "${COMMAND}" == "showline" ] |
1316 | then |
1317 | #give out the non stripped line |
1318 | echo "${line}" |
1319 | fi |
1320 | fi |
1321 | done |
1322 | |
1323 | IFS=$'\n' |
1324 | done |
1325 | |
1326 | unset IFS |
1327 | |
1328 | #now read the packages linked to VIRTUAL_NAME and output them |
1329 | if [ -n "${VIRT_LINE}" ] |
1330 | then |
1331 | if [ "${COMMAND}" == "showpkgs" ] |
1332 | then |
1333 | declare -i x=0 |
1334 | for i in ${VIRT_LINE} |
1335 | do |
1336 | if [ ${x} -ge 1 ] |
1337 | then |
1338 | echo "${i}" |
1339 | fi |
1340 | ((x++)) |
1341 | done |
1342 | fi |
1343 | return 0 |
1344 | fi |
1345 | return 1 |
1346 | } |
1347 | |
1348 | |
1349 | #add pkg to virtualdb |
1350 | # $1 == virtualname $2= pkgname |
1351 | # retvals: 0=ok,added; 1=error; 3=pkg already in virtual |
1352 | virtuals_add() |
1353 | { |
1354 | local VIRTUAL_NAME PKG_NAME OLD_LINE line i |
1355 | |
1356 | VIRTUAL_NAME=$1 |
1357 | PKG_NAME=$2 |
1358 | |
1359 | |
1360 | if virtuals_read ${VIRTUAL_NAME} |
1361 | then |
1362 | #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already |
1363 | for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs) |
1364 | do |
1365 | if [ "${i}" == ${PKG_NAME} ] |
1366 | then |
1367 | echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..." |
1368 | return 3 |
1369 | fi |
1370 | done |
1371 | |
1372 | echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..." |
1373 | OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)" |
1374 | |
1375 | #make a backup |
1376 | mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old |
1377 | |
1378 | IFS=$'\n' |
1379 | for line in $(< ${VIRTUALDB_FILE}.old) |
1380 | do |
1381 | #if the right line, append ${PKG_NAME}, else do nothing |
1382 | if [ "${line}" == "${OLD_LINE}" ] |
1383 | then |
1384 | echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE} |
1385 | else |
1386 | echo "${line}" >> ${VIRTUALDB_FILE} |
1387 | fi |
1388 | done |
1389 | |
1390 | unset IFS |
1391 | else |
1392 | echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..." |
1393 | echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \ |
1394 | && echo "ok" || echo "false" |
1395 | fi |
1396 | |
1397 | return 0 |
1398 | } |
1399 | |
1400 | #deletes pakages from virtual database |
1401 | #$1 virtualname; $2 pkgname |
1402 | virtuals_del() { |
1403 | |
1404 | local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED |
1405 | |
1406 | VIRTUAL_NAME=$1 |
1407 | PKG_NAME=$2 |
1408 | |
1409 | #first check if exists |
1410 | if virtuals_read ${VIRTUAL_NAME} |
1411 | then |
1412 | #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME} |
1413 | declare -i x=0 |
1414 | for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs) |
1415 | do |
1416 | if [ "${i}" == "${PKG_NAME}" ] |
1417 | then |
1418 | PKG_INSTALLED=true |
1419 | fi |
1420 | ((x++)) |
1421 | done |
1422 | |
1423 | #abort if not installed |
1424 | if [ "${PKG_INSTALLED}" != "true" ] |
1425 | then |
1426 | echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}." |
1427 | return 0 |
1428 | fi |
1429 | |
1430 | if [ ${x} -ge 2 ] |
1431 | then |
1432 | METHOD=update |
1433 | else |
1434 | METHOD=delall |
1435 | fi |
1436 | |
1437 | #get the complete line |
1438 | OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)" |
1439 | |
1440 | #make a backup |
1441 | mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old |
1442 | |
1443 | #parse virtualdb |
1444 | IFS=$'\n' |
1445 | for line in $(< ${VIRTUALDB_FILE}.old) |
1446 | do |
1447 | if [ "${line}" == "${OLD_LINE}" ] |
1448 | then |
1449 | #delall or update? |
1450 | case ${METHOD} in |
1451 | update) |
1452 | echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..." |
1453 | #del PKG_NAME from line |
1454 | echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE} |
1455 | ;; |
1456 | delall) |
1457 | echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..." |
1458 | #continue; do not write anything |
1459 | continue |
1460 | ;; |
1461 | esac |
1462 | else |
1463 | echo "${line}" >> ${VIRTUALDB_FILE} |
1464 | fi |
1465 | done |
1466 | unset IFS |
1467 | else |
1468 | echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database." |
1469 | fi |
1470 | } |
1471 | |
1472 | # gets real pkgname from virtuals.default |
1473 | #$1=VIRTUAL_NAME; returns PKG_NAME |
1474 | default_virtualname_to_pkgname() |
1475 | { |
1476 | local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname |
1477 | |
1478 | VIRTUAL_NAME=$1 |
1479 | |
1480 | while read db_virtualname db_pkgname |
1481 | do |
1482 | if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ] |
1483 | then |
1484 | PKG_NAME="${db_pkgname}" |
1485 | fi |
1486 | done << EOF |
1487 | $(< ${VIRTUALDB_DEFAULTS}) |
1488 | EOF |
1489 | |
1490 | if [ -n "${PKG_NAME}" ] |
1491 | then |
1492 | echo "${PKG_NAME}" |
1493 | fi |
1494 | } |
1495 | |
1496 | minclude() |
1497 | { |
1498 | local i |
1499 | |
1500 | if [ -n "$@" ] |
1501 | then |
1502 | for i in $@ |
1503 | do |
1504 | [[ ${MAGEDEBUG} = on ]] && \ |
1505 | echo "--- Including ${MAGEDIR}/include/${i}.minc" |
1506 | source ${MAGEDIR}/include/${i}.minc |
1507 | done |
1508 | [[ ${MAGEDEBUG} = on ]] && echo |
1509 | fi |
1510 | } |
1511 | |
1512 | sminclude() |
1513 | { |
1514 | local i |
1515 | |
1516 | if [ -n "$@" ] |
1517 | then |
1518 | for i in $@ |
1519 | do |
1520 | echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc" |
1521 | source ${SMAGESCRIPTSDIR}/include/${i}.sminc |
1522 | done |
1523 | echo |
1524 | fi |
1525 | } |
1526 | |
1527 | # checks if an newer mage version is available |
1528 | is_newer_mage_version_available() |
1529 | { |
1530 | local newest_mage |
1531 | local installed_mage |
1532 | |
1533 | newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )" |
1534 | installed_mage="$(magequery -n mage | cut -d' ' -f5)" |
1535 | |
1536 | if [[ ${newest_mage} > ${installed_mage} ]] |
1537 | then |
1538 | echo |
1539 | echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT} |
1540 | echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT} |
1541 | echo "It is recommened to install this newer version" |
1542 | echo "or your current system installation may brake." |
1543 | echo |
1544 | echo -en "Please update mage by running " |
1545 | echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT} |
1546 | echo |
1547 | fi |
1548 | } |
1549 | |
1550 | |
1551 | # returns pname from pkgname |
1552 | # pkgname2pname $PKGNAME |
1553 | pkgname2pname() |
1554 | { |
1555 | local pname |
1556 | |
1557 | pname="${1%-*-*-*}" |
1558 | echo "${pname}" |
1559 | } |
1560 | |
1561 | # returns pver from pkgname |
1562 | # pkgname2pver $PKGNAME |
1563 | pkgname2pver() |
1564 | { |
1565 | local i pver |
1566 | |
1567 | i="${1/$(pkgname2pname $1)-/}" |
1568 | pver="${i%-*-*}" |
1569 | echo "${pver}" |
1570 | } |
1571 | |
1572 | # returns pbuild from pkgname |
1573 | # pkgname2pbuild $PKGNAME |
1574 | pkgname2pbuild() |
1575 | { |
1576 | local pbuild |
1577 | |
1578 | pbuild="${1##*-}" |
1579 | echo "${pbuild}" |
1580 | } |
1581 | |
1582 | # returns parch from pkgname |
1583 | # pkgname2parch $PKGNAME |
1584 | pkgname2parch() |
1585 | { |
1586 | local i x parch |
1587 | |
1588 | i="${1%-*-*}-" |
1589 | x="${1%-*}" |
1590 | parch="${x/${i}/}" |
1591 | echo "${parch}" |
1592 | } |
1593 | |
1594 | # returns pname from magename |
1595 | # magename2pname /PATH/TO/MAGE/FILE |
1596 | magename2pname() |
1597 | { |
1598 | local i pname |
1599 | |
1600 | i="$(basename $1 .mage)" |
1601 | pname="${i%-*-*}" |
1602 | echo "${pname}" |
1603 | } |
1604 | |
1605 | # returns pver from magename |
1606 | # magename2pver /PATH/TO/MAGE/FILE |
1607 | magename2pver() |
1608 | { |
1609 | local i pver |
1610 | |
1611 | i="$(basename $1 .mage)" |
1612 | i="${i/$(magename2pname $1)-/}" |
1613 | pver="${i%-*}" |
1614 | echo "${pver}" |
1615 | } |
1616 | |
1617 | # returns pbuild from magename |
1618 | # magename2pbuild /PATH/TO/MAGE/FILE |
1619 | magename2pbuild() |
1620 | { |
1621 | local i pbuild |
1622 | |
1623 | i="$(basename $1 .mage)" |
1624 | pbuild="${i##*-}" |
1625 | echo "${pbuild}" |
1626 | } |
1627 | |
1628 | # returns pcat from magename |
1629 | # magename2pcat /PATH/TO/MAGE/FILE |
1630 | magename2pcat() |
1631 | { |
1632 | local i pcat |
1633 | |
1634 | # go 2 dirs back |
1635 | i="${1%/*/*}" |
1636 | # get basename |
1637 | pcat="${i##*/}" |
1638 | echo "${pcat}" |
1639 | } |
1640 | |
1641 | # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION) |
1642 | # dep2pcat DEPEND |
1643 | dep2pcat() |
1644 | { |
1645 | local pcat |
1646 | |
1647 | pcat="${1%/*}" |
1648 | echo "${pcat}" |
1649 | } |
1650 | |
1651 | # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION) |
1652 | # $2=virtual is used to resolv VDEPEND from virtual packages |
1653 | # dep2pcat DEPEND (virtual) |
1654 | dep2pname() |
1655 | { |
1656 | local pname |
1657 | |
1658 | pname="${1##*/}" |
1659 | |
1660 | # cut version only if not virtual or it will cut the name |
1661 | if [[ $(dep2pcat $1) != virtual ]] && \ |
1662 | [[ $2 != virtual ]] |
1663 | then |
1664 | pname="${pname%-*}" |
1665 | fi |
1666 | |
1667 | echo "${pname}" |
1668 | } |
1669 | |
1670 | dep2highest_magefile() |
1671 | { |
1672 | local pcat |
1673 | local pname |
1674 | local magefile |
1675 | local installed_virtuals |
1676 | |
1677 | pcat="$(dep2pcat $1)" |
1678 | pname="$(dep2pname $1)" |
1679 | |
1680 | if [[ ${pcat} = virtual ]] |
1681 | then |
1682 | # first check if virtual is already installed |
1683 | installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)" |
1684 | if [ -n "${installed_virtuals}" ] |
1685 | then |
1686 | for vpkg in ${installed_virtuals} |
1687 | do |
1688 | realpkgname="${vpkg}" |
1689 | virtualpkgname="${pcat}/${pname}" |
1690 | pcat="$(dep2pcat ${realpkgname})" |
1691 | pname="$(dep2pname ${realpkgname} virtual)" |
1692 | done |
1693 | else |
1694 | # choose one from virtualdb defaults (virtuals.defaults) |
1695 | realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})" |
1696 | virtualpkgname="${pcat}/${pname}" |
1697 | pcat="$(dep2pcat ${realpkgname})" |
1698 | pname="$(dep2pname ${realpkgname} virtual)" |
1699 | fi |
1700 | fi |
1701 | |
1702 | magefile="$(get_highest_magefile ${pcat} ${pname})" |
1703 | echo "${magefile}" |
1704 | } |
1705 | |
1706 | # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD} |
1707 | is_installed() |
1708 | { |
1709 | local fullpkgname="$1" |
1710 | |
1711 | # return 0 if installed |
1712 | [ -d ${INSTALLDB}/${fullpkgname} ] && return 0 |
1713 | |
1714 | return 1 |
1715 | } |
1716 | |
1717 | install_packages() |
1718 | { |
1719 | local list="$@" |
1720 | local pkg |
1721 | local pcat |
1722 | local pname |
1723 | local pver |
1724 | local pbuild |
1725 | local total_pkgs |
1726 | local current_pkg |
1727 | |
1728 | # get count of total packages |
1729 | declare -i total_pkgs=0 |
1730 | declare -i current_pkg=0 |
1731 | for i in ${list}; do (( total_pkgs++ )); done |
1732 | |
1733 | for pkg in ${list} |
1734 | do |
1735 | (( current_pkg++ )) |
1736 | pcat=$(magename2pcat ${pkg}) |
1737 | pname=$(magename2pname ${pkg}) |
1738 | pver=$(magename2pver ${pkg}) |
1739 | pbuild=$(magename2pbuild ${pkg}) |
1740 | |
1741 | mage_install \ |
1742 | --pcat ${pcat} \ |
1743 | --pname ${pname} \ |
1744 | --pver ${pver} \ |
1745 | --pbuild ${pbuild} \ |
1746 | --count-total ${total_pkgs} \ |
1747 | --count-current ${current_pkg} |
1748 | done |
1749 | } |
1750 | |
1751 | # get_value_from_magefile VARIABLE |
1752 | # returns the content of this VAR |
1753 | get_value_from_magefile() |
1754 | { |
1755 | local var="$1" |
1756 | local magefile="$2" |
1757 | local value |
1758 | |
1759 | # local all possible vars of a mage file |
1760 | # to prevent bad issues |
1761 | local PKGNAME |
1762 | local STATE |
1763 | local DESCRIPTION |
1764 | local HOMEPAGE |
1765 | local DEPEND |
1766 | local SDEPEND |
1767 | local PROVIDE |
1768 | local PKGTYPE |
1769 | local preinstall |
1770 | local postinstall |
1771 | |
1772 | # sanity checks |
1773 | [ -f ${magefile} ] && source ${magefile} || \ |
1774 | die "get_value_from_magefile: ${magefile} not found." |
1775 | [ -z "${var}" ] && die "get_value_from_magefile: \$var not given." |
1776 | |
1777 | source ${magefile} |
1778 | eval value=\$$(echo ${var}) |
1779 | echo "${value}" |
1780 | } |
1781 | |
1782 | mage_install() |
1783 | { |
1784 | # local all possible vars of a mage file |
1785 | # to prevent bad issues |
1786 | local PKGNAME |
1787 | local STATE |
1788 | local DESCRIPTION |
1789 | local HOMEPAGE |
1790 | local DEPEND |
1791 | local SDEPEND |
1792 | local PROVIDE |
1793 | local PKGTYPE |
1794 | local preinstall |
1795 | local postinstall |
1796 | |
1797 | local pcat |
1798 | local pname |
1799 | local pver |
1800 | local pbuild |
1801 | local count_total |
1802 | local count_current |
1803 | local magefile |
1804 | |
1805 | # very basic getops |
1806 | for i in $* |
1807 | do |
1808 | case $1 in |
1809 | --pcat|-c) shift; pcat="$1" ;; |
1810 | --pname|-n) shift; pname="$1" ;; |
1811 | --pver|-v) shift; pver="$1" ;; |
1812 | --pbuild|-b) shift; pbuild="$1" ;; |
1813 | --count-total) shift; count_total="$1" ;; |
1814 | --count-current) shift; count_current="$1" ;; |
1815 | --src-install|-s) shift ;; |
1816 | --help|-h) usage ;; |
1817 | esac |
1818 | shift |
1819 | done |
1820 | |
1821 | # sanity checks; abort if not given |
1822 | [ -z "${pcat}" ] && die "mage_install() \$pcat not given." |
1823 | [ -z "${pname}" ] && die "mage_install() \$pname not given." |
1824 | [ -z "${pver}" ] && die "mage_install() \$pver not given." |
1825 | [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given." |
1826 | |
1827 | # check needed global vars |
1828 | [ -z "${MAGEDIR}" ] && die "\$MAGEDIR not set." |
1829 | [ -z "${INSTALLDB}" ] && die "\$INSTALLDB not set." |
1830 | [ -z "${BUILDDIR}" ] && die "\$BUILDDIR not set." |
1831 | |
1832 | xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]" |
1833 | echo -ne "${COLBLUE} >>> ${COLDEFAULT}" |
1834 | echo -n "installing (${count_current}/${count_total}): " |
1835 | echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" |
1836 | echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}" |
1837 | |
1838 | magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage" |
1839 | source ${magefile} |
1840 | |
1841 | # if [ "${PKGTYPE}" == "virtual" ] |
1842 | # then |
1843 | # mage_install_virtual |
1844 | # return 0 |
1845 | # fi |
1846 | # |
1847 | # if [ "${PKGTYPE}" == "sources" ] |
1848 | # then |
1849 | # mage_install_sources |
1850 | # return 0 |
1851 | # fi |
1852 | |
1853 | # if [ ! -e ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} ] |
1854 | # then |
1855 | # echo -en "\nPrefetching needed Packages for " |
1856 | # echo -e "${COLGREEN}${PKGNAME/-${ARCH}/}${COLDEFAULT}...\n" |
1857 | # getpackages |
1858 | # fi |
1859 | # |
1860 | # echo -e "\nInstallation of Package: ${COLGREEN}${PKGNAME/-${ARCH}/}${COLDEFAULT}\n" |
1861 | # #( build_unpackpkg ) | echo -e "Unpacking Package ...\n" |
1862 | # |
1863 | # echo -en "Unpacking Package ..." |
1864 | # build_unpackpkg |
1865 | # echo "done" |
1866 | |
1867 | # ## preinstall scripte |
1868 | # export -f preinstall 2> /dev/null |
1869 | # if [ "$?" == "0" ] |
1870 | # then |
1871 | # echo -e "\nRunning Preinstall ... \n" |
1872 | # preinstall |
1873 | # unset preinstall |
1874 | # fi |
1875 | |
1876 | |
1877 | ## preinstall scripte |
1878 | if [ -n "$(typeset -f preinstall)" ] |
1879 | then |
1880 | echo -e " ${COLBLUE}---${COLDEFAULT} running preinstall ... " |
1881 | # preinstall |
1882 | unset preinstall |
1883 | fi |
1884 | |
1885 | # |
1886 | # # install of package |
1887 | # if [ "$VERBOSE" == "off" ] |
1888 | # then |
1889 | # echo -en "Processing ... " |
1890 | build_doinstall ${PKGNAME} |
1891 | # echo "done" |
1892 | # fi |
1893 | # |
1894 | # if [ "$VERBOSE" == "on" ] |
1895 | # then |
1896 | # # build_doinstall |
1897 | # build_doinstall ${PKGNAME} |
1898 | # fi |
1899 | # |
1900 | # # postinstall scripte |
1901 | # export -f postinstall 2> /dev/null |
1902 | # if [ "$?" == "0" ] |
1903 | # then |
1904 | # echo -e "\nRunning Postinstall ... \n" |
1905 | # postinstall |
1906 | # unset postinstall |
1907 | # fi |
1908 | |
1909 | ## postinstall scripte |
1910 | if [ -n "$(typeset -f postinstall)" ] |
1911 | then |
1912 | echo -e " ${COLBLUE}---${COLDEFAULT} running postinstall ... " |
1913 | # postinstall |
1914 | unset postinstall |
1915 | fi |
1916 | |
1917 | |
1918 | # # install database entry |
1919 | # install_database_entry ${PKGNAME} |
1920 | # |
1921 | # # cleanup |
1922 | # if [ -d ${BUILDDIR}/${PKGNAME} ] |
1923 | # then |
1924 | # rm -rf ${BUILDDIR}/${PKGNAME} |
1925 | # fi |
1926 | # |
1927 | # # check for virtuals and PROVIDE |
1928 | # # if so install it to virtualdb |
1929 | # register_virtual_pkg |
1930 | # |
1931 | # # update mtimes of packages and db_entries |
1932 | # update_mtime |
1933 | # |
1934 | # # rebuilds toplevel info node |
1935 | # echo -en "\n>>>> Rebuilding top-level info node ... " |
1936 | # ${MLIBDIR}/mkinfodir /usr/share/info > /usr/share/info/dir \ |
1937 | # && echo "done" || echo "false" |
1938 | # |
1939 | # # rebuilds the enviroment with the content of /etc/env.d |
1940 | # ${MLIBDIR}/env-rebuild.sh |
1941 | # |
1942 | xtitleclean |
1943 | # echo -e "\nPackage '${PKGNAME/-${ARCH}/}' sucessfully installed.\n" |
1944 | |
1945 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
1946 | echo -n "Package " |
1947 | echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" |
1948 | echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} " |
1949 | echo "successfully installed." |
1950 | } |
1951 | |
1952 | md5sum_packages() |
1953 | { |
1954 | local list="$@" |
1955 | local magefile |
1956 | local pcat |
1957 | local pname |
1958 | local pver |
1959 | local pbuild |
1960 | local pkgname |
1961 | |
1962 | for magefile in ${list} |
1963 | do |
1964 | pcat=$(magename2pcat ${magefile}) |
1965 | pname=$(magename2pname ${magefile}) |
1966 | pver=$(magename2pver ${magefile}) |
1967 | pbuild=$(magename2pbuild ${magefile}) |
1968 | md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pname}-${pver}-${pbuild}.md5" |
1969 | pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}" |
1970 | |
1971 | if [ -f "${md5file}" ] |
1972 | then |
1973 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
1974 | echo -ne "checking md5 sum:" |
1975 | echo -n "${pkgfile} " |
1976 | ( cd ${PKGDIR}; md5sum --check ${md5file} ) || die "md5 for ${pkgfile} failed" |
1977 | echo "ok" |
1978 | else |
1979 | echo -ne "${COLBLUE} --- ${COLDEFAULT}" |
1980 | echo -e "!! no md5 sum file found for ${pkgfile} :(" |
1981 | fi |
1982 | done |
1983 | } |