Универсальная установка 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)
Автор: Offenso