#!/bin/sh
# Filename:      dirvish-setup
# Purpose:       create basic setup for dirvish(8)
# Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
################################################################################
# Resources:
#   http://apt-get.dk/howto/backup/
#   http://edseek.com/~jasonb/articles/dirvish_backup/advanced.html
#   http://www.dirvish.org/svn/contrib/admin/DailyEmailScript/dirvish-status.sh
################################################################################

set -e

# shellcheck disable=SC1091
. /etc/grml/script-functions
# shellcheck disable=SC1091
. /etc/grml/lsb-functions

check4root
check4progs dialog dirvish rsync ssh-keygen ssh-copy-id

PN="$0"
CONFFILE=/etc/dirvish/master.conf

set +e

write_conffile() {
  if [ -f "$CONFFILE" ] ; then
     MASTERINFO="Notice: $CONFFILE exists already so I will not touch it.
Please do not forget to add $CLIENT to the file if you wan to use the 'Runall' functionality."
  else
     MASTERINFO="An initial master configuration ($CONFFILE) has been generated.
Please adjust it according to your needs."
     cat > $CONFFILE << EOF
# Master configuration file for dirvish, created by $PN on $(date)

bank:
     $BACKUP_DIR

exclude:
      lost+found/
#      core
#      *~
#      .nfs*
#      /var/lib/nfs/*tab
#      var/cache/apt/archives
#      var/cache/man
#      var/tmp
#      tmp
#      /dev
#      .kde/share/cache/*
#      .firefox/default/*/Cache/*

Runall:
     $CLIENT 22:00
     # add-another-client-here 22:00

     # See http://www.dirvish.org/debian.howto.html for further details:
expire-default: +30 days
expire-rule:
#       MIN HR    DOM MON       DOW  STRFTIME_FMT
        *   *     *   *         1    +3 months
        *   *     1-7 *         1    +1 year
        *   *     1-7 1,4,7,10  1
        *   10-20 *   *         *    +4 days
#       *   *     *   *         2-7  +15 days

EOF
  fi
}

# TODO / integrate?
cronsetup() {
# shellcheck disable=SC1090
  test -f "${HOME}/.keychain/$(uname -n)-sh" && . "${HOME}/.keychain/$(uname -n)-sh"
}

get_backup_dir() {
  # prompt user for directory which should be used
  BACKUP_DIR="$(dialog --stdout --inputbox 'Please choose the directory where backups should be placed' 0 0 /backups)"

  if ! [ -d "$BACKUP_DIR" ] ; then
    dialog --stdout --title "${PN}" --yesno "The directory $BACKUP_DIR does not yet exist. Do you want me to create it for you? " 0 0
    RC=$?

    if [ ${RC} -eq 0 ]; then
       echo "mkdir $BACKUP_DIR"
       echo "chmod 700 $BACKUP_DIR"
    else
       echo "warning: $BACKUP_DIR does not exist, skipped creation as requested"
    fi
  fi
}

client_name() {
  CLIENT="$(dialog --stdout --inputbox 'Please choose the name for your client instance, also known as vault' 0 0 client1)"
}

tree_name() {
  TREE="$(dialog --stdout --inputbox 'Please choose the directory you want to backup from your client (also known as tree)' 0 0 /home)"
}

create_client_conf() {
  mkdir -p "${BACKUP_DIR}/${CLIENT}/dirvish"
  if [ -f "${BACKUP_DIR}/${CLIENT}/dirvish/default.conf" ] ; then
     ewarn "Warning: ${BACKUP_DIR}/${CLIENT}/dirvish/default.conf exists already, ignoring creation." ; eend 0
  else
     cat > "${BACKUP_DIR}/${CLIENT}/dirvish/default.conf" << EOF
# Configuration file of client-side for dirvish created by $PN on $(date)
client: $CLIENTNAME
tree: $TREE
xdev: true
index: gzip
image-default: %Y-%m-%d
exclude:
        var/cache/apt/archives/*
        var/cache/man/*
        tmp/*
        var/tmp/*
rsh: ssh -i $HOME/.ssh/id_rsa_dirvish_${CLIENT}
EOF
  fi
}

sshkey_setup() {
  CLIENTNAME="$(dialog --stdout --inputbox 'Please choose user login and hostname for the client you want to backup. Syntax: user@host' 0 0 root@"$(hostname)")"

  dialog --stdout --title "${PN}" --yesno "Do you want me to create ssh setup for client ${CLIENTNAME} using ssh-keygen and ssh-copy-id?" 0 0
  RC=$?

  if [ ${RC} -eq 0 ]; then
     [ -d "$HOME/.ssh" ] || mkdir "$HOME/.ssh"
     einfo "Creating $HOME/.ssh/id_rsa_dirvish_${CLIENT} using ssh-keygen:"
     ssh-keygen -t rsa -f "$HOME/.ssh/id_rsa_dirvish_${CLIENT}" ; eend $?
     einfo "Running ssh-copy-id to copy ssh key to $CLIENTNAME:"
     ssh-copy-id -i "$HOME/.ssh/id_rsa_dirvish_${CLIENT}.pub" "$CLIENTNAME" ; eend $?
  fi
}

client_setup() {
  dialog --stdout --title "${PN}" --yesno "Do you want to backup $CLIENT via network? Answering with no will use localhost [$(hostname)] as client." 0 0
  RC=$?

  if [ ${RC} -eq 0 ]; then
     sshkey_setup
  else
     CLIENTNAME=$(hostname) # use localhost only
  fi
}

display_info() {
  einfo "Running $PN was successful. Enjoy using dirvish!" ; eend 0
  echo
  einfo "Please adjust ${BACKUP_DIR}/${CLIENT}/dirvish/default.conf according to your needs.
$MASTERINFO
Then run the following command to create an initial backup:

  dirvish --summary long --vault $CLIENT --init

Find the backup inside $BACKUP_DIR/$CLIENT/$(date +%Y-%m-%d)/tree/ then.

Documentation available at:

    man dirvish-locate.1 dirvish.conf.5 dirvish.8 dirvish-runall.8 dirvish-expire.8
    /usr/share/doc/dirvish/HOWTO.upstream /usr/share/doc/dirvish/FAQ.html
    /usr/share/doc/dirvish/HOWTO.Debian.gz

    http://www.dirvish.org/
    http://wiki.dirvish.org/

Please report bugs regarding ${PN}: http://grml.org/bugs/
" ; eend 0
}

case "$1" in
    -h | --help | --h* )
      echo "Usage: $PN" 1>&2
      exit 1
     ;;
esac

# now run the functions:
get_backup_dir     && \
client_name        && \
tree_name          && \
client_setup       && \
create_client_conf && \
write_conffile     && \
display_info

## END OF FILE #################################################################
# vim: ft=sh ai tw=80 expandtab
