sobota, 23 kwietnia 2011

Mercurial na wspólnym koncie SSH dla wielu użytkowników.

Przedstawiona niżej technika dzielenia repozytorium umożliwia wielu użytkownikom korzystaniem z repozytorium Mercuriala(przy drobnej modyfikacji to samo dotyczy gita) na jednym koncie SSH bez udzielania wszystkim dostępu do shella. Jedyne co na naszym koncie będą mogli robić nasi współpracownicy to korzystanie z określonego repo. Technika ta jest przydatna w przypadkach gdy nie mamy możliwości by każdemu commiterowi przydzielić osobne konto shellowe.
Oczywiście istnieją gotowe(często dość rozbudowane skrypty) korzystające z tej metody(np.Gitosis).
W poniższym artykule chciałbym dotrzeć jednak do sedna działania, dzięki temu czytelnicy będą mogli wymyślić także inne zastosowania i udziwnienia.

By umożliwić innej osobie korzystanie z naszego shella bez podawania jej hasła korzystamy z kluczy RSA. Jak dokładnie należy to zrobić napisałem w innym artykule(Klik). W stosunku do niego należy wykonać drobną modyfikację. Przed treścią klucza należy dopisać poniższą linijkę:


no-port-forwarding,command="./script.pl"


"command" jako shella ustawia wybrane przez nas polecenie, przy okazji zabraniamy znajomym forwardowania za pomocą naszego konta(wszystkie możliwe opcje możemy znaleźć w manualu do sshd).

Teraz pora na najistotniejszą część, tj. treść skryptu(w tym wypadku PERL), która może wyglądać np. tak:


#!/usr/bin/perl

$command = $ENV{'SSH_ORIGINAL_COMMAND'};

if($command eq "hg -R merktest serve --stdio") {
exec($command);
} else {
print "Shell access denied!\n";
}


Oczywiście jest to tylko przykładowy kod dla szczególnego przypadku(dostęp do repozytorium pod nazwą "merktest" ). Można go uogólnić, ulepszyć wedle uznania, wyobraźni i potrzeb. Nie daję tutaj rozbudowanego przykładu gdyż nie jest to celem artykułu ;).

Jeśli chcemy zrobić coś analogicznego dla git'a zmieniamy warunek na:


if ($command eq "git-upload-pack gitrepo")


Oczywiście to również jest szczególny przypadek dla repozytorium o nazwie "gitrepo".

Generalnie polecam eksperymenty.