backupninja/lib/vserver.in
2007-02-23 18:04:04 +00:00

237 lines
7.5 KiB
Plaintext

# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
#####################################################
## VSERVERS RELATED FUNCTIONS FOR NINJAHELPER
##
## Depends on:
## - easydialog library
## - $conffile
##
## Global variables used and modified here:
## - $vservers_are_available (yes/no)
## - $found_vservers (list)
## - $selected_vservers (list)
## - $host_or_vservers (host/vservers/both)
##
##
## Get vservers-related variables.
## Then, if Vservers are enabled, check that:
## - VROOTDIR is valid;
## - at least one vserver can be found.
## If, and only if, the above conditions are all true:
## - set $vservers_are_available to 'yes';
## - set $found_vservers to the list of all vservers found on the system.
## This function has to be run once before a new helper is run.
## If the argument is "nodialog", use the backupninja's message functions
## instead of easydialog.
##
init_vservers() {
local arg=$1
# get global variables from the conffile
setfile $conffile
getconf vservers no
getconf VSERVERINFO /usr/sbin/vserver-info
getconf VSERVER /usr/sbin/vserver
getconf VROOTDIR `if [ -x "$VSERVERINFO" ]; then $VSERVERINFO info SYSINFO | grep '^ *vserver-Rootdir' | @AWK@ '{print $2}'; fi`
# canonicalize VROOTDIR
[ -z "$VROOTDIR" ] || VROOTDIR=`readlink --canonicalize $VROOTDIR`
# init this library's global variables
vservers_are_available=no
found_vservers=
selected_vservers=
host_or_vservers=host
# check vservers real availability
if [ $vservers = yes ]; then
if [ ! -x "$VSERVERINFO" ]; then
`if [ "$arg" = nodialog ]; then echo fatal; else echo "msgBox warning"; fi` \
"vservers enabled in $conffile, but vserver-info command was not found. Please set the VSERVERINFO configuration variable to its full path."
return
fi
if [ ! -x "$VSERVER" ]; then
`if [ "$arg" = nodialog ]; then echo fatal; else echo "msgBox warning"; fi` \
"vservers enabled in $conffile, but vserver command was not found. Please set the VSERVER configuration variable to its full path."
return
fi
if [ -z "$VROOTDIR" ]; then
`if [ "$arg" = nodialog ]; then echo fatal; else echo "msgBox warning"; fi` \
"vservers enabled in $conffile, but VROOTDIR is not set and could not be guessed."
return
fi
if [ ! -d "$VROOTDIR" ]; then
`if [ "$arg" = nodialog ]; then echo fatal; else echo "msgBox warning"; fi` \
"vservers enabled in $conffile, but VROOTDIR ($VROOTDIR) does not exist.";
return
fi
found_vservers=`ls $VROOTDIR | grep -E -v "lost\+found|ARCHIVES" | tr "\n" " "`
if [ -z "$found_vservers" ]; then
`if [ "$arg" = nodialog ]; then echo warning; else echo "msgBox warning"; fi` \
"vservers enabled in $conffile, but no vserver was found in $VROOTDIR.";
return
fi
vservers_are_available=yes
fi
}
##
## If all the arguments are existing vservers names, returns 0.
## Else, returns 1. Also returns 1 if no argument is given.
##
vservers_exist() {
[ $# -ge 1 ] || return 1
local args="$1"
local vserver i found
for vserver in $args ; do
found=no
for i in $found_vservers ; do
if [ $vserver = $i ]; then
found=yes
break
fi
done
[ $found = yes ] || return 1
done
return 0
}
##
## If the argument is the name of a vserver selected by the current helper,
## echoes 'on' and returns 0.
## Else, echoes 'off' and returns 1.
##
vserver_is_selected() {
local vserver=$1
local vserver_is_selected=1
local i
for i in $selected_vservers ; do
[ "$vserver" == "$i" ] && vserver_is_selected=0
done
if [ $vserver_is_selected = 0 ]; then
echo on
else
echo off
fi
return $vserver_is_selected
}
##
## Have the user choose one Vserver among the existing ones.
## Set $selected_vservers to the chosen one's name.
## Returns 1 if cancelled or if Vservers are not available.
##
choose_one_vserver() {
[ "$vservers_are_available" == "yes" ] || return 1
local title=$1
local i=
local vserver=
REPLY=
while [ -z "$REPLY" ]; do
[ -n "$selected_vservers" ] && setDefault $selected_vservers
listBegin "$title" "Choose at least one Linux-Vserver to backup:"
for vserver in $found_vservers; do
listItem "$vserver" "Backup $vserver vserver"
done
listDisplay menu
[ $? = 0 ] || return 1
done
selected_vservers=$REPLY
}
##
## If Vservers are not enabled, set host_or_vservers='host' and then return
## Else, have the user choose if he/she wants to perform the backup on the host
## system or on one Vserver.
## Set, respectively, $host_or_vservers to 'host' or 'vservers'.
## Returns 1 if cancelled.
##
choose_host_or_one_vserver() {
if [ "$vservers_are_available" != "yes" ]
then
host_or_vservers='host'
return
fi
local title=$1
# if there is one, set the previously chosen item as the default
[ -n "$host_or_vservers" ] && setDefault $host_or_vservers
menuBox "$title - src" "Do you want to operate on the host system and/or on vservers?" \
"host" "Host system" \
"vserver" "One Vserver"
[ $? = 0 ] || return 1
case $REPLY in
"host")
host_or_vservers='host'
;;
"vserver")
host_or_vservers='vservers'
;;
esac
}
##
## If Vservers are not enabled, set host_or_vservers='host' and then return
## Else, have the user choose the target he/she wants to perform the backup on:
## - host system only;
## - some vservers only;
## - both the host system and some vservers.
## Set, respectively, $host_or_vservers to 'host', 'vservers', or 'both'
## Returns 1 if cancelled.
##
choose_host_or_vservers_or_both() {
if [ "$vservers_are_available" != "yes" ]
then
host_or_vservers='host'
return
fi
local title=$1
# if there is one, set the previously chosen item as the default
[ -n "$host_or_vservers" ] && setDefault $host_or_vservers
menuBox "$title - src" "Do you want to operate on the host system and/or on vservers?" \
"host" "Host system only" \
"vservers" "Vservers only" \
"both" "Host system and Vservers"
[ $? = 0 ] || return 1
case $REPLY in
"host")
host_or_vservers='host'
;;
"vservers")
host_or_vservers='vservers'
;;
"both")
host_or_vservers='both'
;;
esac
}
##
## Have the user choose among "all vservers" and a not-empty subset of these.
## Set $selected_vservers to 'all' or to a space-separated name list.
## Returns 1 if cancelled or if Vservers are not available.
##
choose_one_or_more_vservers() {
[ "$vservers_are_available" == "yes" ] || return 1
local title=$1
local i=
# UI
booleanBox "$title" "Do you want to backup all vservers?" ` [ -z "$selected_vservers" -o "$selected_vservers" == "all" ] || echo no`
if [ $? = 0 ]; then
selected_vservers="all"
else
# choose among the existing vservers
local vserver=
local vserver_was_selected=
REPLY=
while [ -z "$REPLY" ]; do
listBegin "$title" "Choose at least one Linux-Vserver to backup:"
# list existing vservers, preselecting the previously selected ones
for vserver in $found_vservers; do
listItem "$vserver" "Backup $vserver vserver" `vserver_is_selected $vserver`
done
listDisplay checklist
[ $? = 0 ] || return 1
done
# remove quotes around each vserver name
selected_vservers=`echo $REPLY | tr -d '"'`
fi
}