commit 148be7283b4ca7ec05ceb417f2797e367d829a22
parent 85e36178df7caf3e3eb9624f2fff46879391aa25
Author: Jaromil <jaromil@dyne.org>
Date: Wed, 15 May 2013 12:00:23 +0200
fixed lookup for mounted tombs
better parsing of mount output when looking for mounted tombs and bind hooks
fixes parsing also for Debian 7 where somehow mount output has changed
Diffstat:
M | src/tomb | | | 121 | ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- |
1 file changed, 74 insertions(+), 47 deletions(-)
diff --git a/src/tomb b/src/tomb
@@ -1700,31 +1700,77 @@ resize_tomb() {
# }}}
+# print out an array of mounted tombs (internal use)
+# format is semi-colon separated list of attributes
+# if 1st arg is supplied, then list only that tomb
+# Positions in array:
+# 1 = full mapper path
+# 2 = mountpoint
+# 3 = filesystem type
+# 4 = mount options
+# 5 = tomb name
+list_tomb_mounts() {
+ if [ "$1" = "" ]; then
+ # list all open tombs
+ mount -l |
+ awk '
+BEGIN { main="" }
+/^\/dev\/mapper\/tomb/ {
+ if(main==$1) next;
+ print $1 ";" $3 ";" $5 ";" $6 ";" $7
+ main=$1
+}
+'
+ else
+ # list a specific tomb
+ mount -l |
+ awk -vtomb="[$1]" '
+BEGIN { main="" }
+/^\/dev\/mapper\/tomb/ {
+ if($7!=tomb) next;
+ if(main==$1) next;
+ print $1 ";" $3 ";" $5 ";" $6 ";" $7
+ main=$1
+}
+'
+ fi
+}
+
+# print out an array of mounted bind hooks (internal use)
+# format is semi-colon separated list of attributes
+# needs an argument: name of tomb whose hooks belong
+list_tomb_binds() {
+ if [ "$1" = "" ]; then
+ _failure "internal error: list_tomb_binds called without argument."; fi
+
+ mount -l |
+ awk -vtomb="$1" '
+BEGIN { main="" }
+/^\/dev\/mapper\/tomb/ {
+ if($7!=tomb) next;
+ if(main=="") { main=$1; next; }
+ if(main==$1)
+ print $1 ";" $3 ";" $5 ";" $6 ";" $7
+}
+'
+}
+
# {{{ - Index
# index files in all tombs for search
# $1 is optional, to specify a tomb
index_tombs() {
{ command -v updatedb > /dev/null } || {
die "Cannot index tombs on this system: updatedb not installed" }
-
- if [ $1 ]; then
- # list a specific tomb
- mounted_tombs=`mount -l |
- awk -vtomb="[$1]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`
- else
- # list all open tombs
- mounted_tombs=`mount -l |
- awk '/^\/dev\/mapper\/tomb/ { print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`
- fi
- if ! [ $mounted_tombs ]; then
- if [ $1 ]; then
- die "There seems to be no open tomb engraved as [$1]"
- else
- die "I can't see any open tomb, may they all rest in peace."
+
+ mounted_tombs=(`list_tomb_mounts $1`)
+ { test ${#mounted_tombs} = 0 } && {
+ if [ $1 ]; then die "There seems to be no open tomb engraved as [$1]"
+ else die "I can't see any open tomb, may they all rest in peace."
fi
- fi
+ }
+
yes "Creating and updating search indexes"
- for t in ${(f)mounted_tombs}; do
+ for t in ${mounted_tombs}; do
mapper=`basename ${t[(ws:;:)1]}`
tombname=${t[(ws:;:)5]}
tombmount=${t[(ws:;:)2]}
@@ -1741,10 +1787,9 @@ search_tombs() {
die "Cannot index tombs on this system: updatedb not installed" }
# list all open tombs
- mounted_tombs=(`mount -l |
- awk '/^\/dev\/mapper\/tomb/ { print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`)
+ mounted_tombs=(`list_tomb_mounts $1`)
{ test ${#mounted_tombs} = 0 } && {
- die "I can't see any open tomb, may they all rest in peace." }
+ die "I can't see any open tomb, may they all rest in peace." }
yes "Searching for: $fg_bold[white]${=PARAM}$fg_no_bold[white]"
for t in ${mounted_tombs}; do
xxx "checking for index: ${t}"
@@ -1767,30 +1812,13 @@ search_tombs() {
# list all tombs mounted in a readable format
# $1 is optional, to specify a tomb
list_tombs() {
- if [ $1 ]; then
- # list a specific tomb
- mounted_tombs=`mount -l |
- awk -vtomb="[$1]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`
- else
- # list all open tombs
- mounted_tombs=`mount -l |
- awk '/^\/dev\/mapper\/tomb/ { print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`
- fi
- # 1 = full mapper path
- # 2 = mountpont
- # 3 = filesystem
- # 4 = mount options
- # 5 = name
-
- if ! [ $mounted_tombs ]; then
- if [ $1 ]; then
- die "There seems to be no open tomb engraved as [$1]"
- else
- die "I can't see any open tomb, may they all rest in peace."
- fi
- fi
- for t in ${(f)mounted_tombs}; do
+ # list all open tombs
+ mounted_tombs=(`list_tomb_mounts $1`)
+ { test ${#mounted_tombs} = 0 } && {
+ die "I can't see any ${1:-open} tomb, may they all rest in peace." }
+
+ for t in ${mounted_tombs}; do
mapper=`basename ${t[(ws:;:)1]}`
tombname=${t[(ws:;:)5]}
tombmount=${t[(ws:;:)2]}
@@ -1856,11 +1884,10 @@ list_tombs() {
print -n "$fg_no_bold[green]$tombname"
print "$fg_bold[red] Your tomb is almost full!"
fi
-
+
# now check hooks
- mtomb=`sed 's:\/:\\\/:g' <<< $tombmount`
- mounted_hooks=`mount | awk "/^$mtomb/"' {print $1 ";" $3}'`
- for h in ${(f)mounted_hooks}; do
+ mounted_hooks=(`list_tomb_binds $tombname`)
+ for h in ${mounted_hooks}; do
print -n "$fg_no_bold[green]$tombname"
print -n "$fg_no_bold[white] hooks "
print -n "$fg_bold[white]`basename ${h[(ws:;:)1]}`"