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