#!/bin/bash # General checks # Do we have the required utilities? for util in bconsole zarafa-admin zarafa-restore; do [ -x $(which $util 2>/dev/null) ] || exit 1 done # Make sure we have the correct configuration file, too [ -r /etc/bacula/bconsole.conf ] || exit 2 # Ask for a username echo "Which user do you want to restore?" echo -n "Username: " read ANSWER # Check whether such user exists. We have three different means: # - ldapsearch # - zarafa-admin -l or zarafa-admin --details # - find files $username.index.zbk from bconsole username=$ANSWER # We can actually just trigger the restore here. echo -e "restore\n5\n2\ncd /var/lib/zarafa/bricklevel/working\nmark ${username}*\ndone\nyes" | bconsole -c /etc/bacula/bconsole.conf # Wait for the restore to be complete: restore_complete=0 old_size=0 almost_done=0 while [ $restore_complete -lt 1 ]; do current_size=`du -s /tmp/bacula-restores/ | awk '{print $1}'` if [ $current_size -eq $old_size ]; then # This is either an indication that we are done, or # a hickup in the restore. Mark us as almost done if not # already done so. if [ $almost_done -gt 0 ]; then restore_complete=1 else almost_done=1 fi else old_size=$current_size fi sleep 1 done # Now that we're done, let's see what we can offer to restore. declare -a folders declare -a folder_keys declare -a selected_folders declare -a selected_opts for folder in `grep ^C /tmp/bacula-restores/var/lib/zarafa/bricklevel/working/${username}.index.zbk | cut -d: -f7,11 | sed -e 's/ /_/g'`; do # The first field is now the key, the second is the folder name. folder_keys[${#folder_keys[@]}]=`echo $folder | cut -d':' -f1` folders[${#folders[@]}]=`echo $folder | cut -d':' -f2-` done selection_done=0 while [ $selection_done -lt 1 ]; do folder_index=0 echo -e "Please select or unselect folders by typing their ID and\npressing enter. Multiple folders may be selected at\nonce by separating the IDs with spaces." echo "" while [ $folder_index -lt ${#folders[@]} ]; do selected=" " y=0 while [ $y -lt ${#selected_folders[@]} ]; do if [ ${selected_folders[$y]} -eq $folder_index ]; then selected="*" fi let y++ done echo -e "\t${selected} ${folder_index}) ${folders[$folder_index]}" let folder_index++ done echo "" read -p "Selection: " ANSWER if [ "$ANSWER" == "done" ]; then selection_done=1 else # Split the list of selections for selection in $ANSWER; do echo "Processing the selection of $selection" i=0 found_folder_already_selected=0 if [ ${#selected_folders[@]} -gt 0 ]; then while [ $i -lt ${#selected_folders[@]} ]; do if [ ${selected_folders[$i]} -eq $selection ]; then found_folder_already_selected=1 fi let i++ done # If folder was not already selected, dump the key # into the selected folders list if [ $found_folder_already_selected -eq 0 ]; then selected_folders[${#selected_folders[@]}]=$selection else # Unselect the fscking folder if [ ${#selected_folders[@]} -gt 1 ]; then declare -a tmp_arr x=0 while [ $x -lt ${#selected_folders[@]} ]; do if [ ${selected_folders[$x]} -ne $selection ]; then tmp_arr[${#tmp_arr[@]}]=${selected_folders[$x]} fi let x++ done unset selected_folders declare -a selected_folders x=0 while [ $x -lt ${#tmp_arr[@]} ]; do selected_folders[${#selected_folders[@]}]=${tmp_arr[$x]} let x++ done unset tmp_arr else unset selected_folders declare -a selected_folders fi fi else selected_folders[${#selected_folders[@]}]=$selection fi done echo "Current you have ${#selected_folders[@]} folders selected:" i=0 while [ $i -lt ${#selected_folders[@]} ]; do echo "${selected_folders[$i]}" let i++ done fi done # Show the restore keys for what is selected: i=0 while [ $i -lt ${#selected_folders[@]} ]; do echo ${folder_keys[${selected_folders[$i]}]} let i++ done