# -*- 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 all the arguments are running vservers names, returns 0. ## Else, returns 1. Also returns 1 if no argument is given. ## vservers_running() { [ $# -ge 1 ] || return 1 local args="$1" local vserver for vserver in $args ; do $VSERVERINFO -q $vserver RUNNING || 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 }