More robust code: avoid using space as field separator.
Etienne Dublé
3 years ago
260 | 260 | dump_partition_info() |
261 | 261 | { |
262 | 262 | disk_device="$1" |
263 | echo "$PARTITIONS" | tr ';' ' ' | while read part_id subtype mountpoint size | |
263 | echo "$PARTITIONS" | while IFS=";" read part_id subtype mountpoint size | |
264 | 264 | do |
265 | 265 | device="$(get_part_device $disk_device $part_id)" |
266 | echo "part $device $subtype $mountpoint $size" | |
266 | echo "part;$device;$subtype;$mountpoint;$size" | |
267 | 267 | done |
268 | 268 | } |
269 | 269 | |
271 | 271 | { |
272 | 272 | if [ "$LVM_VOLUMES" != "" ] |
273 | 273 | then |
274 | echo "$LVM_VOLUMES" | tr ';' ' ' | while read label subtype mountpoint size | |
274 | echo "$LVM_VOLUMES" | while IFS=";" read label subtype mountpoint size | |
275 | 275 | do |
276 | echo "lvm /dev/$VG/$label $subtype $mountpoint $size" | |
276 | echo "lvm;/dev/$VG/$label;$subtype;$mountpoint;$size" | |
277 | 277 | done |
278 | 278 | fi |
279 | 279 | } |
286 | 286 | |
287 | 287 | lvm_partition_size_mb() |
288 | 288 | { |
289 | dump_partition_info "$1" | while read vol_type device subtype mountpoint size | |
289 | dump_partition_info "$1" | while IFS=";" read vol_type device subtype mountpoint size | |
290 | 290 | do |
291 | 291 | if [ "$subtype" = "lvm" ] |
292 | 292 | then |
298 | 298 | |
299 | 299 | lvm_sum_size_mb() |
300 | 300 | { |
301 | dump_lvm_info | while read vol_type device subtype mountpoint size | |
301 | dump_lvm_info | while IFS=";" read vol_type device subtype mountpoint size | |
302 | 302 | do |
303 | 303 | device_size_mb "$device" |
304 | 304 | done | sum_lines |
323 | 323 | nice_factor="$1" |
324 | 324 | disk_size_mb="$2" |
325 | 325 | |
326 | while read voltype device subtype mountpoint size | |
326 | while IFS=";" read voltype device subtype mountpoint size | |
327 | 327 | do |
328 | 328 | current_size_mb=$(device_size_mb $device) |
329 | 329 | case "$size" in |
333 | 333 | size_mb=$((percent_requested*nice_factor*disk_size_mb/NICE_FACTOR_SCALE/100)) |
334 | 334 | if [ $current_size_mb -ge $size_mb ] |
335 | 335 | then # percentage too low regarding current size, convert to 'auto' |
336 | echo $voltype auto $device $subtype $mountpoint $current_size_mb | |
336 | echo "$voltype;auto;$device;$subtype;$mountpoint;$current_size_mb" | |
337 | 337 | else # convert to fixed size, to ease later processing |
338 | echo $voltype fixed $device $subtype $mountpoint $size_mb | |
338 | echo "$voltype;fixed;$device;$subtype;$mountpoint;$size_mb" | |
339 | 339 | fi |
340 | 340 | ;; |
341 | 341 | *[MG]) |
344 | 344 | size_mb=$((size_requested_mb*nice_factor/NICE_FACTOR_SCALE)) |
345 | 345 | if [ $size_mb -le $current_size_mb ] |
346 | 346 | then # fixed size too low regarding current size (because of nice factor), convert to 'auto' |
347 | echo $voltype auto $device $subtype $mountpoint $current_size_mb | |
347 | echo "$voltype;auto;$device;$subtype;$mountpoint;$current_size_mb" | |
348 | 348 | else |
349 | echo $voltype fixed $device $subtype $mountpoint $size_mb | |
349 | echo "$voltype;fixed;$device;$subtype;$mountpoint;$size_mb" | |
350 | 350 | fi |
351 | 351 | ;; |
352 | 352 | max) |
353 | echo $voltype max $device $subtype $mountpoint $current_size_mb | |
353 | echo "$voltype;max;$device;$subtype;$mountpoint;$current_size_mb" | |
354 | 354 | ;; |
355 | 355 | auto) |
356 | echo $voltype auto $device $subtype $mountpoint $current_size_mb | |
356 | echo "$voltype;auto;$device;$subtype;$mountpoint;$current_size_mb" | |
357 | 357 | ;; |
358 | 358 | *) |
359 | 359 | echo "unknown size! '$size'" >&2 |
361 | 361 | ;; |
362 | 362 | esac |
363 | 363 | done |
364 | } | |
365 | ||
366 | last_field() | |
367 | { | |
368 | awk 'BEGIN {FS = ";"}; {print $NF}' | |
364 | 369 | } |
365 | 370 | |
366 | 371 | compute_applied_sizes() |
377 | 382 | do |
378 | 383 | volume_analysis_step1="$(echo "$volumes_info" | analysis_step1 $nice_factor $disk_size_mb)" |
379 | 384 | |
380 | static_size_mb=$(echo "$volume_analysis_step1" | grep -v " fixed " | awk '{print $NF}' | sum_lines) | |
385 | static_size_mb=$(echo "$volume_analysis_step1" | grep -v ";fixed;" | last_field | sum_lines) | |
381 | 386 | space_size_mb=$((total_size_mb-static_size_mb)) |
382 | sum_fixed_mb=$(echo "$volume_analysis_step1" | grep " fixed " | awk '{print $NF}' | sum_lines) | |
387 | sum_fixed_mb=$(echo "$volume_analysis_step1" | grep ";fixed;" | last_field | sum_lines) | |
383 | 388 | |
384 | 389 | if [ $sum_fixed_mb -gt $space_size_mb ] |
385 | 390 | then |
407 | 412 | fi |
408 | 413 | done |
409 | 414 | |
410 | echo "$volume_analysis_step1" | while read voltype sizetype args | |
411 | do | |
412 | set -- $args | |
415 | echo "$volume_analysis_step1" | \ | |
416 | while IFS=";" read voltype sizetype device subtype mountpoint current_size_mb | |
417 | do | |
413 | 418 | case $sizetype in |
414 | 419 | "fixed") |
415 | echo $voltype $1 $2 $3 $4 | |
420 | echo "$voltype;$device;$subtype;$mountpoint;$current_size_mb" | |
416 | 421 | ;; |
417 | 422 | "auto") |
418 | echo $voltype $1 $2 $3 keep | |
423 | echo "$voltype;$device;$subtype;$mountpoint;keep" | |
419 | 424 | ;; |
420 | 425 | "max") |
421 | echo $voltype $1 $2 $3 max | |
426 | echo "$voltype;$device;$subtype;$mountpoint;max" | |
422 | 427 | ;; |
423 | 428 | esac |
424 | 429 | done |
649 | 654 | format_info="$4" |
650 | 655 | |
651 | 656 | # we process lines with "applied_size=max" last (sort key) |
652 | echo "$format_info" | sort -k 5,5 | \ | |
653 | while read voltype voldevice subtype mountpoint applied_size | |
657 | echo "$format_info" | sort -t ";" -k 5,5 | \ | |
658 | while IFS=";" read voltype voldevice subtype mountpoint applied_size | |
654 | 659 | do |
655 | 660 | dev_name=$(device_name $voltype $voldevice) |
656 | 661 | origin_voldevice=$(get_origin_voldevice $voldevice $voltype $origin_device) |