Mercurial Hosting > hghosting
diff update_repositories.luan @ 0:dfc36e7ed22c
init
author | Vadim Filimonov <fffilimonov@yandex.ru> |
---|---|
date | Thu, 12 May 2022 13:51:59 +0400 |
parents | |
children | 338ab58d91f2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/update_repositories.luan Thu May 12 13:51:59 2022 +0400 @@ -0,0 +1,157 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local pairs = Luan.pairs or error() +local ipairs = Luan.ipairs or error() +local parse = Luan.parse or error() +local stringify = Luan.stringify or error() +local Io = require "luan:Io.luan" +local uri = Io.uri or error() +local output_of = Io.output_of or error() +local print_to = Io.print_to or error() +local String = require "luan:String.luan" +local trim = String.trim or error() +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "update_repositories" + +uri("file:repos").mkdir() +uri("file:logs").mkdir() +uri("file:config").mkdir() + +local config +local config_file = uri "file:config/config.luano" +if config_file.exists() then + config = parse( config_file.read_text() ) +else + config = { users={}, repos={} } + config_file.write_text( stringify(config).."\n" ) +end +local repos = config.repos +for name, repo in pairs(repos) do + repo.name = name +end + +local ROOTPWD = uri("file:.").canonical().to_string() +local repohome = uri("file:repos").canonical().to_string() +local logsdir = uri("file:logs").canonical().to_string() +local nginxauthdir = uri("file:config/nginx").canonical().to_string() + +-- init new repositories +for repo in pairs(repos) do + if not uri("file:repos/"..repo).exists() then + logger.info("creating repo "..repo) + uri("bash:/usr/local/bin/hg init repos/"..repo).read_text() + end +end +-- delete unused repos +for _, child in ipairs( uri("file:repos").children() ) do + local name = child.name() + if repos[name] == nil then + logger.info("deleting repo "..name) + child.delete() + end +end + +-- update hg config +uri("file:config/web.config").write_text( output_of( function() %> +[web] +allow_push = * +push_ssl = false +staticurl = /hg/static +[paths] +/repo/ = <%=repohome%>/* +<% end_function ) ) + +-- update nginx config +uri("file:config/nginx.conf").write_text( output_of( function() %> + location /hg/static/ { + alias <%=ROOTPWD%>/templates/static/; + } + + location /admin/ { + auth_basic_user_file <%=nginxauthdir%>/_all.pass; + auth_basic "Restricted"; + proxy_pass http://127.0.0.1:8080; + } + + location /private/ { + auth_basic_user_file <%=nginxauthdir%>/_private.pass; + auth_basic "Restricted"; + proxy_pass http://127.0.0.1:8080; + } + +<% for _, repo in pairs(repos) do %> + location /repo/<%=repo.name%>/ + { + set $auth "off"; + auth_basic_user_file <%=nginxauthdir%>/<%=repo.name%>.pass; + if ($request_method = POST ) { + set $auth "Restricted"; + } + access_log <%=logsdir%>/<%=repo.name%>_access_log; + error_log <%=logsdir%>/<%=repo.name%>_error_log; +<% if repo.mode=="private" then %> + if ($request_method = GET ) { + set $auth "Restricted"; + } +<% end %> + auth_basic $auth; + proxy_pass http://127.0.0.1:8090; + } +<% end +end_function ) ) + +-- passwords +local nginx_dir = uri("file:config/nginx") +nginx_dir.delete() +nginx_dir.mkdir() +local htpasswds = {} +do + local writer = nginx_dir.child("_all.pass").text_writer() + for user, password in pairs(config.users) do + local htpasswd = uri("bash:htpasswd -nb "..user.." "..password).read_text() + htpasswd = trim(htpasswd) + print_to( writer, htpasswd ) + htpasswds[user] = htpasswd + end + writer.close() +end +for _, repo in pairs(repos) do + local writer = nginx_dir.child(repo.name..".pass").text_writer() + for _, user_name in ipairs(repo.users) do + local htpasswd = htpasswds[user_name] or error(user_name) + print_to( writer, htpasswd ) + end + writer.close() +end +local private = config.private +if private == nil then + local all = nginx_dir.child("_all.pass") + local private = nginx_dir.child("_private.pass") + all.copy_to(private) +else + local writer = nginx_dir.child("_private.pass").text_writer() + for _, user_name in ipairs(private) do + local htpasswd = htpasswds[user_name] or error(user_name) + print_to( writer, htpasswd ) + end + writer.close() +end + +-- private +uri("file:src/private").mkdir() +do + local private_logs = uri "file:src/private/logs" + if not private_logs.exists() then + local logs = uri("file:logs").canonical() + logs.symlink_from(private_logs) + logger.info "linked to logs" + end +end +do + local private_config = uri "file:src/private/config" + if not private_config.exists() then + local config = uri("file:config").canonical() + config.symlink_from(private_config) + logger.info "linked to config" + end +end