Archive for category Linux

Automatyzacja wykonywania kopii bezpieczeństwa przy użyciu duply i duplicity

We wpisie Tworzenie kopii zapasowej plików przy użyciu aplikacji duplicity oraz duply opisałem, w jaki sposób skonfigurować aplikację duplicity wraz ze skryptem duply w celu wykonywania kopii zapasowych. Chciałbym teraz to trochę uszczegółowić, pod kątem automatycznego wykonywania kopii zapasowej.

Zakładam, że posiadasz już skonfigurowaną aplikację duply i możesz spokojnie za jej pomocą zrobić kopię wybranych plików. Teraz czas aby to zautomatyzować przy zachowaniu takich warunków:

  • kopia zapasowa ma być wykonywana raz dziennie (przyrostowa)
  • raz w tygodniu ma zostać uruchomione robienie pełnej kopii bezpieczeństwa
  • informacje z polecenia duply i duplicty powinny być zapisane w jakimś logu
  • chcemy zostawić sobie tylko dwa najnowsze pełne backupy

Więc do dzieła :).

Na początek zacznijmy od ostatniego punktu: zostawiamy tylko dwie ostatnie kopie bezpieczeństwa. Za takie zachowanie odpowiada definicja zmiennej MAX_FULL_BACKUPS w pliku conf definiującym dany profil duply:

52
53
54
55
# Number of full backups to keep. Used for the "purge-full" command.
# See duplicity man page, action "remove-all-but-n-full".
# defaults to 1, if not set
MAX_FULL_BACKUPS=2

Ustawienie tej wartości na 2 powoduje zostawienie tylko dwóch ostatnich pełnych kopii bezpieczeństwa (oczywiście, wraz z przyrostowymi backupami).

Co warto zauważyć, stare kopie bezpieczeństwa nie zostaną automatycznie usunięte podczas robienia kopii. Należy powołać polecenie duply odpowiednim parametrem, aby zostały one usunięte:

# duply PROFIL purge-full --force

Wywołanie samego polecenia purge-full spowoduje wyświetlenie informacji o tym co ma zostać usunięte, a dodanie do tego jeszcze przełącznika --force spowoduje usunięcie starych plików.

Teraz czas na zdefiniowanie lokalizacji, gdzie będą zapisywane logi z tworzenia kopii bezpieczeństwa. Załóżmy, że mają one znaleźć się w katalogu /var/log/duply, więc:

# mkdir -p /var/log/duply

Ostatnim krokiem będzie poinformowanie aplikacji cron kiedy ma uruchomić odpowiednie skrypty. Można to zrobić poprzez odpowiednią modyfikację pliku /etc/crontab lub też dodając nowy plik z definicją do katalogu /etc/cron.d.

Wybierzmy drugą opcję, czyli należy utworzyć plik /etc/cron.d/duply o takiej zawartości:

1
2
3
4
5
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

10 2 * * 0      root    (duply PROFIL full && duply system_backup purge-full --force; duply system_backup status) 2>&1 | tee /var/log/duply/duply-$(date +\%Y\%m\%d-\%H\%M\%S).log
10 2 * * 1-6    root    (duply PROFIL backup; duply system_backup status) 2>&1 | tee /var/log/duply/duply-$(date +\%Y\%m\%d-\%H\%M\%S).log

Oto co jest zdefiniowane:

  • definicja zmiennych środowiskowych używanych podczas wywoływania skryptów, ważne jest poprawne zdefiniowanie zmiennej PATH
  • linia 4 – definicja wywołania robienia pełnej kopii bezpieczeństwa, będzie ona wykonywana w każdą niedziele o godzinie 2:10, najpierw zostanie wykonana pełna kopia, następnie zostaną usunięte stare kopie bezpieczeństwa, zostanie wypisany status archiwum i to wszystko zostanie zapisane do pliku /var/log/duply/duply-DATA-GODZINA.log, gdzie DATA i GODZINA to odpowiednio data i godzina rozpoczęcia kopii bezpieczeństwa
  • linia 5 – wykonanie przyrostowej kopii bezpieczeństwa w każdy dzień tygodnia (poza niedzielą) o godzinie 2:10, następnie statusu archiwum, i podobnie zapisanie tych informacji w logu.

Od tej pory kopie bezpieczeństwa powinny wykonywać się automatycznie o zadanych porach.

Źródła

Tags: , , , ,

Konwersja strony HTML do pliku PDF przy użyciu aplikacji wkhtmltopdf

Potrzebowałem aplikacji, która pozwoli mi na konwersję strony HTML na plik w formacie PDF. Wymagania były następujące:

  • prosta obsługa, najlepiej powinna ograniczyć się do podania źródła strony i nazwy pliku do zapisania
  • aplikacja powinna samodzielnie pobrać stronę (czyli odpada konieczność wcześniejszego jej ściągania na dysk)
  • w dokumencie powinny znaleźć się powiązanie grafiki
  • konieczność obsługi UTF-8 (polskie znaczki)
  • możliwość wywołania aplikacji przy użyciu linii poleceń

Aplikacją, która spełniła praktycznie wszystkie te wymagania jest wkhtmltopdf. Pozwala ona na konwersję strony HTML do pliku PDF. Wykorzystuje do tego silnik WebKit dostarczany z QT 4.4. Czyli nie dość że robi co do niej należy, to jeszcze korzysta z silnika wykorzystywanego przez przeglądarki internetowe (np. Safari., Chrome czy też Konqueror).

W środowisku Ubuntu instalacja aplikacji sprowadza się do wydania polecenia:

sudo aptitude install wkhtmltopdf

Użycie aplikacji jest też bardzo proste:

wkhtmltopdf http://blog.stelmisoft.pl/2010/konwersja-strony-html-do-pliku-pdf-przy-uzyciu-aplikacji-wkhtmltopdf strona.pdf

Powyższe polecenie zapisze stronę (tę którą właśnie czytasz) do pliku PDF.

Wersja aplikacji która przychodzi z Ubunut wymaga uruchomienia w środowisku X11. Aby pozbyć się tej zależności, należy poprać wersję statycznie skompilowaną ze strony projektu. Udostępnia ona także kilka innych możliwości, których nie znajdziemy w wersji dostarczanej w dystrybucji. Jednak nawet to wystarcza do zapisania strony w formacie PDF.

Źródła

Tags: , , , ,

pdftk – operacje na plikach PDF

Podczas przygotowywania materiałów do prezentacji musiałem dokonać kilu operacji na plikach PDF:

  • połączyć kilka plików w jeden
  • wyciąć niektóre strony z pliku PDF i także dodać je do dokumentu wynikowego
  • narzędzie powinno dać się skonfigurować w całości z linii poleceń (prawdopodobnie będzie potrzeba wykonywania operacji kilkukrotnie)

Kiedyś do takie celu wykorzystywałem Jave i bibliotekę iText Pdf, ale tym razem nie bardzo chciałem tworzyć specjalną aplikację. Ostatnio używałem aplikacji do rozpoznawaniu tekstu w dokumentach PDF (Dodanie możliwości przeszukiwanie plików PDF), gdzie do operacji na dokumentach PDF była używana aplikacja pdftk. I nie zawiodłem się :).

Aplikacja pdftk pozwala na manipulację dokumentami PDF, wg dokumentacji:

  • łączenie dokumentów PDF
  • wyodrębniać poszczególne strony
  • obracać strony
  • odszyfrowywać w razie potrzeby pliki (wymagana jest podanie hasła)
  • szyfrowanie tworzonego dokumentu
  • wypełnianie formularzy PDF
  • tworzenie znaku wodnego
  • pobierania oraz aktualizacja metadanych
  • dodawania załączników do stron lub całych dokumentów
  • pobierać załączników
  • naprawiać zepsute dokumenty

Na moje potrzeby wystarczyły dwie pierwsze możliwości i je przedstawię poniżej.

Składania polecenia pdfk na potrzeby tego artykułu (składania jest bardziej skomplikowana, proszę zajrzeć na stronę pomocy polecenia)

pdftk <wej ściowe pliki PDF>
            cat [<argumenty operacji>]
            output <nazwa pliku wyjściowego>

Aby połączyć pliki PDF i utworzyć z nich plik wynikowy wystarczy wydać taką komendę:

pdftk plik1.pdf plik2.pdf cat output wyjście.pdf

Dwa pliki PDF zostaną połączone i zostanie utworzony plik wynikowy o nazwie wyjście.pdf.

Istnieje także możliwość zdefiniowania, jakie strony z którego pliku mają zostać pobrane do pliku wyjściowego. Można także na tych stronach dokonać kilku transformacji. Wymaga to jednak trochę innego wywołania komendy:

pdftk A=plik1.pdf B=plik2.pdf cat A10-12 B3 A13-18even output wyjście.pdf

Jak widać, każda nazwa pliku wejściowego została poprzedzona wielką literą. Jest to tak zwany uchwyt, poprzez który można się następnie odwoływać do plików (nie tylko przy łączniu ich, ale np. także przy podawaniu hasła w celu odszyfrowania danego pliku). Uchwyt musi być pojedynczą wielką literą.

Powyższe polecenie pobierze najpierw z pliku plik1.pdf strony od 10 do 12, następnie doda do tego stronę nr 3 z pliku plik2.pdf i na końcu wstawi nieparzyste strony od 13 do 18 z pliku plik1.pdf.

Poniżej jeszcze znajduje się przykładowy skrypt, który wykonuje takie akcje:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

#set -x

echo "Konfiguracja"
PDFTK=`which pdftk`

SOURCE_DIR="./PDF/"
EXTRA_PDF="extra.pdf"

ROZ_00=`ls $SOURCE_DIR/00*.pdf`
ROZ_01=`ls $SOURCE_DIR/01*.pdf`

OUTPUT_PDF="konspekt.pdf"


# połączenie konspektu w całość

PDF_INPUT_LIST="A=${ROZ_00} B=${ROZ_01} J=${EXTRA_PDF}"

#echo $PDF_INPUT_LIST

CAT="A B J51-70 J110-116"

echo "Tworzenie dokument PDF"
$PDFTK $PDF_INPUT_LIST cat $CAT  output "$OUTPUT_PDF"
echo "Utworzono konspetk: $OUTPUT_PDF"

O wiele więcej informacji można znaleźć w dokumentacji do aplikacji, na jej stronach MAN.

Tags: ,

Przechwycenie strumienia wyjściowego wybranego procesu

Czasem istnieje następująca sytuacja: musimy zobaczyć co dana aplikacja wypisuje na ekranie, ale jest ona uruchomiona na innym terminalu (do którego nie mamy dostępu) lub też działa w tle i jej komunikaty lądują w nicości (czyli /dev/null). Można to zrobić za pomocą polecenia strace. Polecenie to służy generalnie do śledzenia wywołań systemowych.

strace -f -e trace=write -e write=1,2 -p PID

Opis opcji konfiguracyjnych:

  • -f – śledzi także procesu potomne monitorowanego procesu
  • -e trace=write – śledzenie informacji zapisu
  • -e write=1,2 – deskryptory plików, dla których mają być śledzone zapisy (tutaj stdout i stderr)
  • -p PID – numer procesu, który ma być śledzony

Demonstracja

  1. Utworzyć skrypt o nazwie trace_test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash

    echo PID: $$

    for I in `seq 1 1000`
    do
    echo "Linia $I"
    sleep 2
    done

    Skrypt ten wyświetli numer PID z jakim został uruchomiony oraz bedzie wyświetlał komunikat co dwie sekundy.

  2. Uruchomić powyższy skrypt:
    $ bash ./trace_test.sh
  3. Należy teraz otworzyć drugą konsolę i wykonać w niej polecenie:
    strace -f -e trace=write -e write=1,2 -p PID

    W miejsce PID należy wpisać numer wyświetlony przez skrypt trace_test.sh. Przykładowy wynik działania:

    Process 14589 attached - interrupt to quit
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 5\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 35 0a                           Linia 5.          |
    Process 14598 attached
    Process 14589 suspended
    Process 14589 resumed
    Process 14598 detached
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 6\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 36 0a                           Linia 6.          |
    Process 14599 attached
    Process 14589 suspended
    Process 14589 resumed
    Process 14599 detached
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 7\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 37 0a                           Linia 7.          |
    Process 14601 attached
    Process 14589 suspended
    Process 14589 detached
    Process 14601 detached

Analiza takich danych może nie jest najłatwiejsza, ale zawsze dobrze mieć trochę więcej informacji :).

Źródła

Tags: , , , , ,

Dodanie możliwości przeszukiwania plików PDF

Zdarza się, że w pliku PDF znajdują się zeskanowane strony, zapisane w formacie JPG. W dokumencie takim nie ma możliwości skorzystania z możliwości jego przeszukania lub indeksowania treści (tak to już bywa z grafiką). W znaczącym stopniu obniża to użyteczność takiego dokumentu. Istnieją jednak aplikacje, które potrafią rozpoznać tekst w takim dokumencie (wykorzystując OCR) oraz dodać przezroczystą warstwę w dokumencie, w której zostanie on umieszczony. Pozwoli to z jednej strony na przeszukanie dokumentu a z drugiej zostanie zachowana jego struktura. Jest to prostsze rozwiązanie niż rozpoznanie całej struktury dokumentu, łącznie z formatowaniem.

Jedną z takich aplikacji jest pdfocr. Automatycznie rozpoznaje tekst znajdujący się w pliku PDF i dodaje go do tego pliku.

Czym jest pdfocr

Aplikacja pdfocr jest skryptem napisanym w Ruby, który łączy kilka aplikacji w celu rozpoznania tekstu w dokumencie PDF.

W poszczególnych krokach aplikacja robi:

  • przy użyciu pdftk dzieli plik PDF na pojedyncze strony
  • przy użyciu pdfimages wyodrębnia dane graficzne
  • rozpoznaje tekst za pomocą aplikacji cuneiform
  • rozpoznany tekst jest dodawany do pliku PDF przy użyciu hocr2pdf
  • łączy wszystkie pliki za pomocą pdftk

Instalacja aplikacji pdfocr

W przypadku Ubuntu należy dodać odpowiednie repozytorium:

sudo add-apt-repository ppa:gezakovacs/pdfocr
sudo aptitude update
sudo aptitude install pdfocr

Po tych krokach aplikacja powinna zostać zainstalowana wraz z koniecznymi zależnościami.

Rozpoznanie teksty w pliku PDF

Rozpoznanie tekstu jest proste:

pdfocr -i plik_wejsciowy.pdf -o plik_wyjsciowy.pdf

Po zakończeniu działania, powinniśmy mieć plik PDF z załączonym rozpoznanym tekstem. Domyślnie używanym językiem użytym do rozpoznania tekstu jest język angielski. Można go zmienić używając przełącznika -l, wartości jakie może on przyjąć są zależne od języków obsługiwanych przez aplikację cuneiform:

$ cuneiform -l
Cuneiform for Linux 0.9.0
Supported languages: eng ger fra rus swe spa ita ruseng ukr srp hrv pol dan por dut cze rum hun bul slo lav lit est tur.

Niestety, przynajmniej w moim przypadku, jakość działania moduły OCR jest ledwie zadowalająca. W kilku dokumentach które sprawdzałem wiele słów nie zostało rozpoznanych poprawnie. Nawet pomimo tego, aplikacja może być przydatna, przynajmniej daje szansę na odszukanie jakieś informacji w tekście.

Źródła

Tags: , , , , , , , ,