Pull to refresh

Сюръективная cистема генерации конфигов Awstats

Когда у тебя один сайт за ним вполне удобно следить. Можно почитать логи веб-сервера, можно поставить Awstats и написать конфиг по примеру.

Со временем, когда у тебя появляется много сайтов, приходится генерить конфиги Awstats автоматически при добавлении сайтов. Довольно нетрудно придумать схему: главные юзеры (из htpasswd могут читать все статистики, а если надо отдельно для конкретного сайта легко в нужный конфиг дописывать нужного юзера. Это когда на сервере хостятся сайты от заказчиков.

Недавно столкнулся с проблемой: у заказчика 8 сайтов, и ему не нравится иметь 8 логинов и паролей. Выдать ему главного пользователя? Тогда он сможет читать статистики других сайтов, возможно даже своих конкурентов. Это неприемлемо. Можно вывести его из системы и править руками данные конфиги. Но ведь могут появится ещё 8 клиентов с такими же проблемами. Тогда уж точно система генерирования конфигов будет не нужна.


Что же тут, можно сделать? Из математики мы знаем, что есть функции, которые отображают многие объекты в одно значение. Например, для f(x)=|x| верно f(2)=f(-2). Иначе говорят, что f(x) сюръективно. Такие функции очень сложно обратить. И возникают различные абстрактные вещи вроде многолистных функций или отношений. А ведь у нас именно такая ситуация: нескольким сайтам должен соответствовать один владелец — пользователь, имеющий права читать статистику всех этих сайтов.

Для того, чтобы решить такую задачу мы введем дополнительную структуру: табличку, в которой будет сказано какой пользователь имеет какой доступ, вроде такой:

ruut *
ex example.com,example.net

В данной ситуации ruut может читать статистику всех сайтов, которые обрабатывает Awstats, а ex — только сайты example.com и example.net.

Хранить предлагаю, например в /opt/awstatstab.

Привожу пример решения на github

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.