diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/backupninja.in | 73 | ||||
-rwxr-xr-x | src/ninjahelper.in | 155 |
2 files changed, 133 insertions, 95 deletions
diff --git a/src/backupninja.in b/src/backupninja.in index 2663457..f43eaab 100755 --- a/src/backupninja.in +++ b/src/backupninja.in @@ -121,38 +121,6 @@ function msg { let "msgcount += 1" } -function setfile() { - CURRENT_CONF_FILE=$1 -} - -function setsection() { - CURRENT_SECTION=$1 -} - - -# -# sets a global var with name equal to $1 -# to the value of the configuration parameter $1 -# $2 is the default. -# - -function getconf() { - CURRENT_PARAM=$1 - ret=`awk -f $scriptdir/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE` - # if nothing is returned, set the default - if [ "$ret" == "" -a "$2" != "" ]; then - ret="$2" - fi - - # replace * with %, so that it is not globbed. - ret="${ret//\\*/__star__}" - - # this is weird, but single quotes are needed to - # allow for returned values with spaces. $ret is still expanded - # because it is in an 'eval' statement. - eval $1='$ret' -} - # # enforces very strict permissions on configuration file $file. # @@ -308,7 +276,7 @@ function process_action() { echo "" > $bufferfile echo_debug_msg=1 ( - . $scriptdir/$suffix $file + . $scriptdirectory/$suffix $file ) 2>&1 | ( while read a; do echo $a >> $bufferfile @@ -408,42 +376,30 @@ if [ ! -r "$conffile" ]; then fatal "Configuration file $conffile not found." fi -# find $scriptdir -scriptdir=`grep scriptdirectory $conffile | awk '{print $3}'` -if [ -z "$scriptdir" ]; then - if [ -d "@datadir@" ]; then - scriptdir="@datadir@" - else - echo "Could not find entry 'scriptdirectory' in $conffile" - fatal "Could not find entry 'scriptdirectory' in $conffile" - fi -else - if [ ! -d "$scriptdir" ]; then - echo "Script directory $scriptdir not found." - fatal "Script directory $scriptdir not found." - fi -fi - -# find $libdir -libdir=`grep libdirectory $conffile | awk '{print $3}'` -if [ -z "$libdir" ]; then +# find $libdirectory +libdirectory=`grep '^libdirectory' $conffile | awk '{print $3}'` +if [ -z "$libdirectory" ]; then if [ -d "@libdir@" ]; then - libdir="@libdir@" + libdirectory="@libdir@" else echo "Could not find entry 'libdirectory' in $conffile." fatal "Could not find entry 'libdirectory' in $conffile." fi else - if [ ! -d "$libdir" ]; then - echo "Lib directory $libdir not found." - fatal "Lib directory $libdir not found." + if [ ! -d "$libdirectory" ]; then + echo "Lib directory $libdirectory not found." + fatal "Lib directory $libdirectory not found." fi fi +# include shared functions +. $libdirectory/tools + setfile $conffile # get global config options (second param is the default) getconf configdirectory @CFGDIR@/backup.d +getconf scriptdirectory @datadir@ getconf reportemail getconf reportsuccess yes getconf reportwarning yes @@ -472,9 +428,6 @@ if [ ! -d "$configdirectory" ]; then fatal "Configuration directory '$configdirectory' not found." fi -# include shared functions -. $libdir/tools - [ -f "$logfile" ] || touch $logfile if [ "$UID" != "0" ]; then @@ -516,7 +469,7 @@ for file in $files; do continue fi - if [ -e "$scriptdir/$suffix" ]; then + if [ -e "$scriptdirectory/$suffix" ]; then process_action $file $suffix else error "Can't process file '$file': no handler script for suffix '$suffix'" diff --git a/src/ninjahelper.in b/src/ninjahelper.in index 451f389..0d7050c 100755 --- a/src/ninjahelper.in +++ b/src/ninjahelper.in @@ -58,6 +58,8 @@ require_packages() { ## menu for the wizards ## donew() { + unset host_or_vservers + unset vservers_chooser_vsnames listBegin "new action menu" "select an action to create" listItem return "return to main menu" for data in $HELPERS; do @@ -163,6 +165,102 @@ doaction() { } ##################################################### +## VSERVERS RELATED FUNCTIONS + +## +## If vservers are not enabled, exit silently and set host_or_vservers to 'host'. +## 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 +## Sets, respectively, $host_or_vservers to 'host', 'vservers', or 'both' +## $host_or_vservers is unset when a new helper is run. +## Returns 1 if cancelled. +## +host_or_vservers_chooser() { + local title=$1 + # exit silently if vservers are not enabled + if [ "$vservers" != "yes" ]; then + host_or_vservers='host' + return + fi + # 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 +} + +## +## If the argument is the name of a vserver selected for backup (in +## $vservers_chooser_vsnames), 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 $vservers_chooser_vsnames ; 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 among "all vservers" and a not-empty subset of these. +## Sets global $vservers_chooser_vsnames variable to "all" or to a +## space-separated name list. +## Depends on host_or_vservers() to have already run. +## $vservers_chooser_vsnames is unset when a new helper is run. +## Returns 1 if cancelled. +## +vservers_chooser() { + local title=$1 + local i= + [ -n "$VROOTDIR" ] || (msgBox "warning" "VROOTDIR is not set in $conffile and could not be guessed."; return 1) + [ -d "$VROOTDIR" ] || (msgBox "warning" "VROOTDIR ($VROOTDIR) does not exist."; return 1) + + booleanBox "$title" "Do you want to backup all vservers?" ` [ -z "$vservers_chooser_vsnames" -o "$vservers_chooser_vsnames" == "all" ] || echo no` + if [ $? = 0 ]; then + vservers_chooser_vsnames="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 `ls $VROOTDIR | grep -E -v "lost+found|ARCHIVES"`; do + listItem "$vserver" "Backup $vserver vserver" `vserver_is_selected $vserver` + done + listDisplay checklist + [ $? = 0 ] || return 1 + done + # remove quotes around each vserver name + vservers_chooser_vsnames=`echo $REPLY | tr -d '"'` + fi +} + +##################################################### ## begin program if [ ! -x "`which dialog`" ]; then @@ -182,64 +280,51 @@ if [ ! -x "`which dialog`" ]; then done fi +# bootstrap conffile="@CFGDIR@/backupninja.conf" if [ ! -r "$conffile" ]; then echo "Configuration file $conffile not found." exit 1 fi -# find $scriptdir -scriptdir=`grep scriptdirectory $conffile | awk '{print $3}'` -if [ -z "$scriptdir" ]; then - if [ -d "@datadir@" ]; then - scriptdir="@datadir@" - else - echo "Could not find entry 'scriptdirectory' in $conffile" - exit 1 - fi -else - if [ ! -d "$scriptdir" ]; then - echo "Script directory $scriptdir not found." - exit 1 - fi -fi - -# find $libdir -libdir=`grep libdirectory $conffile | awk '{print $3}'` -if [ -z "$libdir" ]; then +# find $libdirectory +libdirectory=`grep '^libdirectory' $conffile | awk '{print $3}'` +if [ -z "$libdirectory" ]; then if [ -d "@libdir@" ]; then - libdir="@libdir@" + libdirectory="@libdir@" else echo "Could not find entry 'libdirectory' in $conffile." exit 1 fi else - if [ ! -d "$libdir" ]; then - echo "Lib directory $libdir not found." + if [ ! -d "$libdirectory" ]; then + echo "Lib directory $libdirectory not found." exit 1 fi fi -configdirectory=`grep configdirectory $conffile | awk '{print $3}'` -if [ ! -n "$configdirectory" ]; then - echo "Cound not find entry 'configdirectory' in $conffile" - exit 1 -fi -if [ ! -d "$configdirectory" ]; then - echo "Configuration directory $configdirectory not found." - exit 1 -fi - -. $libdir/easydialog +# include shared functions +. $libdirectory/easydialog +. $libdirectory/tools +# am I running as root? if [ "$UID" != "0" ]; then - msgBox "warning" "ninjahelper must be run by root!" + msgBox "warning" "$0 must be run by root!" exit 1 fi +# get global config options (second param is the default) +setfile $conffile +getconf configdirectory @CFGDIR@/backup.d +getconf scriptdirectory @datadir@ +getconf vservers no +getconf VSERVERINFO /usr/sbin/vserver-info +getconf VSERVER /usr/sbin/vserver +getconf VROOTDIR `if [ -f "$VSERVERINFO" ]; then $VSERVERINFO info SYSINFO |grep vserver-Rootdir | awk '{print $2}'; fi` + # load all the helpers HELPERS="" -for file in `find $scriptdir -follow -name '*.helper'`; do +for file in `find $scriptdirectory -follow -name '*.helper'`; do check_perms $file . $file done |