tools: Add a interpolate function that can interpolate % variables into a path.
[matthijs/upstream/backupninja.git] / lib / tools.in
index 0005be943c3e3b186c2eabe1a51179615c921acb..fe7d54a38de94fc8c7b44513e402e227314021d8 100644 (file)
@@ -46,3 +46,46 @@ function getconf() {
        # because it is in an 'eval' statement.
        eval $1='$ret'
 }
+
+#
+# Replaces escape sequences in $1 with the proper values for the vserver $2.
+# The result is put on stdout.  If $2 is empty, values for the host are
+# replaced. The following values are replaced:
+#
+# %%  Literal %
+# %h  The short hostname (as returned by hostname -s)
+# %H  The full hostname (as returned by hostname --fqdn)
+# %n  The vserver name, or empty for the host
+# %N  The vserver name, or "host" for the host
+# %v  The vserver root directory, or empty for the host
+#
+# Note that the given vserver must be running!
+#
+function interpolate() {
+       path=$1
+       vsname=$2
+       vexec=${vsname:+$VSERVER $vsname exec }
+       # Find the values to replace
+       h=`$vexec hostname -s`
+       H=`$vexec hostname --fqdn`
+       n=$vsname
+       N=${vsname:-host}
+       v=${vsname:+$VROOTDIR/$vsname}
+
+       expr=''
+       for var in h H n N v; do
+               # Do indirect lookup of the value to replace
+               val=${!var}
+               # Escape slashes (twice, bash seems to eat one somewhere)
+               val=`echo "$val" | sed 's#/#\\\\/#g'`
+               # Add replacement pattern. The first part checks that there is
+               # an odd number of percent signs before the variable, so
+               # double % is properly left alone.
+               expr="${expr}s/\(\(^\|[^%]\)\(%%\)*\)%$var/\1$val/g;"
+       done
+       # Finally replace literal % signs
+       expr="${expr}s/%%/%/g"
+
+       # Do the actual interpolation
+       echo $path | sed "$expr"
+}