made it so that helpers are dynamically defined.
authorElijah Saxon <elijah@riseup.net>
Fri, 8 Jul 2005 19:21:46 +0000 (19:21 +0000)
committerElijah Saxon <elijah@riseup.net>
Fri, 8 Jul 2005 19:21:46 +0000 (19:21 +0000)
README
backupninja
handlers/easydialog.sh
handlers/ldap.helper
handlers/mysql.helper
handlers/rdiff.helper
handlers/sys.helper
ninjahelper

diff --git a/README b/README
index 13c89bf05e6bf62b7afefdc58ef6f1ede49f0145..80e9f073d22cd4cd81ea2167f2573a2cab668587 100644 (file)
--- a/README
+++ b/README
@@ -222,3 +222,27 @@ VSERVERINFO (default: /usr/sbin/vserver-info)
 VSERVER (default: /usr/sbin/vserver)
 VROOTDIR (default: `$VSERVERINFO info SYSINFO |grep vserver-Rootdir | awk '{print $2}'; fi`)
 
+NINJAHELPER
+===========
+
+Ninjahelper is an additional script which will walk you through the process of
+configuring backupninja. Ninjahelper has a menu driven curses based interface
+(using dialog). 
+
+To add an additional 'wizard' to ninjahelper, follow these steps:
+
+(1) to add a helper for the handler "blue", create the file
+    blue.helper in the directory where the handlers live.
+    (ie /usr/share/backupninja).
+
+(2) next, you need to add your helper to the global HELPERS variable
+    and define the main function for your helper (the function name
+    is always <helper>_wizard). for example, blue.helper:
+       HELPERS="$HELPERS blue:description_of_this_helper
+       blue_wizard() {
+         ... do work here ...
+       }
+
+(3) check the examples of the included helpers to see how they are
+    written. The dialog functions are defined in easydialog.sh.
+
index 804c1c228285c5099849529237a69ba7dc9d475f..a1bfabc61e3d89336968e08a40a02afc059e02de 100755 (executable)
@@ -163,8 +163,8 @@ function check_perms() {
        local perms=`ls -ld $file`
        perms=${perms:4:6}
        if [ "$perms" != "------" ]; then
-               echo "Configuration files must not be group or world readable! Dying on file $file"
-               fatal "Configuration files must not be group or world readable! Dying on file $file"
+               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"
index b96a5c1df5c511f11f6ae3c21d8b5292d6f883fd..5d70653a8f0d65c581cb515476ddd08e4ea54be8 100644 (file)
@@ -1,6 +1,7 @@
 #!/bin/bash
 
 # copyright 2002 lmoore@tump.com under the terms of the GNU LGPL.
+# additions 2005 collective@riseup.net
 
 # whiptail has trouble being called in the foo=$(whiptail ...) fashion for
 # some reason.  this is very annoying.  this means that we need to use
@@ -22,7 +23,7 @@ setApplicationTitle() {
 }
 
 setHelp() {
-  HELP="$@"
+    HELP="$@"
 }
 
 setDimension() {
@@ -99,6 +100,8 @@ menuBox() {
     _genericListBox --menu "$@"
 }
 
+## a menu box with additional help info displayed
+## at the bottom of the window when an item is selected
 menuBoxHelp() {
        HELP="--item-help"
        _genericListBox --menu "$@"
@@ -107,6 +110,7 @@ menuBoxHelp() {
        return $status
 }
 
+## a menu box with an addition button 'help'
 menuBoxHelpFile() {
        HELP="--help-button"
        _genericListBox --menu "$@"
@@ -115,7 +119,6 @@ menuBoxHelpFile() {
        return $status
 }
 
-
 checkBox() {
     _genericListBox --checklist "$@"
 }
@@ -140,8 +143,64 @@ passwordBox() {
     return $status
 }
 
+
+#########################################################
+## begin-item-display style lists
+## 
+## these lists are built by calling fuctions multiple times.
+## this can make it easier to build your list in a loop
+##
+
+listBegin() {
+   _menu_title=$1
+   _menu_msg=$2
+   _menu_items=0
+   _menu_text=
+   _menu_labels=
+}
+
+listItem() {
+   _menu_labels[$_menu_items]=$1
+   _menu_text[$_menu_items]=$2
+   let "_menu_items += 1"
+}
+
+
+##
+## takes one of:
+## menu, checklist, radiolist
+##
+listDisplay() {
+   boxtype=$1
+   local temp=$(mktemp -t) || exit 1
+   trap "rm -f $temp" 0
+   
+   (
+      echo -ne " $HELP $_DEFAULT "
+      echo -ne " --backtitle '$BACKTITLE' "
+      echo -ne " --title '$_menu_title' "
+      echo -ne " --$boxtype '$_menu_msg' "
+      echo -ne " $HEIGHT $WIDTH 10 "
+      for ((i=0; i < $_menu_items ; i++)); do
+        label=${_menu_labels[$i]}
+        text=${_menu_text[$i]}
+        echo -ne " $label '$text' "
+      done
+   ) | xargs $DIALOG 2> $temp
+   
+   local status=$?
+   REPLY=""
+   [ $status = 0 ] && REPLY=`cat $temp`
+   rm -f $temp
+   _DEFAULT=
+   return $status
+}
+
+####################################################
+## FORM
+
 _form_gap=2
-startForm() {
+formBegin() {
    _form_title=$1
    _form_items=0
    _form_labels=
@@ -154,7 +213,7 @@ formItem() {
    let "_form_items += 1"
 }
     
-displayForm() {
+formDisplay() {
    local temp=$(mktemp -t) || exit 1
    
    max_length=0
@@ -167,17 +226,13 @@ displayForm() {
    done
    let "max_length += 2"
     
-   local form=
    local xpos=1
    (
       echo -n -e "--form '$_form_title' 0 0 20"
       for ((i=0; i < $_form_items ; i++)); do
         label=${_form_labels[$i]}
         text=${_form_text[$i]}
-#        if [ "$text" == "" ]; then
-#           text='_empty_'
-#        fi
-        echo -n -e "$form $label $xpos 1 '$text' $xpos $max_length 30 30"
+        echo -n -e " $label $xpos 1 '$text' $xpos $max_length 30 30"
         let "xpos += _form_gap"
       done
    ) | xargs $DIALOG 2> $temp
index 44b08cb07a68ec3c039b57d160d8428d1ebef795..7670817d775b8d8568936e2ec151376338727dbd 100644 (file)
@@ -1,3 +1,4 @@
+HELPERS="$HELPERS ldap:ldap_database_backup"
 
 ldap_create_file() {
 while true; do
index 765f22889350b88e133605aefa1125e1ce7ad37d..759ee262f13ef48b2a7abebbf97dc03be4e75761 100644 (file)
@@ -1,3 +1,4 @@
+HELPERS="$HELPERS mysql:mysql_database_backup"
 
 do_mysql_user() {
   inputBox "mysql action wizard" "specify a system user:"
index 2efbe11b04f2994b9f877c65d7557cb96ddc33ca..2ad2a49201d88fe13a95daf8f8538c94f8406cd1 100644 (file)
@@ -1,10 +1,13 @@
+
+HELPERS="$HELPERS rdiff:incremental_remote_filesystem_backup"
+
 do_rdiff_dest() {
-   startForm "rdiff action wizard"
+   formBegin "rdiff action wizard"
      formItem "keep" "$rdiff_keep"
      formItem "dest_directory" "$rdiff_directory"
      formItem "dest_host" "$rdiff_host"
      formItem "dest_user" "$rdiff_user"
-   displayForm
+   formDisplay
    [ $? = 1 ] && return;
        
    set -- $REPLY
@@ -18,7 +21,7 @@ do_rdiff_dest() {
 }
 
 do_rdiff_src() {
-   startForm "rdiff action wizard: includes"
+   formBegin "rdiff action wizard: includes"
      formItem include /var/spool/cron/crontabs
      formItem include /var/backups
      formItem include /etc
@@ -29,7 +32,7 @@ do_rdiff_src() {
      formItem include 
      formItem include 
      formItem include 
-   displayForm
+   formDisplay
    [ $? = 1 ] && return;
 
    rdiff_includes=   
@@ -39,11 +42,11 @@ do_rdiff_src() {
    done
    set +o noglob
 
-   startForm "rdiff action wizard: excludes" 
+   formBegin "rdiff action wizard: excludes" 
      formItem exclude '/home/*/.gnupg'
      formItem exclude 
      formItem exclude 
-   displayForm
+   formDisplay
    [ $? = 1 ] && return;
 
    rdiff_excludes=
index 22eb01d0b7d9b601561c08fafaf74470138d5a6f..c97f53fd6a77b20660234958ce5a9d30a0574180 100644 (file)
@@ -1,3 +1,4 @@
+HELPERS="$HELPERS sys:general_hardware_and_system_info"
 
 sys_wizard() {
    require_packages hwinfo
index 9568b53b8197ec2e1abad75091731565e7496ae8..f4871830e0143f7fd653d9b9db308932a4765bb1 100755 (executable)
@@ -3,6 +3,22 @@
 ####################################################
 ## Functions
 
+function check_perms() {
+       local file=$1
+       local perms=`ls -ld $file`
+       perms=${perms:4:6}
+       if [[ "$perms" != "------" && "$perms" != "r--r--" ]]; 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
@@ -37,37 +53,25 @@ require_packages() {
     done
 }
 
-doradiobox() {
-       defaultchoice="red is.pretty on"
-       choices="green is_nice_too off blue i_love_blue off yellow is.bright off orange make.me.hungry off"
-       radioBox "radio title" "choose one color" $defaultchoice $choices
-       case $? in
-          0) ;;
-          1) echo "color choice cancelled..."; sleep 1;;
-          255) echo "something went wrong, exiting..."
-             exit 1 ;;
-       esac
-       result="$REPLY"
-       msgBox "message title" "you said $result."
-}
-
+##
+## menu for the wizards
+##
 donew() {
-    menuBox "new action menu" "select an action to create"  \
-      return "return to main menu" \
-      sys "general hardware and system info" \
-      mysql "mysql database backup" \
-      ldap "ldap database backup" \
-      rdiff "incremental filesystem backup"
-  
-    [ $? = 1 ] && return;
-    result="$REPLY"
-       case "$result" in
-          "sys") sys_wizard;; 
-          "mysql") mysql_wizard;;
-          "ldap") ldap_wizard;;
-          "rdiff") rdiff_wizard;;
-          "return") return;;
-       esac
+  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() {
@@ -172,7 +176,10 @@ if [ "$UID" != "0" ]; then
        exit 1
 fi
 
+# load all the helpers
+HELPERS=""
 for file in `find $scriptdir -follow -name '*.helper'`; do
+   check_perms $file
    . $file
 done