отступ файла ERB

У меня есть следующий код:

if (!EAP-Message) {
    # Now check against the authorized_macs file
    <%- @filename.each do |key,value| -%>
    <%= key %>
    if (!ok) {
    <%- end -%>
                        eap
                    }
                    else {
                        # accept
                        update control {
                            Auth-Type := Accept
                        }
                    }
                }
                else {
                    # accept
                    update control {
                        Auth-Type := Accept
                    }   
                }
            }
            else {
                # accept
                update control {
                    Auth-Type := Accept
                }
            }
        }
        else {
            # accept
            update control {
                Auth-Type := Accept
            }
        }
    }
    else {
        # accept
        update control {
            Auth-Type := Accept
        }
    }
}
else {
    eap
}

Я хотел бы сделать правильный отступ в файле, добавив отступы, пробелы или вкладки после каждого цикла, чтобы он выглядел так:

if (!EAP-Message) {
    # Now check against the authorized_macs file
    authorized_macs_10
    if (!ok) {
        authorized_macs_11
        if (!ok) {
            authorized_macs_12
            if (!ok) {
                authorized_macs_13
                if (!ok) {
                    authorized_macs_14
                    if (!ok) {
                        eap
                    }
                    else {
                        # accept
                        update control {
                            Auth-Type := Accept
                        }
                    }
                }
                else {
                    # accept
                    update control {
                        Auth-Type := Accept
                    }
                }
            }
            else {
                # accept
                update control {
                    Auth-Type := Accept
                }
            }
        }
        else {
            # accept
            update control {
                Auth-Type := Accept
            }
        }
    }
    else {
        # accept
        update control {
            Auth-Type := Accept
        }
    }
}
else {
    eap
}

Это часть /etc/freeradius/sites-available/default моего модуля марионеток freeradius, который, наконец, сделан. Переменная @filename — это hiera_hash, который я получаю из файла yaml. Вот соответствующая часть:

test_freeradius::files:
'authorized_macs_10':
    macs: 
        - 'aaaaa'
        - 'bbbbb'
    vlan: '10' 
'authorized_macs_11':
    macs: 
        - 'ccccc' 
        - 'ddddd'  
    vlan: '11'
'authorized_macs_12':
    macs: 
        - 'eeeee'
        - 'fffff'
    vlan: '12'
'authorized_macs_13':
    macs:
        - 'ggggg'
        - 'hhhhh'
    vlan: '13'
'authorized_macs_14':
    macs:
        - 'iiiii'
        - 'jjjjj'
    vlan: '14'

А ниже определение, которое я использую для создания, среди прочего, содержимого файла default:

define test_freeradius::files (

  $macs,
  $vlan,
  $macfile  = $title,

) {

  include test_freeradius::service

  ensure_resource('file', '/etc/freeradius/modules/files', {
      ensure  => 'file',
      owner   => 'root',
      group   => 'root',
      mode    => '0644',
      content => template("${module_name}/files.erb"),
      require => Class['test_freeradius::install'],
      notify  => Service['freeradius'],
    }
  )

  file { "/etc/freeradius/${macfile}" :
    ensure  => 'file',
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    content => template("${module_name}/macfiles.erb"),
    require => Class['test_freeradius::install'],
    notify  => Service['freeradius'],
  }

  ensure_resource('file', '/etc/freeradius/sites-available/default', {
      ensure  => 'file',
      owner   => 'root',
      group   => 'freerad',
      mode    => '0644',
      content => template("${module_name}/default.erb"),
      require => Class['test_freeradius::install'],
      notify  => Service['freeradius'],
    }
  )

  ensure_resource('file', '/etc/freeradius/sites-enabled/default', {
      ensure => 'link',
      target => '/etc/freeradius/sites-available/default',
    }
  )
}

Цикл делает то, что должен, но без отступа, я пробовал разные вещи, такие как добавление <%= " "%> в нескольких позициях и создание переменной для части if (!ok) {, к сожалению, безуспешно, может быть, мне следует изменить структуру кода? есть идеи?


person Max    schedule 16.05.2017    source источник
comment
Разве вы не можете просто сбросить @filename в переменную JavaScript (вероятно, используя JSON), а затем перебрать данные в JavaScript? Такой подход, как правило, намного чище и проще для понимания, чем написание генератора кода.   -  person mu is too short    schedule 16.05.2017
comment
@muistooshort, это может быть проще, но это не имеет значения. Суть здесь в том, чтобы создать файл, который будет развернут на клиенте Puppet. Требуемый характер файла является характеристикой пакета, который будет его использовать. Редко можно требовать, чтобы пакет работал по-другому или принимал другую форму ввода, чем он уже есть.   -  person John Bollinger    schedule 16.05.2017
comment
@muistooshort, спасибо за ответ! Ну, я никогда не думал об этом, так как я не программирую на JavaScript, только на Bash и Python, и немного на Ruby и Perl. Наш бэкэнд hiera в компании — это yaml. Так что я должен придерживаться этого. Но мне интересно, как это было бы в JavaScript!   -  person Max    schedule 16.05.2017
comment
Я неправильно понял ваш вопрос и подумал, что вы создаете JavaScript, а не какую-то конфигурацию, специфичную для Puppet.   -  person mu is too short    schedule 16.05.2017


Ответы (2)


Вы должны иметь возможность генерировать соответствующий отступ с помощью кода скриптлета Ruby, создавая строку отступа по мере выполнения итерации. Например,

if (!EAP-Message) {
    # Now check against the authorized_macs file
    <%- indent = '' -%>
    <%- @filename.each do |key,value| -%>
    <%= indent %><%= key %>
    <%= indent %>if (!ok) {
    <%- indent += '    ' -%>
    <%- end -%>
                        eap
    ...

Хотя мне кажется, что у вас может быть другая проблема. Можете ли вы быть уверены, что хэш @filenames всегда будет содержать ровно пять записей? Если он содержит какое-то другое количество записей, то ваш шаблон выдаст искаженный вывод, потому что будет либо слишком много, либо слишком мало замыканий блоков.

Вы можете решить эту проблему, используя подход, аналогичный тому, который я уже описал, для создания закрытия блоков в строке по мере итерации, а затем вывода строки в соответствующей точке (вместо использования текста шаблона для закрытия блоков).

person John Bollinger    schedule 16.05.2017
comment
Я имею в виду этот момент, поскольку хэш может иметь более или менее пяти записей в зависимости от местоположения компании и того, как выглядит сетевая инфраструктура. Я хотел решить проблему отступов, а затем использовать тот же подход для создания замыканий блоков. Попробую и отпишусь о конечном результате. Кажется, ты мой спаситель, Джон. Спасибо чувак! - person Max; 16.05.2017
comment
Работает идеально! Я опубликую окончательный код, когда закончу с закрытием блоков! Еще раз спасибо, Джон. - person Max; 16.05.2017

это окончательный результат работы модуля freeradius. Это соответствующие фрагменты кода, которые я просил о помощи.

default.erb

if (!EAP-Message) {
    # Now check against the authorized_macs file
    <%- indent = '' -%>
    <%- @filename.each do |key,value| -%>
    <%= indent %><%= key %>
    <%= indent %>if (!ok) {
    <%- indent += '    ' -%>
    <%- end -%>
    <%= indent %>eap
<%- @filename.each do |key,value| -%>
    <%= indent %>}
    <%= indent %>else {
        <%= indent %># accept
        <%= indent %>update control {
            <%= indent %>Auth-Type := Accept
        <%= indent %>}
    <%= indent %>}
<% indent = indent.slice(0..-5) -%>
<%- end -%> 
}
else {
    eap
}

Раздел post-auth конфигурации виртуального сервера был немного сложным, так как мне нужно было прочитать хэш, записать ключи и назначить вланы в обратном порядке, поэтому я преобразовал хэш в массив, почитал его и преобразовал массив обратно в хэш.

внутренний туннель

post-auth {
    <%- indent = '' -%>
    <%- @filename.each do |key,value| -%>
    <%= indent %><%= key %>
    <%= indent %>if (!ok) {
    <%- indent += '    ' -%>
    <%- end -%>
    <%= indent %>ldap
<%- @new_files = Hash[@filename.to_a.reverse].to_hash -%>
<%- @new_files.each do |key,value| -%>
<%= indent %>}
<%= indent %>else {
    <%= indent %>update reply {
        <%= indent %>Tunnel-Type = VLAN
        <%= indent %>Tunnel-Medium-Type = IEEE-802
        <%= indent %>Tunnel-Private-Group-ID =  <%= value['vlan'] %>
    <%= indent %>}
<%= indent %>}
<%- indent = indent.slice(0..-5) -%>
<%- end -%>

    ldap
<%- @groups.each do |key,value| -%>
<%- if key == 'vlan_10' -%>
    if (LDAP-Group == vlan_10) {
        update reply {
            Tunnel-Type = VLAN
            Tunnel-Medium-Type = IEEE-802
            Tunnel-Private-Group-ID = 10
        }
    }
<%- else -%>
    elsif (LDAP-Group == <%= key %>) {
        update reply {
            Tunnel-Type = VLAN
            Tunnel-Medium-Type = IEEE-802
            Tunnel-Private-Group-ID = <%= value['vlan'] %>
        }
    }
<%- end -%>
<%- end -%>

    Post-Auth-Type REJECT {
        attr_filter.access_reject
    }
}

Спасибо всем, особенно Джону!

person Max    schedule 17.05.2017