Annotation of /trunk/mage/usr/lib/mage/mage3.functions.sh
Parent Directory | Revision Log
Revision 36 -
(hide annotations)
(download)
(as text)
Thu Jan 6 03:34:00 2005 UTC (19 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 29616 byte(s)
Thu Jan 6 03:34:00 2005 UTC (19 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 29616 byte(s)
exit 1 has broken mageupgrade, now using return 1; exit stuff now in mage3.sh
1 | niro | 24 | #!/bin/bash |
2 | # Magellan Linux Installer Functions (mage.functions.sh) | ||
3 | niro | 33 | # version: 0.3.6-r9 |
4 | niro | 24 | |
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 | niro | 31 | # 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 | niro | 36 | return 1 |
1013 | niro | 31 | fi |
1014 | |||
1015 | niro | 24 | 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 | * |