RCS dla administratora
copyright 2003 by Tomasz Bąk aka Hasz
W tym krótkim artykule postaram się przedstawić zalety płynące z wykorzystywania systemu kontroli wersji RCS (Revision Control System) do zarządzania zmianami w systemowych plikach konfiguracyjnych.
Prawdopodobnie każdy wie mniej więcej, do czego służą systemy kontroli wersji takie jak RCS czy jego następca CVS. Znajdują one zastosowanie wszędzie tam, gdzie pliki tekstowe ulegają częstym zmianom, niejednokrotne wprowadzanym przez wielu autorów w różnych odstępach czasu. Niekiedy wprowadzone zmiany wywołują niepożądane skutki uboczne i chcemy przywrócić stan poprzedni oraz dowiedzieć się co wywołało problem oraz dlaczego (logi).
W przypadku zarządzania wersjami systemowych plików konfiguracyjnych rozsądnym rozwiązaniem jest wybór RCS, które zapewnia wszystkie niezbędne funkcjonalności, a zarazem, jest proste w obsłudze i idealnie nadaje się do pracy lokalnej.
Dla potrzeb tego artykułu przyjmijmy, że chcemy w wygodny sposób kontrolować zmiany w pliku reguł filtra pakietów PF. Aby rozpocząć pracę tworzymy katalog, w którym będą przechowywane pliki RCS. Pliki te przechowują zawartość pliku pierwotnego i dodatkowe informacje o wprowadzanych zmianach oraz logach. Gdybyśmy nie utworzyli tego katalogu, pliki RCS ("*,v") byłby przechowywane w bieżącym katalogu, co powodowałoby spory bałagan.
root@host:etc# mkdir RCS
Aby zarządzać nowym plikiem, należy skorzystać z polecenia ci(1) (check in - wprowadź zmiany). Ponieważ polecenie to służy do wprowadzania zmian do pliku RCS, to w przypadku gdy odpowiedniego pliku "*,v" jeszcze nie ma, jest on tworzony. Plik ten będzie stanowił pierwotną wersje (initial revision), dlatego pierwszy wpis w logach jest traktowany jako opis całego pliku.
RCS/pf.conf,v <-- pf.conf
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> plik reguł filtra pakietów PF
>> .
initial revision: 1.1
done
Ciekawość budzi zapewne opcja "-l" (małe L), która pochodzi od słowa "lock", czyli zablokuj. Jej użycie umożliwia wprowadzanie zmian do pliku i jednocześnie pozbawia takiej możliwości innych użytkowników. Istnieje także przeciwstawna opcja "-u" (unlock), która zwalnia blokadę. Mechanizm ten ma na celu zapewnienie spójności wprowadzanych zmian przy jednoczesnej pracy wielu użytkowników. Podczas dodawania nowego pliku podanie "-l" lub "-u" powoduje, że określony jest status pliku i nie znika nam oryginał.
W tym momencie warto zadbać o ograniczenie praw do wykonywania operacji na plikach w katalogu RCS poprzez odebranie prawa do czytania grupie i innym użytkownikom. Takie ograniczenie sprowadza znaczenie opcji "-l" i "-u" jedynie do automatycznego zabezpieczania nas przed przypadkowym wprowadzeniem zmian (np `echo "ups!" > rc.local`), ponieważ aby je wprowadzić musimy świadomie nadać plikowi stan "locked".
Skorzystajmy teraz z naszego ulubionego edytora i wprowadźmy jakieś zmiany. Jeśli plik nie jest zablokowany, trzeba pobrać plik z blokadą "co -l pf.conf".
-rw------- 1 root wheel 825 Jul 21 05:28 pf.conf
root@host:etc# vi pf.conf
root@host:etc# rcsdiff pf.conf
===================================================================
RCS file: RCS/pf.conf,v
retrieving revision 1.1
diff -r1.1 pf.conf
17a18,19
> rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
> port 8021
root@host:etc# ci -u pf.conf
RCS/pf.conf,v <-- pf.conf
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>> przekierowanie pakietów TCP z portu 21 na port 8021
>> .
done
root@host:etc# ls -l pf.conf
-r-------- 1 root wheel 894 Jul 21 05:28 pf.conf
Polecenie rcsdiff(1) jest bardzo podobne do zwykłego
diff(1) z tym, że przeznaczone jest do pracy z plikami RCS. Zwykle jako parametry przyjmuje plik oraz numery wersji, między którymi chcemy przeglądnąć zmiany. Bez podania wersji, porównuje plik z jego najnowszą wersją w RCS. Wynik polecenia może być wykorzystywany przez program patch(1).
Polecenie ci(1) (check in) wprowadza zmiany do pliku RCS. Tym razem zastosowaliśmy parametr "-u", ponieważ wydaje się nam, że nie będziemy wprowadzać już żanych zmian. Oczywiście nie jest to prawdą.
Następnie spróbujmy dodać jakieś użyteczne informacje do naszego pliku. Powiedzmy, że chcemy, aby w pliku były widoczne informacje o numerze rewizji, czasie zmian i autorze oraz wprowadzony log. Wykorzystamy do tego tag $Log$. Dodatkowo wprowadzimy także popularny tag $Id$, aby pokazać różnicę między nimi.
RCS/pf.conf,v --> pf.conf
revision 1.2 (locked)
done
root@host:etc# ls -l pf.conf
-rw------- 1 root wheel 931 Jul 21 05:42 pf.conf
root@host:etc# vi pf.conf
root@host:etc# rcsdiff pf.conf
===================================================================
RCS file: RCS/pf.conf,v
retrieving revision 1.2
diff -r1.2 pf.conf
0a1,4
> #
> # $Id$
> # $Log$
>
root@host:etc# ci -u pf.conf
RCS/pf.conf,v <-- pf.conf
new revision: 1.3; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> dodane tagi Id i Log
>> .
done
Ponieważ, jest już kilka zman, możemy przeglądnąć wszystkie logi:
RCS file: RCS/pf.conf,v
Working file: pf.conf
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 3; selected revisions: 3
description:
plik reguł filtra pakietów PF
----------------------------
revision 1.3
date: 2003/07/21 06:00:54; author: root; state: Exp; lines: +4 -0
dodane tagi Id i Log
----------------------------
revision 1.2
date: 2003/07/21 05:42:30; author: root; state: Exp; lines: +2 -0
przekierowanie pakietów TCP z portu 21 na port 8021
----------------------------
revision 1.1
date: 2003/07/21 05:28:51; author: root; state: Exp;
Initial revision
=============================================================================
Zobaczymy teraz, jak wyglądają nasze tagi po wprowadzeniu do pliku RCS.
root@host:etc# rcsdiff -r1.2 -r1.3 pf.conf
===================================================================
RCS file: RCS/pf.conf,v
retrieving revision 1.2
retrieving revision 1.3
diff -r1.2 -r1.3
0a1,7
> #
> # $Id: pf.conf,v 1.3 2003/07/21 06:00:54 root Exp $
> # $Log: pf.conf,v $
> # Revision 1.3 2003/07/21 06:00:54 root
> # dodane tagi Id i Log
> #
>
Jak widać posługiwanie się RCS sprowadza się do kilku prostych komend. Bardzo łatwo jest dokonywać zmian i odzyskiwać poprzednie wersje. Należy podkreślić, że skupiliśmy się tutaj na podstawowych funkcjach RCS. Więcej informacji można znaleźć na stronach podręcznika systemowego man(1):
rcsintro(1), ci(1), co(1), rcsdiff(1), diff(1), patch(1), rcs(1), rlog(1), ident(1), rcsfile(5), rcsmerge(1), rcsclean(1).
quex, wt., 26/02/2008 - 21:54
