solovyov.net

Доступ к репозиторию hg через ssh

3 min read · hg, nix

Довольно долго для расшаривания репозиториев меркуриала мне хватало обычного доступа по HTTP: легко настроить (дал права пользователю веб-сервера - www-data, и всё), просмотреть, работает всё чётко и без запинки. Но в конце-концов достало меня раз за разом набирать пароль для заливания своих изменений в репозиторий, а так как единственным альтернативным вариантом при доступе через HTTP является запись пароля открытым текстом в hgrc локального репозитория, я решил поиграться с доступом по ssh.

Вообще доступ по ssh - тоже достаточно простая задача, если бы мне не хотелось оставить возможным для записи доступ по HTTP: получается, что мне нужно получить систему, при которой и я, и веб-сервер будем создавать файлы, в которые способен записывать каждый из нас.

Экшен!

Первым делом, конечно, пошёл в дело chmod:

find /path/to/repo -type d -exec chmod g+s {} \;

Теперь у всех новых файликов, создаваемых в репозитории1, группой-владельцем оказывается группа www-data, куда вхожу и я, и которой принадлежит репозиторий. Остаётся одна загвоздка - было бы хорошо, чтоб на эти новые файлы (на старых, естественно, такие права уже стоят) стояли права записи для группы.

Это достигается установлением umask 002 (777 - 002 = 775, что нам и нужно), который приносит маленькую проблему - кому хочется такое иметь по умолчанию для своего пользователя? Поэтому рисуется (за реализацию спасибо уходит Мартину в Уругвай - не знаю уж, как поставить на него ссылку и где он нашёл его - или сам придумал?) совсем маленький, но очень удаленький плагин для меркуриала:

import os
os.umask(0002)

И подключается, как обычно, в ~/.hgrc (того пользователя, под которым будет проходить соединение с сервером!):

[extensions]
sharedmask = ~/sharedmask.py

И всё, после этого можно пушить без опасений, что потом www-клиенты не смогут этого сделать. Естественно, чтоб пароль не просило, надо настроить логин по ключу - но это описано миллионы раз в интернетах, так что там и спросить можно. ;)

Шаг за шагом

Для тех, кому хочется поподробнее, ниже следует просто список команд (естественно, /path/to/repo и прочие штуки должны заменяться на адекватный аналог у вас ;). Считается, что это Дебиан (или его грязные копии ;)) - т.е. пользователем и группой HTTP-сервера является www-data, и ваш пользователь уже находится в этой группе.

$ chown -R www-data:www-data /path/to/repo
$ chmod -R u=rwX,g=rwX,o=rX /path/to/repo
$ find /path/to/repo -type d -exec chmod g+s {} \;
$ cat > ~/sharedmask.py << EOF
import os
os.umask(0002)
EOF
$ Вот здесь подключение sharedmask.py в ~/.hgrc
$ ln -s /path/to/repo ~/repo

Последняя строка чисто для сокращения пути, если репозиторий лежит не в домашней директории, как это сделано у меня. И, естественно, здесь не затронут вопрос подключения репозитория в веб-интерфейс.

P.S. Писалось всё по памяти, без экспериментов в реальном времени - надеюсь, что ошибок не допустил, вроде всё просто довольно. ;-)


  1. Речь, естественно, не про рабочую копию - её у репозитория нету ↩︎

If you like what you read — subscribe to my Twitter, I always post links to new posts there. Or, in case you're an old school person longing for an ancient technology, put a link to my RSS feed in your feed reader (it's actually Atom feed, but who cares).

Other recent posts

Server-Sent Events, but with POST
ngrok for the wicked, or expose your ports comfortably
PostgreSQL collation
History Snapshotting in TwinSpark
Code streaming: hundred ounces of nuances