23 Listopada 2024 06:03:06
Nawigacja
· Strona Główna
· Forum

· Tomato by Shibby
· FreshTomato


Wątki na forum
Najnowsze dyskusje
· [S] Asus RT-AC56U
· DIR868l OFW asus vs ...
· Szukam zaproszenia n...
· [MOD] FreshTomato-AR...
· Asus RT-AC5300 ,prob...
· archer c6 v3.20
· [S] Nighthawk R7000P...
· [S]Asus RT-AC5300 - ...
· Tanie N100 na promce...
· net z telefonu wifi+...
· Tomato - bugi/proble...
· HUAWEI z światłowodem
· Asus TUF-AX3000_V2 p...
· rt-ax88upro częste ...
· [Howto] Xpenology na...
· Jaki router pod Open...
· Ruter z tomato
· Czy to jeszcze NAS?
· RT AC66U B1
· Wireguard na FreshTo...
Najpopularniejsze obecnie wątki
· Szukam zaproszeni... [19]
· DIR868l OFW asus ... [8]
· [S] Asus RT-AC56U [0]
Ankieta
Jaki procesor posiada twój router?

Broadcom MIPSEL
Broadcom MIPSEL
36% [151 głosów]

Broadcom ARM
Broadcom ARM
52% [219 głosów]

Atheros
Atheros
5% [22 głosów]

Marvell
Marvell
1% [4 głosów]

Ralink
Ralink
1% [3 głosów]

Intel/AMD/VIA
Intel/AMD/VIA
1% [5 głosów]

Żaden z powyższych
Żaden z powyższych
4% [15 głosów]

Ogółem głosów: 419
Musisz zalogować się, aby móc zagłosować.
Rozpoczęto: 02/02/2015 09:38
Twoje IP
3.145.92.98
Zobacz wątek
OpenLinksys » :: OPROGRAMOWANIE :: » OpenWrt - firmware
 Drukuj wątek
Yntelygentny backup routera, cz. II
jejek
Druga część inteligentnego backupowania. Po co to komu, skoro można spakować cały katalog /jffs ?
No to odpoweidź pytaniem: ile masz już takich archiwów i czy jesteś wstanie z niego wydłubać ważne dla Ciebie pliki?
Ja mam kilkakrotnie zagnieżdżone katalogi old, arch, tmp i inne takie. ;)

No więc (nie zaczynaj zdania od "no więc" ) skrypt robi archiwum z plików, które zostały zmienione od momentu instalacji samego OpenWRT albo pakietu zawierającego ten plik.
Czy robi to dobrze? Proszę o przetestowanie i potwierdzenie. Już kilka razy myślałem że tak i za każdym razem tak nie było.

Warunki wstępne:

/rom zawiera obraz z momentu instalacji
/jffs montuje urządzenie z głównym systemem plików.
- tak działa przeniesienie katalogu / (root) na dysk zewnętrzny, system plików squash, nie wiem czy zawsze tak to wygląda, na przykład jak się wgrywa obraz inny niż trx.

Wymagane pakiety: bash (mogę postarać się wyeliminować jeśli będzie zainteresowanie), diffutils, tar. Reszta na pewno jest w systemie, awk wystarcza busyboxowy.

Jak działa.
Porównuje katalogi /rom i /jffs i różnice uznaje za godne zachowania. Są dwie wiadomości:
- dobra, nie znajduje różnic dla zmodyfikowanych pakietów od czasu instalacji obrazu, ja mam taki pre8.09.2 i takie podejście jest OK. Dobre będzie też dla trunka. Bardzo dobre ;)
- zła, ale nie bardzo, że potem mogły przyjść pakiety nadpisujące pliki i te pliki już się nie zmieniły i nie powinny być archiwizowane. Przykład: /bin/diff jest pierwotnie linkiem na busybox, a po zainstalowaniu diffutils jest binarką. Uwzględniam to przy dalszym przetwarzaniu i omijam ten problem.

Następnie porównywana jest zawartość poszczególnych paczek ze stanem systemu. Porównuję wszystkie pliki poleceniem diff i różne od oryginalnych archiwizuję. Dlaczego tak? Bo nie są wypełniane znaczniki "Installed-Time" w pliku /usr/lib/opkg/status. Gdyby były, mechanizm byłby dużo prostszy.
Tak więc instaluję na boku każdy pakiet, robię porównanie, robię jeszcze jedną listę do wyszukania dodanych plików, modyfikuję listę potrzebnych do archiwizacji plików wbudowanych ("zła wiadomość" z poprzedniego punktu).

Na koniec robię plik opisujący archiwum, tzn czas utworzenia, wersja jądra, takie tam głupoty.
I (nie zaczynaj od "I", no chyba że po angielsku) tworzę archiwum na podstawie trzech list plików (wbudowanych, dodanych i tych z paczek - zmienionych).

Komplet z pierwszą częścią inteligentnego backupowania (gdzie wyszukuję listę pakietów) powinien dać szybki sposób na odtworzenie systemu na innym obrazie. Oczywiście mogą być konieczne poprawki w plikach konfiguracyjnych, ale mamy już te pliki wyselekcjonowane.

Proszę o testy i sugestie, jak niektóre rzeczy rozwiązać lepiej. Wersja skryptu jest bardzo robocza.

Na koniec: jest jedno niebezpieczeństwo. Skrypty wykonywane przed instalacją. Mogą zmieniać stan systemu jeśli używają bezwzględnych ścieżek. Te skrypty są też siłą rozwiązania, bo pozwalają na porównania linków symbolicznych tworzonych tymi skryptami, inaczej wystarczyłoby bezpieczniejsze "opkg files".
Skrypt wykonuje się długo, bo pobiera wszystkie zainstalowan, niewbudowane paczki. U mnie około 6 minut. Powinien być zapweniony dostęp do paczek, na co trzeba zwrócić uwagę. Może to być trudny warunek w przypadku trunka.

Skrypt: http://wklej.org/id/276426/

Załączony skrypt - jeśli go nie ma to nie działa dodawanie zipów, proszę adminów o poprawę. [edit: odszczekuję]

arteq: podpinam


#!/bin/bash

# Użycie:  zmiany.sh nazwa_archiwum_bez_rozszerzenia
# Uwaga. Wymagany jest pakiet diffutils zawierający pełną wersję polecenia diff
#        Wymagany jest pakiet tar zawierający pełną wersję tara. Busybox nie
#        obsługuje dopisywania do archiwum.
#
# Sposób wyszukiwania zmodyfikowanych plików:
# Najłatwiej byłoby oprzeć się na wpisie "Installed-Time" z pliku /usr/lib/opkg/status
# i w ten sposób wyszukać po czasie modyfikacji zmienione pliki.
# Niestety takie znaczniki często nie są wpisywane, nie wiem dlaczego.
# Dlatego instaluję kolejne paczki na boku i porównuję kolejno pliki z obu instalacji.
# Operacja nie powinna pozostawiać śladów w systemie.
#
# Sposób wyszukania dodanych plików:
# Porównywana jest lista wszystkich plików z katalogu /jffs z listą wszystkich plików
# zainstalowanych paczek. Odpowiednia różnica (występujące w /jffs a nie występujące
# w pakietach dają oczekiwany wynik.

# -------------[ Konfiguracja ]-------------
# Katalog tymczasowy, usuwamy na końcu
KATALOG_TMP=/tmp/backup
# Plik z zależnościami pakietów. Zajrzyj do /etc/opkg.conf
PLIK_PKG=/tmp/opkg-lists/snapshots
# -----[ Koniec konfiguracji skryptu. ]-----


czy_pakiet_wbudowany () {
  local nazwa=$1
  local __czy_wbudowany=$2
  local ret=0
 
  while [ $ret -eq 0 ] && read pakiet_wbudowany; do
    if [ "$pakiet_wbudowany" == "$nazwa" ] then
      ret=1
    fi
  done < <(awk '/^Package:/ {print $2}' /rom/usr/lib/opkg/status)

  eval $__czy_wbudowany=$ret
}

# Czy jest katalog /dev/fd ?
if [ ! -d /dev/fd ] then
  ln -s /proc/self/fd /dev/fd
fi

if [ ! -f "$PLIK_PKG" ] then
  opkg update || { echo "Nie potrafię uaktualnić listy pakietów."; exit 5; }
  if [ ! -f "$PLIK_PKG" ] then
    # Mimo pobrania pliku nadal go nie ma %-)
    echo "Nieprawidłowa konfiguracja, sprawdź ustawienie PLIK_PKG."
    exit 5
  fi
fi

ARCHIWUM="$1"
if [ -z "$ARCHIWUM" ] then
  ARCHIWUM="/tmp/archiwum"
fi

if [ -f $ARCHIWUM.tar.gz ] then
  echo "Plik $ARCHIWUM.tar.gz już istnieje."
  exit 5
fi

mkdir -p "$KATALOG_TMP"
PLIK_PKG="$KATALOG_TMP/plik_pkg.txt"
PLIK_JFFS="$KATALOG_TMP/plik_jffs.txt"

rm -f $PLIK_PKG
rm -f $PLIK_JFFS

# Spis wszystkich plików w systemie (oczywiście tylko z /jffs)
# Do porównania z listą plików z pakietów w celu ustalenia dodanych ręcznie plików.

# Katalogi
#find /jffs -type d | awk '/^\/jffs/ { print substr ($0, 6) "/"}' >> $PLIK_JFFS
# Pliki
#echo "*** pliki" >> $PLIK_JFFS
find /jffs -type f | awk '/^\/jffs/ { print substr ($0, 6) }' >> $PLIK_JFFS
# Linki symboliczne
#echo "*** linki symboliczne" >> $PLIK_JFFS
find /jffs -type l | awk '/^\/jffs/ { print substr ($0, 6) }' >> $PLIK_JFFS

# Przygotowanie do instalacji pakietów "na boku"
grep ^src/gz /etc/opkg.conf > "$KATALOG_TMP/opkg.conf"
echo "dest test /tmp/backup/pkg" >> "$KATALOG_TMP/opkg.conf"
echo "lists_dir ext /var/opkg-lists" >> "$KATALOG_TMP/opkg.conf"


echo -n > "$KATALOG_TMP/pliki_zmienione.lst"

KLOPOTY=""

# Porównanie plików wbudowanych w obraz ze stanem bieżącym
# Różnica pomiędzy /rom a /jffs
echo -n "" > "$KATALOG_TMP/pliki_wbudowane_wstep.lst"
while read plik_rom; do
  plik_jffs=${plik_rom/\/rom/\/jffs}

  if [ -f "$plik_jffs" ] then
    # Dla porównania dodanych plików
    echo "$plik_jffs" >> $PLIK_PKG

    diff "$plik_rom" "$plik_jffs" >/dev/null
    if [ $? -ne 0 ] then
      echo "$plik_jffs" | awk '/^\/jffs/ { print substr ($0, 6) }' >> "$KATALOG_TMP/pliki_wbudowane_wstep.lst"
    fi
  fi
done < <( (find /rom -type f; find /rom -type l) | grep -v ^/rom/usr/lib/opkg )

# Pętla po zainstalowanych pakietach
for pakiet in `opkg list_installed | awk '{print $1}'`
do
  printf "\rPakiet: %-36s  " $pakiet
  #printf "\n" #@@



  # Instalacja pakietu "na boku"
  mkdir -p "$KATALOG_TMP/pkg"
  #(opkg -f /tmp/backup/opkg.conf -d test -nodeps install $pakiet) > /dev/null

  czy_pakiet_wbudowany $pakiet czy_wbudowany

  if [ $czy_wbudowany -eq 0 ] then
    opkg -f /tmp/backup/opkg.conf -d test -nodeps install $pakiet 2>&- > /dev/null
    if [ $? -eq 0 ] then

      while read plik_bok; do

        KATALOG_PKG="\\$KATALOG_TMP/pkg"

        plik_jffs=${plik_bok/$KATALOG_PKG/}
        if [[ ! $plik_jffs =~ ^/usr/lib/opkg ]] then
          RET=0
          if [ -f "$plik_jffs" ] then
       # Dla porównania dodanych plików
            echo "$plik_jffs" >> $PLIK_PKG

       # Porównanie zmienionych plików
            diff $plik_bok $plik_jffs > /dev/null
            RET=$?
          fi

          if [ $RET -ne 0 ] then
            #echo "RÓŻNICA[$RET]:  $plik_bok --- $plik_jffs"
       echo "$plik_jffs" >> "$KATALOG_TMP/pliki_zmienione.lst"
     else
       czy_wykasowac_wbudowana=$(echo "$plik_jffs" | diff --unchanged-line-format="Tak" --old-line-format="" "$KATALOG_TMP/pliki_wbudowane_wstep.lst" -)
       if [ "$czy_wykasowac_wbudowana" == "Tak" ] then
         echo "$plik_jffs" >> "$KATALOG_TMP/pliki_wbudowane_dobre.lst"
       fi
          fi
        fi
      done < <(find $KATALOG_TMP/pkg -type f; find $KATALOG_TMP/pkg -type l)

      # Myślałem, że to dobry pomysł, ale skrypt postrm czasem działa na bezwzględnych
      # ścieżkach. Np. dla wget przywraca linka dl busybox.
      # Dlatego musi wystarczyć brutalne usunięcie katalogu.
      # opkg -f /tmp/backup/opkg.conf -d test remove $pakiet 2>&- > /dev/null
    else # Nie udało się zainstalować, czyli nie można porównać
      KLOPOTY+="Nie potrafię zainstalować $pakiet\n"

      # Wpis do listy zainstalowanych plików. Tu by można zrobić przełącznik czy
      # backupować nieznaloezione pakiety w całości. Wtedy wystarczy nie wykonywać
      # poniższego polecenia.
      opkg files $pakiet >> $PLIK_PKG
    fi
    rm -rf "$KATALOG_TMP/pkg"
  fi
done
echo

if [ -n "$KLOPOTY" ] then
  echo -en "$KLOPOTY"
fi


sort -u $PLIK_JFFS > $PLIK_JFFS.sort
sort -u $PLIK_PKG > $PLIK_PKG.sort

# Lista plików dodanych własnoręcznie, takich których nie ma w pakietach.
/usr/bin/diff --new-line-format='' --old-line-format='%L' --unchanged-line-format='' \
              $PLIK_JFFS.sort $PLIK_PKG.sort | grep -v ^/usr/lib/opkg | grep -v META_ \
         > "$KATALOG_TMP/pliki_dodane.lst"

# Ustalenie ostatecznej wersji wbudowanych plików
/usr/bin/diff --unchanged-line-format="" --old-line-format="%L" "$KATALOG_TMP/pliki_wbudowane_wstep.lst" "$KATALOG_TMP/pliki_wbudowane_dobre.lst" > "$KATALOG_TMP/pliki_wbudowane.lst"

# Ładny plik opisu do archiwum, co jednocześnie założy archiwum od nowa
cat /etc/banner > "$KATALOG_TMP/README.txt"
uname -a >> "$KATALOG_TMP/README.txt"
echo "Archiwum OpenWRT z `date +'%d-%m-%Y'`" >> "$KATALOG_TMP/README.txt"
sh -c "/usr/bin/tar -cf \"$ARCHIWUM.tar\" -C \"$KATALOG_TMP\" README.txt"

while read plik; do
  if [ -f "$plik" ] then
    # Usunięcie slasha z początku ścieżki
    plik=`expr substr "$plik" 2 ${#plik}`
    sh -c "/usr/bin/tar -rf \"$ARCHIWUM.tar\" -C / \"$plik\""
  fi
done < <(cat "$KATALOG_TMP/pliki_zmienione.lst" "$KATALOG_TMP/pliki_dodane.lst" "$KATALOG_TMP/pliki_wbudowane.lst" | sort -u)


printf "\r%-40s" "Gzipowanie..."
gzip "$ARCHIWUM.tar"
printf "\r%-40s\n" "Koniec"

rm -rf "$KATALOG_TMP"

Edytowany przez arteq dnia 09-02-2010 12:11
 
Przejdź do forum
Zaloguj
Wprowadź adres e-mail lub nazwę użytkownika

Hasło



Nie masz jeszcze konta? Zarejestruj się.

Zapomniałeś/aś hasła?
Aktualnie online
· Gości online: 75

· Użytkowników online: 0

· Łącznie użytkowników: 24,115
· Najnowszy użytkownik: Ja
Czat
Musisz się zalogować, aby opublikować wiadomość.

Maniek91PL
06-11-2024 22:37
dzięki !Grin

maxikaaz
29-10-2024 14:27
@Maniek91PL - Administration=> Admin Access, i tam masz "Allow Wireless Access" do zaznaczenia

Maniek91PL
26-10-2024 22:07
siemka! ktoś przypomni co się ustawiało jeśli nie mogę wejść od strony wifi do tomato? od lan działa

overflow2
04-10-2024 17:34
Kupowałem Asusy n10u albo n12d1 ale nie widzę ich, chyba już nie produkują, Chodzi o coś nowego i taniego. Transfery niewielkie.

maxikaaz
04-10-2024 09:38
@overflow2 patrząc po dostępności funkcji w nowych kompilacjach, to chyba nawet WRT54G/GL jeszcze ma OpenVPN, albo jakiś odpowiednik... zależy, na jakie transfery liczysz.

overflow2
30-09-2024 20:53
Jaki aktualnie najtańszy router do tomato do openvpn?

maxikaaz
27-07-2024 15:07
@servee - na początek router do rozebrania i obejrzenia, ciężko wróżyć tak tylko po objawach

maxikaaz
27-07-2024 14:55
@servee - cały kontroler nie pada tak sobie z powodu "zbiegu okoliczności",
więc prawdopodobnie gdzieś przepięcie.

servee
25-07-2024 13:33
@maxikaaz: działało, aż pewnego pięknego dnia przestało działać. W tym dniu była też burza, ale to raczej zbieg okoliczności.

maxikaaz
25-07-2024 11:38
@servee - o ile problem jest w obrębie samych wyjść (dławiki, warystory), to naprawialne, ale jeśli w samym SoC - to nienaprawialne ze względu na koszta. A co było przyczyną?

95,347,891 unikalnych wizyt