Vou testar assim que possível.
Versão Imprimível
Vou testar assim que possível.
e script funciona sim ,revise onde colocou as regras,qual a versão do seu mikrotik?
Deve funcionar sim mas aqui não rolou.
Peguei outro que achei no fórum da MK-Auth onde adicionei direto em system>Scripts e funcionou
Versão 6.33.3
Coloquei exatamente no local onde o autor do tópico falou, ppp>profiles Script
prezados,
Localizei um erro no script com relação ao tempo (burst-time) quando maior que 59 segundos. Não chega a ser um erro no script, mas sim uma diferença na forma como o mikrotik armazena o tempo.
Veja na imagem... note que no simple queue está com o Time em 80, mas qdo exportamos a regra ele passa o time em 1m20
Anexo 66888
o que era para estar 60s, ele recebe como 1m
ou que era para estar 80s, ele recebe como 1m20
Ai dá erro na hora de adicionar a regra para clientes com tempo maior que 59s.
Estou buscando uma forma de converter para segundos.
Se alguém tiver uma sugestão, avisa ai.
aqui em meus testes nao houve esse problema, utilizo sempre 32s e adicionou so 32s o problema e que quando "cai" abaixo do burst threshold nem sempre libera um novo burst limit.
Prezados,
Resolvido!!!
Mais tarde devo atualizar o script.
O que eu fiz?
Quando o script vai buscar o valor do Burst-time, o valor vem assim "upload/download", exemplo:
30s/30s
ou
1m20/1m20
Então, primeiramente eu isolei o download:
Código :
:local burstt [/queue simple get $i burst-time]; :local indexExplod [:find $burstt "/"]; :local lenth [:len $burstt]; :local bt [:pick $burstt ($indexExplod + 1) ($lenth - 1)];
Pronto, com o código acima eu tenho apenas o valor do download.
O problema é quando o tempo é maior que 59s, ai o mikrotik altera de segundos para minutos.
ou seja, 80s vira 1m20
Se tentarmos adicionar uma regra com o valor 1m20, dá erro, e a regra não é adicionada.
Então temos que converter esse 1m20 para 80 segundos.
Consegui fazer isso com o script abaixo:
Código :
:local indexExplod [:find $bt "m"]; :local lenth [:len $bt]; :local bt0 {:pick $bt 0 ]; :local bt1 [:pick $bt ($indexExplod + 1) ($lenth - 1)]; :local bt2 [:pick $bt ($indexExplod + 1) $lenth ]; :local cBt [(($bt0 * 60) + $bt1)];
Resumindo:
Primeiro isolei o valor e depois transformei ele em segundos.
Muito bom!
Assim que corrigir o script posta ele, que eu quero testar de novo.
Script atualizado.
Realmente continua a não funcionar aqui!
Na madrugada vou atualizar a RB desse pop para ver se resolve.
só para tentar entender...
Os planos dos seus clientes possuem Burst ou não?
Vai no Profile, Aba Script > On UP
E adiciona o seguinte script:
Código :
:foreach i in=[/queue simple find where name="<pppoe-$user>"] do={ :local qName [/queue simple get $i name]; :local rLimit [/queue simple get $i max-limit]; :local indexExplod [:find $rLimit "/"]; :local lenth [:len $rLimit]; :local rl [:pick $rLimit ($indexExplod + 1) ($lenth - 1)]; :local rlUnity [:pick $rLimit ($lenth - 1) $lenth]; :local burstl [/queue simple get $i burst-limit]; :local indexExplod [:find $burstl "/"]; :local lenth [:len $burstl]; :local bl [:pick $burstl ($indexExplod + 1) ($lenth - 1)]; :local blUnity [:pick $burstl ($lenth - 1) $lenth]; :local burstt [/queue simple get $i burst-time]; :local indexExplod [:find $burstt "/"]; :local lenth [:len $burstt]; :local bt [:pick $burstt ($indexExplod + 1) ($lenth - 1)]; :local indexExplod [:find $bt "m"]; :local lenth [:len $bt]; :local bt0 [:pick $bt 0]; :local bt1 [:pick $bt ($indexExplod + 1) $lenth]; :local burstth [/queue simple get $i burst-threshold]; :local indexExplod [:find $burstth "/"]; :local lenth [:len $burstth]; :local bth [:pick $burstth ($indexExplod + 1) ($lenth - 1)]; :local bthUnity [:pick $burstth ($lenth - 1) $lenth]; :local c512k [($rl * 55 / 100)]; :local c5M [($rl * 25 / 100)]; :local c20M [($rl * 20 / 100)]; :local c50M [($rl * 15 / 100)]; :local cInf [($rl * 10 / 100)]; :local cBt [(($bt0 * 60) + $bt1)]; :log warning "=== Inicio Script ==="; :if ([:len $bl] != 0) do={ :log warning "QoS === $qName"; :log warning "Com Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "Burst Limit === $bl $blUnity"; :log warning "Burst Thr === $bth $bthUnity"; :log warning "Burst Time=== $cBt"; :log warning "=== Fim Script ==="; } \ else={ :log warning "QoS === $qName"; :log warning "Sem Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "=== Fim Script ==="; } }
Esse script não vai criar nenhuma queue, apenas irá relatar no log os valores que estão recebendo.
Meus clientes estão em sfq sera por isso?
edit.
Realmente fiz o teste com o Script a cima, esta sem burst!
Ai esta o log
Anexo 66892
Aparentemente, o script em si está coletando as informações necessárias.
então ele deveria estar criando ai as regras no queue tree.
Vamos dar mais um passo.
Nesse ultimo script que te passei, exatamente esse que vc está usando, localize a parte em vermelha:
Código :
else={ [COLOR="#FF0000"] :log warning "QoS === $qName"; :log warning "Sem Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "=== Fim Script ===";[/COLOR] } }
e adicione logo abaixo dessa linha em vermelha, o codigo abaixo:
Código :
/queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rl)$rlUnity" bucket-size=0.20; /queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_512K" queue="default" priority="2" limit-at="$($c512k)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="4-5M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_5M" queue="default" priority="4" limit-at="$($c5M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="6-20M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_20M" queue="default" priority="6" limit-at="$($c20M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="7-50M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_50M" queue="default" priority="7" limit-at="$($c50M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="8-Inf_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_Infinity" queue="default" priority="8" limit-at="$($cInf)$rlUnity" max-limit="$($rl)$rlUnity";
Ficando da seguinte forma:
Código :
else={ [COLOR="#FF0000"]:log warning "QoS === $qName"; :log warning "Sem Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "=== Fim Script ===";[/COLOR] /queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rl)$rlUnity" bucket-size=0.20; /queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_512K" queue="default" priority="2" limit-at="$($c512k)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="4-5M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_5M" queue="default" priority="4" limit-at="$($c5M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="6-20M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_20M" queue="default" priority="6" limit-at="$($c20M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="7-50M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_50M" queue="default" priority="7" limit-at="$($c50M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="8-Inf_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_Infinity" queue="default" priority="8" limit-at="$($cInf)$rlUnity" max-limit="$($rl)$rlUnity"; } }
Cuide para copiar toda a regra, inclusive o ;PontoVirgula; que está ao final
O Codigo pronto ficou assim:
Código :
:foreach i in=[/queue simple find where name="<pppoe-$user>"] do={ :local qName [/queue simple get $i name]; :local rLimit [/queue simple get $i max-limit]; :local indexExplod [:find $rLimit "/"]; :local lenth [:len $rLimit]; :local rl [:pick $rLimit ($indexExplod + 1) ($lenth - 1)]; :local rlUnity [:pick $rLimit ($lenth - 1) $lenth]; :local burstl [/queue simple get $i burst-limit]; :local indexExplod [:find $burstl "/"]; :local lenth [:len $burstl]; :local bl [:pick $burstl ($indexExplod + 1) ($lenth - 1)]; :local blUnity [:pick $burstl ($lenth - 1) $lenth]; :local burstt [/queue simple get $i burst-time]; :local indexExplod [:find $burstt "/"]; :local lenth [:len $burstt]; :local bt [:pick $burstt ($indexExplod + 1) ($lenth - 1)]; :local indexExplod [:find $bt "m"]; :local lenth [:len $bt]; :local bt0 [:pick $bt 0]; :local bt1 [:pick $bt ($indexExplod + 1) $lenth]; :local burstth [/queue simple get $i burst-threshold]; :local indexExplod [:find $burstth "/"]; :local lenth [:len $burstth]; :local bth [:pick $burstth ($indexExplod + 1) ($lenth - 1)]; :local bthUnity [:pick $burstth ($lenth - 1) $lenth]; :local c512k [($rl * 55 / 100)]; :local c5M [($rl * 25 / 100)]; :local c20M [($rl * 20 / 100)]; :local c50M [($rl * 15 / 100)]; :local cInf [($rl * 10 / 100)]; :local cBt [(($bt0 * 60) + $bt1)]; :log warning "=== Inicio Script ==="; :if ([:len $bl] != 0) do={ :log warning "QoS === $qName"; :log warning "Com Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "Burst Limit === $bl $blUnity"; :log warning "Burst Thr === $bth $bthUnity"; :log warning "Burst Time=== $cBt"; :log warning "=== Fim Script ==="; } \ else={ :log warning "QoS === $qName"; :log warning "Sem Burst"; :log warning "Max Limit === $rl $rlUnity"; :log warning "=== Fim Script ==="; /queue tree add name="QoS_$qName" parent="$interface" queue="default" max-limit="$($rl)$rlUnity" bucket-size=0.20; /queue tree add name="2-512k_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_512K" queue="default" priority="2" limit-at="$($c512k)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="4-5M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_5M" queue="default" priority="4" limit-at="$($c5M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="6-20M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_20M" queue="default" priority="6" limit-at="$($c20M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="7-50M_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_50M" queue="default" priority="7" limit-at="$($c50M)$rlUnity" max-limit="$($rl)$rlUnity"; /queue tree add name="8-Inf_$qName" parent="QoS_$qName" packet-mark="QoS-Andriopj_Infinity" queue="default" priority="8" limit-at="$($cInf)$rlUnity" max-limit="$($rl)$rlUnity"; } }
Nada aconteceu!
Apenas autenticou e não emitiu nenhum Log. e nao adicionou nenhuma Queue Tree
Como faço para que funcione nos dois sentidos upload e download pois o mesmo está tratando somente pacotes de download. e AndrioPJ mais uma vez muito obrigado pela contribuição.