Merge "Add dogtag restore script and restore state"
diff --git a/dogtag/files/dogtag_restore.sh b/dogtag/files/dogtag_restore.sh
new file mode 100644
index 0000000..511c4d9
--- /dev/null
+++ b/dogtag/files/dogtag_restore.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+{%- from "dogtag/map.jinja" import server with context %}
+
+{%- if server.initial_data is defined %}
+{%- set restore_engine = server.initial_data.get('engine', 'rsync') %}
+{%- if restore_engine == 'rsync' %}
+{%- set config_file = 'dogtag/meta/backupninja.yml' %}
+SERVER_BACKUP_HOST="{{ server.initial_data.source }}"
+SERVER_BACKUP_DIR="{{ server.initial_data.get('home_dir', '/srv/volumes/backup/backupninja') }}"
+SERVER_BACKUP_NAME="{{ server.initial_data.host }}"
+SERVER_BACKUP_PATH="$SERVER_BACKUP_HOST:$SERVER_BACKUP_DIR/$SERVER_BACKUP_NAME"
+FILES_TO_RESTORE="{{ config_file.backup.dogtag.fs_includes }}"
+LOG_DIR="/var/log/backups"
+RESTORE_LOG="$LOG_DIR/dogtag-restore.log"
+RSYNC_USER="{{ server.initial_data.get('rsync_user', 'backupninja') }}"
+RSYNC_OPTIONS="{{ server.initial_data.get('rsync_options', '-r') }}"
+{%- endif %}
+
+usage () {
+  echo ""
+  echo "USAGE: "
+  echo "  dogtag-restore.sh [<name-of-backup-to-restore>]"
+  echo ""
+  echo "  <name-of-backup-to-restore> is the extension created by backupninja during backup (default=0)"
+  echo ""
+  echo "Example: dogtag-restore.sh 5"
+}
+
+error(){
+  echo "$1" 1>&2
+  exit 1
+}
+
+info(){
+  echo "-------------------------------------"
+  echo "$1"
+  echo "-------------------------------------"
+}
+
+## Check options
+if [ -z $1 ] ; then
+  echo "Info: Backup name not provided - using default=0"
+  BACKUP_NUMBER='0'
+else
+  BACKUP_NUMBER=$1
+fi
+
+## Check for log dir
+if [ ! -d "$LOG_DIR" ]; then
+  info "Creating directory: $LOG_DIR"
+  mkdir -p $LOG_DIR
+fi
+
+{%- if restore_engine == 'rsync' %}
+## Get files from remote host
+info "Transfering backup files from remote server..."
+for FILE in $FILES_TO_RESTORE
+do
+  FILE_BASENAME=$(basename $FILE)
+  rsync $RSYNC_OPTIONS $RSYNC_USER@$SERVER_BACKUP_PATH/$FILE/$FILE_BASENAME.$BACKUP_NUMBER $FILE 2>&1 | tee $RESTORE_LOG
+done
+
+# Check if the scp succeeded or failed
+if ! grep -q "No such file or directory" $RESTORE_LOG; then
+  info "RSYNC from remote host completed OK"
+else
+  error "RSYNC from remote host FAILED"
+fi
+{%- endif %}
+
+{%- if restore_engine == 'local' and server.initial_data.local_data is defined %}
+## Copy local backed up data
+echo "Copying local data..."
+cp -rf {{ server.initial_data.local_data }} /
+{%- endif %}
+
+## Restore the DB
+info "Running restoration of the DB..."
+INTERNALDB_PASS=$(awk -Finternaldb= '{print $2}' /var/lib/pki/pki-tomcat/conf/password.conf)
+LATEST_BACKUP=$(ls -td /var/lib/dirsrv/slapd-pki-tomcat/bak -- */ | head -n 1)
+/usr/sbin/bak2db-online -Z pki-tomcat -w $INTERNALDB_PASS -a /var/lib/dirsrv/slapd-pki-tomcat/bak/$LATEST_BACKUP
+touch /etc/salt/.dogtag_restored
+
+{%- endif %}
\ No newline at end of file
diff --git a/dogtag/server.sls b/dogtag/server/init.sls
similarity index 100%
rename from dogtag/server.sls
rename to dogtag/server/init.sls
diff --git a/dogtag/server/restore.sls b/dogtag/server/restore.sls
new file mode 100644
index 0000000..9861522
--- /dev/null
+++ b/dogtag/server/restore.sls
@@ -0,0 +1,17 @@
+{%- from "dogtag/map.jinja" import server with context %}
+dogtag_restore_script:
+  file.managed:
+  - name: /etc/dogtag/dogtag-restore.sh
+  - source: salt://dogtag/files/dogtag-restore.sh
+  - template: jinja
+  - user: root
+  - group: root
+  - mode: 700
+
+dogtag_run_restore:
+  cmd.run:
+  - name: /bin/bash /etc/dogtag/dogtag-restore.sh
+  - user: root
+  - unless: "[ -e /etc/salt/.dogtag_restored ]"
+  - require:
+    - file: dogtag_restore_script