Verificador de estilo de iRules
Cole um iRule e leia-o segundo o iRules Style Guide do DevCentral: indentação, chaves, comentários, expressões entre chaves, switch --, prioridade de eventos, nomes static:: e mais, além de uma verificação de sintaxe Tcl 8.4 real. Analisado, nunca executado. Local, sem rede.
RedesO Tcl 8.4 consegue carregá-lo. 0 erro, 7 alertas, 3 notas.
12 linhas; a mais longa tem 73 caracteres.
Eventos e prioridades
HTTP_REQUESTlinha 1 sem prioridade
A regra, com as linhas marcadas
Apontamentos
- alertaR16linha 1Prioridade do evento
when HTTP_REQUEST {O evento HTTP_REQUEST não tem prioridade. O guia pede uma em todo evento; o padrão é 500.
- alertaE1linha 2Indentação
if {[HTTP::uri] eq "/old"} { HTTP::redirect "https://[HTTP::host]/new" }Um caractere de tabulação. O guia pede indentação de 4 espaços e nenhuma tabulação.
- alertaR8linha 2Nada de if em uma linha
if {[HTTP::uri] eq "/old"} { HTTP::redirect "https://[HTTP::host]/new" }Um if numa linha só. Distribua-o em várias linhas, mesmo para um log de debug.
- alertaR6linha 3Comentários
set n [expr $count + 1] ;# bumpUm comentário no fim da linha. Coloque comentários na própria linha, na indentação do código.
- alertaR12linha 3Expressões entre chaves
set n [expr $count + 1] ;# bumpUma expressão sem chaves: $count + 1. Uma expressão sem chaves é substituída duas vezes (risco de injeção, F5 K57410758) e não pode ser compilada antes; coloque-a entre chaves.
- alertaR15linha 4Terminador de opções --
switch [HTTP::path] {switch sem -- antes do valor. Um valor que começa com hífen seria lido como opção (F5 K15650046).
- alertaR10linha 8Operadores lógicos do Tcl
if { $a and $b } {Um dos operadores em palavra da F5 (and, or, not). Use os operadores do Tcl &&, || e !, com parênteses para deixar o agrupamento claro.
- notaR14linha 8Nomes de variáveis entre chaves
if { $a and $b } {Uma variável numa expressão escrita sem chaves em volta do nome. O guia escreve o nome entre chaves depois do cifrão.
- notaR20linha 9Nada de código comentado
#log local0. "debug"Código comentado. Remova-o antes de a regra ir para produção.
- notaR18linha 10Nomes static:: com prefixo
set static::flag 1static::flag não tem prefixo. Coloque prefixo nos nomes static::, por exemplo o nome da regra, para que duas regras não colidam.
O verificador lê estrutura e texto, e nunca executa a regra. Onde não pode ter certeza (por exemplo, se uma linha começando com cerquilha é código ou um comentário sem o espaço) o apontamento é uma nota, não um alerta. D1 e D2 vêm dos comentários do guia, e os caracteres são nomeados pelo Unicode Character Database 18.0.0.
Referências
- F5 DevCentral: iRules Style Guide (JRahm with Jim_Deucker, 2022-12-22)
- F5 K15650046: Tcl code injection security exposure
- F5 K57410758: warning [use curly braces to avoid double substitution]
- F5 iRules reference: priority
- F5 iRules reference: table
- F5 iRules reference: How To Write Fast Rules
- F5 K9204: iRules are limited to 65,520 characters
- F5 iRules reference: return
- Tcl 8.4 manual: break
- Tcl 8.4 manual: continue
- Tcl 8.4 manual: switch
- F5 K6091: The version of Tcl used to develop iRules
- Tcl 8.4.6 source code, tag core-8-4-6 on GitHub
- Unicode Character Database 18.0.0: UnicodeData.txt
- Unicode Character Database 18.0.0: PropList.txt
- Unicode Character Database 18.0.0: DerivedCoreProperties.txt