Finish up and move out
authorMicah Anderson <micah@riseup.net>
Wed, 26 Oct 2005 23:19:57 +0000 (23:19 +0000)
committerMicah Anderson <micah@riseup.net>
Wed, 26 Oct 2005 23:19:57 +0000 (23:19 +0000)
backupninja [deleted file]
ninjahelper [deleted file]

diff --git a/backupninja b/backupninja
deleted file mode 100755 (executable)
index d653144..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-#!/bin/bash
-#                          |\_
-# B A C K U P N I N J A   /()/
-#                         `\|
-#
-# Copyright (C) 2004-05 riseup.net -- property is theft.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-
-#####################################################
-## FUNCTIONS
-
-function setupcolors() {
-       BLUE="\033[34;01m"
-       GREEN="\033[32;01m"
-       YELLOW="\033[33;01m"
-       PURPLE="\033[35;01m"
-       RED="\033[31;01m"
-       OFF="\033[0m"
-       CYAN="\033[36;01m"
-       COLORS=($BLUE $GREEN $YELLOW $RED $PURPLE)
-}
-
-function colorize() {
-       if [ "$usecolors" == "yes" ]; then
-               local typestr=`echo "$@" | sed 's/\(^[^:]*\).*$/\1/'`
-               [ "$typestr" == "Debug" ] && type=0
-               [ "$typestr" == "Info" ] && type=1
-               [ "$typestr" == "Warning" ] && type=2
-               [ "$typestr" == "Error" ] && type=3
-               [ "$typestr" == "Fatal" ] && type=4
-               color=${COLORS[$type]}
-               endcolor=$OFF
-               echo -e "$color$@$endcolor"
-       else
-               echo -e "$@"
-       fi
-}
-
-# We have the following message levels:
-# 0 - debug - blue
-# 1 - normal messages - green
-# 2 - warnings - yellow
-# 3 - errors - orange
-# 4 - fatal - red
-# First variable passed is the error level, all others are printed
-
-# if 1, echo out all warnings, errors, or fatal
-# used to capture output from handlers
-echo_debug_msg=0
-
-usecolors=yes
-
-function printmsg() {
-       [ ${#@} -gt 1 ] || return
-
-       type=$1
-       shift
-       if [ $type == 100 ]; then
-               typestr=`echo "$@" | sed 's/\(^[^:]*\).*$/\1/'`
-               [ "$typestr" == "Debug" ] && type=0
-               [ "$typestr" == "Info" ] && type=1
-               [ "$typestr" == "Warning" ] && type=2
-               [ "$typestr" == "Error" ] && type=3
-               [ "$typestr" == "Fatal" ] && type=4
-               typestr=""
-       else
-               types=(Debug Info Warning Error Fatal)
-               typestr="${types[$type]}: "
-       fi
-       
-       print=$[4-type]
-       
-       if [ $echo_debug_msg == 1 ]; then
-               echo -e "$typestr$@" >&2
-       elif [ $debug ]; then
-               colorize "$typestr$@" >&2
-       fi
-       
-       if [ $print -lt $loglevel ]; then
-               logmsg "$typestr$@"
-       fi
-}
-
-function logmsg() {
-       if [ -w "$logfile" ]; then
-               echo -e `date "+%h %d %H:%M:%S"` "$@" >> $logfile
-       fi
-}
-
-function passthru() {
-       printmsg 100 "$@"
-}
-function debug() {
-       printmsg 0 "$@"
-}
-function info() {
-       printmsg 1 "$@"
-}
-function warning() {
-       printmsg 2 "$@"
-}
-function error() {
-       printmsg 3 "$@" 
-}
-function fatal() {
-       printmsg 4 "$@"
-       exit 2
-}
-
-msgcount=0
-function msg {
-       messages[$msgcount]=$1
-       let "msgcount += 1"
-}
-
-function setfile() {
-       CURRENT_CONF_FILE=$1
-}
-
-function setsection() {
-       CURRENT_SECTION=$1
-}
-
-
-#
-# create a temporary file in a secure way.
-#
-function maketemp() {
-       if [ -x /bin/mktemp ]
-       then
-               local tempfile=`mktemp /tmp/$1.XXXXXXXX`
-       else
-               DATE=`date`
-               sectmp=`echo $DATE | /usr/bin/md5sum | cut -d- -f1`
-               local tempfile=/tmp/$1.$sectmp
-       fi
-       echo $tempfile
-}
-
-
-#
-# 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.
-#
-
-function check_perms() {
-       local file=$1
-       local perms=`ls -ld $file`
-       perms=${perms:4:6}
-       if [ "$perms" != "------" ]; then
-               echo "Configuration files must not be group or world writable/readable! Dying on file $file"
-               fatal "Configuration files must not be group or world writable/readable! Dying on file $file"
-       fi
-       if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
-               echo "Configuration files must be owned by root! Dying on file $file"
-               fatal "Configuration files must be owned by root! Dying on file $file"
-       fi
-}
-
-# simple lowercase function
-function tolower() {
-       echo "$1" | tr [:upper:] [:lower:]
-}
-
-# simple to integer function
-function toint() {
-       echo "$1" | tr [:alpha:] -d 
-}
-
-#
-# function isnow(): returns 1 if the time/day passed as $1 matches
-# the current time/day.
-#
-# format is <day> at <time>:
-#   sunday at 16
-#   8th at 01
-#   everyday at 22
-#
-
-# we grab the current time once, since processing
-# all the configs might take more than an hour.
-nowtime=`date +%H`
-nowday=`date +%d`
-nowdayofweek=`date +%A`
-nowdayofweek=`tolower "$nowdayofweek"`
-
-function isnow() {
-       local when="$1"
-       set -- $when
-       whendayofweek=$1; at=$2; whentime=$3;
-       whenday=`toint "$whendayofweek"`
-       whendayofweek=`tolower "$whendayofweek"`
-       whentime=`echo "$whentime" | sed 's/:[0-9][0-9]$//' | sed -r 's/^([0-9])$/0\1/'`
-
-       if [ "$whendayofweek" == "everyday" -o "$whendayofweek" == "daily" ]; then
-               whendayofweek=$nowdayofweek
-       fi
-
-       if [ "$whenday" == "" ]; then
-               if [ "$whendayofweek" != "$nowdayofweek" ]; then
-                       whendayofweek=${whendayofweek%s}
-                       if [ "$whendayofweek" != "$nowdayofweek" ]; then
-                               return 0
-                       fi
-               fi
-       elif [ "$whenday" != "$nowday" ]; then
-               return 0
-       fi
-
-       [ "$at" == "at" ] || return 0
-       [ "$whentime" == "$nowtime" ] || return 0
-
-       return 1
-}
-
-function usage() {
-       cat << EOF
-$0 usage:
-This script allows you to coordinate system backup by dropping a few
-simple configuration files into /etc/backup.d/. Typically, this
-script is run hourly from cron.
-
-The following options are available:
--h, --help           This usage message
--d, --debug          Run in debug mode, where all log messages are
-                     output to the current shell.
--f, --conffile FILE  Use FILE for the main configuration instead
-                     of /etc/backupninja.conf
--t, --test           Test run mode. This will test if the backup
-                     could run, without actually preforming any
-                     backups. For example, it will attempt to authenticate
-                     or test that ssh keys are set correctly.
--n, --now            Perform actions now, instead of when they might
-                     be scheduled. No output will be created unless also
-                     run with -d.
-    --run FILE       Execute the specified action file and then exit.    
-                     Also puts backupninja in debug mode.
-                     
-When in debug mode, output to the console will be colored:
-EOF
-       debug=1
-       debug   "Debugging info (when run with -d)"
-       info    "Informational messages (verbosity level 4)"
-       warning "Warnings (verbosity level 3 and up)"
-       error   "Errors (verbosity level 2 and up)"
-       fatal   "Fatal, halting errors (always shown)"
-}
-
-##
-## this function handles the running of a backup action
-##
-## these globals are modified:
-## fatals, errors, warnings, actions_run, errormsg
-##
-
-function process_action() {
-       local file="$1"
-       local suffix="$2"
-       local run="no"
-       setfile $file
-
-       # skip over this config if "when" option
-       # is not set to the current time.
-       getconf when "$defaultwhen"
-       if [ "$processnow" == 1 ]; then
-               info ">>>> starting action $file (because of --now)"
-               run="yes"
-       elif [ "$when" == "hourly" ]; then
-               info ">>>> starting action $file (because 'when = hourly')"
-               run="yes"
-       else
-               IFS=$'\t\n'
-               for w in $when; do
-                       IFS=$' \t\n'
-                       isnow "$w"
-                       ret=$?
-                       IFS=$'\t\n'
-                       if [ $ret == 0 ]; then
-                               debug "skipping $file because it is not $w"
-                       else
-                               info ">>>> starting action $file (because it is $w)"
-                               run="yes"
-                       fi
-               done
-               IFS=$' \t\n'
-       fi
-       debug $run
-       [ "$run" == "no" ] && return
-       
-       let "actions_run += 1"
-
-       # call the handler:
-       local bufferfile=`maketemp backupninja.buffer`
-       echo "" > $bufferfile
-       echo_debug_msg=1
-       (
-               . $scriptdir/$suffix $file
-       ) 2>&1 | (
-               while read a; do
-                       echo $a >> $bufferfile
-                       [ $debug ] && colorize "$a"
-               done
-       )
-       retcode=$?
-       # ^^^^^^^^ we have a problem! we can't grab the return code "$?". grrr.
-       echo_debug_msg=0
-
-       _warnings=`cat $bufferfile | grep "^Warning: " | wc -l`
-       _errors=`cat $bufferfile | grep "^Error: " | wc -l`
-       _fatals=`cat $bufferfile | grep "^Fatal: " | wc -l`
-       
-       ret=`grep "\(^Warning: \|^Error: \|^Fatal: \)" $bufferfile`
-       rm $bufferfile
-       if [ $_fatals != 0 ]; then
-               msg "*failed* -- $file"
-               errormsg="$errormsg\n== fatal errors from $file ==\n\n$ret\n"
-               passthru "Fatal: <<<< finished action $file: FAILED"
-       elif [ $_errors != 0 ]; then
-               msg "*error* -- $file"
-               errormsg="$errormsg\n== errors from $file ==\n\n$ret\n"
-               error "<<<< finished action $file: ERROR"
-       elif [ $_warnings != 0 ]; then
-               msg "*warning* -- $file"
-               errormsg="$errormsg\n== warnings from $file ==\n\n$ret\n"
-               warning "<<<< finished action $file: WARNING"
-       else
-               msg "success -- $file"
-               info "<<<< finished action $file: SUCCESS"
-       fi
-
-       let "fatals += _fatals"
-       let "errors += _errors"
-       let "warnings += _warnings"     
-}
-
-#####################################################
-## MAIN
-
-setupcolors
-conffile="/etc/backupninja.conf"
-loglevel=3
-
-## process command line options
-
-while [ $# -ge 1 ]; do
-       case $1 in
-               -h|--help) usage;;
-               -d|--debug) debug=1;;
-               -t|--test) test=1;debug=1;;
-               -n|--now) processnow=1;;
-               -f|--conffile)
-                       if [ -f $2 ]; then
-                               conffile=$2
-                       else
-                               echo "-f|--conffile option must be followed by an existing filename"
-                               fatal "-f|--conffile option must be followed by an existing filename"
-                               usage
-                       fi
-                       # we shift here to avoid processing the file path 
-                       shift
-                       ;;
-               --run)
-                       debug=1
-                       if [ -f $2 ]; then
-                               singlerun=$2
-                               processnow=1
-                       else
-                               echo "--run option must be fallowed by a backupninja action file"
-                               fatal "--run option must be fallowed by a backupninja action file"
-                               usage
-                       fi
-                       shift
-                       ;;
-               *)
-                       debug=1
-                       echo "Unknown option $1"
-                       fatal "Unknown option $1"
-                       usage
-                       exit
-                       ;;
-       esac
-       shift
-done                                                                                                                                                                                                           
-
-#if [ $debug ]; then
-#      usercolors=yes
-#fi
-
-## Load and confirm basic configuration values
-
-# bootstrap
-if [ ! -r "$conffile" ]; then
-       echo "Configuration file $conffile not found." 
-       fatal "Configuration file $conffile not found."
-fi
-
-scriptdir=`grep scriptdirectory $conffile | awk '{print $3}'`
-if [ ! -n "$scriptdir" ]; then
-       echo "Cound not find entry 'scriptdirectory' in $conffile" 
-       fatal "Cound not find entry 'scriptdirectory' in $conffile"
-fi
-
-if [ ! -d "$scriptdir" ]; then
-       echo "Script directory $scriptdir not found." 
-       fatal "Script directory $scriptdir not found."
-fi
-
-setfile $conffile
-
-# get global config options (second param is the default)
-getconf configdirectory /etc/backup.d
-getconf reportemail
-getconf reportsuccess yes
-getconf reportwarning yes
-getconf loglevel 3
-getconf when "Everyday at 01:00"
-defaultwhen=$when
-getconf logfile /var/log/backupninja.log
-getconf usecolors "yes"
-getconf SLAPCAT /usr/sbin/slapcat
-getconf LDAPSEARCH /usr/bin/ldapsearch
-getconf RDIFFBACKUP /usr/bin/rdiff-backup
-getconf MYSQL /usr/bin/mysql
-getconf MYSQLHOTCOPY /usr/bin/mysqlhotcopy
-getconf MYSQLDUMP /usr/bin/mysqldump
-getconf PGSQLDUMP /usr/bin/pg_dump
-getconf PGSQLDUMPALL /usr/bin/pg_dumpall
-getconf GZIP /bin/gzip
-getconf RSYNC /usr/bin/rsync
-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`
-
-if [ ! -d "$configdirectory" ]; then
-       echo "Configuration directory '$configdirectory' not found."
-       fatal "Configuration directory '$configdirectory' not found."
-fi
-
-[ -f "$logfile" ] || touch $logfile
-
-if [ "$UID" != "0" ]; then
-       echo "$0 can only be run as root"
-       exit 1
-fi
-
-if [ "$vservers" == "yes" -a ! -d "$VROOTDIR" ]; then
-       echo "vservers option set in config, but $VROOTDIR is not a directory!"
-       fatal "vservers option set in config, but $VROOTDIR is not a directory!"
-fi
-
-## Process each configuration file
-
-# by default, don't make files which are world or group readable.
-umask 077
-
-# these globals are set by process_action()
-fatals=0
-errors=0
-warnings=0
-actions_run=0
-errormsg=""
-
-if [ "$singlerun" ]; then
-       files=$singlerun
-else
-       files=`find $configdirectory -mindepth 1 ! -name '.*.swp' | sort -n`
-fi
-
-for file in $files; do
-       [ -f "$file" ] || continue
-
-       check_perms $file
-       suffix="${file##*.}"
-       base=`basename $file`
-       if [ "${base:0:1}" == "0" -o "$suffix" == "disabled" ]; then
-               info "Skipping $file"
-               continue
-       fi
-
-       if [ -e "$scriptdir/$suffix" ]; then
-               process_action $file $suffix
-       else
-               error "Can't process file '$file': no handler script for suffix '$suffix'"
-               msg "*missing handler* -- $file"
-       fi
-done
-
-## mail the messages to the report address
-
-if [ $actions_run == 0 ]; then doit=0
-elif [ "$reportemail" == "" ]; then doit=0
-elif [ $fatals != 0 ]; then doit=1
-elif [ $errors != 0 ]; then doit=1
-elif [ "$reportsuccess" == "yes" ]; then doit=1
-elif [ "$reportwarning" == "yes" -a $warnings != 0 ]; then doit=1
-else doit=0
-fi
-
-if [ $doit == 1 ]; then
-       debug "send report to $reportemail"
-       hostname=`hostname`
-       [ $warnings == 0 ] || subject="WARNING"
-       [ $errors == 0 ] || subject="ERROR"
-       [ $fatals == 0 ] || subject="FAILED"
-       
-       {
-               for ((i=0; i < ${#messages[@]} ; i++)); do
-                       echo ${messages[$i]}
-               done
-               echo -e "$errormsg"
-       } | mail $reportemail -s "backupninja: $hostname $subject"
-fi
-
-if [ $actions_run != 0 ]; then
-       info "FINISHED: $actions_run actions run. $fatals fatal. $errors error. $warnings warning."
-fi
diff --git a/ninjahelper b/ninjahelper
deleted file mode 100755 (executable)
index 13a4ca9..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-#!/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