#!/bin/bash
tmphtpass="/var/tmp/htpass" #определяем временный файл базы паролей
repohome="/home/repos/" #определяем корневую папку для репозиториев
hgservepid="/var/run/hgserver.pid" #pid hg serve
hgaccesslog="/var/log/hg_access.log" #access лог файл для hg server
domain="exapmple.com" #tld имя сервера
confdir="/etc/hg/" #определяем корневую папку для конфигов
confile=${confdir}"repo.cfg" #основной конфиг файл /etc/hg/repo.cfg
webconfig=${confdir}"web.config" #конфиг для hg server /etc/hg/web.config
nginxconfig=${confdir}"nginx.conf" #конфиг для nginx /etc/hg/nginx.conf
nginxauthdir=${confdir}"nginx/" #папка баз паролей для доступа к репозиториям
[ -s ${confile} ] || echo "where is config file?" #проверяем наличие основного конфига
[ -s ${confile} ] || exit 0 # огорчаемся, если нет основного конфига
#парсим секцию [repos] на предмет репозиториев
repos=`cat ${confile}|sed '/^$/d'|sed '/^#/d'|sed 's/\ //g'|awk '/\[repos\]/{
is_repos=1;
while (is_repos==1)
{if (getline <= 0 || index($0,"[")==1)
{is_repos=0;}
else
{print $0;}}}'`
#Проверяем наличие папок с репозиториями и при необходимости создаем
for i in ${repos}
do;[ -d ${repohome}${i} ] || /usr/bin/hg init ${repohome}${i};done
#генерируем конфиг для hg server
echo "[web]
allow_push = *
push_ssl = false
[paths]" > ${webconfig}
#разрещаем доступ только к активным репозиториям
for i in ${repos}
do;echo ${i}=${repohome}${i} >> ${webconfig};done
#перезагружаем hg serve
[ -a ${hgservepid} ] && /bin/kill `/bin/cat ${hgservepid}` && rm ${hgservepid}
/usr/bin/hg serve -d -A ${hgaccesslog} -p 8080 -a 127.0.0.1 --pid-file ${hgservepid} --encoding utf8 --webdir-conf ${webconfig}
#создаем конфиг для nginx
echo "server
{
listen 443;
server_name hg."${domain}";
client_max_body_size 128M;
ssl on;
ssl_certificate /etc/ssl/nginx/nginx.pem;
ssl_certificate_key /etc/ssl/nginx/nginx.key;" > ${nginxconfig}
#создаем lacation для активных репозиториев
for i in ${repos}
do
echo "location /"${i}"
{
proxy_pass http://127.0.0.1:8080;
auth_basic \"Restricted\";
auth_basic_user_file "${nginxauthdir}${i}".pass;
access_log /var/log/nginx/"${i}".hg."${domain}".ssl_access_log main;
error_log /var/log/nginx/"${i}".hg."${domain}".ssl_error_log info;
}" >> ${nginxconfig}
done
echo "}" >> ${nginxconfig}
#создаем (обнуляем на всякий случай) временную базу паролей
cat /dev/null > ${tmphtpass}
#парсим секцию основного конфига [users]
#генеририруем пароли для все активных пользователей
cat ${confile}|sed '/^$/d'|sed '/^#/d'|sed 's/\ //g'|awk -v passfile=$tmphtpass '/\[users\]/{
is_users=1;
while (is_users==1)
{if (getline <= 0 || index($0,"[")==1)
{is_users=0;}
else
{split($0,userpass,"=");system("htpasswd -b "passfile" "userpass[1]" "userpass[2]);}}}'
#парсим секцию [access] основного конфига
#и получаем список привилегий вида repo=user1,user2
access=`cat ${confile}|sed '/^$/d'|sed '/^#/d'|sed 's/\ //g'|awk '/\[access\]/{
is_access=1;while (is_access==1)
{if (getline <= 0 || index($0,"[")==1)
{is_access=0;}
else
{print $0;}}}'`
#проверяем есть ли папка для хранения баз паролей
[ -d ${nginxauthdir} ] || mkdir -p ${nginxauthdir}
#удаляем старые файлы баз паролей
find ${nginxauthdir} -type f -name *.pass -delete
#для каждого репозитория из секции [access] генерируем личную базу паролей
for i in ${access}
do;echo ${i}|sed 's/,/\|/g'|awk -v tmphtpass=${tmphtpass} -v nginxauthdir=${nginxauthdir} \
'BEGIN{FS="="}{system("cat "tmphtpass" |egrep \""$2"\" > "nginxauthdir""$1".pass")}'done
#перезапускаем nginx
/etc/init.d/nginx restart
#удаляем временный файл базы паролей
rm ${tmphtpass}
Action unknown: copypageplugin__copy