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  | 
