Що таке CVS-сервер і для чого його використовують розказувати не буду, думаю, ви самі це знаєте ;-)

Встановлення та налаштування пакету CVS.

Сама процедура встановлення пакету в систему має певні відмінності в залежності від дистрибутиву який ви використовуєте. Тому цю частину пройдете самі відомими вам методами та засобами.

Я використовую дистрибутив Gentoo, тому для мене встановлення пакету cvs виглядає наступним чином:

# emerge cvs 

Після цього клієнт для роботи з CVS серверами готовий, але зовсім не готовий для роботи ваш власний CVS-сервер, який ви вирішили розташувати у своїй мережі.

Наступна інформація буде майже ідентичною для всіх існуючих дистрибутивів, за винятком розташування вашого репозиторію, тому далі в тексті будемо вказувати шлях до репозиторію CVS змінною CVS_PATH яка в моєму випадку вказує на каталог /var/cvsroot.

Всі входження змінної CVS_PATH в тексті замініть на реальний шлях до каталога в якому буде розташовано ваш репозиторій.

Перевіряємо чи є в файлі /etc/passwd радок подібний на цей:

cvs:x:102:408:added by portage for cvs:CVS_PATH:/bin/false 

Це користувач, від імені якого будуть працювати користувачі CVS-сервера з репозиторієм, та сам CVS-сервер. Також превіряємо присутність відповідної групи в файлі /etc/group:

cvs:x:408

Якщо подібні рядки присутні в цих файлах, то ваш дистрибутив дбає про вас :-) якщо ні то "подякуйте" розробникам і приступайте до створення відповідного користувача та групи самі.

Права доступу до каталогу CVS_PATH повинні бути drwxr-xr-x. Встановлюються вони командою:

chmod 755 CVS_PATH 

Також можете спробувати атрибути drwxr-x---, які встановлюються командою:

chmod 750 CVS_PATH

Вони надають кращий захист репозиторію.

Власника репозиторію встановлюємо командою:

chown cvs:csv CVS_PATH 

Для запуску CVS-серевера будемо використовувати xinetd який так само потрібно встановити відомим вам шляхом.

Далі в каталозі /etc/xinetd.d перевіряємо (створюємо) наявність файлу cvspserver, вміст якого подано нижче:

service cvspserver
{
    disable = no
    socket_type = stream
    wait = no
    user = cvs
    group = cvs
    log_type = FILE /var/log/cvspserver
    protocol = tcp
    env = HOME=CVS_PATH
    log_on_failure += USERID
    port = 2401
    server = /usr/bin/cvs
    server_args = -f --allow-root=CVS_PATH pserver
} 

Тепер зробіть так, щоб сервер xinetd запускався при старті системи. Також перевірте основний конфігураційний файл /etc/xinetd.conf, чи сервер xinetd "слухає" зовнішні адреси, а не прив’язаний до внутрішніх адрес вашої мережі. Якщо потрібно, змініть налаштування iptables на предмет відкриття доступу до вашого CVS-сервера який повинен "слухати" порт 2401.

Після всіх цих дій ви можете ініціалізувати репозиторій вашого майбутнього CVS-сервера в якому будуть зберігатися всі ваші проекти, командою:

# cvs -d CVS_PATH init

Після чого в каталозі CVS_PATH буде створено новий каталог CVSROOT, який буде містити системні файли для роботи вашого CVS-сервера.

Конфігурація доступу до CVS-сервера

CVS-сервер який не дозволяє працювати на ньому користувачам, ніякого сенсу немає, отже наступний крок — налаштування прав доступу користувачів до вашого CVS-сервера.

Створення користувачів.

Для того щоб надати користувачам доступ до вашого CVS-сервера, потрібно їх зареєструвати в файлі CVS_PATH/CVSROOT/passwd.

Формат цього файлу такий:

USERNAME:ENCRYPTED_PASSWORD:SYSTEM_USERNAME

Поля, відповідно, означають:

USERNAME : Логін користувача під яким він буде заходити на ваш CVS-сервер.

ENCRYPTED_PASSWORD : Зашифрований пароль користувача (як зашифрувати пароль — читайте далі).

SYSTEM_USERNAME : Системний логін під яким віртуальний користувач CVS-сервера буде працювати з репозиторієм вашого CVS-сервера.

Приклад мого файлу CVS_PATH/CVSROOT/passwd:

anonymous:ptzicv7OO99kc:cvs
skydion:kKd8LrgIO16hk:cvs

Як бачите, всі користувачі вашого CVS-сервера будуть працювати від імені реального користувача - cvs якого ми створили (чи дистрибутив створив за нас) на самому початку встановлення пакету cvs.

Як створюються шифровані паролі для файлу CVS_PATH/CVSROOT/passwd?

Всі паролі шифруються методом DES з допомогою системної функції crypt(). Для полегшення створення таких паролів використаємо наступний perl-скрипт cvs_passwd:

#!/usr/bin/perl

srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $login = shift;

if ($login ne "anonymous") {
  my $plaintext = shift;
} else {
  my $plaintext = "";
}

my $crypttext = crypt ($plaintext, $salt);

print STDOUT "   login: ${login}\n";
print STDOUT "password: ${plaintext}\n";

print STDERR "${login}:${crypttext}:cvs\n"

Використовуємо для всіх користувачів крім anonymous таким чином:

# cvs_passwd skydion passwd_for_skydion 2 >> CVS_PATH/CVSROOT/passwd 

Для користувача anonymous використовуємо так:

# cvs_passwd anonymous 2 >> CVS_PATH/CVSROOT/passwd 

Аргументи скрипта:

skydion : Логін який використовується для входу на ваш CVS-сервер.

passwd_for_skydion : Пароль, який повинен вводити користувач при вході на ваш CVS-сервер.

Результат роботи скрипта:

  1. Логін та пароль в текстовому форматі виводяться в stdout, цю інформацію ви повинні передати зареєстрованим користувачам вашого CVS-сервера.
  2. В потік stderr виводиться інформація в форматі файлу CVS_PATH/CVSROOT/passwd. Цей потік можна перенаправити відразу в файл passwd, як це зроблено в прикладі.
  3. Для користувача anonymous потрібно використовувати пустий пароль — це робиться самим скриптом.

Розподілення доступу для користувачів CVS-сервера.

Більшу частину роботи ми вже зробили. Тепер настає черга для розділення прав доступу до вашого CVS-сервера.

Права доступу розділяються на дві категорії:

  • лише читання;
  • читання і запис.

Для їх реалізації, створюємо два файли:

# : > CVS_PATH/CVSROOT/readers
# : > CVS_PATH/CVSROOT/writers

Думаю, з назви цих файлів більш менш ясно за що вони відповідають.

Вміст мого файлу readers:

anonymous

Тобто користувач anonymous зможе лише читати файли з репозиторію вашого CVS-сервера, але не зможе завантажувати змінені ним файли назад на сервер.

Вміст мого файлу writers:

skydion
test

Ці два користувачі мають повний доступ (читання та запис) в репозиторій мого тестового CVS-сервера, у вас будуть інші логіни для користувачів.

Якщо логін користувача розташований в обох файлах одночасно, то CVS-сервер відносить такого користувача до першої категорії (тобто він має право лише читати дані з вашого CVS-серевера).

Тестування встановленого CVS-сервера.

Для тестування вашого нового CVS-сервера створіть якусь директорію, для прикладу, qcad і в ній теж створіть пару піддиректорій та кілька різних файлів. Перевірте, чи запущений сервер xinetd, після чого виконайте команди:

# cd ~/qcad
# cvs -d :pserver:skydion@localhost:CVS_PATH login
Password: введіть пароль для логіна skydion -> passwd_for_skydion
# cvs import -m "import new source code" qcad skydion start

після цих команд в директорії CVS_PATH буде створена нова директорія з назвою qcad.

Тепер можете стерти тестову директорію ~/qcad і виконати наступну команду:

# cvs checkout qcad

Ця команда створить в активній директорію копію проекту розташованого на вашому CVS-сервері.

Якщо всі ці команди відпрацювали на ура, то можу вас привітати з власним CVS-сервером ;-)

Ну от, ніби і все.

Пишіть свої зауваження за адресою: skydion.at.ukr.net