интеграция с iptvportal

Настройка связки iptvpotrtal и astra

Настройка Astra

создайте папку /etc/mod

mkdir /etc/astra/mod

в папке создайте файл ares.lua со следующим содержимым:

ares.lua

local backend = "http://go.iptvportal.ru/auth/arescrypt/"

access_list = {
    "127.0.0.1",
    "192.168.0.0/24",
}

drop_list = {
    "192.168.1.0/24",
}

function ip_to_number(ip)
    ip = ip:split("%.")
    if #ip ~= 4 then return 0 end
    for k,v in ipairs(ip) do
        ip[k] = tonumber(v)
        if not ip[k] then return 0 end
    end
    return (ip[1] * 0x1000000) + (ip[2] * 0x10000) + (ip[3] * 0x100) + (ip[4])
end

function mask_to_number(mask)
    local a = 0xFFFFFFFF
    local m = 32 - tonumber(mask)
    if m > 0 then
        a = bit32.rshift(a, m)
        a = bit32.lshift(a, m)
    end
    return a
end

function parse_list(list)
    for i,v in ipairs(list) do
        local b = v:find("/")
        if b then
            local a = ip_to_number(v:sub(1, b - 1))
            local m = mask_to_number(v:sub(b + 1))
            a = bit32.band(a, m)
            list[i] = { a, m }
        else
            local a = ip_to_number(v)
            local m = mask_to_number(32)
            list[i] = { a, m }
        end
    end
end

parse_list(access_list)
parse_list(drop_list)

function ip_check(list, ip)
    ip = ip_to_number(ip)
    for _,v in ipairs(list) do
        if v[1] == bit32.band(ip, v[2]) then return true end
    end
    return false
end

function auth_request(client_id, request, callback)
    local session_data = http_output_client_list[client_id]
    if not request then
        if session_data.auth then
            session_data.auth:close()
            session_data.auth = nil
        end
        return nil
    end

    if ip_check(access_list, request.addr) then
        callback(true)
        return nil
    end

    if ip_check(drop_list, request.addr) then
        callback(false)
        return nil
    end

    local function check_backend(path)
        local conf = parse_url(path)
        conf.method = "GET"
        conf.headers = {
            "User-Agent: Astra",
            "Host: " .. conf.host .. ":" .. conf.port,
            "Connection: close",
        }
        conf.callback = function(self, response)
            session_data.auth = nil
            if response.code == 200 then
                callback(true)
            elseif response.code == 401 or response.code == 403 then
                callback(false)
            elseif response.code == 301 or response.code == 302 then
                check_backend(response.headers["location"])
            else
                callback(true)
            end
        end
        session_data.auth = http_request(conf)
    end

    local query = request.request_uri:sub(#request.path + 1)
    if #query == 0 then
        callback(false)
        return nil
    end

    check_backend(backend .. query)
end

access_list - могут работать без авторизации на портале.
drop_list - безусловный запрет авторизации.

перезапустите Astra


Настройки портала:

В меню "Ключи" создайте новый ключ:


В настройках канала: