Как стать автором
Обновить

Установка mercurial-server over ssh из исходников

Mercurial *
Универсальная установка mercurial-server over ssh, от нуля до 100%.


Постоянно пользуюсь топиком aivus, но к сожалению его как правило не хватает.

Настройку буду проводить для mercurial-server 1.3, fedora 16. Если при попытке воспользоваться постом у вас будут ошибки, в комментариях пишите систему и суть ошибки, будем решать.

Подготовка


Самостоятельно установите и настройте
  • wget
  • nano
  • python
  • mercuial


Установка


Получим исходники:
wget http://dev.lshift.net/paul/mercurial-server/mercurial-server_1.3.tar.gz
tar -xf mercurial-server_1.3.tar.gz
cd mercurial-server-1.3

Установим mercurial-server
python setup.py build
python setup.py install

Я предпочитаю перенести все скрипты в одно место.
cp scripts*/* /var/lib/mercurial-server/

Настройка sshd


Нам нужно активировать авторизацию по публичному ключу
nano /etc/ssh/sshd_config 

Раскомментируйте или добавьте строки
RSAAuthentication yes
PubkeyAuthentication yes

Также сделаем единый центр хранения ключей
AuthorizedKeysFile /etc/ssh/keys/%u.pub
mkdir /etc/ssh/keys

Трансляция ключей в sshd


Все ключи пользователей mercurial-server хранятся по адресу
/etc/mercurial-server/keys/ во время запуска refresh-auth(нужно запускать при каждом добавлении пользователя), все ключи записываются в /var/lib/mercurial-server/.ssh/authorized_keys
Что бы sshd стал принимать эти ключи сделаем следующее
touch /var/lib/mercurial-server/.ssh/authorized_keys
chmod 644  /var/lib/mercurial-server/.ssh/authorized_keys
ln  /var/lib/mercurial-server/.ssh/authorized_keys /etc/ssh/keys/hg.pub

Завершающий штрих


Это не нужно делать если вы собираетесь управлять ключами только через hgadmin!
touch /usr/bin/hg-update-users
chmod 744 /usr/bin/hg-update-users
nano /usr/bin/hg-update-users

chown hg -R /etc/mercurial-server/keys/
chmod 444 -R /etc/mercurial-server/keys/
sudo -u hg /var/lib/mercurial-server/refresh-auth

Проверка


Создадим ключ администратора mercurial-server(на клиенте)
ssh-keygen
scp ~/.ssh/id_rsa.pub root@<b>ваш_сервер</b>:/etc/mercurial-server/keys/root/
ssh root@ваш_сервер 'hg-update-users'

Если вы пропустили завершающий штрих, зайдите через ssh и выполните все команды вручную.
Обязательно вводите сложный пароль ключа ssh! Исключите возможность утечки файла ~/.ssh/id_rsa третьим лицам!
Теперь проверим доступ:
$ ssh hg@ваш_сервер
PTY allocation request failed on channel 0
<u>mercurial-server: direct logins on the hg account prohibited</u>
Connection to ваш_сервер closed.

Если вы получили именно эти строки, значит sshd принимает ваши ключи, теперь попробуйте:
ssh hg@ваш_сервер 'hg -R hgadmin serve --stdio'

Если в течение 30 секунд вы не получили никаких ошибок, значит соединение настроено, и вы можете использовать ваш сервер.

Устранение ошибок


Для меня самой распростаренной ошибкой(из трех установок: ubuntu 10.04 server, linux mint 12, fedora 16) было следующее:
$ssh hg@ваш_сервер 'hg -R hgadmin serve --stdio'
Traceback (most recent call last):
  File "/var/lib/mercurial-server/hg-ssh", line 86, in <module>
    dispatch.dispatch(['-R', repo, 'serve', '--stdio'])
  File "/usr/lib64/python2.7/site-packages/mercurial/dispatch.py", line 31, in dispatch
    if req.ferr:
AttributeError: 'list' object has no attribute 'ferr'

Решение этой проблемы можно найти stackoverflow.com/questions/6730735/troubles-with-mercurial-1-9-and-ssh
Особо ленивые могут воспользоваться патчем (patch hg-ssh patch_file):
--- hg-ssh_old	2012-12-27 00:49:04.764989364 +0300
+++ hg-ssh	2012-12-27 00:50:16.173113572 +0300
@@ -83,7 +83,7 @@
     repo = getrepo("read", cmd[6:-14])
     if not os.path.isdir(repo + "/.hg"):
         fail("no such repository %s" % repo)
-    dispatch.dispatch(['-R', repo, 'serve', '--stdio'])
+    dispatch.dispatch(dispatch.request(['-R', repo, 'serve', '--stdio']))
 elif cmd.startswith('hg init '):
     repo = getrepo("init", cmd[8:])
     if os.path.exists(repo):
@@ -91,7 +91,7 @@
     d = os.path.dirname(repo)
     if d != "" and not os.path.isdir(d):
         os.makedirs(d)
-    dispatch.dispatch(['init', repo])
+    dispatch.dispatch(dispatch.request(['init', repo]))
 else:
     fail("illegal command %r" % cmd)
Теги:
Хабы:
Всего голосов 18: ↑5 и ↓13 -8
Просмотры 5.5K
Комментарии Комментарии 5