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

от автора

Универсальная установка 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@<b>ваш_сервер</b> 'hg-update-users' 

Если вы пропустили завершающий штрих, зайдите через ssh и выполните все команды вручную.
Теперь проверим доступ:

$ ssh hg@<b>ваш_сервер</b> PTY allocation request failed on channel 0 <u>mercurial-server: direct logins on the hg account prohibited</u> Connection to <b>ваш_сервер</b> closed. 

Если вы получили именно эти строки, значит sshd принимает ваши ключи, теперь попробуйте:

ssh hg@<b>ваш_сервер</b> 'hg -R hgadmin serve --stdio' 

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

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

Для меня самой распростаренной ошибкой(из трех установок: ubuntu 10.04 server, linux mint 12, fedora 16) было следующее:

$ssh hg@<b>ваш_сервер</b> '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) 

ссылка на оригинал статьи http://habrahabr.ru/post/164095/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *