<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts | norre</title><link>https://www.norre.org/en/post/</link><atom:link href="https://www.norre.org/en/post/index.xml" rel="self" type="application/rss+xml"/><description>Posts</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>en-us</language><copyright>no rights reserved, 2020</copyright><image><url>https://www.norre.org/img/carrot.jpg</url><title>Posts</title><link>https://www.norre.org/en/post/</link></image><item><title>129 Die In Jet</title><link>https://www.norre.org/en/post/2020/129_die_in_jet/</link><pubDate>Tue, 25 Feb 2020 09:22:00 +0800</pubDate><guid>https://www.norre.org/en/post/2020/129_die_in_jet/</guid><description>&lt;p>&lt;img src="https://gallery.norre.org/images/2020/01/30/IMG_2751.jpg" alt="129 Die In Jet">&lt;/p></description></item><item><title>Structures</title><link>https://www.norre.org/en/post/2020/structures/</link><pubDate>Tue, 25 Feb 2020 09:22:00 +0800</pubDate><guid>https://www.norre.org/en/post/2020/structures/</guid><description>&lt;p>
&lt;a href="https://gallery.norre.org/album/ovu" target="_blank" rel="noopener">&lt;img src="https://gallery.norre.org/images/2020/01/30/IMG_6372.jpg" alt="IMG_6372.jpg">&lt;/a>&lt;/p></description></item><item><title>TextFSM - Changing a state</title><link>https://www.norre.org/en/post/2020/textfsm/text_fsm/</link><pubDate>Mon, 24 Feb 2020 14:37:00 +0800</pubDate><guid>https://www.norre.org/en/post/2020/textfsm/text_fsm/</guid><description>&lt;h2 id="what">What?&lt;/h2>
&lt;p>&lt;code>TextFSM&lt;/code> is a python module for parsing (badly) formatted text. It was originally
designed to parse the output of cli from different devices - in particular, the
network.&lt;/p>
&lt;p>In &lt;code>TextFSM&lt;/code> there are three important entities: &lt;code>input&lt;/code>, &lt;code>list of rules&lt;/code> and &lt;code>output&lt;/code>.&lt;/p>
&lt;p>The CLI output I&amp;rsquo;m going to call &lt;code>input&lt;/code> (hehehe) because that&amp;rsquo;s the information
that we need to parse. That&amp;rsquo;s the conclusion we&amp;rsquo;re feeding to the FSM. &lt;code>TextFSM&lt;/code>,
which processes (parses) it according to the &lt;code>list of rules&lt;/code>. The resulting text
goes into &lt;code>output&lt;/code>.&lt;/p>
&lt;h2 id="how">How?&lt;/h2>
&lt;p>&lt;code>TextFSM&lt;/code> is a final state machine. In the simplest case, in &lt;code>TextFSM&lt;/code> there are two
states: &lt;code>Start&lt;/code> (must be present in the template file) and &lt;code>EOF&lt;/code> - an implicit state
to which the transition happens when FSM reaches the end of the file.&lt;/p>
&lt;p>The &lt;code>FSM&lt;/code> alrorithm is something like this:&lt;/p>
&lt;ol>
&lt;li>&lt;code>FSM&lt;/code> reads a line from &lt;code>input&lt;/code>;&lt;/li>
&lt;li>&lt;code>FSM&lt;/code> checks if this line matches the rules from the &lt;code>list of rules&lt;/code>. List of the
rules for each line of &lt;code>input&lt;/code> is checked from top to bottom, starting from the
first line of the list of rules;&lt;/li>
&lt;li>If a line matches one of the rules in the &lt;code>list of rules&lt;/code>, the FSM executes the
action and goes to the next line of &lt;code>input&lt;/code>, checking it against the &lt;code>list of rules&lt;/code> again, starting on the first line of the list, again. Also, in this
step, &lt;code>FSM&lt;/code> can fill in the variable values.&lt;/li>
&lt;/ol>
&lt;p>More information on the algorithm, actions and rules can be found in the
documentation. (see &lt;strong>References&lt;/strong>)&lt;/p>
&lt;h2 id="why">Why?&lt;/h2>
&lt;p>If we have a simple output with repeating values, we can use only one state, filling
the string with the values of matched variables. If the output is less
structured, you will most likely have to use additional states.&lt;/p>
&lt;h2 id="fsm-with-one-state--except-eof">FSM with one state (except EOF)&lt;/h2>
&lt;p>One stage is enough when &lt;code>input&lt;/code> clearly defines the separator between the lines
of &lt;code>output&lt;/code>, as for example here:&lt;/p>
&lt;p>[ &lt;code>Input&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-c" data-lang="c">Server group radius
Sharecount &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> sg_unconfigured &lt;span style="color:#f92672">=&lt;/span> FALSE
Type &lt;span style="color:#f92672">=&lt;/span> standard Memlocks &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
Server(&lt;span style="color:#ae81ff">10.14.121.20&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1814&lt;/span>,&lt;span style="color:#ae81ff">1815&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">6&lt;/span> Author: &lt;span style="color:#ae81ff">0&lt;/span> Acct: &lt;span style="color:#ae81ff">0&lt;/span>
Server_auto_test_enabled: FALSE
Keywrap enabled: FALSE
Server(&lt;span style="color:#ae81ff">10.3.121.20&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1814&lt;/span>,&lt;span style="color:#ae81ff">1815&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">3&lt;/span> Author: &lt;span style="color:#ae81ff">33&lt;/span> Acct: &lt;span style="color:#ae81ff">333&lt;/span>
Server_auto_test_enabled: FALSE
Keywrap enabled: FALSE
Server(&lt;span style="color:#ae81ff">10.4.12.26&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1814&lt;/span>,&lt;span style="color:#ae81ff">1815&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">4&lt;/span> Author: &lt;span style="color:#ae81ff">0&lt;/span> Acct: &lt;span style="color:#ae81ff">0&lt;/span>
Server_auto_test_enabled: FALSE
Keywrap enabled: FALSE
Server(&lt;span style="color:#ae81ff">10.129.111.20&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1814&lt;/span>,&lt;span style="color:#ae81ff">1815&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">5&lt;/span> Author: &lt;span style="color:#ae81ff">0&lt;/span> Acct: &lt;span style="color:#ae81ff">555&lt;/span>
Server_auto_test_enabled: FALSE
Keywrap enabled: FALSE
Server(&lt;span style="color:#ae81ff">172.30.2.123&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1812&lt;/span>,&lt;span style="color:#ae81ff">1813&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">0&lt;/span> Author: &lt;span style="color:#ae81ff">0&lt;/span> Acct: &lt;span style="color:#ae81ff">0&lt;/span>
Server_auto_test_enabled: TRUE
Keywrap enabled: FALSE
Server group SERVER_GROUP_2
Sharecount &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> sg_unconfigured &lt;span style="color:#f92672">=&lt;/span> FALSE
Type &lt;span style="color:#f92672">=&lt;/span> standard Memlocks &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
Server(&lt;span style="color:#ae81ff">172.30.10.123&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#ae81ff">1812&lt;/span>,&lt;span style="color:#ae81ff">1813&lt;/span>) Transactions:
Authen: &lt;span style="color:#ae81ff">2249&lt;/span> Author: &lt;span style="color:#ae81ff">0&lt;/span> Acct: &lt;span style="color:#ae81ff">22424&lt;/span>
Server_auto_test_enabled: TRUE
Keywrap enabled: FALSE
&lt;/code>&lt;/pre>&lt;/div>&lt;p>This structure can be parsed this way:&lt;/p>
&lt;p>[ &lt;code>List of rules&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-c" data-lang="c">Value Filldown &lt;span style="color:#a6e22e">NAME&lt;/span> (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>S&lt;span style="color:#f92672">+&lt;/span>)
Value Filldown SHARECOUNT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value Filldown SG_UNCONFIGURED (TRUE&lt;span style="color:#f92672">|&lt;/span>FALSE)
Value Filldown TYPE (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>w&lt;span style="color:#f92672">+&lt;/span>)
Value Filldown MEMLOCKS (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value Required SERVER_IP (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value AUTH_PORT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value ACC_PORT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value AUTO_TEST_ENABLED (TRUE&lt;span style="color:#f92672">|&lt;/span>FALSE)
Value KEYWRAP_ENABLED (TRUE&lt;span style="color:#f92672">|&lt;/span>FALSE)
Value AUTHEN_COUNT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value AUTHOR_COUNT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value ACCT_COUNT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Start
&lt;span style="color:#f92672">^&lt;/span>Server group &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{NAME}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Sharecount &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SHARECOUNT}.&lt;span style="color:#f92672">*&lt;/span>sg_unconfigured &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SG_UNCONFIGURED}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{TYPE}.&lt;span style="color:#f92672">*&lt;/span>Memlocks &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{MEMLOCKS}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Server&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>(&lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SERVER_IP}&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{AUTH_PORT},&lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{ACC_PORT}&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>)
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Authen: &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{AUTHEN_COUNT}.&lt;span style="color:#f92672">*&lt;/span>Author: &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{AUTHOR_COUNT}.&lt;span style="color:#f92672">*&lt;/span>Acct: &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{ACCT_COUNT}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Server_auto_test_enabled: &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{AUTO_TEST_ENABLED}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Keywrap enabled: &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{KEYWRAP_ENABLED} &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Record
&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code class="language-mermaid" data-lang="mermaid">graph TD;
Start--&amp;gt;EOF;
&lt;/code>&lt;/pre>&lt;p>[ &lt;code>Output&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">[&lt;span style="color:#e6db74">&amp;#39;NAME&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;SHARECOUNT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;SG_UNCONFIGURED&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;TYPE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;MEMLOCKS&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;SERVER_IP&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;AUTH_PORT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;ACC_PORT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;AUTO_TEST_ENABLED&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;KEYWRAP_ENABLED&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;AUTHEN_COUNT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;AUTHOR_COUNT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;ACCT_COUNT&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.14.121.20&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;6&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.3.121.20&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;33&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;333&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.4.12.26&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;4&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.129.111.20&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;5&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;555&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;172.30.2.123&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1812&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1813&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;TRUE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;SERVER_GROUP_2&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;standard&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;172.30.10.123&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1812&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1813&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;TRUE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;FALSE&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;2249&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;22424&amp;#39;&lt;/span>]
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note the line &lt;code>Keywrap enabled:&lt;/code>. It goes in the end of each section and triggers
the the &lt;code>Record&lt;/code> action - which writes the accumulated values to &lt;code>output&lt;/code>.&lt;/p>
&lt;h2 id="fsm-with-two-states--except-eof">FSM with two states (except EOF)&lt;/h2>
&lt;p>[ &lt;code>Input&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-c" data-lang="c">total number of groups:&lt;span style="color:#ae81ff">3&lt;/span>
following RADIUS server groups are configured:
group radius:
server: all configured radius servers
deadtime is &lt;span style="color:#ae81ff">0&lt;/span>
group RADIUS_GROUP_A:
server: &lt;span style="color:#ae81ff">10.65.101.22&lt;/span> on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1814&lt;/span>, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1815&lt;/span>
server: &lt;span style="color:#ae81ff">10.110.101.22&lt;/span> on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1814&lt;/span>, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1815&lt;/span>
server: &lt;span style="color:#ae81ff">10.194.101.22&lt;/span> on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1814&lt;/span>, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1815&lt;/span>
server: &lt;span style="color:#ae81ff">10.10.10.27&lt;/span> on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1814&lt;/span>, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1815&lt;/span>
deadtime is &lt;span style="color:#ae81ff">0&lt;/span>
vrf is management
Source interface mgmt0
group RADIUS_GROUP_B:
server: &lt;span style="color:#ae81ff">172.40.2.14&lt;/span> on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1812&lt;/span>, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#ae81ff">1813&lt;/span>
deadtime is &lt;span style="color:#ae81ff">10&lt;/span>
Source interface loopback0
&lt;/code>&lt;/pre>&lt;/div>&lt;p>[ &lt;code>List of rules&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-c" data-lang="c">Value Required &lt;span style="color:#a6e22e">NAME&lt;/span> (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>S&lt;span style="color:#f92672">+&lt;/span>)
Value List SERVER (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>.&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+|&lt;/span>all configured radius servers)
Value DEADTIME (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value List AUTH_PORT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value List ACCT_PORT (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>d&lt;span style="color:#f92672">+&lt;/span>)
Value VRF (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>S&lt;span style="color:#f92672">+&lt;/span>)
Value SOURCE_INTERFACE (&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>S&lt;span style="color:#f92672">+&lt;/span>)
Start
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>group &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{NAME}&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Group
Group
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>server:&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>s&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SERVER}&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>s&lt;span style="color:#f92672">*&lt;/span>on auth&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{AUTH_PORT}, acct&lt;span style="color:#f92672">-&lt;/span>port &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{ACCT_PORT}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>server:&lt;span style="color:#960050;background-color:#1e0010">\&lt;/span>s&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SERVER} &lt;span style="color:#f92672">-&amp;gt;&lt;/span> AllServers
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>vrf is &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{VRF}
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>Source interface &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{SOURCE_INTERFACE} &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Record Start
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>deadtime is &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{DEADTIME}
AllServers
&lt;span style="color:#f92672">^&lt;/span>.&lt;span style="color:#f92672">*&lt;/span>deadtime is &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>{DEADTIME} &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Record Start
&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code class="language-mermaid" data-lang="mermaid">graph TD;
Start--&amp;gt;AllServers;
AllServers--&amp;gt;Start;
Start--&amp;gt;EOF;
&lt;/code>&lt;/pre>&lt;p>[ &lt;code>Output&lt;/code> ]&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">[&lt;span style="color:#e6db74">&amp;#39;NAME&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;SERVER&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;DEADTIME&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;AUTH_PORT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;ACCT_PORT&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;VRF&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;SOURCE_INTERFACE&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;radius&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;all configured radius servers&amp;#39;&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, [], [], &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;RADIUS_GROUP_A&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;10.65.101.22&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.110.101.22&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.194.101.22&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;10.10.10.27&amp;#39;&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1814&amp;#39;&lt;/span>], [&lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;1815&amp;#39;&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;management&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;mgmt0&amp;#39;&lt;/span>]
[&lt;span style="color:#e6db74">&amp;#39;RADIUS_GROUP_B&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;172.40.2.14&amp;#39;&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;10&amp;#39;&lt;/span>, [&lt;span style="color:#e6db74">&amp;#39;1812&amp;#39;&lt;/span>], [&lt;span style="color:#e6db74">&amp;#39;1813&amp;#39;&lt;/span>], &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;loopback0&amp;#39;&lt;/span>]
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ok, but why do we need 2 states? Because in the group &lt;code>radius&lt;/code> the last line
before the next group is &lt;code>deadtime is 0&lt;/code>, and in other groups the last line is
&lt;code>Source interface&lt;/code>. To process these different groups, you need different rule
lists, which go to different states (&lt;code>Start&lt;/code> and &lt;code>AllServers&lt;/code>).&lt;/p>
&lt;p>The condition that triggers the transition to &lt;code>AllServers&lt;/code> state - the string
&lt;code>server: all configured radius servers&lt;/code>, that is getting matched by this rule:
&lt;code>^.*server:\s*${SERVER} -&amp;gt; AllServers&lt;/code>.&lt;/p>
&lt;p>In the state &lt;code>AllServers&lt;/code> FSM reaches the line &lt;code>deadtime is&lt;/code>, writes the state and
returns to the state &lt;code>Start&lt;/code>.&lt;/p>
&lt;p>If &lt;code>FSM&lt;/code> stays in the state &lt;code>Start&lt;/code>, the state of the collected variables is getting
written after the &lt;code>Source interface&lt;/code> line is getting matched.&lt;/p>
&lt;h2 id="links">Links&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/google/textfsm/wiki/TextFSM">https://github.com/google/textfsm/wiki/TextFSM&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>