Удивление, если я могу получить руку, здесь анализирующую вывод от команды duplicity collection-status MYPATH
Моя ulitimate цель состоит в том, чтобы создать сценарий "восстановления", который будет использовать эту команду и пристраивать выбираемый список резервных копий для восстановления от.
Прямо сейчас мой код следующие:
# get the backups information
_t=`duplicity collection-status $1`
# split the collection based on new lines
IFS=$'\n' _arr=($_t)
# find the length of the array
_arr_len=${#_arr[@]}
# we only want the last set of lines, minus the last 2 lines
_end=`expr $_arr_len - 2`
# loop over our resulting set and echo out the line
_idx=1
_menu_idx=1
_ret_arr=()
# make sure there are actually backups created
if [[ -z ${_arr[14]} ]]; then
# it doesnt exist, show a message and exit
echo
echo '--------------------------------------------------------------------';
echo 'There are no backups for that account/app'
echo 'Please create the account, and make sure it matches the restore'
echo 'Account and App names'
echo '--------------------------------------------------------------------';
echo
exit 1;
fi;
echo
echo '--------------------------------------------------------------------';
echo "- Select a restore point: "
for _l in ${_arr[@]}; do
if [ $_idx -ge 14 -a $_idx -le $_end ]; then
IFS=$' ' _temp_arr=($_l)
_d_string=${_temp_arr[1]}" "${_temp_arr[2]}" "${_temp_arr[3]}" "${_temp_arr[4]}" "${_temp_arr[5]}
_ret_arr+=( "$_d_string" )
# Tue Aug 27 10:59:43 2019
echo $_menu_idx") "$_d_string;
((_menu_idx=_menu_idx+1))
fi;
((_idx=_idx+1))
done
read n
# get the value of the selected item
_t=${_ret_arr[$n-1]};
# make sure the selection is valid
if [[ -z $_t ]]; then
echo "You selected an invalid restore point. Please try again"
exit 1;
fi;
echo
# convert the selected value to a epoch date and return it
_ret_date=$(date -d "${_t}" +"%s");
И в то время как это, кажется, добивается цели в моих целях, я нашел на паре различных серверов, что я заканчиваю с некоторым "дополнительным" текстом прежде и после таким образом, список является не всегда просто резервными точками. Вывод в качестве примера структурирован несколько как это:
root@sp-stage1:~# duplicity collection-status $_dest/$_host/apps/aats/aats/
Synchronizing remote metadata to local cache...
Copying duplicity-full-signatures.20190903T134927Z.sigtar.gz to local cache.
Copying duplicity-full.20190903T134927Z.manifest to local cache.
Copying duplicity-inc.20190903T134927Z.to.20190903T162118Z.manifest to local cache.
Copying duplicity-inc.20190903T162118Z.to.20190904T050005Z.manifest to local cache.
Copying duplicity-inc.20190904T050005Z.to.20190905T050004Z.manifest to local cache.
Copying duplicity-inc.20190905T050004Z.to.20190906T050005Z.manifest to local cache.
Copying duplicity-inc.20190906T050005Z.to.20190907T050005Z.manifest to local cache.
Copying duplicity-inc.20190907T050005Z.to.20190908T050004Z.manifest to local cache.
Copying duplicity-new-signatures.20190903T134927Z.to.20190903T162118Z.sigtar.gz to local cache.
Copying duplicity-new-signatures.20190903T162118Z.to.20190904T050005Z.sigtar.gz to local cache.
Copying duplicity-new-signatures.20190904T050005Z.to.20190905T050004Z.sigtar.gz to local cache.
Copying duplicity-new-signatures.20190905T050004Z.to.20190906T050005Z.sigtar.gz to local cache.
Copying duplicity-new-signatures.20190906T050005Z.to.20190907T050005Z.sigtar.gz to local cache.
Copying duplicity-new-signatures.20190907T050005Z.to.20190908T050004Z.sigtar.gz to local cache.
Last full backup date: Tue Sep 3 09:49:27 2019
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive dir: /home/ubuntu/.cache/duplicity/6a9fb8e3df936035e1be5ede96c0d7a7
Found 0 secondary backup chains.
Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Tue Sep 3 09:49:27 2019
Chain end time: Sun Sep 8 01:00:04 2019
Number of contained backup sets: 7
Total number of contained volumes: 8
Type of backup set: Time: Num volumes:
Full Tue Sep 3 09:49:27 2019 2
Incremental Tue Sep 3 12:21:18 2019 1
Incremental Wed Sep 4 01:00:05 2019 1
Incremental Thu Sep 5 01:00:04 2019 1
Incremental Fri Sep 6 01:00:05 2019 1
Incremental Sat Sep 7 01:00:05 2019 1
Incremental Sun Sep 8 01:00:04 2019 1
-------------------------
No orphaned or incomplete backup sets found.
В этом определенном примере произведенное меню похоже на это:
--------------------------------------------------------------------
- Select a restore point:
1) of contained backup sets: 8
2) number of contained volumes: 9
3) of backup set: Time: Num
4) Tue Sep 3 09:49:27 2019
5) Tue Sep 3 12:21:18 2019
6) Wed Sep 4 01:00:05 2019
7) Thu Sep 5 01:00:04 2019
8) Fri Sep 6 01:00:05 2019
9) Sat Sep 7 01:00:05 2019
10) Sun Sep 8 01:00:04 2019
11) Sun Sep 8 09:33:26 2019
Когда это действительно только должно быть:
--------------------------------------------------------------------
- Select a restore point:
1) Tue Sep 3 09:49:27 2019
2) Tue Sep 3 12:21:18 2019
3) Wed Sep 4 01:00:05 2019
4) Thu Sep 5 01:00:04 2019
5) Fri Sep 6 01:00:05 2019
6) Sat Sep 7 01:00:05 2019
7) Sun Sep 8 01:00:04 2019
8) Sun Sep 8 09:33:26 2019
(да двойные резервные копии 8-го сентября корректны... на данный момент),
Так... Я должен делать его неправильно для показа тех дополнительных немногих строк..., как я могу зафиксировать это, и где точно я иду не так, как надо?
(было бы настолько легче, если я мог бы просто передать a --json
флаг, но это не было реализовано на данный момент...),
Где точно я иду не так, как надо?
if [ $_idx -ge 14 -a $_idx -le $_end ]
Весь подход парсинга, произведенного путем подсчета определенных чисел непустых строк с начала и конца. Это очень хрупко, и очевидно не может справиться с другим количеством строк, возвращаемых прежде, и после тех Вы хотели.
Ваш обеспеченный вход от двуличности имеет много еще больше чем 3, чем Ваши ожидаемые 14 непустых строк перед требуемыми данными. Одна возможность является этим входом, возможно, было соединение stdout и stderr, тогда как Ваш код только читает stdout. Однако я отмечаю, что существует 14 непустых строк, исключая Copying
строки. Поскольку вход от двуличности также не соответствует ожидаемой или эффективной выходной мощности для резервных дат, я подозреваю, что были только три Copying
строки в фактическом входе для Вашего примера.
Если так, и если формат вывода является иначе тем же во всех случаях, Ваш код мог бы работать если duplicity collection-status
выполняется дважды без нового промежуточного резервного копирования. Но это также предполагает, что не будет никаких новых неожиданностей в выводе, включая возможные изменения ни в какой будущей версии двуличности.
Вместо подсчета, сканирования для строк, начинающихся 'Полный' или 'Возрастающий' вместо этого. Дополнительный вывод менее вероятен, и это также намного более просто.
Это - важная привычка к всегда двойной кавычке "$variables"
кроме тех случаев, когда Вы - намеренно повреждение слова (например, Ваши строки IFS). Если Вы только делаете минимум, легко ловиться неожиданным словом, повреждающим позже будущий вход, который Вы первоначально не ожидали.
Кроме того, встроенный удар select
(см. help select
) простой способ состоит в том, чтобы обработать меню.
# get the backups information
_t=`duplicity collection-status "$1"`
# split the collection based on new lines
IFS=$'\n' _arr=($_t)
# loop over our resulting set and select lines
_ret_arr=()
for _l in "${_arr[@]}"; do
IFS=$' ' _temp_arr=($_l)
if [ Full = "${_temp_arr[0]}" -o Incremental = "${_temp_arr[0]}" ]; then
_d_string="${_temp_arr[1]} ${_temp_arr[2]} ${_temp_arr[3]} ${_temp_arr[4]} ${_temp_arr[5]}"
_ret_arr+=( "$_d_string" )
fi;
done
echo
echo '--------------------------------------------------------------------';
# make sure there are actually backups created, i.e. at least one line matched
if [[ -z "${_ret_arr[0]}" ]]; then
# it doesnt exist, show a message and exit
echo 'There are no backups for that account/app'
echo 'Please create the account, and make sure it matches the restore'
echo 'Account and App names'
echo '--------------------------------------------------------------------';
echo
exit 1;
fi
echo "- Select a restore point: "
select _t in "${_ret_arr[@]}"; do
# will keep asking until valid value given
[ -n "$_t" ] && break
done
echo
# convert the selected value to a epoch date and return it
_ret_date=$(date -d "${_t}" +"%s")