Отступ 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) {
часть, к сожалению, без успеха, может быть, я должен реструктурировать код? есть идеи?
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
хеш всегда будет содержать ровно пять записей? Если он содержит какое-то другое количество записей, то ваш шаблон будет выдавать некорректный вывод, потому что будет слишком много или слишком мало закрытий блоков.
Вы можете решить эту проблему, используя подход, аналогичный тому, который я уже описал, для создания замыканий блоков в строке во время итерации, а затем выводить строку в соответствующей точке (вместо использования текста шаблона для закрытия блоков).
Это окончательный результат модуля 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
Раздел конфигурации виртуального сервера был немного сложным, так как мне пришлось читать хеш, записывать ключи и назначать vlans в обратном порядке, поэтому я преобразовал хеш в массив, почитал его и преобразовал массив обратно в хеш.
Внутренний туннель
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
}
}
Спасибо всем, особенно Джону!