Довольно долго для расшаривания репозиториев меркуриала мне хватало обычного
доступа по 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. Писалось всё по памяти, без экспериментов в реальном времени - надеюсь, что ошибок не допустил, вроде всё просто довольно. ;-)
-
Речь, естественно, не про рабочую копию - её у репозитория нету ↩︎