mirror of
https://0xacab.org/liberate/backupninja.git
synced 2024-11-08 20:02:32 +01:00
299a530734
handlers/dup: make use of new lib/vserver functionality
237 lines
7.5 KiB
Plaintext
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
|
|
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
|
|
}
|