#!/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}