Duplicity Koleksiyon Durum Biçimi


2

Buradaki komuttan çıktıyı ayrıştırıp yardım edebileceğimi merak ediyorum. duplicity collection-status MYPATH

Önemsiz hedefim, bu komutu kullanacak bir "restore" betiği oluşturmak ve geri yüklenecek seçilebilir bir yedekleme listesi oluşturmaktır.

Şu an kodum şöyle:

    # 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");

Ve bu benim amaçlarıma göre hile yapmak görünmekle birlikte, birkaç farklı sunucuda buldum önce ve sonra bazı "ekstra" bir metin ile sona erdi, bu yüzden listeleme her zaman sadece yedekleme noktaları değildir. Örnek bir çıktı bu şekilde yapılandırılmıştır:

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.

Bu özel örnekte, üretilen menü şöyledir:

--------------------------------------------------------------------
- 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

Gerçekten sadece olması gereken zaman:

--------------------------------------------------------------------
- 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

(evet, 8 Eylül’deki ikili yedeklemeler doğru ... şimdilik)

Öyleyse ... bu fazladan birkaç satırı göstermek için yanlış yapıyor olmalıyım ... bunu nasıl düzeltebilirim ve tam olarak nerede yanlış yapıyorum?

(basitçe bir --jsonbayrağını geçirebilseydim çok daha kolay olurdu , fakat henüz henüz uygulanmadı ...)

Yanıtlar:


1

Tam olarak nereye yanlış yapıyorum?

if [ $_idx -ge 14 -a $_idx -le $_end ]

Boş olmayan satırların başından ve sonundan sayıları sayarak ayrıştırma çıktısının tamamı. Çok kırılgandır ve açıkçası istediğiniz satırlardan önce ve sonra geri gönderilen farklı sayıda satırla baş edemez.

Kopyadan girdiğiniz girdiler, istenen verilerden önce beklediğiniz 14 boş satırdan çok daha fazla 3 değerine sahip. Bir olasılık, bu girdi bir stdout ve stderr karışımı olabilir, oysa kodunuz sadece stdout okur. Ancak, satırları hariç 14 boş olmayan satır olduğunu unutmayın Copying. Yinelemeden gelen girdi aynı zamanda yedekleme tarihlerinin beklenen veya gerçek çıktısıyla eşleşmediğinden, Copyingörneğiniz için gerçek girişte yalnızca üç satır bulunduğundan şüpheleniyorum .

Eğer öyleyse ve çıktının formatı her durumda aynı ise duplicity collection-status, aralarında yeni bir yedekleme yapmadan iki kez çalıştırıldığında kodunuz işe yarayabilir . Ancak bu aynı zamanda, gelecekteki herhangi bir kopya versiyonunda olası değişiklikler de dahil olmak üzere çıktıda yeni bir sürpriz olmayacağını varsayar.

Saymak yerine, 'Tam' veya 'Artan' yerine başlayan satırları tarayın. Ekstra çıktı daha az olasıdır ve aynı zamanda çok daha kolaydır.

Kasıtlı olarak kelime kırma (mesela IFS hatlarınız) hariç, her zaman iki katı teklif vermek önemli bir alışkanlıktır "$variables". Yalnızca minimum tutarı kullanırsanız, daha sonra beklenmeyen bir girişte beklenmedik bir şekilde ortaya çıkan beklenmedik bir sözcükle yakalanmak kolaydır.

Ayrıca, yerleşik bash select(bkz. help select) Menüleri kullanmak için kolay bir yoldur.

# 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")

cevap ve küçümseyen açıklamalar için teşekkür ederim. Çok takdir ediyorum ... ( insert sarcastic tone here) Benim "yaklaşımımın tamamen yanlış" olduğunu nasıl düşündüğünüzü ve neden "diğer" sunucuların bu soru bağlamında gerçekten önemli olduğunu düşündüğünüzü bilmek isterim?
Kevin

1
Tamam, haklısın, bunu daha iyi ifade etmeliydim. Ayrıca "Ekstra metinle sonlandırdığım birkaç farklı sunucuda" sadece bazı sunucularda "değil" çeşitli sunucularda test etmediğim "olduğunu da yanlış anlamış olabilirim.
Martin Thornton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.