Формат состояния набора двуличности

Удивление, если я могу получить руку, здесь анализирующую вывод от команды 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 флаг, но это не было реализовано на данный момент...),

2
задан 8 September 2019 в 16:37

1 ответ

Где точно я иду не так, как надо?

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")
1
ответ дан 2 December 2019 в 04:36

Другие вопросы по тегам:

Похожие вопросы: