Sunday, September 14, 2008

Nadać plikowi takie same prawa dla grupy jakie ma dla właściciela - skrypcik w Rubym

Poniżej prosty (w miarę) skrypcik w rubym, nadający plikom takie same uprawnienia dla grupy, jak dla właściciela. Przydatne jeśli chcemy korzystać z Subversion za pomocą protokołu svn+ssh - wtedy użytkownik musi mieć odpowiednie uprawnienia do plików w repozytorium.
def give_rights_of_owner_to_group(file_path)
s = File::Stat.new((file_path))
rights = sprintf('%o', s.mode)
all = rights[-1,1]
group = rights[-2,1]
owner = rights[-3,1]
beginning = rights[0..-4]

new_rights = "#{beginning}#{owner}#{owner}#{all}".to_i 8
puts "#{(file_path)}: #{rights} #{sprintf('%o', new_rights)}"

File.chmod(new_rights, file_path)
end

def chmod_all_files_in_dir(dir_path)
Dir.open(dir_path) do |d|
  d.each do |fn|
    if not fn =~ /^(\.\.?)$/
      file_path = File.expand_path(d.path + File::Separator + fn)
      give_rights_of_owner_to_group file_path
    
      if File.directory? file_path
        chmod_all_files_in_dir file_path
      end
    end
  end
end
end

if $*.empty?
chmod_all_files_in_dir(".")
else
chmod_all_files_in_dir($*[0])
end
Używa się podając jako parametr katalog w którym chcemy zmienić uprawnienia (czyli katalog repozytorium Subversion). Uruchomione bez parametru zmienia uprawnienia w bierzącym katalogu. Oczywiście żeby zmienić uprawnienia do pliku którego nie jesteśmy właścicielem musimy skrypt uruchamiać z prawami roota. Czyli uruchamiamy tak:
sudo script.rb /home/svn/repository

Wednesday, September 3, 2008

Instalacja subversion pod ubuntu (lub innym linuxem)

Zainstalowanie subversion pod ubuntu jest stosunkowo proste. Przede wszystkim trzeba ściągnąć pakiet svn

sudo apt-get install subversion

Subversion zainstalowane, teraz trzeba utworzyć repozytorium. Zanim to jednak zrobimy, warto utworzyć użytkownika specjalnie dla subversion.

sudo adduser svn

Teraz możemy już utworzyć repozytorium. Najlepiej od razu jako użytkownik svn.

sudo -u svn mkdir /home/svn/repository
sudo -u svn svnadmin create /home/svn/repository

Ok, mamy repozytorium. Dostać się do niego można na kilka sposobów, używając różnych protokołów.

file://

Dostęp
bezpośrednio przez system plików. Aby go uzyskać wystarczy komenda

svn info file:///home/svn/repository

svn to wywołanie klienta subversion, info mówi że chcemy tylko ściągnąć informacje o danym repozytorium, a to co później to protokół i adres repozytorium.

Kontrola dostępu na poziomie dostępu do plików. Tzn. jeśli user który odpala tę komendę ma dostęp do odczytu plików w repozytorium, to może je odczytać, jeśli ma uprawnienia także do zapisu, to może zapisać.

svn://

To jest specjalny protokół subversion. Nieszyfrowany. Aby połączyć się z serwerem należy go najpierw uruchomić:

sudo -u svn svnserve -d -r /home/svn/repository

sudo -u svn jest po to, żeby serwer uruchomić jako użytkownik svn. Musi on być uruchomiony przez użytkownika, który ma dostęp do plików zarówno do odczytu jak i zapisu.
-d oznacza że uruchamiamy serwer w trybie deamon
-r to położenie naszego repozytorium w systemie plików

I teraz już możemy się odwołać do repozytorium przez klienta svn:

svn info svn://localhost

Co bardziej dociekliwi zauważą, że tutaj nie trzeba podawać ścieżki do repozytorium. Wystarczy, że podaliśmy ją serwerowi, a on już na odpowiednim porcie "podaje" co trzeba.

Tutaj dostęp kontrolujemy za pomocą mechanizmów Subversion. W katalogu /home/svn/repository/conf znajduje się plik svnserve.conf
Możemy odkomentować linijki

# anon-access = read
# auth-access = write


Są to domyślne ustawienia oznaczające odczyt dla każdego, zapis tylko dla zautoryzowanych użytkowników. Możliwe wartości to read, write i none. Żeby użytkownicy mogli się logować, musimy jeszcze odkomentować linijkę

# password-db = passwd

Jest to wskazanie na plik, w którym trzymane są nazwy i hasła użytkowników. Jeśli ścieżka nie jest podana, odnosi się do katalogu conf. Nazwy i hasła w tym pliku trzymane są w czystym tekście, w postaci niezaszyfrowanej, więc ważne jest odpowiednie ustawienie dostępu do tego pliku.

svn+ssh://

Tak jak wyżej, z tą różnicą, że połączenie jest szyfrowane i nie potrzebujemy startować serwera. Poza tym nie jest używany plik passwd. Są jednak używane ustawienia anon-access i auth-access. W tym przypadku zautoryzowany użytkownik to taki, któremu udało się zautoryzować przez ssh.

http://

Aby udostępnić repozytorium Subversion przez HTTP potrzebny jest serwer Apache. Instalujemy więc apache'a:

sudo apt-get install apache2 libapache2-svn

Teraz należy odpowiednio zmodyfikować plik /etc/apache2/mods-enabled/dav_svn.conf Modyfikacje polegają głównie na odkomentowaniu poszczególnych linii:

<Location /svn>
DAV svn
#Tutaj ścieżka do naszego repozytorium
SVNPath /home/svn/repository

#Konfiguracja sposobu autoryzacji
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd

#Dzięki tym trzem liniom każdy ma dostęp do odczytu, ale tylko
#zautoryzowani użytkownicy do zapisu
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>

</Location>

Serwer skonfigurowany, dostęp jako tako też, teraz należałoby ustawić plik
/etc/apache2/dav_svn.passwd. Plik ten podaliśmy powyżej jako plik z hasłami. Aby dodać do niego użytkownika, należy wykonać komendę

htpasswd /etc/apache2/dav_svn.paswd franek

System zapyta jeszcze o hasło dla franka, i użytkownik franek zostanie dodany do pliku. Od tej chwili będzie mógł autoryzować swój dostęp do naszego repozytorium subversion.

Serwer apache uruchamiany jest z prawami użytkownika www-data. Nie ma on dostępu do naszego repozytorium, więc musimy mu taki dostęp nadać. Możemy to zrobić na dwa sposoby:
1. Dodać użytkownika www-data do grupy svn i dać poszczególnym plikom i katalogom w repozytorium możliwość zapisu dla grupy
2. Zmienić właściciela repozytorium na www-data.

Użyjemy tutaj drugiego sposobu ze względu na jego prostotę ;)

sudo chown -R www-data:www-data /home/svn

Teraz tylko zrestartować apache'a

sudo /etc/init.d/apache2 restart

I możemy korzystać z repozytorium pod adresem http:///svn

https://

Dostęp szyfrowany przez http jest taki sam jak dostęp nieszyfrowany, z tym że do apache'a trzeba dodać certyfikat SSL.