lekukan file ERB

Saya memiliki kode berikut:

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
}

Saya ingin membuat indentasi file dengan benar dengan menambahkan indentasi atau spasi atau tab setelah setiap loop, sehingga terlihat seperti ini:

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
}

Ini adalah bagian dari /etc/freeradius/sites-available/default modul boneka freeradius saya, yang akhirnya selesai. Variabel @filename adalah hiera_hash, yang saya dapatkan dari file yaml. Inilah bagian yang relevan:

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'

Dan di bawah ini adalah definisi yang saya gunakan untuk membuat antara lain konten file 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',
    }
  )
}

Perulangan melakukan apa yang seharusnya, tetapi tanpa lekukan, saya mencoba berbagai hal seperti menambahkan <%= " "%> di beberapa posisi dan membuat variabel untuk bagian if (!ok) {, sayangnya tidak berhasil, mungkin saya harus merestrukturisasi kodenya? ada ide?


person Max    schedule 16.05.2017    source sumber
comment
Tidak bisakah Anda membuang @filename ke dalam variabel JavaScript (mungkin menggunakan JSON) dan kemudian mengulangi data dalam JavaScript? Pendekatan tersebut cenderung lebih bersih dan mudah dipahami dibandingkan menulis pembuat kode.   -  person mu is too short    schedule 16.05.2017
comment
@muistooshort, itu mungkin lebih mudah, tapi itu tidak relevan. Intinya di sini adalah untuk membangun file yang akan di-deploy pada klien Puppet. Sifat file yang dibutuhkan merupakan karakteristik dari paket yang akan menggunakannya. Jarang sekali kita mempunyai kebebasan untuk menuntut agar paket tersebut bekerja secara berbeda atau menerima bentuk masukan yang berbeda dari yang sudah ada.   -  person John Bollinger    schedule 16.05.2017
comment
@muistooshort, terima kasih atas balasannya! Saya tidak pernah memikirkan hal itu, karena saya tidak membuat kode dalam JavaScript, hanya Bash dan Python, dan sedikit Ruby dan Perl. Backend hiera kami di perusahaan adalah yaml. Jadi saya harus tetap berpegang pada ini. Tapi saya tertarik bagaimana hal ini terjadi dalam JavaScript!   -  person Max    schedule 16.05.2017
comment
Saya salah membaca pertanyaan Anda dan mengira Anda memproduksi JavaScript, bukan konfigurasi khusus Wayang.   -  person mu is too short    schedule 16.05.2017


Jawaban (2)


Anda harus dapat menghasilkan indentasi yang sesuai melalui kode skrip Ruby dengan membuat string indentasi saat Anda melakukan iterasi. Misalnya,

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

Namun menurut saya, Anda mungkin mempunyai masalah lain. Dapatkah Anda yakin bahwa hash @filenames akan selalu berisi tepat lima entri? Jika berisi sejumlah entri lain maka templat Anda akan menghasilkan keluaran yang salah, karena akan ada terlalu banyak atau terlalu sedikit penutupan blok.

Anda dapat mengatasinya dengan menggunakan pendekatan yang mirip dengan yang telah saya jelaskan untuk membangun penutupan blok dalam sebuah string saat Anda mengulanginya, dan kemudian mengeluarkan string pada titik yang sesuai (daripada menggunakan teks templat untuk menutup blok).

person John Bollinger    schedule 16.05.2017
comment
Saya memikirkan hal ini, karena hash dapat memiliki lebih atau kurang dari lima entri tergantung pada lokasi perusahaan dan seperti apa infrastruktur jaringannya. Saya ingin menyelesaikan masalah lekukan dan kemudian menggunakan pendekatan yang sama untuk menghasilkan penutupan blok. Akan mencobanya dan memposting hasil akhirnya. Anda tampaknya menjadi penyelamat saya John. Terima kasih sobat! - person Max; 16.05.2017
comment
Bekerja dengan sempurna! Saya akan memposting kode terakhir setelah saya selesai dengan penutupan blok! Sekali lagi terima kasih John. - person Max; 16.05.2017

ini adalah hasil akhir dari modul freeradius. Ini adalah fragmen kode relevan yang saya minta bantuannya.

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
}

Bagian post-auth pada konfigurasi server virtual agak rumit, karena saya harus membaca hash, menuliskan kunci, dan menetapkan vlan dalam urutan terbalik, jadi saya mengonversi hash menjadi array, menghormatinya, dan mengonversi array kembali ke hash.

terowongan dalam

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
    }
}

Terima kasih semuanya, terutama John!

person Max    schedule 17.05.2017