ไฟล์ 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 เล็กน้อย แบ็กเอนด์ลำดับชั้นของเราในบริษัทคือ yaml ฉันจึงต้องยึดติดกับสิ่งนี้ แต่ฉันน่าสนใจว่าสิ่งนี้จะเป็นอย่างไรใน JavaScript!   -  person Max    schedule 16.05.2017
comment
ฉันอ่านคำถามของคุณผิดและคิดว่าคุณกำลังผลิต JavaScript แทนที่จะเป็นการกำหนดค่าเฉพาะของ Puppet   -  person mu is too short    schedule 16.05.2017


คำตอบ (2)


คุณควรจะสามารถสร้างการเยื้องที่เหมาะสมผ่านโค้ด Ruby scriptlet ได้โดยการสร้างสตริงการเยื้องในขณะที่คุณวนซ้ำ ตัวอย่างเช่น,

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

นี่คือผลลัพธ์สุดท้ายของโมดูลรัศมีอิสระ นี่คือส่วนโค้ดที่เกี่ยวข้องที่ฉันขอความช่วยเหลือ

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 ของการกำหนดค่าเซิร์ฟเวอร์เสมือนค่อนข้างยุ่งยากเล็กน้อย เนื่องจากฉันต้องอ่านแฮช จดคีย์ และกำหนด vlan ในลำดับย้อนกลับ ดังนั้นฉันจึงแปลงแฮชเป็นอาร์เรย์ เคารพมัน และแปลงอาร์เรย์กลับเป็น กัญชา.

อุโมงค์ด้านใน

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