Contents of /trunk/mage/usr/lib/mage/mage3.functions.sh
Parent Directory | Revision Log
Revision 40 -
(show annotations)
(download)
(as text)
Thu Jan 6 23:28:28 2005 UTC (19 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 29699 byte(s)
Thu Jan 6 23:28:28 2005 UTC (19 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 29699 byte(s)
updated revision tags
1 | #!/bin/bash |
2 | # Magellan Linux Installer Functions (mage.functions.sh) |
3 | # version: 0.3.6-r10 |
4 | |
5 | mage_setup() { |
6 | install -d $INSTALLDB |
7 | } |
8 | |
9 | fatal_error() { |
10 | #$1 is the missing file |
11 | echo -e "\nFatal Error: Package seemed to be corrupt." |
12 | echo -e "$1 was not found in ${PKGNAME}" |
13 | exit 1 |
14 | } |
15 | |
16 | build_unpackpkg() { |
17 | tar xjmf ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} -C ${BUILDDIR} |
18 | } |
19 | |
20 | update_mtime() { |
21 | local M_MTIME |
22 | DB_ENTRY=${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
23 | |
24 | #forcing mtime to same value |
25 | echo |
26 | echo -n ">>>> Forcing mtime to the same value ..." |
27 | #find ${BUILDDIR}/${PKGNAME}/binfiles \ |
28 | # -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \ |
29 | # && echo done || echo false |
30 | |
31 | |
32 | #get new M_MTIME from .mtime |
33 | M_MTIME=$(stat -c %Y ${DB_ENTRY}/.mtime) |
34 | |
35 | #updating .files db entries; only if not empty, or they get killed |
36 | if [ -e "${DB_ENTRY}/.files" ] |
37 | then |
38 | if [ -n "$(cat ${DB_ENTRY}/.files)" ] |
39 | then |
40 | #make backup |
41 | mv ${DB_ENTRY}/.files \ |
42 | ${DB_ENTRY}/.files-old |
43 | |
44 | #sets fieldseperator to "§" instead of " " |
45 | IFS=§ |
46 | |
47 | #update |
48 | while read pathto posix user group mtime md5sum |
49 | do |
50 | echo "${pathto}§${posix}§${user}§${group}§${M_MTIME}§${md5sum}" \ |
51 | >> ${DB_ENTRY}/.files |
52 | touch -m -r ${DB_ENTRY}/.mtime ${pathto} |
53 | done < ${DB_ENTRY}/.files-old |
54 | |
55 | #remove old list |
56 | rm -f ${DB_ENTRY}/.files-old |
57 | |
58 | #very important: unsetting the '§' fieldseperator |
59 | unset IFS |
60 | fi |
61 | else |
62 | fatal_error .files |
63 | fi |
64 | |
65 | |
66 | #updating .symlink db entries; only if not empty, or they get killed |
67 | if [ -e "${DB_ENTRY}/.symlinks" ] |
68 | then |
69 | if [ -n "$(cat ${DB_ENTRY}/.symlinks)" ] |
70 | then |
71 | #make backup |
72 | mv ${DB_ENTRY}/.symlinks \ |
73 | ${DB_ENTRY}/.symlinks-old |
74 | |
75 | #sets fieldseperator to "§" instead of " " |
76 | IFS=§ |
77 | |
78 | #update |
79 | while read pathto posix link mtime |
80 | do |
81 | echo "${pathto}§${posix}§${link}§${M_MTIME}" \ |
82 | >> ${DB_ENTRY}/.symlinks |
83 | touch -m -r ${DB_ENTRY}/.mtime ${pathto} |
84 | done < ${DB_ENTRY}/.symlinks-old |
85 | |
86 | #remove old list |
87 | rm -f ${DB_ENTRY}/.symlinks-old |
88 | |
89 | #very important: unsetting the '§' fieldseperator |
90 | unset IFS |
91 | fi |
92 | else |
93 | fatal_error .symlinks |
94 | fi |
95 | } |
96 | |
97 | ################################################### |
98 | # function install_direcories # |
99 | # install_direcories $PKGNAME # |
100 | ################################################### |
101 | install_directories() { |
102 | local PKGNAME |
103 | PKGNAME=$1 |
104 | |
105 | if [ -e ${BUILDDIR}/${PKGNAME}/.dirs ] |
106 | then |
107 | |
108 | #sets fieldseperator to "§" instead of " " |
109 | IFS=§ |
110 | |
111 | while read pathto posix user group |
112 | do |
113 | if [ ! -z "$pathto" ] |
114 | then |
115 | if [ "$VERBOSE" == "on" ] |
116 | then |
117 | echo -e "\t>>> DIR: $pathto" |
118 | fi |
119 | install -m $posix -o $user -g $group -d "$pathto" |
120 | fi |
121 | done < ${BUILDDIR}/${PKGNAME}/.dirs |
122 | |
123 | #very important: unsetting the '§' fieldseperator |
124 | unset IFS |
125 | else |
126 | fatal_error .dir |
127 | fi |
128 | } |
129 | |
130 | |
131 | ################################################### |
132 | # function install_files # |
133 | # install_files $PKGNAME # |
134 | ################################################### |
135 | install_files(){ |
136 | local PKGNAME |
137 | local RETVAL |
138 | local COUNTER |
139 | local FILENAME |
140 | local DESTINATION |
141 | |
142 | PKGNAME=$1 |
143 | |
144 | if [ -e ${BUILDDIR}/${PKGNAME}/.files ] |
145 | then |
146 | #sets fieldseperator to "§" instead of " " |
147 | IFS=§ |
148 | |
149 | while read pathto posix user group mtime md5sum |
150 | do |
151 | if [ ! -z "${pathto}" ] |
152 | then |
153 | if [ "${VERBOSE}" == "on" ] |
154 | then |
155 | echo -e "\t>>> FILE: ${pathto}" |
156 | fi |
157 | ### kleiner notfall fix ### |
158 | if [ ! -d "$(dirname "${pathto}")" ] |
159 | then |
160 | install -d "$(dirname "${pathto}")" |
161 | fi |
162 | |
163 | #when file exists, check if protected |
164 | if [ -e "${pathto}" ] |
165 | then |
166 | is_config_protected "${pathto}" |
167 | RETVAL=$? |
168 | |
169 | # 0 - not protected # |
170 | # 1 - error # |
171 | # 2 - protected # |
172 | # 3 - protected but masked # |
173 | |
174 | case ${RETVAL} in |
175 | #file is not protected - overwrite it |
176 | 0|3) |
177 | FILE="$pathto" |
178 | install -m ${posix} -o ${user} -g ${group} \ |
179 | ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \ |
180 | "$pathto" |
181 | ;; |
182 | |
183 | #file is protected - write backup file |
184 | # "._cfg${COUNTER}_{FILENAME} |
185 | 2) |
186 | #moves the cursor up |
187 | echo -en \\033[A |
188 | echo -e "${COLRED}! prot ${COLDEFAULT} === FILE: $pathto" |
189 | FILENAME="$(basename "${pathto}")" |
190 | FILE="$pathto" |
191 | COUNTER=$(count_protected_files "${FILE}") |
192 | DESTINATION="$(dirname "$pathto")/._cfg${COUNTER}_${FILENAME}" |
193 | install -m ${posix} -o ${user} -g ${group} \ |
194 | ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \ |
195 | "${DESTINATION}" |
196 | |
197 | #set run_etc_update=true |
198 | PROTECT_COUNT=${PROTECT_COUNT}+1 |
199 | ;; |
200 | esac |
201 | else |
202 | #install file because it does not exists |
203 | FILE="$pathto" |
204 | install -m ${posix} -o ${user} -g ${group} \ |
205 | ${BUILDDIR}/${PKGNAME}/binfiles/$FILE \ |
206 | "$pathto" |
207 | fi |
208 | |
209 | #not needed anymore ? |
210 | #if [ ! -z $user ] |
211 | #then |
212 | # chown $user:$group $FILE ### <---- test |
213 | #fi |
214 | fi |
215 | done < ${BUILDDIR}/${PKGNAME}/.files |
216 | |
217 | #very important: unsetting the '§' fieldseperator |
218 | unset IFS |
219 | else |
220 | fatal_error .files |
221 | fi |
222 | } |
223 | |
224 | |
225 | ################################################### |
226 | # function install_symlinks # |
227 | # install_symlinks $PKGNAME # |
228 | ################################################### |
229 | install_symlinks() { |
230 | local PKGNAME |
231 | PKGNAME=$1 |
232 | |
233 | if [ -e ${BUILDDIR}/${PKGNAME}/.symlinks ] |
234 | then |
235 | #sets fieldseperator to "§" instead of " " |
236 | IFS=§ |
237 | |
238 | while read pathto posix link mtime |
239 | do |
240 | if [ ! -z "$pathto" ] |
241 | then |
242 | if [ "$VERBOSE" == "on" ] |
243 | then |
244 | echo -e "\t>>> LINK: $pathto" |
245 | fi |
246 | ln -snf $link "$pathto" |
247 | fi |
248 | done < ${BUILDDIR}/${PKGNAME}/.symlinks |
249 | |
250 | #very important: unsetting the '§' fieldseperator |
251 | unset IFS |
252 | else |
253 | fatal_error .symlinks |
254 | fi |
255 | } |
256 | |
257 | |
258 | ################################################### |
259 | # function install_blockdevices # |
260 | # install_blockdevices $PKGNAME # |
261 | ################################################### |
262 | install_blockdevices() { |
263 | local PKGNAME |
264 | PKGNAME=$1 |
265 | |
266 | if [ -e ${BUILDDIR}/${PKGNAME}/.pipes ] |
267 | then |
268 | #sets fieldseperator to "§" instead of " " |
269 | IFS=§ |
270 | |
271 | while read pathto posix |
272 | do |
273 | if [ ! -z "$pathto" ] |
274 | then |
275 | if [ "$VERBOSE" == "on" ] |
276 | then |
277 | echo -e "\t>>> PIPE: $pathto" |
278 | fi |
279 | mkfifo -m $posix "$pathto" |
280 | fi |
281 | done < ${BUILDDIR}/${PKGNAME}/.pipes |
282 | |
283 | #very important: unsetting the '§' fieldseperator |
284 | unset IFS |
285 | else |
286 | fatal_error .pipes |
287 | fi |
288 | } |
289 | |
290 | |
291 | ################################################### |
292 | # function install_characterdevices # |
293 | # install_characterdevices $PKGNAME # |
294 | ################################################### |
295 | install_characterdevices() { |
296 | local PKGNAME |
297 | PKGNAME=$1 |
298 | |
299 | if [ -e ${BUILDDIR}/${PKGNAME}/.char ] |
300 | then |
301 | #sets fieldseperator to "§" instead of " " |
302 | IFS=§ |
303 | |
304 | while read pathto posix |
305 | do |
306 | if [ ! -z "$pathto" ] |
307 | then |
308 | if [ "$VERBOSE" == "on" ] |
309 | then |
310 | echo -e "\t>>> CHAR: $pathto" |
311 | fi |
312 | mknode -m $posix -c "$pathto" |
313 | fi |
314 | done < ${BUILDDIR}/${PKGNAME}/.char |
315 | |
316 | #very important: unsetting the '§' fieldseperator |
317 | unset IFS |
318 | else |
319 | fatal_error .char |
320 | fi |
321 | |
322 | #very important: unsetting the '§' fieldseperator |
323 | unset IFS |
324 | } |
325 | |
326 | |
327 | ################################################### |
328 | # function build_doinstall # |
329 | # build_doinstall $PKGNAME # |
330 | # NOTE: this is an wrapper do install packages # |
331 | ################################################### |
332 | build_doinstall() { |
333 | #this is only a wrapper |
334 | |
335 | # NOTE: |
336 | # !! we use § as field seperator !! |
337 | # doing so prevent us to get errors by filenames with spaces |
338 | |
339 | local PKGNAME |
340 | PKGNAME=$1 |
341 | |
342 | install_directories ${PKGNAME} |
343 | install_files ${PKGNAME} |
344 | install_symlinks ${PKGNAME} |
345 | install_blockdevices ${PKGNAME} |
346 | install_characterdevices ${PKGNAME} |
347 | } |
348 | |
349 | |
350 | ################################################### |
351 | # function install_database_entry # |
352 | # install_database_entry $PKGNAME $PKGTYPE # |
353 | # PKGTYPE can be "virtual", "sources" or nothing # |
354 | ################################################### |
355 | install_database_entry(){ |
356 | local PKGNAME |
357 | local PKGTYPE |
358 | |
359 | PKGNAME=$1 |
360 | PKGTYPE=$2 |
361 | |
362 | #add package to database |
363 | install -d ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
364 | |
365 | #install mage-file to database |
366 | install -m 0644 -o root -g root \ |
367 | ${MAGEFILE} \ |
368 | ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
369 | |
370 | # create fake file descriptors |
371 | # used by virtual and source packages |
372 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.dirs |
373 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.symlinks |
374 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.files |
375 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.pipes |
376 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.char |
377 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.mtime |
378 | |
379 | #put category to database |
380 | echo ${CATEGORIE} > ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.categorie |
381 | |
382 | #install PKGTYPE specific files |
383 | case ${PKGTYPE} in |
384 | virtual) |
385 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.virtual |
386 | ;; |
387 | |
388 | sources) |
389 | touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.sources |
390 | ;; |
391 | |
392 | *) |
393 | # normal packages needs these files |
394 | cp -f ${BUILDDIR}/${PKGNAME}/.{char,dirs,files,pipes,symlinks,mtime} \ |
395 | ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/} |
396 | ;; |
397 | esac |
398 | } |
399 | |
400 | |
401 | ################################################### |
402 | # function remove_database_entry # |
403 | # remove_database_entry $PKGNAME $PKGTYPE # |
404 | # PKGTYPE can be "virtual", "sources" or nothing # |
405 | ################################################### |
406 | remove_database_entry(){ |
407 | local PKGNAME |
408 | local PKGTYPE |
409 | |
410 | PKGNAME=$1 |
411 | PKGTYPE=$2 |
412 | |
413 | #removes database entry |
414 | if [ -d ${INSTALLDB}/${PKGNAME} ] |
415 | then |
416 | rm -rf ${INSTALLDB}/${PKGNAME} |
417 | fi |
418 | } |
419 | |
420 | |
421 | ################################################### |
422 | # function compare_mtime # |
423 | # compare_mtime $PKGNAME /path/to/file # |
424 | # # |
425 | # returns: # |
426 | # 0=delete me # |
427 | # 1=keep me # |
428 | # # |
429 | # compares mtime of given files in packages # |
430 | ################################################### |
431 | compare_mtime(){ |
432 | local DBDIR |
433 | local pathto |
434 | local x |
435 | |
436 | DBDIR=$1 |
437 | pathto=$2 |
438 | |
439 | M_MTIME=$(stat -c %Y ${INSTALLDB}/${DBDIR}/.mtime) |
440 | |
441 | #if $pathto is a symlink than compare linked binary |
442 | if [ -L ${pathto} ] |
443 | then |
444 | #readlink -f resolves full path of linked file |
445 | x=$(stat -c %Y "$(readlink -f "${pathto}")") |
446 | else |
447 | x=$(stat -c %Y "${pathto}") |
448 | fi |
449 | |
450 | if [ "${M_MTIME}" -eq "${x}" ] |
451 | then |
452 | #echo "delete me: ${pathto}" |
453 | return 0 |
454 | else |
455 | #echo "keep me : ${pathto}" |
456 | return 1 |
457 | fi |
458 | } |
459 | |
460 | |
461 | ################################################### |
462 | # function remove_symlinks # |
463 | # remove_symlinks $PKGNAME # |
464 | ################################################### |
465 | remove_symlinks() { |
466 | local PKGNAME |
467 | local RETVAL |
468 | |
469 | PKGNAME=$1 |
470 | |
471 | if [ -e ${INSTALLDB}/${PKGNAME}/.symlinks ] |
472 | then |
473 | #sets fieldseperator to "§" instead of " " |
474 | IFS=§ |
475 | |
476 | while read pathto posix link mtime |
477 | do |
478 | if [ ! -z "$pathto" ] |
479 | then |
480 | if [ -L "$pathto" ] |
481 | then |
482 | compare_mtime ${PKGNAME} "${pathto}" |
483 | RETVAL=$? |
484 | # 0=delete me # |
485 | # 1=keep me # |
486 | case ${RETVAL} in |
487 | 0) |
488 | echo -e "\t<<< LINK: $pathto" |
489 | rm "$pathto" |
490 | ;; |
491 | 1) |
492 | echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: $pathto" |
493 | ;; |
494 | esac |
495 | else |
496 | echo -e "${COLRED}! exist${COLDEFAULT} === LINK: $pathto" |
497 | fi |
498 | fi |
499 | done < ${INSTALLDB}/${PKGNAME}/.symlinks |
500 | |
501 | #very important: unsetting the '§' fieldseperator |
502 | unset IFS |
503 | else |
504 | fatal_error .symlinks |
505 | fi |
506 | } |
507 | |
508 | |
509 | ################################################### |
510 | # function remove_files # |
511 | # remove_files $PKGNAME # |
512 | ################################################### |
513 | remove_files() { |
514 | local PKGNAME |
515 | local RETVAL |
516 | |
517 | PKGNAME=$1 |
518 | |
519 | #uninstall of files |
520 | if [ -e ${INSTALLDB}/${PKGNAME}/.files ] |
521 | then |
522 | #sets fieldseperator to "§" instead of " " |
523 | IFS=§ |
524 | |
525 | while read pathto posix user group mtime md5sum |
526 | do |
527 | if [ ! -z "$pathto" ] |
528 | then |
529 | if [ -e "$pathto" ] |
530 | then |
531 | compare_mtime ${PKGNAME} "${pathto}" |
532 | RETVAL=$? |
533 | # 0=delete me # |
534 | # 1=keep me # |
535 | case ${RETVAL} in |
536 | 0) |
537 | echo -e "\t<<< FILE: $pathto" |
538 | rm "$pathto" |
539 | ;; |
540 | 1) |
541 | echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: $pathto" |
542 | ;; |
543 | esac |
544 | else |
545 | echo -e "${COLRED}! exist${COLDEFAULT} === FILE: $pathto" |
546 | fi |
547 | fi |
548 | done < ${INSTALLDB}/${PKGNAME}/.files |
549 | |
550 | #very important: unsetting the '§' fieldseperator |
551 | unset IFS |
552 | else |
553 | fatal_error .files |
554 | fi |
555 | } |
556 | |
557 | |
558 | ################################################### |
559 | # function remove_blockdevices # |
560 | # remove_blockdevices $PKGNAME # |
561 | ################################################### |
562 | remove_blockdevices() { |
563 | local PKGNAME |
564 | PKGNAME=$1 |
565 | |
566 | if [ -e ${INSTALLDB}/${PKGNAME}/.pipes ] |
567 | then |
568 | #sets fieldseperator to "§" instead of " " |
569 | IFS=§ |
570 | |
571 | while read pathto posix |
572 | do |
573 | if [ ! -z "$pathto" ] |
574 | then |
575 | echo -e "\t<<< PIPE: $pathto" |
576 | rm "$pathto" |
577 | fi |
578 | done < ${INSTALLDB}/${PKGNAME}/.pipes |
579 | |
580 | #very important: unsetting the '§' fieldseperator |
581 | unset IFS |
582 | else |
583 | fatal_error .pipes |
584 | fi |
585 | } |
586 | |
587 | |
588 | ################################################### |
589 | # function remove_characterdevices # |
590 | # remove_characterdevices $PKGNAME # |
591 | ################################################### |
592 | remove_characterdevices() { |
593 | local PKGNAME |
594 | PKGNAME=$1 |
595 | |
596 | if [ -e ${INSTALLDB}/${PKGNAME}/.char ] |
597 | then |
598 | #sets fieldseperator to "§" instead of " " |
599 | IFS=§ |
600 | |
601 | while read pathto posix |
602 | do |
603 | if [ ! -z "$pathto" ] |
604 | then |
605 | echo -e "\t<<< CHAR: $pathto" |
606 | rm "$pathto" |
607 | fi |
608 | done < ${INSTALLDB}/${PKGNAME}/.char |
609 | |
610 | #very important: unsetting the '§' fieldseperator |
611 | unset IFS |
612 | else |
613 | fatal_error .char |
614 | fi |
615 | } |
616 | |
617 | |
618 | ################################################### |
619 | # function remove_direcories # |
620 | # remove_direcories $PKGNAME # |
621 | ################################################### |
622 | remove_directories() { |
623 | local PKGNAME |
624 | PKGNAME=$1 |
625 | |
626 | #uninstall of dirs ## added small hack to fix dirs |
627 | # must be reverse -> smage2 doesn't sort them |
628 | if [ -e ${INSTALLDB}/${PKGNAME}/.dirs ] |
629 | then |
630 | |
631 | #sort directory order |
632 | mv ${INSTALLDB}/${PKGNAME}/.dirs ${INSTALLDB}/${PKGNAME}/.dirs_old |
633 | cat ${INSTALLDB}/${PKGNAME}/.dirs_old | sort > ${INSTALLDB}/${PKGNAME}/.dirs |
634 | |
635 | #sets fieldseperator to "§" instead of " " |
636 | IFS=§ |
637 | |
638 | while read pathto posix |
639 | do |
640 | if [ ! -z "$pathto" ] |
641 | then |
642 | if [ -e "$pathto" ] |
643 | then |
644 | echo -e "\t<<< DIR: $pathto" |
645 | rmdir "$pathto" &> /dev/null |
646 | if [ "$?" -ne "0" ] |
647 | then |
648 | #moves the cursor up |
649 | echo -en \\033[A |
650 | echo -e "${COLRED}! empty${COLDEFAULT} === DIR: $pathto" |
651 | fi |
652 | else |
653 | echo -e "${COLRED}! exist${COLDEFAULT} === DIR: $pathto" |
654 | fi |
655 | fi |
656 | done < ${INSTALLDB}/${PKGNAME}/.dirs |
657 | |
658 | #very important: unsetting the '§' fieldseperator |
659 | unset IFS |
660 | else |
661 | fatal_error .dirs |
662 | fi |
663 | } |
664 | |
665 | |
666 | ################################################### |
667 | # function build_douninstall # |
668 | # build_douninstall $PKGNAME # |
669 | # NOTE: this is an wrapper do remove packages # |
670 | ################################################### |
671 | build_douninstall() { |
672 | #this is only a wrapper |
673 | |
674 | # NOTE: |
675 | # !! we use § as field seperator !! |
676 | # doing so prevent us to get errors by filenames with spaces |
677 | |
678 | local PKGNAME |
679 | PKGNAME=$1 |
680 | |
681 | remove_symlinks ${PKGNAME} |
682 | remove_files ${PKGNAME} |
683 | remove_blockdevices ${PKGNAME} |
684 | remove_characterdevices ${PKGNAME} |
685 | remove_directories ${PKGNAME} |
686 | } |
687 | |
688 | getpackages() { |
689 | if [ -z "$MIRRORS" ] |
690 | then |
691 | echo "You have no mirrors defined. Please edit your /etc/mage.rc." |
692 | exit 1 |
693 | fi |
694 | |
695 | local i |
696 | for i in $MIRRORS |
697 | do |
698 | wget \ |
699 | --passive-ftp \ |
700 | --tries 3 \ |
701 | --continue \ |
702 | --progress bar \ |
703 | --directory-prefix=${PKGDIR} \ |
704 | ${i}/packages/${PKGNAME}.${PKGSUFFIX} |
705 | if [ "$?" == "0" ] |
706 | then |
707 | break |
708 | else |
709 | continue |
710 | fi |
711 | done |
712 | } |
713 | |
714 | syncmage() { |
715 | if [ -z "$RSYNC" ] |
716 | then |
717 | echo "You have no rsync-mirrors defined. Please edit your /etc/mage.rc." |
718 | exit 1 |
719 | fi |
720 | |
721 | local i |
722 | for i in $RSYNC |
723 | do |
724 | rsync \ |
725 | --recursive \ |
726 | --links \ |
727 | --perms \ |
728 | --times \ |
729 | --devices \ |
730 | --timeout=600 \ |
731 | --verbose \ |
732 | --compress \ |
733 | --progress \ |
734 | --stats \ |
735 | --delete \ |
736 | --delete-after \ |
737 | $i $MAGEDIR |
738 | if [ "$?" == "0" ] |
739 | then |
740 | break |
741 | else |
742 | continue |
743 | fi |
744 | done |
745 | |
746 | #clean up backup files (foo~) |
747 | find ${MAGEDIR} -name *~ -exec rm '{}' ';' |
748 | } |
749 | |
750 | cleanpkg(){ |
751 | if [ -d "$PKGDIR" ] |
752 | then |
753 | echo -n "Removing downloaded packages... " |
754 | rm -rf ${PKGDIR}/* |
755 | echo "done." |
756 | fi |
757 | } |
758 | |
759 | ################################################### |
760 | # function keepfiles # |
761 | # keepfiles "$CATEGORIE/$PNAME" "$filename" # |
762 | # note wildchars allowed # |
763 | ################################################### |
764 | keepfiles() { |
765 | local name |
766 | local keep |
767 | name="`echo $1| cut -d '/' -f2`" |
768 | keep="$2" |
769 | |
770 | DELPKG="`find ${INSTALLDB} -name ${name}*.mage`" |
771 | DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)" |
772 | cp ${DELDIR}/.files ${DELDIR}/.files-orig |
773 | sed "s:${keep}::" \ |
774 | ${DELDIR}/.files-orig > ${DELDIR}/.files |
775 | rm ${DELDIR}/.files-orig |
776 | } |
777 | |
778 | |
779 | ################################################### |
780 | # function injectpkg # |
781 | # injectpkg "$CATEGORIE/$PNAME" # |
782 | # note wildchars allowed # |
783 | ################################################### |
784 | injectpkg() { |
785 | local name |
786 | local categorie |
787 | local magename |
788 | name="`echo $1| cut -d '/' -f2`" |
789 | categorie="`echo $1| cut -d '/' -f1`" |
790 | |
791 | INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`" |
792 | for i in ${INJPKG} |
793 | do |
794 | magename="$(basename ${INJPKG} .mage)" |
795 | echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}" |
796 | install -d ${INSTALLDB}/${magename} |
797 | touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char} |
798 | |
799 | #installs magefile |
800 | install -m 0644 -o root -g root \ |
801 | ${MAGEDIR}/${categorie}/${magename}.mage \ |
802 | ${INSTALLDB}/${magename} |
803 | done |
804 | } |
805 | |
806 | ################################################### |
807 | # function reminjected # |
808 | # reminjected # |
809 | # note: removes all injected packages # |
810 | ################################################### |
811 | reminjected() { |
812 | DELINJ="`find ${INSTALLDB} -name .injected`" |
813 | for i in ${DELINJ} |
814 | do |
815 | magename=$(dirname ${i}) |
816 | if [ -d "${magename}" ] |
817 | then |
818 | # small fix to protect the mage-db deleting itself, that is not so funny :) |
819 | if [ "${magename}" != "${INSTALLDB}" ] |
820 | then |
821 | echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}" |
822 | rm -rf ${magename} |
823 | fi |
824 | fi |
825 | done |
826 | } |
827 | |
828 | |
829 | xtitle() { |
830 | if [ ${TERM} == "xterm" ] |
831 | then |
832 | echo -ne "\033]0;Mage: $1\007" |
833 | fi |
834 | return 0 |
835 | } |
836 | |
837 | |
838 | xtitleclean() { |
839 | if [ ${TERM} == "xterm" ] |
840 | then |
841 | echo -ne "\033]0;\007" |
842 | fi |
843 | return 0 |
844 | } |
845 | |
846 | |
847 | spin_processbar() { |
848 | |
849 | # does not works as it should -- disabled |
850 | # you musst add and remove a tempfile outside this funktion |
851 | # to leave this funktion ... |
852 | |
853 | # before you call this function do this: |
854 | # |
855 | # touch /var/tmp/proz |
856 | # build_doinstall|spin_processbar |
857 | |
858 | echo -en "Processing: " |
859 | while [ -f /var/tmp/proz ] |
860 | do |
861 | echo -en "-\b" |
862 | sleep 0.01 |
863 | echo -en "\\ \b\b" |
864 | sleep 0.01 |
865 | echo -en "|\b" |
866 | sleep 0.01 |
867 | echo -en "/\b" |
868 | sleep 0.01 |
869 | done |
870 | echo "done" |
871 | return 0 |
872 | |
873 | # when you want to leave the funktion do |
874 | # something like this: |
875 | # |
876 | # #remove spinner tempfile |
877 | # if [ "$VERBOSE" == "off" ] |
878 | # then |
879 | # if [ -f /var/tmp/proz ] |
880 | # then |
881 | # rm /var/tmp/proz |
882 | # fi |
883 | # fi |
884 | |
885 | } |
886 | |
887 | |
888 | #cuts full pathnames or versioniezed names down to basename |
889 | choppkgname(){ |
890 | #we want this only if full name was used |
891 | if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ] |
892 | then |
893 | #cuts ARCH and PBUILD |
894 | #ARCH comes from /etc/mage.rc |
895 | MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g") |
896 | |
897 | #cuts version number |
898 | MAGENAME=$(basename ${MAGENAME%-*} .mage) |
899 | fi |
900 | } |
901 | |
902 | |
903 | # get_categorie $PKGNAME, returns CATEGORIE |
904 | # ret 0=ok, 1=not_found |
905 | getcategorie(){ |
906 | for CAT in ${MAGEDIR}/* |
907 | do |
908 | if [ -d ${CAT}/${MAGENAME} ] |
909 | then |
910 | #debug only |
911 | if [ "$MAGEDEBUG" == "on" ] |
912 | then |
913 | echo "$MAGENAME found -> $CAT/$MAGENAME" |
914 | echo "categorie = $(basename ${CAT})" |
915 | fi |
916 | CATEGORIE=$(basename ${CAT}) |
917 | fi |
918 | done |
919 | |
920 | #package does not exists |
921 | if [ -z "$CATEGORIE" ] |
922 | then |
923 | echo -e "Package "${COLRED}"\"${MAGENAME}\""${COLDEFAULT}" does not exists." |
924 | exit 1 |
925 | fi |
926 | } |
927 | |
928 | |
929 | #check_stable_package /path/to/foo.mage |
930 | # returns 0=stable 1=unstable |
931 | check_stable_package(){ |
932 | #be sure no previous $STATES exists |
933 | unset STATE |
934 | |
935 | source $1 |
936 | |
937 | #if USE_UNSTABLE=true this must be prevented |
938 | if [ "${USE_UNSTABLE}" != "true" ] |
939 | then |
940 | if [ "${STATE}" != "stable" ] |
941 | then |
942 | return 1 |
943 | else |
944 | if [ "${STATE}" == "old" ] |
945 | then |
946 | return 1 |
947 | fi |
948 | fi |
949 | fi |
950 | |
951 | #unset the sourced varibales; |
952 | #we'll got bad problems later on if we don't do this |
953 | unset PKGNAME |
954 | unset STATE |
955 | unset DESCRIPTION |
956 | unset HOMEPAGE |
957 | unset DEPEND |
958 | unset SDEPEND |
959 | unset PROVIDE |
960 | unset PKGTYPE |
961 | unset preinstall |
962 | unset postinstall |
963 | |
964 | return 0 |
965 | } |
966 | |
967 | |
968 | #get_highest_magefile ${CATEGORIE} ${PKGNAME} |
969 | #fake at moment returns only stable pkgs (must set to be one) |
970 | # return $HIGHEST_MAGEFILE |
971 | get_highest_magefile(){ |
972 | unset HIGHEST_MAGEFILE |
973 | #CATEGORIE=$1 |
974 | #PKGNAME=$2 |
975 | |
976 | for i in ${MAGEDIR}/${CATEGORIE}/${MAGENAME}/* |
977 | do |
978 | #we exclude subdirs (for stuff like a md5sum dir) |
979 | if [ ! -d ${i} ] |
980 | then |
981 | check_stable_package ${i} |
982 | if [ "$?" == "0" ] |
983 | then |
984 | HIGHEST_MAGEFILE=${i} |
985 | #for debug only |
986 | if [ "$MAGEDEBUG" == "on" ] |
987 | then |
988 | echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}" |
989 | fi |
990 | fi |
991 | fi |
992 | done |
993 | |
994 | # stop here if HIGHEST_MAGEFILE is zero |
995 | # this package must be unstable or old |
996 | if [ -z "${HIGHEST_MAGEFILE}" ] |
997 | then |
998 | echo |
999 | echo -n "All packages named " |
1000 | echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT} |
1001 | echo -n " are marked " |
1002 | echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT} |
1003 | echo "." |
1004 | echo "You need to declare USE_UNSTABLE=true to install this." |
1005 | echo |
1006 | echo "Example:" |
1007 | echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}" |
1008 | echo |
1009 | echo "Be warned that these packages are not stable and may cause serious problems." |
1010 | echo "You should know what you are doing, so don't complain about any damage." |
1011 | echo |
1012 | return 1 |
1013 | fi |
1014 | |
1015 | MAGEFILE=${HIGHEST_MAGEFILE} |
1016 | return 0 |
1017 | } |
1018 | |
1019 | |
1020 | ################################################### |
1021 | # function is_config_protected # |
1022 | # is_config_protected /path/to/file # |
1023 | # # |
1024 | # returns: # |
1025 | # 0 - not protected # |
1026 | # 1 - error # |
1027 | # 2 - protected # |
1028 | # 3 - protected but masked # |
1029 | # # |
1030 | ################################################### |
1031 | is_config_protected() { |
1032 | local EXPFILE |
1033 | local TEST |
1034 | local PROTECTED |
1035 | local IFS |
1036 | |
1037 | EXPFILE=$1 |
1038 | |
1039 | #to be safe; it may be '§' |
1040 | IFS=' ' |
1041 | |
1042 | #check ob in config protect |
1043 | for i in ${CONFIG_PROTECT} |
1044 | do |
1045 | #ersetzen von $i nur wenn am anfang der variable |
1046 | TEST="${EXPFILE/#${i}/Protected}" |
1047 | if [ "${TEST}" != "${EXPFILE}" ] |
1048 | then |
1049 | #setzen das es protected ist |
1050 | PROTECTED=TRUE |
1051 | |
1052 | #check ob nicht doch maskiert |
1053 | for x in ${CONFIG_PROTECT_MASK} |
1054 | do |
1055 | TEST="${EXPFILE/#${x}/Protect_Masked}" |
1056 | if [ "${TEST}" != "${EXPFILE}" ] |
1057 | then |
1058 | PROTECTED=MASKED |
1059 | fi |
1060 | done |
1061 | fi |
1062 | done |
1063 | |
1064 | unset IFS |
1065 | |
1066 | case ${PROTECTED} in |
1067 | TRUE) |
1068 | #echo "I'm protected" |
1069 | return 2 |
1070 | ;; |
1071 | MASKED) |
1072 | #echo "I'm protected, but masked - delete me" |
1073 | return 3 |
1074 | ;; |
1075 | *) |
1076 | #echo "delete me" |
1077 | return 0 |
1078 | ;; |
1079 | esac |
1080 | } |
1081 | |
1082 | |
1083 | ################################################### |
1084 | # function count_protected_files # |
1085 | # count_protected_files /path/to/file # |
1086 | # # |
1087 | # note: prints number of protected files # |
1088 | # exp: 0012 # |
1089 | ################################################### |
1090 | count_protected_files() { |
1091 | ${MLIBDIR}/writeprotected "$1" |
1092 | } |
1093 | |
1094 | |
1095 | #call with 'get_magefile_to_uninstall SEARCHSTRING' |
1096 | #returns /path/to/magefile |
1097 | get_magefile_to_uninstall() { |
1098 | local RESULT |
1099 | local SSTRING |
1100 | local i |
1101 | local x |
1102 | local z |
1103 | |
1104 | SSTRING=$1 |
1105 | |
1106 | for i in ${INSTALLDB}/*/* |
1107 | do |
1108 | #echo ${i} |
1109 | #to be sure |
1110 | if [ -d ${i} ] |
1111 | then |
1112 | #echo "DEBUG: stripped i: $(basename ${i%-*-*})" |
1113 | if [ $(basename ${i%-*-*}) == ${SSTRING} ] |
1114 | then |
1115 | #RESULT="${RESULT} ${i}" |
1116 | CATEGORIE=$(< ${i}/.categorie) |
1117 | #echo ${CATEGORIE}/$(basename ${RESULT}) |
1118 | RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})" |
1119 | fi |
1120 | fi |
1121 | done |
1122 | |
1123 | if [ -n "${RESULT}" ] |
1124 | then |
1125 | #check if ONE package was found and not more |
1126 | declare -i x=0 |
1127 | for i in ${RESULT} |
1128 | do |
1129 | x=${x}+1 |
1130 | done |
1131 | if [ ${x} -eq 1 ] |
1132 | then |
1133 | #echo "jo ich uninstall $(basename ${RESULT}) ..." |
1134 | #the mage file |
1135 | #echo "${RESULT}/$(basename ${RESULT}).mage" |
1136 | |
1137 | #gets categorie of the package |
1138 | #CATEGORIE=$(< ${i}/.categorie) |
1139 | #echo ${CATEGORIE}/$(basename ${RESULT}) |
1140 | echo "${RESULT}" |
1141 | return 0 |
1142 | else |
1143 | #echo "More than one package found ..." |
1144 | echo "${RESULT}" |
1145 | return 2 |
1146 | fi |
1147 | else |
1148 | #echo "No package found named '${SSTRING}'." |
1149 | echo "${SSTRING}" |
1150 | return 1 |
1151 | fi |
1152 | } |
1153 | |
1154 | |
1155 | # reads virtualdb file |
1156 | #$1 = virtualname; $2 commands: showpkgs, showline |
1157 | #return 0 == installed -> shows installed pkg as well |
1158 | #return 1 == not installed |
1159 | virtuals_read() { |
1160 | local VIRTUAL_NAME COMMAND VIRT_LINE line x i |
1161 | |
1162 | VIRTUAL_NAME=$1 |
1163 | COMMAND=$2 |
1164 | |
1165 | # parse file to get virtual_name line |
1166 | IFS=$'\n' |
1167 | for line in $(< ${VIRTUALDB_FILE}) |
1168 | do |
1169 | IFS=$' ' |
1170 | for x in ${line} |
1171 | do |
1172 | if [ "${x}" == "${VIRTUAL_NAME}" ] |
1173 | then |
1174 | VIRT_LINE="${line}" |
1175 | |
1176 | if [ "${COMMAND}" == "showline" ] |
1177 | then |
1178 | #give out the non stripped line |
1179 | echo "${line}" |
1180 | fi |
1181 | fi |
1182 | done |
1183 | |
1184 | IFS=$'\n' |
1185 | done |
1186 | |
1187 | unset IFS |
1188 | |
1189 | #now read the packages linked to VIRTUAL_NAME and output them |
1190 | if [ -n "${VIRT_LINE}" ] |
1191 | then |
1192 | if [ "${COMMAND}" == "showpkgs" ] |
1193 | then |
1194 | declare -i x=0 |
1195 | for i in ${VIRT_LINE} |
1196 | do |
1197 | if [ ${x} -ge 1 ] |
1198 | then |
1199 | echo "${i}" |
1200 | fi |
1201 | ((x++)) |
1202 | done |
1203 | fi |
1204 | return 0 |
1205 | fi |
1206 | return 1 |
1207 | } |
1208 | |
1209 | |
1210 | #add pkg to virtualdb |
1211 | # $1 == virtualname $2= pkgname |
1212 | # retvals: 0=ok,added; 1=error; 3=pkg already in virtual |
1213 | virtuals_add(){ |
1214 | local VIRTUAL_NAME PKG_NAME OLD_LINE line i |
1215 | |
1216 | VIRTUAL_NAME=$1 |
1217 | PKG_NAME=$2 |
1218 | |
1219 | |
1220 | if virtuals_read ${VIRTUAL_NAME} |
1221 | then |
1222 | #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already |
1223 | for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs) |
1224 | do |
1225 | if [ "${i}" == ${PKG_NAME} ] |
1226 | then |
1227 | echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..." |
1228 | return 3 |
1229 | fi |
1230 | done |
1231 | |
1232 | echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..." |
1233 | OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)" |
1234 | |
1235 | #make a backup |
1236 | mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old |
1237 | |
1238 | IFS=$'\n' |
1239 | for line in $(< ${VIRTUALDB_FILE}.old) |
1240 | do |
1241 | #if the right line, append ${PKG_NAME}, else do nothing |
1242 | if [ "${line}" == "${OLD_LINE}" ] |
1243 | then |
1244 | echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE} |
1245 | else |
1246 | echo "${line}" >> ${VIRTUALDB_FILE} |
1247 | fi |
1248 | done |
1249 | |
1250 | unset IFS |
1251 | else |
1252 | echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..." |
1253 | echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \ |
1254 | && echo "ok" || echo "false" |
1255 | fi |
1256 | |
1257 | return 0 |
1258 | } |
1259 | |
1260 | #deletes pakages from virtual database |
1261 | #$1 virtualname; $2 pkgname |
1262 | virtuals_del() { |
1263 | |
1264 | local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED |
1265 | |
1266 | VIRTUAL_NAME=$1 |
1267 | PKG_NAME=$2 |
1268 | |
1269 | #first check if exists |
1270 | if virtuals_read ${VIRTUAL_NAME} |
1271 | then |
1272 | #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME} |
1273 | declare -i x=0 |
1274 | for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs) |
1275 | do |
1276 | if [ "${i}" == "${PKG_NAME}" ] |
1277 | then |
1278 | PKG_INSTALLED=true |
1279 | fi |
1280 | ((x++)) |
1281 | done |
1282 | |
1283 | #abort if not installed |
1284 | if [ "${PKG_INSTALLED}" != "true" ] |
1285 | then |
1286 | echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}." |
1287 | return 0 |
1288 | fi |
1289 | |
1290 | if [ ${x} -ge 2 ] |
1291 | then |
1292 | METHOD=update |
1293 | else |
1294 | METHOD=delall |
1295 | fi |
1296 | |
1297 | #get the complete line |
1298 | OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)" |
1299 | |
1300 | #make a backup |
1301 | mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old |
1302 | |
1303 | #parse virtualdb |
1304 | IFS=$'\n' |
1305 | for line in $(< ${VIRTUALDB_FILE}.old) |
1306 | do |
1307 | if [ "${line}" == "${OLD_LINE}" ] |
1308 | then |
1309 | #delall or update? |
1310 | case ${METHOD} in |
1311 | update) |
1312 | echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..." |
1313 | #del PKG_NAME from line |
1314 | echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE} |
1315 | ;; |
1316 | delall) |
1317 | echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..." |
1318 | #continue; do not write anything |
1319 | continue |
1320 | ;; |
1321 | esac |
1322 | else |
1323 | echo "${line}" >> ${VIRTUALDB_FILE} |
1324 | fi |
1325 | done |
1326 | unset IFS |
1327 | else |
1328 | echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database." |
1329 | fi |
1330 | } |
1331 | |
1332 | # gets real pkgname from virtuals.default |
1333 | #$1=VIRTUAL_NAME; returns PKG_NAME |
1334 | default_virtualname_to_pkgname(){ |
1335 | local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname |
1336 | |
1337 | VIRTUAL_NAME=$1 |
1338 | |
1339 | while read db_virtualname db_pkgname |
1340 | do |
1341 | if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ] |
1342 | then |
1343 | PKG_NAME="${db_pkgname}" |
1344 | fi |
1345 | done << EOF |
1346 | $(< ${VIRTUALDB_DEFAULTS}) |
1347 | EOF |
1348 | |
1349 | if [ -n "${PKG_NAME}" ] |
1350 | then |
1351 | echo "${PKG_NAME}" |
1352 | fi |
1353 | } |
Properties
Name | Value |
---|---|
svn:executable | * |