mirror of
https://0xacab.org/liberate/backupninja.git
synced 2024-11-23 11:13:18 +01:00
a116f435ce
added more verbage to ninjahelper added some IFS=$'' to easydialog (this allows you to pass through blank lines).
262 lines
5.9 KiB
Bash
Executable File
262 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
####################################################
|
|
## Functions
|
|
|
|
function check_perms() {
|
|
local file=$1
|
|
local perms=`ls -ld $file`
|
|
group_w_perm=${perms:5:1}
|
|
world_w_perm=${perms:8:1}
|
|
if [ "$group_w_perm" == "w" -o "$world_w_perm" == "w" ]; then
|
|
echo $perms
|
|
echo "helper scripts must not be group or world writable! Dying on file $file"
|
|
exit
|
|
fi
|
|
if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
|
|
echo "helper scripts must be owned by root! Dying on file $file"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
|
|
##
|
|
## returns the next available file name given a file
|
|
## in the form /etc/backup.d/10.sys
|
|
## sets variable $returned_filename
|
|
##
|
|
get_next_filename() {
|
|
next_filename=$1
|
|
dir=`dirname $next_filename`
|
|
file=`basename $next_filename`
|
|
number=${file:0:2}
|
|
suffix=${file:3}
|
|
while [ -f $next_filename ]; do
|
|
let "number += 1"
|
|
next_filename="$dir/$number.$suffix"
|
|
done
|
|
}
|
|
|
|
##
|
|
## installs packages (passed in as $@) if not present
|
|
##
|
|
require_packages() {
|
|
for pkg in "$@"; do
|
|
installed=`dpkg -s $pkg | grep 'ok installed'`
|
|
if [ -z "$installed" ]; then
|
|
booleanBox "install $pkg?" "This backup action requires package $pkg. Do you want to install it now?"
|
|
if [ $? = 0 ]; then
|
|
apt-get install $pkg
|
|
echo "hit return to continue...."
|
|
read
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
##
|
|
## menu for the wizards
|
|
##
|
|
donew() {
|
|
listBegin "new action menu" "select an action to create"
|
|
listItem return "return to main menu"
|
|
for data in $HELPERS; do
|
|
data=${data//_/ }
|
|
helper_function=${data%%:*}
|
|
helper_info=${data##*:}
|
|
listItem $helper_function "$helper_info"
|
|
done
|
|
listDisplay menu
|
|
|
|
[ $? = 1 ] && return
|
|
result="$REPLY"
|
|
[ "$result" = "return" ] && return
|
|
result=${result}_wizard
|
|
$result
|
|
}
|
|
|
|
do_rm_action() {
|
|
booleanBox "remove action" "Are you sure you want to remove action file $1?"
|
|
if [ $? = 0 ]; then
|
|
rm $1;
|
|
fi
|
|
}
|
|
|
|
do_run() {
|
|
backupninja --run $1
|
|
echo "Hit return to continue..."
|
|
read
|
|
}
|
|
|
|
do_xedit() {
|
|
if [ -z "$EDITOR" -o ! -x "`which $EDITOR`" ]; then
|
|
if [ -h /etc/alternatives/editor -a -x "`readlink /etc/alternatives/editor`" ]; then
|
|
EDITOR="`readlink /etc/alternatives/editor`"
|
|
elif [ -x "`which nano`" ]; then
|
|
EDITOR="`which nano`"
|
|
elif [ -x "`which vim`" ]; then
|
|
EDITOR="`which vim`"
|
|
elif [ -x "`which vi`" ]; then
|
|
EDITOR="`which vi`"
|
|
else
|
|
echo "No suitable editor found."
|
|
echo "Please define $EDITOR or configure /etc/alternatives/editor."
|
|
exit
|
|
fi
|
|
fi
|
|
$EDITOR $1
|
|
}
|
|
|
|
do_run_test() {
|
|
backupninja --test --run $1
|
|
echo "Hit return to continue..."
|
|
read
|
|
}
|
|
|
|
do_disable() {
|
|
mv $1 $1.disabled
|
|
}
|
|
|
|
do_enable() {
|
|
mv $1 ${1%.*}
|
|
}
|
|
|
|
do_rename() {
|
|
dir=`dirname $1`
|
|
filename=`basename $1`
|
|
inputBox "rename action" "enter a new filename" $filename
|
|
mv $dir/$filename $dir/$REPLY
|
|
}
|
|
|
|
doaction() {
|
|
action=$1
|
|
base=`basename $action`
|
|
if [ "${base##*.}" == "disabled" ]; then
|
|
enable="enable";
|
|
else
|
|
enable="disable";
|
|
fi
|
|
while true; do
|
|
menuBox "action menu" "$action $first" \
|
|
main "return to main menu" \
|
|
view "view configuration" \
|
|
xedit "launch external editor" \
|
|
$enable "$enable action" \
|
|
name "change the filename" \
|
|
run "run this action now" \
|
|
test "test connections and passwords only" \
|
|
kill "remove this action"
|
|
[ $? = 1 ] && return;
|
|
result="$REPLY"
|
|
case "$result" in
|
|
"view") dialog --textbox $action 0 0;;
|
|
"xedit") do_xedit $action;;
|
|
"disable") do_disable $action; return;;
|
|
"enable") do_enable $action; return;;
|
|
"name") do_rename $action; return;;
|
|
"run") do_run $action;;
|
|
"test") do_run_test $action;;
|
|
"kill") do_rm_action $action; return;;
|
|
"main") return;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
#####################################################
|
|
## begin program
|
|
|
|
if [ ! -x "`which dialog`" ]; then
|
|
echo "ninjahelper is a menu based wizard for backupninja."
|
|
echo "It requires 'dialog' in order to run. Do you want to install dialog now?"
|
|
while true; do
|
|
echo -n "(yes/no): "
|
|
read install
|
|
if [ "$install" == "yes" ]; then
|
|
apt-get install dialog
|
|
break
|
|
elif [ "$install" == "no" ]; then
|
|
exit
|
|
else
|
|
echo "You must answer 'yes' or 'no'"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
conffile="/etc/backupninja.conf"
|
|
if [ ! -r "$conffile" ]; then
|
|
echo "Configuration file $conffile not found."
|
|
exit 1
|
|
fi
|
|
scriptdir=`grep scriptdirectory $conffile | awk '{print $3}'`
|
|
if [ ! -n "$scriptdir" ]; then
|
|
echo "Cound not find entry 'scriptdirectory' in $conffile"
|
|
exit 1
|
|
fi
|
|
if [ ! -d "$scriptdir" ]; then
|
|
echo "Script directory $scriptdir not found."
|
|
exit 1
|
|
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
|
|
|
|
. $scriptdir/easydialog.sh
|
|
|
|
if [ "$UID" != "0" ]; then
|
|
msgBox "warning" "ninjahelper must be run by root!"
|
|
exit 1
|
|
fi
|
|
|
|
# load all the helpers
|
|
HELPERS=""
|
|
for file in `find $scriptdir -follow -name '*.helper'`; do
|
|
check_perms $file
|
|
. $file
|
|
done
|
|
|
|
setApplicationTitle "ninjahelper"
|
|
setDimension 75 19
|
|
|
|
#####################################################
|
|
## main event loop
|
|
|
|
while true; do
|
|
|
|
menulist=
|
|
action=
|
|
let "i = 1"
|
|
for file in `find $conf/etc/backup.d/ -type f | sort -n`; do
|
|
menulist="$menulist $i $file"
|
|
actions[$i]=$file
|
|
let "i += 1"
|
|
done
|
|
|
|
menuBox "main menu" "Select a backup action for more options, or create a new action:" $menulist \
|
|
new "create a new backup action" \
|
|
quit "leave ninjahelper"
|
|
|
|
[ $? = 1 -o $? = 255 ] && exit 0;
|
|
|
|
choice="$REPLY"
|
|
if [ "$choice" == "new" ]; then
|
|
donew;
|
|
elif [ "$choice" == "quit" ]; then
|
|
exit 0;
|
|
else
|
|
action=${actions[$choice]};
|
|
if [ -f "$action" ]; then
|
|
doaction $action
|
|
else
|
|
msgBox "error" "error: cannot find the file '$action'"
|
|
fi
|
|
fi
|
|
|
|
|
|
done
|