local cjson = require('cjson') local http = require('socket.http') local stdlib = require('posix.stdlib') local redis = require('redis') local client = redis.connect('redis', 6379) local function get_mirrors(source) local body, _, _, _ = http.request(source) return cjson.decode(body) end local function prepare_pool_map(mirrors) local pool_map = {} for _, site in pairs(mirrors['sites']) do for _, alternative in pairs(site['available_alternatives']) do if alternative['type'] == 'mirror' then local canonical_host = site['main_domain'] if select(2, canonical_host:gsub("%.", "")) == 1 then canonical_host = "www." .. canonical_host end pool_map[canonical_host] = alternative['url']:sub(9) break end end end return pool_map end local function redis_set(client, key, data) local res, err = client:set(key, data) if not res then print("Error setting key in Redis:", err) else print("Data successfully stored in Redis under '" .. key .. "'") end end local function get_config(host) local function read_file(file_path) local file = io.open(file_path, "r") if file then local content = file:read("*a") file:close() return content else return nil end end local file_paths = { "/configs/" .. host .. ".json", -- Check host-specific file "/configs/default.json" -- Check default file } for _, file_path in ipairs(file_paths) do local content = read_file(file_path) if content then print("Using " .. file_path .. " for " .. host .. " configuration.") return content end end return "{}" end local function update_pool_data(pool_name, pool_source) local pool_map = prepare_pool_map(get_mirrors(pool_source)) redis_set(client, 'jasima:poolmap:' .. pool_name, cjson.encode(pool_map)) for host, _ in pairs(pool_map) do local redis_key = 'jasima:config:' .. host local config = get_config(host) redis_set(client, redis_key, config) end end local interval = 5 * 60 -- 5 minutes in seconds local last_update_time = os.clock() - interval while true do local current_time = os.clock() if current_time - last_update_time >= interval then for pool_name, pool_source in pairs(stdlib.getenv()) do if pool_name:match("^JASIMA_MIRRORS_POOL_") then local pool_name = pool_name:sub(21) update_pool_data(pool_name, pool_source) end end last_update_time = current_time end end