| #!/usr/bin/env bash |
| # Copyright (C) 2011-2013 Red Hat, Inc. All rights reserved. |
| # |
| # This copyrighted material is made available to anyone wishing to use, |
| # modify, copy, or redistribute it subject to the terms and conditions |
| # of the GNU General Public License v.2. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write to the Free Software Foundation, |
| # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| |
| # get.sh: get various values from volumes |
| # |
| # USAGE: |
| # get pv_field PV field [pvs params] |
| # get vg_field VG field [vgs params] |
| # get lv_field LV field [lvs params] |
| # |
| # get lv_devices LV [lvs params] |
| |
| test -z "$BASH" || set -e -o pipefail |
| |
| # trims only leading prefix and suffix |
| trim_() { |
| rm -f debug.log # drop log, command was ok |
| local var=${1%${1##*[! ]}} # remove trailing space characters |
| echo "${var#${var%%[! ]*}}" # remove leading space characters |
| } |
| |
| pv_field() { |
| local r=$(pvs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1") |
| trim_ "$r" |
| } |
| |
| vg_field() { |
| local r=$(vgs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1") |
| trim_ "$r" |
| } |
| |
| lv_field() { |
| local r=$(lvs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1") |
| trim_ "$r" |
| } |
| |
| lvh_field() { |
| local r=$(lvs -H --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1") |
| trim_ "$r" |
| } |
| |
| lva_field() { |
| local r=$(lvs -a --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1") |
| trim_ "$r" |
| } |
| |
| lv_devices() { |
| lv_field "$1" devices -a "${@:2}" | sed 's/([^)]*)//g; s/,/\n/g' |
| } |
| |
| lv_field_lv_() { |
| lv_field "$1" "$2" -a --unbuffered | sed 's/\[//; s/]//' |
| } |
| |
| lv_tree_devices_() { |
| local lv="$1/$2" |
| local type=$(lv_field "$lv" segtype -a --unbuffered | head -n 1) |
| local orig=$(lv_field_lv_ "$lv" origin) |
| # FIXME: should we count in also origins ? |
| #test -z "$orig" || lv_tree_devices_ $1 $orig |
| case "$type" in |
| linear|striped) |
| lv_devices "$lv" |
| ;; |
| mirror|raid*) |
| local log=$(lv_field_lv_ "$lv" mirror_log) |
| test -z "$log" || lv_tree_devices_ "$1" "$log" |
| for i in $(lv_devices "$lv") |
| do lv_tree_devices_ "$1" "$i"; done |
| ;; |
| thin) |
| lv_tree_devices_ "$1" "$(lv_field_lv_ $lv pool_lv)" |
| ;; |
| thin-pool) |
| lv_tree_devices_ "$1" "$(lv_field_lv_ $lv data_lv)" |
| lv_tree_devices_ "$1" "$(lv_field_lv_ $lv metadata_lv)" |
| ;; |
| cache) |
| lv_tree_devices_ "$1" "$(lv_devices $lv)" |
| ;; |
| cache-pool) |
| lv_tree_devices_ "$1" "$(lv_field_lv_ $lv data_lv)" |
| lv_tree_devices_ "$1" "$(lv_field_lv_ $lv metadata_lv)" |
| ;; |
| esac |
| } |
| |
| lv_tree_devices() { |
| lv_tree_devices_ "$@" | sort | uniq |
| } |
| |
| first_extent_sector() { |
| pv_field "$@" pe_start --units s --nosuffix |
| } |
| |
| #set -x |
| unset LVM_VALGRIND |
| unset LVM_LOG_FILE_EPOCH |
| "$@" |