tools: Add a interpolate function that can interpolate % variables into a path.
authorMatthijs Kooijman <matthijs@stdin.nl>
Thu, 1 Jan 2009 14:02:23 +0000 (15:02 +0100)
committerMatthijs Kooijman <matthijs@stdin.nl>
Thu, 1 Jan 2009 14:46:20 +0000 (15:46 +0100)
This allows handlers to turn a single path configuration variable into
different paths, based on the vserver used.

lib/tools.in
man/backup.d.5

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"
+}
index 5090051e34afb4b632e5805ccdfab6ad7c9318ba..80f0ce890b7c8abd54fa66b92505fb1c317afd9e 100644 (file)
@@ -97,6 +97,35 @@ The file format of the action configuration files is "ini style." Sections are c
    pear = no thanks \\
    i will not have a pear.
 
+.SH INTERPOLATION
+
+Some handlers will support path interpolation for some of their configuration variables. Interpolation allows you to give a config variable a different value, depending on the host or vserver it is used in. See the documentation for each handler for which variables are interpolated.
+
+The following interpolation variables are available:
+
+.IP %h
+The short hostname (output of `hostname -s`).
+
+.IP %h
+The full hostname (output of `hostname --fqdn`).
+
+.IP %n
+The name of the vserver running in, or the empty string when running on the host.
+
+.IP %N
+The name of the vserver running in, or "host" when running on the host.
+
+.IP %v
+The root direcotry of the vserver running in, or the empty string when running on the host.  
+
+.IP %%
+A literal %.
+
+For example, the following would backup the foo and bar vservers to /var/backups/foo and /var/backups/bar respectively.
+
+   backupdir = /var/backups/%n
+   vsnames   = foo bar
+
 .SH SEE ALSO
 .BR backupninja (1), 
 .BR ninjahelper (1),